oscar.plaisant@icloud.com 03ecc4a65b update
2023-10-23 23:30:51 +02:00

31659 lines
4.3 MiB

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/feather-icons/dist/feather.js
var require_feather = __commonJS({
"node_modules/feather-icons/dist/feather.js"(exports, module2) {
(function webpackUniversalModuleDefinition(root2, factory) {
if (typeof exports === "object" && typeof module2 === "object")
module2.exports = factory();
else if (typeof define === "function" && define.amd)
define([], factory);
else if (typeof exports === "object")
exports["feather"] = factory();
else
root2["feather"] = factory();
})(typeof self !== "undefined" ? self : exports, function() {
return function(modules) {
var installedModules = {};
function __webpack_require__(moduleId) {
if (installedModules[moduleId]) {
return installedModules[moduleId].exports;
}
var module3 = installedModules[moduleId] = {
i: moduleId,
l: false,
exports: {}
};
modules[moduleId].call(module3.exports, module3, module3.exports, __webpack_require__);
module3.l = true;
return module3.exports;
}
__webpack_require__.m = modules;
__webpack_require__.c = installedModules;
__webpack_require__.d = function(exports2, name, getter) {
if (!__webpack_require__.o(exports2, name)) {
Object.defineProperty(exports2, name, {
configurable: false,
enumerable: true,
get: getter
});
}
};
__webpack_require__.r = function(exports2) {
Object.defineProperty(exports2, "__esModule", { value: true });
};
__webpack_require__.n = function(module3) {
var getter = module3 && module3.__esModule ? function getDefault() {
return module3["default"];
} : function getModuleExports() {
return module3;
};
__webpack_require__.d(getter, "a", getter);
return getter;
};
__webpack_require__.o = function(object, property) {
return Object.prototype.hasOwnProperty.call(object, property);
};
__webpack_require__.p = "";
return __webpack_require__(__webpack_require__.s = 0);
}({
"./dist/icons.json": function(module3) {
module3.exports = { "activity": '<polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline>', "airplay": '<path d="M5 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-1"></path><polygon points="12 15 17 21 7 21 12 15"></polygon>', "alert-circle": '<circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line>', "alert-octagon": '<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"></polygon><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line>', "alert-triangle": '<path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1="12" y1="9" x2="12" y2="13"></line><line x1="12" y1="17" x2="12.01" y2="17"></line>', "align-center": '<line x1="18" y1="10" x2="6" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="18" y1="18" x2="6" y2="18"></line>', "align-justify": '<line x1="21" y1="10" x2="3" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="21" y1="18" x2="3" y2="18"></line>', "align-left": '<line x1="17" y1="10" x2="3" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="17" y1="18" x2="3" y2="18"></line>', "align-right": '<line x1="21" y1="10" x2="7" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="21" y1="18" x2="7" y2="18"></line>', "anchor": '<circle cx="12" cy="5" r="3"></circle><line x1="12" y1="22" x2="12" y2="8"></line><path d="M5 12H2a10 10 0 0 0 20 0h-3"></path>', "aperture": '<circle cx="12" cy="12" r="10"></circle><line x1="14.31" y1="8" x2="20.05" y2="17.94"></line><line x1="9.69" y1="8" x2="21.17" y2="8"></line><line x1="7.38" y1="12" x2="13.12" y2="2.06"></line><line x1="9.69" y1="16" x2="3.95" y2="6.06"></line><line x1="14.31" y1="16" x2="2.83" y2="16"></line><line x1="16.62" y1="12" x2="10.88" y2="21.94"></line>', "archive": '<polyline points="21 8 21 21 3 21 3 8"></polyline><rect x="1" y="3" width="22" height="5"></rect><line x1="10" y1="12" x2="14" y2="12"></line>', "arrow-down-circle": '<circle cx="12" cy="12" r="10"></circle><polyline points="8 12 12 16 16 12"></polyline><line x1="12" y1="8" x2="12" y2="16"></line>', "arrow-down-left": '<line x1="17" y1="7" x2="7" y2="17"></line><polyline points="17 17 7 17 7 7"></polyline>', "arrow-down-right": '<line x1="7" y1="7" x2="17" y2="17"></line><polyline points="17 7 17 17 7 17"></polyline>', "arrow-down": '<line x1="12" y1="5" x2="12" y2="19"></line><polyline points="19 12 12 19 5 12"></polyline>', "arrow-left-circle": '<circle cx="12" cy="12" r="10"></circle><polyline points="12 8 8 12 12 16"></polyline><line x1="16" y1="12" x2="8" y2="12"></line>', "arrow-left": '<line x1="19" y1="12" x2="5" y2="12"></line><polyline points="12 19 5 12 12 5"></polyline>', "arrow-right-circle": '<circle cx="12" cy="12" r="10"></circle><polyline points="12 16 16 12 12 8"></polyline><line x1="8" y1="12" x2="16" y2="12"></line>', "arrow-right": '<line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline>', "arrow-up-circle": '<circle cx="12" cy="12" r="10"></circle><polyline points="16 12 12 8 8 12"></polyline><line x1="12" y1="16" x2="12" y2="8"></line>', "arrow-up-left": '<line x1="17" y1="17" x2="7" y2="7"></line><polyline points="7 17 7 7 17 7"></polyline>', "arrow-up-right": '<line x1="7" y1="17" x2="17" y2="7"></line><polyline points="7 7 17 7 17 17"></polyline>', "arrow-up": '<line x1="12" y1="19" x2="12" y2="5"></line><polyline points="5 12 12 5 19 12"></polyline>', "at-sign": '<circle cx="12" cy="12" r="4"></circle><path d="M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-3.92 7.94"></path>', "award": '<circle cx="12" cy="8" r="7"></circle><polyline points="8.21 13.89 7 23 12 20 17 23 15.79 13.88"></polyline>', "bar-chart-2": '<line x1="18" y1="20" x2="18" y2="10"></line><line x1="12" y1="20" x2="12" y2="4"></line><line x1="6" y1="20" x2="6" y2="14"></line>', "bar-chart": '<line x1="12" y1="20" x2="12" y2="10"></line><line x1="18" y1="20" x2="18" y2="4"></line><line x1="6" y1="20" x2="6" y2="16"></line>', "battery-charging": '<path d="M5 18H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3.19M15 6h2a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-3.19"></path><line x1="23" y1="13" x2="23" y2="11"></line><polyline points="11 6 7 12 13 12 9 18"></polyline>', "battery": '<rect x="1" y="6" width="18" height="12" rx="2" ry="2"></rect><line x1="23" y1="13" x2="23" y2="11"></line>', "bell-off": '<path d="M13.73 21a2 2 0 0 1-3.46 0"></path><path d="M18.63 13A17.89 17.89 0 0 1 18 8"></path><path d="M6.26 6.26A5.86 5.86 0 0 0 6 8c0 7-3 9-3 9h14"></path><path d="M18 8a6 6 0 0 0-9.33-5"></path><line x1="1" y1="1" x2="23" y2="23"></line>', "bell": '<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path><path d="M13.73 21a2 2 0 0 1-3.46 0"></path>', "bluetooth": '<polyline points="6.5 6.5 17.5 17.5 12 23 12 1 17.5 6.5 6.5 17.5"></polyline>', "bold": '<path d="M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"></path><path d="M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"></path>', "book-open": '<path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path>', "book": '<path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path>', "bookmark": '<path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"></path>', "box": '<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path><polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline><line x1="12" y1="22.08" x2="12" y2="12"></line>', "briefcase": '<rect x="2" y="7" width="20" height="14" rx="2" ry="2"></rect><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"></path>', "calendar": '<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line>', "camera-off": '<line x1="1" y1="1" x2="23" y2="23"></line><path d="M21 21H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3m3-3h6l2 3h4a2 2 0 0 1 2 2v9.34m-7.72-2.06a4 4 0 1 1-5.56-5.56"></path>', "camera": '<path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path><circle cx="12" cy="13" r="4"></circle>', "cast": '<path d="M2 16.1A5 5 0 0 1 5.9 20M2 12.05A9 9 0 0 1 9.95 20M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6"></path><line x1="2" y1="20" x2="2.01" y2="20"></line>', "check-circle": '<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path><polyline points="22 4 12 14.01 9 11.01"></polyline>', "check-square": '<polyline points="9 11 12 14 22 4"></polyline><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path>', "check": '<polyline points="20 6 9 17 4 12"></polyline>', "chevron-down": '<polyline points="6 9 12 15 18 9"></polyline>', "chevron-left": '<polyline points="15 18 9 12 15 6"></polyline>', "chevron-right": '<polyline points="9 18 15 12 9 6"></polyline>', "chevron-up": '<polyline points="18 15 12 9 6 15"></polyline>', "chevrons-down": '<polyline points="7 13 12 18 17 13"></polyline><polyline points="7 6 12 11 17 6"></polyline>', "chevrons-left": '<polyline points="11 17 6 12 11 7"></polyline><polyline points="18 17 13 12 18 7"></polyline>', "chevrons-right": '<polyline points="13 17 18 12 13 7"></polyline><polyline points="6 17 11 12 6 7"></polyline>', "chevrons-up": '<polyline points="17 11 12 6 7 11"></polyline><polyline points="17 18 12 13 7 18"></polyline>', "chrome": '<circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="4"></circle><line x1="21.17" y1="8" x2="12" y2="8"></line><line x1="3.95" y1="6.06" x2="8.54" y2="14"></line><line x1="10.88" y1="21.94" x2="15.46" y2="14"></line>', "circle": '<circle cx="12" cy="12" r="10"></circle>', "clipboard": '<path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect>', "clock": '<circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>', "cloud-drizzle": '<line x1="8" y1="19" x2="8" y2="21"></line><line x1="8" y1="13" x2="8" y2="15"></line><line x1="16" y1="19" x2="16" y2="21"></line><line x1="16" y1="13" x2="16" y2="15"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="12" y1="15" x2="12" y2="17"></line><path d="M20 16.58A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 4 15.25"></path>', "cloud-lightning": '<path d="M19 16.9A5 5 0 0 0 18 7h-1.26a8 8 0 1 0-11.62 9"></path><polyline points="13 11 9 17 15 17 11 23"></polyline>', "cloud-off": '<path d="M22.61 16.95A5 5 0 0 0 18 10h-1.26a8 8 0 0 0-7.05-6M5 5a8 8 0 0 0 4 15h9a5 5 0 0 0 1.7-.3"></path><line x1="1" y1="1" x2="23" y2="23"></line>', "cloud-rain": '<line x1="16" y1="13" x2="16" y2="21"></line><line x1="8" y1="13" x2="8" y2="21"></line><line x1="12" y1="15" x2="12" y2="23"></line><path d="M20 16.58A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 4 15.25"></path>', "cloud-snow": '<path d="M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 4 16.25"></path><line x1="8" y1="16" x2="8.01" y2="16"></line><line x1="8" y1="20" x2="8.01" y2="20"></line><line x1="12" y1="18" x2="12.01" y2="18"></line><line x1="12" y1="22" x2="12.01" y2="22"></line><line x1="16" y1="16" x2="16.01" y2="16"></line><line x1="16" y1="20" x2="16.01" y2="20"></line>', "cloud": '<path d="M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z"></path>', "code": '<polyline points="16 18 22 12 16 6"></polyline><polyline points="8 6 2 12 8 18"></polyline>', "codepen": '<polygon points="12 2 22 8.5 22 15.5 12 22 2 15.5 2 8.5 12 2"></polygon><line x1="12" y1="22" x2="12" y2="15.5"></line><polyline points="22 8.5 12 15.5 2 8.5"></polyline><polyline points="2 15.5 12 8.5 22 15.5"></polyline><line x1="12" y1="2" x2="12" y2="8.5"></line>', "codesandbox": '<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path><polyline points="7.5 4.21 12 6.81 16.5 4.21"></polyline><polyline points="7.5 19.79 7.5 14.6 3 12"></polyline><polyline points="21 12 16.5 14.6 16.5 19.79"></polyline><polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline><line x1="12" y1="22.08" x2="12" y2="12"></line>', "coffee": '<path d="M18 8h1a4 4 0 0 1 0 8h-1"></path><path d="M2 8h16v9a4 4 0 0 1-4 4H6a4 4 0 0 1-4-4V8z"></path><line x1="6" y1="1" x2="6" y2="4"></line><line x1="10" y1="1" x2="10" y2="4"></line><line x1="14" y1="1" x2="14" y2="4"></line>', "columns": '<path d="M12 3h7a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-7m0-18H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7m0-18v18"></path>', "command": '<path d="M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z"></path>', "compass": '<circle cx="12" cy="12" r="10"></circle><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"></polygon>', "copy": '<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>', "corner-down-left": '<polyline points="9 10 4 15 9 20"></polyline><path d="M20 4v7a4 4 0 0 1-4 4H4"></path>', "corner-down-right": '<polyline points="15 10 20 15 15 20"></polyline><path d="M4 4v7a4 4 0 0 0 4 4h12"></path>', "corner-left-down": '<polyline points="14 15 9 20 4 15"></polyline><path d="M20 4h-7a4 4 0 0 0-4 4v12"></path>', "corner-left-up": '<polyline points="14 9 9 4 4 9"></polyline><path d="M20 20h-7a4 4 0 0 1-4-4V4"></path>', "corner-right-down": '<polyline points="10 15 15 20 20 15"></polyline><path d="M4 4h7a4 4 0 0 1 4 4v12"></path>', "corner-right-up": '<polyline points="10 9 15 4 20 9"></polyline><path d="M4 20h7a4 4 0 0 0 4-4V4"></path>', "corner-up-left": '<polyline points="9 14 4 9 9 4"></polyline><path d="M20 20v-7a4 4 0 0 0-4-4H4"></path>', "corner-up-right": '<polyline points="15 14 20 9 15 4"></polyline><path d="M4 20v-7a4 4 0 0 1 4-4h12"></path>', "cpu": '<rect x="4" y="4" width="16" height="16" rx="2" ry="2"></rect><rect x="9" y="9" width="6" height="6"></rect><line x1="9" y1="1" x2="9" y2="4"></line><line x1="15" y1="1" x2="15" y2="4"></line><line x1="9" y1="20" x2="9" y2="23"></line><line x1="15" y1="20" x2="15" y2="23"></line><line x1="20" y1="9" x2="23" y2="9"></line><line x1="20" y1="14" x2="23" y2="14"></line><line x1="1" y1="9" x2="4" y2="9"></line><line x1="1" y1="14" x2="4" y2="14"></line>', "credit-card": '<rect x="1" y="4" width="22" height="16" rx="2" ry="2"></rect><line x1="1" y1="10" x2="23" y2="10"></line>', "crop": '<path d="M6.13 1L6 16a2 2 0 0 0 2 2h15"></path><path d="M1 6.13L16 6a2 2 0 0 1 2 2v15"></path>', "crosshair": '<circle cx="12" cy="12" r="10"></circle><line x1="22" y1="12" x2="18" y2="12"></line><line x1="6" y1="12" x2="2" y2="12"></line><line x1="12" y1="6" x2="12" y2="2"></line><line x1="12" y1="22" x2="12" y2="18"></line>', "database": '<ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"></path><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"></path>', "delete": '<path d="M21 4H8l-7 8 7 8h13a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z"></path><line x1="18" y1="9" x2="12" y2="15"></line><line x1="12" y1="9" x2="18" y2="15"></line>', "disc": '<circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="3"></circle>', "divide-circle": '<line x1="8" y1="12" x2="16" y2="12"></line><line x1="12" y1="16" x2="12" y2="16"></line><line x1="12" y1="8" x2="12" y2="8"></line><circle cx="12" cy="12" r="10"></circle>', "divide-square": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="8" y1="12" x2="16" y2="12"></line><line x1="12" y1="16" x2="12" y2="16"></line><line x1="12" y1="8" x2="12" y2="8"></line>', "divide": '<circle cx="12" cy="6" r="2"></circle><line x1="5" y1="12" x2="19" y2="12"></line><circle cx="12" cy="18" r="2"></circle>', "dollar-sign": '<line x1="12" y1="1" x2="12" y2="23"></line><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path>', "download-cloud": '<polyline points="8 17 12 21 16 17"></polyline><line x1="12" y1="12" x2="12" y2="21"></line><path d="M20.88 18.09A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.29"></path>', "download": '<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line>', "dribbble": '<circle cx="12" cy="12" r="10"></circle><path d="M8.56 2.75c4.37 6.03 6.02 9.42 8.03 17.72m2.54-15.38c-3.72 4.35-8.94 5.66-16.88 5.85m19.5 1.9c-3.5-.93-6.63-.82-8.94 0-2.58.92-5.01 2.86-7.44 6.32"></path>', "droplet": '<path d="M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"></path>', "edit-2": '<path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path>', "edit-3": '<path d="M12 20h9"></path><path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"></path>', "edit": '<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path>', "external-link": '<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line>', "eye-off": '<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path><line x1="1" y1="1" x2="23" y2="23"></line>', "eye": '<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle>', "facebook": '<path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"></path>', "fast-forward": '<polygon points="13 19 22 12 13 5 13 19"></polygon><polygon points="2 19 11 12 2 5 2 19"></polygon>', "feather": '<path d="M20.24 12.24a6 6 0 0 0-8.49-8.49L5 10.5V19h8.5z"></path><line x1="16" y1="8" x2="2" y2="22"></line><line x1="17.5" y1="15" x2="9" y2="15"></line>', "figma": '<path d="M5 5.5A3.5 3.5 0 0 1 8.5 2H12v7H8.5A3.5 3.5 0 0 1 5 5.5z"></path><path d="M12 2h3.5a3.5 3.5 0 1 1 0 7H12V2z"></path><path d="M12 12.5a3.5 3.5 0 1 1 7 0 3.5 3.5 0 1 1-7 0z"></path><path d="M5 19.5A3.5 3.5 0 0 1 8.5 16H12v3.5a3.5 3.5 0 1 1-7 0z"></path><path d="M5 12.5A3.5 3.5 0 0 1 8.5 9H12v7H8.5A3.5 3.5 0 0 1 5 12.5z"></path>', "file-minus": '<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="9" y1="15" x2="15" y2="15"></line>', "file-plus": '<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="12" y1="18" x2="12" y2="12"></line><line x1="9" y1="15" x2="15" y2="15"></line>', "file-text": '<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline>', "file": '<path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path><polyline points="13 2 13 9 20 9"></polyline>', "film": '<rect x="2" y="2" width="20" height="20" rx="2.18" ry="2.18"></rect><line x1="7" y1="2" x2="7" y2="22"></line><line x1="17" y1="2" x2="17" y2="22"></line><line x1="2" y1="12" x2="22" y2="12"></line><line x1="2" y1="7" x2="7" y2="7"></line><line x1="2" y1="17" x2="7" y2="17"></line><line x1="17" y1="17" x2="22" y2="17"></line><line x1="17" y1="7" x2="22" y2="7"></line>', "filter": '<polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3"></polygon>', "flag": '<path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"></path><line x1="4" y1="22" x2="4" y2="15"></line>', "folder-minus": '<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path><line x1="9" y1="14" x2="15" y2="14"></line>', "folder-plus": '<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path><line x1="12" y1="11" x2="12" y2="17"></line><line x1="9" y1="14" x2="15" y2="14"></line>', "folder": '<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path>', "framer": '<path d="M5 16V9h14V2H5l14 14h-7m-7 0l7 7v-7m-7 0h7"></path>', "frown": '<circle cx="12" cy="12" r="10"></circle><path d="M16 16s-1.5-2-4-2-4 2-4 2"></path><line x1="9" y1="9" x2="9.01" y2="9"></line><line x1="15" y1="9" x2="15.01" y2="9"></line>', "gift": '<polyline points="20 12 20 22 4 22 4 12"></polyline><rect x="2" y="7" width="20" height="5"></rect><line x1="12" y1="22" x2="12" y2="7"></line><path d="M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z"></path><path d="M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z"></path>', "git-branch": '<line x1="6" y1="3" x2="6" y2="15"></line><circle cx="18" cy="6" r="3"></circle><circle cx="6" cy="18" r="3"></circle><path d="M18 9a9 9 0 0 1-9 9"></path>', "git-commit": '<circle cx="12" cy="12" r="4"></circle><line x1="1.05" y1="12" x2="7" y2="12"></line><line x1="17.01" y1="12" x2="22.96" y2="12"></line>', "git-merge": '<circle cx="18" cy="18" r="3"></circle><circle cx="6" cy="6" r="3"></circle><path d="M6 21V9a9 9 0 0 0 9 9"></path>', "git-pull-request": '<circle cx="18" cy="18" r="3"></circle><circle cx="6" cy="6" r="3"></circle><path d="M13 6h3a2 2 0 0 1 2 2v7"></path><line x1="6" y1="9" x2="6" y2="21"></line>', "github": '<path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path>', "gitlab": '<path d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z"></path>', "globe": '<circle cx="12" cy="12" r="10"></circle><line x1="2" y1="12" x2="22" y2="12"></line><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path>', "grid": '<rect x="3" y="3" width="7" height="7"></rect><rect x="14" y="3" width="7" height="7"></rect><rect x="14" y="14" width="7" height="7"></rect><rect x="3" y="14" width="7" height="7"></rect>', "hard-drive": '<line x1="22" y1="12" x2="2" y2="12"></line><path d="M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"></path><line x1="6" y1="16" x2="6.01" y2="16"></line><line x1="10" y1="16" x2="10.01" y2="16"></line>', "hash": '<line x1="4" y1="9" x2="20" y2="9"></line><line x1="4" y1="15" x2="20" y2="15"></line><line x1="10" y1="3" x2="8" y2="21"></line><line x1="16" y1="3" x2="14" y2="21"></line>', "headphones": '<path d="M3 18v-6a9 9 0 0 1 18 0v6"></path><path d="M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z"></path>', "heart": '<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path>', "help-circle": '<circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line>', "hexagon": '<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path>', "home": '<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline>', "image": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><polyline points="21 15 16 10 5 21"></polyline>', "inbox": '<polyline points="22 12 16 12 14 15 10 15 8 12 2 12"></polyline><path d="M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"></path>', "info": '<circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line>', "instagram": '<rect x="2" y="2" width="20" height="20" rx="5" ry="5"></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"></line>', "italic": '<line x1="19" y1="4" x2="10" y2="4"></line><line x1="14" y1="20" x2="5" y2="20"></line><line x1="15" y1="4" x2="9" y2="20"></line>', "key": '<path d="M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4"></path>', "layers": '<polygon points="12 2 2 7 12 12 22 7 12 2"></polygon><polyline points="2 17 12 22 22 17"></polyline><polyline points="2 12 12 17 22 12"></polyline>', "layout": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="3" y1="9" x2="21" y2="9"></line><line x1="9" y1="21" x2="9" y2="9"></line>', "life-buoy": '<circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="4"></circle><line x1="4.93" y1="4.93" x2="9.17" y2="9.17"></line><line x1="14.83" y1="14.83" x2="19.07" y2="19.07"></line><line x1="14.83" y1="9.17" x2="19.07" y2="4.93"></line><line x1="14.83" y1="9.17" x2="18.36" y2="5.64"></line><line x1="4.93" y1="19.07" x2="9.17" y2="14.83"></line>', "link-2": '<path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path><line x1="8" y1="12" x2="16" y2="12"></line>', "link": '<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>', "linkedin": '<path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path><rect x="2" y="9" width="4" height="12"></rect><circle cx="4" cy="4" r="2"></circle>', "list": '<line x1="8" y1="6" x2="21" y2="6"></line><line x1="8" y1="12" x2="21" y2="12"></line><line x1="8" y1="18" x2="21" y2="18"></line><line x1="3" y1="6" x2="3.01" y2="6"></line><line x1="3" y1="12" x2="3.01" y2="12"></line><line x1="3" y1="18" x2="3.01" y2="18"></line>', "loader": '<line x1="12" y1="2" x2="12" y2="6"></line><line x1="12" y1="18" x2="12" y2="22"></line><line x1="4.93" y1="4.93" x2="7.76" y2="7.76"></line><line x1="16.24" y1="16.24" x2="19.07" y2="19.07"></line><line x1="2" y1="12" x2="6" y2="12"></line><line x1="18" y1="12" x2="22" y2="12"></line><line x1="4.93" y1="19.07" x2="7.76" y2="16.24"></line><line x1="16.24" y1="7.76" x2="19.07" y2="4.93"></line>', "lock": '<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path>', "log-in": '<path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"></path><polyline points="10 17 15 12 10 7"></polyline><line x1="15" y1="12" x2="3" y2="12"></line>', "log-out": '<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path><polyline points="16 17 21 12 16 7"></polyline><line x1="21" y1="12" x2="9" y2="12"></line>', "mail": '<path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline>', "map-pin": '<path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"></path><circle cx="12" cy="10" r="3"></circle>', "map": '<polygon points="1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6"></polygon><line x1="8" y1="2" x2="8" y2="18"></line><line x1="16" y1="6" x2="16" y2="22"></line>', "maximize-2": '<polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" y1="3" x2="14" y2="10"></line><line x1="3" y1="21" x2="10" y2="14"></line>', "maximize": '<path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"></path>', "meh": '<circle cx="12" cy="12" r="10"></circle><line x1="8" y1="15" x2="16" y2="15"></line><line x1="9" y1="9" x2="9.01" y2="9"></line><line x1="15" y1="9" x2="15.01" y2="9"></line>', "menu": '<line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line>', "message-circle": '<path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path>', "message-square": '<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>', "mic-off": '<line x1="1" y1="1" x2="23" y2="23"></line><path d="M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6"></path><path d="M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23"></path><line x1="12" y1="19" x2="12" y2="23"></line><line x1="8" y1="23" x2="16" y2="23"></line>', "mic": '<path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path><path d="M19 10v2a7 7 0 0 1-14 0v-2"></path><line x1="12" y1="19" x2="12" y2="23"></line><line x1="8" y1="23" x2="16" y2="23"></line>', "minimize-2": '<polyline points="4 14 10 14 10 20"></polyline><polyline points="20 10 14 10 14 4"></polyline><line x1="14" y1="10" x2="21" y2="3"></line><line x1="3" y1="21" x2="10" y2="14"></line>', "minimize": '<path d="M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3"></path>', "minus-circle": '<circle cx="12" cy="12" r="10"></circle><line x1="8" y1="12" x2="16" y2="12"></line>', "minus-square": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="8" y1="12" x2="16" y2="12"></line>', "minus": '<line x1="5" y1="12" x2="19" y2="12"></line>', "monitor": '<rect x="2" y="3" width="20" height="14" rx="2" ry="2"></rect><line x1="8" y1="21" x2="16" y2="21"></line><line x1="12" y1="17" x2="12" y2="21"></line>', "moon": '<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>', "more-horizontal": '<circle cx="12" cy="12" r="1"></circle><circle cx="19" cy="12" r="1"></circle><circle cx="5" cy="12" r="1"></circle>', "more-vertical": '<circle cx="12" cy="12" r="1"></circle><circle cx="12" cy="5" r="1"></circle><circle cx="12" cy="19" r="1"></circle>', "mouse-pointer": '<path d="M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z"></path><path d="M13 13l6 6"></path>', "move": '<polyline points="5 9 2 12 5 15"></polyline><polyline points="9 5 12 2 15 5"></polyline><polyline points="15 19 12 22 9 19"></polyline><polyline points="19 9 22 12 19 15"></polyline><line x1="2" y1="12" x2="22" y2="12"></line><line x1="12" y1="2" x2="12" y2="22"></line>', "music": '<path d="M9 18V5l12-2v13"></path><circle cx="6" cy="18" r="3"></circle><circle cx="18" cy="16" r="3"></circle>', "navigation-2": '<polygon points="12 2 19 21 12 17 5 21 12 2"></polygon>', "navigation": '<polygon points="3 11 22 2 13 21 11 13 3 11"></polygon>', "octagon": '<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"></polygon>', "package": '<line x1="16.5" y1="9.4" x2="7.5" y2="4.21"></line><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path><polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline><line x1="12" y1="22.08" x2="12" y2="12"></line>', "paperclip": '<path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>', "pause-circle": '<circle cx="12" cy="12" r="10"></circle><line x1="10" y1="15" x2="10" y2="9"></line><line x1="14" y1="15" x2="14" y2="9"></line>', "pause": '<rect x="6" y="4" width="4" height="16"></rect><rect x="14" y="4" width="4" height="16"></rect>', "pen-tool": '<path d="M12 19l7-7 3 3-7 7-3-3z"></path><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"></path><path d="M2 2l7.586 7.586"></path><circle cx="11" cy="11" r="2"></circle>', "percent": '<line x1="19" y1="5" x2="5" y2="19"></line><circle cx="6.5" cy="6.5" r="2.5"></circle><circle cx="17.5" cy="17.5" r="2.5"></circle>', "phone-call": '<path d="M15.05 5A5 5 0 0 1 19 8.95M15.05 1A9 9 0 0 1 23 8.94m-1 7.98v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path>', "phone-forwarded": '<polyline points="19 1 23 5 19 9"></polyline><line x1="15" y1="5" x2="23" y2="5"></line><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path>', "phone-incoming": '<polyline points="16 2 16 8 22 8"></polyline><line x1="23" y1="1" x2="16" y2="8"></line><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path>', "phone-missed": '<line x1="23" y1="1" x2="17" y2="7"></line><line x1="17" y1="1" x2="23" y2="7"></line><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path>', "phone-off": '<path d="M10.68 13.31a16 16 0 0 0 3.41 2.6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7 2 2 0 0 1 1.72 2v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.42 19.42 0 0 1-3.33-2.67m-2.67-3.34a19.79 19.79 0 0 1-3.07-8.63A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91"></path><line x1="23" y1="1" x2="1" y2="23"></line>', "phone-outgoing": '<polyline points="23 7 23 1 17 1"></polyline><line x1="16" y1="8" x2="23" y2="1"></line><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path>', "phone": '<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path>', "pie-chart": '<path d="M21.21 15.89A10 10 0 1 1 8 2.83"></path><path d="M22 12A10 10 0 0 0 12 2v10z"></path>', "play-circle": '<circle cx="12" cy="12" r="10"></circle><polygon points="10 8 16 12 10 16 10 8"></polygon>', "play": '<polygon points="5 3 19 12 5 21 5 3"></polygon>', "plus-circle": '<circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line><line x1="8" y1="12" x2="16" y2="12"></line>', "plus-square": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="12" y1="8" x2="12" y2="16"></line><line x1="8" y1="12" x2="16" y2="12"></line>', "plus": '<line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line>', "pocket": '<path d="M4 3h16a2 2 0 0 1 2 2v6a10 10 0 0 1-10 10A10 10 0 0 1 2 11V5a2 2 0 0 1 2-2z"></path><polyline points="8 10 12 14 16 10"></polyline>', "power": '<path d="M18.36 6.64a9 9 0 1 1-12.73 0"></path><line x1="12" y1="2" x2="12" y2="12"></line>', "printer": '<polyline points="6 9 6 2 18 2 18 9"></polyline><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path><rect x="6" y="14" width="12" height="8"></rect>', "radio": '<circle cx="12" cy="12" r="2"></circle><path d="M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14"></path>', "refresh-ccw": '<polyline points="1 4 1 10 7 10"></polyline><polyline points="23 20 23 14 17 14"></polyline><path d="M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15"></path>', "refresh-cw": '<polyline points="23 4 23 10 17 10"></polyline><polyline points="1 20 1 14 7 14"></polyline><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path>', "repeat": '<polyline points="17 1 21 5 17 9"></polyline><path d="M3 11V9a4 4 0 0 1 4-4h14"></path><polyline points="7 23 3 19 7 15"></polyline><path d="M21 13v2a4 4 0 0 1-4 4H3"></path>', "rewind": '<polygon points="11 19 2 12 11 5 11 19"></polygon><polygon points="22 19 13 12 22 5 22 19"></polygon>', "rotate-ccw": '<polyline points="1 4 1 10 7 10"></polyline><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"></path>', "rotate-cw": '<polyline points="23 4 23 10 17 10"></polyline><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"></path>', "rss": '<path d="M4 11a9 9 0 0 1 9 9"></path><path d="M4 4a16 16 0 0 1 16 16"></path><circle cx="5" cy="19" r="1"></circle>', "save": '<path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path><polyline points="17 21 17 13 7 13 7 21"></polyline><polyline points="7 3 7 8 15 8"></polyline>', "scissors": '<circle cx="6" cy="6" r="3"></circle><circle cx="6" cy="18" r="3"></circle><line x1="20" y1="4" x2="8.12" y2="15.88"></line><line x1="14.47" y1="14.48" x2="20" y2="20"></line><line x1="8.12" y1="8.12" x2="12" y2="12"></line>', "search": '<circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line>', "send": '<line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon>', "server": '<rect x="2" y="2" width="20" height="8" rx="2" ry="2"></rect><rect x="2" y="14" width="20" height="8" rx="2" ry="2"></rect><line x1="6" y1="6" x2="6.01" y2="6"></line><line x1="6" y1="18" x2="6.01" y2="18"></line>', "settings": '<circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>', "share-2": '<circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line>', "share": '<path d="M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8"></path><polyline points="16 6 12 2 8 6"></polyline><line x1="12" y1="2" x2="12" y2="15"></line>', "shield-off": '<path d="M19.69 14a6.9 6.9 0 0 0 .31-2V5l-8-3-3.16 1.18"></path><path d="M4.73 4.73L4 5v7c0 6 8 10 8 10a20.29 20.29 0 0 0 5.62-4.38"></path><line x1="1" y1="1" x2="23" y2="23"></line>', "shield": '<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>', "shopping-bag": '<path d="M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"></path><line x1="3" y1="6" x2="21" y2="6"></line><path d="M16 10a4 4 0 0 1-8 0"></path>', "shopping-cart": '<circle cx="9" cy="21" r="1"></circle><circle cx="20" cy="21" r="1"></circle><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path>', "shuffle": '<polyline points="16 3 21 3 21 8"></polyline><line x1="4" y1="20" x2="21" y2="3"></line><polyline points="21 16 21 21 16 21"></polyline><line x1="15" y1="15" x2="21" y2="21"></line><line x1="4" y1="4" x2="9" y2="9"></line>', "sidebar": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="9" y1="3" x2="9" y2="21"></line>', "skip-back": '<polygon points="19 20 9 12 19 4 19 20"></polygon><line x1="5" y1="19" x2="5" y2="5"></line>', "skip-forward": '<polygon points="5 4 15 12 5 20 5 4"></polygon><line x1="19" y1="5" x2="19" y2="19"></line>', "slack": '<path d="M14.5 10c-.83 0-1.5-.67-1.5-1.5v-5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5z"></path><path d="M20.5 10H19V8.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"></path><path d="M9.5 14c.83 0 1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5S8 21.33 8 20.5v-5c0-.83.67-1.5 1.5-1.5z"></path><path d="M3.5 14H5v1.5c0 .83-.67 1.5-1.5 1.5S2 16.33 2 15.5 2.67 14 3.5 14z"></path><path d="M14 14.5c0-.83.67-1.5 1.5-1.5h5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-5c-.83 0-1.5-.67-1.5-1.5z"></path><path d="M15.5 19H14v1.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z"></path><path d="M10 9.5C10 8.67 9.33 8 8.5 8h-5C2.67 8 2 8.67 2 9.5S2.67 11 3.5 11h5c.83 0 1.5-.67 1.5-1.5z"></path><path d="M8.5 5H10V3.5C10 2.67 9.33 2 8.5 2S7 2.67 7 3.5 7.67 5 8.5 5z"></path>', "slash": '<circle cx="12" cy="12" r="10"></circle><line x1="4.93" y1="4.93" x2="19.07" y2="19.07"></line>', "sliders": '<line x1="4" y1="21" x2="4" y2="14"></line><line x1="4" y1="10" x2="4" y2="3"></line><line x1="12" y1="21" x2="12" y2="12"></line><line x1="12" y1="8" x2="12" y2="3"></line><line x1="20" y1="21" x2="20" y2="16"></line><line x1="20" y1="12" x2="20" y2="3"></line><line x1="1" y1="14" x2="7" y2="14"></line><line x1="9" y1="8" x2="15" y2="8"></line><line x1="17" y1="16" x2="23" y2="16"></line>', "smartphone": '<rect x="5" y="2" width="14" height="20" rx="2" ry="2"></rect><line x1="12" y1="18" x2="12.01" y2="18"></line>', "smile": '<circle cx="12" cy="12" r="10"></circle><path d="M8 14s1.5 2 4 2 4-2 4-2"></path><line x1="9" y1="9" x2="9.01" y2="9"></line><line x1="15" y1="9" x2="15.01" y2="9"></line>', "speaker": '<rect x="4" y="2" width="16" height="20" rx="2" ry="2"></rect><circle cx="12" cy="14" r="4"></circle><line x1="12" y1="6" x2="12.01" y2="6"></line>', "square": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>', "star": '<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon>', "stop-circle": '<circle cx="12" cy="12" r="10"></circle><rect x="9" y="9" width="6" height="6"></rect>', "sun": '<circle cx="12" cy="12" r="5"></circle><line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line><line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>', "sunrise": '<path d="M17 18a5 5 0 0 0-10 0"></path><line x1="12" y1="2" x2="12" y2="9"></line><line x1="4.22" y1="10.22" x2="5.64" y2="11.64"></line><line x1="1" y1="18" x2="3" y2="18"></line><line x1="21" y1="18" x2="23" y2="18"></line><line x1="18.36" y1="11.64" x2="19.78" y2="10.22"></line><line x1="23" y1="22" x2="1" y2="22"></line><polyline points="8 6 12 2 16 6"></polyline>', "sunset": '<path d="M17 18a5 5 0 0 0-10 0"></path><line x1="12" y1="9" x2="12" y2="2"></line><line x1="4.22" y1="10.22" x2="5.64" y2="11.64"></line><line x1="1" y1="18" x2="3" y2="18"></line><line x1="21" y1="18" x2="23" y2="18"></line><line x1="18.36" y1="11.64" x2="19.78" y2="10.22"></line><line x1="23" y1="22" x2="1" y2="22"></line><polyline points="16 5 12 9 8 5"></polyline>', "tablet": '<rect x="4" y="2" width="16" height="20" rx="2" ry="2"></rect><line x1="12" y1="18" x2="12.01" y2="18"></line>', "tag": '<path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path><line x1="7" y1="7" x2="7.01" y2="7"></line>', "target": '<circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="6"></circle><circle cx="12" cy="12" r="2"></circle>', "terminal": '<polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line>', "thermometer": '<path d="M14 14.76V3.5a2.5 2.5 0 0 0-5 0v11.26a4.5 4.5 0 1 0 5 0z"></path>', "thumbs-down": '<path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path>', "thumbs-up": '<path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path>', "toggle-left": '<rect x="1" y="5" width="22" height="14" rx="7" ry="7"></rect><circle cx="8" cy="12" r="3"></circle>', "toggle-right": '<rect x="1" y="5" width="22" height="14" rx="7" ry="7"></rect><circle cx="16" cy="12" r="3"></circle>', "tool": '<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path>', "trash-2": '<polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path><line x1="10" y1="11" x2="10" y2="17"></line><line x1="14" y1="11" x2="14" y2="17"></line>', "trash": '<polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path>', "trello": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><rect x="7" y="7" width="3" height="9"></rect><rect x="14" y="7" width="3" height="5"></rect>', "trending-down": '<polyline points="23 18 13.5 8.5 8.5 13.5 1 6"></polyline><polyline points="17 18 23 18 23 12"></polyline>', "trending-up": '<polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline><polyline points="17 6 23 6 23 12"></polyline>', "triangle": '<path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path>', "truck": '<rect x="1" y="3" width="15" height="13"></rect><polygon points="16 8 20 8 23 11 23 16 16 16 16 8"></polygon><circle cx="5.5" cy="18.5" r="2.5"></circle><circle cx="18.5" cy="18.5" r="2.5"></circle>', "tv": '<rect x="2" y="7" width="20" height="15" rx="2" ry="2"></rect><polyline points="17 2 12 7 7 2"></polyline>', "twitch": '<path d="M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7"></path>', "twitter": '<path d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z"></path>', "type": '<polyline points="4 7 4 4 20 4 20 7"></polyline><line x1="9" y1="20" x2="15" y2="20"></line><line x1="12" y1="4" x2="12" y2="20"></line>', "umbrella": '<path d="M23 12a11.05 11.05 0 0 0-22 0zm-5 7a3 3 0 0 1-6 0v-7"></path>', "underline": '<path d="M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3"></path><line x1="4" y1="21" x2="20" y2="21"></line>', "unlock": '<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 9.9-1"></path>', "upload-cloud": '<polyline points="16 16 12 12 8 16"></polyline><line x1="12" y1="12" x2="12" y2="21"></line><path d="M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3"></path><polyline points="16 16 12 12 8 16"></polyline>', "upload": '<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line>', "user-check": '<path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="8.5" cy="7" r="4"></circle><polyline points="17 11 19 13 23 9"></polyline>', "user-minus": '<path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="8.5" cy="7" r="4"></circle><line x1="23" y1="11" x2="17" y2="11"></line>', "user-plus": '<path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="8.5" cy="7" r="4"></circle><line x1="20" y1="8" x2="20" y2="14"></line><line x1="23" y1="11" x2="17" y2="11"></line>', "user-x": '<path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="8.5" cy="7" r="4"></circle><line x1="18" y1="8" x2="23" y2="13"></line><line x1="23" y1="8" x2="18" y2="13"></line>', "user": '<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle>', "users": '<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path>', "video-off": '<path d="M16 16v1a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2m5.66 0H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10"></path><line x1="1" y1="1" x2="23" y2="23"></line>', "video": '<polygon points="23 7 16 12 23 17 23 7"></polygon><rect x="1" y="5" width="15" height="14" rx="2" ry="2"></rect>', "voicemail": '<circle cx="5.5" cy="11.5" r="4.5"></circle><circle cx="18.5" cy="11.5" r="4.5"></circle><line x1="5.5" y1="16" x2="18.5" y2="16"></line>', "volume-1": '<polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon><path d="M15.54 8.46a5 5 0 0 1 0 7.07"></path>', "volume-2": '<polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon><path d="M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07"></path>', "volume-x": '<polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon><line x1="23" y1="9" x2="17" y2="15"></line><line x1="17" y1="9" x2="23" y2="15"></line>', "volume": '<polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon>', "watch": '<circle cx="12" cy="12" r="7"></circle><polyline points="12 9 12 12 13.5 13.5"></polyline><path d="M16.51 17.35l-.35 3.83a2 2 0 0 1-2 1.82H9.83a2 2 0 0 1-2-1.82l-.35-3.83m.01-10.7l.35-3.83A2 2 0 0 1 9.83 1h4.35a2 2 0 0 1 2 1.82l.35 3.83"></path>', "wifi-off": '<line x1="1" y1="1" x2="23" y2="23"></line><path d="M16.72 11.06A10.94 10.94 0 0 1 19 12.55"></path><path d="M5 12.55a10.94 10.94 0 0 1 5.17-2.39"></path><path d="M10.71 5.05A16 16 0 0 1 22.58 9"></path><path d="M1.42 9a15.91 15.91 0 0 1 4.7-2.88"></path><path d="M8.53 16.11a6 6 0 0 1 6.95 0"></path><line x1="12" y1="20" x2="12.01" y2="20"></line>', "wifi": '<path d="M5 12.55a11 11 0 0 1 14.08 0"></path><path d="M1.42 9a16 16 0 0 1 21.16 0"></path><path d="M8.53 16.11a6 6 0 0 1 6.95 0"></path><line x1="12" y1="20" x2="12.01" y2="20"></line>', "wind": '<path d="M9.59 4.59A2 2 0 1 1 11 8H2m10.59 11.41A2 2 0 1 0 14 16H2m15.73-8.27A2.5 2.5 0 1 1 19.5 12H2"></path>', "x-circle": '<circle cx="12" cy="12" r="10"></circle><line x1="15" y1="9" x2="9" y2="15"></line><line x1="9" y1="9" x2="15" y2="15"></line>', "x-octagon": '<polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"></polygon><line x1="15" y1="9" x2="9" y2="15"></line><line x1="9" y1="9" x2="15" y2="15"></line>', "x-square": '<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="9" y1="9" x2="15" y2="15"></line><line x1="15" y1="9" x2="9" y2="15"></line>', "x": '<line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line>', "youtube": '<path d="M22.54 6.42a2.78 2.78 0 0 0-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 0 0-1.94 2A29 29 0 0 0 1 11.75a29 29 0 0 0 .46 5.33A2.78 2.78 0 0 0 3.4 19c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 0 0 1.94-2 29 29 0 0 0 .46-5.25 29 29 0 0 0-.46-5.33z"></path><polygon points="9.75 15.02 15.5 11.75 9.75 8.48 9.75 15.02"></polygon>', "zap-off": '<polyline points="12.41 6.75 13 2 10.57 4.92"></polyline><polyline points="18.57 12.91 21 10 15.66 10"></polyline><polyline points="8 8 3 14 12 14 11 22 16 16"></polyline><line x1="1" y1="1" x2="23" y2="23"></line>', "zap": '<polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"></polygon>', "zoom-in": '<circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line><line x1="11" y1="8" x2="11" y2="14"></line><line x1="8" y1="11" x2="14" y2="11"></line>', "zoom-out": '<circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line><line x1="8" y1="11" x2="14" y2="11"></line>' };
},
"./node_modules/classnames/dedupe.js": function(module3, exports2, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
(function() {
"use strict";
var classNames = function() {
function StorageObject() {
}
StorageObject.prototype = /* @__PURE__ */ Object.create(null);
function _parseArray(resultSet, array) {
var length = array.length;
for (var i = 0; i < length; ++i) {
_parse(resultSet, array[i]);
}
}
var hasOwn = {}.hasOwnProperty;
function _parseNumber(resultSet, num) {
resultSet[num] = true;
}
function _parseObject(resultSet, object) {
for (var k in object) {
if (hasOwn.call(object, k)) {
resultSet[k] = !!object[k];
}
}
}
var SPACE = /\s+/;
function _parseString(resultSet, str) {
var array = str.split(SPACE);
var length = array.length;
for (var i = 0; i < length; ++i) {
resultSet[array[i]] = true;
}
}
function _parse(resultSet, arg) {
if (!arg)
return;
var argType = typeof arg;
if (argType === "string") {
_parseString(resultSet, arg);
} else if (Array.isArray(arg)) {
_parseArray(resultSet, arg);
} else if (argType === "object") {
_parseObject(resultSet, arg);
} else if (argType === "number") {
_parseNumber(resultSet, arg);
}
}
function _classNames() {
var len = arguments.length;
var args = Array(len);
for (var i = 0; i < len; i++) {
args[i] = arguments[i];
}
var classSet = new StorageObject();
_parseArray(classSet, args);
var list = [];
for (var k in classSet) {
if (classSet[k]) {
list.push(k);
}
}
return list.join(" ");
}
return _classNames;
}();
if (typeof module3 !== "undefined" && module3.exports) {
module3.exports = classNames;
} else if (true) {
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {
return classNames;
}.apply(exports2, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== void 0 && (module3.exports = __WEBPACK_AMD_DEFINE_RESULT__));
} else {
}
})();
},
"./node_modules/core-js/es/array/from.js": function(module3, exports2, __webpack_require__) {
__webpack_require__("./node_modules/core-js/modules/es.string.iterator.js");
__webpack_require__("./node_modules/core-js/modules/es.array.from.js");
var path2 = __webpack_require__("./node_modules/core-js/internals/path.js");
module3.exports = path2.Array.from;
},
"./node_modules/core-js/internals/a-function.js": function(module3, exports2) {
module3.exports = function(it) {
if (typeof it != "function") {
throw TypeError(String(it) + " is not a function");
}
return it;
};
},
"./node_modules/core-js/internals/an-object.js": function(module3, exports2, __webpack_require__) {
var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js");
module3.exports = function(it) {
if (!isObject(it)) {
throw TypeError(String(it) + " is not an object");
}
return it;
};
},
"./node_modules/core-js/internals/array-from.js": function(module3, exports2, __webpack_require__) {
"use strict";
var bind = __webpack_require__("./node_modules/core-js/internals/bind-context.js");
var toObject = __webpack_require__("./node_modules/core-js/internals/to-object.js");
var callWithSafeIterationClosing = __webpack_require__("./node_modules/core-js/internals/call-with-safe-iteration-closing.js");
var isArrayIteratorMethod = __webpack_require__("./node_modules/core-js/internals/is-array-iterator-method.js");
var toLength = __webpack_require__("./node_modules/core-js/internals/to-length.js");
var createProperty = __webpack_require__("./node_modules/core-js/internals/create-property.js");
var getIteratorMethod = __webpack_require__("./node_modules/core-js/internals/get-iterator-method.js");
module3.exports = function from(arrayLike) {
var O = toObject(arrayLike);
var C2 = typeof this == "function" ? this : Array;
var argumentsLength = arguments.length;
var mapfn = argumentsLength > 1 ? arguments[1] : void 0;
var mapping = mapfn !== void 0;
var index2 = 0;
var iteratorMethod = getIteratorMethod(O);
var length, result, step, iterator;
if (mapping)
mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : void 0, 2);
if (iteratorMethod != void 0 && !(C2 == Array && isArrayIteratorMethod(iteratorMethod))) {
iterator = iteratorMethod.call(O);
result = new C2();
for (; !(step = iterator.next()).done; index2++) {
createProperty(result, index2, mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index2], true) : step.value);
}
} else {
length = toLength(O.length);
result = new C2(length);
for (; length > index2; index2++) {
createProperty(result, index2, mapping ? mapfn(O[index2], index2) : O[index2]);
}
}
result.length = index2;
return result;
};
},
"./node_modules/core-js/internals/array-includes.js": function(module3, exports2, __webpack_require__) {
var toIndexedObject = __webpack_require__("./node_modules/core-js/internals/to-indexed-object.js");
var toLength = __webpack_require__("./node_modules/core-js/internals/to-length.js");
var toAbsoluteIndex = __webpack_require__("./node_modules/core-js/internals/to-absolute-index.js");
module3.exports = function(IS_INCLUDES) {
return function($this, el, fromIndex) {
var O = toIndexedObject($this);
var length = toLength(O.length);
var index2 = toAbsoluteIndex(fromIndex, length);
var value;
if (IS_INCLUDES && el != el)
while (length > index2) {
value = O[index2++];
if (value != value)
return true;
}
else
for (; length > index2; index2++)
if (IS_INCLUDES || index2 in O) {
if (O[index2] === el)
return IS_INCLUDES || index2 || 0;
}
return !IS_INCLUDES && -1;
};
};
},
"./node_modules/core-js/internals/bind-context.js": function(module3, exports2, __webpack_require__) {
var aFunction = __webpack_require__("./node_modules/core-js/internals/a-function.js");
module3.exports = function(fn, that, length) {
aFunction(fn);
if (that === void 0)
return fn;
switch (length) {
case 0:
return function() {
return fn.call(that);
};
case 1:
return function(a2) {
return fn.call(that, a2);
};
case 2:
return function(a2, b) {
return fn.call(that, a2, b);
};
case 3:
return function(a2, b, c3) {
return fn.call(that, a2, b, c3);
};
}
return function() {
return fn.apply(that, arguments);
};
};
},
"./node_modules/core-js/internals/call-with-safe-iteration-closing.js": function(module3, exports2, __webpack_require__) {
var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js");
module3.exports = function(iterator, fn, value, ENTRIES) {
try {
return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
} catch (error6) {
var returnMethod = iterator["return"];
if (returnMethod !== void 0)
anObject(returnMethod.call(iterator));
throw error6;
}
};
},
"./node_modules/core-js/internals/check-correctness-of-iteration.js": function(module3, exports2, __webpack_require__) {
var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js");
var ITERATOR = wellKnownSymbol("iterator");
var SAFE_CLOSING = false;
try {
var called = 0;
var iteratorWithReturn = {
next: function() {
return { done: !!called++ };
},
"return": function() {
SAFE_CLOSING = true;
}
};
iteratorWithReturn[ITERATOR] = function() {
return this;
};
Array.from(iteratorWithReturn, function() {
throw 2;
});
} catch (error6) {
}
module3.exports = function(exec, SKIP_CLOSING) {
if (!SKIP_CLOSING && !SAFE_CLOSING)
return false;
var ITERATION_SUPPORT = false;
try {
var object = {};
object[ITERATOR] = function() {
return {
next: function() {
return { done: ITERATION_SUPPORT = true };
}
};
};
exec(object);
} catch (error6) {
}
return ITERATION_SUPPORT;
};
},
"./node_modules/core-js/internals/classof-raw.js": function(module3, exports2) {
var toString = {}.toString;
module3.exports = function(it) {
return toString.call(it).slice(8, -1);
};
},
"./node_modules/core-js/internals/classof.js": function(module3, exports2, __webpack_require__) {
var classofRaw = __webpack_require__("./node_modules/core-js/internals/classof-raw.js");
var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js");
var TO_STRING_TAG = wellKnownSymbol("toStringTag");
var CORRECT_ARGUMENTS = classofRaw(function() {
return arguments;
}()) == "Arguments";
var tryGet = function(it, key) {
try {
return it[key];
} catch (error6) {
}
};
module3.exports = function(it) {
var O, tag, result;
return it === void 0 ? "Undefined" : it === null ? "Null" : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == "string" ? tag : CORRECT_ARGUMENTS ? classofRaw(O) : (result = classofRaw(O)) == "Object" && typeof O.callee == "function" ? "Arguments" : result;
};
},
"./node_modules/core-js/internals/copy-constructor-properties.js": function(module3, exports2, __webpack_require__) {
var has = __webpack_require__("./node_modules/core-js/internals/has.js");
var ownKeys = __webpack_require__("./node_modules/core-js/internals/own-keys.js");
var getOwnPropertyDescriptorModule = __webpack_require__("./node_modules/core-js/internals/object-get-own-property-descriptor.js");
var definePropertyModule = __webpack_require__("./node_modules/core-js/internals/object-define-property.js");
module3.exports = function(target, source) {
var keys = ownKeys(source);
var defineProperty = definePropertyModule.f;
var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (!has(target, key))
defineProperty(target, key, getOwnPropertyDescriptor(source, key));
}
};
},
"./node_modules/core-js/internals/correct-prototype-getter.js": function(module3, exports2, __webpack_require__) {
var fails = __webpack_require__("./node_modules/core-js/internals/fails.js");
module3.exports = !fails(function() {
function F() {
}
F.prototype.constructor = null;
return Object.getPrototypeOf(new F()) !== F.prototype;
});
},
"./node_modules/core-js/internals/create-iterator-constructor.js": function(module3, exports2, __webpack_require__) {
"use strict";
var IteratorPrototype = __webpack_require__("./node_modules/core-js/internals/iterators-core.js").IteratorPrototype;
var create2 = __webpack_require__("./node_modules/core-js/internals/object-create.js");
var createPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/create-property-descriptor.js");
var setToStringTag = __webpack_require__("./node_modules/core-js/internals/set-to-string-tag.js");
var Iterators = __webpack_require__("./node_modules/core-js/internals/iterators.js");
var returnThis = function() {
return this;
};
module3.exports = function(IteratorConstructor, NAME, next) {
var TO_STRING_TAG = NAME + " Iterator";
IteratorConstructor.prototype = create2(IteratorPrototype, { next: createPropertyDescriptor(1, next) });
setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);
Iterators[TO_STRING_TAG] = returnThis;
return IteratorConstructor;
};
},
"./node_modules/core-js/internals/create-property-descriptor.js": function(module3, exports2) {
module3.exports = function(bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
writable: !(bitmap & 4),
value
};
};
},
"./node_modules/core-js/internals/create-property.js": function(module3, exports2, __webpack_require__) {
"use strict";
var toPrimitive = __webpack_require__("./node_modules/core-js/internals/to-primitive.js");
var definePropertyModule = __webpack_require__("./node_modules/core-js/internals/object-define-property.js");
var createPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/create-property-descriptor.js");
module3.exports = function(object, key, value) {
var propertyKey = toPrimitive(key);
if (propertyKey in object)
definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));
else
object[propertyKey] = value;
};
},
"./node_modules/core-js/internals/define-iterator.js": function(module3, exports2, __webpack_require__) {
"use strict";
var $ = __webpack_require__("./node_modules/core-js/internals/export.js");
var createIteratorConstructor = __webpack_require__("./node_modules/core-js/internals/create-iterator-constructor.js");
var getPrototypeOf = __webpack_require__("./node_modules/core-js/internals/object-get-prototype-of.js");
var setPrototypeOf = __webpack_require__("./node_modules/core-js/internals/object-set-prototype-of.js");
var setToStringTag = __webpack_require__("./node_modules/core-js/internals/set-to-string-tag.js");
var hide = __webpack_require__("./node_modules/core-js/internals/hide.js");
var redefine = __webpack_require__("./node_modules/core-js/internals/redefine.js");
var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js");
var IS_PURE = __webpack_require__("./node_modules/core-js/internals/is-pure.js");
var Iterators = __webpack_require__("./node_modules/core-js/internals/iterators.js");
var IteratorsCore = __webpack_require__("./node_modules/core-js/internals/iterators-core.js");
var IteratorPrototype = IteratorsCore.IteratorPrototype;
var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
var ITERATOR = wellKnownSymbol("iterator");
var KEYS = "keys";
var VALUES = "values";
var ENTRIES = "entries";
var returnThis = function() {
return this;
};
module3.exports = function(Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
createIteratorConstructor(IteratorConstructor, NAME, next);
var getIterationMethod = function(KIND) {
if (KIND === DEFAULT && defaultIterator)
return defaultIterator;
if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype)
return IterablePrototype[KIND];
switch (KIND) {
case KEYS:
return function keys() {
return new IteratorConstructor(this, KIND);
};
case VALUES:
return function values() {
return new IteratorConstructor(this, KIND);
};
case ENTRIES:
return function entries() {
return new IteratorConstructor(this, KIND);
};
}
return function() {
return new IteratorConstructor(this);
};
};
var TO_STRING_TAG = NAME + " Iterator";
var INCORRECT_VALUES_NAME = false;
var IterablePrototype = Iterable.prototype;
var nativeIterator = IterablePrototype[ITERATOR] || IterablePrototype["@@iterator"] || DEFAULT && IterablePrototype[DEFAULT];
var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
var anyNativeIterator = NAME == "Array" ? IterablePrototype.entries || nativeIterator : nativeIterator;
var CurrentIteratorPrototype, methods, KEY;
if (anyNativeIterator) {
CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));
if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {
if (setPrototypeOf) {
setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
} else if (typeof CurrentIteratorPrototype[ITERATOR] != "function") {
hide(CurrentIteratorPrototype, ITERATOR, returnThis);
}
}
setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);
if (IS_PURE)
Iterators[TO_STRING_TAG] = returnThis;
}
}
if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
INCORRECT_VALUES_NAME = true;
defaultIterator = function values() {
return nativeIterator.call(this);
};
}
if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {
hide(IterablePrototype, ITERATOR, defaultIterator);
}
Iterators[NAME] = defaultIterator;
if (DEFAULT) {
methods = {
values: getIterationMethod(VALUES),
keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
entries: getIterationMethod(ENTRIES)
};
if (FORCED)
for (KEY in methods) {
if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
redefine(IterablePrototype, KEY, methods[KEY]);
}
}
else
$({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
}
return methods;
};
},
"./node_modules/core-js/internals/descriptors.js": function(module3, exports2, __webpack_require__) {
var fails = __webpack_require__("./node_modules/core-js/internals/fails.js");
module3.exports = !fails(function() {
return Object.defineProperty({}, "a", { get: function() {
return 7;
} }).a != 7;
});
},
"./node_modules/core-js/internals/document-create-element.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js");
var document2 = global2.document;
var exist = isObject(document2) && isObject(document2.createElement);
module3.exports = function(it) {
return exist ? document2.createElement(it) : {};
};
},
"./node_modules/core-js/internals/enum-bug-keys.js": function(module3, exports2) {
module3.exports = [
"constructor",
"hasOwnProperty",
"isPrototypeOf",
"propertyIsEnumerable",
"toLocaleString",
"toString",
"valueOf"
];
},
"./node_modules/core-js/internals/export.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var getOwnPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
var hide = __webpack_require__("./node_modules/core-js/internals/hide.js");
var redefine = __webpack_require__("./node_modules/core-js/internals/redefine.js");
var setGlobal = __webpack_require__("./node_modules/core-js/internals/set-global.js");
var copyConstructorProperties = __webpack_require__("./node_modules/core-js/internals/copy-constructor-properties.js");
var isForced = __webpack_require__("./node_modules/core-js/internals/is-forced.js");
module3.exports = function(options, source) {
var TARGET = options.target;
var GLOBAL = options.global;
var STATIC = options.stat;
var FORCED, target, key, targetProperty, sourceProperty, descriptor;
if (GLOBAL) {
target = global2;
} else if (STATIC) {
target = global2[TARGET] || setGlobal(TARGET, {});
} else {
target = (global2[TARGET] || {}).prototype;
}
if (target)
for (key in source) {
sourceProperty = source[key];
if (options.noTargetGet) {
descriptor = getOwnPropertyDescriptor(target, key);
targetProperty = descriptor && descriptor.value;
} else
targetProperty = target[key];
FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? "." : "#") + key, options.forced);
if (!FORCED && targetProperty !== void 0) {
if (typeof sourceProperty === typeof targetProperty)
continue;
copyConstructorProperties(sourceProperty, targetProperty);
}
if (options.sham || targetProperty && targetProperty.sham) {
hide(sourceProperty, "sham", true);
}
redefine(target, key, sourceProperty, options);
}
};
},
"./node_modules/core-js/internals/fails.js": function(module3, exports2) {
module3.exports = function(exec) {
try {
return !!exec();
} catch (error6) {
return true;
}
};
},
"./node_modules/core-js/internals/function-to-string.js": function(module3, exports2, __webpack_require__) {
var shared = __webpack_require__("./node_modules/core-js/internals/shared.js");
module3.exports = shared("native-function-to-string", Function.toString);
},
"./node_modules/core-js/internals/get-iterator-method.js": function(module3, exports2, __webpack_require__) {
var classof = __webpack_require__("./node_modules/core-js/internals/classof.js");
var Iterators = __webpack_require__("./node_modules/core-js/internals/iterators.js");
var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js");
var ITERATOR = wellKnownSymbol("iterator");
module3.exports = function(it) {
if (it != void 0)
return it[ITERATOR] || it["@@iterator"] || Iterators[classof(it)];
};
},
"./node_modules/core-js/internals/global.js": function(module3, exports2, __webpack_require__) {
(function(global2) {
var O = "object";
var check = function(it) {
return it && it.Math == Math && it;
};
module3.exports = check(typeof globalThis == O && globalThis) || check(typeof window == O && window) || check(typeof self == O && self) || check(typeof global2 == O && global2) || Function("return this")();
}).call(this, __webpack_require__("./node_modules/webpack/buildin/global.js"));
},
"./node_modules/core-js/internals/has.js": function(module3, exports2) {
var hasOwnProperty = {}.hasOwnProperty;
module3.exports = function(it, key) {
return hasOwnProperty.call(it, key);
};
},
"./node_modules/core-js/internals/hidden-keys.js": function(module3, exports2) {
module3.exports = {};
},
"./node_modules/core-js/internals/hide.js": function(module3, exports2, __webpack_require__) {
var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js");
var definePropertyModule = __webpack_require__("./node_modules/core-js/internals/object-define-property.js");
var createPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/create-property-descriptor.js");
module3.exports = DESCRIPTORS ? function(object, key, value) {
return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
} : function(object, key, value) {
object[key] = value;
return object;
};
},
"./node_modules/core-js/internals/html.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var document2 = global2.document;
module3.exports = document2 && document2.documentElement;
},
"./node_modules/core-js/internals/ie8-dom-define.js": function(module3, exports2, __webpack_require__) {
var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js");
var fails = __webpack_require__("./node_modules/core-js/internals/fails.js");
var createElement = __webpack_require__("./node_modules/core-js/internals/document-create-element.js");
module3.exports = !DESCRIPTORS && !fails(function() {
return Object.defineProperty(createElement("div"), "a", {
get: function() {
return 7;
}
}).a != 7;
});
},
"./node_modules/core-js/internals/indexed-object.js": function(module3, exports2, __webpack_require__) {
var fails = __webpack_require__("./node_modules/core-js/internals/fails.js");
var classof = __webpack_require__("./node_modules/core-js/internals/classof-raw.js");
var split = "".split;
module3.exports = fails(function() {
return !Object("z").propertyIsEnumerable(0);
}) ? function(it) {
return classof(it) == "String" ? split.call(it, "") : Object(it);
} : Object;
},
"./node_modules/core-js/internals/internal-state.js": function(module3, exports2, __webpack_require__) {
var NATIVE_WEAK_MAP = __webpack_require__("./node_modules/core-js/internals/native-weak-map.js");
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js");
var hide = __webpack_require__("./node_modules/core-js/internals/hide.js");
var objectHas = __webpack_require__("./node_modules/core-js/internals/has.js");
var sharedKey = __webpack_require__("./node_modules/core-js/internals/shared-key.js");
var hiddenKeys = __webpack_require__("./node_modules/core-js/internals/hidden-keys.js");
var WeakMap = global2.WeakMap;
var set3, get3, has;
var enforce = function(it) {
return has(it) ? get3(it) : set3(it, {});
};
var getterFor = function(TYPE) {
return function(it) {
var state;
if (!isObject(it) || (state = get3(it)).type !== TYPE) {
throw TypeError("Incompatible receiver, " + TYPE + " required");
}
return state;
};
};
if (NATIVE_WEAK_MAP) {
var store = new WeakMap();
var wmget = store.get;
var wmhas = store.has;
var wmset = store.set;
set3 = function(it, metadata) {
wmset.call(store, it, metadata);
return metadata;
};
get3 = function(it) {
return wmget.call(store, it) || {};
};
has = function(it) {
return wmhas.call(store, it);
};
} else {
var STATE = sharedKey("state");
hiddenKeys[STATE] = true;
set3 = function(it, metadata) {
hide(it, STATE, metadata);
return metadata;
};
get3 = function(it) {
return objectHas(it, STATE) ? it[STATE] : {};
};
has = function(it) {
return objectHas(it, STATE);
};
}
module3.exports = {
set: set3,
get: get3,
has,
enforce,
getterFor
};
},
"./node_modules/core-js/internals/is-array-iterator-method.js": function(module3, exports2, __webpack_require__) {
var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js");
var Iterators = __webpack_require__("./node_modules/core-js/internals/iterators.js");
var ITERATOR = wellKnownSymbol("iterator");
var ArrayPrototype = Array.prototype;
module3.exports = function(it) {
return it !== void 0 && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);
};
},
"./node_modules/core-js/internals/is-forced.js": function(module3, exports2, __webpack_require__) {
var fails = __webpack_require__("./node_modules/core-js/internals/fails.js");
var replacement = /#|\.prototype\./;
var isForced = function(feature, detection) {
var value = data[normalize2(feature)];
return value == POLYFILL ? true : value == NATIVE ? false : typeof detection == "function" ? fails(detection) : !!detection;
};
var normalize2 = isForced.normalize = function(string) {
return String(string).replace(replacement, ".").toLowerCase();
};
var data = isForced.data = {};
var NATIVE = isForced.NATIVE = "N";
var POLYFILL = isForced.POLYFILL = "P";
module3.exports = isForced;
},
"./node_modules/core-js/internals/is-object.js": function(module3, exports2) {
module3.exports = function(it) {
return typeof it === "object" ? it !== null : typeof it === "function";
};
},
"./node_modules/core-js/internals/is-pure.js": function(module3, exports2) {
module3.exports = false;
},
"./node_modules/core-js/internals/iterators-core.js": function(module3, exports2, __webpack_require__) {
"use strict";
var getPrototypeOf = __webpack_require__("./node_modules/core-js/internals/object-get-prototype-of.js");
var hide = __webpack_require__("./node_modules/core-js/internals/hide.js");
var has = __webpack_require__("./node_modules/core-js/internals/has.js");
var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js");
var IS_PURE = __webpack_require__("./node_modules/core-js/internals/is-pure.js");
var ITERATOR = wellKnownSymbol("iterator");
var BUGGY_SAFARI_ITERATORS = false;
var returnThis = function() {
return this;
};
var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
if ([].keys) {
arrayIterator = [].keys();
if (!("next" in arrayIterator))
BUGGY_SAFARI_ITERATORS = true;
else {
PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
if (PrototypeOfArrayIteratorPrototype !== Object.prototype)
IteratorPrototype = PrototypeOfArrayIteratorPrototype;
}
}
if (IteratorPrototype == void 0)
IteratorPrototype = {};
if (!IS_PURE && !has(IteratorPrototype, ITERATOR))
hide(IteratorPrototype, ITERATOR, returnThis);
module3.exports = {
IteratorPrototype,
BUGGY_SAFARI_ITERATORS
};
},
"./node_modules/core-js/internals/iterators.js": function(module3, exports2) {
module3.exports = {};
},
"./node_modules/core-js/internals/native-symbol.js": function(module3, exports2, __webpack_require__) {
var fails = __webpack_require__("./node_modules/core-js/internals/fails.js");
module3.exports = !!Object.getOwnPropertySymbols && !fails(function() {
return !String(Symbol());
});
},
"./node_modules/core-js/internals/native-weak-map.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var nativeFunctionToString = __webpack_require__("./node_modules/core-js/internals/function-to-string.js");
var WeakMap = global2.WeakMap;
module3.exports = typeof WeakMap === "function" && /native code/.test(nativeFunctionToString.call(WeakMap));
},
"./node_modules/core-js/internals/object-create.js": function(module3, exports2, __webpack_require__) {
var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js");
var defineProperties = __webpack_require__("./node_modules/core-js/internals/object-define-properties.js");
var enumBugKeys = __webpack_require__("./node_modules/core-js/internals/enum-bug-keys.js");
var hiddenKeys = __webpack_require__("./node_modules/core-js/internals/hidden-keys.js");
var html = __webpack_require__("./node_modules/core-js/internals/html.js");
var documentCreateElement = __webpack_require__("./node_modules/core-js/internals/document-create-element.js");
var sharedKey = __webpack_require__("./node_modules/core-js/internals/shared-key.js");
var IE_PROTO = sharedKey("IE_PROTO");
var PROTOTYPE = "prototype";
var Empty = function() {
};
var createDict = function() {
var iframe = documentCreateElement("iframe");
var length = enumBugKeys.length;
var lt = "<";
var script = "script";
var gt = ">";
var js = "java" + script + ":";
var iframeDocument;
iframe.style.display = "none";
html.appendChild(iframe);
iframe.src = String(js);
iframeDocument = iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.write(lt + script + gt + "document.F=Object" + lt + "/" + script + gt);
iframeDocument.close();
createDict = iframeDocument.F;
while (length--)
delete createDict[PROTOTYPE][enumBugKeys[length]];
return createDict();
};
module3.exports = Object.create || function create2(O, Properties) {
var result;
if (O !== null) {
Empty[PROTOTYPE] = anObject(O);
result = new Empty();
Empty[PROTOTYPE] = null;
result[IE_PROTO] = O;
} else
result = createDict();
return Properties === void 0 ? result : defineProperties(result, Properties);
};
hiddenKeys[IE_PROTO] = true;
},
"./node_modules/core-js/internals/object-define-properties.js": function(module3, exports2, __webpack_require__) {
var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js");
var definePropertyModule = __webpack_require__("./node_modules/core-js/internals/object-define-property.js");
var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js");
var objectKeys = __webpack_require__("./node_modules/core-js/internals/object-keys.js");
module3.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {
anObject(O);
var keys = objectKeys(Properties);
var length = keys.length;
var i = 0;
var key;
while (length > i)
definePropertyModule.f(O, key = keys[i++], Properties[key]);
return O;
};
},
"./node_modules/core-js/internals/object-define-property.js": function(module3, exports2, __webpack_require__) {
var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js");
var IE8_DOM_DEFINE = __webpack_require__("./node_modules/core-js/internals/ie8-dom-define.js");
var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js");
var toPrimitive = __webpack_require__("./node_modules/core-js/internals/to-primitive.js");
var nativeDefineProperty = Object.defineProperty;
exports2.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {
anObject(O);
P = toPrimitive(P, true);
anObject(Attributes);
if (IE8_DOM_DEFINE)
try {
return nativeDefineProperty(O, P, Attributes);
} catch (error6) {
}
if ("get" in Attributes || "set" in Attributes)
throw TypeError("Accessors not supported");
if ("value" in Attributes)
O[P] = Attributes.value;
return O;
};
},
"./node_modules/core-js/internals/object-get-own-property-descriptor.js": function(module3, exports2, __webpack_require__) {
var DESCRIPTORS = __webpack_require__("./node_modules/core-js/internals/descriptors.js");
var propertyIsEnumerableModule = __webpack_require__("./node_modules/core-js/internals/object-property-is-enumerable.js");
var createPropertyDescriptor = __webpack_require__("./node_modules/core-js/internals/create-property-descriptor.js");
var toIndexedObject = __webpack_require__("./node_modules/core-js/internals/to-indexed-object.js");
var toPrimitive = __webpack_require__("./node_modules/core-js/internals/to-primitive.js");
var has = __webpack_require__("./node_modules/core-js/internals/has.js");
var IE8_DOM_DEFINE = __webpack_require__("./node_modules/core-js/internals/ie8-dom-define.js");
var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
exports2.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
O = toIndexedObject(O);
P = toPrimitive(P, true);
if (IE8_DOM_DEFINE)
try {
return nativeGetOwnPropertyDescriptor(O, P);
} catch (error6) {
}
if (has(O, P))
return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);
};
},
"./node_modules/core-js/internals/object-get-own-property-names.js": function(module3, exports2, __webpack_require__) {
var internalObjectKeys = __webpack_require__("./node_modules/core-js/internals/object-keys-internal.js");
var enumBugKeys = __webpack_require__("./node_modules/core-js/internals/enum-bug-keys.js");
var hiddenKeys = enumBugKeys.concat("length", "prototype");
exports2.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
return internalObjectKeys(O, hiddenKeys);
};
},
"./node_modules/core-js/internals/object-get-own-property-symbols.js": function(module3, exports2) {
exports2.f = Object.getOwnPropertySymbols;
},
"./node_modules/core-js/internals/object-get-prototype-of.js": function(module3, exports2, __webpack_require__) {
var has = __webpack_require__("./node_modules/core-js/internals/has.js");
var toObject = __webpack_require__("./node_modules/core-js/internals/to-object.js");
var sharedKey = __webpack_require__("./node_modules/core-js/internals/shared-key.js");
var CORRECT_PROTOTYPE_GETTER = __webpack_require__("./node_modules/core-js/internals/correct-prototype-getter.js");
var IE_PROTO = sharedKey("IE_PROTO");
var ObjectPrototype = Object.prototype;
module3.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function(O) {
O = toObject(O);
if (has(O, IE_PROTO))
return O[IE_PROTO];
if (typeof O.constructor == "function" && O instanceof O.constructor) {
return O.constructor.prototype;
}
return O instanceof Object ? ObjectPrototype : null;
};
},
"./node_modules/core-js/internals/object-keys-internal.js": function(module3, exports2, __webpack_require__) {
var has = __webpack_require__("./node_modules/core-js/internals/has.js");
var toIndexedObject = __webpack_require__("./node_modules/core-js/internals/to-indexed-object.js");
var arrayIncludes = __webpack_require__("./node_modules/core-js/internals/array-includes.js");
var hiddenKeys = __webpack_require__("./node_modules/core-js/internals/hidden-keys.js");
var arrayIndexOf = arrayIncludes(false);
module3.exports = function(object, names) {
var O = toIndexedObject(object);
var i = 0;
var result = [];
var key;
for (key in O)
!has(hiddenKeys, key) && has(O, key) && result.push(key);
while (names.length > i)
if (has(O, key = names[i++])) {
~arrayIndexOf(result, key) || result.push(key);
}
return result;
};
},
"./node_modules/core-js/internals/object-keys.js": function(module3, exports2, __webpack_require__) {
var internalObjectKeys = __webpack_require__("./node_modules/core-js/internals/object-keys-internal.js");
var enumBugKeys = __webpack_require__("./node_modules/core-js/internals/enum-bug-keys.js");
module3.exports = Object.keys || function keys(O) {
return internalObjectKeys(O, enumBugKeys);
};
},
"./node_modules/core-js/internals/object-property-is-enumerable.js": function(module3, exports2, __webpack_require__) {
"use strict";
var nativePropertyIsEnumerable = {}.propertyIsEnumerable;
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);
exports2.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
var descriptor = getOwnPropertyDescriptor(this, V);
return !!descriptor && descriptor.enumerable;
} : nativePropertyIsEnumerable;
},
"./node_modules/core-js/internals/object-set-prototype-of.js": function(module3, exports2, __webpack_require__) {
var validateSetPrototypeOfArguments = __webpack_require__("./node_modules/core-js/internals/validate-set-prototype-of-arguments.js");
module3.exports = Object.setPrototypeOf || ("__proto__" in {} ? function() {
var correctSetter = false;
var test = {};
var setter;
try {
setter = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set;
setter.call(test, []);
correctSetter = test instanceof Array;
} catch (error6) {
}
return function setPrototypeOf(O, proto) {
validateSetPrototypeOfArguments(O, proto);
if (correctSetter)
setter.call(O, proto);
else
O.__proto__ = proto;
return O;
};
}() : void 0);
},
"./node_modules/core-js/internals/own-keys.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var getOwnPropertyNamesModule = __webpack_require__("./node_modules/core-js/internals/object-get-own-property-names.js");
var getOwnPropertySymbolsModule = __webpack_require__("./node_modules/core-js/internals/object-get-own-property-symbols.js");
var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js");
var Reflect2 = global2.Reflect;
module3.exports = Reflect2 && Reflect2.ownKeys || function ownKeys(it) {
var keys = getOwnPropertyNamesModule.f(anObject(it));
var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;
};
},
"./node_modules/core-js/internals/path.js": function(module3, exports2, __webpack_require__) {
module3.exports = __webpack_require__("./node_modules/core-js/internals/global.js");
},
"./node_modules/core-js/internals/redefine.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var shared = __webpack_require__("./node_modules/core-js/internals/shared.js");
var hide = __webpack_require__("./node_modules/core-js/internals/hide.js");
var has = __webpack_require__("./node_modules/core-js/internals/has.js");
var setGlobal = __webpack_require__("./node_modules/core-js/internals/set-global.js");
var nativeFunctionToString = __webpack_require__("./node_modules/core-js/internals/function-to-string.js");
var InternalStateModule = __webpack_require__("./node_modules/core-js/internals/internal-state.js");
var getInternalState = InternalStateModule.get;
var enforceInternalState = InternalStateModule.enforce;
var TEMPLATE = String(nativeFunctionToString).split("toString");
shared("inspectSource", function(it) {
return nativeFunctionToString.call(it);
});
(module3.exports = function(O, key, value, options) {
var unsafe = options ? !!options.unsafe : false;
var simple = options ? !!options.enumerable : false;
var noTargetGet = options ? !!options.noTargetGet : false;
if (typeof value == "function") {
if (typeof key == "string" && !has(value, "name"))
hide(value, "name", key);
enforceInternalState(value).source = TEMPLATE.join(typeof key == "string" ? key : "");
}
if (O === global2) {
if (simple)
O[key] = value;
else
setGlobal(key, value);
return;
} else if (!unsafe) {
delete O[key];
} else if (!noTargetGet && O[key]) {
simple = true;
}
if (simple)
O[key] = value;
else
hide(O, key, value);
})(Function.prototype, "toString", function toString() {
return typeof this == "function" && getInternalState(this).source || nativeFunctionToString.call(this);
});
},
"./node_modules/core-js/internals/require-object-coercible.js": function(module3, exports2) {
module3.exports = function(it) {
if (it == void 0)
throw TypeError("Can't call method on " + it);
return it;
};
},
"./node_modules/core-js/internals/set-global.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var hide = __webpack_require__("./node_modules/core-js/internals/hide.js");
module3.exports = function(key, value) {
try {
hide(global2, key, value);
} catch (error6) {
global2[key] = value;
}
return value;
};
},
"./node_modules/core-js/internals/set-to-string-tag.js": function(module3, exports2, __webpack_require__) {
var defineProperty = __webpack_require__("./node_modules/core-js/internals/object-define-property.js").f;
var has = __webpack_require__("./node_modules/core-js/internals/has.js");
var wellKnownSymbol = __webpack_require__("./node_modules/core-js/internals/well-known-symbol.js");
var TO_STRING_TAG = wellKnownSymbol("toStringTag");
module3.exports = function(it, TAG, STATIC) {
if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {
defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });
}
};
},
"./node_modules/core-js/internals/shared-key.js": function(module3, exports2, __webpack_require__) {
var shared = __webpack_require__("./node_modules/core-js/internals/shared.js");
var uid = __webpack_require__("./node_modules/core-js/internals/uid.js");
var keys = shared("keys");
module3.exports = function(key) {
return keys[key] || (keys[key] = uid(key));
};
},
"./node_modules/core-js/internals/shared.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var setGlobal = __webpack_require__("./node_modules/core-js/internals/set-global.js");
var IS_PURE = __webpack_require__("./node_modules/core-js/internals/is-pure.js");
var SHARED = "__core-js_shared__";
var store = global2[SHARED] || setGlobal(SHARED, {});
(module3.exports = function(key, value) {
return store[key] || (store[key] = value !== void 0 ? value : {});
})("versions", []).push({
version: "3.1.3",
mode: IS_PURE ? "pure" : "global",
copyright: "\xA9 2019 Denis Pushkarev (zloirock.ru)"
});
},
"./node_modules/core-js/internals/string-at.js": function(module3, exports2, __webpack_require__) {
var toInteger = __webpack_require__("./node_modules/core-js/internals/to-integer.js");
var requireObjectCoercible = __webpack_require__("./node_modules/core-js/internals/require-object-coercible.js");
module3.exports = function(that, pos, CONVERT_TO_STRING) {
var S = String(requireObjectCoercible(that));
var position = toInteger(pos);
var size = S.length;
var first, second;
if (position < 0 || position >= size)
return CONVERT_TO_STRING ? "" : void 0;
first = S.charCodeAt(position);
return first < 55296 || first > 56319 || position + 1 === size || (second = S.charCodeAt(position + 1)) < 56320 || second > 57343 ? CONVERT_TO_STRING ? S.charAt(position) : first : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 55296 << 10) + (second - 56320) + 65536;
};
},
"./node_modules/core-js/internals/to-absolute-index.js": function(module3, exports2, __webpack_require__) {
var toInteger = __webpack_require__("./node_modules/core-js/internals/to-integer.js");
var max4 = Math.max;
var min3 = Math.min;
module3.exports = function(index2, length) {
var integer = toInteger(index2);
return integer < 0 ? max4(integer + length, 0) : min3(integer, length);
};
},
"./node_modules/core-js/internals/to-indexed-object.js": function(module3, exports2, __webpack_require__) {
var IndexedObject = __webpack_require__("./node_modules/core-js/internals/indexed-object.js");
var requireObjectCoercible = __webpack_require__("./node_modules/core-js/internals/require-object-coercible.js");
module3.exports = function(it) {
return IndexedObject(requireObjectCoercible(it));
};
},
"./node_modules/core-js/internals/to-integer.js": function(module3, exports2) {
var ceil = Math.ceil;
var floor = Math.floor;
module3.exports = function(argument) {
return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);
};
},
"./node_modules/core-js/internals/to-length.js": function(module3, exports2, __webpack_require__) {
var toInteger = __webpack_require__("./node_modules/core-js/internals/to-integer.js");
var min3 = Math.min;
module3.exports = function(argument) {
return argument > 0 ? min3(toInteger(argument), 9007199254740991) : 0;
};
},
"./node_modules/core-js/internals/to-object.js": function(module3, exports2, __webpack_require__) {
var requireObjectCoercible = __webpack_require__("./node_modules/core-js/internals/require-object-coercible.js");
module3.exports = function(argument) {
return Object(requireObjectCoercible(argument));
};
},
"./node_modules/core-js/internals/to-primitive.js": function(module3, exports2, __webpack_require__) {
var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js");
module3.exports = function(it, S) {
if (!isObject(it))
return it;
var fn, val;
if (S && typeof (fn = it.toString) == "function" && !isObject(val = fn.call(it)))
return val;
if (typeof (fn = it.valueOf) == "function" && !isObject(val = fn.call(it)))
return val;
if (!S && typeof (fn = it.toString) == "function" && !isObject(val = fn.call(it)))
return val;
throw TypeError("Can't convert object to primitive value");
};
},
"./node_modules/core-js/internals/uid.js": function(module3, exports2) {
var id2 = 0;
var postfix = Math.random();
module3.exports = function(key) {
return "Symbol(".concat(key === void 0 ? "" : key, ")_", (++id2 + postfix).toString(36));
};
},
"./node_modules/core-js/internals/validate-set-prototype-of-arguments.js": function(module3, exports2, __webpack_require__) {
var isObject = __webpack_require__("./node_modules/core-js/internals/is-object.js");
var anObject = __webpack_require__("./node_modules/core-js/internals/an-object.js");
module3.exports = function(O, proto) {
anObject(O);
if (!isObject(proto) && proto !== null) {
throw TypeError("Can't set " + String(proto) + " as a prototype");
}
};
},
"./node_modules/core-js/internals/well-known-symbol.js": function(module3, exports2, __webpack_require__) {
var global2 = __webpack_require__("./node_modules/core-js/internals/global.js");
var shared = __webpack_require__("./node_modules/core-js/internals/shared.js");
var uid = __webpack_require__("./node_modules/core-js/internals/uid.js");
var NATIVE_SYMBOL = __webpack_require__("./node_modules/core-js/internals/native-symbol.js");
var Symbol2 = global2.Symbol;
var store = shared("wks");
module3.exports = function(name) {
return store[name] || (store[name] = NATIVE_SYMBOL && Symbol2[name] || (NATIVE_SYMBOL ? Symbol2 : uid)("Symbol." + name));
};
},
"./node_modules/core-js/modules/es.array.from.js": function(module3, exports2, __webpack_require__) {
var $ = __webpack_require__("./node_modules/core-js/internals/export.js");
var from = __webpack_require__("./node_modules/core-js/internals/array-from.js");
var checkCorrectnessOfIteration = __webpack_require__("./node_modules/core-js/internals/check-correctness-of-iteration.js");
var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function(iterable) {
Array.from(iterable);
});
$({ target: "Array", stat: true, forced: INCORRECT_ITERATION }, {
from
});
},
"./node_modules/core-js/modules/es.string.iterator.js": function(module3, exports2, __webpack_require__) {
"use strict";
var codePointAt = __webpack_require__("./node_modules/core-js/internals/string-at.js");
var InternalStateModule = __webpack_require__("./node_modules/core-js/internals/internal-state.js");
var defineIterator = __webpack_require__("./node_modules/core-js/internals/define-iterator.js");
var STRING_ITERATOR = "String Iterator";
var setInternalState = InternalStateModule.set;
var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);
defineIterator(String, "String", function(iterated) {
setInternalState(this, {
type: STRING_ITERATOR,
string: String(iterated),
index: 0
});
}, function next() {
var state = getInternalState(this);
var string = state.string;
var index2 = state.index;
var point3;
if (index2 >= string.length)
return { value: void 0, done: true };
point3 = codePointAt(string, index2, true);
state.index += point3.length;
return { value: point3, done: false };
});
},
"./node_modules/webpack/buildin/global.js": function(module3, exports2) {
var g;
g = function() {
return this;
}();
try {
g = g || Function("return this")() || (1, eval)("this");
} catch (e) {
if (typeof window === "object")
g = window;
}
module3.exports = g;
},
"./src/default-attrs.json": function(module3) {
module3.exports = { "xmlns": "http://www.w3.org/2000/svg", "width": 24, "height": 24, "viewBox": "0 0 24 24", "fill": "none", "stroke": "currentColor", "stroke-width": 2, "stroke-linecap": "round", "stroke-linejoin": "round" };
},
"./src/icon.js": function(module3, exports2, __webpack_require__) {
"use strict";
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _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;
};
var _createClass = function() {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor)
descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps)
defineProperties(Constructor.prototype, protoProps);
if (staticProps)
defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var _dedupe = __webpack_require__("./node_modules/classnames/dedupe.js");
var _dedupe2 = _interopRequireDefault(_dedupe);
var _defaultAttrs = __webpack_require__("./src/default-attrs.json");
var _defaultAttrs2 = _interopRequireDefault(_defaultAttrs);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function _classCallCheck(instance24, Constructor) {
if (!(instance24 instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Icon = function() {
function Icon2(name, contents) {
var tags = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
_classCallCheck(this, Icon2);
this.name = name;
this.contents = contents;
this.tags = tags;
this.attrs = _extends({}, _defaultAttrs2.default, { class: "feather feather-" + name });
}
_createClass(Icon2, [{
key: "toSvg",
value: function toSvg() {
var attrs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var combinedAttrs = _extends({}, this.attrs, attrs, { class: (0, _dedupe2.default)(this.attrs.class, attrs.class) });
return "<svg " + attrsToString(combinedAttrs) + ">" + this.contents + "</svg>";
}
}, {
key: "toString",
value: function toString() {
return this.contents;
}
}]);
return Icon2;
}();
function attrsToString(attrs) {
return Object.keys(attrs).map(function(key) {
return key + '="' + attrs[key] + '"';
}).join(" ");
}
exports2.default = Icon;
},
"./src/icons.js": function(module3, exports2, __webpack_require__) {
"use strict";
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _icon = __webpack_require__("./src/icon.js");
var _icon2 = _interopRequireDefault(_icon);
var _icons = __webpack_require__("./dist/icons.json");
var _icons2 = _interopRequireDefault(_icons);
var _tags = __webpack_require__("./src/tags.json");
var _tags2 = _interopRequireDefault(_tags);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
exports2.default = Object.keys(_icons2.default).map(function(key) {
return new _icon2.default(key, _icons2.default[key], _tags2.default[key]);
}).reduce(function(object, icon) {
object[icon.name] = icon;
return object;
}, {});
},
"./src/index.js": function(module3, exports2, __webpack_require__) {
"use strict";
var _icons = __webpack_require__("./src/icons.js");
var _icons2 = _interopRequireDefault(_icons);
var _toSvg = __webpack_require__("./src/to-svg.js");
var _toSvg2 = _interopRequireDefault(_toSvg);
var _replace = __webpack_require__("./src/replace.js");
var _replace2 = _interopRequireDefault(_replace);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
module3.exports = { icons: _icons2.default, toSvg: _toSvg2.default, replace: _replace2.default };
},
"./src/replace.js": function(module3, exports2, __webpack_require__) {
"use strict";
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _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;
};
var _dedupe = __webpack_require__("./node_modules/classnames/dedupe.js");
var _dedupe2 = _interopRequireDefault(_dedupe);
var _icons = __webpack_require__("./src/icons.js");
var _icons2 = _interopRequireDefault(_icons);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function replace() {
var attrs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
if (typeof document === "undefined") {
throw new Error("`feather.replace()` only works in a browser environment.");
}
var elementsToReplace = document.querySelectorAll("[data-feather]");
Array.from(elementsToReplace).forEach(function(element2) {
return replaceElement(element2, attrs);
});
}
function replaceElement(element2) {
var attrs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var elementAttrs = getAttrs(element2);
var name = elementAttrs["data-feather"];
delete elementAttrs["data-feather"];
var svgString = _icons2.default[name].toSvg(_extends({}, attrs, elementAttrs, { class: (0, _dedupe2.default)(attrs.class, elementAttrs.class) }));
var svgDocument = new DOMParser().parseFromString(svgString, "image/svg+xml");
var svgElement = svgDocument.querySelector("svg");
element2.parentNode.replaceChild(svgElement, element2);
}
function getAttrs(element2) {
return Array.from(element2.attributes).reduce(function(attrs, attr2) {
attrs[attr2.name] = attr2.value;
return attrs;
}, {});
}
exports2.default = replace;
},
"./src/tags.json": function(module3) {
module3.exports = { "activity": ["pulse", "health", "action", "motion"], "airplay": ["stream", "cast", "mirroring"], "alert-circle": ["warning", "alert", "danger"], "alert-octagon": ["warning", "alert", "danger"], "alert-triangle": ["warning", "alert", "danger"], "align-center": ["text alignment", "center"], "align-justify": ["text alignment", "justified"], "align-left": ["text alignment", "left"], "align-right": ["text alignment", "right"], "anchor": [], "archive": ["index", "box"], "at-sign": ["mention", "at", "email", "message"], "award": ["achievement", "badge"], "aperture": ["camera", "photo"], "bar-chart": ["statistics", "diagram", "graph"], "bar-chart-2": ["statistics", "diagram", "graph"], "battery": ["power", "electricity"], "battery-charging": ["power", "electricity"], "bell": ["alarm", "notification", "sound"], "bell-off": ["alarm", "notification", "silent"], "bluetooth": ["wireless"], "book-open": ["read", "library"], "book": ["read", "dictionary", "booklet", "magazine", "library"], "bookmark": ["read", "clip", "marker", "tag"], "box": ["cube"], "briefcase": ["work", "bag", "baggage", "folder"], "calendar": ["date"], "camera": ["photo"], "cast": ["chromecast", "airplay"], "circle": ["off", "zero", "record"], "clipboard": ["copy"], "clock": ["time", "watch", "alarm"], "cloud-drizzle": ["weather", "shower"], "cloud-lightning": ["weather", "bolt"], "cloud-rain": ["weather"], "cloud-snow": ["weather", "blizzard"], "cloud": ["weather"], "codepen": ["logo"], "codesandbox": ["logo"], "code": ["source", "programming"], "coffee": ["drink", "cup", "mug", "tea", "cafe", "hot", "beverage"], "columns": ["layout"], "command": ["keyboard", "cmd", "terminal", "prompt"], "compass": ["navigation", "safari", "travel", "direction"], "copy": ["clone", "duplicate"], "corner-down-left": ["arrow", "return"], "corner-down-right": ["arrow"], "corner-left-down": ["arrow"], "corner-left-up": ["arrow"], "corner-right-down": ["arrow"], "corner-right-up": ["arrow"], "corner-up-left": ["arrow"], "corner-up-right": ["arrow"], "cpu": ["processor", "technology"], "credit-card": ["purchase", "payment", "cc"], "crop": ["photo", "image"], "crosshair": ["aim", "target"], "database": ["storage", "memory"], "delete": ["remove"], "disc": ["album", "cd", "dvd", "music"], "dollar-sign": ["currency", "money", "payment"], "droplet": ["water"], "edit": ["pencil", "change"], "edit-2": ["pencil", "change"], "edit-3": ["pencil", "change"], "eye": ["view", "watch"], "eye-off": ["view", "watch", "hide", "hidden"], "external-link": ["outbound"], "facebook": ["logo", "social"], "fast-forward": ["music"], "figma": ["logo", "design", "tool"], "file-minus": ["delete", "remove", "erase"], "file-plus": ["add", "create", "new"], "file-text": ["data", "txt", "pdf"], "film": ["movie", "video"], "filter": ["funnel", "hopper"], "flag": ["report"], "folder-minus": ["directory"], "folder-plus": ["directory"], "folder": ["directory"], "framer": ["logo", "design", "tool"], "frown": ["emoji", "face", "bad", "sad", "emotion"], "gift": ["present", "box", "birthday", "party"], "git-branch": ["code", "version control"], "git-commit": ["code", "version control"], "git-merge": ["code", "version control"], "git-pull-request": ["code", "version control"], "github": ["logo", "version control"], "gitlab": ["logo", "version control"], "globe": ["world", "browser", "language", "translate"], "hard-drive": ["computer", "server", "memory", "data"], "hash": ["hashtag", "number", "pound"], "headphones": ["music", "audio", "sound"], "heart": ["like", "love", "emotion"], "help-circle": ["question mark"], "hexagon": ["shape", "node.js", "logo"], "home": ["house", "living"], "image": ["picture"], "inbox": ["email"], "instagram": ["logo", "camera"], "key": ["password", "login", "authentication", "secure"], "layers": ["stack"], "layout": ["window", "webpage"], "life-bouy": ["help", "life ring", "support"], "link": ["chain", "url"], "link-2": ["chain", "url"], "linkedin": ["logo", "social media"], "list": ["options"], "lock": ["security", "password", "secure"], "log-in": ["sign in", "arrow", "enter"], "log-out": ["sign out", "arrow", "exit"], "mail": ["email", "message"], "map-pin": ["location", "navigation", "travel", "marker"], "map": ["location", "navigation", "travel"], "maximize": ["fullscreen"], "maximize-2": ["fullscreen", "arrows", "expand"], "meh": ["emoji", "face", "neutral", "emotion"], "menu": ["bars", "navigation", "hamburger"], "message-circle": ["comment", "chat"], "message-square": ["comment", "chat"], "mic-off": ["record", "sound", "mute"], "mic": ["record", "sound", "listen"], "minimize": ["exit fullscreen", "close"], "minimize-2": ["exit fullscreen", "arrows", "close"], "minus": ["subtract"], "monitor": ["tv", "screen", "display"], "moon": ["dark", "night"], "more-horizontal": ["ellipsis"], "more-vertical": ["ellipsis"], "mouse-pointer": ["arrow", "cursor"], "move": ["arrows"], "music": ["note"], "navigation": ["location", "travel"], "navigation-2": ["location", "travel"], "octagon": ["stop"], "package": ["box", "container"], "paperclip": ["attachment"], "pause": ["music", "stop"], "pause-circle": ["music", "audio", "stop"], "pen-tool": ["vector", "drawing"], "percent": ["discount"], "phone-call": ["ring"], "phone-forwarded": ["call"], "phone-incoming": ["call"], "phone-missed": ["call"], "phone-off": ["call", "mute"], "phone-outgoing": ["call"], "phone": ["call"], "play": ["music", "start"], "pie-chart": ["statistics", "diagram"], "play-circle": ["music", "start"], "plus": ["add", "new"], "plus-circle": ["add", "new"], "plus-square": ["add", "new"], "pocket": ["logo", "save"], "power": ["on", "off"], "printer": ["fax", "office", "device"], "radio": ["signal"], "refresh-cw": ["synchronise", "arrows"], "refresh-ccw": ["arrows"], "repeat": ["loop", "arrows"], "rewind": ["music"], "rotate-ccw": ["arrow"], "rotate-cw": ["arrow"], "rss": ["feed", "subscribe"], "save": ["floppy disk"], "scissors": ["cut"], "search": ["find", "magnifier", "magnifying glass"], "send": ["message", "mail", "email", "paper airplane", "paper aeroplane"], "settings": ["cog", "edit", "gear", "preferences"], "share-2": ["network", "connections"], "shield": ["security", "secure"], "shield-off": ["security", "insecure"], "shopping-bag": ["ecommerce", "cart", "purchase", "store"], "shopping-cart": ["ecommerce", "cart", "purchase", "store"], "shuffle": ["music"], "skip-back": ["music"], "skip-forward": ["music"], "slack": ["logo"], "slash": ["ban", "no"], "sliders": ["settings", "controls"], "smartphone": ["cellphone", "device"], "smile": ["emoji", "face", "happy", "good", "emotion"], "speaker": ["audio", "music"], "star": ["bookmark", "favorite", "like"], "stop-circle": ["media", "music"], "sun": ["brightness", "weather", "light"], "sunrise": ["weather", "time", "morning", "day"], "sunset": ["weather", "time", "evening", "night"], "tablet": ["device"], "tag": ["label"], "target": ["logo", "bullseye"], "terminal": ["code", "command line", "prompt"], "thermometer": ["temperature", "celsius", "fahrenheit", "weather"], "thumbs-down": ["dislike", "bad", "emotion"], "thumbs-up": ["like", "good", "emotion"], "toggle-left": ["on", "off", "switch"], "toggle-right": ["on", "off", "switch"], "tool": ["settings", "spanner"], "trash": ["garbage", "delete", "remove", "bin"], "trash-2": ["garbage", "delete", "remove", "bin"], "triangle": ["delta"], "truck": ["delivery", "van", "shipping", "transport", "lorry"], "tv": ["television", "stream"], "twitch": ["logo"], "twitter": ["logo", "social"], "type": ["text"], "umbrella": ["rain", "weather"], "unlock": ["security"], "user-check": ["followed", "subscribed"], "user-minus": ["delete", "remove", "unfollow", "unsubscribe"], "user-plus": ["new", "add", "create", "follow", "subscribe"], "user-x": ["delete", "remove", "unfollow", "unsubscribe", "unavailable"], "user": ["person", "account"], "users": ["group"], "video-off": ["camera", "movie", "film"], "video": ["camera", "movie", "film"], "voicemail": ["phone"], "volume": ["music", "sound", "mute"], "volume-1": ["music", "sound"], "volume-2": ["music", "sound"], "volume-x": ["music", "sound", "mute"], "watch": ["clock", "time"], "wifi-off": ["disabled"], "wifi": ["connection", "signal", "wireless"], "wind": ["weather", "air"], "x-circle": ["cancel", "close", "delete", "remove", "times", "clear"], "x-octagon": ["delete", "stop", "alert", "warning", "times", "clear"], "x-square": ["cancel", "close", "delete", "remove", "times", "clear"], "x": ["cancel", "close", "delete", "remove", "times", "clear"], "youtube": ["logo", "video", "play"], "zap-off": ["flash", "camera", "lightning"], "zap": ["flash", "camera", "lightning"], "zoom-in": ["magnifying glass"], "zoom-out": ["magnifying glass"] };
},
"./src/to-svg.js": function(module3, exports2, __webpack_require__) {
"use strict";
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _icons = __webpack_require__("./src/icons.js");
var _icons2 = _interopRequireDefault(_icons);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function toSvg(name) {
var attrs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
console.warn("feather.toSvg() is deprecated. Please use feather.icons[name].toSvg() instead.");
if (!name) {
throw new Error("The required `key` (icon name) parameter is missing.");
}
if (!_icons2.default[name]) {
throw new Error("No icon matching '" + name + "'. See the complete list of icons at https://feathericons.com");
}
return _icons2.default[name].toSvg(attrs);
}
exports2.default = toSvg;
},
0: function(module3, exports2, __webpack_require__) {
__webpack_require__("./node_modules/core-js/es/array/from.js");
module3.exports = __webpack_require__("./src/index.js");
}
});
});
}
});
// node_modules/loglevel/lib/loglevel.js
var require_loglevel = __commonJS({
"node_modules/loglevel/lib/loglevel.js"(exports, module2) {
(function(root2, definition) {
"use strict";
if (typeof define === "function" && define.amd) {
define(definition);
} else if (typeof module2 === "object" && module2.exports) {
module2.exports = definition();
} else {
root2.log = definition();
}
})(exports, function() {
"use strict";
var noop3 = function() {
};
var undefinedType = "undefined";
var isIE = typeof window !== undefinedType && typeof window.navigator !== undefinedType && /Trident\/|MSIE /.test(window.navigator.userAgent);
var logMethods = [
"trace",
"debug",
"info",
"warn",
"error"
];
function bindMethod(obj, methodName) {
var method = obj[methodName];
if (typeof method.bind === "function") {
return method.bind(obj);
} else {
try {
return Function.prototype.bind.call(method, obj);
} catch (e) {
return function() {
return Function.prototype.apply.apply(method, [obj, arguments]);
};
}
}
}
function traceForIE() {
if (console.log) {
if (console.log.apply) {
console.log.apply(console, arguments);
} else {
Function.prototype.apply.apply(console.log, [console, arguments]);
}
}
if (console.trace)
console.trace();
}
function realMethod(methodName) {
if (methodName === "debug") {
methodName = "log";
}
if (typeof console === undefinedType) {
return false;
} else if (methodName === "trace" && isIE) {
return traceForIE;
} else if (console[methodName] !== void 0) {
return bindMethod(console, methodName);
} else if (console.log !== void 0) {
return bindMethod(console, "log");
} else {
return noop3;
}
}
function replaceLoggingMethods(level, loggerName) {
for (var i = 0; i < logMethods.length; i++) {
var methodName = logMethods[i];
this[methodName] = i < level ? noop3 : this.methodFactory(methodName, level, loggerName);
}
this.log = this.debug;
}
function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {
return function() {
if (typeof console !== undefinedType) {
replaceLoggingMethods.call(this, level, loggerName);
this[methodName].apply(this, arguments);
}
};
}
function defaultMethodFactory(methodName, level, loggerName) {
return realMethod(methodName) || enableLoggingWhenConsoleArrives.apply(this, arguments);
}
function Logger(name, defaultLevel, factory) {
var self2 = this;
var currentLevel;
defaultLevel = defaultLevel == null ? "WARN" : defaultLevel;
var storageKey = "loglevel";
if (typeof name === "string") {
storageKey += ":" + name;
} else if (typeof name === "symbol") {
storageKey = void 0;
}
function persistLevelIfPossible(levelNum) {
var levelName = (logMethods[levelNum] || "silent").toUpperCase();
if (typeof window === undefinedType || !storageKey)
return;
try {
window.localStorage[storageKey] = levelName;
return;
} catch (ignore) {
}
try {
window.document.cookie = encodeURIComponent(storageKey) + "=" + levelName + ";";
} catch (ignore) {
}
}
function getPersistedLevel() {
var storedLevel;
if (typeof window === undefinedType || !storageKey)
return;
try {
storedLevel = window.localStorage[storageKey];
} catch (ignore) {
}
if (typeof storedLevel === undefinedType) {
try {
var cookie = window.document.cookie;
var location = cookie.indexOf(encodeURIComponent(storageKey) + "=");
if (location !== -1) {
storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];
}
} catch (ignore) {
}
}
if (self2.levels[storedLevel] === void 0) {
storedLevel = void 0;
}
return storedLevel;
}
function clearPersistedLevel() {
if (typeof window === undefinedType || !storageKey)
return;
try {
window.localStorage.removeItem(storageKey);
return;
} catch (ignore) {
}
try {
window.document.cookie = encodeURIComponent(storageKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC";
} catch (ignore) {
}
}
self2.name = name;
self2.levels = {
"TRACE": 0,
"DEBUG": 1,
"INFO": 2,
"WARN": 3,
"ERROR": 4,
"SILENT": 5
};
self2.methodFactory = factory || defaultMethodFactory;
self2.getLevel = function() {
return currentLevel;
};
self2.setLevel = function(level, persist) {
if (typeof level === "string" && self2.levels[level.toUpperCase()] !== void 0) {
level = self2.levels[level.toUpperCase()];
}
if (typeof level === "number" && level >= 0 && level <= self2.levels.SILENT) {
currentLevel = level;
if (persist !== false) {
persistLevelIfPossible(level);
}
replaceLoggingMethods.call(self2, level, name);
if (typeof console === undefinedType && level < self2.levels.SILENT) {
return "No console available for logging";
}
} else {
throw "log.setLevel() called with invalid level: " + level;
}
};
self2.setDefaultLevel = function(level) {
defaultLevel = level;
if (!getPersistedLevel()) {
self2.setLevel(level, false);
}
};
self2.resetLevel = function() {
self2.setLevel(defaultLevel, false);
clearPersistedLevel();
};
self2.enableAll = function(persist) {
self2.setLevel(self2.levels.TRACE, persist);
};
self2.disableAll = function(persist) {
self2.setLevel(self2.levels.SILENT, persist);
};
var initialLevel = getPersistedLevel();
if (initialLevel == null) {
initialLevel = defaultLevel;
}
self2.setLevel(initialLevel, false);
}
var defaultLogger = new Logger();
var _loggersByName = {};
defaultLogger.getLogger = function getLogger(name) {
if (typeof name !== "symbol" && typeof name !== "string" || name === "") {
throw new TypeError("You must supply a name when creating a logger.");
}
var logger = _loggersByName[name];
if (!logger) {
logger = _loggersByName[name] = new Logger(name, defaultLogger.getLevel(), defaultLogger.methodFactory);
}
return logger;
};
var _log = typeof window !== undefinedType ? window.log : void 0;
defaultLogger.noConflict = function() {
if (typeof window !== undefinedType && window.log === defaultLogger) {
window.log = _log;
}
return defaultLogger;
};
defaultLogger.getLoggers = function getLoggers() {
return _loggersByName;
};
defaultLogger["default"] = defaultLogger;
return defaultLogger;
});
}
});
// node_modules/graphology/dist/graphology.umd.min.js
var require_graphology_umd_min = __commonJS({
"node_modules/graphology/dist/graphology.umd.min.js"(exports, module2) {
!function(t, e) {
typeof exports == "object" && typeof module2 != "undefined" ? module2.exports = e() : typeof define == "function" && define.amd ? define(e) : (t = typeof globalThis != "undefined" ? globalThis : t || self).graphology = e();
}(exports, function() {
"use strict";
function t(e3) {
return t = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(t2) {
return typeof t2;
} : function(t2) {
return t2 && typeof Symbol == "function" && t2.constructor === Symbol && t2 !== Symbol.prototype ? "symbol" : typeof t2;
}, t(e3);
}
function e(t2, e3) {
t2.prototype = Object.create(e3.prototype), t2.prototype.constructor = t2, r(t2, e3);
}
function n(t2) {
return n = Object.setPrototypeOf ? Object.getPrototypeOf : function(t3) {
return t3.__proto__ || Object.getPrototypeOf(t3);
}, n(t2);
}
function r(t2, e3) {
return r = Object.setPrototypeOf || function(t3, e4) {
return t3.__proto__ = e4, t3;
}, r(t2, e3);
}
function i() {
if (typeof Reflect == "undefined" || !Reflect.construct)
return false;
if (Reflect.construct.sham)
return false;
if (typeof Proxy == "function")
return true;
try {
return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
})), true;
} catch (t2) {
return false;
}
}
function o(t2, e3, n2) {
return o = i() ? Reflect.construct : function(t3, e4, n3) {
var i2 = [null];
i2.push.apply(i2, e4);
var o2 = new (Function.bind.apply(t3, i2))();
return n3 && r(o2, n3.prototype), o2;
}, o.apply(null, arguments);
}
function a2(t2) {
var e3 = typeof Map == "function" ? /* @__PURE__ */ new Map() : void 0;
return a2 = function(t3) {
if (t3 === null || (i2 = t3, Function.toString.call(i2).indexOf("[native code]") === -1))
return t3;
var i2;
if (typeof t3 != "function")
throw new TypeError("Super expression must either be null or a function");
if (e3 !== void 0) {
if (e3.has(t3))
return e3.get(t3);
e3.set(t3, a3);
}
function a3() {
return o(t3, arguments, n(this).constructor);
}
return a3.prototype = Object.create(t3.prototype, { constructor: { value: a3, enumerable: false, writable: true, configurable: true } }), r(a3, t3);
}, a2(t2);
}
function u(t2) {
if (t2 === void 0)
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
return t2;
}
var c3 = function() {
for (var t2 = arguments[0], e3 = 1, n2 = arguments.length; e3 < n2; e3++)
if (arguments[e3])
for (var r2 in arguments[e3])
t2[r2] = arguments[e3][r2];
return t2;
};
function d(t2, e3, n2, r2) {
var i2 = t2._nodes.get(e3), o2 = null;
return i2 ? o2 = r2 === "mixed" ? i2.out && i2.out[n2] || i2.undirected && i2.undirected[n2] : r2 === "directed" ? i2.out && i2.out[n2] : i2.undirected && i2.undirected[n2] : o2;
}
function s(e3) {
return e3 !== null && t(e3) === "object" && typeof e3.addUndirectedEdgeWithKey == "function" && typeof e3.dropNode == "function";
}
function h(e3) {
return t(e3) === "object" && e3 !== null && e3.constructor === Object;
}
function f(t2) {
var e3;
for (e3 in t2)
return false;
return true;
}
function p(t2, e3, n2) {
Object.defineProperty(t2, e3, { enumerable: false, configurable: false, writable: true, value: n2 });
}
function l(t2, e3, n2) {
var r2 = { enumerable: true, configurable: true };
typeof n2 == "function" ? r2.get = n2 : (r2.value = n2, r2.writable = false), Object.defineProperty(t2, e3, r2);
}
function g(t2) {
return !!h(t2) && !(t2.attributes && !Array.isArray(t2.attributes));
}
typeof Object.assign == "function" && (c3 = Object.assign);
var y4, v = { exports: {} }, b = typeof Reflect == "object" ? Reflect : null, w = b && typeof b.apply == "function" ? b.apply : function(t2, e3, n2) {
return Function.prototype.apply.call(t2, e3, n2);
};
y4 = b && typeof b.ownKeys == "function" ? b.ownKeys : Object.getOwnPropertySymbols ? function(t2) {
return Object.getOwnPropertyNames(t2).concat(Object.getOwnPropertySymbols(t2));
} : function(t2) {
return Object.getOwnPropertyNames(t2);
};
var m2 = Number.isNaN || function(t2) {
return t2 != t2;
};
function _() {
_.init.call(this);
}
v.exports = _, v.exports.once = function(t2, e3) {
return new Promise(function(n2, r2) {
function i2(n3) {
t2.removeListener(e3, o2), r2(n3);
}
function o2() {
typeof t2.removeListener == "function" && t2.removeListener("error", i2), n2([].slice.call(arguments));
}
U(t2, e3, o2, { once: true }), e3 !== "error" && function(t3, e4, n3) {
typeof t3.on == "function" && U(t3, "error", e4, n3);
}(t2, i2, { once: true });
});
}, _.EventEmitter = _, _.prototype._events = void 0, _.prototype._eventsCount = 0, _.prototype._maxListeners = void 0;
var k = 10;
function G(t2) {
if (typeof t2 != "function")
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof t2);
}
function x4(t2) {
return t2._maxListeners === void 0 ? _.defaultMaxListeners : t2._maxListeners;
}
function E2(t2, e3, n2, r2) {
var i2, o2, a3, u2;
if (G(n2), (o2 = t2._events) === void 0 ? (o2 = t2._events = /* @__PURE__ */ Object.create(null), t2._eventsCount = 0) : (o2.newListener !== void 0 && (t2.emit("newListener", e3, n2.listener ? n2.listener : n2), o2 = t2._events), a3 = o2[e3]), a3 === void 0)
a3 = o2[e3] = n2, ++t2._eventsCount;
else if (typeof a3 == "function" ? a3 = o2[e3] = r2 ? [n2, a3] : [a3, n2] : r2 ? a3.unshift(n2) : a3.push(n2), (i2 = x4(t2)) > 0 && a3.length > i2 && !a3.warned) {
a3.warned = true;
var c4 = new Error("Possible EventEmitter memory leak detected. " + a3.length + " " + String(e3) + " listeners added. Use emitter.setMaxListeners() to increase limit");
c4.name = "MaxListenersExceededWarning", c4.emitter = t2, c4.type = e3, c4.count = a3.length, u2 = c4, console && console.warn && console.warn(u2);
}
return t2;
}
function S() {
if (!this.fired)
return this.target.removeListener(this.type, this.wrapFn), this.fired = true, arguments.length === 0 ? this.listener.call(this.target) : this.listener.apply(this.target, arguments);
}
function A2(t2, e3, n2) {
var r2 = { fired: false, wrapFn: void 0, target: t2, type: e3, listener: n2 }, i2 = S.bind(r2);
return i2.listener = n2, r2.wrapFn = i2, i2;
}
function L(t2, e3, n2) {
var r2 = t2._events;
if (r2 === void 0)
return [];
var i2 = r2[e3];
return i2 === void 0 ? [] : typeof i2 == "function" ? n2 ? [i2.listener || i2] : [i2] : n2 ? function(t3) {
for (var e4 = new Array(t3.length), n3 = 0; n3 < e4.length; ++n3)
e4[n3] = t3[n3].listener || t3[n3];
return e4;
}(i2) : N(i2, i2.length);
}
function D2(t2) {
var e3 = this._events;
if (e3 !== void 0) {
var n2 = e3[t2];
if (typeof n2 == "function")
return 1;
if (n2 !== void 0)
return n2.length;
}
return 0;
}
function N(t2, e3) {
for (var n2 = new Array(e3), r2 = 0; r2 < e3; ++r2)
n2[r2] = t2[r2];
return n2;
}
function U(t2, e3, n2, r2) {
if (typeof t2.on == "function")
r2.once ? t2.once(e3, n2) : t2.on(e3, n2);
else {
if (typeof t2.addEventListener != "function")
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof t2);
t2.addEventListener(e3, function i2(o2) {
r2.once && t2.removeEventListener(e3, i2), n2(o2);
});
}
}
function j(t2) {
if (typeof t2 != "function")
throw new Error("obliterator/iterator: expecting a function!");
this.next = t2;
}
Object.defineProperty(_, "defaultMaxListeners", { enumerable: true, get: function() {
return k;
}, set: function(t2) {
if (typeof t2 != "number" || t2 < 0 || m2(t2))
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + t2 + ".");
k = t2;
} }), _.init = function() {
this._events !== void 0 && this._events !== Object.getPrototypeOf(this)._events || (this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;
}, _.prototype.setMaxListeners = function(t2) {
if (typeof t2 != "number" || t2 < 0 || m2(t2))
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + t2 + ".");
return this._maxListeners = t2, this;
}, _.prototype.getMaxListeners = function() {
return x4(this);
}, _.prototype.emit = function(t2) {
for (var e3 = [], n2 = 1; n2 < arguments.length; n2++)
e3.push(arguments[n2]);
var r2 = t2 === "error", i2 = this._events;
if (i2 !== void 0)
r2 = r2 && i2.error === void 0;
else if (!r2)
return false;
if (r2) {
var o2;
if (e3.length > 0 && (o2 = e3[0]), o2 instanceof Error)
throw o2;
var a3 = new Error("Unhandled error." + (o2 ? " (" + o2.message + ")" : ""));
throw a3.context = o2, a3;
}
var u2 = i2[t2];
if (u2 === void 0)
return false;
if (typeof u2 == "function")
w(u2, this, e3);
else {
var c4 = u2.length, d2 = N(u2, c4);
for (n2 = 0; n2 < c4; ++n2)
w(d2[n2], this, e3);
}
return true;
}, _.prototype.addListener = function(t2, e3) {
return E2(this, t2, e3, false);
}, _.prototype.on = _.prototype.addListener, _.prototype.prependListener = function(t2, e3) {
return E2(this, t2, e3, true);
}, _.prototype.once = function(t2, e3) {
return G(e3), this.on(t2, A2(this, t2, e3)), this;
}, _.prototype.prependOnceListener = function(t2, e3) {
return G(e3), this.prependListener(t2, A2(this, t2, e3)), this;
}, _.prototype.removeListener = function(t2, e3) {
var n2, r2, i2, o2, a3;
if (G(e3), (r2 = this._events) === void 0)
return this;
if ((n2 = r2[t2]) === void 0)
return this;
if (n2 === e3 || n2.listener === e3)
--this._eventsCount == 0 ? this._events = /* @__PURE__ */ Object.create(null) : (delete r2[t2], r2.removeListener && this.emit("removeListener", t2, n2.listener || e3));
else if (typeof n2 != "function") {
for (i2 = -1, o2 = n2.length - 1; o2 >= 0; o2--)
if (n2[o2] === e3 || n2[o2].listener === e3) {
a3 = n2[o2].listener, i2 = o2;
break;
}
if (i2 < 0)
return this;
i2 === 0 ? n2.shift() : function(t3, e4) {
for (; e4 + 1 < t3.length; e4++)
t3[e4] = t3[e4 + 1];
t3.pop();
}(n2, i2), n2.length === 1 && (r2[t2] = n2[0]), r2.removeListener !== void 0 && this.emit("removeListener", t2, a3 || e3);
}
return this;
}, _.prototype.off = _.prototype.removeListener, _.prototype.removeAllListeners = function(t2) {
var e3, n2, r2;
if ((n2 = this._events) === void 0)
return this;
if (n2.removeListener === void 0)
return arguments.length === 0 ? (this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0) : n2[t2] !== void 0 && (--this._eventsCount == 0 ? this._events = /* @__PURE__ */ Object.create(null) : delete n2[t2]), this;
if (arguments.length === 0) {
var i2, o2 = Object.keys(n2);
for (r2 = 0; r2 < o2.length; ++r2)
(i2 = o2[r2]) !== "removeListener" && this.removeAllListeners(i2);
return this.removeAllListeners("removeListener"), this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0, this;
}
if (typeof (e3 = n2[t2]) == "function")
this.removeListener(t2, e3);
else if (e3 !== void 0)
for (r2 = e3.length - 1; r2 >= 0; r2--)
this.removeListener(t2, e3[r2]);
return this;
}, _.prototype.listeners = function(t2) {
return L(this, t2, true);
}, _.prototype.rawListeners = function(t2) {
return L(this, t2, false);
}, _.listenerCount = function(t2, e3) {
return typeof t2.listenerCount == "function" ? t2.listenerCount(e3) : D2.call(t2, e3);
}, _.prototype.listenerCount = D2, _.prototype.eventNames = function() {
return this._eventsCount > 0 ? y4(this._events) : [];
}, typeof Symbol != "undefined" && (j.prototype[Symbol.iterator] = function() {
return this;
}), j.of = function() {
var t2 = arguments, e3 = t2.length, n2 = 0;
return new j(function() {
return n2 >= e3 ? { done: true } : { done: false, value: t2[n2++] };
});
}, j.empty = function() {
return new j(function() {
return { done: true };
});
}, j.fromSequence = function(t2) {
var e3 = 0, n2 = t2.length;
return new j(function() {
return e3 >= n2 ? { done: true } : { done: false, value: t2[e3++] };
});
}, j.is = function(t2) {
return t2 instanceof j || typeof t2 == "object" && t2 !== null && typeof t2.next == "function";
};
var O = j, C2 = {};
C2.ARRAY_BUFFER_SUPPORT = typeof ArrayBuffer != "undefined", C2.SYMBOL_SUPPORT = typeof Symbol != "undefined";
var z = O, M = C2, P = M.ARRAY_BUFFER_SUPPORT, T = M.SYMBOL_SUPPORT;
var R = function(t2) {
var e3 = function(t3) {
return typeof t3 == "string" || Array.isArray(t3) || P && ArrayBuffer.isView(t3) ? z.fromSequence(t3) : typeof t3 != "object" || t3 === null ? null : T && typeof t3[Symbol.iterator] == "function" ? t3[Symbol.iterator]() : typeof t3.next == "function" ? t3 : null;
}(t2);
if (!e3)
throw new Error("obliterator: target is not iterable nor a valid iterator.");
return e3;
}, W = R, K = function(t2, e3) {
for (var n2, r2 = arguments.length > 1 ? e3 : 1 / 0, i2 = r2 !== 1 / 0 ? new Array(r2) : [], o2 = 0, a3 = W(t2); ; ) {
if (o2 === r2)
return i2;
if ((n2 = a3.next()).done)
return o2 !== e3 && (i2.length = o2), i2;
i2[o2++] = n2.value;
}
}, I = function(t2) {
function n2(e3) {
var n3;
return (n3 = t2.call(this) || this).name = "GraphError", n3.message = e3, n3;
}
return e(n2, t2), n2;
}(a2(Error)), F = function(t2) {
function n2(e3) {
var r2;
return (r2 = t2.call(this, e3) || this).name = "InvalidArgumentsGraphError", typeof Error.captureStackTrace == "function" && Error.captureStackTrace(u(r2), n2.prototype.constructor), r2;
}
return e(n2, t2), n2;
}(I), Y2 = function(t2) {
function n2(e3) {
var r2;
return (r2 = t2.call(this, e3) || this).name = "NotFoundGraphError", typeof Error.captureStackTrace == "function" && Error.captureStackTrace(u(r2), n2.prototype.constructor), r2;
}
return e(n2, t2), n2;
}(I), B2 = function(t2) {
function n2(e3) {
var r2;
return (r2 = t2.call(this, e3) || this).name = "UsageGraphError", typeof Error.captureStackTrace == "function" && Error.captureStackTrace(u(r2), n2.prototype.constructor), r2;
}
return e(n2, t2), n2;
}(I);
function q(t2, e3) {
this.key = t2, this.attributes = e3, this.clear();
}
function J(t2, e3) {
this.key = t2, this.attributes = e3, this.clear();
}
function V(t2, e3) {
this.key = t2, this.attributes = e3, this.clear();
}
function H(t2, e3, n2, r2, i2) {
this.key = e3, this.attributes = i2, this.undirected = t2, this.source = n2, this.target = r2;
}
function Q(t2, e3, n2, r2, i2, o2, a3) {
var u2, c4, d2 = "out", s2 = "in";
if (e3 && (d2 = s2 = "undirected"), t2.multi) {
if ((c4 = (u2 = o2[d2])[i2]) === void 0 && (c4 = /* @__PURE__ */ new Set(), u2[i2] = c4), c4.add(n2), r2 === i2 && e3)
return;
(u2 = a3[s2])[r2] === void 0 && (u2[r2] = c4);
} else {
if (o2[d2][i2] = n2, r2 === i2 && e3)
return;
a3[s2][r2] = n2;
}
}
function X2(t2, e3, n2) {
var r2 = t2.multi, i2 = n2.source, o2 = n2.target, a3 = i2.key, u2 = o2.key, c4 = i2[e3 ? "undirected" : "out"], d2 = e3 ? "undirected" : "in";
if (u2 in c4)
if (r2) {
var s2 = c4[u2];
s2.size === 1 ? (delete c4[u2], delete o2[d2][a3]) : s2.delete(n2);
} else
delete c4[u2];
r2 || delete o2[d2][a3];
}
q.prototype.clear = function() {
this.inDegree = 0, this.outDegree = 0, this.undirectedDegree = 0, this.directedSelfLoops = 0, this.undirectedSelfLoops = 0, this.in = {}, this.out = {}, this.undirected = {};
}, J.prototype.clear = function() {
this.inDegree = 0, this.outDegree = 0, this.directedSelfLoops = 0, this.in = {}, this.out = {};
}, J.prototype.upgradeToMixed = function() {
this.undirectedDegree = 0, this.undirectedSelfLoops = 0, this.undirected = {};
}, V.prototype.clear = function() {
this.undirectedDegree = 0, this.undirectedSelfLoops = 0, this.undirected = {};
}, V.prototype.upgradeToMixed = function() {
this.inDegree = 0, this.outDegree = 0, this.directedSelfLoops = 0, this.in = {}, this.out = {};
};
function Z(t2, e3, n2, r2, i2, o2, a3) {
var u2, c4, d2, s2;
if (r2 = "" + r2, n2 === 0) {
if (!(u2 = t2._nodes.get(r2)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(r2, '" node in the graph.'));
d2 = i2, s2 = o2;
} else if (n2 === 3) {
if (i2 = "" + i2, !(c4 = t2._edges.get(i2)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(i2, '" edge in the graph.'));
var h2 = c4.source.key, f2 = c4.target.key;
if (r2 === h2)
u2 = c4.target;
else {
if (r2 !== f2)
throw new Y2("Graph.".concat(e3, ': the "').concat(r2, '" node is not attached to the "').concat(i2, '" edge (').concat(h2, ", ").concat(f2, ")."));
u2 = c4.source;
}
d2 = o2, s2 = a3;
} else {
if (!(c4 = t2._edges.get(r2)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(r2, '" edge in the graph.'));
u2 = n2 === 1 ? c4.source : c4.target, d2 = i2, s2 = o2;
}
return [u2, d2, s2];
}
var $ = [{ name: function(t2) {
return "get".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2) {
var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1];
return a3.attributes[u2];
};
} }, { name: function(t2) {
return "get".concat(t2, "Attributes");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2) {
return Z(this, e3, n2, t3, r2)[0].attributes;
};
} }, { name: function(t2) {
return "has".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2) {
var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1];
return a3.attributes.hasOwnProperty(u2);
};
} }, { name: function(t2) {
return "set".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2, o2) {
var a3 = Z(this, e3, n2, t3, r2, i2, o2), u2 = a3[0], c4 = a3[1], d2 = a3[2];
return u2.attributes[c4] = d2, this.emit("nodeAttributesUpdated", { key: u2.key, type: "set", attributes: u2.attributes, name: c4 }), this;
};
} }, { name: function(t2) {
return "update".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2, o2) {
var a3 = Z(this, e3, n2, t3, r2, i2, o2), u2 = a3[0], c4 = a3[1], d2 = a3[2];
if (typeof d2 != "function")
throw new F("Graph.".concat(e3, ": updater should be a function."));
var s2 = u2.attributes, h2 = d2(s2[c4]);
return s2[c4] = h2, this.emit("nodeAttributesUpdated", { key: u2.key, type: "set", attributes: u2.attributes, name: c4 }), this;
};
} }, { name: function(t2) {
return "remove".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2) {
var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1];
return delete a3.attributes[u2], this.emit("nodeAttributesUpdated", { key: a3.key, type: "remove", attributes: a3.attributes, name: u2 }), this;
};
} }, { name: function(t2) {
return "replace".concat(t2, "Attributes");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2) {
var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1];
if (!h(u2))
throw new F("Graph.".concat(e3, ": provided attributes are not a plain object."));
return a3.attributes = u2, this.emit("nodeAttributesUpdated", { key: a3.key, type: "replace", attributes: a3.attributes }), this;
};
} }, { name: function(t2) {
return "merge".concat(t2, "Attributes");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2) {
var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1];
if (!h(u2))
throw new F("Graph.".concat(e3, ": provided attributes are not a plain object."));
return c3(a3.attributes, u2), this.emit("nodeAttributesUpdated", { key: a3.key, type: "merge", attributes: a3.attributes, data: u2 }), this;
};
} }, { name: function(t2) {
return "update".concat(t2, "Attributes");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2) {
var o2 = Z(this, e3, n2, t3, r2, i2), a3 = o2[0], u2 = o2[1];
if (typeof u2 != "function")
throw new F("Graph.".concat(e3, ": provided updater is not a function."));
return a3.attributes = u2(a3.attributes), this.emit("nodeAttributesUpdated", { key: a3.key, type: "update", attributes: a3.attributes }), this;
};
} }];
var tt = [{ name: function(t2) {
return "get".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2) {
var i2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 2) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var o2 = "" + t3, a3 = "" + r2;
if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").'));
} else if (t3 = "" + t3, !(i2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return i2.attributes[r2];
};
} }, { name: function(t2) {
return "get".concat(t2, "Attributes");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3) {
var r2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 1) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var i2 = "" + t3, o2 = "" + arguments[1];
if (!(r2 = d(this, i2, o2, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(i2, '" - "').concat(o2, '").'));
} else if (t3 = "" + t3, !(r2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (n2 !== "mixed" && r2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return r2.attributes;
};
} }, { name: function(t2) {
return "has".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2) {
var i2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 2) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var o2 = "" + t3, a3 = "" + r2;
if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").'));
} else if (t3 = "" + t3, !(i2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return i2.attributes.hasOwnProperty(r2);
};
} }, { name: function(t2) {
return "set".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2) {
var o2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 3) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var a3 = "" + t3, u2 = "" + r2;
if (r2 = arguments[2], i2 = arguments[3], !(o2 = d(this, a3, u2, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(a3, '" - "').concat(u2, '").'));
} else if (t3 = "" + t3, !(o2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (n2 !== "mixed" && o2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return o2.attributes[r2] = i2, this.emit("edgeAttributesUpdated", { key: o2.key, type: "set", attributes: o2.attributes, name: r2 }), this;
};
} }, { name: function(t2) {
return "update".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2, i2) {
var o2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 3) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var a3 = "" + t3, u2 = "" + r2;
if (r2 = arguments[2], i2 = arguments[3], !(o2 = d(this, a3, u2, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(a3, '" - "').concat(u2, '").'));
} else if (t3 = "" + t3, !(o2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (typeof i2 != "function")
throw new F("Graph.".concat(e3, ": updater should be a function."));
if (n2 !== "mixed" && o2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return o2.attributes[r2] = i2(o2.attributes[r2]), this.emit("edgeAttributesUpdated", { key: o2.key, type: "set", attributes: o2.attributes, name: r2 }), this;
};
} }, { name: function(t2) {
return "remove".concat(t2, "Attribute");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2) {
var i2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 2) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var o2 = "" + t3, a3 = "" + r2;
if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").'));
} else if (t3 = "" + t3, !(i2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return delete i2.attributes[r2], this.emit("edgeAttributesUpdated", { key: i2.key, type: "remove", attributes: i2.attributes, name: r2 }), this;
};
} }, { name: function(t2) {
return "replace".concat(t2, "Attributes");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2) {
var i2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 2) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var o2 = "" + t3, a3 = "" + r2;
if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").'));
} else if (t3 = "" + t3, !(i2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (!h(r2))
throw new F("Graph.".concat(e3, ": provided attributes are not a plain object."));
if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return i2.attributes = r2, this.emit("edgeAttributesUpdated", { key: i2.key, type: "replace", attributes: i2.attributes }), this;
};
} }, { name: function(t2) {
return "merge".concat(t2, "Attributes");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2) {
var i2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 2) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var o2 = "" + t3, a3 = "" + r2;
if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").'));
} else if (t3 = "" + t3, !(i2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (!h(r2))
throw new F("Graph.".concat(e3, ": provided attributes are not a plain object."));
if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return c3(i2.attributes, r2), this.emit("edgeAttributesUpdated", { key: i2.key, type: "merge", attributes: i2.attributes, data: r2 }), this;
};
} }, { name: function(t2) {
return "update".concat(t2, "Attributes");
}, attacher: function(t2, e3, n2) {
t2.prototype[e3] = function(t3, r2) {
var i2;
if (this.type !== "mixed" && n2 !== "mixed" && n2 !== this.type)
throw new B2("Graph.".concat(e3, ": cannot find this type of edges in your ").concat(this.type, " graph."));
if (arguments.length > 2) {
if (this.multi)
throw new B2("Graph.".concat(e3, ": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about."));
var o2 = "" + t3, a3 = "" + r2;
if (r2 = arguments[2], !(i2 = d(this, o2, a3, n2)))
throw new Y2("Graph.".concat(e3, ': could not find an edge for the given path ("').concat(o2, '" - "').concat(a3, '").'));
} else if (t3 = "" + t3, !(i2 = this._edges.get(t3)))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" edge in the graph.'));
if (typeof r2 != "function")
throw new F("Graph.".concat(e3, ": provided updater is not a function."));
if (n2 !== "mixed" && i2.undirected !== (n2 === "undirected"))
throw new Y2("Graph.".concat(e3, ': could not find the "').concat(t3, '" ').concat(n2, " edge in the graph."));
return i2.attributes = r2(i2.attributes), this.emit("edgeAttributesUpdated", { key: i2.key, type: "update", attributes: i2.attributes }), this;
};
} }];
var et = O, nt = R, rt = function() {
var t2, e3 = arguments, n2 = -1;
return new et(function r2() {
if (!t2) {
if (++n2 >= e3.length)
return { done: true };
t2 = nt(e3[n2]);
}
var i2 = t2.next();
return i2.done ? (t2 = null, r2()) : i2;
});
}, it = [{ name: "edges", type: "mixed" }, { name: "inEdges", type: "directed", direction: "in" }, { name: "outEdges", type: "directed", direction: "out" }, { name: "inboundEdges", type: "mixed", direction: "in" }, { name: "outboundEdges", type: "mixed", direction: "out" }, { name: "directedEdges", type: "directed" }, { name: "undirectedEdges", type: "undirected" }];
function ot(t2, e3) {
for (var n2 in e3)
t2.push(e3[n2].key);
}
function at(t2, e3) {
for (var n2 in e3)
e3[n2].forEach(function(e4) {
return t2.push(e4.key);
});
}
function ut(t2, e3, n2) {
for (var r2 in t2)
if (r2 !== n2) {
var i2 = t2[r2];
e3(i2.key, i2.attributes, i2.source.key, i2.target.key, i2.source.attributes, i2.target.attributes, i2.undirected);
}
}
function ct(t2, e3, n2) {
for (var r2 in t2)
r2 !== n2 && t2[r2].forEach(function(t3) {
return e3(t3.key, t3.attributes, t3.source.key, t3.target.key, t3.source.attributes, t3.target.attributes, t3.undirected);
});
}
function dt(t2, e3, n2) {
for (var r2 in t2)
if (r2 !== n2) {
var i2 = t2[r2];
if (e3(i2.key, i2.attributes, i2.source.key, i2.target.key, i2.source.attributes, i2.target.attributes, i2.undirected))
return i2.key;
}
}
function st(t2, e3, n2) {
var r2, i2, o2, a3, u2;
for (var c4 in t2)
if (c4 !== n2) {
for (r2 = t2[c4].values(); (i2 = r2.next()).done !== true; )
if (a3 = (o2 = i2.value).source, u2 = o2.target, e3(o2.key, o2.attributes, a3.key, u2.key, a3.attributes, u2.attributes, o2.undirected))
return o2.key;
}
}
function ht(t2, e3) {
var n2 = Object.keys(t2), r2 = n2.length, i2 = null, o2 = 0;
return new O(function a3() {
var u2;
if (i2) {
var c4 = i2.next();
if (c4.done)
return i2 = null, o2++, a3();
u2 = c4.value;
} else {
if (o2 >= r2)
return { done: true };
var d2 = n2[o2];
if (d2 === e3)
return o2++, a3();
if ((u2 = t2[d2]) instanceof Set)
return i2 = u2.values(), a3();
o2++;
}
return { done: false, value: { edge: u2.key, attributes: u2.attributes, source: u2.source.key, target: u2.target.key, sourceAttributes: u2.source.attributes, targetAttributes: u2.target.attributes, undirected: u2.undirected } };
});
}
function ft(t2, e3, n2) {
var r2 = e3[n2];
r2 && t2.push(r2.key);
}
function pt(t2, e3, n2) {
var r2 = e3[n2];
r2 && r2.forEach(function(e4) {
return t2.push(e4.key);
});
}
function lt(t2, e3, n2) {
var r2 = t2[e3];
if (r2) {
var i2 = r2.source, o2 = r2.target;
n2(r2.key, r2.attributes, i2.key, o2.key, i2.attributes, o2.attributes, r2.undirected);
}
}
function gt(t2, e3, n2) {
var r2 = t2[e3];
r2 && r2.forEach(function(t3) {
return n2(t3.key, t3.attributes, t3.source.key, t3.target.key, t3.source.attributes, t3.target.attributes, t3.undirected);
});
}
function yt(t2, e3, n2) {
var r2 = t2[e3];
if (r2) {
var i2 = r2.source, o2 = r2.target;
return n2(r2.key, r2.attributes, i2.key, o2.key, i2.attributes, o2.attributes, r2.undirected) ? r2.key : void 0;
}
}
function vt(t2, e3, n2) {
var r2 = t2[e3];
if (r2) {
for (var i2, o2, a3 = r2.values(); (i2 = a3.next()).done !== true; )
if (n2((o2 = i2.value).key, o2.attributes, o2.source.key, o2.target.key, o2.source.attributes, o2.target.attributes, o2.undirected))
return o2.key;
}
}
function bt(t2, e3) {
var n2 = t2[e3];
if (n2 instanceof Set) {
var r2 = n2.values();
return new O(function() {
var t3 = r2.next();
if (t3.done)
return t3;
var e4 = t3.value;
return { done: false, value: { edge: e4.key, attributes: e4.attributes, source: e4.source.key, target: e4.target.key, sourceAttributes: e4.source.attributes, targetAttributes: e4.target.attributes, undirected: e4.undirected } };
});
}
return O.of([n2.key, n2.attributes, n2.source.key, n2.target.key, n2.source.attributes, n2.target.attributes]);
}
function wt(t2, e3) {
if (t2.size === 0)
return [];
if (e3 === "mixed" || e3 === t2.type)
return typeof Array.from == "function" ? Array.from(t2._edges.keys()) : K(t2._edges.keys(), t2._edges.size);
for (var n2, r2, i2 = e3 === "undirected" ? t2.undirectedSize : t2.directedSize, o2 = new Array(i2), a3 = e3 === "undirected", u2 = t2._edges.values(), c4 = 0; (n2 = u2.next()).done !== true; )
(r2 = n2.value).undirected === a3 && (o2[c4++] = r2.key);
return o2;
}
function mt(t2, e3, n2) {
if (t2.size !== 0) {
for (var r2, i2, o2 = e3 !== "mixed" && e3 !== t2.type, a3 = e3 === "undirected", u2 = t2._edges.values(); (r2 = u2.next()).done !== true; )
if (i2 = r2.value, !o2 || i2.undirected === a3) {
var c4 = i2, d2 = c4.key, s2 = c4.attributes, h2 = c4.source, f2 = c4.target;
n2(d2, s2, h2.key, f2.key, h2.attributes, f2.attributes, i2.undirected);
}
}
}
function _t(t2, e3, n2) {
if (t2.size !== 0) {
for (var r2, i2, o2 = e3 !== "mixed" && e3 !== t2.type, a3 = e3 === "undirected", u2 = t2._edges.values(); (r2 = u2.next()).done !== true; )
if (i2 = r2.value, !o2 || i2.undirected === a3) {
var c4 = i2, d2 = c4.key, s2 = c4.attributes, h2 = c4.source, f2 = c4.target;
if (n2(d2, s2, h2.key, f2.key, h2.attributes, f2.attributes, i2.undirected))
return d2;
}
}
}
function kt(t2, e3) {
if (t2.size === 0)
return O.empty();
var n2 = e3 !== "mixed" && e3 !== t2.type, r2 = e3 === "undirected", i2 = t2._edges.values();
return new O(function() {
for (var t3, e4; ; ) {
if ((t3 = i2.next()).done)
return t3;
if (e4 = t3.value, !n2 || e4.undirected === r2)
break;
}
return { value: { edge: e4.key, attributes: e4.attributes, source: e4.source.key, target: e4.target.key, sourceAttributes: e4.source.attributes, targetAttributes: e4.target.attributes, undirected: e4.undirected }, done: false };
});
}
function Gt(t2, e3, n2, r2) {
var i2 = [], o2 = t2 ? at : ot;
return e3 !== "undirected" && (n2 !== "out" && o2(i2, r2.in), n2 !== "in" && o2(i2, r2.out), !n2 && r2.directedSelfLoops > 0 && i2.splice(i2.lastIndexOf(r2.key), 1)), e3 !== "directed" && o2(i2, r2.undirected), i2;
}
function xt(t2, e3, n2, r2, i2) {
var o2 = t2 ? ct : ut;
e3 !== "undirected" && (n2 !== "out" && o2(r2.in, i2), n2 !== "in" && o2(r2.out, i2, n2 ? null : r2.key)), e3 !== "directed" && o2(r2.undirected, i2);
}
function Et(t2, e3, n2, r2, i2) {
var o2, a3 = t2 ? st : dt;
if (e3 !== "undirected") {
if (n2 !== "out" && (o2 = a3(r2.in, i2)))
return o2;
if (n2 !== "in" && (o2 = a3(r2.out, i2, n2 ? null : r2.key)))
return o2;
}
if (e3 !== "directed" && (o2 = a3(r2.undirected, i2)))
return o2;
}
function St(t2, e3, n2) {
var r2 = O.empty();
return t2 !== "undirected" && (e3 !== "out" && n2.in !== void 0 && (r2 = rt(r2, ht(n2.in))), e3 !== "in" && n2.out !== void 0 && (r2 = rt(r2, ht(n2.out, e3 ? null : n2.key)))), t2 !== "directed" && n2.undirected !== void 0 && (r2 = rt(r2, ht(n2.undirected))), r2;
}
function At(t2, e3, n2, r2, i2) {
var o2 = e3 ? pt : ft, a3 = [];
return t2 !== "undirected" && (r2.in !== void 0 && n2 !== "out" && o2(a3, r2.in, i2), r2.out !== void 0 && n2 !== "in" && o2(a3, r2.out, i2), !n2 && r2.directedSelfLoops > 0 && a3.splice(a3.lastIndexOf(r2.key), 1)), t2 !== "directed" && r2.undirected !== void 0 && o2(a3, r2.undirected, i2), a3;
}
function Lt(t2, e3, n2, r2, i2, o2) {
var a3 = e3 ? gt : lt;
t2 !== "undirected" && (r2.in !== void 0 && n2 !== "out" && a3(r2.in, i2, o2), r2.key !== i2 && r2.out !== void 0 && n2 !== "in" && a3(r2.out, i2, o2)), t2 !== "directed" && r2.undirected !== void 0 && a3(r2.undirected, i2, o2);
}
function Dt(t2, e3, n2, r2, i2, o2) {
var a3, u2 = e3 ? vt : yt;
if (t2 !== "undirected") {
if (r2.in !== void 0 && n2 !== "out" && (a3 = u2(r2.in, i2, o2)))
return a3;
if (r2.key !== i2 && r2.out !== void 0 && n2 !== "in" && (a3 = u2(r2.out, i2, o2, n2 ? null : r2.key)))
return a3;
}
if (t2 !== "directed" && r2.undirected !== void 0 && (a3 = u2(r2.undirected, i2, o2)))
return a3;
}
function Nt(t2, e3, n2, r2) {
var i2 = O.empty();
return t2 !== "undirected" && (n2.in !== void 0 && e3 !== "out" && r2 in n2.in && (i2 = rt(i2, bt(n2.in, r2))), n2.out !== void 0 && e3 !== "in" && r2 in n2.out && (i2 = rt(i2, bt(n2.out, r2)))), t2 !== "directed" && n2.undirected !== void 0 && r2 in n2.undirected && (i2 = rt(i2, bt(n2.undirected, r2))), i2;
}
var Ut = [{ name: "neighbors", type: "mixed" }, { name: "inNeighbors", type: "directed", direction: "in" }, { name: "outNeighbors", type: "directed", direction: "out" }, { name: "inboundNeighbors", type: "mixed", direction: "in" }, { name: "outboundNeighbors", type: "mixed", direction: "out" }, { name: "directedNeighbors", type: "directed" }, { name: "undirectedNeighbors", type: "undirected" }];
function jt(t2, e3) {
if (e3 !== void 0)
for (var n2 in e3)
t2.add(n2);
}
function Ot(t2, e3, n2) {
for (var r2 in e3) {
var i2 = e3[r2];
i2 instanceof Set && (i2 = i2.values().next().value);
var o2 = i2.source, a3 = i2.target, u2 = o2 === t2 ? a3 : o2;
n2(u2.key, u2.attributes);
}
}
function Ct(t2, e3, n2, r2) {
for (var i2 in n2) {
var o2 = n2[i2];
o2 instanceof Set && (o2 = o2.values().next().value);
var a3 = o2.source, u2 = o2.target, c4 = a3 === e3 ? u2 : a3;
t2.has(c4.key) || (t2.add(c4.key), r2(c4.key, c4.attributes));
}
}
function zt(t2, e3, n2) {
for (var r2 in e3) {
var i2 = e3[r2];
i2 instanceof Set && (i2 = i2.values().next().value);
var o2 = i2.source, a3 = i2.target, u2 = o2 === t2 ? a3 : o2;
if (n2(u2.key, u2.attributes))
return u2.key;
}
}
function Mt(t2, e3, n2, r2) {
for (var i2 in n2) {
var o2 = n2[i2];
o2 instanceof Set && (o2 = o2.values().next().value);
var a3 = o2.source, u2 = o2.target, c4 = a3 === e3 ? u2 : a3;
if (!t2.has(c4.key)) {
if (t2.add(c4.key), r2(c4.key, c4.attributes))
return c4.key;
}
}
}
function Pt(t2, e3) {
var n2 = Object.keys(e3), r2 = n2.length, i2 = 0;
return new O(function() {
if (i2 >= r2)
return { done: true };
var o2 = e3[n2[i2++]];
o2 instanceof Set && (o2 = o2.values().next().value);
var a3 = o2.source, u2 = o2.target, c4 = a3 === t2 ? u2 : a3;
return { done: false, value: { neighbor: c4.key, attributes: c4.attributes } };
});
}
function Tt(t2, e3, n2) {
var r2 = Object.keys(n2), i2 = r2.length, o2 = 0;
return new O(function a3() {
if (o2 >= i2)
return { done: true };
var u2 = n2[r2[o2++]];
u2 instanceof Set && (u2 = u2.values().next().value);
var c4 = u2.source, d2 = u2.target, s2 = c4 === e3 ? d2 : c4;
return t2.has(s2.key) ? a3() : (t2.add(s2.key), { done: false, value: { neighbor: s2.key, attributes: s2.attributes } });
});
}
function Rt(t2, e3) {
var n2 = e3.name, r2 = e3.type, i2 = e3.direction;
t2.prototype[n2] = function(t3) {
if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type)
return [];
t3 = "" + t3;
var e4 = this._nodes.get(t3);
if (e4 === void 0)
throw new Y2("Graph.".concat(n2, ': could not find the "').concat(t3, '" node in the graph.'));
return function(t4, e6, n3) {
if (t4 !== "mixed") {
if (t4 === "undirected")
return Object.keys(n3.undirected);
if (typeof e6 == "string")
return Object.keys(n3[e6]);
}
var r3 = /* @__PURE__ */ new Set();
return t4 !== "undirected" && (e6 !== "out" && jt(r3, n3.in), e6 !== "in" && jt(r3, n3.out)), t4 !== "directed" && jt(r3, n3.undirected), K(r3.values(), r3.size);
}(r2 === "mixed" ? this.type : r2, i2, e4);
};
}
function Wt(t2, e3) {
var n2 = e3.name, r2 = e3.type, i2 = e3.direction, o2 = "forEach" + n2[0].toUpperCase() + n2.slice(1, -1);
t2.prototype[o2] = function(t3, e4) {
if (r2 === "mixed" || this.type === "mixed" || r2 === this.type) {
t3 = "" + t3;
var n3 = this._nodes.get(t3);
if (n3 === void 0)
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t3, '" node in the graph.'));
!function(t4, e6, n4, r3) {
if (t4 !== "mixed") {
if (t4 === "undirected")
return Ot(n4, n4.undirected, r3);
if (typeof e6 == "string")
return Ot(n4, n4[e6], r3);
}
var i3 = /* @__PURE__ */ new Set();
t4 !== "undirected" && (e6 !== "out" && Ct(i3, n4, n4.in, r3), e6 !== "in" && Ct(i3, n4, n4.out, r3)), t4 !== "directed" && Ct(i3, n4, n4.undirected, r3);
}(r2 === "mixed" ? this.type : r2, i2, n3, e4);
}
};
var a3 = "map" + n2[0].toUpperCase() + n2.slice(1);
t2.prototype[a3] = function(t3, e4) {
var n3 = [];
return this[o2](t3, function(t4, r3) {
n3.push(e4(t4, r3));
}), n3;
};
var u2 = "filter" + n2[0].toUpperCase() + n2.slice(1);
t2.prototype[u2] = function(t3, e4) {
var n3 = [];
return this[o2](t3, function(t4, r3) {
e4(t4, r3) && n3.push(t4);
}), n3;
};
var c4 = "reduce" + n2[0].toUpperCase() + n2.slice(1);
t2.prototype[c4] = function(t3, e4, n3) {
if (arguments.length < 3)
throw new F("Graph.".concat(c4, ": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array."));
var r3 = n3;
return this[o2](t3, function(t4, n4) {
r3 = e4(r3, t4, n4);
}), r3;
};
}
function Kt(t2, e3) {
var n2 = e3.name, r2 = e3.type, i2 = e3.direction, o2 = n2[0].toUpperCase() + n2.slice(1, -1), a3 = "find" + o2;
t2.prototype[a3] = function(t3, e4) {
if (r2 === "mixed" || this.type === "mixed" || r2 === this.type) {
t3 = "" + t3;
var n3 = this._nodes.get(t3);
if (n3 === void 0)
throw new Y2("Graph.".concat(a3, ': could not find the "').concat(t3, '" node in the graph.'));
return function(t4, e6, n4, r3) {
if (t4 !== "mixed") {
if (t4 === "undirected")
return zt(n4, n4.undirected, r3);
if (typeof e6 == "string")
return zt(n4, n4[e6], r3);
}
var i3, o3 = /* @__PURE__ */ new Set();
if (t4 !== "undirected") {
if (e6 !== "out" && (i3 = Mt(o3, n4, n4.in, r3)))
return i3;
if (e6 !== "in" && (i3 = Mt(o3, n4, n4.out, r3)))
return i3;
}
if (t4 !== "directed" && (i3 = Mt(o3, n4, n4.undirected, r3)))
return i3;
}(r2 === "mixed" ? this.type : r2, i2, n3, e4);
}
};
var u2 = "some" + o2;
t2.prototype[u2] = function(t3, e4) {
return !!this[a3](t3, e4);
};
var c4 = "every" + o2;
t2.prototype[c4] = function(t3, e4) {
return !this[a3](t3, function(t4, n3) {
return !e4(t4, n3);
});
};
}
function It(t2, e3) {
var n2 = e3.name, r2 = e3.type, i2 = e3.direction, o2 = n2.slice(0, -1) + "Entries";
t2.prototype[o2] = function(t3) {
if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type)
return O.empty();
t3 = "" + t3;
var e4 = this._nodes.get(t3);
if (e4 === void 0)
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t3, '" node in the graph.'));
return function(t4, e6, n3) {
if (t4 !== "mixed") {
if (t4 === "undirected")
return Pt(n3, n3.undirected);
if (typeof e6 == "string")
return Pt(n3, n3[e6]);
}
var r3 = O.empty(), i3 = /* @__PURE__ */ new Set();
return t4 !== "undirected" && (e6 !== "out" && (r3 = rt(r3, Tt(i3, n3, n3.in))), e6 !== "in" && (r3 = rt(r3, Tt(i3, n3, n3.out)))), t4 !== "directed" && (r3 = rt(r3, Tt(i3, n3, n3.undirected))), r3;
}(r2 === "mixed" ? this.type : r2, i2, e4);
};
}
function Ft(t2, e3, n2, r2, i2) {
for (var o2, a3, u2, c4, d2, s2, h2, f2 = r2._nodes.values(), p2 = r2.type; (o2 = f2.next()).done !== true; ) {
var l2 = false;
if (a3 = o2.value, p2 !== "undirected") {
for (u2 in c4 = a3.out)
if (s2 = (d2 = c4[u2]).target, l2 = true, h2 = i2(a3.key, s2.key, a3.attributes, s2.attributes, d2.key, d2.attributes, d2.undirected), t2 && h2)
return d2;
}
if (p2 !== "directed") {
for (u2 in c4 = a3.undirected)
if (!(e3 && a3.key > u2) && ((s2 = (d2 = c4[u2]).target).key !== u2 && (s2 = d2.source), l2 = true, h2 = i2(a3.key, s2.key, a3.attributes, s2.attributes, d2.key, d2.attributes, d2.undirected), t2 && h2))
return d2;
}
if (n2 && !l2 && (h2 = i2(a3.key, null, a3.attributes, null, null, null, null), t2 && h2))
return null;
}
}
function Yt(t2, e3, n2, r2, i2) {
for (var o2, a3, u2, c4, d2, s2, h2, f2, p2, l2 = r2._nodes.values(), g2 = r2.type; (o2 = l2.next()).done !== true; ) {
var y5 = false;
if (a3 = o2.value, g2 !== "undirected") {
for (u2 in s2 = a3.out)
for (c4 = s2[u2].values(); (d2 = c4.next()).done !== true; )
if (f2 = (h2 = d2.value).target, y5 = true, p2 = i2(a3.key, f2.key, a3.attributes, f2.attributes, h2.key, h2.attributes, h2.undirected), t2 && p2)
return h2;
}
if (g2 !== "directed") {
for (u2 in s2 = a3.undirected)
if (!(e3 && a3.key > u2)) {
for (c4 = s2[u2].values(); (d2 = c4.next()).done !== true; )
if ((f2 = (h2 = d2.value).target).key !== u2 && (f2 = h2.source), y5 = true, p2 = i2(a3.key, f2.key, a3.attributes, f2.attributes, h2.key, h2.attributes, h2.undirected), t2 && p2)
return h2;
}
}
if (n2 && !y5 && (p2 = i2(a3.key, null, a3.attributes, null, null, null, null), t2 && p2))
return null;
}
}
function Bt(t2, e3) {
var n2 = { key: t2 };
return f(e3.attributes) || (n2.attributes = c3({}, e3.attributes)), n2;
}
function qt(t2, e3) {
var n2 = { key: t2, source: e3.source.key, target: e3.target.key };
return f(e3.attributes) || (n2.attributes = c3({}, e3.attributes)), e3.undirected && (n2.undirected = true), n2;
}
function Jt(t2) {
return h(t2) ? "key" in t2 ? !("attributes" in t2) || h(t2.attributes) && t2.attributes !== null ? null : "invalid-attributes" : "no-key" : "not-object";
}
function Vt(t2) {
return h(t2) ? "source" in t2 ? "target" in t2 ? !("attributes" in t2) || h(t2.attributes) && t2.attributes !== null ? "undirected" in t2 && typeof t2.undirected != "boolean" ? "invalid-undirected" : null : "invalid-attributes" : "no-target" : "no-source" : "not-object";
}
var Ht, Qt = (Ht = 255 & Math.floor(256 * Math.random()), function() {
return Ht++;
}), Xt = /* @__PURE__ */ new Set(["directed", "undirected", "mixed"]), Zt = /* @__PURE__ */ new Set(["domain", "_events", "_eventsCount", "_maxListeners"]), $t = { allowSelfLoops: true, multi: false, type: "mixed" };
function te(t2, e3, n2) {
var r2 = new t2.NodeDataClass(e3, n2);
return t2._nodes.set(e3, r2), t2.emit("nodeAdded", { key: e3, attributes: n2 }), r2;
}
function ee(t2, e3, n2, r2, i2, o2, a3, u2) {
if (!r2 && t2.type === "undirected")
throw new B2("Graph.".concat(e3, ": you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead."));
if (r2 && t2.type === "directed")
throw new B2("Graph.".concat(e3, ": you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead."));
if (u2 && !h(u2))
throw new F("Graph.".concat(e3, ': invalid attributes. Expecting an object but got "').concat(u2, '"'));
if (o2 = "" + o2, a3 = "" + a3, u2 = u2 || {}, !t2.allowSelfLoops && o2 === a3)
throw new B2("Graph.".concat(e3, ': source & target are the same ("').concat(o2, `"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`));
var c4 = t2._nodes.get(o2), d2 = t2._nodes.get(a3);
if (!c4)
throw new Y2("Graph.".concat(e3, ': source node "').concat(o2, '" not found.'));
if (!d2)
throw new Y2("Graph.".concat(e3, ': target node "').concat(a3, '" not found.'));
var s2 = { key: null, undirected: r2, source: o2, target: a3, attributes: u2 };
if (n2)
i2 = t2._edgeKeyGenerator();
else if (i2 = "" + i2, t2._edges.has(i2))
throw new B2("Graph.".concat(e3, ': the "').concat(i2, '" edge already exists in the graph.'));
if (!t2.multi && (r2 ? c4.undirected[a3] !== void 0 : c4.out[a3] !== void 0))
throw new B2("Graph.".concat(e3, ': an edge linking "').concat(o2, '" to "').concat(a3, `" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`));
var f2 = new H(r2, i2, c4, d2, u2);
return t2._edges.set(i2, f2), o2 === a3 ? r2 ? (c4.undirectedSelfLoops++, t2._undirectedSelfLoopCount++) : (c4.directedSelfLoops++, t2._directedSelfLoopCount++) : r2 ? (c4.undirectedDegree++, d2.undirectedDegree++) : (c4.outDegree++, d2.inDegree++), Q(t2, r2, f2, o2, a3, c4, d2), r2 ? t2._undirectedSize++ : t2._directedSize++, s2.key = i2, t2.emit("edgeAdded", s2), i2;
}
function ne(t2, e3, n2, r2, i2, o2, a3, u2, d2) {
if (!r2 && t2.type === "undirected")
throw new B2("Graph.".concat(e3, ": you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead."));
if (r2 && t2.type === "directed")
throw new B2("Graph.".concat(e3, ": you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead."));
if (u2) {
if (d2) {
if (typeof u2 != "function")
throw new F("Graph.".concat(e3, ': invalid updater function. Expecting a function but got "').concat(u2, '"'));
} else if (!h(u2))
throw new F("Graph.".concat(e3, ': invalid attributes. Expecting an object but got "').concat(u2, '"'));
}
var s2;
if (o2 = "" + o2, a3 = "" + a3, d2 && (s2 = u2, u2 = void 0), !t2.allowSelfLoops && o2 === a3)
throw new B2("Graph.".concat(e3, ': source & target are the same ("').concat(o2, `"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`));
var f2, p2, l2 = t2._nodes.get(o2), g2 = t2._nodes.get(a3);
if (!n2 && (f2 = t2._edges.get(i2))) {
if (f2.source.key !== o2 || f2.target.key !== a3 || r2 && (f2.source.key !== a3 || f2.target.key !== o2))
throw new B2("Graph.".concat(e3, ': inconsistency detected when attempting to merge the "').concat(i2, '" edge with "').concat(o2, '" source & "').concat(a3, '" target vs. ("').concat(f2.source.key, '", "').concat(f2.target.key, '").'));
p2 = f2;
}
if (p2 || t2.multi || !l2 || (p2 = r2 ? l2.undirected[a3] : l2.out[a3]), p2) {
var y5 = [p2.key, false, false, false];
if (d2 ? !s2 : !u2)
return y5;
if (d2) {
var v2 = p2.attributes;
p2.attributes = s2(v2), t2.emit("edgeAttributesUpdated", { type: "replace", key: p2.key, attributes: p2.attributes });
} else
c3(p2.attributes, u2), t2.emit("edgeAttributesUpdated", { type: "merge", key: p2.key, attributes: p2.attributes, data: u2 });
return y5;
}
u2 = u2 || {}, d2 && s2 && (u2 = s2(u2));
var b2 = { key: null, undirected: r2, source: o2, target: a3, attributes: u2 };
if (n2)
i2 = t2._edgeKeyGenerator();
else if (i2 = "" + i2, t2._edges.has(i2))
throw new B2("Graph.".concat(e3, ': the "').concat(i2, '" edge already exists in the graph.'));
var w2 = false, m3 = false;
return l2 || (l2 = te(t2, o2, {}), w2 = true, o2 === a3 && (g2 = l2, m3 = true)), g2 || (g2 = te(t2, a3, {}), m3 = true), f2 = new H(r2, i2, l2, g2, u2), t2._edges.set(i2, f2), o2 === a3 ? r2 ? (l2.undirectedSelfLoops++, t2._undirectedSelfLoopCount++) : (l2.directedSelfLoops++, t2._directedSelfLoopCount++) : r2 ? (l2.undirectedDegree++, g2.undirectedDegree++) : (l2.outDegree++, g2.inDegree++), Q(t2, r2, f2, o2, a3, l2, g2), r2 ? t2._undirectedSize++ : t2._directedSize++, b2.key = i2, t2.emit("edgeAdded", b2), [i2, true, w2, m3];
}
var re2 = function(n2) {
function r2(t2) {
var e3;
if (e3 = n2.call(this) || this, typeof (t2 = c3({}, $t, t2)).multi != "boolean")
throw new F(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "`.concat(t2.multi, '".'));
if (!Xt.has(t2.type))
throw new F(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "`.concat(t2.type, '".'));
if (typeof t2.allowSelfLoops != "boolean")
throw new F(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "`.concat(t2.allowSelfLoops, '".'));
var r3 = t2.type === "mixed" ? q : t2.type === "directed" ? J : V;
p(u(e3), "NodeDataClass", r3);
var i3 = Qt(), o2 = 0;
return p(u(e3), "_attributes", {}), p(u(e3), "_nodes", /* @__PURE__ */ new Map()), p(u(e3), "_edges", /* @__PURE__ */ new Map()), p(u(e3), "_directedSize", 0), p(u(e3), "_undirectedSize", 0), p(u(e3), "_directedSelfLoopCount", 0), p(u(e3), "_undirectedSelfLoopCount", 0), p(u(e3), "_edgeKeyGenerator", function() {
var t3;
do {
t3 = "geid_" + i3 + "_" + o2++;
} while (e3._edges.has(t3));
return t3;
}), p(u(e3), "_options", t2), Zt.forEach(function(t3) {
return p(u(e3), t3, e3[t3]);
}), l(u(e3), "order", function() {
return e3._nodes.size;
}), l(u(e3), "size", function() {
return e3._edges.size;
}), l(u(e3), "directedSize", function() {
return e3._directedSize;
}), l(u(e3), "undirectedSize", function() {
return e3._undirectedSize;
}), l(u(e3), "selfLoopCount", function() {
return e3._directedSelfLoopCount + e3._undirectedSelfLoopCount;
}), l(u(e3), "directedSelfLoopCount", function() {
return e3._directedSelfLoopCount;
}), l(u(e3), "undirectedSelfLoopCount", function() {
return e3._undirectedSelfLoopCount;
}), l(u(e3), "multi", e3._options.multi), l(u(e3), "type", e3._options.type), l(u(e3), "allowSelfLoops", e3._options.allowSelfLoops), l(u(e3), "implementation", function() {
return "graphology";
}), e3;
}
e(r2, n2);
var i2 = r2.prototype;
return i2._resetInstanceCounters = function() {
this._directedSize = 0, this._undirectedSize = 0, this._directedSelfLoopCount = 0, this._undirectedSelfLoopCount = 0;
}, i2.hasNode = function(t2) {
return this._nodes.has("" + t2);
}, i2.hasDirectedEdge = function(t2, e3) {
if (this.type === "undirected")
return false;
if (arguments.length === 1) {
var n3 = "" + t2, r3 = this._edges.get(n3);
return !!r3 && !r3.undirected;
}
if (arguments.length === 2) {
t2 = "" + t2, e3 = "" + e3;
var i3 = this._nodes.get(t2);
if (!i3)
return false;
var o2 = i3.out[e3];
return !!o2 && (!this.multi || !!o2.size);
}
throw new F("Graph.hasDirectedEdge: invalid arity (".concat(arguments.length, ", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target."));
}, i2.hasUndirectedEdge = function(t2, e3) {
if (this.type === "directed")
return false;
if (arguments.length === 1) {
var n3 = "" + t2, r3 = this._edges.get(n3);
return !!r3 && r3.undirected;
}
if (arguments.length === 2) {
t2 = "" + t2, e3 = "" + e3;
var i3 = this._nodes.get(t2);
if (!i3)
return false;
var o2 = i3.undirected[e3];
return !!o2 && (!this.multi || !!o2.size);
}
throw new F("Graph.hasDirectedEdge: invalid arity (".concat(arguments.length, ", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target."));
}, i2.hasEdge = function(t2, e3) {
if (arguments.length === 1) {
var n3 = "" + t2;
return this._edges.has(n3);
}
if (arguments.length === 2) {
t2 = "" + t2, e3 = "" + e3;
var r3 = this._nodes.get(t2);
if (!r3)
return false;
var i3 = r3.out !== void 0 && r3.out[e3];
return i3 || (i3 = r3.undirected !== void 0 && r3.undirected[e3]), !!i3 && (!this.multi || !!i3.size);
}
throw new F("Graph.hasEdge: invalid arity (".concat(arguments.length, ", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target."));
}, i2.directedEdge = function(t2, e3) {
if (this.type !== "undirected") {
if (t2 = "" + t2, e3 = "" + e3, this.multi)
throw new B2("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.directedEdge: could not find the "'.concat(t2, '" source node in the graph.'));
if (!this._nodes.has(e3))
throw new Y2('Graph.directedEdge: could not find the "'.concat(e3, '" target node in the graph.'));
var r3 = n3.out && n3.out[e3] || void 0;
return r3 ? r3.key : void 0;
}
}, i2.undirectedEdge = function(t2, e3) {
if (this.type !== "directed") {
if (t2 = "" + t2, e3 = "" + e3, this.multi)
throw new B2("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.undirectedEdge: could not find the "'.concat(t2, '" source node in the graph.'));
if (!this._nodes.has(e3))
throw new Y2('Graph.undirectedEdge: could not find the "'.concat(e3, '" target node in the graph.'));
var r3 = n3.undirected && n3.undirected[e3] || void 0;
return r3 ? r3.key : void 0;
}
}, i2.edge = function(t2, e3) {
if (this.multi)
throw new B2("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");
t2 = "" + t2, e3 = "" + e3;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.edge: could not find the "'.concat(t2, '" source node in the graph.'));
if (!this._nodes.has(e3))
throw new Y2('Graph.edge: could not find the "'.concat(e3, '" target node in the graph.'));
var r3 = n3.out && n3.out[e3] || n3.undirected && n3.undirected[e3] || void 0;
if (r3)
return r3.key;
}, i2.areDirectedNeighbors = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.areDirectedNeighbors: could not find the "'.concat(t2, '" node in the graph.'));
return this.type !== "undirected" && (e3 in n3.in || e3 in n3.out);
}, i2.areOutNeighbors = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.areOutNeighbors: could not find the "'.concat(t2, '" node in the graph.'));
return this.type !== "undirected" && e3 in n3.out;
}, i2.areInNeighbors = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.areInNeighbors: could not find the "'.concat(t2, '" node in the graph.'));
return this.type !== "undirected" && e3 in n3.in;
}, i2.areUndirectedNeighbors = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.areUndirectedNeighbors: could not find the "'.concat(t2, '" node in the graph.'));
return this.type !== "directed" && e3 in n3.undirected;
}, i2.areNeighbors = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.areNeighbors: could not find the "'.concat(t2, '" node in the graph.'));
return this.type !== "undirected" && (e3 in n3.in || e3 in n3.out) || this.type !== "directed" && e3 in n3.undirected;
}, i2.areInboundNeighbors = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.areInboundNeighbors: could not find the "'.concat(t2, '" node in the graph.'));
return this.type !== "undirected" && e3 in n3.in || this.type !== "directed" && e3 in n3.undirected;
}, i2.areOutboundNeighbors = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.areOutboundNeighbors: could not find the "'.concat(t2, '" node in the graph.'));
return this.type !== "undirected" && e3 in n3.out || this.type !== "directed" && e3 in n3.undirected;
}, i2.inDegree = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.inDegree: could not find the "'.concat(t2, '" node in the graph.'));
return this.type === "undirected" ? 0 : e3.inDegree + e3.directedSelfLoops;
}, i2.outDegree = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.outDegree: could not find the "'.concat(t2, '" node in the graph.'));
return this.type === "undirected" ? 0 : e3.outDegree + e3.directedSelfLoops;
}, i2.directedDegree = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.directedDegree: could not find the "'.concat(t2, '" node in the graph.'));
if (this.type === "undirected")
return 0;
var n3 = e3.directedSelfLoops;
return e3.inDegree + n3 + (e3.outDegree + n3);
}, i2.undirectedDegree = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.undirectedDegree: could not find the "'.concat(t2, '" node in the graph.'));
if (this.type === "directed")
return 0;
var n3 = e3.undirectedSelfLoops;
return e3.undirectedDegree + 2 * n3;
}, i2.degree = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.degree: could not find the "'.concat(t2, '" node in the graph.'));
var n3 = 0;
return this.type !== "directed" && (n3 += e3.undirectedDegree + 2 * e3.undirectedSelfLoops), this.type !== "undirected" && (n3 += e3.inDegree + e3.outDegree + 2 * e3.directedSelfLoops), n3;
}, i2.inDegreeWithoutSelfLoops = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.inDegreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.'));
return this.type === "undirected" ? 0 : e3.inDegree;
}, i2.outDegreeWithoutSelfLoops = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.outDegreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.'));
return this.type === "undirected" ? 0 : e3.outDegree;
}, i2.directedDegreeWithoutSelfLoops = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.directedDegreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.'));
return this.type === "undirected" ? 0 : e3.inDegree + e3.outDegree;
}, i2.undirectedDegreeWithoutSelfLoops = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.undirectedDegreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.'));
return this.type === "directed" ? 0 : e3.undirectedDegree;
}, i2.degreeWithoutSelfLoops = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.degreeWithoutSelfLoops: could not find the "'.concat(t2, '" node in the graph.'));
var n3 = 0;
return this.type !== "directed" && (n3 += e3.undirectedDegree), this.type !== "undirected" && (n3 += e3.inDegree + e3.outDegree), n3;
}, i2.source = function(t2) {
t2 = "" + t2;
var e3 = this._edges.get(t2);
if (!e3)
throw new Y2('Graph.source: could not find the "'.concat(t2, '" edge in the graph.'));
return e3.source.key;
}, i2.target = function(t2) {
t2 = "" + t2;
var e3 = this._edges.get(t2);
if (!e3)
throw new Y2('Graph.target: could not find the "'.concat(t2, '" edge in the graph.'));
return e3.target.key;
}, i2.extremities = function(t2) {
t2 = "" + t2;
var e3 = this._edges.get(t2);
if (!e3)
throw new Y2('Graph.extremities: could not find the "'.concat(t2, '" edge in the graph.'));
return [e3.source.key, e3.target.key];
}, i2.opposite = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._edges.get(e3);
if (!n3)
throw new Y2('Graph.opposite: could not find the "'.concat(e3, '" edge in the graph.'));
var r3 = n3.source.key, i3 = n3.target.key;
if (t2 === r3)
return i3;
if (t2 === i3)
return r3;
throw new Y2('Graph.opposite: the "'.concat(t2, '" node is not attached to the "').concat(e3, '" edge (').concat(r3, ", ").concat(i3, ")."));
}, i2.hasExtremity = function(t2, e3) {
t2 = "" + t2, e3 = "" + e3;
var n3 = this._edges.get(t2);
if (!n3)
throw new Y2('Graph.hasExtremity: could not find the "'.concat(t2, '" edge in the graph.'));
return n3.source.key === e3 || n3.target.key === e3;
}, i2.isUndirected = function(t2) {
t2 = "" + t2;
var e3 = this._edges.get(t2);
if (!e3)
throw new Y2('Graph.isUndirected: could not find the "'.concat(t2, '" edge in the graph.'));
return e3.undirected;
}, i2.isDirected = function(t2) {
t2 = "" + t2;
var e3 = this._edges.get(t2);
if (!e3)
throw new Y2('Graph.isDirected: could not find the "'.concat(t2, '" edge in the graph.'));
return !e3.undirected;
}, i2.isSelfLoop = function(t2) {
t2 = "" + t2;
var e3 = this._edges.get(t2);
if (!e3)
throw new Y2('Graph.isSelfLoop: could not find the "'.concat(t2, '" edge in the graph.'));
return e3.source === e3.target;
}, i2.addNode = function(t2, e3) {
var n3 = function(t3, e4, n4) {
if (n4 && !h(n4))
throw new F('Graph.addNode: invalid attributes. Expecting an object but got "'.concat(n4, '"'));
if (e4 = "" + e4, n4 = n4 || {}, t3._nodes.has(e4))
throw new B2('Graph.addNode: the "'.concat(e4, '" node already exist in the graph.'));
var r3 = new t3.NodeDataClass(e4, n4);
return t3._nodes.set(e4, r3), t3.emit("nodeAdded", { key: e4, attributes: n4 }), r3;
}(this, t2, e3);
return n3.key;
}, i2.mergeNode = function(t2, e3) {
if (e3 && !h(e3))
throw new F('Graph.mergeNode: invalid attributes. Expecting an object but got "'.concat(e3, '"'));
t2 = "" + t2, e3 = e3 || {};
var n3 = this._nodes.get(t2);
return n3 ? (e3 && (c3(n3.attributes, e3), this.emit("nodeAttributesUpdated", { type: "merge", key: t2, attributes: n3.attributes, data: e3 })), [t2, false]) : (n3 = new this.NodeDataClass(t2, e3), this._nodes.set(t2, n3), this.emit("nodeAdded", { key: t2, attributes: e3 }), [t2, true]);
}, i2.updateNode = function(t2, e3) {
if (e3 && typeof e3 != "function")
throw new F('Graph.updateNode: invalid updater function. Expecting a function but got "'.concat(e3, '"'));
t2 = "" + t2;
var n3 = this._nodes.get(t2);
if (n3) {
if (e3) {
var r3 = n3.attributes;
n3.attributes = e3(r3), this.emit("nodeAttributesUpdated", { type: "replace", key: t2, attributes: n3.attributes });
}
return [t2, false];
}
var i3 = e3 ? e3({}) : {};
return n3 = new this.NodeDataClass(t2, i3), this._nodes.set(t2, n3), this.emit("nodeAdded", { key: t2, attributes: i3 }), [t2, true];
}, i2.dropNode = function(t2) {
var e3 = this;
t2 = "" + t2;
var n3 = this._nodes.get(t2);
if (!n3)
throw new Y2('Graph.dropNode: could not find the "'.concat(t2, '" node in the graph.'));
this.forEachEdge(t2, function(t3) {
e3.dropEdge(t3);
}), this._nodes.delete(t2), this.emit("nodeDropped", { key: t2, attributes: n3.attributes });
}, i2.dropEdge = function(t2) {
var e3;
if (arguments.length > 1) {
var n3 = "" + arguments[0], r3 = "" + arguments[1];
if (!(e3 = d(this, n3, r3, this.type)))
throw new Y2('Graph.dropEdge: could not find the "'.concat(n3, '" -> "').concat(r3, '" edge in the graph.'));
} else if (t2 = "" + t2, !(e3 = this._edges.get(t2)))
throw new Y2('Graph.dropEdge: could not find the "'.concat(t2, '" edge in the graph.'));
this._edges.delete(e3.key);
var i3 = e3, o2 = i3.source, a3 = i3.target, u2 = i3.attributes, c4 = e3.undirected;
return o2 === a3 ? c4 ? (o2.undirectedSelfLoops--, this._undirectedSelfLoopCount--) : (o2.directedSelfLoops--, this._directedSelfLoopCount--) : c4 ? (o2.undirectedDegree--, a3.undirectedDegree--) : (o2.outDegree--, a3.inDegree--), X2(this, c4, e3), c4 ? this._undirectedSize-- : this._directedSize--, this.emit("edgeDropped", { key: t2, attributes: u2, source: o2.key, target: a3.key, undirected: c4 }), this;
}, i2.clear = function() {
this._edges.clear(), this._nodes.clear(), this._resetInstanceCounters(), this.emit("cleared");
}, i2.clearEdges = function() {
!function(t2) {
for (var e3, n3 = t2._nodes.values(); (e3 = n3.next()).done !== true; )
e3.value.clear();
}(this), this._edges.clear(), this._resetInstanceCounters(), this.emit("edgesCleared");
}, i2.getAttribute = function(t2) {
return this._attributes[t2];
}, i2.getAttributes = function() {
return this._attributes;
}, i2.hasAttribute = function(t2) {
return this._attributes.hasOwnProperty(t2);
}, i2.setAttribute = function(t2, e3) {
return this._attributes[t2] = e3, this.emit("attributesUpdated", { type: "set", attributes: this._attributes, name: t2 }), this;
}, i2.updateAttribute = function(t2, e3) {
if (typeof e3 != "function")
throw new F("Graph.updateAttribute: updater should be a function.");
var n3 = this._attributes[t2];
return this._attributes[t2] = e3(n3), this.emit("attributesUpdated", { type: "set", attributes: this._attributes, name: t2 }), this;
}, i2.removeAttribute = function(t2) {
return delete this._attributes[t2], this.emit("attributesUpdated", { type: "remove", attributes: this._attributes, name: t2 }), this;
}, i2.replaceAttributes = function(t2) {
if (!h(t2))
throw new F("Graph.replaceAttributes: provided attributes are not a plain object.");
return this._attributes = t2, this.emit("attributesUpdated", { type: "replace", attributes: this._attributes }), this;
}, i2.mergeAttributes = function(t2) {
if (!h(t2))
throw new F("Graph.mergeAttributes: provided attributes are not a plain object.");
return c3(this._attributes, t2), this.emit("attributesUpdated", { type: "merge", attributes: this._attributes, data: t2 }), this;
}, i2.updateAttributes = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.updateAttributes: provided updater is not a function.");
return this._attributes = t2(this._attributes), this.emit("attributesUpdated", { type: "update", attributes: this._attributes }), this;
}, i2.updateEachNodeAttributes = function(t2, e3) {
if (typeof t2 != "function")
throw new F("Graph.updateEachNodeAttributes: expecting an updater function.");
if (e3 && !g(e3))
throw new F("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");
for (var n3, r3, i3 = this._nodes.values(); (n3 = i3.next()).done !== true; )
(r3 = n3.value).attributes = t2(r3.key, r3.attributes);
this.emit("eachNodeAttributesUpdated", { hints: e3 || null });
}, i2.updateEachEdgeAttributes = function(t2, e3) {
if (typeof t2 != "function")
throw new F("Graph.updateEachEdgeAttributes: expecting an updater function.");
if (e3 && !g(e3))
throw new F("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");
for (var n3, r3, i3, o2, a3 = this._edges.values(); (n3 = a3.next()).done !== true; )
i3 = (r3 = n3.value).source, o2 = r3.target, r3.attributes = t2(r3.key, r3.attributes, i3.key, o2.key, i3.attributes, o2.attributes, r3.undirected);
this.emit("eachEdgeAttributesUpdated", { hints: e3 || null });
}, i2.forEachAdjacencyEntry = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.forEachAdjacencyEntry: expecting a callback.");
this.multi ? Yt(false, false, false, this, t2) : Ft(false, false, false, this, t2);
}, i2.forEachAdjacencyEntryWithOrphans = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");
this.multi ? Yt(false, false, true, this, t2) : Ft(false, false, true, this, t2);
}, i2.forEachAssymetricAdjacencyEntry = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");
this.multi ? Yt(false, true, false, this, t2) : Ft(false, true, false, this, t2);
}, i2.forEachAssymetricAdjacencyEntryWithOrphans = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");
this.multi ? Yt(false, true, true, this, t2) : Ft(false, true, true, this, t2);
}, i2.nodes = function() {
return typeof Array.from == "function" ? Array.from(this._nodes.keys()) : K(this._nodes.keys(), this._nodes.size);
}, i2.forEachNode = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.forEachNode: expecting a callback.");
for (var e3, n3, r3 = this._nodes.values(); (e3 = r3.next()).done !== true; )
t2((n3 = e3.value).key, n3.attributes);
}, i2.findNode = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.findNode: expecting a callback.");
for (var e3, n3, r3 = this._nodes.values(); (e3 = r3.next()).done !== true; )
if (t2((n3 = e3.value).key, n3.attributes))
return n3.key;
}, i2.mapNodes = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.mapNode: expecting a callback.");
for (var e3, n3, r3 = this._nodes.values(), i3 = new Array(this.order), o2 = 0; (e3 = r3.next()).done !== true; )
n3 = e3.value, i3[o2++] = t2(n3.key, n3.attributes);
return i3;
}, i2.someNode = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.someNode: expecting a callback.");
for (var e3, n3, r3 = this._nodes.values(); (e3 = r3.next()).done !== true; )
if (t2((n3 = e3.value).key, n3.attributes))
return true;
return false;
}, i2.everyNode = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.everyNode: expecting a callback.");
for (var e3, n3, r3 = this._nodes.values(); (e3 = r3.next()).done !== true; )
if (!t2((n3 = e3.value).key, n3.attributes))
return false;
return true;
}, i2.filterNodes = function(t2) {
if (typeof t2 != "function")
throw new F("Graph.filterNodes: expecting a callback.");
for (var e3, n3, r3 = this._nodes.values(), i3 = []; (e3 = r3.next()).done !== true; )
t2((n3 = e3.value).key, n3.attributes) && i3.push(n3.key);
return i3;
}, i2.reduceNodes = function(t2, e3) {
if (typeof t2 != "function")
throw new F("Graph.reduceNodes: expecting a callback.");
if (arguments.length < 2)
throw new F("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");
for (var n3, r3, i3 = e3, o2 = this._nodes.values(); (n3 = o2.next()).done !== true; )
i3 = t2(i3, (r3 = n3.value).key, r3.attributes);
return i3;
}, i2.nodeEntries = function() {
var t2 = this._nodes.values();
return new O(function() {
var e3 = t2.next();
if (e3.done)
return e3;
var n3 = e3.value;
return { value: { node: n3.key, attributes: n3.attributes }, done: false };
});
}, i2.exportNode = function(t2) {
t2 = "" + t2;
var e3 = this._nodes.get(t2);
if (!e3)
throw new Y2('Graph.exportNode: could not find the "'.concat(t2, '" node in the graph.'));
return Bt(t2, e3);
}, i2.exportEdge = function(t2) {
t2 = "" + t2;
var e3 = this._edges.get(t2);
if (!e3)
throw new Y2('Graph.exportEdge: could not find the "'.concat(t2, '" edge in the graph.'));
return qt(t2, e3);
}, i2.export = function() {
var t2 = new Array(this._nodes.size), e3 = 0;
this._nodes.forEach(function(n4, r3) {
t2[e3++] = Bt(r3, n4);
});
var n3 = new Array(this._edges.size);
return e3 = 0, this._edges.forEach(function(t3, r3) {
n3[e3++] = qt(r3, t3);
}), { attributes: this.getAttributes(), nodes: t2, edges: n3, options: { type: this.type, multi: this.multi, allowSelfLoops: this.allowSelfLoops } };
}, i2.importNode = function(t2) {
var e3 = arguments.length > 1 && arguments[1] !== void 0 && arguments[1], n3 = Jt(t2);
if (n3) {
if (n3 === "not-object")
throw new F('Graph.importNode: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');
if (n3 === "no-key")
throw new F("Graph.importNode: no key provided.");
if (n3 === "invalid-attributes")
throw new F("Graph.importNode: invalid attributes. Attributes should be a plain object, null or omitted.");
}
var r3 = t2.key, i3 = t2.attributes, o2 = i3 === void 0 ? {} : i3;
return e3 ? this.mergeNode(r3, o2) : this.addNode(r3, o2), this;
}, i2.importEdge = function(t2) {
var e3 = arguments.length > 1 && arguments[1] !== void 0 && arguments[1], n3 = Vt(t2);
if (n3) {
if (n3 === "not-object")
throw new F('Graph.importEdge: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');
if (n3 === "no-source")
throw new F("Graph.importEdge: missing souce.");
if (n3 === "no-target")
throw new F("Graph.importEdge: missing target.");
if (n3 === "invalid-attributes")
throw new F("Graph.importEdge: invalid attributes. Attributes should be a plain object, null or omitted.");
if (n3 === "invalid-undirected")
throw new F("Graph.importEdge: invalid undirected. Undirected should be boolean or omitted.");
}
var r3 = t2.source, i3 = t2.target, o2 = t2.attributes, a3 = o2 === void 0 ? {} : o2, u2 = t2.undirected, c4 = u2 !== void 0 && u2;
return "key" in t2 ? (e3 ? c4 ? this.mergeUndirectedEdgeWithKey : this.mergeDirectedEdgeWithKey : c4 ? this.addUndirectedEdgeWithKey : this.addDirectedEdgeWithKey).call(this, t2.key, r3, i3, a3) : (e3 ? c4 ? this.mergeUndirectedEdge : this.mergeDirectedEdge : c4 ? this.addUndirectedEdge : this.addDirectedEdge).call(this, r3, i3, a3), this;
}, i2.import = function(t2) {
var e3, n3, r3, i3 = arguments.length > 1 && arguments[1] !== void 0 && arguments[1];
if (s(t2))
return this.import(t2.export(), i3), this;
if (!h(t2))
throw new F("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");
if (t2.attributes) {
if (!h(t2.attributes))
throw new F("Graph.import: invalid attributes. Expecting a plain object.");
i3 ? this.mergeAttributes(t2.attributes) : this.replaceAttributes(t2.attributes);
}
if (t2.nodes) {
if (r3 = t2.nodes, !Array.isArray(r3))
throw new F("Graph.import: invalid nodes. Expecting an array.");
for (e3 = 0, n3 = r3.length; e3 < n3; e3++)
this.importNode(r3[e3], i3);
}
if (t2.edges) {
if (r3 = t2.edges, !Array.isArray(r3))
throw new F("Graph.import: invalid edges. Expecting an array.");
for (e3 = 0, n3 = r3.length; e3 < n3; e3++)
this.importEdge(r3[e3], i3);
}
return this;
}, i2.nullCopy = function(t2) {
var e3 = new r2(c3({}, this._options, t2));
return e3.replaceAttributes(c3({}, this.getAttributes())), e3;
}, i2.emptyCopy = function(t2) {
var e3 = this.nullCopy(t2);
return this._nodes.forEach(function(t3, n3) {
var r3 = c3({}, t3.attributes);
t3 = new e3.NodeDataClass(n3, r3), e3._nodes.set(n3, t3);
}), e3;
}, i2.copy = function() {
for (var t2, e3, n3 = this.emptyCopy(), r3 = this._edges.values(); (t2 = r3.next()).done !== true; )
ee(n3, "copy", false, (e3 = t2.value).undirected, e3.key, e3.source.key, e3.target.key, c3({}, e3.attributes));
return n3;
}, i2.upgradeToMixed = function() {
return this.type === "mixed" || (this._nodes.forEach(function(t2) {
return t2.upgradeToMixed();
}), this._options.type = "mixed", l(this, "type", this._options.type), p(this, "NodeDataClass", q)), this;
}, i2.upgradeToMulti = function() {
return this.multi || (this._options.multi = true, l(this, "multi", true), (t2 = this)._nodes.forEach(function(e3, n3) {
if (e3.out)
for (var r3 in e3.out) {
var i3 = /* @__PURE__ */ new Set();
i3.add(e3.out[r3]), e3.out[r3] = i3, t2._nodes.get(r3).in[n3] = i3;
}
if (e3.undirected) {
for (var o2 in e3.undirected)
if (!(o2 > n3)) {
var a3 = /* @__PURE__ */ new Set();
a3.add(e3.undirected[o2]), e3.undirected[o2] = a3, t2._nodes.get(o2).undirected[n3] = a3;
}
}
})), this;
var t2;
}, i2.toJSON = function() {
return this.export();
}, i2.toString = function() {
return "[object Graph]";
}, i2.inspect = function() {
var e3 = this, n3 = {};
this._nodes.forEach(function(t2, e4) {
n3[e4] = t2.attributes;
});
var r3 = {}, i3 = {};
this._edges.forEach(function(t2, n4) {
var o3, a4 = t2.undirected ? "--" : "->", u2 = "", c4 = t2.source.key, d2 = t2.target.key;
t2.undirected && c4 > d2 && (o3 = c4, c4 = d2, d2 = o3);
var s2 = "(".concat(c4, ")").concat(a4, "(").concat(d2, ")");
n4.startsWith("geid_") ? e3.multi && (i3[s2] === void 0 ? i3[s2] = 0 : i3[s2]++, u2 += "".concat(i3[s2], ". ")) : u2 += "[".concat(n4, "]: "), r3[u2 += s2] = t2.attributes;
});
var o2 = {};
for (var a3 in this)
this.hasOwnProperty(a3) && !Zt.has(a3) && typeof this[a3] != "function" && t(a3) !== "symbol" && (o2[a3] = this[a3]);
return o2.attributes = this._attributes, o2.nodes = n3, o2.edges = r3, p(o2, "constructor", this.constructor), o2;
}, r2;
}(v.exports.EventEmitter);
typeof Symbol != "undefined" && (re2.prototype[Symbol.for("nodejs.util.inspect.custom")] = re2.prototype.inspect), [{ name: function(t2) {
return "".concat(t2, "Edge");
}, generateKey: true }, { name: function(t2) {
return "".concat(t2, "DirectedEdge");
}, generateKey: true, type: "directed" }, { name: function(t2) {
return "".concat(t2, "UndirectedEdge");
}, generateKey: true, type: "undirected" }, { name: function(t2) {
return "".concat(t2, "EdgeWithKey");
} }, { name: function(t2) {
return "".concat(t2, "DirectedEdgeWithKey");
}, type: "directed" }, { name: function(t2) {
return "".concat(t2, "UndirectedEdgeWithKey");
}, type: "undirected" }].forEach(function(t2) {
["add", "merge", "update"].forEach(function(e3) {
var n2 = t2.name(e3), r2 = e3 === "add" ? ee : ne;
t2.generateKey ? re2.prototype[n2] = function(i2, o2, a3) {
return r2(this, n2, true, (t2.type || this.type) === "undirected", null, i2, o2, a3, e3 === "update");
} : re2.prototype[n2] = function(i2, o2, a3, u2) {
return r2(this, n2, false, (t2.type || this.type) === "undirected", i2, o2, a3, u2, e3 === "update");
};
});
}), function(t2) {
$.forEach(function(e3) {
var n2 = e3.name, r2 = e3.attacher;
r2(t2, n2("Node"), 0), r2(t2, n2("Source"), 1), r2(t2, n2("Target"), 2), r2(t2, n2("Opposite"), 3);
});
}(re2), function(t2) {
tt.forEach(function(e3) {
var n2 = e3.name, r2 = e3.attacher;
r2(t2, n2("Edge"), "mixed"), r2(t2, n2("DirectedEdge"), "directed"), r2(t2, n2("UndirectedEdge"), "undirected");
});
}(re2), function(t2) {
it.forEach(function(e3) {
!function(t3, e4) {
var n2 = e4.name, r2 = e4.type, i2 = e4.direction;
t3.prototype[n2] = function(t4, e6) {
if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type)
return [];
if (!arguments.length)
return wt(this, r2);
if (arguments.length === 1) {
t4 = "" + t4;
var o2 = this._nodes.get(t4);
if (o2 === void 0)
throw new Y2("Graph.".concat(n2, ': could not find the "').concat(t4, '" node in the graph.'));
return Gt(this.multi, r2 === "mixed" ? this.type : r2, i2, o2);
}
if (arguments.length === 2) {
t4 = "" + t4, e6 = "" + e6;
var a3 = this._nodes.get(t4);
if (!a3)
throw new Y2("Graph.".concat(n2, ': could not find the "').concat(t4, '" source node in the graph.'));
if (!this._nodes.has(e6))
throw new Y2("Graph.".concat(n2, ': could not find the "').concat(e6, '" target node in the graph.'));
return At(r2, this.multi, i2, a3, e6);
}
throw new F("Graph.".concat(n2, ": too many arguments (expecting 0, 1 or 2 and got ").concat(arguments.length, ")."));
};
}(t2, e3), function(t3, e4) {
var n2 = e4.name, r2 = e4.type, i2 = e4.direction, o2 = "forEach" + n2[0].toUpperCase() + n2.slice(1, -1);
t3.prototype[o2] = function(t4, e6, n3) {
if (r2 === "mixed" || this.type === "mixed" || r2 === this.type) {
if (arguments.length === 1)
return mt(this, r2, n3 = t4);
if (arguments.length === 2) {
t4 = "" + t4, n3 = e6;
var a4 = this._nodes.get(t4);
if (a4 === void 0)
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" node in the graph.'));
return xt(this.multi, r2 === "mixed" ? this.type : r2, i2, a4, n3);
}
if (arguments.length === 3) {
t4 = "" + t4, e6 = "" + e6;
var u3 = this._nodes.get(t4);
if (!u3)
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" source node in the graph.'));
if (!this._nodes.has(e6))
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(e6, '" target node in the graph.'));
return Lt(r2, this.multi, i2, u3, e6, n3);
}
throw new F("Graph.".concat(o2, ": too many arguments (expecting 1, 2 or 3 and got ").concat(arguments.length, ")."));
}
};
var a3 = "map" + n2[0].toUpperCase() + n2.slice(1);
t3.prototype[a3] = function() {
var t4, e6 = Array.prototype.slice.call(arguments), n3 = e6.pop();
if (e6.length === 0) {
var i3 = 0;
r2 !== "directed" && (i3 += this.undirectedSize), r2 !== "undirected" && (i3 += this.directedSize), t4 = new Array(i3);
var a4 = 0;
e6.push(function(e7, r3, i4, o3, u3, c5, d2) {
t4[a4++] = n3(e7, r3, i4, o3, u3, c5, d2);
});
} else
t4 = [], e6.push(function(e7, r3, i4, o3, a5, u3, c5) {
t4.push(n3(e7, r3, i4, o3, a5, u3, c5));
});
return this[o2].apply(this, e6), t4;
};
var u2 = "filter" + n2[0].toUpperCase() + n2.slice(1);
t3.prototype[u2] = function() {
var t4 = Array.prototype.slice.call(arguments), e6 = t4.pop(), n3 = [];
return t4.push(function(t5, r3, i3, o3, a4, u3, c5) {
e6(t5, r3, i3, o3, a4, u3, c5) && n3.push(t5);
}), this[o2].apply(this, t4), n3;
};
var c4 = "reduce" + n2[0].toUpperCase() + n2.slice(1);
t3.prototype[c4] = function() {
var t4, e6, n3 = Array.prototype.slice.call(arguments);
if (n3.length < 2 || n3.length > 4)
throw new F("Graph.".concat(c4, ": invalid number of arguments (expecting 2, 3 or 4 and got ").concat(n3.length, ")."));
if (typeof n3[n3.length - 1] == "function" && typeof n3[n3.length - 2] != "function")
throw new F("Graph.".concat(c4, ": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array."));
n3.length === 2 ? (t4 = n3[0], e6 = n3[1], n3 = []) : n3.length === 3 ? (t4 = n3[1], e6 = n3[2], n3 = [n3[0]]) : n3.length === 4 && (t4 = n3[2], e6 = n3[3], n3 = [n3[0], n3[1]]);
var r3 = e6;
return n3.push(function(e7, n4, i3, o3, a4, u3, c5) {
r3 = t4(r3, e7, n4, i3, o3, a4, u3, c5);
}), this[o2].apply(this, n3), r3;
};
}(t2, e3), function(t3, e4) {
var n2 = e4.name, r2 = e4.type, i2 = e4.direction, o2 = "find" + n2[0].toUpperCase() + n2.slice(1, -1);
t3.prototype[o2] = function(t4, e6, n3) {
if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type)
return false;
if (arguments.length === 1)
return _t(this, r2, n3 = t4);
if (arguments.length === 2) {
t4 = "" + t4, n3 = e6;
var a4 = this._nodes.get(t4);
if (a4 === void 0)
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" node in the graph.'));
return Et(this.multi, r2 === "mixed" ? this.type : r2, i2, a4, n3);
}
if (arguments.length === 3) {
t4 = "" + t4, e6 = "" + e6;
var u3 = this._nodes.get(t4);
if (!u3)
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" source node in the graph.'));
if (!this._nodes.has(e6))
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(e6, '" target node in the graph.'));
return Dt(r2, this.multi, i2, u3, e6, n3);
}
throw new F("Graph.".concat(o2, ": too many arguments (expecting 1, 2 or 3 and got ").concat(arguments.length, ")."));
};
var a3 = "some" + n2[0].toUpperCase() + n2.slice(1, -1);
t3.prototype[a3] = function() {
var t4 = Array.prototype.slice.call(arguments), e6 = t4.pop();
return t4.push(function(t5, n3, r3, i3, o3, a4, u3) {
return e6(t5, n3, r3, i3, o3, a4, u3);
}), !!this[o2].apply(this, t4);
};
var u2 = "every" + n2[0].toUpperCase() + n2.slice(1, -1);
t3.prototype[u2] = function() {
var t4 = Array.prototype.slice.call(arguments), e6 = t4.pop();
return t4.push(function(t5, n3, r3, i3, o3, a4, u3) {
return !e6(t5, n3, r3, i3, o3, a4, u3);
}), !this[o2].apply(this, t4);
};
}(t2, e3), function(t3, e4) {
var n2 = e4.name, r2 = e4.type, i2 = e4.direction, o2 = n2.slice(0, -1) + "Entries";
t3.prototype[o2] = function(t4, e6) {
if (r2 !== "mixed" && this.type !== "mixed" && r2 !== this.type)
return O.empty();
if (!arguments.length)
return kt(this, r2);
if (arguments.length === 1) {
t4 = "" + t4;
var n3 = this._nodes.get(t4);
if (!n3)
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" node in the graph.'));
return St(r2, i2, n3);
}
if (arguments.length === 2) {
t4 = "" + t4, e6 = "" + e6;
var a3 = this._nodes.get(t4);
if (!a3)
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(t4, '" source node in the graph.'));
if (!this._nodes.has(e6))
throw new Y2("Graph.".concat(o2, ': could not find the "').concat(e6, '" target node in the graph.'));
return Nt(r2, i2, a3, e6);
}
throw new F("Graph.".concat(o2, ": too many arguments (expecting 0, 1 or 2 and got ").concat(arguments.length, ")."));
};
}(t2, e3);
});
}(re2), function(t2) {
Ut.forEach(function(e3) {
Rt(t2, e3), Wt(t2, e3), Kt(t2, e3), It(t2, e3);
});
}(re2);
var ie = function(t2) {
function n2(e3) {
var n3 = c3({ type: "directed" }, e3);
if ("multi" in n3 && n3.multi !== false)
throw new F("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");
if (n3.type !== "directed")
throw new F('DirectedGraph.from: inconsistent "' + n3.type + '" type in given options!');
return t2.call(this, n3) || this;
}
return e(n2, t2), n2;
}(re2), oe = function(t2) {
function n2(e3) {
var n3 = c3({ type: "undirected" }, e3);
if ("multi" in n3 && n3.multi !== false)
throw new F("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");
if (n3.type !== "undirected")
throw new F('UndirectedGraph.from: inconsistent "' + n3.type + '" type in given options!');
return t2.call(this, n3) || this;
}
return e(n2, t2), n2;
}(re2), ae = function(t2) {
function n2(e3) {
var n3 = c3({ multi: true }, e3);
if ("multi" in n3 && n3.multi !== true)
throw new F("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");
return t2.call(this, n3) || this;
}
return e(n2, t2), n2;
}(re2), ue = function(t2) {
function n2(e3) {
var n3 = c3({ type: "directed", multi: true }, e3);
if ("multi" in n3 && n3.multi !== true)
throw new F("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");
if (n3.type !== "directed")
throw new F('MultiDirectedGraph.from: inconsistent "' + n3.type + '" type in given options!');
return t2.call(this, n3) || this;
}
return e(n2, t2), n2;
}(re2), ce = function(t2) {
function n2(e3) {
var n3 = c3({ type: "undirected", multi: true }, e3);
if ("multi" in n3 && n3.multi !== true)
throw new F("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");
if (n3.type !== "undirected")
throw new F('MultiUndirectedGraph.from: inconsistent "' + n3.type + '" type in given options!');
return t2.call(this, n3) || this;
}
return e(n2, t2), n2;
}(re2);
function de(t2) {
t2.from = function(e3, n2) {
var r2 = c3({}, e3.options, n2), i2 = new t2(r2);
return i2.import(e3), i2;
};
}
return de(re2), de(ie), de(oe), de(ae), de(ue), de(ce), re2.Graph = re2, re2.DirectedGraph = ie, re2.UndirectedGraph = oe, re2.MultiGraph = ae, re2.MultiDirectedGraph = ue, re2.MultiUndirectedGraph = ce, re2.InvalidArgumentsGraphError = F, re2.NotFoundGraphError = Y2, re2.UsageGraphError = B2, re2;
});
}
});
// node_modules/graphology-utils/is-graph.js
var require_is_graph = __commonJS({
"node_modules/graphology-utils/is-graph.js"(exports, module2) {
module2.exports = function isGraph(value) {
return value !== null && typeof value === "object" && typeof value.addUndirectedEdgeWithKey === "function" && typeof value.dropNode === "function" && typeof value.multi === "boolean";
};
}
});
// node_modules/obliterator/support.js
var require_support = __commonJS({
"node_modules/obliterator/support.js"(exports) {
exports.ARRAY_BUFFER_SUPPORT = typeof ArrayBuffer !== "undefined";
exports.SYMBOL_SUPPORT = typeof Symbol !== "undefined";
}
});
// node_modules/obliterator/foreach.js
var require_foreach = __commonJS({
"node_modules/obliterator/foreach.js"(exports, module2) {
var support = require_support();
var ARRAY_BUFFER_SUPPORT = support.ARRAY_BUFFER_SUPPORT;
var SYMBOL_SUPPORT = support.SYMBOL_SUPPORT;
module2.exports = function forEach(iterable, callback) {
var iterator, k, i, l, s;
if (!iterable)
throw new Error("obliterator/forEach: invalid iterable.");
if (typeof callback !== "function")
throw new Error("obliterator/forEach: expecting a callback.");
if (Array.isArray(iterable) || ARRAY_BUFFER_SUPPORT && ArrayBuffer.isView(iterable) || typeof iterable === "string" || iterable.toString() === "[object Arguments]") {
for (i = 0, l = iterable.length; i < l; i++)
callback(iterable[i], i);
return;
}
if (typeof iterable.forEach === "function") {
iterable.forEach(callback);
return;
}
if (SYMBOL_SUPPORT && Symbol.iterator in iterable && typeof iterable.next !== "function") {
iterable = iterable[Symbol.iterator]();
}
if (typeof iterable.next === "function") {
iterator = iterable;
i = 0;
while (s = iterator.next(), s.done !== true) {
callback(s.value, i);
i++;
}
return;
}
for (k in iterable) {
if (iterable.hasOwnProperty(k)) {
callback(iterable[k], k);
}
}
return;
};
}
});
// node_modules/mnemonist/utils/typed-arrays.js
var require_typed_arrays = __commonJS({
"node_modules/mnemonist/utils/typed-arrays.js"(exports) {
var MAX_8BIT_INTEGER = Math.pow(2, 8) - 1;
var MAX_16BIT_INTEGER = Math.pow(2, 16) - 1;
var MAX_32BIT_INTEGER = Math.pow(2, 32) - 1;
var MAX_SIGNED_8BIT_INTEGER = Math.pow(2, 7) - 1;
var MAX_SIGNED_16BIT_INTEGER = Math.pow(2, 15) - 1;
var MAX_SIGNED_32BIT_INTEGER = Math.pow(2, 31) - 1;
exports.getPointerArray = function(size) {
var maxIndex = size - 1;
if (maxIndex <= MAX_8BIT_INTEGER)
return Uint8Array;
if (maxIndex <= MAX_16BIT_INTEGER)
return Uint16Array;
if (maxIndex <= MAX_32BIT_INTEGER)
return Uint32Array;
throw new Error("mnemonist: Pointer Array of size > 4294967295 is not supported.");
};
exports.getSignedPointerArray = function(size) {
var maxIndex = size - 1;
if (maxIndex <= MAX_SIGNED_8BIT_INTEGER)
return Int8Array;
if (maxIndex <= MAX_SIGNED_16BIT_INTEGER)
return Int16Array;
if (maxIndex <= MAX_SIGNED_32BIT_INTEGER)
return Int32Array;
return Float64Array;
};
exports.getNumberType = function(value) {
if (value === (value | 0)) {
if (Math.sign(value) === -1) {
if (value <= 127 && value >= -128)
return Int8Array;
if (value <= 32767 && value >= -32768)
return Int16Array;
return Int32Array;
} else {
if (value <= 255)
return Uint8Array;
if (value <= 65535)
return Uint16Array;
return Uint32Array;
}
}
return Float64Array;
};
var TYPE_PRIORITY = {
Uint8Array: 1,
Int8Array: 2,
Uint16Array: 3,
Int16Array: 4,
Uint32Array: 5,
Int32Array: 6,
Float32Array: 7,
Float64Array: 8
};
exports.getMinimalRepresentation = function(array, getter) {
var maxType = null, maxPriority = 0, p, t, v, i, l;
for (i = 0, l = array.length; i < l; i++) {
v = getter ? getter(array[i]) : array[i];
t = exports.getNumberType(v);
p = TYPE_PRIORITY[t.name];
if (p > maxPriority) {
maxPriority = p;
maxType = t;
}
}
return maxType;
};
exports.isTypedArray = function(value) {
return typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView(value);
};
exports.concat = function() {
var length = 0, i, o, l;
for (i = 0, l = arguments.length; i < l; i++)
length += arguments[i].length;
var array = new arguments[0].constructor(length);
for (i = 0, o = 0; i < l; i++) {
array.set(arguments[i], o);
o += arguments[i].length;
}
return array;
};
exports.indices = function(length) {
var PointerArray = exports.getPointerArray(length);
var array = new PointerArray(length);
for (var i = 0; i < length; i++)
array[i] = i;
return array;
};
}
});
// node_modules/mnemonist/utils/iterables.js
var require_iterables = __commonJS({
"node_modules/mnemonist/utils/iterables.js"(exports) {
var forEach = require_foreach();
var typed = require_typed_arrays();
function isArrayLike(target) {
return Array.isArray(target) || typed.isTypedArray(target);
}
function guessLength(target) {
if (typeof target.length === "number")
return target.length;
if (typeof target.size === "number")
return target.size;
return;
}
function toArray(target) {
var l = guessLength(target);
var array = typeof l === "number" ? new Array(l) : [];
var i = 0;
forEach(target, function(value) {
array[i++] = value;
});
return array;
}
function toArrayWithIndices(target) {
var l = guessLength(target);
var IndexArray = typeof l === "number" ? typed.getPointerArray(l) : Array;
var array = typeof l === "number" ? new Array(l) : [];
var indices = typeof l === "number" ? new IndexArray(l) : [];
var i = 0;
forEach(target, function(value) {
array[i] = value;
indices[i] = i++;
});
return [array, indices];
}
exports.isArrayLike = isArrayLike;
exports.guessLength = guessLength;
exports.toArray = toArray;
exports.toArrayWithIndices = toArrayWithIndices;
}
});
// node_modules/obliterator/iterator.js
var require_iterator = __commonJS({
"node_modules/obliterator/iterator.js"(exports, module2) {
function Iterator(next) {
if (typeof next !== "function")
throw new Error("obliterator/iterator: expecting a function!");
this.next = next;
}
if (typeof Symbol !== "undefined")
Iterator.prototype[Symbol.iterator] = function() {
return this;
};
Iterator.of = function() {
var args = arguments, l = args.length, i = 0;
return new Iterator(function() {
if (i >= l)
return { done: true };
return { done: false, value: args[i++] };
});
};
Iterator.empty = function() {
var iterator = new Iterator(function() {
return { done: true };
});
return iterator;
};
Iterator.fromSequence = function(sequence) {
var i = 0, l = sequence.length;
return new Iterator(function() {
if (i >= l)
return { done: true };
return { done: false, value: sequence[i++] };
});
};
Iterator.is = function(value) {
if (value instanceof Iterator)
return true;
return typeof value === "object" && value !== null && typeof value.next === "function";
};
module2.exports = Iterator;
}
});
// node_modules/mnemonist/fixed-deque.js
var require_fixed_deque = __commonJS({
"node_modules/mnemonist/fixed-deque.js"(exports, module2) {
var iterables = require_iterables();
var Iterator = require_iterator();
function FixedDeque(ArrayClass, capacity) {
if (arguments.length < 2)
throw new Error("mnemonist/fixed-deque: expecting an Array class and a capacity.");
if (typeof capacity !== "number" || capacity <= 0)
throw new Error("mnemonist/fixed-deque: `capacity` should be a positive number.");
this.ArrayClass = ArrayClass;
this.capacity = capacity;
this.items = new ArrayClass(this.capacity);
this.clear();
}
FixedDeque.prototype.clear = function() {
this.start = 0;
this.size = 0;
};
FixedDeque.prototype.push = function(item) {
if (this.size === this.capacity)
throw new Error("mnemonist/fixed-deque.push: deque capacity (" + this.capacity + ") exceeded!");
var index2 = (this.start + this.size) % this.capacity;
this.items[index2] = item;
return ++this.size;
};
FixedDeque.prototype.unshift = function(item) {
if (this.size === this.capacity)
throw new Error("mnemonist/fixed-deque.unshift: deque capacity (" + this.capacity + ") exceeded!");
var index2 = this.start - 1;
if (this.start === 0)
index2 = this.capacity - 1;
this.items[index2] = item;
this.start = index2;
return ++this.size;
};
FixedDeque.prototype.pop = function() {
if (this.size === 0)
return;
const index2 = (this.start + this.size - 1) % this.capacity;
this.size--;
return this.items[index2];
};
FixedDeque.prototype.shift = function() {
if (this.size === 0)
return;
var index2 = this.start;
this.size--;
this.start++;
if (this.start === this.capacity)
this.start = 0;
return this.items[index2];
};
FixedDeque.prototype.peekFirst = function() {
if (this.size === 0)
return;
return this.items[this.start];
};
FixedDeque.prototype.peekLast = function() {
if (this.size === 0)
return;
var index2 = this.start + this.size - 1;
if (index2 > this.capacity)
index2 -= this.capacity;
return this.items[index2];
};
FixedDeque.prototype.get = function(index2) {
if (this.size === 0)
return;
index2 = this.start + index2;
if (index2 > this.capacity)
index2 -= this.capacity;
return this.items[index2];
};
FixedDeque.prototype.forEach = function(callback, scope) {
scope = arguments.length > 1 ? scope : this;
var c3 = this.capacity, l = this.size, i = this.start, j = 0;
while (j < l) {
callback.call(scope, this.items[i], j, this);
i++;
j++;
if (i === c3)
i = 0;
}
};
FixedDeque.prototype.toArray = function() {
var offset = this.start + this.size;
if (offset < this.capacity)
return this.items.slice(this.start, offset);
var array = new this.ArrayClass(this.size), c3 = this.capacity, l = this.size, i = this.start, j = 0;
while (j < l) {
array[j] = this.items[i];
i++;
j++;
if (i === c3)
i = 0;
}
return array;
};
FixedDeque.prototype.values = function() {
var items = this.items, c3 = this.capacity, l = this.size, i = this.start, j = 0;
return new Iterator(function() {
if (j >= l)
return {
done: true
};
var value = items[i];
i++;
j++;
if (i === c3)
i = 0;
return {
value,
done: false
};
});
};
FixedDeque.prototype.entries = function() {
var items = this.items, c3 = this.capacity, l = this.size, i = this.start, j = 0;
return new Iterator(function() {
if (j >= l)
return {
done: true
};
var value = items[i];
i++;
if (i === c3)
i = 0;
return {
value: [j++, value],
done: false
};
});
};
if (typeof Symbol !== "undefined")
FixedDeque.prototype[Symbol.iterator] = FixedDeque.prototype.values;
FixedDeque.prototype.inspect = function() {
var array = this.toArray();
array.type = this.ArrayClass.name;
array.capacity = this.capacity;
Object.defineProperty(array, "constructor", {
value: FixedDeque,
enumerable: false
});
return array;
};
if (typeof Symbol !== "undefined")
FixedDeque.prototype[Symbol.for("nodejs.util.inspect.custom")] = FixedDeque.prototype.inspect;
FixedDeque.from = function(iterable, ArrayClass, capacity) {
if (arguments.length < 3) {
capacity = iterables.guessLength(iterable);
if (typeof capacity !== "number")
throw new Error("mnemonist/fixed-deque.from: could not guess iterable length. Please provide desired capacity as last argument.");
}
var deque = new FixedDeque(ArrayClass, capacity);
if (iterables.isArrayLike(iterable)) {
var i, l;
for (i = 0, l = iterable.length; i < l; i++)
deque.items[i] = iterable[i];
deque.size = l;
return deque;
}
iterables.forEach(iterable, function(value) {
deque.push(value);
});
return deque;
};
module2.exports = FixedDeque;
}
});
// node_modules/graphology-traversal/utils.js
var require_utils = __commonJS({
"node_modules/graphology-traversal/utils.js"(exports) {
function TraversalRecord(node, attr2, depth) {
this.node = node;
this.attributes = attr2;
this.depth = depth;
}
exports.TraversalRecord = TraversalRecord;
}
});
// node_modules/graphology-traversal/bfs.js
var require_bfs = __commonJS({
"node_modules/graphology-traversal/bfs.js"(exports) {
var isGraph = require_is_graph();
var FixedDeque = require_fixed_deque();
var TraversalRecord = require_utils().TraversalRecord;
function bfs(graph, callback) {
if (!isGraph(graph))
throw new Error("graphology-traversal/bfs: expecting a graphology instance.");
if (typeof callback !== "function")
throw new Error("graphology-traversal/bfs: given callback is not a function.");
if (graph.order === 0)
return;
var seen = /* @__PURE__ */ new Set();
var queue = new FixedDeque(Array, graph.order);
var record, depth;
function neighborCallback(neighbor, attr2) {
if (seen.has(neighbor))
return;
seen.add(neighbor);
queue.push(new TraversalRecord(neighbor, attr2, depth + 1));
}
graph.forEachNode(function(node, attr2) {
if (seen.has(node))
return;
seen.add(node);
queue.push(new TraversalRecord(node, attr2, 0));
while (queue.size !== 0) {
record = queue.shift();
depth = record.depth;
callback(record.node, record.attributes, depth);
graph.forEachOutboundNeighbor(record.node, neighborCallback);
}
});
}
function bfsFromNode(graph, node, callback) {
if (!isGraph(graph))
throw new Error("graphology-traversal/dfs: expecting a graphology instance.");
if (typeof callback !== "function")
throw new Error("graphology-traversal/dfs: given callback is not a function.");
if (graph.order === 0)
return;
node = "" + node;
var seen = /* @__PURE__ */ new Set();
var queue = new FixedDeque(Array, graph.order);
var depth, record;
function neighborCallback(neighbor, attr2) {
if (seen.has(neighbor))
return;
seen.add(neighbor);
queue.push(new TraversalRecord(neighbor, attr2, depth + 1));
}
seen.add(node);
queue.push(new TraversalRecord(node, graph.getNodeAttributes(node), 0));
while (queue.size !== 0) {
record = queue.shift();
depth = record.depth;
callback(record.node, record.attributes, depth);
graph.forEachOutboundNeighbor(record.node, neighborCallback);
}
}
exports.bfs = bfs;
exports.bfsFromNode = bfsFromNode;
}
});
// node_modules/graphology-traversal/dfs.js
var require_dfs = __commonJS({
"node_modules/graphology-traversal/dfs.js"(exports) {
var isGraph = require_is_graph();
var TraversalRecord = require_utils().TraversalRecord;
function dfs(graph, callback) {
if (!isGraph(graph))
throw new Error("graphology-traversal/dfs: expecting a graphology instance.");
if (typeof callback !== "function")
throw new Error("graphology-traversal/dfs: given callback is not a function.");
if (graph.order === 0)
return;
var seen = /* @__PURE__ */ new Set();
var stack = [];
var depth, record;
function neighborCallback(neighbor, attr2) {
if (seen.has(neighbor))
return;
seen.add(neighbor);
stack.push(new TraversalRecord(neighbor, attr2, depth + 1));
}
graph.forEachNode(function(node, attr2) {
if (seen.has(node))
return;
seen.add(node);
stack.push(new TraversalRecord(node, attr2, 0));
while (stack.length !== 0) {
record = stack.pop();
depth = record.depth;
callback(record.node, record.attributes, depth);
graph.forEachOutboundNeighbor(record.node, neighborCallback);
}
});
}
function dfsFromNode2(graph, node, callback) {
if (!isGraph(graph))
throw new Error("graphology-traversal/dfs: expecting a graphology instance.");
if (typeof callback !== "function")
throw new Error("graphology-traversal/dfs: given callback is not a function.");
if (graph.order === 0)
return;
node = "" + node;
var seen = /* @__PURE__ */ new Set();
var stack = [];
var depth, record;
function neighborCallback(neighbor, attr2) {
if (seen.has(neighbor))
return;
seen.add(neighbor);
stack.push(new TraversalRecord(neighbor, attr2, depth + 1));
}
seen.add(node);
stack.push(new TraversalRecord(node, graph.getNodeAttributes(node), 0));
while (stack.length !== 0) {
record = stack.pop();
depth = record.depth;
callback(record.node, record.attributes, depth);
graph.forEachOutboundNeighbor(record.node, neighborCallback);
}
}
exports.dfs = dfs;
exports.dfsFromNode = dfsFromNode2;
}
});
// node_modules/graphology-traversal/index.js
var require_graphology_traversal = __commonJS({
"node_modules/graphology-traversal/index.js"(exports) {
var bfsModule = require_bfs();
var dfsModule = require_dfs();
var k;
for (k in bfsModule)
exports[k] = bfsModule[k];
for (k in dfsModule)
exports[k] = dfsModule[k];
}
});
// node_modules/luxon/build/cjs-browser/luxon.js
var require_luxon = __commonJS({
"node_modules/luxon/build/cjs-browser/luxon.js"(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor)
descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps)
_defineProperties(Constructor.prototype, protoProps);
if (staticProps)
_defineProperties(Constructor, staticProps);
return Constructor;
}
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);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
return o2.__proto__ || Object.getPrototypeOf(o2);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) {
o2.__proto__ = p2;
return o2;
};
return _setPrototypeOf(o, p);
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct)
return false;
if (Reflect.construct.sham)
return false;
if (typeof Proxy === "function")
return true;
try {
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
}));
return true;
} catch (e) {
return false;
}
}
function _construct(Parent, args, Class) {
if (_isNativeReflectConstruct()) {
_construct = Reflect.construct;
} else {
_construct = function _construct2(Parent2, args2, Class2) {
var a2 = [null];
a2.push.apply(a2, args2);
var Constructor = Function.bind.apply(Parent2, a2);
var instance24 = new Constructor();
if (Class2)
_setPrototypeOf(instance24, Class2.prototype);
return instance24;
};
}
return _construct.apply(null, arguments);
}
function _isNativeFunction(fn) {
return Function.toString.call(fn).indexOf("[native code]") !== -1;
}
function _wrapNativeSuper(Class) {
var _cache = typeof Map === "function" ? /* @__PURE__ */ new Map() : void 0;
_wrapNativeSuper = function _wrapNativeSuper2(Class2) {
if (Class2 === null || !_isNativeFunction(Class2))
return Class2;
if (typeof Class2 !== "function") {
throw new TypeError("Super expression must either be null or a function");
}
if (typeof _cache !== "undefined") {
if (_cache.has(Class2))
return _cache.get(Class2);
_cache.set(Class2, Wrapper);
}
function Wrapper() {
return _construct(Class2, arguments, _getPrototypeOf(this).constructor);
}
Wrapper.prototype = Object.create(Class2.prototype, {
constructor: {
value: Wrapper,
enumerable: false,
writable: true,
configurable: true
}
});
return _setPrototypeOf(Wrapper, Class2);
};
return _wrapNativeSuper(Class);
}
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null)
return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0)
continue;
target[key] = source[key];
}
return target;
}
function _unsupportedIterableToArray(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++)
arr2[i] = arr[i];
return arr2;
}
function _createForOfIteratorHelperLoose(o, allowArrayLike) {
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
if (it)
return (it = it.call(o)).next.bind(it);
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
if (it)
o = it;
var i = 0;
return function() {
if (i >= o.length)
return {
done: true
};
return {
done: false,
value: o[i++]
};
};
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var LuxonError = /* @__PURE__ */ function(_Error) {
_inheritsLoose(LuxonError2, _Error);
function LuxonError2() {
return _Error.apply(this, arguments) || this;
}
return LuxonError2;
}(/* @__PURE__ */ _wrapNativeSuper(Error));
var InvalidDateTimeError = /* @__PURE__ */ function(_LuxonError) {
_inheritsLoose(InvalidDateTimeError2, _LuxonError);
function InvalidDateTimeError2(reason) {
return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this;
}
return InvalidDateTimeError2;
}(LuxonError);
var InvalidIntervalError = /* @__PURE__ */ function(_LuxonError2) {
_inheritsLoose(InvalidIntervalError2, _LuxonError2);
function InvalidIntervalError2(reason) {
return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this;
}
return InvalidIntervalError2;
}(LuxonError);
var InvalidDurationError = /* @__PURE__ */ function(_LuxonError3) {
_inheritsLoose(InvalidDurationError2, _LuxonError3);
function InvalidDurationError2(reason) {
return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this;
}
return InvalidDurationError2;
}(LuxonError);
var ConflictingSpecificationError = /* @__PURE__ */ function(_LuxonError4) {
_inheritsLoose(ConflictingSpecificationError2, _LuxonError4);
function ConflictingSpecificationError2() {
return _LuxonError4.apply(this, arguments) || this;
}
return ConflictingSpecificationError2;
}(LuxonError);
var InvalidUnitError = /* @__PURE__ */ function(_LuxonError5) {
_inheritsLoose(InvalidUnitError2, _LuxonError5);
function InvalidUnitError2(unit2) {
return _LuxonError5.call(this, "Invalid unit " + unit2) || this;
}
return InvalidUnitError2;
}(LuxonError);
var InvalidArgumentError = /* @__PURE__ */ function(_LuxonError6) {
_inheritsLoose(InvalidArgumentError2, _LuxonError6);
function InvalidArgumentError2() {
return _LuxonError6.apply(this, arguments) || this;
}
return InvalidArgumentError2;
}(LuxonError);
var ZoneIsAbstractError = /* @__PURE__ */ function(_LuxonError7) {
_inheritsLoose(ZoneIsAbstractError2, _LuxonError7);
function ZoneIsAbstractError2() {
return _LuxonError7.call(this, "Zone is an abstract class") || this;
}
return ZoneIsAbstractError2;
}(LuxonError);
var n = "numeric";
var s = "short";
var l = "long";
var DATE_SHORT = {
year: n,
month: n,
day: n
};
var DATE_MED = {
year: n,
month: s,
day: n
};
var DATE_MED_WITH_WEEKDAY = {
year: n,
month: s,
day: n,
weekday: s
};
var DATE_FULL = {
year: n,
month: l,
day: n
};
var DATE_HUGE = {
year: n,
month: l,
day: n,
weekday: l
};
var TIME_SIMPLE = {
hour: n,
minute: n
};
var TIME_WITH_SECONDS = {
hour: n,
minute: n,
second: n
};
var TIME_WITH_SHORT_OFFSET = {
hour: n,
minute: n,
second: n,
timeZoneName: s
};
var TIME_WITH_LONG_OFFSET = {
hour: n,
minute: n,
second: n,
timeZoneName: l
};
var TIME_24_SIMPLE = {
hour: n,
minute: n,
hourCycle: "h23"
};
var TIME_24_WITH_SECONDS = {
hour: n,
minute: n,
second: n,
hourCycle: "h23"
};
var TIME_24_WITH_SHORT_OFFSET = {
hour: n,
minute: n,
second: n,
hourCycle: "h23",
timeZoneName: s
};
var TIME_24_WITH_LONG_OFFSET = {
hour: n,
minute: n,
second: n,
hourCycle: "h23",
timeZoneName: l
};
var DATETIME_SHORT = {
year: n,
month: n,
day: n,
hour: n,
minute: n
};
var DATETIME_SHORT_WITH_SECONDS = {
year: n,
month: n,
day: n,
hour: n,
minute: n,
second: n
};
var DATETIME_MED = {
year: n,
month: s,
day: n,
hour: n,
minute: n
};
var DATETIME_MED_WITH_SECONDS = {
year: n,
month: s,
day: n,
hour: n,
minute: n,
second: n
};
var DATETIME_MED_WITH_WEEKDAY = {
year: n,
month: s,
day: n,
weekday: s,
hour: n,
minute: n
};
var DATETIME_FULL = {
year: n,
month: l,
day: n,
hour: n,
minute: n,
timeZoneName: s
};
var DATETIME_FULL_WITH_SECONDS = {
year: n,
month: l,
day: n,
hour: n,
minute: n,
second: n,
timeZoneName: s
};
var DATETIME_HUGE = {
year: n,
month: l,
day: n,
weekday: l,
hour: n,
minute: n,
timeZoneName: l
};
var DATETIME_HUGE_WITH_SECONDS = {
year: n,
month: l,
day: n,
weekday: l,
hour: n,
minute: n,
second: n,
timeZoneName: l
};
function isUndefined(o) {
return typeof o === "undefined";
}
function isNumber(o) {
return typeof o === "number";
}
function isInteger(o) {
return typeof o === "number" && o % 1 === 0;
}
function isString(o) {
return typeof o === "string";
}
function isDate(o) {
return Object.prototype.toString.call(o) === "[object Date]";
}
function hasRelative() {
try {
return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat;
} catch (e) {
return false;
}
}
function maybeArray(thing) {
return Array.isArray(thing) ? thing : [thing];
}
function bestBy(arr, by, compare) {
if (arr.length === 0) {
return void 0;
}
return arr.reduce(function(best, next) {
var pair = [by(next), next];
if (!best) {
return pair;
} else if (compare(best[0], pair[0]) === best[0]) {
return best;
} else {
return pair;
}
}, null)[1];
}
function pick(obj, keys) {
return keys.reduce(function(a2, k) {
a2[k] = obj[k];
return a2;
}, {});
}
function hasOwnProperty(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
function integerBetween(thing, bottom, top) {
return isInteger(thing) && thing >= bottom && thing <= top;
}
function floorMod(x4, n2) {
return x4 - n2 * Math.floor(x4 / n2);
}
function padStart(input, n2) {
if (n2 === void 0) {
n2 = 2;
}
var isNeg = input < 0;
var padded;
if (isNeg) {
padded = "-" + ("" + -input).padStart(n2, "0");
} else {
padded = ("" + input).padStart(n2, "0");
}
return padded;
}
function parseInteger(string) {
if (isUndefined(string) || string === null || string === "") {
return void 0;
} else {
return parseInt(string, 10);
}
}
function parseFloating(string) {
if (isUndefined(string) || string === null || string === "") {
return void 0;
} else {
return parseFloat(string);
}
}
function parseMillis(fraction) {
if (isUndefined(fraction) || fraction === null || fraction === "") {
return void 0;
} else {
var f = parseFloat("0." + fraction) * 1e3;
return Math.floor(f);
}
}
function roundTo(number3, digits, towardZero) {
if (towardZero === void 0) {
towardZero = false;
}
var factor = Math.pow(10, digits), rounder = towardZero ? Math.trunc : Math.round;
return rounder(number3 * factor) / factor;
}
function isLeapYear(year) {
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}
function daysInYear(year) {
return isLeapYear(year) ? 366 : 365;
}
function daysInMonth(year, month) {
var modMonth = floorMod(month - 1, 12) + 1, modYear = year + (month - modMonth) / 12;
if (modMonth === 2) {
return isLeapYear(modYear) ? 29 : 28;
} else {
return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];
}
}
function objToLocalTS(obj) {
var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond);
if (obj.year < 100 && obj.year >= 0) {
d = new Date(d);
d.setUTCFullYear(d.getUTCFullYear() - 1900);
}
return +d;
}
function weeksInWeekYear(weekYear) {
var p1 = (weekYear + Math.floor(weekYear / 4) - Math.floor(weekYear / 100) + Math.floor(weekYear / 400)) % 7, last = weekYear - 1, p2 = (last + Math.floor(last / 4) - Math.floor(last / 100) + Math.floor(last / 400)) % 7;
return p1 === 4 || p2 === 3 ? 53 : 52;
}
function untruncateYear(year) {
if (year > 99) {
return year;
} else
return year > 60 ? 1900 + year : 2e3 + year;
}
function parseZoneInfo(ts, offsetFormat, locale2, timeZone) {
if (timeZone === void 0) {
timeZone = null;
}
var date = new Date(ts), intlOpts = {
hourCycle: "h23",
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit"
};
if (timeZone) {
intlOpts.timeZone = timeZone;
}
var modified = _extends({
timeZoneName: offsetFormat
}, intlOpts);
var parsed = new Intl.DateTimeFormat(locale2, modified).formatToParts(date).find(function(m2) {
return m2.type.toLowerCase() === "timezonename";
});
return parsed ? parsed.value : null;
}
function signedOffset(offHourStr, offMinuteStr) {
var offHour = parseInt(offHourStr, 10);
if (Number.isNaN(offHour)) {
offHour = 0;
}
var offMin = parseInt(offMinuteStr, 10) || 0, offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;
return offHour * 60 + offMinSigned;
}
function asNumber(value) {
var numericValue = Number(value);
if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue))
throw new InvalidArgumentError("Invalid unit value " + value);
return numericValue;
}
function normalizeObject(obj, normalizer) {
var normalized = {};
for (var u in obj) {
if (hasOwnProperty(obj, u)) {
var v = obj[u];
if (v === void 0 || v === null)
continue;
normalized[normalizer(u)] = asNumber(v);
}
}
return normalized;
}
function formatOffset(offset2, format2) {
var hours = Math.trunc(Math.abs(offset2 / 60)), minutes = Math.trunc(Math.abs(offset2 % 60)), sign = offset2 >= 0 ? "+" : "-";
switch (format2) {
case "short":
return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2);
case "narrow":
return "" + sign + hours + (minutes > 0 ? ":" + minutes : "");
case "techie":
return "" + sign + padStart(hours, 2) + padStart(minutes, 2);
default:
throw new RangeError("Value format " + format2 + " is out of range for property format");
}
}
function timeObject(obj) {
return pick(obj, ["hour", "minute", "second", "millisecond"]);
}
var ianaRegex = /[A-Za-z_+-]{1,256}(:?\/[A-Za-z0-9_+-]{1,256}(\/[A-Za-z0-9_+-]{1,256})?)?/;
var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"];
function months(length) {
switch (length) {
case "narrow":
return [].concat(monthsNarrow);
case "short":
return [].concat(monthsShort);
case "long":
return [].concat(monthsLong);
case "numeric":
return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"];
case "2-digit":
return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"];
default:
return null;
}
}
var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"];
function weekdays(length) {
switch (length) {
case "narrow":
return [].concat(weekdaysNarrow);
case "short":
return [].concat(weekdaysShort);
case "long":
return [].concat(weekdaysLong);
case "numeric":
return ["1", "2", "3", "4", "5", "6", "7"];
default:
return null;
}
}
var meridiems = ["AM", "PM"];
var erasLong = ["Before Christ", "Anno Domini"];
var erasShort = ["BC", "AD"];
var erasNarrow = ["B", "A"];
function eras(length) {
switch (length) {
case "narrow":
return [].concat(erasNarrow);
case "short":
return [].concat(erasShort);
case "long":
return [].concat(erasLong);
default:
return null;
}
}
function meridiemForDateTime(dt) {
return meridiems[dt.hour < 12 ? 0 : 1];
}
function weekdayForDateTime(dt, length) {
return weekdays(length)[dt.weekday - 1];
}
function monthForDateTime(dt, length) {
return months(length)[dt.month - 1];
}
function eraForDateTime(dt, length) {
return eras(length)[dt.year < 0 ? 0 : 1];
}
function formatRelativeTime(unit2, count2, numeric, narrow) {
if (numeric === void 0) {
numeric = "always";
}
if (narrow === void 0) {
narrow = false;
}
var units = {
years: ["year", "yr."],
quarters: ["quarter", "qtr."],
months: ["month", "mo."],
weeks: ["week", "wk."],
days: ["day", "day", "days"],
hours: ["hour", "hr."],
minutes: ["minute", "min."],
seconds: ["second", "sec."]
};
var lastable = ["hours", "minutes", "seconds"].indexOf(unit2) === -1;
if (numeric === "auto" && lastable) {
var isDay = unit2 === "days";
switch (count2) {
case 1:
return isDay ? "tomorrow" : "next " + units[unit2][0];
case -1:
return isDay ? "yesterday" : "last " + units[unit2][0];
case 0:
return isDay ? "today" : "this " + units[unit2][0];
}
}
var isInPast = Object.is(count2, -0) || count2 < 0, fmtValue = Math.abs(count2), singular = fmtValue === 1, lilUnits = units[unit2], fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit2][0] : unit2;
return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit;
}
function stringifyTokens(splits, tokenToString) {
var s2 = "";
for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done; ) {
var token = _step.value;
if (token.literal) {
s2 += token.val;
} else {
s2 += tokenToString(token.val);
}
}
return s2;
}
var _macroTokenToFormatOpts = {
D: DATE_SHORT,
DD: DATE_MED,
DDD: DATE_FULL,
DDDD: DATE_HUGE,
t: TIME_SIMPLE,
tt: TIME_WITH_SECONDS,
ttt: TIME_WITH_SHORT_OFFSET,
tttt: TIME_WITH_LONG_OFFSET,
T: TIME_24_SIMPLE,
TT: TIME_24_WITH_SECONDS,
TTT: TIME_24_WITH_SHORT_OFFSET,
TTTT: TIME_24_WITH_LONG_OFFSET,
f: DATETIME_SHORT,
ff: DATETIME_MED,
fff: DATETIME_FULL,
ffff: DATETIME_HUGE,
F: DATETIME_SHORT_WITH_SECONDS,
FF: DATETIME_MED_WITH_SECONDS,
FFF: DATETIME_FULL_WITH_SECONDS,
FFFF: DATETIME_HUGE_WITH_SECONDS
};
var Formatter = /* @__PURE__ */ function() {
Formatter2.create = function create2(locale2, opts) {
if (opts === void 0) {
opts = {};
}
return new Formatter2(locale2, opts);
};
Formatter2.parseFormat = function parseFormat(fmt) {
var current = null, currentFull = "", bracketed = false;
var splits = [];
for (var i = 0; i < fmt.length; i++) {
var c3 = fmt.charAt(i);
if (c3 === "'") {
if (currentFull.length > 0) {
splits.push({
literal: bracketed,
val: currentFull
});
}
current = null;
currentFull = "";
bracketed = !bracketed;
} else if (bracketed) {
currentFull += c3;
} else if (c3 === current) {
currentFull += c3;
} else {
if (currentFull.length > 0) {
splits.push({
literal: false,
val: currentFull
});
}
currentFull = c3;
current = c3;
}
}
if (currentFull.length > 0) {
splits.push({
literal: bracketed,
val: currentFull
});
}
return splits;
};
Formatter2.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) {
return _macroTokenToFormatOpts[token];
};
function Formatter2(locale2, formatOpts) {
this.opts = formatOpts;
this.loc = locale2;
this.systemLoc = null;
}
var _proto = Formatter2.prototype;
_proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) {
if (this.systemLoc === null) {
this.systemLoc = this.loc.redefaultToSystem();
}
var df = this.systemLoc.dtFormatter(dt, _extends({}, this.opts, opts));
return df.format();
};
_proto.formatDateTime = function formatDateTime(dt, opts) {
if (opts === void 0) {
opts = {};
}
var df = this.loc.dtFormatter(dt, _extends({}, this.opts, opts));
return df.format();
};
_proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) {
if (opts === void 0) {
opts = {};
}
var df = this.loc.dtFormatter(dt, _extends({}, this.opts, opts));
return df.formatToParts();
};
_proto.resolvedOptions = function resolvedOptions(dt, opts) {
if (opts === void 0) {
opts = {};
}
var df = this.loc.dtFormatter(dt, _extends({}, this.opts, opts));
return df.resolvedOptions();
};
_proto.num = function num(n2, p) {
if (p === void 0) {
p = 0;
}
if (this.opts.forceSimple) {
return padStart(n2, p);
}
var opts = _extends({}, this.opts);
if (p > 0) {
opts.padTo = p;
}
return this.loc.numberFormatter(opts).format(n2);
};
_proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) {
var _this = this;
var knownEnglish = this.loc.listingMode() === "en", useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", string = function string2(opts, extract) {
return _this.loc.extract(dt, opts, extract);
}, formatOffset2 = function formatOffset3(opts) {
if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {
return "Z";
}
return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : "";
}, meridiem = function meridiem2() {
return knownEnglish ? meridiemForDateTime(dt) : string({
hour: "numeric",
hourCycle: "h12"
}, "dayperiod");
}, month = function month2(length, standalone) {
return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? {
month: length
} : {
month: length,
day: "numeric"
}, "month");
}, weekday = function weekday2(length, standalone) {
return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? {
weekday: length
} : {
weekday: length,
month: "long",
day: "numeric"
}, "weekday");
}, maybeMacro = function maybeMacro2(token) {
var formatOpts = Formatter2.macroTokenToFormatOpts(token);
if (formatOpts) {
return _this.formatWithSystemDefault(dt, formatOpts);
} else {
return token;
}
}, era = function era2(length) {
return knownEnglish ? eraForDateTime(dt, length) : string({
era: length
}, "era");
}, tokenToString = function tokenToString2(token) {
switch (token) {
case "S":
return _this.num(dt.millisecond);
case "u":
case "SSS":
return _this.num(dt.millisecond, 3);
case "s":
return _this.num(dt.second);
case "ss":
return _this.num(dt.second, 2);
case "uu":
return _this.num(Math.floor(dt.millisecond / 10), 2);
case "uuu":
return _this.num(Math.floor(dt.millisecond / 100));
case "m":
return _this.num(dt.minute);
case "mm":
return _this.num(dt.minute, 2);
case "h":
return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);
case "hh":
return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);
case "H":
return _this.num(dt.hour);
case "HH":
return _this.num(dt.hour, 2);
case "Z":
return formatOffset2({
format: "narrow",
allowZ: _this.opts.allowZ
});
case "ZZ":
return formatOffset2({
format: "short",
allowZ: _this.opts.allowZ
});
case "ZZZ":
return formatOffset2({
format: "techie",
allowZ: _this.opts.allowZ
});
case "ZZZZ":
return dt.zone.offsetName(dt.ts, {
format: "short",
locale: _this.loc.locale
});
case "ZZZZZ":
return dt.zone.offsetName(dt.ts, {
format: "long",
locale: _this.loc.locale
});
case "z":
return dt.zoneName;
case "a":
return meridiem();
case "d":
return useDateTimeFormatter ? string({
day: "numeric"
}, "day") : _this.num(dt.day);
case "dd":
return useDateTimeFormatter ? string({
day: "2-digit"
}, "day") : _this.num(dt.day, 2);
case "c":
return _this.num(dt.weekday);
case "ccc":
return weekday("short", true);
case "cccc":
return weekday("long", true);
case "ccccc":
return weekday("narrow", true);
case "E":
return _this.num(dt.weekday);
case "EEE":
return weekday("short", false);
case "EEEE":
return weekday("long", false);
case "EEEEE":
return weekday("narrow", false);
case "L":
return useDateTimeFormatter ? string({
month: "numeric",
day: "numeric"
}, "month") : _this.num(dt.month);
case "LL":
return useDateTimeFormatter ? string({
month: "2-digit",
day: "numeric"
}, "month") : _this.num(dt.month, 2);
case "LLL":
return month("short", true);
case "LLLL":
return month("long", true);
case "LLLLL":
return month("narrow", true);
case "M":
return useDateTimeFormatter ? string({
month: "numeric"
}, "month") : _this.num(dt.month);
case "MM":
return useDateTimeFormatter ? string({
month: "2-digit"
}, "month") : _this.num(dt.month, 2);
case "MMM":
return month("short", false);
case "MMMM":
return month("long", false);
case "MMMMM":
return month("narrow", false);
case "y":
return useDateTimeFormatter ? string({
year: "numeric"
}, "year") : _this.num(dt.year);
case "yy":
return useDateTimeFormatter ? string({
year: "2-digit"
}, "year") : _this.num(dt.year.toString().slice(-2), 2);
case "yyyy":
return useDateTimeFormatter ? string({
year: "numeric"
}, "year") : _this.num(dt.year, 4);
case "yyyyyy":
return useDateTimeFormatter ? string({
year: "numeric"
}, "year") : _this.num(dt.year, 6);
case "G":
return era("short");
case "GG":
return era("long");
case "GGGGG":
return era("narrow");
case "kk":
return _this.num(dt.weekYear.toString().slice(-2), 2);
case "kkkk":
return _this.num(dt.weekYear, 4);
case "W":
return _this.num(dt.weekNumber);
case "WW":
return _this.num(dt.weekNumber, 2);
case "o":
return _this.num(dt.ordinal);
case "ooo":
return _this.num(dt.ordinal, 3);
case "q":
return _this.num(dt.quarter);
case "qq":
return _this.num(dt.quarter, 2);
case "X":
return _this.num(Math.floor(dt.ts / 1e3));
case "x":
return _this.num(dt.ts);
default:
return maybeMacro(token);
}
};
return stringifyTokens(Formatter2.parseFormat(fmt), tokenToString);
};
_proto.formatDurationFromString = function formatDurationFromString(dur, fmt) {
var _this2 = this;
var tokenToField = function tokenToField2(token) {
switch (token[0]) {
case "S":
return "millisecond";
case "s":
return "second";
case "m":
return "minute";
case "h":
return "hour";
case "d":
return "day";
case "M":
return "month";
case "y":
return "year";
default:
return null;
}
}, tokenToString = function tokenToString2(lildur) {
return function(token) {
var mapped = tokenToField(token);
if (mapped) {
return _this2.num(lildur.get(mapped), token.length);
} else {
return token;
}
};
}, tokens = Formatter2.parseFormat(fmt), realTokens = tokens.reduce(function(found, _ref) {
var literal = _ref.literal, val = _ref.val;
return literal ? found : found.concat(val);
}, []), collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function(t) {
return t;
}));
return stringifyTokens(tokens, tokenToString(collapsed));
};
return Formatter2;
}();
var Invalid = /* @__PURE__ */ function() {
function Invalid2(reason, explanation) {
this.reason = reason;
this.explanation = explanation;
}
var _proto = Invalid2.prototype;
_proto.toMessage = function toMessage() {
if (this.explanation) {
return this.reason + ": " + this.explanation;
} else {
return this.reason;
}
};
return Invalid2;
}();
var Zone = /* @__PURE__ */ function() {
function Zone2() {
}
var _proto = Zone2.prototype;
_proto.offsetName = function offsetName(ts, opts) {
throw new ZoneIsAbstractError();
};
_proto.formatOffset = function formatOffset2(ts, format2) {
throw new ZoneIsAbstractError();
};
_proto.offset = function offset2(ts) {
throw new ZoneIsAbstractError();
};
_proto.equals = function equals(otherZone) {
throw new ZoneIsAbstractError();
};
_createClass(Zone2, [{
key: "type",
get: function get3() {
throw new ZoneIsAbstractError();
}
}, {
key: "name",
get: function get3() {
throw new ZoneIsAbstractError();
}
}, {
key: "isUniversal",
get: function get3() {
throw new ZoneIsAbstractError();
}
}, {
key: "isValid",
get: function get3() {
throw new ZoneIsAbstractError();
}
}]);
return Zone2;
}();
var singleton$1 = null;
var SystemZone = /* @__PURE__ */ function(_Zone) {
_inheritsLoose(SystemZone2, _Zone);
function SystemZone2() {
return _Zone.apply(this, arguments) || this;
}
var _proto = SystemZone2.prototype;
_proto.offsetName = function offsetName(ts, _ref) {
var format2 = _ref.format, locale2 = _ref.locale;
return parseZoneInfo(ts, format2, locale2);
};
_proto.formatOffset = function formatOffset$1(ts, format2) {
return formatOffset(this.offset(ts), format2);
};
_proto.offset = function offset2(ts) {
return -new Date(ts).getTimezoneOffset();
};
_proto.equals = function equals(otherZone) {
return otherZone.type === "system";
};
_createClass(SystemZone2, [{
key: "type",
get: function get3() {
return "system";
}
}, {
key: "name",
get: function get3() {
return new Intl.DateTimeFormat().resolvedOptions().timeZone;
}
}, {
key: "isUniversal",
get: function get3() {
return false;
}
}, {
key: "isValid",
get: function get3() {
return true;
}
}], [{
key: "instance",
get: function get3() {
if (singleton$1 === null) {
singleton$1 = new SystemZone2();
}
return singleton$1;
}
}]);
return SystemZone2;
}(Zone);
var matchingRegex = RegExp("^" + ianaRegex.source + "$");
var dtfCache = {};
function makeDTF(zone) {
if (!dtfCache[zone]) {
dtfCache[zone] = new Intl.DateTimeFormat("en-US", {
hour12: false,
timeZone: zone,
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
second: "2-digit"
});
}
return dtfCache[zone];
}
var typeToPos = {
year: 0,
month: 1,
day: 2,
hour: 3,
minute: 4,
second: 5
};
function hackyOffset(dtf, date) {
var formatted = dtf.format(date).replace(/\u200E/g, ""), parsed = /(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted), fMonth = parsed[1], fDay = parsed[2], fYear = parsed[3], fHour = parsed[4], fMinute = parsed[5], fSecond = parsed[6];
return [fYear, fMonth, fDay, fHour, fMinute, fSecond];
}
function partsOffset(dtf, date) {
var formatted = dtf.formatToParts(date), filled = [];
for (var i = 0; i < formatted.length; i++) {
var _formatted$i = formatted[i], type2 = _formatted$i.type, value = _formatted$i.value, pos = typeToPos[type2];
if (!isUndefined(pos)) {
filled[pos] = parseInt(value, 10);
}
}
return filled;
}
var ianaZoneCache = {};
var IANAZone = /* @__PURE__ */ function(_Zone) {
_inheritsLoose(IANAZone2, _Zone);
IANAZone2.create = function create2(name) {
if (!ianaZoneCache[name]) {
ianaZoneCache[name] = new IANAZone2(name);
}
return ianaZoneCache[name];
};
IANAZone2.resetCache = function resetCache() {
ianaZoneCache = {};
dtfCache = {};
};
IANAZone2.isValidSpecifier = function isValidSpecifier(s2) {
return !!(s2 && s2.match(matchingRegex));
};
IANAZone2.isValidZone = function isValidZone(zone) {
if (!zone) {
return false;
}
try {
new Intl.DateTimeFormat("en-US", {
timeZone: zone
}).format();
return true;
} catch (e) {
return false;
}
};
function IANAZone2(name) {
var _this;
_this = _Zone.call(this) || this;
_this.zoneName = name;
_this.valid = IANAZone2.isValidZone(name);
return _this;
}
var _proto = IANAZone2.prototype;
_proto.offsetName = function offsetName(ts, _ref) {
var format2 = _ref.format, locale2 = _ref.locale;
return parseZoneInfo(ts, format2, locale2, this.name);
};
_proto.formatOffset = function formatOffset$1(ts, format2) {
return formatOffset(this.offset(ts), format2);
};
_proto.offset = function offset2(ts) {
var date = new Date(ts);
if (isNaN(date))
return NaN;
var dtf = makeDTF(this.name), _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), year = _ref2[0], month = _ref2[1], day = _ref2[2], hour = _ref2[3], minute = _ref2[4], second = _ref2[5];
var adjustedHour = hour === 24 ? 0 : hour;
var asUTC = objToLocalTS({
year,
month,
day,
hour: adjustedHour,
minute,
second,
millisecond: 0
});
var asTS = +date;
var over = asTS % 1e3;
asTS -= over >= 0 ? over : 1e3 + over;
return (asUTC - asTS) / (60 * 1e3);
};
_proto.equals = function equals(otherZone) {
return otherZone.type === "iana" && otherZone.name === this.name;
};
_createClass(IANAZone2, [{
key: "type",
get: function get3() {
return "iana";
}
}, {
key: "name",
get: function get3() {
return this.zoneName;
}
}, {
key: "isUniversal",
get: function get3() {
return false;
}
}, {
key: "isValid",
get: function get3() {
return this.valid;
}
}]);
return IANAZone2;
}(Zone);
var singleton = null;
var FixedOffsetZone = /* @__PURE__ */ function(_Zone) {
_inheritsLoose(FixedOffsetZone2, _Zone);
FixedOffsetZone2.instance = function instance24(offset2) {
return offset2 === 0 ? FixedOffsetZone2.utcInstance : new FixedOffsetZone2(offset2);
};
FixedOffsetZone2.parseSpecifier = function parseSpecifier(s2) {
if (s2) {
var r = s2.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);
if (r) {
return new FixedOffsetZone2(signedOffset(r[1], r[2]));
}
}
return null;
};
function FixedOffsetZone2(offset2) {
var _this;
_this = _Zone.call(this) || this;
_this.fixed = offset2;
return _this;
}
var _proto = FixedOffsetZone2.prototype;
_proto.offsetName = function offsetName() {
return this.name;
};
_proto.formatOffset = function formatOffset$1(ts, format2) {
return formatOffset(this.fixed, format2);
};
_proto.offset = function offset2() {
return this.fixed;
};
_proto.equals = function equals(otherZone) {
return otherZone.type === "fixed" && otherZone.fixed === this.fixed;
};
_createClass(FixedOffsetZone2, [{
key: "type",
get: function get3() {
return "fixed";
}
}, {
key: "name",
get: function get3() {
return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow");
}
}, {
key: "isUniversal",
get: function get3() {
return true;
}
}, {
key: "isValid",
get: function get3() {
return true;
}
}], [{
key: "utcInstance",
get: function get3() {
if (singleton === null) {
singleton = new FixedOffsetZone2(0);
}
return singleton;
}
}]);
return FixedOffsetZone2;
}(Zone);
var InvalidZone = /* @__PURE__ */ function(_Zone) {
_inheritsLoose(InvalidZone2, _Zone);
function InvalidZone2(zoneName) {
var _this;
_this = _Zone.call(this) || this;
_this.zoneName = zoneName;
return _this;
}
var _proto = InvalidZone2.prototype;
_proto.offsetName = function offsetName() {
return null;
};
_proto.formatOffset = function formatOffset2() {
return "";
};
_proto.offset = function offset2() {
return NaN;
};
_proto.equals = function equals() {
return false;
};
_createClass(InvalidZone2, [{
key: "type",
get: function get3() {
return "invalid";
}
}, {
key: "name",
get: function get3() {
return this.zoneName;
}
}, {
key: "isUniversal",
get: function get3() {
return false;
}
}, {
key: "isValid",
get: function get3() {
return false;
}
}]);
return InvalidZone2;
}(Zone);
function normalizeZone(input, defaultZone2) {
if (isUndefined(input) || input === null) {
return defaultZone2;
} else if (input instanceof Zone) {
return input;
} else if (isString(input)) {
var lowered = input.toLowerCase();
if (lowered === "local" || lowered === "system")
return defaultZone2;
else if (lowered === "utc" || lowered === "gmt")
return FixedOffsetZone.utcInstance;
else if (IANAZone.isValidSpecifier(lowered))
return IANAZone.create(input);
else
return FixedOffsetZone.parseSpecifier(lowered) || new InvalidZone(input);
} else if (isNumber(input)) {
return FixedOffsetZone.instance(input);
} else if (typeof input === "object" && input.offset && typeof input.offset === "number") {
return input;
} else {
return new InvalidZone(input);
}
}
var now2 = function now3() {
return Date.now();
};
var defaultZone = "system";
var defaultLocale2 = null;
var defaultNumberingSystem = null;
var defaultOutputCalendar = null;
var throwOnInvalid;
var Settings = /* @__PURE__ */ function() {
function Settings2() {
}
Settings2.resetCaches = function resetCaches() {
Locale.resetCache();
IANAZone.resetCache();
};
_createClass(Settings2, null, [{
key: "now",
get: function get3() {
return now2;
},
set: function set3(n2) {
now2 = n2;
}
}, {
key: "defaultZone",
get: function get3() {
return normalizeZone(defaultZone, SystemZone.instance);
},
set: function set3(zone) {
defaultZone = zone;
}
}, {
key: "defaultLocale",
get: function get3() {
return defaultLocale2;
},
set: function set3(locale2) {
defaultLocale2 = locale2;
}
}, {
key: "defaultNumberingSystem",
get: function get3() {
return defaultNumberingSystem;
},
set: function set3(numberingSystem) {
defaultNumberingSystem = numberingSystem;
}
}, {
key: "defaultOutputCalendar",
get: function get3() {
return defaultOutputCalendar;
},
set: function set3(outputCalendar) {
defaultOutputCalendar = outputCalendar;
}
}, {
key: "throwOnInvalid",
get: function get3() {
return throwOnInvalid;
},
set: function set3(t) {
throwOnInvalid = t;
}
}]);
return Settings2;
}();
var _excluded = ["base"];
var _excluded2 = ["padTo", "floor"];
var intlLFCache = {};
function getCachedLF(locString, opts) {
if (opts === void 0) {
opts = {};
}
var key = JSON.stringify([locString, opts]);
var dtf = intlLFCache[key];
if (!dtf) {
dtf = new Intl.ListFormat(locString, opts);
intlLFCache[key] = dtf;
}
return dtf;
}
var intlDTCache = {};
function getCachedDTF(locString, opts) {
if (opts === void 0) {
opts = {};
}
var key = JSON.stringify([locString, opts]);
var dtf = intlDTCache[key];
if (!dtf) {
dtf = new Intl.DateTimeFormat(locString, opts);
intlDTCache[key] = dtf;
}
return dtf;
}
var intlNumCache = {};
function getCachedINF(locString, opts) {
if (opts === void 0) {
opts = {};
}
var key = JSON.stringify([locString, opts]);
var inf = intlNumCache[key];
if (!inf) {
inf = new Intl.NumberFormat(locString, opts);
intlNumCache[key] = inf;
}
return inf;
}
var intlRelCache = {};
function getCachedRTF(locString, opts) {
if (opts === void 0) {
opts = {};
}
var _opts = opts;
_opts.base;
var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, _excluded);
var key = JSON.stringify([locString, cacheKeyOpts]);
var inf = intlRelCache[key];
if (!inf) {
inf = new Intl.RelativeTimeFormat(locString, opts);
intlRelCache[key] = inf;
}
return inf;
}
var sysLocaleCache = null;
function systemLocale() {
if (sysLocaleCache) {
return sysLocaleCache;
} else {
sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;
return sysLocaleCache;
}
}
function parseLocaleString(localeStr) {
var uIndex = localeStr.indexOf("-u-");
if (uIndex === -1) {
return [localeStr];
} else {
var options;
var smaller = localeStr.substring(0, uIndex);
try {
options = getCachedDTF(localeStr).resolvedOptions();
} catch (e) {
options = getCachedDTF(smaller).resolvedOptions();
}
var _options = options, numberingSystem = _options.numberingSystem, calendar = _options.calendar;
return [smaller, numberingSystem, calendar];
}
}
function intlConfigString(localeStr, numberingSystem, outputCalendar) {
if (outputCalendar || numberingSystem) {
localeStr += "-u";
if (outputCalendar) {
localeStr += "-ca-" + outputCalendar;
}
if (numberingSystem) {
localeStr += "-nu-" + numberingSystem;
}
return localeStr;
} else {
return localeStr;
}
}
function mapMonths(f) {
var ms = [];
for (var i = 1; i <= 12; i++) {
var dt = DateTime2.utc(2016, i, 1);
ms.push(f(dt));
}
return ms;
}
function mapWeekdays(f) {
var ms = [];
for (var i = 1; i <= 7; i++) {
var dt = DateTime2.utc(2016, 11, 13 + i);
ms.push(f(dt));
}
return ms;
}
function listStuff(loc, length, defaultOK, englishFn, intlFn) {
var mode = loc.listingMode(defaultOK);
if (mode === "error") {
return null;
} else if (mode === "en") {
return englishFn(length);
} else {
return intlFn(length);
}
}
function supportsFastNumbers(loc) {
if (loc.numberingSystem && loc.numberingSystem !== "latn") {
return false;
} else {
return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === "latn";
}
}
var PolyNumberFormatter = /* @__PURE__ */ function() {
function PolyNumberFormatter2(intl, forceSimple, opts) {
this.padTo = opts.padTo || 0;
this.floor = opts.floor || false;
opts.padTo;
opts.floor;
var otherOpts = _objectWithoutPropertiesLoose(opts, _excluded2);
if (!forceSimple || Object.keys(otherOpts).length > 0) {
var intlOpts = _extends({
useGrouping: false
}, opts);
if (opts.padTo > 0)
intlOpts.minimumIntegerDigits = opts.padTo;
this.inf = getCachedINF(intl, intlOpts);
}
}
var _proto = PolyNumberFormatter2.prototype;
_proto.format = function format2(i) {
if (this.inf) {
var fixed = this.floor ? Math.floor(i) : i;
return this.inf.format(fixed);
} else {
var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3);
return padStart(_fixed, this.padTo);
}
};
return PolyNumberFormatter2;
}();
var PolyDateFormatter = /* @__PURE__ */ function() {
function PolyDateFormatter2(dt, intl, opts) {
this.opts = opts;
var z;
if (dt.zone.isUniversal) {
var gmtOffset = -1 * (dt.offset / 60);
var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset;
if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {
z = offsetZ;
this.dt = dt;
} else {
z = "UTC";
if (opts.timeZoneName) {
this.dt = dt;
} else {
this.dt = dt.offset === 0 ? dt : DateTime2.fromMillis(dt.ts + dt.offset * 60 * 1e3);
}
}
} else if (dt.zone.type === "system") {
this.dt = dt;
} else {
this.dt = dt;
z = dt.zone.name;
}
var intlOpts = _extends({}, this.opts);
if (z) {
intlOpts.timeZone = z;
}
this.dtf = getCachedDTF(intl, intlOpts);
}
var _proto2 = PolyDateFormatter2.prototype;
_proto2.format = function format2() {
return this.dtf.format(this.dt.toJSDate());
};
_proto2.formatToParts = function formatToParts() {
return this.dtf.formatToParts(this.dt.toJSDate());
};
_proto2.resolvedOptions = function resolvedOptions() {
return this.dtf.resolvedOptions();
};
return PolyDateFormatter2;
}();
var PolyRelFormatter = /* @__PURE__ */ function() {
function PolyRelFormatter2(intl, isEnglish, opts) {
this.opts = _extends({
style: "long"
}, opts);
if (!isEnglish && hasRelative()) {
this.rtf = getCachedRTF(intl, opts);
}
}
var _proto3 = PolyRelFormatter2.prototype;
_proto3.format = function format2(count2, unit2) {
if (this.rtf) {
return this.rtf.format(count2, unit2);
} else {
return formatRelativeTime(unit2, count2, this.opts.numeric, this.opts.style !== "long");
}
};
_proto3.formatToParts = function formatToParts(count2, unit2) {
if (this.rtf) {
return this.rtf.formatToParts(count2, unit2);
} else {
return [];
}
};
return PolyRelFormatter2;
}();
var Locale = /* @__PURE__ */ function() {
Locale2.fromOpts = function fromOpts(opts) {
return Locale2.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.defaultToEN);
};
Locale2.create = function create2(locale2, numberingSystem, outputCalendar, defaultToEN) {
if (defaultToEN === void 0) {
defaultToEN = false;
}
var specifiedLocale = locale2 || Settings.defaultLocale;
var localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale());
var numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;
var outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;
return new Locale2(localeR, numberingSystemR, outputCalendarR, specifiedLocale);
};
Locale2.resetCache = function resetCache() {
sysLocaleCache = null;
intlDTCache = {};
intlNumCache = {};
intlRelCache = {};
};
Locale2.fromObject = function fromObject(_temp) {
var _ref = _temp === void 0 ? {} : _temp, locale2 = _ref.locale, numberingSystem = _ref.numberingSystem, outputCalendar = _ref.outputCalendar;
return Locale2.create(locale2, numberingSystem, outputCalendar);
};
function Locale2(locale2, numbering, outputCalendar, specifiedLocale) {
var _parseLocaleString = parseLocaleString(locale2), parsedLocale = _parseLocaleString[0], parsedNumberingSystem = _parseLocaleString[1], parsedOutputCalendar = _parseLocaleString[2];
this.locale = parsedLocale;
this.numberingSystem = numbering || parsedNumberingSystem || null;
this.outputCalendar = outputCalendar || parsedOutputCalendar || null;
this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);
this.weekdaysCache = {
format: {},
standalone: {}
};
this.monthsCache = {
format: {},
standalone: {}
};
this.meridiemCache = null;
this.eraCache = {};
this.specifiedLocale = specifiedLocale;
this.fastNumbersCached = null;
}
var _proto4 = Locale2.prototype;
_proto4.listingMode = function listingMode() {
var isActuallyEn = this.isEnglish();
var hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory");
return isActuallyEn && hasNoWeirdness ? "en" : "intl";
};
_proto4.clone = function clone2(alts) {
if (!alts || Object.getOwnPropertyNames(alts).length === 0) {
return this;
} else {
return Locale2.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, alts.defaultToEN || false);
}
};
_proto4.redefaultToEN = function redefaultToEN(alts) {
if (alts === void 0) {
alts = {};
}
return this.clone(_extends({}, alts, {
defaultToEN: true
}));
};
_proto4.redefaultToSystem = function redefaultToSystem(alts) {
if (alts === void 0) {
alts = {};
}
return this.clone(_extends({}, alts, {
defaultToEN: false
}));
};
_proto4.months = function months$1(length, format2, defaultOK) {
var _this = this;
if (format2 === void 0) {
format2 = false;
}
if (defaultOK === void 0) {
defaultOK = true;
}
return listStuff(this, length, defaultOK, months, function() {
var intl = format2 ? {
month: length,
day: "numeric"
} : {
month: length
}, formatStr = format2 ? "format" : "standalone";
if (!_this.monthsCache[formatStr][length]) {
_this.monthsCache[formatStr][length] = mapMonths(function(dt) {
return _this.extract(dt, intl, "month");
});
}
return _this.monthsCache[formatStr][length];
});
};
_proto4.weekdays = function weekdays$1(length, format2, defaultOK) {
var _this2 = this;
if (format2 === void 0) {
format2 = false;
}
if (defaultOK === void 0) {
defaultOK = true;
}
return listStuff(this, length, defaultOK, weekdays, function() {
var intl = format2 ? {
weekday: length,
year: "numeric",
month: "long",
day: "numeric"
} : {
weekday: length
}, formatStr = format2 ? "format" : "standalone";
if (!_this2.weekdaysCache[formatStr][length]) {
_this2.weekdaysCache[formatStr][length] = mapWeekdays(function(dt) {
return _this2.extract(dt, intl, "weekday");
});
}
return _this2.weekdaysCache[formatStr][length];
});
};
_proto4.meridiems = function meridiems$1(defaultOK) {
var _this3 = this;
if (defaultOK === void 0) {
defaultOK = true;
}
return listStuff(this, void 0, defaultOK, function() {
return meridiems;
}, function() {
if (!_this3.meridiemCache) {
var intl = {
hour: "numeric",
hourCycle: "h12"
};
_this3.meridiemCache = [DateTime2.utc(2016, 11, 13, 9), DateTime2.utc(2016, 11, 13, 19)].map(function(dt) {
return _this3.extract(dt, intl, "dayperiod");
});
}
return _this3.meridiemCache;
});
};
_proto4.eras = function eras$1(length, defaultOK) {
var _this4 = this;
if (defaultOK === void 0) {
defaultOK = true;
}
return listStuff(this, length, defaultOK, eras, function() {
var intl = {
era: length
};
if (!_this4.eraCache[length]) {
_this4.eraCache[length] = [DateTime2.utc(-40, 1, 1), DateTime2.utc(2017, 1, 1)].map(function(dt) {
return _this4.extract(dt, intl, "era");
});
}
return _this4.eraCache[length];
});
};
_proto4.extract = function extract(dt, intlOpts, field) {
var df = this.dtFormatter(dt, intlOpts), results = df.formatToParts(), matching = results.find(function(m2) {
return m2.type.toLowerCase() === field;
});
return matching ? matching.value : null;
};
_proto4.numberFormatter = function numberFormatter(opts) {
if (opts === void 0) {
opts = {};
}
return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);
};
_proto4.dtFormatter = function dtFormatter(dt, intlOpts) {
if (intlOpts === void 0) {
intlOpts = {};
}
return new PolyDateFormatter(dt, this.intl, intlOpts);
};
_proto4.relFormatter = function relFormatter(opts) {
if (opts === void 0) {
opts = {};
}
return new PolyRelFormatter(this.intl, this.isEnglish(), opts);
};
_proto4.listFormatter = function listFormatter(opts) {
if (opts === void 0) {
opts = {};
}
return getCachedLF(this.intl, opts);
};
_proto4.isEnglish = function isEnglish() {
return this.locale === "en" || this.locale.toLowerCase() === "en-us" || new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us");
};
_proto4.equals = function equals(other) {
return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar;
};
_createClass(Locale2, [{
key: "fastNumbers",
get: function get3() {
if (this.fastNumbersCached == null) {
this.fastNumbersCached = supportsFastNumbers(this);
}
return this.fastNumbersCached;
}
}]);
return Locale2;
}();
function combineRegexes() {
for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) {
regexes[_key] = arguments[_key];
}
var full = regexes.reduce(function(f, r) {
return f + r.source;
}, "");
return RegExp("^" + full + "$");
}
function combineExtractors() {
for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
extractors[_key2] = arguments[_key2];
}
return function(m2) {
return extractors.reduce(function(_ref, ex) {
var mergedVals = _ref[0], mergedZone = _ref[1], cursor = _ref[2];
var _ex = ex(m2, cursor), val = _ex[0], zone = _ex[1], next = _ex[2];
return [_extends({}, mergedVals, val), mergedZone || zone, next];
}, [{}, null, 1]).slice(0, 2);
};
}
function parse(s2) {
if (s2 == null) {
return [null, null];
}
for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
patterns[_key3 - 1] = arguments[_key3];
}
for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) {
var _patterns$_i = _patterns[_i], regex = _patterns$_i[0], extractor = _patterns$_i[1];
var m2 = regex.exec(s2);
if (m2) {
return extractor(m2);
}
}
return [null, null];
}
function simpleParse() {
for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
keys[_key4] = arguments[_key4];
}
return function(match2, cursor) {
var ret = {};
var i;
for (i = 0; i < keys.length; i++) {
ret[keys[i]] = parseInteger(match2[cursor + i]);
}
return [ret, null, cursor + i];
};
}
var offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/;
var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/;
var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + offsetRegex.source + "?");
var isoTimeExtensionRegex = RegExp("(?:T" + isoTimeRegex.source + ")?");
var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/;
var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/;
var isoOrdinalRegex = /(\d{4})-?(\d{3})/;
var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay");
var extractISOOrdinalData = simpleParse("year", "ordinal");
var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/;
var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?");
var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?");
function int(match2, pos, fallback) {
var m2 = match2[pos];
return isUndefined(m2) ? fallback : parseInteger(m2);
}
function extractISOYmd(match2, cursor) {
var item = {
year: int(match2, cursor),
month: int(match2, cursor + 1, 1),
day: int(match2, cursor + 2, 1)
};
return [item, null, cursor + 3];
}
function extractISOTime(match2, cursor) {
var item = {
hours: int(match2, cursor, 0),
minutes: int(match2, cursor + 1, 0),
seconds: int(match2, cursor + 2, 0),
milliseconds: parseMillis(match2[cursor + 3])
};
return [item, null, cursor + 4];
}
function extractISOOffset(match2, cursor) {
var local = !match2[cursor] && !match2[cursor + 1], fullOffset = signedOffset(match2[cursor + 1], match2[cursor + 2]), zone = local ? null : FixedOffsetZone.instance(fullOffset);
return [{}, zone, cursor + 3];
}
function extractIANAZone(match2, cursor) {
var zone = match2[cursor] ? IANAZone.create(match2[cursor]) : null;
return [{}, zone, cursor + 1];
}
var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$");
var isoDuration = /^-?P(?:(?:(-?\d{1,9}(?:\.\d{1,9})?)Y)?(?:(-?\d{1,9}(?:\.\d{1,9})?)M)?(?:(-?\d{1,9}(?:\.\d{1,9})?)W)?(?:(-?\d{1,9}(?:\.\d{1,9})?)D)?(?:T(?:(-?\d{1,9}(?:\.\d{1,9})?)H)?(?:(-?\d{1,9}(?:\.\d{1,9})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/;
function extractISODuration(match2) {
var s2 = match2[0], yearStr = match2[1], monthStr = match2[2], weekStr = match2[3], dayStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], millisecondsStr = match2[8];
var hasNegativePrefix = s2[0] === "-";
var negativeSeconds = secondStr && secondStr[0] === "-";
var maybeNegate = function maybeNegate2(num, force) {
if (force === void 0) {
force = false;
}
return num !== void 0 && (force || num && hasNegativePrefix) ? -num : num;
};
return [{
years: maybeNegate(parseFloating(yearStr)),
months: maybeNegate(parseFloating(monthStr)),
weeks: maybeNegate(parseFloating(weekStr)),
days: maybeNegate(parseFloating(dayStr)),
hours: maybeNegate(parseFloating(hourStr)),
minutes: maybeNegate(parseFloating(minuteStr)),
seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"),
milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds)
}];
}
var obsOffsets = {
GMT: 0,
EDT: -4 * 60,
EST: -5 * 60,
CDT: -5 * 60,
CST: -6 * 60,
MDT: -6 * 60,
MST: -7 * 60,
PDT: -7 * 60,
PST: -8 * 60
};
function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
var result = {
year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),
month: monthsShort.indexOf(monthStr) + 1,
day: parseInteger(dayStr),
hour: parseInteger(hourStr),
minute: parseInteger(minuteStr)
};
if (secondStr)
result.second = parseInteger(secondStr);
if (weekdayStr) {
result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1;
}
return result;
}
var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;
function extractRFC2822(match2) {
var weekdayStr = match2[1], dayStr = match2[2], monthStr = match2[3], yearStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], obsOffset = match2[8], milOffset = match2[9], offHourStr = match2[10], offMinuteStr = match2[11], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);
var offset2;
if (obsOffset) {
offset2 = obsOffsets[obsOffset];
} else if (milOffset) {
offset2 = 0;
} else {
offset2 = signedOffset(offHourStr, offMinuteStr);
}
return [result, new FixedOffsetZone(offset2)];
}
function preprocessRFC2822(s2) {
return s2.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim();
}
var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/;
var rfc850 = /^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/;
var ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;
function extractRFC1123Or850(match2) {
var weekdayStr = match2[1], dayStr = match2[2], monthStr = match2[3], yearStr = match2[4], hourStr = match2[5], minuteStr = match2[6], secondStr = match2[7], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);
return [result, FixedOffsetZone.utcInstance];
}
function extractASCII(match2) {
var weekdayStr = match2[1], monthStr = match2[2], dayStr = match2[3], hourStr = match2[4], minuteStr = match2[5], secondStr = match2[6], yearStr = match2[7], result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);
return [result, FixedOffsetZone.utcInstance];
}
var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);
var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);
var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);
var isoTimeCombinedRegex = combineRegexes(isoTimeRegex);
var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset);
var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset);
var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset);
var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset);
function parseISODate(s2) {
return parse(s2, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]);
}
function parseRFC2822Date(s2) {
return parse(preprocessRFC2822(s2), [rfc2822, extractRFC2822]);
}
function parseHTTPDate(s2) {
return parse(s2, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]);
}
function parseISODuration(s2) {
return parse(s2, [isoDuration, extractISODuration]);
}
var extractISOTimeOnly = combineExtractors(extractISOTime);
function parseISOTimeOnly(s2) {
return parse(s2, [isoTimeOnly, extractISOTimeOnly]);
}
var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);
var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);
var extractISOYmdTimeOffsetAndIANAZone = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone);
var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone);
function parseSQL(s2) {
return parse(s2, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeOffsetAndIANAZone], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]);
}
var INVALID$2 = "Invalid Duration";
var lowOrderMatrix = {
weeks: {
days: 7,
hours: 7 * 24,
minutes: 7 * 24 * 60,
seconds: 7 * 24 * 60 * 60,
milliseconds: 7 * 24 * 60 * 60 * 1e3
},
days: {
hours: 24,
minutes: 24 * 60,
seconds: 24 * 60 * 60,
milliseconds: 24 * 60 * 60 * 1e3
},
hours: {
minutes: 60,
seconds: 60 * 60,
milliseconds: 60 * 60 * 1e3
},
minutes: {
seconds: 60,
milliseconds: 60 * 1e3
},
seconds: {
milliseconds: 1e3
}
};
var casualMatrix = _extends({
years: {
quarters: 4,
months: 12,
weeks: 52,
days: 365,
hours: 365 * 24,
minutes: 365 * 24 * 60,
seconds: 365 * 24 * 60 * 60,
milliseconds: 365 * 24 * 60 * 60 * 1e3
},
quarters: {
months: 3,
weeks: 13,
days: 91,
hours: 91 * 24,
minutes: 91 * 24 * 60,
seconds: 91 * 24 * 60 * 60,
milliseconds: 91 * 24 * 60 * 60 * 1e3
},
months: {
weeks: 4,
days: 30,
hours: 30 * 24,
minutes: 30 * 24 * 60,
seconds: 30 * 24 * 60 * 60,
milliseconds: 30 * 24 * 60 * 60 * 1e3
}
}, lowOrderMatrix);
var daysInYearAccurate = 146097 / 400;
var daysInMonthAccurate = 146097 / 4800;
var accurateMatrix = _extends({
years: {
quarters: 4,
months: 12,
weeks: daysInYearAccurate / 7,
days: daysInYearAccurate,
hours: daysInYearAccurate * 24,
minutes: daysInYearAccurate * 24 * 60,
seconds: daysInYearAccurate * 24 * 60 * 60,
milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1e3
},
quarters: {
months: 3,
weeks: daysInYearAccurate / 28,
days: daysInYearAccurate / 4,
hours: daysInYearAccurate * 24 / 4,
minutes: daysInYearAccurate * 24 * 60 / 4,
seconds: daysInYearAccurate * 24 * 60 * 60 / 4,
milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1e3 / 4
},
months: {
weeks: daysInMonthAccurate / 7,
days: daysInMonthAccurate,
hours: daysInMonthAccurate * 24,
minutes: daysInMonthAccurate * 24 * 60,
seconds: daysInMonthAccurate * 24 * 60 * 60,
milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1e3
}
}, lowOrderMatrix);
var orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"];
var reverseUnits = orderedUnits$1.slice(0).reverse();
function clone$1(dur, alts, clear) {
if (clear === void 0) {
clear = false;
}
var conf = {
values: clear ? alts.values : _extends({}, dur.values, alts.values || {}),
loc: dur.loc.clone(alts.loc),
conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy
};
return new Duration(conf);
}
function antiTrunc(n2) {
return n2 < 0 ? Math.floor(n2) : Math.ceil(n2);
}
function convert(matrix, fromMap, fromUnit, toMap, toUnit) {
var conv = matrix[toUnit][fromUnit], raw = fromMap[fromUnit] / conv, sameSign = Math.sign(raw) === Math.sign(toMap[toUnit]), added = !sameSign && toMap[toUnit] !== 0 && Math.abs(raw) <= 1 ? antiTrunc(raw) : Math.trunc(raw);
toMap[toUnit] += added;
fromMap[fromUnit] -= added * conv;
}
function normalizeValues(matrix, vals) {
reverseUnits.reduce(function(previous, current) {
if (!isUndefined(vals[current])) {
if (previous) {
convert(matrix, vals, previous, vals, current);
}
return current;
} else {
return previous;
}
}, null);
}
var Duration = /* @__PURE__ */ function() {
function Duration2(config) {
var accurate = config.conversionAccuracy === "longterm" || false;
this.values = config.values;
this.loc = config.loc || Locale.create();
this.conversionAccuracy = accurate ? "longterm" : "casual";
this.invalid = config.invalid || null;
this.matrix = accurate ? accurateMatrix : casualMatrix;
this.isLuxonDuration = true;
}
Duration2.fromMillis = function fromMillis(count2, opts) {
return Duration2.fromObject({
milliseconds: count2
}, opts);
};
Duration2.fromObject = function fromObject(obj, opts) {
if (opts === void 0) {
opts = {};
}
if (obj == null || typeof obj !== "object") {
throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj));
}
return new Duration2({
values: normalizeObject(obj, Duration2.normalizeUnit),
loc: Locale.fromObject(opts),
conversionAccuracy: opts.conversionAccuracy
});
};
Duration2.fromDurationLike = function fromDurationLike(durationLike) {
if (isNumber(durationLike)) {
return Duration2.fromMillis(durationLike);
} else if (Duration2.isDuration(durationLike)) {
return durationLike;
} else if (typeof durationLike === "object") {
return Duration2.fromObject(durationLike);
} else {
throw new InvalidArgumentError("Unknown duration argument " + durationLike + " of type " + typeof durationLike);
}
};
Duration2.fromISO = function fromISO(text2, opts) {
var _parseISODuration = parseISODuration(text2), parsed = _parseISODuration[0];
if (parsed) {
return Duration2.fromObject(parsed, opts);
} else {
return Duration2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`);
}
};
Duration2.fromISOTime = function fromISOTime(text2, opts) {
var _parseISOTimeOnly = parseISOTimeOnly(text2), parsed = _parseISOTimeOnly[0];
if (parsed) {
return Duration2.fromObject(parsed, opts);
} else {
return Duration2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`);
}
};
Duration2.invalid = function invalid(reason, explanation) {
if (explanation === void 0) {
explanation = null;
}
if (!reason) {
throw new InvalidArgumentError("need to specify a reason the Duration is invalid");
}
var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation);
if (Settings.throwOnInvalid) {
throw new InvalidDurationError(invalid2);
} else {
return new Duration2({
invalid: invalid2
});
}
};
Duration2.normalizeUnit = function normalizeUnit2(unit2) {
var normalized = {
year: "years",
years: "years",
quarter: "quarters",
quarters: "quarters",
month: "months",
months: "months",
week: "weeks",
weeks: "weeks",
day: "days",
days: "days",
hour: "hours",
hours: "hours",
minute: "minutes",
minutes: "minutes",
second: "seconds",
seconds: "seconds",
millisecond: "milliseconds",
milliseconds: "milliseconds"
}[unit2 ? unit2.toLowerCase() : unit2];
if (!normalized)
throw new InvalidUnitError(unit2);
return normalized;
};
Duration2.isDuration = function isDuration(o) {
return o && o.isLuxonDuration || false;
};
var _proto = Duration2.prototype;
_proto.toFormat = function toFormat(fmt, opts) {
if (opts === void 0) {
opts = {};
}
var fmtOpts = _extends({}, opts, {
floor: opts.round !== false && opts.floor !== false
});
return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2;
};
_proto.toHuman = function toHuman(opts) {
var _this = this;
if (opts === void 0) {
opts = {};
}
var l2 = orderedUnits$1.map(function(unit2) {
var val = _this.values[unit2];
if (isUndefined(val)) {
return null;
}
return _this.loc.numberFormatter(_extends({
style: "unit",
unitDisplay: "long"
}, opts, {
unit: unit2.slice(0, -1)
})).format(val);
}).filter(function(n2) {
return n2;
});
return this.loc.listFormatter(_extends({
type: "conjunction",
style: opts.listStyle || "narrow"
}, opts)).format(l2);
};
_proto.toObject = function toObject() {
if (!this.isValid)
return {};
return _extends({}, this.values);
};
_proto.toISO = function toISO() {
if (!this.isValid)
return null;
var s2 = "P";
if (this.years !== 0)
s2 += this.years + "Y";
if (this.months !== 0 || this.quarters !== 0)
s2 += this.months + this.quarters * 3 + "M";
if (this.weeks !== 0)
s2 += this.weeks + "W";
if (this.days !== 0)
s2 += this.days + "D";
if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)
s2 += "T";
if (this.hours !== 0)
s2 += this.hours + "H";
if (this.minutes !== 0)
s2 += this.minutes + "M";
if (this.seconds !== 0 || this.milliseconds !== 0)
s2 += roundTo(this.seconds + this.milliseconds / 1e3, 3) + "S";
if (s2 === "P")
s2 += "T0S";
return s2;
};
_proto.toISOTime = function toISOTime(opts) {
if (opts === void 0) {
opts = {};
}
if (!this.isValid)
return null;
var millis = this.toMillis();
if (millis < 0 || millis >= 864e5)
return null;
opts = _extends({
suppressMilliseconds: false,
suppressSeconds: false,
includePrefix: false,
format: "extended"
}, opts);
var value = this.shiftTo("hours", "minutes", "seconds", "milliseconds");
var fmt = opts.format === "basic" ? "hhmm" : "hh:mm";
if (!opts.suppressSeconds || value.seconds !== 0 || value.milliseconds !== 0) {
fmt += opts.format === "basic" ? "ss" : ":ss";
if (!opts.suppressMilliseconds || value.milliseconds !== 0) {
fmt += ".SSS";
}
}
var str = value.toFormat(fmt);
if (opts.includePrefix) {
str = "T" + str;
}
return str;
};
_proto.toJSON = function toJSON() {
return this.toISO();
};
_proto.toString = function toString() {
return this.toISO();
};
_proto.toMillis = function toMillis() {
return this.as("milliseconds");
};
_proto.valueOf = function valueOf() {
return this.toMillis();
};
_proto.plus = function plus(duration) {
if (!this.isValid)
return this;
var dur = Duration2.fromDurationLike(duration), result = {};
for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits$1), _step; !(_step = _iterator()).done; ) {
var k = _step.value;
if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {
result[k] = dur.get(k) + this.get(k);
}
}
return clone$1(this, {
values: result
}, true);
};
_proto.minus = function minus(duration) {
if (!this.isValid)
return this;
var dur = Duration2.fromDurationLike(duration);
return this.plus(dur.negate());
};
_proto.mapUnits = function mapUnits(fn) {
if (!this.isValid)
return this;
var result = {};
for (var _i = 0, _Object$keys = Object.keys(this.values); _i < _Object$keys.length; _i++) {
var k = _Object$keys[_i];
result[k] = asNumber(fn(this.values[k], k));
}
return clone$1(this, {
values: result
}, true);
};
_proto.get = function get3(unit2) {
return this[Duration2.normalizeUnit(unit2)];
};
_proto.set = function set3(values) {
if (!this.isValid)
return this;
var mixed = _extends({}, this.values, normalizeObject(values, Duration2.normalizeUnit));
return clone$1(this, {
values: mixed
});
};
_proto.reconfigure = function reconfigure(_temp) {
var _ref = _temp === void 0 ? {} : _temp, locale2 = _ref.locale, numberingSystem = _ref.numberingSystem, conversionAccuracy = _ref.conversionAccuracy;
var loc = this.loc.clone({
locale: locale2,
numberingSystem
}), opts = {
loc
};
if (conversionAccuracy) {
opts.conversionAccuracy = conversionAccuracy;
}
return clone$1(this, opts);
};
_proto.as = function as(unit2) {
return this.isValid ? this.shiftTo(unit2).get(unit2) : NaN;
};
_proto.normalize = function normalize2() {
if (!this.isValid)
return this;
var vals = this.toObject();
normalizeValues(this.matrix, vals);
return clone$1(this, {
values: vals
}, true);
};
_proto.shiftTo = function shiftTo() {
for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) {
units[_key] = arguments[_key];
}
if (!this.isValid)
return this;
if (units.length === 0) {
return this;
}
units = units.map(function(u) {
return Duration2.normalizeUnit(u);
});
var built = {}, accumulated = {}, vals = this.toObject();
var lastUnit;
for (var _iterator2 = _createForOfIteratorHelperLoose(orderedUnits$1), _step2; !(_step2 = _iterator2()).done; ) {
var k = _step2.value;
if (units.indexOf(k) >= 0) {
lastUnit = k;
var own = 0;
for (var ak in accumulated) {
own += this.matrix[ak][k] * accumulated[ak];
accumulated[ak] = 0;
}
if (isNumber(vals[k])) {
own += vals[k];
}
var i = Math.trunc(own);
built[k] = i;
accumulated[k] = (own * 1e3 - i * 1e3) / 1e3;
for (var down in vals) {
if (orderedUnits$1.indexOf(down) > orderedUnits$1.indexOf(k)) {
convert(this.matrix, vals, down, built, k);
}
}
} else if (isNumber(vals[k])) {
accumulated[k] = vals[k];
}
}
for (var key in accumulated) {
if (accumulated[key] !== 0) {
built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];
}
}
return clone$1(this, {
values: built
}, true).normalize();
};
_proto.negate = function negate() {
if (!this.isValid)
return this;
var negated = {};
for (var _i2 = 0, _Object$keys2 = Object.keys(this.values); _i2 < _Object$keys2.length; _i2++) {
var k = _Object$keys2[_i2];
negated[k] = -this.values[k];
}
return clone$1(this, {
values: negated
}, true);
};
_proto.equals = function equals(other) {
if (!this.isValid || !other.isValid) {
return false;
}
if (!this.loc.equals(other.loc)) {
return false;
}
function eq(v1, v2) {
if (v1 === void 0 || v1 === 0)
return v2 === void 0 || v2 === 0;
return v1 === v2;
}
for (var _iterator3 = _createForOfIteratorHelperLoose(orderedUnits$1), _step3; !(_step3 = _iterator3()).done; ) {
var u = _step3.value;
if (!eq(this.values[u], other.values[u])) {
return false;
}
}
return true;
};
_createClass(Duration2, [{
key: "locale",
get: function get3() {
return this.isValid ? this.loc.locale : null;
}
}, {
key: "numberingSystem",
get: function get3() {
return this.isValid ? this.loc.numberingSystem : null;
}
}, {
key: "years",
get: function get3() {
return this.isValid ? this.values.years || 0 : NaN;
}
}, {
key: "quarters",
get: function get3() {
return this.isValid ? this.values.quarters || 0 : NaN;
}
}, {
key: "months",
get: function get3() {
return this.isValid ? this.values.months || 0 : NaN;
}
}, {
key: "weeks",
get: function get3() {
return this.isValid ? this.values.weeks || 0 : NaN;
}
}, {
key: "days",
get: function get3() {
return this.isValid ? this.values.days || 0 : NaN;
}
}, {
key: "hours",
get: function get3() {
return this.isValid ? this.values.hours || 0 : NaN;
}
}, {
key: "minutes",
get: function get3() {
return this.isValid ? this.values.minutes || 0 : NaN;
}
}, {
key: "seconds",
get: function get3() {
return this.isValid ? this.values.seconds || 0 : NaN;
}
}, {
key: "milliseconds",
get: function get3() {
return this.isValid ? this.values.milliseconds || 0 : NaN;
}
}, {
key: "isValid",
get: function get3() {
return this.invalid === null;
}
}, {
key: "invalidReason",
get: function get3() {
return this.invalid ? this.invalid.reason : null;
}
}, {
key: "invalidExplanation",
get: function get3() {
return this.invalid ? this.invalid.explanation : null;
}
}]);
return Duration2;
}();
var INVALID$1 = "Invalid Interval";
function validateStartEnd(start2, end) {
if (!start2 || !start2.isValid) {
return Interval.invalid("missing or invalid start");
} else if (!end || !end.isValid) {
return Interval.invalid("missing or invalid end");
} else if (end < start2) {
return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start2.toISO() + " and end=" + end.toISO());
} else {
return null;
}
}
var Interval = /* @__PURE__ */ function() {
function Interval2(config) {
this.s = config.start;
this.e = config.end;
this.invalid = config.invalid || null;
this.isLuxonInterval = true;
}
Interval2.invalid = function invalid(reason, explanation) {
if (explanation === void 0) {
explanation = null;
}
if (!reason) {
throw new InvalidArgumentError("need to specify a reason the Interval is invalid");
}
var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation);
if (Settings.throwOnInvalid) {
throw new InvalidIntervalError(invalid2);
} else {
return new Interval2({
invalid: invalid2
});
}
};
Interval2.fromDateTimes = function fromDateTimes(start2, end) {
var builtStart = friendlyDateTime(start2), builtEnd = friendlyDateTime(end);
var validateError = validateStartEnd(builtStart, builtEnd);
if (validateError == null) {
return new Interval2({
start: builtStart,
end: builtEnd
});
} else {
return validateError;
}
};
Interval2.after = function after(start2, duration) {
var dur = Duration.fromDurationLike(duration), dt = friendlyDateTime(start2);
return Interval2.fromDateTimes(dt, dt.plus(dur));
};
Interval2.before = function before(end, duration) {
var dur = Duration.fromDurationLike(duration), dt = friendlyDateTime(end);
return Interval2.fromDateTimes(dt.minus(dur), dt);
};
Interval2.fromISO = function fromISO(text2, opts) {
var _split = (text2 || "").split("/", 2), s2 = _split[0], e = _split[1];
if (s2 && e) {
var start2, startIsValid;
try {
start2 = DateTime2.fromISO(s2, opts);
startIsValid = start2.isValid;
} catch (e3) {
startIsValid = false;
}
var end, endIsValid;
try {
end = DateTime2.fromISO(e, opts);
endIsValid = end.isValid;
} catch (e3) {
endIsValid = false;
}
if (startIsValid && endIsValid) {
return Interval2.fromDateTimes(start2, end);
}
if (startIsValid) {
var dur = Duration.fromISO(e, opts);
if (dur.isValid) {
return Interval2.after(start2, dur);
}
} else if (endIsValid) {
var _dur = Duration.fromISO(s2, opts);
if (_dur.isValid) {
return Interval2.before(end, _dur);
}
}
}
return Interval2.invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ISO 8601`);
};
Interval2.isInterval = function isInterval(o) {
return o && o.isLuxonInterval || false;
};
var _proto = Interval2.prototype;
_proto.length = function length(unit2) {
if (unit2 === void 0) {
unit2 = "milliseconds";
}
return this.isValid ? this.toDuration.apply(this, [unit2]).get(unit2) : NaN;
};
_proto.count = function count2(unit2) {
if (unit2 === void 0) {
unit2 = "milliseconds";
}
if (!this.isValid)
return NaN;
var start2 = this.start.startOf(unit2), end = this.end.startOf(unit2);
return Math.floor(end.diff(start2, unit2).get(unit2)) + 1;
};
_proto.hasSame = function hasSame(unit2) {
return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit2) : false;
};
_proto.isEmpty = function isEmpty() {
return this.s.valueOf() === this.e.valueOf();
};
_proto.isAfter = function isAfter(dateTime) {
if (!this.isValid)
return false;
return this.s > dateTime;
};
_proto.isBefore = function isBefore(dateTime) {
if (!this.isValid)
return false;
return this.e <= dateTime;
};
_proto.contains = function contains(dateTime) {
if (!this.isValid)
return false;
return this.s <= dateTime && this.e > dateTime;
};
_proto.set = function set3(_temp) {
var _ref = _temp === void 0 ? {} : _temp, start2 = _ref.start, end = _ref.end;
if (!this.isValid)
return this;
return Interval2.fromDateTimes(start2 || this.s, end || this.e);
};
_proto.splitAt = function splitAt() {
var _this = this;
if (!this.isValid)
return [];
for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) {
dateTimes[_key] = arguments[_key];
}
var sorted = dateTimes.map(friendlyDateTime).filter(function(d) {
return _this.contains(d);
}).sort(), results = [];
var s2 = this.s, i = 0;
while (s2 < this.e) {
var added = sorted[i] || this.e, next = +added > +this.e ? this.e : added;
results.push(Interval2.fromDateTimes(s2, next));
s2 = next;
i += 1;
}
return results;
};
_proto.splitBy = function splitBy(duration) {
var dur = Duration.fromDurationLike(duration);
if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) {
return [];
}
var s2 = this.s, idx = 1, next;
var results = [];
while (s2 < this.e) {
var added = this.start.plus(dur.mapUnits(function(x4) {
return x4 * idx;
}));
next = +added > +this.e ? this.e : added;
results.push(Interval2.fromDateTimes(s2, next));
s2 = next;
idx += 1;
}
return results;
};
_proto.divideEqually = function divideEqually(numberOfParts) {
if (!this.isValid)
return [];
return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);
};
_proto.overlaps = function overlaps(other) {
return this.e > other.s && this.s < other.e;
};
_proto.abutsStart = function abutsStart(other) {
if (!this.isValid)
return false;
return +this.e === +other.s;
};
_proto.abutsEnd = function abutsEnd(other) {
if (!this.isValid)
return false;
return +other.e === +this.s;
};
_proto.engulfs = function engulfs(other) {
if (!this.isValid)
return false;
return this.s <= other.s && this.e >= other.e;
};
_proto.equals = function equals(other) {
if (!this.isValid || !other.isValid) {
return false;
}
return this.s.equals(other.s) && this.e.equals(other.e);
};
_proto.intersection = function intersection(other) {
if (!this.isValid)
return this;
var s2 = this.s > other.s ? this.s : other.s, e = this.e < other.e ? this.e : other.e;
if (s2 >= e) {
return null;
} else {
return Interval2.fromDateTimes(s2, e);
}
};
_proto.union = function union(other) {
if (!this.isValid)
return this;
var s2 = this.s < other.s ? this.s : other.s, e = this.e > other.e ? this.e : other.e;
return Interval2.fromDateTimes(s2, e);
};
Interval2.merge = function merge(intervals) {
var _intervals$sort$reduc = intervals.sort(function(a2, b) {
return a2.s - b.s;
}).reduce(function(_ref2, item) {
var sofar = _ref2[0], current = _ref2[1];
if (!current) {
return [sofar, item];
} else if (current.overlaps(item) || current.abutsStart(item)) {
return [sofar, current.union(item)];
} else {
return [sofar.concat([current]), item];
}
}, [[], null]), found = _intervals$sort$reduc[0], final = _intervals$sort$reduc[1];
if (final) {
found.push(final);
}
return found;
};
Interval2.xor = function xor(intervals) {
var _Array$prototype;
var start2 = null, currentCount = 0;
var results = [], ends = intervals.map(function(i2) {
return [{
time: i2.s,
type: "s"
}, {
time: i2.e,
type: "e"
}];
}), flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), arr = flattened.sort(function(a2, b) {
return a2.time - b.time;
});
for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done; ) {
var i = _step.value;
currentCount += i.type === "s" ? 1 : -1;
if (currentCount === 1) {
start2 = i.time;
} else {
if (start2 && +start2 !== +i.time) {
results.push(Interval2.fromDateTimes(start2, i.time));
}
start2 = null;
}
}
return Interval2.merge(results);
};
_proto.difference = function difference() {
var _this2 = this;
for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
intervals[_key2] = arguments[_key2];
}
return Interval2.xor([this].concat(intervals)).map(function(i) {
return _this2.intersection(i);
}).filter(function(i) {
return i && !i.isEmpty();
});
};
_proto.toString = function toString() {
if (!this.isValid)
return INVALID$1;
return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")";
};
_proto.toISO = function toISO(opts) {
if (!this.isValid)
return INVALID$1;
return this.s.toISO(opts) + "/" + this.e.toISO(opts);
};
_proto.toISODate = function toISODate() {
if (!this.isValid)
return INVALID$1;
return this.s.toISODate() + "/" + this.e.toISODate();
};
_proto.toISOTime = function toISOTime(opts) {
if (!this.isValid)
return INVALID$1;
return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts);
};
_proto.toFormat = function toFormat(dateFormat, _temp2) {
var _ref3 = _temp2 === void 0 ? {} : _temp2, _ref3$separator = _ref3.separator, separator = _ref3$separator === void 0 ? " \u2013 " : _ref3$separator;
if (!this.isValid)
return INVALID$1;
return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat);
};
_proto.toDuration = function toDuration(unit2, opts) {
if (!this.isValid) {
return Duration.invalid(this.invalidReason);
}
return this.e.diff(this.s, unit2, opts);
};
_proto.mapEndpoints = function mapEndpoints(mapFn) {
return Interval2.fromDateTimes(mapFn(this.s), mapFn(this.e));
};
_createClass(Interval2, [{
key: "start",
get: function get3() {
return this.isValid ? this.s : null;
}
}, {
key: "end",
get: function get3() {
return this.isValid ? this.e : null;
}
}, {
key: "isValid",
get: function get3() {
return this.invalidReason === null;
}
}, {
key: "invalidReason",
get: function get3() {
return this.invalid ? this.invalid.reason : null;
}
}, {
key: "invalidExplanation",
get: function get3() {
return this.invalid ? this.invalid.explanation : null;
}
}]);
return Interval2;
}();
var Info = /* @__PURE__ */ function() {
function Info2() {
}
Info2.hasDST = function hasDST(zone) {
if (zone === void 0) {
zone = Settings.defaultZone;
}
var proto = DateTime2.now().setZone(zone).set({
month: 12
});
return !zone.isUniversal && proto.offset !== proto.set({
month: 6
}).offset;
};
Info2.isValidIANAZone = function isValidIANAZone(zone) {
return IANAZone.isValidSpecifier(zone) && IANAZone.isValidZone(zone);
};
Info2.normalizeZone = function normalizeZone$1(input) {
return normalizeZone(input, Settings.defaultZone);
};
Info2.months = function months2(length, _temp) {
if (length === void 0) {
length = "long";
}
var _ref = _temp === void 0 ? {} : _temp, _ref$locale = _ref.locale, locale2 = _ref$locale === void 0 ? null : _ref$locale, _ref$numberingSystem = _ref.numberingSystem, numberingSystem = _ref$numberingSystem === void 0 ? null : _ref$numberingSystem, _ref$locObj = _ref.locObj, locObj = _ref$locObj === void 0 ? null : _ref$locObj, _ref$outputCalendar = _ref.outputCalendar, outputCalendar = _ref$outputCalendar === void 0 ? "gregory" : _ref$outputCalendar;
return (locObj || Locale.create(locale2, numberingSystem, outputCalendar)).months(length);
};
Info2.monthsFormat = function monthsFormat(length, _temp2) {
if (length === void 0) {
length = "long";
}
var _ref2 = _temp2 === void 0 ? {} : _temp2, _ref2$locale = _ref2.locale, locale2 = _ref2$locale === void 0 ? null : _ref2$locale, _ref2$numberingSystem = _ref2.numberingSystem, numberingSystem = _ref2$numberingSystem === void 0 ? null : _ref2$numberingSystem, _ref2$locObj = _ref2.locObj, locObj = _ref2$locObj === void 0 ? null : _ref2$locObj, _ref2$outputCalendar = _ref2.outputCalendar, outputCalendar = _ref2$outputCalendar === void 0 ? "gregory" : _ref2$outputCalendar;
return (locObj || Locale.create(locale2, numberingSystem, outputCalendar)).months(length, true);
};
Info2.weekdays = function weekdays2(length, _temp3) {
if (length === void 0) {
length = "long";
}
var _ref3 = _temp3 === void 0 ? {} : _temp3, _ref3$locale = _ref3.locale, locale2 = _ref3$locale === void 0 ? null : _ref3$locale, _ref3$numberingSystem = _ref3.numberingSystem, numberingSystem = _ref3$numberingSystem === void 0 ? null : _ref3$numberingSystem, _ref3$locObj = _ref3.locObj, locObj = _ref3$locObj === void 0 ? null : _ref3$locObj;
return (locObj || Locale.create(locale2, numberingSystem, null)).weekdays(length);
};
Info2.weekdaysFormat = function weekdaysFormat(length, _temp4) {
if (length === void 0) {
length = "long";
}
var _ref4 = _temp4 === void 0 ? {} : _temp4, _ref4$locale = _ref4.locale, locale2 = _ref4$locale === void 0 ? null : _ref4$locale, _ref4$numberingSystem = _ref4.numberingSystem, numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, _ref4$locObj = _ref4.locObj, locObj = _ref4$locObj === void 0 ? null : _ref4$locObj;
return (locObj || Locale.create(locale2, numberingSystem, null)).weekdays(length, true);
};
Info2.meridiems = function meridiems2(_temp5) {
var _ref5 = _temp5 === void 0 ? {} : _temp5, _ref5$locale = _ref5.locale, locale2 = _ref5$locale === void 0 ? null : _ref5$locale;
return Locale.create(locale2).meridiems();
};
Info2.eras = function eras2(length, _temp6) {
if (length === void 0) {
length = "short";
}
var _ref6 = _temp6 === void 0 ? {} : _temp6, _ref6$locale = _ref6.locale, locale2 = _ref6$locale === void 0 ? null : _ref6$locale;
return Locale.create(locale2, null, "gregory").eras(length);
};
Info2.features = function features() {
return {
relative: hasRelative()
};
};
return Info2;
}();
function dayDiff(earlier, later) {
var utcDayStart = function utcDayStart2(dt) {
return dt.toUTC(0, {
keepLocalTime: true
}).startOf("day").valueOf();
}, ms = utcDayStart(later) - utcDayStart(earlier);
return Math.floor(Duration.fromMillis(ms).as("days"));
}
function highOrderDiffs(cursor, later, units) {
var differs = [["years", function(a2, b) {
return b.year - a2.year;
}], ["quarters", function(a2, b) {
return b.quarter - a2.quarter;
}], ["months", function(a2, b) {
return b.month - a2.month + (b.year - a2.year) * 12;
}], ["weeks", function(a2, b) {
var days = dayDiff(a2, b);
return (days - days % 7) / 7;
}], ["days", dayDiff]];
var results = {};
var lowestOrder, highWater;
for (var _i = 0, _differs = differs; _i < _differs.length; _i++) {
var _differs$_i = _differs[_i], unit2 = _differs$_i[0], differ = _differs$_i[1];
if (units.indexOf(unit2) >= 0) {
var _cursor$plus;
lowestOrder = unit2;
var delta = differ(cursor, later);
highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[unit2] = delta, _cursor$plus));
if (highWater > later) {
var _cursor$plus2;
cursor = cursor.plus((_cursor$plus2 = {}, _cursor$plus2[unit2] = delta - 1, _cursor$plus2));
delta -= 1;
} else {
cursor = highWater;
}
results[unit2] = delta;
}
}
return [cursor, results, highWater, lowestOrder];
}
function _diff(earlier, later, units, opts) {
var _highOrderDiffs = highOrderDiffs(earlier, later, units), cursor = _highOrderDiffs[0], results = _highOrderDiffs[1], highWater = _highOrderDiffs[2], lowestOrder = _highOrderDiffs[3];
var remainingMillis = later - cursor;
var lowerOrderUnits = units.filter(function(u) {
return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0;
});
if (lowerOrderUnits.length === 0) {
if (highWater < later) {
var _cursor$plus3;
highWater = cursor.plus((_cursor$plus3 = {}, _cursor$plus3[lowestOrder] = 1, _cursor$plus3));
}
if (highWater !== cursor) {
results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);
}
}
var duration = Duration.fromObject(results, opts);
if (lowerOrderUnits.length > 0) {
var _Duration$fromMillis;
return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration);
} else {
return duration;
}
}
var numberingSystems = {
arab: "[\u0660-\u0669]",
arabext: "[\u06F0-\u06F9]",
bali: "[\u1B50-\u1B59]",
beng: "[\u09E6-\u09EF]",
deva: "[\u0966-\u096F]",
fullwide: "[\uFF10-\uFF19]",
gujr: "[\u0AE6-\u0AEF]",
hanidec: "[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]",
khmr: "[\u17E0-\u17E9]",
knda: "[\u0CE6-\u0CEF]",
laoo: "[\u0ED0-\u0ED9]",
limb: "[\u1946-\u194F]",
mlym: "[\u0D66-\u0D6F]",
mong: "[\u1810-\u1819]",
mymr: "[\u1040-\u1049]",
orya: "[\u0B66-\u0B6F]",
tamldec: "[\u0BE6-\u0BEF]",
telu: "[\u0C66-\u0C6F]",
thai: "[\u0E50-\u0E59]",
tibt: "[\u0F20-\u0F29]",
latn: "\\d"
};
var numberingSystemsUTF16 = {
arab: [1632, 1641],
arabext: [1776, 1785],
bali: [6992, 7001],
beng: [2534, 2543],
deva: [2406, 2415],
fullwide: [65296, 65303],
gujr: [2790, 2799],
khmr: [6112, 6121],
knda: [3302, 3311],
laoo: [3792, 3801],
limb: [6470, 6479],
mlym: [3430, 3439],
mong: [6160, 6169],
mymr: [4160, 4169],
orya: [2918, 2927],
tamldec: [3046, 3055],
telu: [3174, 3183],
thai: [3664, 3673],
tibt: [3872, 3881]
};
var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split("");
function parseDigits(str) {
var value = parseInt(str, 10);
if (isNaN(value)) {
value = "";
for (var i = 0; i < str.length; i++) {
var code = str.charCodeAt(i);
if (str[i].search(numberingSystems.hanidec) !== -1) {
value += hanidecChars.indexOf(str[i]);
} else {
for (var key in numberingSystemsUTF16) {
var _numberingSystemsUTF = numberingSystemsUTF16[key], min3 = _numberingSystemsUTF[0], max4 = _numberingSystemsUTF[1];
if (code >= min3 && code <= max4) {
value += code - min3;
}
}
}
}
return parseInt(value, 10);
} else {
return value;
}
}
function digitRegex(_ref, append2) {
var numberingSystem = _ref.numberingSystem;
if (append2 === void 0) {
append2 = "";
}
return new RegExp("" + numberingSystems[numberingSystem || "latn"] + append2);
}
var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support";
function intUnit(regex, post) {
if (post === void 0) {
post = function post2(i) {
return i;
};
}
return {
regex,
deser: function deser(_ref) {
var s2 = _ref[0];
return post(parseDigits(s2));
}
};
}
var NBSP = String.fromCharCode(160);
var spaceOrNBSP = "( |" + NBSP + ")";
var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g");
function fixListRegex(s2) {
return s2.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP);
}
function stripInsensitivities(s2) {
return s2.replace(/\./g, "").replace(spaceOrNBSPRegExp, " ").toLowerCase();
}
function oneOf(strings, startIndex) {
if (strings === null) {
return null;
} else {
return {
regex: RegExp(strings.map(fixListRegex).join("|")),
deser: function deser(_ref2) {
var s2 = _ref2[0];
return strings.findIndex(function(i) {
return stripInsensitivities(s2) === stripInsensitivities(i);
}) + startIndex;
}
};
}
}
function offset(regex, groups) {
return {
regex,
deser: function deser(_ref3) {
var h = _ref3[1], m2 = _ref3[2];
return signedOffset(h, m2);
},
groups
};
}
function simple(regex) {
return {
regex,
deser: function deser(_ref4) {
var s2 = _ref4[0];
return s2;
}
};
}
function escapeToken(value) {
return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}
function unitForToken(token, loc) {
var one2 = digitRegex(loc), two = digitRegex(loc, "{2}"), three = digitRegex(loc, "{3}"), four = digitRegex(loc, "{4}"), six = digitRegex(loc, "{6}"), oneOrTwo = digitRegex(loc, "{1,2}"), oneToThree = digitRegex(loc, "{1,3}"), oneToSix = digitRegex(loc, "{1,6}"), oneToNine = digitRegex(loc, "{1,9}"), twoToFour = digitRegex(loc, "{2,4}"), fourToSix = digitRegex(loc, "{4,6}"), literal = function literal2(t) {
return {
regex: RegExp(escapeToken(t.val)),
deser: function deser(_ref5) {
var s2 = _ref5[0];
return s2;
},
literal: true
};
}, unitate = function unitate2(t) {
if (token.literal) {
return literal(t);
}
switch (t.val) {
case "G":
return oneOf(loc.eras("short", false), 0);
case "GG":
return oneOf(loc.eras("long", false), 0);
case "y":
return intUnit(oneToSix);
case "yy":
return intUnit(twoToFour, untruncateYear);
case "yyyy":
return intUnit(four);
case "yyyyy":
return intUnit(fourToSix);
case "yyyyyy":
return intUnit(six);
case "M":
return intUnit(oneOrTwo);
case "MM":
return intUnit(two);
case "MMM":
return oneOf(loc.months("short", true, false), 1);
case "MMMM":
return oneOf(loc.months("long", true, false), 1);
case "L":
return intUnit(oneOrTwo);
case "LL":
return intUnit(two);
case "LLL":
return oneOf(loc.months("short", false, false), 1);
case "LLLL":
return oneOf(loc.months("long", false, false), 1);
case "d":
return intUnit(oneOrTwo);
case "dd":
return intUnit(two);
case "o":
return intUnit(oneToThree);
case "ooo":
return intUnit(three);
case "HH":
return intUnit(two);
case "H":
return intUnit(oneOrTwo);
case "hh":
return intUnit(two);
case "h":
return intUnit(oneOrTwo);
case "mm":
return intUnit(two);
case "m":
return intUnit(oneOrTwo);
case "q":
return intUnit(oneOrTwo);
case "qq":
return intUnit(two);
case "s":
return intUnit(oneOrTwo);
case "ss":
return intUnit(two);
case "S":
return intUnit(oneToThree);
case "SSS":
return intUnit(three);
case "u":
return simple(oneToNine);
case "uu":
return simple(oneOrTwo);
case "uuu":
return intUnit(one2);
case "a":
return oneOf(loc.meridiems(), 0);
case "kkkk":
return intUnit(four);
case "kk":
return intUnit(twoToFour, untruncateYear);
case "W":
return intUnit(oneOrTwo);
case "WW":
return intUnit(two);
case "E":
case "c":
return intUnit(one2);
case "EEE":
return oneOf(loc.weekdays("short", false, false), 1);
case "EEEE":
return oneOf(loc.weekdays("long", false, false), 1);
case "ccc":
return oneOf(loc.weekdays("short", true, false), 1);
case "cccc":
return oneOf(loc.weekdays("long", true, false), 1);
case "Z":
case "ZZ":
return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2);
case "ZZZ":
return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2);
case "z":
return simple(/[a-z_+-/]{1,256}?/i);
default:
return literal(t);
}
};
var unit2 = unitate(token) || {
invalidReason: MISSING_FTP
};
unit2.token = token;
return unit2;
}
var partTypeStyleToTokenVal = {
year: {
"2-digit": "yy",
numeric: "yyyyy"
},
month: {
numeric: "M",
"2-digit": "MM",
short: "MMM",
long: "MMMM"
},
day: {
numeric: "d",
"2-digit": "dd"
},
weekday: {
short: "EEE",
long: "EEEE"
},
dayperiod: "a",
dayPeriod: "a",
hour: {
numeric: "h",
"2-digit": "hh"
},
minute: {
numeric: "m",
"2-digit": "mm"
},
second: {
numeric: "s",
"2-digit": "ss"
}
};
function tokenForPart(part, locale2, formatOpts) {
var type2 = part.type, value = part.value;
if (type2 === "literal") {
return {
literal: true,
val: value
};
}
var style = formatOpts[type2];
var val = partTypeStyleToTokenVal[type2];
if (typeof val === "object") {
val = val[style];
}
if (val) {
return {
literal: false,
val
};
}
return void 0;
}
function buildRegex(units) {
var re2 = units.map(function(u) {
return u.regex;
}).reduce(function(f, r) {
return f + "(" + r.source + ")";
}, "");
return ["^" + re2 + "$", units];
}
function match(input, regex, handlers) {
var matches = input.match(regex);
if (matches) {
var all = {};
var matchIndex = 1;
for (var i in handlers) {
if (hasOwnProperty(handlers, i)) {
var h = handlers[i], groups = h.groups ? h.groups + 1 : 1;
if (!h.literal && h.token) {
all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));
}
matchIndex += groups;
}
}
return [matches, all];
} else {
return [matches, {}];
}
}
function dateTimeFromMatches(matches) {
var toField = function toField2(token) {
switch (token) {
case "S":
return "millisecond";
case "s":
return "second";
case "m":
return "minute";
case "h":
case "H":
return "hour";
case "d":
return "day";
case "o":
return "ordinal";
case "L":
case "M":
return "month";
case "y":
return "year";
case "E":
case "c":
return "weekday";
case "W":
return "weekNumber";
case "k":
return "weekYear";
case "q":
return "quarter";
default:
return null;
}
};
var zone = null;
var specificOffset;
if (!isUndefined(matches.z)) {
zone = IANAZone.create(matches.z);
}
if (!isUndefined(matches.Z)) {
if (!zone) {
zone = new FixedOffsetZone(matches.Z);
}
specificOffset = matches.Z;
}
if (!isUndefined(matches.q)) {
matches.M = (matches.q - 1) * 3 + 1;
}
if (!isUndefined(matches.h)) {
if (matches.h < 12 && matches.a === 1) {
matches.h += 12;
} else if (matches.h === 12 && matches.a === 0) {
matches.h = 0;
}
}
if (matches.G === 0 && matches.y) {
matches.y = -matches.y;
}
if (!isUndefined(matches.u)) {
matches.S = parseMillis(matches.u);
}
var vals = Object.keys(matches).reduce(function(r, k) {
var f = toField(k);
if (f) {
r[f] = matches[k];
}
return r;
}, {});
return [vals, zone, specificOffset];
}
var dummyDateTimeCache = null;
function getDummyDateTime() {
if (!dummyDateTimeCache) {
dummyDateTimeCache = DateTime2.fromMillis(1555555555555);
}
return dummyDateTimeCache;
}
function maybeExpandMacroToken(token, locale2) {
if (token.literal) {
return token;
}
var formatOpts = Formatter.macroTokenToFormatOpts(token.val);
if (!formatOpts) {
return token;
}
var formatter = Formatter.create(locale2, formatOpts);
var parts = formatter.formatDateTimeParts(getDummyDateTime());
var tokens = parts.map(function(p) {
return tokenForPart(p, locale2, formatOpts);
});
if (tokens.includes(void 0)) {
return token;
}
return tokens;
}
function expandMacroTokens(tokens, locale2) {
var _Array$prototype;
return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function(t) {
return maybeExpandMacroToken(t, locale2);
}));
}
function explainFromTokens(locale2, input, format2) {
var tokens = expandMacroTokens(Formatter.parseFormat(format2), locale2), units = tokens.map(function(t) {
return unitForToken(t, locale2);
}), disqualifyingUnit = units.find(function(t) {
return t.invalidReason;
});
if (disqualifyingUnit) {
return {
input,
tokens,
invalidReason: disqualifyingUnit.invalidReason
};
} else {
var _buildRegex = buildRegex(units), regexString = _buildRegex[0], handlers = _buildRegex[1], regex = RegExp(regexString, "i"), _match = match(input, regex, handlers), rawMatches = _match[0], matches = _match[1], _ref6 = matches ? dateTimeFromMatches(matches) : [null, null, void 0], result = _ref6[0], zone = _ref6[1], specificOffset = _ref6[2];
if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) {
throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format");
}
return {
input,
tokens,
regex,
rawMatches,
matches,
result,
zone,
specificOffset
};
}
}
function parseFromTokens(locale2, input, format2) {
var _explainFromTokens = explainFromTokens(locale2, input, format2), result = _explainFromTokens.result, zone = _explainFromTokens.zone, specificOffset = _explainFromTokens.specificOffset, invalidReason = _explainFromTokens.invalidReason;
return [result, zone, specificOffset, invalidReason];
}
var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
var leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];
function unitOutOfRange(unit2, value) {
return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit2 + ", which is invalid");
}
function dayOfWeek(year, month, day) {
var js = new Date(Date.UTC(year, month - 1, day)).getUTCDay();
return js === 0 ? 7 : js;
}
function computeOrdinal(year, month, day) {
return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];
}
function uncomputeOrdinal(year, ordinal2) {
var table = isLeapYear(year) ? leapLadder : nonLeapLadder, month0 = table.findIndex(function(i) {
return i < ordinal2;
}), day = ordinal2 - table[month0];
return {
month: month0 + 1,
day
};
}
function gregorianToWeek(gregObj) {
var year = gregObj.year, month = gregObj.month, day = gregObj.day, ordinal2 = computeOrdinal(year, month, day), weekday = dayOfWeek(year, month, day);
var weekNumber = Math.floor((ordinal2 - weekday + 10) / 7), weekYear;
if (weekNumber < 1) {
weekYear = year - 1;
weekNumber = weeksInWeekYear(weekYear);
} else if (weekNumber > weeksInWeekYear(year)) {
weekYear = year + 1;
weekNumber = 1;
} else {
weekYear = year;
}
return _extends({
weekYear,
weekNumber,
weekday
}, timeObject(gregObj));
}
function weekToGregorian(weekData) {
var weekYear = weekData.weekYear, weekNumber = weekData.weekNumber, weekday = weekData.weekday, weekdayOfJan4 = dayOfWeek(weekYear, 1, 4), yearInDays = daysInYear(weekYear);
var ordinal2 = weekNumber * 7 + weekday - weekdayOfJan4 - 3, year;
if (ordinal2 < 1) {
year = weekYear - 1;
ordinal2 += daysInYear(year);
} else if (ordinal2 > yearInDays) {
year = weekYear + 1;
ordinal2 -= daysInYear(weekYear);
} else {
year = weekYear;
}
var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal2), month = _uncomputeOrdinal.month, day = _uncomputeOrdinal.day;
return _extends({
year,
month,
day
}, timeObject(weekData));
}
function gregorianToOrdinal(gregData) {
var year = gregData.year, month = gregData.month, day = gregData.day;
var ordinal2 = computeOrdinal(year, month, day);
return _extends({
year,
ordinal: ordinal2
}, timeObject(gregData));
}
function ordinalToGregorian(ordinalData) {
var year = ordinalData.year, ordinal2 = ordinalData.ordinal;
var _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal2), month = _uncomputeOrdinal2.month, day = _uncomputeOrdinal2.day;
return _extends({
year,
month,
day
}, timeObject(ordinalData));
}
function hasInvalidWeekData(obj) {
var validYear = isInteger(obj.weekYear), validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear)), validWeekday = integerBetween(obj.weekday, 1, 7);
if (!validYear) {
return unitOutOfRange("weekYear", obj.weekYear);
} else if (!validWeek) {
return unitOutOfRange("week", obj.week);
} else if (!validWeekday) {
return unitOutOfRange("weekday", obj.weekday);
} else
return false;
}
function hasInvalidOrdinalData(obj) {
var validYear = isInteger(obj.year), validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));
if (!validYear) {
return unitOutOfRange("year", obj.year);
} else if (!validOrdinal) {
return unitOutOfRange("ordinal", obj.ordinal);
} else
return false;
}
function hasInvalidGregorianData(obj) {
var validYear = isInteger(obj.year), validMonth = integerBetween(obj.month, 1, 12), validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));
if (!validYear) {
return unitOutOfRange("year", obj.year);
} else if (!validMonth) {
return unitOutOfRange("month", obj.month);
} else if (!validDay) {
return unitOutOfRange("day", obj.day);
} else
return false;
}
function hasInvalidTimeData(obj) {
var hour = obj.hour, minute = obj.minute, second = obj.second, millisecond = obj.millisecond;
var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, validMinute = integerBetween(minute, 0, 59), validSecond = integerBetween(second, 0, 59), validMillisecond = integerBetween(millisecond, 0, 999);
if (!validHour) {
return unitOutOfRange("hour", hour);
} else if (!validMinute) {
return unitOutOfRange("minute", minute);
} else if (!validSecond) {
return unitOutOfRange("second", second);
} else if (!validMillisecond) {
return unitOutOfRange("millisecond", millisecond);
} else
return false;
}
var INVALID = "Invalid DateTime";
var MAX_DATE = 864e13;
function unsupportedZone(zone) {
return new Invalid("unsupported zone", 'the zone "' + zone.name + '" is not supported');
}
function possiblyCachedWeekData(dt) {
if (dt.weekData === null) {
dt.weekData = gregorianToWeek(dt.c);
}
return dt.weekData;
}
function clone(inst, alts) {
var current = {
ts: inst.ts,
zone: inst.zone,
c: inst.c,
o: inst.o,
loc: inst.loc,
invalid: inst.invalid
};
return new DateTime2(_extends({}, current, alts, {
old: current
}));
}
function fixOffset(localTS, o, tz) {
var utcGuess = localTS - o * 60 * 1e3;
var o2 = tz.offset(utcGuess);
if (o === o2) {
return [utcGuess, o];
}
utcGuess -= (o2 - o) * 60 * 1e3;
var o3 = tz.offset(utcGuess);
if (o2 === o3) {
return [utcGuess, o2];
}
return [localTS - Math.min(o2, o3) * 60 * 1e3, Math.max(o2, o3)];
}
function tsToObj(ts, offset2) {
ts += offset2 * 60 * 1e3;
var d = new Date(ts);
return {
year: d.getUTCFullYear(),
month: d.getUTCMonth() + 1,
day: d.getUTCDate(),
hour: d.getUTCHours(),
minute: d.getUTCMinutes(),
second: d.getUTCSeconds(),
millisecond: d.getUTCMilliseconds()
};
}
function objToTS(obj, offset2, zone) {
return fixOffset(objToLocalTS(obj), offset2, zone);
}
function adjustTime(inst, dur) {
var oPre = inst.o, year = inst.c.year + Math.trunc(dur.years), month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, c3 = _extends({}, inst.c, {
year,
month,
day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7
}), millisToAdd = Duration.fromObject({
years: dur.years - Math.trunc(dur.years),
quarters: dur.quarters - Math.trunc(dur.quarters),
months: dur.months - Math.trunc(dur.months),
weeks: dur.weeks - Math.trunc(dur.weeks),
days: dur.days - Math.trunc(dur.days),
hours: dur.hours,
minutes: dur.minutes,
seconds: dur.seconds,
milliseconds: dur.milliseconds
}).as("milliseconds"), localTS = objToLocalTS(c3);
var _fixOffset = fixOffset(localTS, oPre, inst.zone), ts = _fixOffset[0], o = _fixOffset[1];
if (millisToAdd !== 0) {
ts += millisToAdd;
o = inst.zone.offset(ts);
}
return {
ts,
o
};
}
function parseDataToDateTime(parsed, parsedZone, opts, format2, text2, specificOffset) {
var setZone = opts.setZone, zone = opts.zone;
if (parsed && Object.keys(parsed).length !== 0) {
var interpretationZone = parsedZone || zone, inst = DateTime2.fromObject(parsed, _extends({}, opts, {
zone: interpretationZone,
specificOffset
}));
return setZone ? inst : inst.setZone(zone);
} else {
return DateTime2.invalid(new Invalid("unparsable", 'the input "' + text2 + `" can't be parsed as ` + format2));
}
}
function toTechFormat(dt, format2, allowZ) {
if (allowZ === void 0) {
allowZ = true;
}
return dt.isValid ? Formatter.create(Locale.create("en-US"), {
allowZ,
forceSimple: true
}).formatDateTimeFromString(dt, format2) : null;
}
function _toISODate(o, extended) {
var longFormat = o.c.year > 9999 || o.c.year < 0;
var c3 = "";
if (longFormat && o.c.year >= 0)
c3 += "+";
c3 += padStart(o.c.year, longFormat ? 6 : 4);
if (extended) {
c3 += "-";
c3 += padStart(o.c.month);
c3 += "-";
c3 += padStart(o.c.day);
} else {
c3 += padStart(o.c.month);
c3 += padStart(o.c.day);
}
return c3;
}
function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset) {
var c3 = padStart(o.c.hour);
if (extended) {
c3 += ":";
c3 += padStart(o.c.minute);
if (o.c.second !== 0 || !suppressSeconds) {
c3 += ":";
}
} else {
c3 += padStart(o.c.minute);
}
if (o.c.second !== 0 || !suppressSeconds) {
c3 += padStart(o.c.second);
if (o.c.millisecond !== 0 || !suppressMilliseconds) {
c3 += ".";
c3 += padStart(o.c.millisecond, 3);
}
}
if (includeOffset) {
if (o.isOffsetFixed && o.offset === 0) {
c3 += "Z";
} else if (o.o < 0) {
c3 += "-";
c3 += padStart(Math.trunc(-o.o / 60));
c3 += ":";
c3 += padStart(Math.trunc(-o.o % 60));
} else {
c3 += "+";
c3 += padStart(Math.trunc(o.o / 60));
c3 += ":";
c3 += padStart(Math.trunc(o.o % 60));
}
}
return c3;
}
var defaultUnitValues = {
month: 1,
day: 1,
hour: 0,
minute: 0,
second: 0,
millisecond: 0
};
var defaultWeekUnitValues = {
weekNumber: 1,
weekday: 1,
hour: 0,
minute: 0,
second: 0,
millisecond: 0
};
var defaultOrdinalUnitValues = {
ordinal: 1,
hour: 0,
minute: 0,
second: 0,
millisecond: 0
};
var orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"];
var orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"];
var orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"];
function normalizeUnit(unit2) {
var normalized = {
year: "year",
years: "year",
month: "month",
months: "month",
day: "day",
days: "day",
hour: "hour",
hours: "hour",
minute: "minute",
minutes: "minute",
quarter: "quarter",
quarters: "quarter",
second: "second",
seconds: "second",
millisecond: "millisecond",
milliseconds: "millisecond",
weekday: "weekday",
weekdays: "weekday",
weeknumber: "weekNumber",
weeksnumber: "weekNumber",
weeknumbers: "weekNumber",
weekyear: "weekYear",
weekyears: "weekYear",
ordinal: "ordinal"
}[unit2.toLowerCase()];
if (!normalized)
throw new InvalidUnitError(unit2);
return normalized;
}
function quickDT(obj, opts) {
var zone = normalizeZone(opts.zone, Settings.defaultZone), loc = Locale.fromObject(opts), tsNow = Settings.now();
var ts, o;
if (!isUndefined(obj.year)) {
for (var _iterator = _createForOfIteratorHelperLoose(orderedUnits), _step; !(_step = _iterator()).done; ) {
var u = _step.value;
if (isUndefined(obj[u])) {
obj[u] = defaultUnitValues[u];
}
}
var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);
if (invalid) {
return DateTime2.invalid(invalid);
}
var offsetProvis = zone.offset(tsNow);
var _objToTS = objToTS(obj, offsetProvis, zone);
ts = _objToTS[0];
o = _objToTS[1];
} else {
ts = tsNow;
}
return new DateTime2({
ts,
zone,
loc,
o
});
}
function diffRelative(start2, end, opts) {
var round = isUndefined(opts.round) ? true : opts.round, format2 = function format3(c3, unit3) {
c3 = roundTo(c3, round || opts.calendary ? 0 : 2, true);
var formatter = end.loc.clone(opts).relFormatter(opts);
return formatter.format(c3, unit3);
}, differ = function differ2(unit3) {
if (opts.calendary) {
if (!end.hasSame(start2, unit3)) {
return end.startOf(unit3).diff(start2.startOf(unit3), unit3).get(unit3);
} else
return 0;
} else {
return end.diff(start2, unit3).get(unit3);
}
};
if (opts.unit) {
return format2(differ(opts.unit), opts.unit);
}
for (var _iterator2 = _createForOfIteratorHelperLoose(opts.units), _step2; !(_step2 = _iterator2()).done; ) {
var unit2 = _step2.value;
var count2 = differ(unit2);
if (Math.abs(count2) >= 1) {
return format2(count2, unit2);
}
}
return format2(start2 > end ? -0 : 0, opts.units[opts.units.length - 1]);
}
function lastOpts(argList) {
var opts = {}, args;
if (argList.length > 0 && typeof argList[argList.length - 1] === "object") {
opts = argList[argList.length - 1];
args = Array.from(argList).slice(0, argList.length - 1);
} else {
args = Array.from(argList);
}
return [opts, args];
}
var DateTime2 = /* @__PURE__ */ function() {
function DateTime3(config) {
var zone = config.zone || Settings.defaultZone;
var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null);
this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;
var c3 = null, o = null;
if (!invalid) {
var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);
if (unchanged) {
var _ref = [config.old.c, config.old.o];
c3 = _ref[0];
o = _ref[1];
} else {
var ot = zone.offset(this.ts);
c3 = tsToObj(this.ts, ot);
invalid = Number.isNaN(c3.year) ? new Invalid("invalid input") : null;
c3 = invalid ? null : c3;
o = invalid ? null : ot;
}
}
this._zone = zone;
this.loc = config.loc || Locale.create();
this.invalid = invalid;
this.weekData = null;
this.c = c3;
this.o = o;
this.isLuxonDateTime = true;
}
DateTime3.now = function now3() {
return new DateTime3({});
};
DateTime3.local = function local() {
var _lastOpts = lastOpts(arguments), opts = _lastOpts[0], args = _lastOpts[1], year = args[0], month = args[1], day = args[2], hour = args[3], minute = args[4], second = args[5], millisecond = args[6];
return quickDT({
year,
month,
day,
hour,
minute,
second,
millisecond
}, opts);
};
DateTime3.utc = function utc() {
var _lastOpts2 = lastOpts(arguments), opts = _lastOpts2[0], args = _lastOpts2[1], year = args[0], month = args[1], day = args[2], hour = args[3], minute = args[4], second = args[5], millisecond = args[6];
opts.zone = FixedOffsetZone.utcInstance;
return quickDT({
year,
month,
day,
hour,
minute,
second,
millisecond
}, opts);
};
DateTime3.fromJSDate = function fromJSDate(date, options) {
if (options === void 0) {
options = {};
}
var ts = isDate(date) ? date.valueOf() : NaN;
if (Number.isNaN(ts)) {
return DateTime3.invalid("invalid input");
}
var zoneToUse = normalizeZone(options.zone, Settings.defaultZone);
if (!zoneToUse.isValid) {
return DateTime3.invalid(unsupportedZone(zoneToUse));
}
return new DateTime3({
ts,
zone: zoneToUse,
loc: Locale.fromObject(options)
});
};
DateTime3.fromMillis = function fromMillis(milliseconds, options) {
if (options === void 0) {
options = {};
}
if (!isNumber(milliseconds)) {
throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds);
} else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {
return DateTime3.invalid("Timestamp out of range");
} else {
return new DateTime3({
ts: milliseconds,
zone: normalizeZone(options.zone, Settings.defaultZone),
loc: Locale.fromObject(options)
});
}
};
DateTime3.fromSeconds = function fromSeconds(seconds, options) {
if (options === void 0) {
options = {};
}
if (!isNumber(seconds)) {
throw new InvalidArgumentError("fromSeconds requires a numerical input");
} else {
return new DateTime3({
ts: seconds * 1e3,
zone: normalizeZone(options.zone, Settings.defaultZone),
loc: Locale.fromObject(options)
});
}
};
DateTime3.fromObject = function fromObject(obj, opts) {
if (opts === void 0) {
opts = {};
}
obj = obj || {};
var zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);
if (!zoneToUse.isValid) {
return DateTime3.invalid(unsupportedZone(zoneToUse));
}
var tsNow = Settings.now(), offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), normalized = normalizeObject(obj, normalizeUnit), containsOrdinal = !isUndefined(normalized.ordinal), containsGregorYear = !isUndefined(normalized.year), containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), containsGregor = containsGregorYear || containsGregorMD, definiteWeekDef = normalized.weekYear || normalized.weekNumber, loc = Locale.fromObject(opts);
if ((containsGregor || containsOrdinal) && definiteWeekDef) {
throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals");
}
if (containsGregorMD && containsOrdinal) {
throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day");
}
var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor;
var units, defaultValues, objNow = tsToObj(tsNow, offsetProvis);
if (useWeekData) {
units = orderedWeekUnits;
defaultValues = defaultWeekUnitValues;
objNow = gregorianToWeek(objNow);
} else if (containsOrdinal) {
units = orderedOrdinalUnits;
defaultValues = defaultOrdinalUnitValues;
objNow = gregorianToOrdinal(objNow);
} else {
units = orderedUnits;
defaultValues = defaultUnitValues;
}
var foundFirst = false;
for (var _iterator3 = _createForOfIteratorHelperLoose(units), _step3; !(_step3 = _iterator3()).done; ) {
var u = _step3.value;
var v = normalized[u];
if (!isUndefined(v)) {
foundFirst = true;
} else if (foundFirst) {
normalized[u] = defaultValues[u];
} else {
normalized[u] = objNow[u];
}
}
var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), invalid = higherOrderInvalid || hasInvalidTimeData(normalized);
if (invalid) {
return DateTime3.invalid(invalid);
}
var gregorian = useWeekData ? weekToGregorian(normalized) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), tsFinal = _objToTS2[0], offsetFinal = _objToTS2[1], inst = new DateTime3({
ts: tsFinal,
zone: zoneToUse,
o: offsetFinal,
loc
});
if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {
return DateTime3.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO());
}
return inst;
};
DateTime3.fromISO = function fromISO(text2, opts) {
if (opts === void 0) {
opts = {};
}
var _parseISODate = parseISODate(text2), vals = _parseISODate[0], parsedZone = _parseISODate[1];
return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text2);
};
DateTime3.fromRFC2822 = function fromRFC2822(text2, opts) {
if (opts === void 0) {
opts = {};
}
var _parseRFC2822Date = parseRFC2822Date(text2), vals = _parseRFC2822Date[0], parsedZone = _parseRFC2822Date[1];
return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text2);
};
DateTime3.fromHTTP = function fromHTTP(text2, opts) {
if (opts === void 0) {
opts = {};
}
var _parseHTTPDate = parseHTTPDate(text2), vals = _parseHTTPDate[0], parsedZone = _parseHTTPDate[1];
return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts);
};
DateTime3.fromFormat = function fromFormat(text2, fmt, opts) {
if (opts === void 0) {
opts = {};
}
if (isUndefined(text2) || isUndefined(fmt)) {
throw new InvalidArgumentError("fromFormat requires an input string and a format");
}
var _opts = opts, _opts$locale = _opts.locale, locale2 = _opts$locale === void 0 ? null : _opts$locale, _opts$numberingSystem = _opts.numberingSystem, numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, localeToUse = Locale.fromOpts({
locale: locale2,
numberingSystem,
defaultToEN: true
}), _parseFromTokens = parseFromTokens(localeToUse, text2, fmt), vals = _parseFromTokens[0], parsedZone = _parseFromTokens[1], specificOffset = _parseFromTokens[2], invalid = _parseFromTokens[3];
if (invalid) {
return DateTime3.invalid(invalid);
} else {
return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text2, specificOffset);
}
};
DateTime3.fromString = function fromString(text2, fmt, opts) {
if (opts === void 0) {
opts = {};
}
return DateTime3.fromFormat(text2, fmt, opts);
};
DateTime3.fromSQL = function fromSQL(text2, opts) {
if (opts === void 0) {
opts = {};
}
var _parseSQL = parseSQL(text2), vals = _parseSQL[0], parsedZone = _parseSQL[1];
return parseDataToDateTime(vals, parsedZone, opts, "SQL", text2);
};
DateTime3.invalid = function invalid(reason, explanation) {
if (explanation === void 0) {
explanation = null;
}
if (!reason) {
throw new InvalidArgumentError("need to specify a reason the DateTime is invalid");
}
var invalid2 = reason instanceof Invalid ? reason : new Invalid(reason, explanation);
if (Settings.throwOnInvalid) {
throw new InvalidDateTimeError(invalid2);
} else {
return new DateTime3({
invalid: invalid2
});
}
};
DateTime3.isDateTime = function isDateTime(o) {
return o && o.isLuxonDateTime || false;
};
var _proto = DateTime3.prototype;
_proto.get = function get3(unit2) {
return this[unit2];
};
_proto.resolvedLocaleOptions = function resolvedLocaleOptions(opts) {
if (opts === void 0) {
opts = {};
}
var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), locale2 = _Formatter$create$res.locale, numberingSystem = _Formatter$create$res.numberingSystem, calendar = _Formatter$create$res.calendar;
return {
locale: locale2,
numberingSystem,
outputCalendar: calendar
};
};
_proto.toUTC = function toUTC(offset2, opts) {
if (offset2 === void 0) {
offset2 = 0;
}
if (opts === void 0) {
opts = {};
}
return this.setZone(FixedOffsetZone.instance(offset2), opts);
};
_proto.toLocal = function toLocal() {
return this.setZone(Settings.defaultZone);
};
_proto.setZone = function setZone(zone, _temp) {
var _ref2 = _temp === void 0 ? {} : _temp, _ref2$keepLocalTime = _ref2.keepLocalTime, keepLocalTime = _ref2$keepLocalTime === void 0 ? false : _ref2$keepLocalTime, _ref2$keepCalendarTim = _ref2.keepCalendarTime, keepCalendarTime = _ref2$keepCalendarTim === void 0 ? false : _ref2$keepCalendarTim;
zone = normalizeZone(zone, Settings.defaultZone);
if (zone.equals(this.zone)) {
return this;
} else if (!zone.isValid) {
return DateTime3.invalid(unsupportedZone(zone));
} else {
var newTS = this.ts;
if (keepLocalTime || keepCalendarTime) {
var offsetGuess = zone.offset(this.ts);
var asObj = this.toObject();
var _objToTS3 = objToTS(asObj, offsetGuess, zone);
newTS = _objToTS3[0];
}
return clone(this, {
ts: newTS,
zone
});
}
};
_proto.reconfigure = function reconfigure(_temp2) {
var _ref3 = _temp2 === void 0 ? {} : _temp2, locale2 = _ref3.locale, numberingSystem = _ref3.numberingSystem, outputCalendar = _ref3.outputCalendar;
var loc = this.loc.clone({
locale: locale2,
numberingSystem,
outputCalendar
});
return clone(this, {
loc
});
};
_proto.setLocale = function setLocale(locale2) {
return this.reconfigure({
locale: locale2
});
};
_proto.set = function set3(values) {
if (!this.isValid)
return this;
var normalized = normalizeObject(values, normalizeUnit), settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), containsOrdinal = !isUndefined(normalized.ordinal), containsGregorYear = !isUndefined(normalized.year), containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), containsGregor = containsGregorYear || containsGregorMD, definiteWeekDef = normalized.weekYear || normalized.weekNumber;
if ((containsGregor || containsOrdinal) && definiteWeekDef) {
throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals");
}
if (containsGregorMD && containsOrdinal) {
throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day");
}
var mixed;
if (settingWeekStuff) {
mixed = weekToGregorian(_extends({}, gregorianToWeek(this.c), normalized));
} else if (!isUndefined(normalized.ordinal)) {
mixed = ordinalToGregorian(_extends({}, gregorianToOrdinal(this.c), normalized));
} else {
mixed = _extends({}, this.toObject(), normalized);
if (isUndefined(normalized.day)) {
mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);
}
}
var _objToTS4 = objToTS(mixed, this.o, this.zone), ts = _objToTS4[0], o = _objToTS4[1];
return clone(this, {
ts,
o
});
};
_proto.plus = function plus(duration) {
if (!this.isValid)
return this;
var dur = Duration.fromDurationLike(duration);
return clone(this, adjustTime(this, dur));
};
_proto.minus = function minus(duration) {
if (!this.isValid)
return this;
var dur = Duration.fromDurationLike(duration).negate();
return clone(this, adjustTime(this, dur));
};
_proto.startOf = function startOf(unit2) {
if (!this.isValid)
return this;
var o = {}, normalizedUnit = Duration.normalizeUnit(unit2);
switch (normalizedUnit) {
case "years":
o.month = 1;
case "quarters":
case "months":
o.day = 1;
case "weeks":
case "days":
o.hour = 0;
case "hours":
o.minute = 0;
case "minutes":
o.second = 0;
case "seconds":
o.millisecond = 0;
break;
}
if (normalizedUnit === "weeks") {
o.weekday = 1;
}
if (normalizedUnit === "quarters") {
var q = Math.ceil(this.month / 3);
o.month = (q - 1) * 3 + 1;
}
return this.set(o);
};
_proto.endOf = function endOf(unit2) {
var _this$plus;
return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit2] = 1, _this$plus)).startOf(unit2).minus(1) : this;
};
_proto.toFormat = function toFormat(fmt, opts) {
if (opts === void 0) {
opts = {};
}
return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID;
};
_proto.toLocaleString = function toLocaleString(formatOpts, opts) {
if (formatOpts === void 0) {
formatOpts = DATE_SHORT;
}
if (opts === void 0) {
opts = {};
}
return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID;
};
_proto.toLocaleParts = function toLocaleParts(opts) {
if (opts === void 0) {
opts = {};
}
return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : [];
};
_proto.toISO = function toISO(_temp3) {
var _ref4 = _temp3 === void 0 ? {} : _temp3, _ref4$format = _ref4.format, format2 = _ref4$format === void 0 ? "extended" : _ref4$format, _ref4$suppressSeconds = _ref4.suppressSeconds, suppressSeconds = _ref4$suppressSeconds === void 0 ? false : _ref4$suppressSeconds, _ref4$suppressMillise = _ref4.suppressMilliseconds, suppressMilliseconds = _ref4$suppressMillise === void 0 ? false : _ref4$suppressMillise, _ref4$includeOffset = _ref4.includeOffset, includeOffset = _ref4$includeOffset === void 0 ? true : _ref4$includeOffset;
if (!this.isValid) {
return null;
}
var ext = format2 === "extended";
var c3 = _toISODate(this, ext);
c3 += "T";
c3 += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset);
return c3;
};
_proto.toISODate = function toISODate(_temp4) {
var _ref5 = _temp4 === void 0 ? {} : _temp4, _ref5$format = _ref5.format, format2 = _ref5$format === void 0 ? "extended" : _ref5$format;
if (!this.isValid) {
return null;
}
return _toISODate(this, format2 === "extended");
};
_proto.toISOWeekDate = function toISOWeekDate() {
return toTechFormat(this, "kkkk-'W'WW-c");
};
_proto.toISOTime = function toISOTime(_temp5) {
var _ref6 = _temp5 === void 0 ? {} : _temp5, _ref6$suppressMillise = _ref6.suppressMilliseconds, suppressMilliseconds = _ref6$suppressMillise === void 0 ? false : _ref6$suppressMillise, _ref6$suppressSeconds = _ref6.suppressSeconds, suppressSeconds = _ref6$suppressSeconds === void 0 ? false : _ref6$suppressSeconds, _ref6$includeOffset = _ref6.includeOffset, includeOffset = _ref6$includeOffset === void 0 ? true : _ref6$includeOffset, _ref6$includePrefix = _ref6.includePrefix, includePrefix = _ref6$includePrefix === void 0 ? false : _ref6$includePrefix, _ref6$format = _ref6.format, format2 = _ref6$format === void 0 ? "extended" : _ref6$format;
if (!this.isValid) {
return null;
}
var c3 = includePrefix ? "T" : "";
return c3 + _toISOTime(this, format2 === "extended", suppressSeconds, suppressMilliseconds, includeOffset);
};
_proto.toRFC2822 = function toRFC2822() {
return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false);
};
_proto.toHTTP = function toHTTP() {
return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'");
};
_proto.toSQLDate = function toSQLDate() {
if (!this.isValid) {
return null;
}
return _toISODate(this, true);
};
_proto.toSQLTime = function toSQLTime(_temp6) {
var _ref7 = _temp6 === void 0 ? {} : _temp6, _ref7$includeOffset = _ref7.includeOffset, includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, _ref7$includeZone = _ref7.includeZone, includeZone = _ref7$includeZone === void 0 ? false : _ref7$includeZone;
var fmt = "HH:mm:ss.SSS";
if (includeZone || includeOffset) {
fmt += " ";
if (includeZone) {
fmt += "z";
} else if (includeOffset) {
fmt += "ZZ";
}
}
return toTechFormat(this, fmt, true);
};
_proto.toSQL = function toSQL(opts) {
if (opts === void 0) {
opts = {};
}
if (!this.isValid) {
return null;
}
return this.toSQLDate() + " " + this.toSQLTime(opts);
};
_proto.toString = function toString() {
return this.isValid ? this.toISO() : INVALID;
};
_proto.valueOf = function valueOf() {
return this.toMillis();
};
_proto.toMillis = function toMillis() {
return this.isValid ? this.ts : NaN;
};
_proto.toSeconds = function toSeconds() {
return this.isValid ? this.ts / 1e3 : NaN;
};
_proto.toJSON = function toJSON() {
return this.toISO();
};
_proto.toBSON = function toBSON() {
return this.toJSDate();
};
_proto.toObject = function toObject(opts) {
if (opts === void 0) {
opts = {};
}
if (!this.isValid)
return {};
var base = _extends({}, this.c);
if (opts.includeConfig) {
base.outputCalendar = this.outputCalendar;
base.numberingSystem = this.loc.numberingSystem;
base.locale = this.loc.locale;
}
return base;
};
_proto.toJSDate = function toJSDate() {
return new Date(this.isValid ? this.ts : NaN);
};
_proto.diff = function diff(otherDateTime, unit2, opts) {
if (unit2 === void 0) {
unit2 = "milliseconds";
}
if (opts === void 0) {
opts = {};
}
if (!this.isValid || !otherDateTime.isValid) {
return Duration.invalid("created by diffing an invalid DateTime");
}
var durOpts = _extends({
locale: this.locale,
numberingSystem: this.numberingSystem
}, opts);
var units = maybeArray(unit2).map(Duration.normalizeUnit), otherIsLater = otherDateTime.valueOf() > this.valueOf(), earlier = otherIsLater ? this : otherDateTime, later = otherIsLater ? otherDateTime : this, diffed = _diff(earlier, later, units, durOpts);
return otherIsLater ? diffed.negate() : diffed;
};
_proto.diffNow = function diffNow(unit2, opts) {
if (unit2 === void 0) {
unit2 = "milliseconds";
}
if (opts === void 0) {
opts = {};
}
return this.diff(DateTime3.now(), unit2, opts);
};
_proto.until = function until(otherDateTime) {
return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;
};
_proto.hasSame = function hasSame(otherDateTime, unit2) {
if (!this.isValid)
return false;
var inputMs = otherDateTime.valueOf();
var adjustedToZone = this.setZone(otherDateTime.zone, {
keepLocalTime: true
});
return adjustedToZone.startOf(unit2) <= inputMs && inputMs <= adjustedToZone.endOf(unit2);
};
_proto.equals = function equals(other) {
return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc);
};
_proto.toRelative = function toRelative(options) {
if (options === void 0) {
options = {};
}
if (!this.isValid)
return null;
var base = options.base || DateTime3.fromObject({}, {
zone: this.zone
}), padding = options.padding ? this < base ? -options.padding : options.padding : 0;
var units = ["years", "months", "days", "hours", "minutes", "seconds"];
var unit2 = options.unit;
if (Array.isArray(options.unit)) {
units = options.unit;
unit2 = void 0;
}
return diffRelative(base, this.plus(padding), _extends({}, options, {
numeric: "always",
units,
unit: unit2
}));
};
_proto.toRelativeCalendar = function toRelativeCalendar(options) {
if (options === void 0) {
options = {};
}
if (!this.isValid)
return null;
return diffRelative(options.base || DateTime3.fromObject({}, {
zone: this.zone
}), this, _extends({}, options, {
numeric: "auto",
units: ["years", "months", "days"],
calendary: true
}));
};
DateTime3.min = function min3() {
for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) {
dateTimes[_key] = arguments[_key];
}
if (!dateTimes.every(DateTime3.isDateTime)) {
throw new InvalidArgumentError("min requires all arguments be DateTimes");
}
return bestBy(dateTimes, function(i) {
return i.valueOf();
}, Math.min);
};
DateTime3.max = function max4() {
for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
dateTimes[_key2] = arguments[_key2];
}
if (!dateTimes.every(DateTime3.isDateTime)) {
throw new InvalidArgumentError("max requires all arguments be DateTimes");
}
return bestBy(dateTimes, function(i) {
return i.valueOf();
}, Math.max);
};
DateTime3.fromFormatExplain = function fromFormatExplain(text2, fmt, options) {
if (options === void 0) {
options = {};
}
var _options = options, _options$locale = _options.locale, locale2 = _options$locale === void 0 ? null : _options$locale, _options$numberingSys = _options.numberingSystem, numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, localeToUse = Locale.fromOpts({
locale: locale2,
numberingSystem,
defaultToEN: true
});
return explainFromTokens(localeToUse, text2, fmt);
};
DateTime3.fromStringExplain = function fromStringExplain(text2, fmt, options) {
if (options === void 0) {
options = {};
}
return DateTime3.fromFormatExplain(text2, fmt, options);
};
_createClass(DateTime3, [{
key: "isValid",
get: function get3() {
return this.invalid === null;
}
}, {
key: "invalidReason",
get: function get3() {
return this.invalid ? this.invalid.reason : null;
}
}, {
key: "invalidExplanation",
get: function get3() {
return this.invalid ? this.invalid.explanation : null;
}
}, {
key: "locale",
get: function get3() {
return this.isValid ? this.loc.locale : null;
}
}, {
key: "numberingSystem",
get: function get3() {
return this.isValid ? this.loc.numberingSystem : null;
}
}, {
key: "outputCalendar",
get: function get3() {
return this.isValid ? this.loc.outputCalendar : null;
}
}, {
key: "zone",
get: function get3() {
return this._zone;
}
}, {
key: "zoneName",
get: function get3() {
return this.isValid ? this.zone.name : null;
}
}, {
key: "year",
get: function get3() {
return this.isValid ? this.c.year : NaN;
}
}, {
key: "quarter",
get: function get3() {
return this.isValid ? Math.ceil(this.c.month / 3) : NaN;
}
}, {
key: "month",
get: function get3() {
return this.isValid ? this.c.month : NaN;
}
}, {
key: "day",
get: function get3() {
return this.isValid ? this.c.day : NaN;
}
}, {
key: "hour",
get: function get3() {
return this.isValid ? this.c.hour : NaN;
}
}, {
key: "minute",
get: function get3() {
return this.isValid ? this.c.minute : NaN;
}
}, {
key: "second",
get: function get3() {
return this.isValid ? this.c.second : NaN;
}
}, {
key: "millisecond",
get: function get3() {
return this.isValid ? this.c.millisecond : NaN;
}
}, {
key: "weekYear",
get: function get3() {
return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;
}
}, {
key: "weekNumber",
get: function get3() {
return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;
}
}, {
key: "weekday",
get: function get3() {
return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;
}
}, {
key: "ordinal",
get: function get3() {
return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;
}
}, {
key: "monthShort",
get: function get3() {
return this.isValid ? Info.months("short", {
locObj: this.loc
})[this.month - 1] : null;
}
}, {
key: "monthLong",
get: function get3() {
return this.isValid ? Info.months("long", {
locObj: this.loc
})[this.month - 1] : null;
}
}, {
key: "weekdayShort",
get: function get3() {
return this.isValid ? Info.weekdays("short", {
locObj: this.loc
})[this.weekday - 1] : null;
}
}, {
key: "weekdayLong",
get: function get3() {
return this.isValid ? Info.weekdays("long", {
locObj: this.loc
})[this.weekday - 1] : null;
}
}, {
key: "offset",
get: function get3() {
return this.isValid ? +this.o : NaN;
}
}, {
key: "offsetNameShort",
get: function get3() {
if (this.isValid) {
return this.zone.offsetName(this.ts, {
format: "short",
locale: this.locale
});
} else {
return null;
}
}
}, {
key: "offsetNameLong",
get: function get3() {
if (this.isValid) {
return this.zone.offsetName(this.ts, {
format: "long",
locale: this.locale
});
} else {
return null;
}
}
}, {
key: "isOffsetFixed",
get: function get3() {
return this.isValid ? this.zone.isUniversal : null;
}
}, {
key: "isInDST",
get: function get3() {
if (this.isOffsetFixed) {
return false;
} else {
return this.offset > this.set({
month: 1
}).offset || this.offset > this.set({
month: 5
}).offset;
}
}
}, {
key: "isInLeapYear",
get: function get3() {
return isLeapYear(this.year);
}
}, {
key: "daysInMonth",
get: function get3() {
return daysInMonth(this.year, this.month);
}
}, {
key: "daysInYear",
get: function get3() {
return this.isValid ? daysInYear(this.year) : NaN;
}
}, {
key: "weeksInWeekYear",
get: function get3() {
return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;
}
}], [{
key: "DATE_SHORT",
get: function get3() {
return DATE_SHORT;
}
}, {
key: "DATE_MED",
get: function get3() {
return DATE_MED;
}
}, {
key: "DATE_MED_WITH_WEEKDAY",
get: function get3() {
return DATE_MED_WITH_WEEKDAY;
}
}, {
key: "DATE_FULL",
get: function get3() {
return DATE_FULL;
}
}, {
key: "DATE_HUGE",
get: function get3() {
return DATE_HUGE;
}
}, {
key: "TIME_SIMPLE",
get: function get3() {
return TIME_SIMPLE;
}
}, {
key: "TIME_WITH_SECONDS",
get: function get3() {
return TIME_WITH_SECONDS;
}
}, {
key: "TIME_WITH_SHORT_OFFSET",
get: function get3() {
return TIME_WITH_SHORT_OFFSET;
}
}, {
key: "TIME_WITH_LONG_OFFSET",
get: function get3() {
return TIME_WITH_LONG_OFFSET;
}
}, {
key: "TIME_24_SIMPLE",
get: function get3() {
return TIME_24_SIMPLE;
}
}, {
key: "TIME_24_WITH_SECONDS",
get: function get3() {
return TIME_24_WITH_SECONDS;
}
}, {
key: "TIME_24_WITH_SHORT_OFFSET",
get: function get3() {
return TIME_24_WITH_SHORT_OFFSET;
}
}, {
key: "TIME_24_WITH_LONG_OFFSET",
get: function get3() {
return TIME_24_WITH_LONG_OFFSET;
}
}, {
key: "DATETIME_SHORT",
get: function get3() {
return DATETIME_SHORT;
}
}, {
key: "DATETIME_SHORT_WITH_SECONDS",
get: function get3() {
return DATETIME_SHORT_WITH_SECONDS;
}
}, {
key: "DATETIME_MED",
get: function get3() {
return DATETIME_MED;
}
}, {
key: "DATETIME_MED_WITH_SECONDS",
get: function get3() {
return DATETIME_MED_WITH_SECONDS;
}
}, {
key: "DATETIME_MED_WITH_WEEKDAY",
get: function get3() {
return DATETIME_MED_WITH_WEEKDAY;
}
}, {
key: "DATETIME_FULL",
get: function get3() {
return DATETIME_FULL;
}
}, {
key: "DATETIME_FULL_WITH_SECONDS",
get: function get3() {
return DATETIME_FULL_WITH_SECONDS;
}
}, {
key: "DATETIME_HUGE",
get: function get3() {
return DATETIME_HUGE;
}
}, {
key: "DATETIME_HUGE_WITH_SECONDS",
get: function get3() {
return DATETIME_HUGE_WITH_SECONDS;
}
}]);
return DateTime3;
}();
function friendlyDateTime(dateTimeish) {
if (DateTime2.isDateTime(dateTimeish)) {
return dateTimeish;
} else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {
return DateTime2.fromJSDate(dateTimeish);
} else if (dateTimeish && typeof dateTimeish === "object") {
return DateTime2.fromObject(dateTimeish);
} else {
throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish);
}
}
var VERSION = "2.3.0";
exports.DateTime = DateTime2;
exports.Duration = Duration;
exports.FixedOffsetZone = FixedOffsetZone;
exports.IANAZone = IANAZone;
exports.Info = Info;
exports.Interval = Interval;
exports.InvalidZone = InvalidZone;
exports.Settings = Settings;
exports.SystemZone = SystemZone;
exports.VERSION = VERSION;
exports.Zone = Zone;
}
});
// node_modules/lodash/lodash.js
var require_lodash = __commonJS({
"node_modules/lodash/lodash.js"(exports, module2) {
(function() {
var undefined2;
var VERSION = "4.17.21";
var LARGE_ARRAY_SIZE = 200;
var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`";
var HASH_UNDEFINED = "__lodash_hash_undefined__";
var MAX_MEMOIZE_SIZE = 500;
var PLACEHOLDER = "__lodash_placeholder__";
var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4;
var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512;
var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "...";
var HOT_COUNT = 800, HOT_SPAN = 16;
var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3;
var INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN = 0 / 0;
var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
var wrapFlags = [
["ary", WRAP_ARY_FLAG],
["bind", WRAP_BIND_FLAG],
["bindKey", WRAP_BIND_KEY_FLAG],
["curry", WRAP_CURRY_FLAG],
["curryRight", WRAP_CURRY_RIGHT_FLAG],
["flip", WRAP_FLIP_FLAG],
["partial", WRAP_PARTIAL_FLAG],
["partialRight", WRAP_PARTIAL_RIGHT_FLAG],
["rearg", WRAP_REARG_FLAG]
];
var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]", undefinedTag = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]";
var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]";
var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml = /[&<>"']/g, reHasEscapedHtml = RegExp(reEscapedHtml.source), reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g;
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source);
var reTrimStart = /^\s+/;
var reWhitespace = /\s/;
var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /;
var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
var reEscapeChar = /\\(\\)?/g;
var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
var reFlags = /\w*$/;
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
var reIsBinary = /^0b[01]+$/i;
var reIsHostCtor = /^\[object .+?Constructor\]$/;
var reIsOctal = /^0o[0-7]+$/i;
var reIsUint = /^(?:0|[1-9]\d*)$/;
var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
var reNoMatch = /($^)/;
var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
var rsApos = "['\u2019]", rsAstral = "[" + rsAstralRange + "]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d";
var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")";
var reApos = RegExp(rsApos, "g");
var reComboMark = RegExp(rsCombo, "g");
var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g");
var reUnicodeWord = RegExp([
rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")",
rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")",
rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower,
rsUpper + "+" + rsOptContrUpper,
rsOrdUpper,
rsOrdLower,
rsDigits,
rsEmoji
].join("|"), "g");
var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]");
var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
var contextProps = [
"Array",
"Buffer",
"DataView",
"Date",
"Error",
"Float32Array",
"Float64Array",
"Function",
"Int8Array",
"Int16Array",
"Int32Array",
"Map",
"Math",
"Object",
"Promise",
"RegExp",
"Set",
"String",
"Symbol",
"TypeError",
"Uint8Array",
"Uint8ClampedArray",
"Uint16Array",
"Uint32Array",
"WeakMap",
"_",
"clearTimeout",
"isFinite",
"parseInt",
"setTimeout"
];
var templateCounter = -1;
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
var cloneableTags = {};
cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
var deburredLetters = {
"\xC0": "A",
"\xC1": "A",
"\xC2": "A",
"\xC3": "A",
"\xC4": "A",
"\xC5": "A",
"\xE0": "a",
"\xE1": "a",
"\xE2": "a",
"\xE3": "a",
"\xE4": "a",
"\xE5": "a",
"\xC7": "C",
"\xE7": "c",
"\xD0": "D",
"\xF0": "d",
"\xC8": "E",
"\xC9": "E",
"\xCA": "E",
"\xCB": "E",
"\xE8": "e",
"\xE9": "e",
"\xEA": "e",
"\xEB": "e",
"\xCC": "I",
"\xCD": "I",
"\xCE": "I",
"\xCF": "I",
"\xEC": "i",
"\xED": "i",
"\xEE": "i",
"\xEF": "i",
"\xD1": "N",
"\xF1": "n",
"\xD2": "O",
"\xD3": "O",
"\xD4": "O",
"\xD5": "O",
"\xD6": "O",
"\xD8": "O",
"\xF2": "o",
"\xF3": "o",
"\xF4": "o",
"\xF5": "o",
"\xF6": "o",
"\xF8": "o",
"\xD9": "U",
"\xDA": "U",
"\xDB": "U",
"\xDC": "U",
"\xF9": "u",
"\xFA": "u",
"\xFB": "u",
"\xFC": "u",
"\xDD": "Y",
"\xFD": "y",
"\xFF": "y",
"\xC6": "Ae",
"\xE6": "ae",
"\xDE": "Th",
"\xFE": "th",
"\xDF": "ss",
"\u0100": "A",
"\u0102": "A",
"\u0104": "A",
"\u0101": "a",
"\u0103": "a",
"\u0105": "a",
"\u0106": "C",
"\u0108": "C",
"\u010A": "C",
"\u010C": "C",
"\u0107": "c",
"\u0109": "c",
"\u010B": "c",
"\u010D": "c",
"\u010E": "D",
"\u0110": "D",
"\u010F": "d",
"\u0111": "d",
"\u0112": "E",
"\u0114": "E",
"\u0116": "E",
"\u0118": "E",
"\u011A": "E",
"\u0113": "e",
"\u0115": "e",
"\u0117": "e",
"\u0119": "e",
"\u011B": "e",
"\u011C": "G",
"\u011E": "G",
"\u0120": "G",
"\u0122": "G",
"\u011D": "g",
"\u011F": "g",
"\u0121": "g",
"\u0123": "g",
"\u0124": "H",
"\u0126": "H",
"\u0125": "h",
"\u0127": "h",
"\u0128": "I",
"\u012A": "I",
"\u012C": "I",
"\u012E": "I",
"\u0130": "I",
"\u0129": "i",
"\u012B": "i",
"\u012D": "i",
"\u012F": "i",
"\u0131": "i",
"\u0134": "J",
"\u0135": "j",
"\u0136": "K",
"\u0137": "k",
"\u0138": "k",
"\u0139": "L",
"\u013B": "L",
"\u013D": "L",
"\u013F": "L",
"\u0141": "L",
"\u013A": "l",
"\u013C": "l",
"\u013E": "l",
"\u0140": "l",
"\u0142": "l",
"\u0143": "N",
"\u0145": "N",
"\u0147": "N",
"\u014A": "N",
"\u0144": "n",
"\u0146": "n",
"\u0148": "n",
"\u014B": "n",
"\u014C": "O",
"\u014E": "O",
"\u0150": "O",
"\u014D": "o",
"\u014F": "o",
"\u0151": "o",
"\u0154": "R",
"\u0156": "R",
"\u0158": "R",
"\u0155": "r",
"\u0157": "r",
"\u0159": "r",
"\u015A": "S",
"\u015C": "S",
"\u015E": "S",
"\u0160": "S",
"\u015B": "s",
"\u015D": "s",
"\u015F": "s",
"\u0161": "s",
"\u0162": "T",
"\u0164": "T",
"\u0166": "T",
"\u0163": "t",
"\u0165": "t",
"\u0167": "t",
"\u0168": "U",
"\u016A": "U",
"\u016C": "U",
"\u016E": "U",
"\u0170": "U",
"\u0172": "U",
"\u0169": "u",
"\u016B": "u",
"\u016D": "u",
"\u016F": "u",
"\u0171": "u",
"\u0173": "u",
"\u0174": "W",
"\u0175": "w",
"\u0176": "Y",
"\u0177": "y",
"\u0178": "Y",
"\u0179": "Z",
"\u017B": "Z",
"\u017D": "Z",
"\u017A": "z",
"\u017C": "z",
"\u017E": "z",
"\u0132": "IJ",
"\u0133": "ij",
"\u0152": "Oe",
"\u0153": "oe",
"\u0149": "'n",
"\u017F": "s"
};
var htmlEscapes = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#39;"
};
var htmlUnescapes = {
"&amp;": "&",
"&lt;": "<",
"&gt;": ">",
"&quot;": '"',
"&#39;": "'"
};
var stringEscapes = {
"\\": "\\",
"'": "'",
"\n": "n",
"\r": "r",
"\u2028": "u2028",
"\u2029": "u2029"
};
var freeParseFloat = parseFloat, freeParseInt = parseInt;
var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
var root2 = freeGlobal || freeSelf || Function("return this")();
var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports;
var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2;
var moduleExports = freeModule && freeModule.exports === freeExports;
var freeProcess = moduleExports && freeGlobal.process;
var nodeUtil = function() {
try {
var types = freeModule && freeModule.require && freeModule.require("util").types;
if (types) {
return types;
}
return freeProcess && freeProcess.binding && freeProcess.binding("util");
} catch (e) {
}
}();
var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
function apply(func, thisArg, args) {
switch (args.length) {
case 0:
return func.call(thisArg);
case 1:
return func.call(thisArg, args[0]);
case 2:
return func.call(thisArg, args[0], args[1]);
case 3:
return func.call(thisArg, args[0], args[1], args[2]);
}
return func.apply(thisArg, args);
}
function arrayAggregator(array, setter, iteratee, accumulator) {
var index2 = -1, length = array == null ? 0 : array.length;
while (++index2 < length) {
var value = array[index2];
setter(accumulator, value, iteratee(value), array);
}
return accumulator;
}
function arrayEach(array, iteratee) {
var index2 = -1, length = array == null ? 0 : array.length;
while (++index2 < length) {
if (iteratee(array[index2], index2, array) === false) {
break;
}
}
return array;
}
function arrayEachRight(array, iteratee) {
var length = array == null ? 0 : array.length;
while (length--) {
if (iteratee(array[length], length, array) === false) {
break;
}
}
return array;
}
function arrayEvery(array, predicate) {
var index2 = -1, length = array == null ? 0 : array.length;
while (++index2 < length) {
if (!predicate(array[index2], index2, array)) {
return false;
}
}
return true;
}
function arrayFilter(array, predicate) {
var index2 = -1, length = array == null ? 0 : array.length, resIndex = 0, result = [];
while (++index2 < length) {
var value = array[index2];
if (predicate(value, index2, array)) {
result[resIndex++] = value;
}
}
return result;
}
function arrayIncludes(array, value) {
var length = array == null ? 0 : array.length;
return !!length && baseIndexOf(array, value, 0) > -1;
}
function arrayIncludesWith(array, value, comparator) {
var index2 = -1, length = array == null ? 0 : array.length;
while (++index2 < length) {
if (comparator(value, array[index2])) {
return true;
}
}
return false;
}
function arrayMap(array, iteratee) {
var index2 = -1, length = array == null ? 0 : array.length, result = Array(length);
while (++index2 < length) {
result[index2] = iteratee(array[index2], index2, array);
}
return result;
}
function arrayPush(array, values) {
var index2 = -1, length = values.length, offset = array.length;
while (++index2 < length) {
array[offset + index2] = values[index2];
}
return array;
}
function arrayReduce(array, iteratee, accumulator, initAccum) {
var index2 = -1, length = array == null ? 0 : array.length;
if (initAccum && length) {
accumulator = array[++index2];
}
while (++index2 < length) {
accumulator = iteratee(accumulator, array[index2], index2, array);
}
return accumulator;
}
function arrayReduceRight(array, iteratee, accumulator, initAccum) {
var length = array == null ? 0 : array.length;
if (initAccum && length) {
accumulator = array[--length];
}
while (length--) {
accumulator = iteratee(accumulator, array[length], length, array);
}
return accumulator;
}
function arraySome(array, predicate) {
var index2 = -1, length = array == null ? 0 : array.length;
while (++index2 < length) {
if (predicate(array[index2], index2, array)) {
return true;
}
}
return false;
}
var asciiSize = baseProperty("length");
function asciiToArray(string) {
return string.split("");
}
function asciiWords(string) {
return string.match(reAsciiWord) || [];
}
function baseFindKey(collection, predicate, eachFunc) {
var result;
eachFunc(collection, function(value, key, collection2) {
if (predicate(value, key, collection2)) {
result = key;
return false;
}
});
return result;
}
function baseFindIndex(array, predicate, fromIndex, fromRight) {
var length = array.length, index2 = fromIndex + (fromRight ? 1 : -1);
while (fromRight ? index2-- : ++index2 < length) {
if (predicate(array[index2], index2, array)) {
return index2;
}
}
return -1;
}
function baseIndexOf(array, value, fromIndex) {
return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);
}
function baseIndexOfWith(array, value, fromIndex, comparator) {
var index2 = fromIndex - 1, length = array.length;
while (++index2 < length) {
if (comparator(array[index2], value)) {
return index2;
}
}
return -1;
}
function baseIsNaN(value) {
return value !== value;
}
function baseMean(array, iteratee) {
var length = array == null ? 0 : array.length;
return length ? baseSum(array, iteratee) / length : NAN;
}
function baseProperty(key) {
return function(object) {
return object == null ? undefined2 : object[key];
};
}
function basePropertyOf(object) {
return function(key) {
return object == null ? undefined2 : object[key];
};
}
function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
eachFunc(collection, function(value, index2, collection2) {
accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index2, collection2);
});
return accumulator;
}
function baseSortBy(array, comparer) {
var length = array.length;
array.sort(comparer);
while (length--) {
array[length] = array[length].value;
}
return array;
}
function baseSum(array, iteratee) {
var result, index2 = -1, length = array.length;
while (++index2 < length) {
var current = iteratee(array[index2]);
if (current !== undefined2) {
result = result === undefined2 ? current : result + current;
}
}
return result;
}
function baseTimes(n, iteratee) {
var index2 = -1, result = Array(n);
while (++index2 < n) {
result[index2] = iteratee(index2);
}
return result;
}
function baseToPairs(object, props) {
return arrayMap(props, function(key) {
return [key, object[key]];
});
}
function baseTrim(string) {
return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string;
}
function baseUnary(func) {
return function(value) {
return func(value);
};
}
function baseValues(object, props) {
return arrayMap(props, function(key) {
return object[key];
});
}
function cacheHas(cache, key) {
return cache.has(key);
}
function charsStartIndex(strSymbols, chrSymbols) {
var index2 = -1, length = strSymbols.length;
while (++index2 < length && baseIndexOf(chrSymbols, strSymbols[index2], 0) > -1) {
}
return index2;
}
function charsEndIndex(strSymbols, chrSymbols) {
var index2 = strSymbols.length;
while (index2-- && baseIndexOf(chrSymbols, strSymbols[index2], 0) > -1) {
}
return index2;
}
function countHolders(array, placeholder) {
var length = array.length, result = 0;
while (length--) {
if (array[length] === placeholder) {
++result;
}
}
return result;
}
var deburrLetter = basePropertyOf(deburredLetters);
var escapeHtmlChar = basePropertyOf(htmlEscapes);
function escapeStringChar(chr) {
return "\\" + stringEscapes[chr];
}
function getValue(object, key) {
return object == null ? undefined2 : object[key];
}
function hasUnicode(string) {
return reHasUnicode.test(string);
}
function hasUnicodeWord(string) {
return reHasUnicodeWord.test(string);
}
function iteratorToArray(iterator) {
var data, result = [];
while (!(data = iterator.next()).done) {
result.push(data.value);
}
return result;
}
function mapToArray(map2) {
var index2 = -1, result = Array(map2.size);
map2.forEach(function(value, key) {
result[++index2] = [key, value];
});
return result;
}
function overArg(func, transform2) {
return function(arg) {
return func(transform2(arg));
};
}
function replaceHolders(array, placeholder) {
var index2 = -1, length = array.length, resIndex = 0, result = [];
while (++index2 < length) {
var value = array[index2];
if (value === placeholder || value === PLACEHOLDER) {
array[index2] = PLACEHOLDER;
result[resIndex++] = index2;
}
}
return result;
}
function setToArray(set3) {
var index2 = -1, result = Array(set3.size);
set3.forEach(function(value) {
result[++index2] = value;
});
return result;
}
function setToPairs(set3) {
var index2 = -1, result = Array(set3.size);
set3.forEach(function(value) {
result[++index2] = [value, value];
});
return result;
}
function strictIndexOf(array, value, fromIndex) {
var index2 = fromIndex - 1, length = array.length;
while (++index2 < length) {
if (array[index2] === value) {
return index2;
}
}
return -1;
}
function strictLastIndexOf(array, value, fromIndex) {
var index2 = fromIndex + 1;
while (index2--) {
if (array[index2] === value) {
return index2;
}
}
return index2;
}
function stringSize(string) {
return hasUnicode(string) ? unicodeSize(string) : asciiSize(string);
}
function stringToArray(string) {
return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
}
function trimmedEndIndex(string) {
var index2 = string.length;
while (index2-- && reWhitespace.test(string.charAt(index2))) {
}
return index2;
}
var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
function unicodeSize(string) {
var result = reUnicode.lastIndex = 0;
while (reUnicode.test(string)) {
++result;
}
return result;
}
function unicodeToArray(string) {
return string.match(reUnicode) || [];
}
function unicodeWords(string) {
return string.match(reUnicodeWord) || [];
}
var runInContext = function runInContext2(context) {
context = context == null ? root2 : _.defaults(root2.Object(), context, _.pick(root2, contextProps));
var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError;
var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto = Object2.prototype;
var coreJsData = context["__core-js_shared__"];
var funcToString = funcProto.toString;
var hasOwnProperty = objectProto.hasOwnProperty;
var idCounter = 0;
var maskSrcKey = function() {
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || "");
return uid ? "Symbol(src)_1." + uid : "";
}();
var nativeObjectToString = objectProto.toString;
var objectCtorString = funcToString.call(Object2);
var oldDash = root2._;
var reIsNative = RegExp2("^" + funcToString.call(hasOwnProperty).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$");
var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol2 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined2, symIterator = Symbol2 ? Symbol2.iterator : undefined2, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined2;
var defineProperty = function() {
try {
var func = getNative(Object2, "defineProperty");
func({}, "", {});
return func;
} catch (e) {
}
}();
var ctxClearTimeout = context.clearTimeout !== root2.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root2.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root2.setTimeout && context.setTimeout;
var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse;
var DataView2 = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create");
var metaMap = WeakMap && new WeakMap();
var realNames = {};
var dataViewCtorString = toSource(DataView2), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap);
var symbolProto = Symbol2 ? Symbol2.prototype : undefined2, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined2, symbolToString = symbolProto ? symbolProto.toString : undefined2;
function lodash(value) {
if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
if (value instanceof LodashWrapper) {
return value;
}
if (hasOwnProperty.call(value, "__wrapped__")) {
return wrapperClone(value);
}
}
return new LodashWrapper(value);
}
var baseCreate = function() {
function object() {
}
return function(proto) {
if (!isObject(proto)) {
return {};
}
if (objectCreate) {
return objectCreate(proto);
}
object.prototype = proto;
var result2 = new object();
object.prototype = undefined2;
return result2;
};
}();
function baseLodash() {
}
function LodashWrapper(value, chainAll) {
this.__wrapped__ = value;
this.__actions__ = [];
this.__chain__ = !!chainAll;
this.__index__ = 0;
this.__values__ = undefined2;
}
lodash.templateSettings = {
"escape": reEscape,
"evaluate": reEvaluate,
"interpolate": reInterpolate,
"variable": "",
"imports": {
"_": lodash
}
};
lodash.prototype = baseLodash.prototype;
lodash.prototype.constructor = lodash;
LodashWrapper.prototype = baseCreate(baseLodash.prototype);
LodashWrapper.prototype.constructor = LodashWrapper;
function LazyWrapper(value) {
this.__wrapped__ = value;
this.__actions__ = [];
this.__dir__ = 1;
this.__filtered__ = false;
this.__iteratees__ = [];
this.__takeCount__ = MAX_ARRAY_LENGTH;
this.__views__ = [];
}
function lazyClone() {
var result2 = new LazyWrapper(this.__wrapped__);
result2.__actions__ = copyArray(this.__actions__);
result2.__dir__ = this.__dir__;
result2.__filtered__ = this.__filtered__;
result2.__iteratees__ = copyArray(this.__iteratees__);
result2.__takeCount__ = this.__takeCount__;
result2.__views__ = copyArray(this.__views__);
return result2;
}
function lazyReverse() {
if (this.__filtered__) {
var result2 = new LazyWrapper(this);
result2.__dir__ = -1;
result2.__filtered__ = true;
} else {
result2 = this.clone();
result2.__dir__ *= -1;
}
return result2;
}
function lazyValue() {
var array = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray(array), isRight = dir < 0, arrLength = isArr ? array.length : 0, view = getView(0, arrLength, this.__views__), start2 = view.start, end = view.end, length = end - start2, index2 = isRight ? end : start2 - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin(length, this.__takeCount__);
if (!isArr || !isRight && arrLength == length && takeCount == length) {
return baseWrapperValue(array, this.__actions__);
}
var result2 = [];
outer:
while (length-- && resIndex < takeCount) {
index2 += dir;
var iterIndex = -1, value = array[index2];
while (++iterIndex < iterLength) {
var data = iteratees[iterIndex], iteratee2 = data.iteratee, type2 = data.type, computed = iteratee2(value);
if (type2 == LAZY_MAP_FLAG) {
value = computed;
} else if (!computed) {
if (type2 == LAZY_FILTER_FLAG) {
continue outer;
} else {
break outer;
}
}
}
result2[resIndex++] = value;
}
return result2;
}
LazyWrapper.prototype = baseCreate(baseLodash.prototype);
LazyWrapper.prototype.constructor = LazyWrapper;
function Hash(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
function hashClear() {
this.__data__ = nativeCreate ? nativeCreate(null) : {};
this.size = 0;
}
function hashDelete(key) {
var result2 = this.has(key) && delete this.__data__[key];
this.size -= result2 ? 1 : 0;
return result2;
}
function hashGet(key) {
var data = this.__data__;
if (nativeCreate) {
var result2 = data[key];
return result2 === HASH_UNDEFINED ? undefined2 : result2;
}
return hasOwnProperty.call(data, key) ? data[key] : undefined2;
}
function hashHas(key) {
var data = this.__data__;
return nativeCreate ? data[key] !== undefined2 : hasOwnProperty.call(data, key);
}
function hashSet(key, value) {
var data = this.__data__;
this.size += this.has(key) ? 0 : 1;
data[key] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value;
return this;
}
Hash.prototype.clear = hashClear;
Hash.prototype["delete"] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
function ListCache(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
function listCacheClear() {
this.__data__ = [];
this.size = 0;
}
function listCacheDelete(key) {
var data = this.__data__, index2 = assocIndexOf(data, key);
if (index2 < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index2 == lastIndex) {
data.pop();
} else {
splice.call(data, index2, 1);
}
--this.size;
return true;
}
function listCacheGet(key) {
var data = this.__data__, index2 = assocIndexOf(data, key);
return index2 < 0 ? undefined2 : data[index2][1];
}
function listCacheHas(key) {
return assocIndexOf(this.__data__, key) > -1;
}
function listCacheSet(key, value) {
var data = this.__data__, index2 = assocIndexOf(data, key);
if (index2 < 0) {
++this.size;
data.push([key, value]);
} else {
data[index2][1] = value;
}
return this;
}
ListCache.prototype.clear = listCacheClear;
ListCache.prototype["delete"] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
function MapCache(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
function mapCacheClear() {
this.size = 0;
this.__data__ = {
"hash": new Hash(),
"map": new (Map2 || ListCache)(),
"string": new Hash()
};
}
function mapCacheDelete(key) {
var result2 = getMapData(this, key)["delete"](key);
this.size -= result2 ? 1 : 0;
return result2;
}
function mapCacheGet(key) {
return getMapData(this, key).get(key);
}
function mapCacheHas(key) {
return getMapData(this, key).has(key);
}
function mapCacheSet(key, value) {
var data = getMapData(this, key), size2 = data.size;
data.set(key, value);
this.size += data.size == size2 ? 0 : 1;
return this;
}
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype["delete"] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
function SetCache(values2) {
var index2 = -1, length = values2 == null ? 0 : values2.length;
this.__data__ = new MapCache();
while (++index2 < length) {
this.add(values2[index2]);
}
}
function setCacheAdd(value) {
this.__data__.set(value, HASH_UNDEFINED);
return this;
}
function setCacheHas(value) {
return this.__data__.has(value);
}
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;
function Stack(entries) {
var data = this.__data__ = new ListCache(entries);
this.size = data.size;
}
function stackClear() {
this.__data__ = new ListCache();
this.size = 0;
}
function stackDelete(key) {
var data = this.__data__, result2 = data["delete"](key);
this.size = data.size;
return result2;
}
function stackGet(key) {
return this.__data__.get(key);
}
function stackHas(key) {
return this.__data__.has(key);
}
function stackSet(key, value) {
var data = this.__data__;
if (data instanceof ListCache) {
var pairs = data.__data__;
if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) {
pairs.push([key, value]);
this.size = ++data.size;
return this;
}
data = this.__data__ = new MapCache(pairs);
}
data.set(key, value);
this.size = data.size;
return this;
}
Stack.prototype.clear = stackClear;
Stack.prototype["delete"] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
function arrayLikeKeys(value, inherited) {
var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length;
for (var key in value) {
if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isBuff && (key == "offset" || key == "parent") || isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || isIndex(key, length)))) {
result2.push(key);
}
}
return result2;
}
function arraySample(array) {
var length = array.length;
return length ? array[baseRandom(0, length - 1)] : undefined2;
}
function arraySampleSize(array, n) {
return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
}
function arrayShuffle(array) {
return shuffleSelf(copyArray(array));
}
function assignMergeValue(object, key, value) {
if (value !== undefined2 && !eq(object[key], value) || value === undefined2 && !(key in object)) {
baseAssignValue(object, key, value);
}
}
function assignValue(object, key, value) {
var objValue = object[key];
if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || value === undefined2 && !(key in object)) {
baseAssignValue(object, key, value);
}
}
function assocIndexOf(array, key) {
var length = array.length;
while (length--) {
if (eq(array[length][0], key)) {
return length;
}
}
return -1;
}
function baseAggregator(collection, setter, iteratee2, accumulator) {
baseEach(collection, function(value, key, collection2) {
setter(accumulator, value, iteratee2(value), collection2);
});
return accumulator;
}
function baseAssign(object, source) {
return object && copyObject(source, keys(source), object);
}
function baseAssignIn(object, source) {
return object && copyObject(source, keysIn(source), object);
}
function baseAssignValue(object, key, value) {
if (key == "__proto__" && defineProperty) {
defineProperty(object, key, {
"configurable": true,
"enumerable": true,
"value": value,
"writable": true
});
} else {
object[key] = value;
}
}
function baseAt(object, paths) {
var index2 = -1, length = paths.length, result2 = Array2(length), skip = object == null;
while (++index2 < length) {
result2[index2] = skip ? undefined2 : get3(object, paths[index2]);
}
return result2;
}
function baseClamp(number3, lower2, upper) {
if (number3 === number3) {
if (upper !== undefined2) {
number3 = number3 <= upper ? number3 : upper;
}
if (lower2 !== undefined2) {
number3 = number3 >= lower2 ? number3 : lower2;
}
}
return number3;
}
function baseClone(value, bitmask, customizer, key, object, stack) {
var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG;
if (customizer) {
result2 = object ? customizer(value, key, object, stack) : customizer(value);
}
if (result2 !== undefined2) {
return result2;
}
if (!isObject(value)) {
return value;
}
var isArr = isArray(value);
if (isArr) {
result2 = initCloneArray(value);
if (!isDeep) {
return copyArray(value, result2);
}
} else {
var tag = getTag(value), isFunc = tag == funcTag || tag == genTag;
if (isBuffer(value)) {
return cloneBuffer(value, isDeep);
}
if (tag == objectTag || tag == argsTag || isFunc && !object) {
result2 = isFlat || isFunc ? {} : initCloneObject(value);
if (!isDeep) {
return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value));
}
} else {
if (!cloneableTags[tag]) {
return object ? value : {};
}
result2 = initCloneByTag(value, tag, isDeep);
}
}
stack || (stack = new Stack());
var stacked = stack.get(value);
if (stacked) {
return stacked;
}
stack.set(value, result2);
if (isSet(value)) {
value.forEach(function(subValue) {
result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
});
} else if (isMap(value)) {
value.forEach(function(subValue, key2) {
result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
});
}
var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
var props = isArr ? undefined2 : keysFunc(value);
arrayEach(props || value, function(subValue, key2) {
if (props) {
key2 = subValue;
subValue = value[key2];
}
assignValue(result2, key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
});
return result2;
}
function baseConforms(source) {
var props = keys(source);
return function(object) {
return baseConformsTo(object, source, props);
};
}
function baseConformsTo(object, source, props) {
var length = props.length;
if (object == null) {
return !length;
}
object = Object2(object);
while (length--) {
var key = props[length], predicate = source[key], value = object[key];
if (value === undefined2 && !(key in object) || !predicate(value)) {
return false;
}
}
return true;
}
function baseDelay(func, wait2, args) {
if (typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
return setTimeout2(function() {
func.apply(undefined2, args);
}, wait2);
}
function baseDifference(array, values2, iteratee2, comparator) {
var index2 = -1, includes2 = arrayIncludes, isCommon = true, length = array.length, result2 = [], valuesLength = values2.length;
if (!length) {
return result2;
}
if (iteratee2) {
values2 = arrayMap(values2, baseUnary(iteratee2));
}
if (comparator) {
includes2 = arrayIncludesWith;
isCommon = false;
} else if (values2.length >= LARGE_ARRAY_SIZE) {
includes2 = cacheHas;
isCommon = false;
values2 = new SetCache(values2);
}
outer:
while (++index2 < length) {
var value = array[index2], computed = iteratee2 == null ? value : iteratee2(value);
value = comparator || value !== 0 ? value : 0;
if (isCommon && computed === computed) {
var valuesIndex = valuesLength;
while (valuesIndex--) {
if (values2[valuesIndex] === computed) {
continue outer;
}
}
result2.push(value);
} else if (!includes2(values2, computed, comparator)) {
result2.push(value);
}
}
return result2;
}
var baseEach = createBaseEach(baseForOwn);
var baseEachRight = createBaseEach(baseForOwnRight, true);
function baseEvery(collection, predicate) {
var result2 = true;
baseEach(collection, function(value, index2, collection2) {
result2 = !!predicate(value, index2, collection2);
return result2;
});
return result2;
}
function baseExtremum(array, iteratee2, comparator) {
var index2 = -1, length = array.length;
while (++index2 < length) {
var value = array[index2], current = iteratee2(value);
if (current != null && (computed === undefined2 ? current === current && !isSymbol(current) : comparator(current, computed))) {
var computed = current, result2 = value;
}
}
return result2;
}
function baseFill(array, value, start2, end) {
var length = array.length;
start2 = toInteger(start2);
if (start2 < 0) {
start2 = -start2 > length ? 0 : length + start2;
}
end = end === undefined2 || end > length ? length : toInteger(end);
if (end < 0) {
end += length;
}
end = start2 > end ? 0 : toLength(end);
while (start2 < end) {
array[start2++] = value;
}
return array;
}
function baseFilter(collection, predicate) {
var result2 = [];
baseEach(collection, function(value, index2, collection2) {
if (predicate(value, index2, collection2)) {
result2.push(value);
}
});
return result2;
}
function baseFlatten(array, depth, predicate, isStrict, result2) {
var index2 = -1, length = array.length;
predicate || (predicate = isFlattenable);
result2 || (result2 = []);
while (++index2 < length) {
var value = array[index2];
if (depth > 0 && predicate(value)) {
if (depth > 1) {
baseFlatten(value, depth - 1, predicate, isStrict, result2);
} else {
arrayPush(result2, value);
}
} else if (!isStrict) {
result2[result2.length] = value;
}
}
return result2;
}
var baseFor = createBaseFor();
var baseForRight = createBaseFor(true);
function baseForOwn(object, iteratee2) {
return object && baseFor(object, iteratee2, keys);
}
function baseForOwnRight(object, iteratee2) {
return object && baseForRight(object, iteratee2, keys);
}
function baseFunctions(object, props) {
return arrayFilter(props, function(key) {
return isFunction(object[key]);
});
}
function baseGet(object, path2) {
path2 = castPath(path2, object);
var index2 = 0, length = path2.length;
while (object != null && index2 < length) {
object = object[toKey(path2[index2++])];
}
return index2 && index2 == length ? object : undefined2;
}
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
var result2 = keysFunc(object);
return isArray(object) ? result2 : arrayPush(result2, symbolsFunc(object));
}
function baseGetTag(value) {
if (value == null) {
return value === undefined2 ? undefinedTag : nullTag;
}
return symToStringTag && symToStringTag in Object2(value) ? getRawTag(value) : objectToString(value);
}
function baseGt(value, other) {
return value > other;
}
function baseHas(object, key) {
return object != null && hasOwnProperty.call(object, key);
}
function baseHasIn(object, key) {
return object != null && key in Object2(object);
}
function baseInRange(number3, start2, end) {
return number3 >= nativeMin(start2, end) && number3 < nativeMax(start2, end);
}
function baseIntersection(arrays, iteratee2, comparator) {
var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = [];
while (othIndex--) {
var array = arrays[othIndex];
if (othIndex && iteratee2) {
array = arrayMap(array, baseUnary(iteratee2));
}
maxLength = nativeMin(array.length, maxLength);
caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined2;
}
array = arrays[0];
var index2 = -1, seen = caches[0];
outer:
while (++index2 < length && result2.length < maxLength) {
var value = array[index2], computed = iteratee2 ? iteratee2(value) : value;
value = comparator || value !== 0 ? value : 0;
if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) {
othIndex = othLength;
while (--othIndex) {
var cache = caches[othIndex];
if (!(cache ? cacheHas(cache, computed) : includes2(arrays[othIndex], computed, comparator))) {
continue outer;
}
}
if (seen) {
seen.push(computed);
}
result2.push(value);
}
}
return result2;
}
function baseInverter(object, setter, iteratee2, accumulator) {
baseForOwn(object, function(value, key, object2) {
setter(accumulator, iteratee2(value), key, object2);
});
return accumulator;
}
function baseInvoke(object, path2, args) {
path2 = castPath(path2, object);
object = parent(object, path2);
var func = object == null ? object : object[toKey(last(path2))];
return func == null ? undefined2 : apply(func, object, args);
}
function baseIsArguments(value) {
return isObjectLike(value) && baseGetTag(value) == argsTag;
}
function baseIsArrayBuffer(value) {
return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
}
function baseIsDate(value) {
return isObjectLike(value) && baseGetTag(value) == dateTag;
}
function baseIsEqual(value, other, bitmask, customizer, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {
return value !== value && other !== other;
}
return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
}
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other);
objTag = objTag == argsTag ? objectTag : objTag;
othTag = othTag == argsTag ? objectTag : othTag;
var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
if (isSameTag && isBuffer(object)) {
if (!isBuffer(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
if (isSameTag && !objIsObj) {
stack || (stack = new Stack());
return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
var objIsWrapped = objIsObj && hasOwnProperty.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty.call(other, "__wrapped__");
if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack());
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack());
return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
}
function baseIsMap(value) {
return isObjectLike(value) && getTag(value) == mapTag;
}
function baseIsMatch(object, source, matchData, customizer) {
var index2 = matchData.length, length = index2, noCustomizer = !customizer;
if (object == null) {
return !length;
}
object = Object2(object);
while (index2--) {
var data = matchData[index2];
if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
return false;
}
}
while (++index2 < length) {
data = matchData[index2];
var key = data[0], objValue = object[key], srcValue = data[1];
if (noCustomizer && data[2]) {
if (objValue === undefined2 && !(key in object)) {
return false;
}
} else {
var stack = new Stack();
if (customizer) {
var result2 = customizer(objValue, srcValue, key, object, source, stack);
}
if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) {
return false;
}
}
}
return true;
}
function baseIsNative(value) {
if (!isObject(value) || isMasked(value)) {
return false;
}
var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));
}
function baseIsRegExp(value) {
return isObjectLike(value) && baseGetTag(value) == regexpTag;
}
function baseIsSet(value) {
return isObjectLike(value) && getTag(value) == setTag;
}
function baseIsTypedArray(value) {
return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}
function baseIteratee(value) {
if (typeof value == "function") {
return value;
}
if (value == null) {
return identity4;
}
if (typeof value == "object") {
return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
}
return property(value);
}
function baseKeys(object) {
if (!isPrototype(object)) {
return nativeKeys(object);
}
var result2 = [];
for (var key in Object2(object)) {
if (hasOwnProperty.call(object, key) && key != "constructor") {
result2.push(key);
}
}
return result2;
}
function baseKeysIn(object) {
if (!isObject(object)) {
return nativeKeysIn(object);
}
var isProto = isPrototype(object), result2 = [];
for (var key in object) {
if (!(key == "constructor" && (isProto || !hasOwnProperty.call(object, key)))) {
result2.push(key);
}
}
return result2;
}
function baseLt(value, other) {
return value < other;
}
function baseMap(collection, iteratee2) {
var index2 = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : [];
baseEach(collection, function(value, key, collection2) {
result2[++index2] = iteratee2(value, key, collection2);
});
return result2;
}
function baseMatches(source) {
var matchData = getMatchData(source);
if (matchData.length == 1 && matchData[0][2]) {
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
}
return function(object) {
return object === source || baseIsMatch(object, source, matchData);
};
}
function baseMatchesProperty(path2, srcValue) {
if (isKey(path2) && isStrictComparable(srcValue)) {
return matchesStrictComparable(toKey(path2), srcValue);
}
return function(object) {
var objValue = get3(object, path2);
return objValue === undefined2 && objValue === srcValue ? hasIn(object, path2) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
};
}
function baseMerge(object, source, srcIndex, customizer, stack) {
if (object === source) {
return;
}
baseFor(source, function(srcValue, key) {
stack || (stack = new Stack());
if (isObject(srcValue)) {
baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
} else {
var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : undefined2;
if (newValue === undefined2) {
newValue = srcValue;
}
assignMergeValue(object, key, newValue);
}
}, keysIn);
}
function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue);
if (stacked) {
assignMergeValue(object, key, stacked);
return;
}
var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : undefined2;
var isCommon = newValue === undefined2;
if (isCommon) {
var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue);
newValue = srcValue;
if (isArr || isBuff || isTyped) {
if (isArray(objValue)) {
newValue = objValue;
} else if (isArrayLikeObject(objValue)) {
newValue = copyArray(objValue);
} else if (isBuff) {
isCommon = false;
newValue = cloneBuffer(srcValue, true);
} else if (isTyped) {
isCommon = false;
newValue = cloneTypedArray(srcValue, true);
} else {
newValue = [];
}
} else if (isPlainObject(srcValue) || isArguments(srcValue)) {
newValue = objValue;
if (isArguments(objValue)) {
newValue = toPlainObject(objValue);
} else if (!isObject(objValue) || isFunction(objValue)) {
newValue = initCloneObject(srcValue);
}
} else {
isCommon = false;
}
}
if (isCommon) {
stack.set(srcValue, newValue);
mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
stack["delete"](srcValue);
}
assignMergeValue(object, key, newValue);
}
function baseNth(array, n) {
var length = array.length;
if (!length) {
return;
}
n += n < 0 ? length : 0;
return isIndex(n, length) ? array[n] : undefined2;
}
function baseOrderBy(collection, iteratees, orders) {
if (iteratees.length) {
iteratees = arrayMap(iteratees, function(iteratee2) {
if (isArray(iteratee2)) {
return function(value) {
return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2);
};
}
return iteratee2;
});
} else {
iteratees = [identity4];
}
var index2 = -1;
iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
var result2 = baseMap(collection, function(value, key, collection2) {
var criteria = arrayMap(iteratees, function(iteratee2) {
return iteratee2(value);
});
return { "criteria": criteria, "index": ++index2, "value": value };
});
return baseSortBy(result2, function(object, other) {
return compareMultiple(object, other, orders);
});
}
function basePick(object, paths) {
return basePickBy(object, paths, function(value, path2) {
return hasIn(object, path2);
});
}
function basePickBy(object, paths, predicate) {
var index2 = -1, length = paths.length, result2 = {};
while (++index2 < length) {
var path2 = paths[index2], value = baseGet(object, path2);
if (predicate(value, path2)) {
baseSet(result2, castPath(path2, object), value);
}
}
return result2;
}
function basePropertyDeep(path2) {
return function(object) {
return baseGet(object, path2);
};
}
function basePullAll(array, values2, iteratee2, comparator) {
var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index2 = -1, length = values2.length, seen = array;
if (array === values2) {
values2 = copyArray(values2);
}
if (iteratee2) {
seen = arrayMap(array, baseUnary(iteratee2));
}
while (++index2 < length) {
var fromIndex = 0, value = values2[index2], computed = iteratee2 ? iteratee2(value) : value;
while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) {
if (seen !== array) {
splice.call(seen, fromIndex, 1);
}
splice.call(array, fromIndex, 1);
}
}
return array;
}
function basePullAt(array, indexes) {
var length = array ? indexes.length : 0, lastIndex = length - 1;
while (length--) {
var index2 = indexes[length];
if (length == lastIndex || index2 !== previous) {
var previous = index2;
if (isIndex(index2)) {
splice.call(array, index2, 1);
} else {
baseUnset(array, index2);
}
}
}
return array;
}
function baseRandom(lower2, upper) {
return lower2 + nativeFloor(nativeRandom() * (upper - lower2 + 1));
}
function baseRange(start2, end, step, fromRight) {
var index2 = -1, length = nativeMax(nativeCeil((end - start2) / (step || 1)), 0), result2 = Array2(length);
while (length--) {
result2[fromRight ? length : ++index2] = start2;
start2 += step;
}
return result2;
}
function baseRepeat(string, n) {
var result2 = "";
if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
return result2;
}
do {
if (n % 2) {
result2 += string;
}
n = nativeFloor(n / 2);
if (n) {
string += string;
}
} while (n);
return result2;
}
function baseRest(func, start2) {
return setToString(overRest(func, start2, identity4), func + "");
}
function baseSample(collection) {
return arraySample(values(collection));
}
function baseSampleSize(collection, n) {
var array = values(collection);
return shuffleSelf(array, baseClamp(n, 0, array.length));
}
function baseSet(object, path2, value, customizer) {
if (!isObject(object)) {
return object;
}
path2 = castPath(path2, object);
var index2 = -1, length = path2.length, lastIndex = length - 1, nested = object;
while (nested != null && ++index2 < length) {
var key = toKey(path2[index2]), newValue = value;
if (key === "__proto__" || key === "constructor" || key === "prototype") {
return object;
}
if (index2 != lastIndex) {
var objValue = nested[key];
newValue = customizer ? customizer(objValue, key, nested) : undefined2;
if (newValue === undefined2) {
newValue = isObject(objValue) ? objValue : isIndex(path2[index2 + 1]) ? [] : {};
}
}
assignValue(nested, key, newValue);
nested = nested[key];
}
return object;
}
var baseSetData = !metaMap ? identity4 : function(func, data) {
metaMap.set(func, data);
return func;
};
var baseSetToString = !defineProperty ? identity4 : function(func, string) {
return defineProperty(func, "toString", {
"configurable": true,
"enumerable": false,
"value": constant(string),
"writable": true
});
};
function baseShuffle(collection) {
return shuffleSelf(values(collection));
}
function baseSlice(array, start2, end) {
var index2 = -1, length = array.length;
if (start2 < 0) {
start2 = -start2 > length ? 0 : length + start2;
}
end = end > length ? length : end;
if (end < 0) {
end += length;
}
length = start2 > end ? 0 : end - start2 >>> 0;
start2 >>>= 0;
var result2 = Array2(length);
while (++index2 < length) {
result2[index2] = array[index2 + start2];
}
return result2;
}
function baseSome(collection, predicate) {
var result2;
baseEach(collection, function(value, index2, collection2) {
result2 = predicate(value, index2, collection2);
return !result2;
});
return !!result2;
}
function baseSortedIndex(array, value, retHighest) {
var low = 0, high = array == null ? low : array.length;
if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
while (low < high) {
var mid = low + high >>> 1, computed = array[mid];
if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) {
low = mid + 1;
} else {
high = mid;
}
}
return high;
}
return baseSortedIndexBy(array, value, identity4, retHighest);
}
function baseSortedIndexBy(array, value, iteratee2, retHighest) {
var low = 0, high = array == null ? 0 : array.length;
if (high === 0) {
return 0;
}
value = iteratee2(value);
var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol(value), valIsUndefined = value === undefined2;
while (low < high) {
var mid = nativeFloor((low + high) / 2), computed = iteratee2(array[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol(computed);
if (valIsNaN) {
var setLow = retHighest || othIsReflexive;
} else if (valIsUndefined) {
setLow = othIsReflexive && (retHighest || othIsDefined);
} else if (valIsNull) {
setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
} else if (valIsSymbol) {
setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
} else if (othIsNull || othIsSymbol) {
setLow = false;
} else {
setLow = retHighest ? computed <= value : computed < value;
}
if (setLow) {
low = mid + 1;
} else {
high = mid;
}
}
return nativeMin(high, MAX_ARRAY_INDEX);
}
function baseSortedUniq(array, iteratee2) {
var index2 = -1, length = array.length, resIndex = 0, result2 = [];
while (++index2 < length) {
var value = array[index2], computed = iteratee2 ? iteratee2(value) : value;
if (!index2 || !eq(computed, seen)) {
var seen = computed;
result2[resIndex++] = value === 0 ? 0 : value;
}
}
return result2;
}
function baseToNumber(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol(value)) {
return NAN;
}
return +value;
}
function baseToString(value) {
if (typeof value == "string") {
return value;
}
if (isArray(value)) {
return arrayMap(value, baseToString) + "";
}
if (isSymbol(value)) {
return symbolToString ? symbolToString.call(value) : "";
}
var result2 = value + "";
return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2;
}
function baseUniq(array, iteratee2, comparator) {
var index2 = -1, includes2 = arrayIncludes, length = array.length, isCommon = true, result2 = [], seen = result2;
if (comparator) {
isCommon = false;
includes2 = arrayIncludesWith;
} else if (length >= LARGE_ARRAY_SIZE) {
var set4 = iteratee2 ? null : createSet(array);
if (set4) {
return setToArray(set4);
}
isCommon = false;
includes2 = cacheHas;
seen = new SetCache();
} else {
seen = iteratee2 ? [] : result2;
}
outer:
while (++index2 < length) {
var value = array[index2], computed = iteratee2 ? iteratee2(value) : value;
value = comparator || value !== 0 ? value : 0;
if (isCommon && computed === computed) {
var seenIndex = seen.length;
while (seenIndex--) {
if (seen[seenIndex] === computed) {
continue outer;
}
}
if (iteratee2) {
seen.push(computed);
}
result2.push(value);
} else if (!includes2(seen, computed, comparator)) {
if (seen !== result2) {
seen.push(computed);
}
result2.push(value);
}
}
return result2;
}
function baseUnset(object, path2) {
path2 = castPath(path2, object);
object = parent(object, path2);
return object == null || delete object[toKey(last(path2))];
}
function baseUpdate(object, path2, updater, customizer) {
return baseSet(object, path2, updater(baseGet(object, path2)), customizer);
}
function baseWhile(array, predicate, isDrop, fromRight) {
var length = array.length, index2 = fromRight ? length : -1;
while ((fromRight ? index2-- : ++index2 < length) && predicate(array[index2], index2, array)) {
}
return isDrop ? baseSlice(array, fromRight ? 0 : index2, fromRight ? index2 + 1 : length) : baseSlice(array, fromRight ? index2 + 1 : 0, fromRight ? length : index2);
}
function baseWrapperValue(value, actions) {
var result2 = value;
if (result2 instanceof LazyWrapper) {
result2 = result2.value();
}
return arrayReduce(actions, function(result3, action) {
return action.func.apply(action.thisArg, arrayPush([result3], action.args));
}, result2);
}
function baseXor(arrays, iteratee2, comparator) {
var length = arrays.length;
if (length < 2) {
return length ? baseUniq(arrays[0]) : [];
}
var index2 = -1, result2 = Array2(length);
while (++index2 < length) {
var array = arrays[index2], othIndex = -1;
while (++othIndex < length) {
if (othIndex != index2) {
result2[index2] = baseDifference(result2[index2] || array, arrays[othIndex], iteratee2, comparator);
}
}
}
return baseUniq(baseFlatten(result2, 1), iteratee2, comparator);
}
function baseZipObject(props, values2, assignFunc) {
var index2 = -1, length = props.length, valsLength = values2.length, result2 = {};
while (++index2 < length) {
var value = index2 < valsLength ? values2[index2] : undefined2;
assignFunc(result2, props[index2], value);
}
return result2;
}
function castArrayLikeObject(value) {
return isArrayLikeObject(value) ? value : [];
}
function castFunction(value) {
return typeof value == "function" ? value : identity4;
}
function castPath(value, object) {
if (isArray(value)) {
return value;
}
return isKey(value, object) ? [value] : stringToPath(toString(value));
}
var castRest = baseRest;
function castSlice(array, start2, end) {
var length = array.length;
end = end === undefined2 ? length : end;
return !start2 && end >= length ? array : baseSlice(array, start2, end);
}
var clearTimeout2 = ctxClearTimeout || function(id2) {
return root2.clearTimeout(id2);
};
function cloneBuffer(buffer, isDeep) {
if (isDeep) {
return buffer.slice();
}
var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
buffer.copy(result2);
return result2;
}
function cloneArrayBuffer(arrayBuffer) {
var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength);
new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer));
return result2;
}
function cloneDataView(dataView, isDeep) {
var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
}
function cloneRegExp(regexp) {
var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp));
result2.lastIndex = regexp.lastIndex;
return result2;
}
function cloneSymbol(symbol) {
return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {};
}
function cloneTypedArray(typedArray, isDeep) {
var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
}
function compareAscending(value, other) {
if (value !== other) {
var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value);
var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other);
if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {
return 1;
}
if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {
return -1;
}
}
return 0;
}
function compareMultiple(object, other, orders) {
var index2 = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length;
while (++index2 < length) {
var result2 = compareAscending(objCriteria[index2], othCriteria[index2]);
if (result2) {
if (index2 >= ordersLength) {
return result2;
}
var order = orders[index2];
return result2 * (order == "desc" ? -1 : 1);
}
}
return object.index - other.index;
}
function composeArgs(args, partials, holders, isCurried) {
var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(leftLength + rangeLength), isUncurried = !isCurried;
while (++leftIndex < leftLength) {
result2[leftIndex] = partials[leftIndex];
}
while (++argsIndex < holdersLength) {
if (isUncurried || argsIndex < argsLength) {
result2[holders[argsIndex]] = args[argsIndex];
}
}
while (rangeLength--) {
result2[leftIndex++] = args[argsIndex++];
}
return result2;
}
function composeArgsRight(args, partials, holders, isCurried) {
var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(rangeLength + rightLength), isUncurried = !isCurried;
while (++argsIndex < rangeLength) {
result2[argsIndex] = args[argsIndex];
}
var offset = argsIndex;
while (++rightIndex < rightLength) {
result2[offset + rightIndex] = partials[rightIndex];
}
while (++holdersIndex < holdersLength) {
if (isUncurried || argsIndex < argsLength) {
result2[offset + holders[holdersIndex]] = args[argsIndex++];
}
}
return result2;
}
function copyArray(source, array) {
var index2 = -1, length = source.length;
array || (array = Array2(length));
while (++index2 < length) {
array[index2] = source[index2];
}
return array;
}
function copyObject(source, props, object, customizer) {
var isNew = !object;
object || (object = {});
var index2 = -1, length = props.length;
while (++index2 < length) {
var key = props[index2];
var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined2;
if (newValue === undefined2) {
newValue = source[key];
}
if (isNew) {
baseAssignValue(object, key, newValue);
} else {
assignValue(object, key, newValue);
}
}
return object;
}
function copySymbols(source, object) {
return copyObject(source, getSymbols(source), object);
}
function copySymbolsIn(source, object) {
return copyObject(source, getSymbolsIn(source), object);
}
function createAggregator(setter, initializer) {
return function(collection, iteratee2) {
var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {};
return func(collection, setter, getIteratee(iteratee2, 2), accumulator);
};
}
function createAssigner(assigner) {
return baseRest(function(object, sources) {
var index2 = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2;
customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2;
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
customizer = length < 3 ? undefined2 : customizer;
length = 1;
}
object = Object2(object);
while (++index2 < length) {
var source = sources[index2];
if (source) {
assigner(object, source, index2, customizer);
}
}
return object;
});
}
function createBaseEach(eachFunc, fromRight) {
return function(collection, iteratee2) {
if (collection == null) {
return collection;
}
if (!isArrayLike(collection)) {
return eachFunc(collection, iteratee2);
}
var length = collection.length, index2 = fromRight ? length : -1, iterable = Object2(collection);
while (fromRight ? index2-- : ++index2 < length) {
if (iteratee2(iterable[index2], index2, iterable) === false) {
break;
}
}
return collection;
};
}
function createBaseFor(fromRight) {
return function(object, iteratee2, keysFunc) {
var index2 = -1, iterable = Object2(object), props = keysFunc(object), length = props.length;
while (length--) {
var key = props[fromRight ? length : ++index2];
if (iteratee2(iterable[key], key, iterable) === false) {
break;
}
}
return object;
};
}
function createBind(func, bitmask, thisArg) {
var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
function wrapper() {
var fn = this && this !== root2 && this instanceof wrapper ? Ctor : func;
return fn.apply(isBind ? thisArg : this, arguments);
}
return wrapper;
}
function createCaseFirst(methodName) {
return function(string) {
string = toString(string);
var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined2;
var chr = strSymbols ? strSymbols[0] : string.charAt(0);
var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1);
return chr[methodName]() + trailing;
};
}
function createCompounder(callback) {
return function(string) {
return arrayReduce(words(deburr(string).replace(reApos, "")), callback, "");
};
}
function createCtor(Ctor) {
return function() {
var args = arguments;
switch (args.length) {
case 0:
return new Ctor();
case 1:
return new Ctor(args[0]);
case 2:
return new Ctor(args[0], args[1]);
case 3:
return new Ctor(args[0], args[1], args[2]);
case 4:
return new Ctor(args[0], args[1], args[2], args[3]);
case 5:
return new Ctor(args[0], args[1], args[2], args[3], args[4]);
case 6:
return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
case 7:
return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
}
var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args);
return isObject(result2) ? result2 : thisBinding;
};
}
function createCurry(func, bitmask, arity) {
var Ctor = createCtor(func);
function wrapper() {
var length = arguments.length, args = Array2(length), index2 = length, placeholder = getHolder(wrapper);
while (index2--) {
args[index2] = arguments[index2];
}
var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder);
length -= holders.length;
if (length < arity) {
return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, undefined2, args, holders, undefined2, undefined2, arity - length);
}
var fn = this && this !== root2 && this instanceof wrapper ? Ctor : func;
return apply(fn, this, args);
}
return wrapper;
}
function createFind(findIndexFunc) {
return function(collection, predicate, fromIndex) {
var iterable = Object2(collection);
if (!isArrayLike(collection)) {
var iteratee2 = getIteratee(predicate, 3);
collection = keys(collection);
predicate = function(key) {
return iteratee2(iterable[key], key, iterable);
};
}
var index2 = findIndexFunc(collection, predicate, fromIndex);
return index2 > -1 ? iterable[iteratee2 ? collection[index2] : index2] : undefined2;
};
}
function createFlow(fromRight) {
return flatRest(function(funcs) {
var length = funcs.length, index2 = length, prereq = LodashWrapper.prototype.thru;
if (fromRight) {
funcs.reverse();
}
while (index2--) {
var func = funcs[index2];
if (typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
if (prereq && !wrapper && getFuncName(func) == "wrapper") {
var wrapper = new LodashWrapper([], true);
}
}
index2 = wrapper ? index2 : length;
while (++index2 < length) {
func = funcs[index2];
var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2;
if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) {
wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
} else {
wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func);
}
}
return function() {
var args = arguments, value = args[0];
if (wrapper && args.length == 1 && isArray(value)) {
return wrapper.plant(value).value();
}
var index3 = 0, result2 = length ? funcs[index3].apply(this, args) : value;
while (++index3 < length) {
result2 = funcs[index3].call(this, result2);
}
return result2;
};
});
}
function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) {
var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined2 : createCtor(func);
function wrapper() {
var length = arguments.length, args = Array2(length), index2 = length;
while (index2--) {
args[index2] = arguments[index2];
}
if (isCurried) {
var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder);
}
if (partials) {
args = composeArgs(args, partials, holders, isCurried);
}
if (partialsRight) {
args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
}
length -= holdersCount;
if (isCurried && length < arity) {
var newHolders = replaceHolders(args, placeholder);
return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary2, arity - length);
}
var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func;
length = args.length;
if (argPos) {
args = reorder(args, argPos);
} else if (isFlip && length > 1) {
args.reverse();
}
if (isAry && ary2 < length) {
args.length = ary2;
}
if (this && this !== root2 && this instanceof wrapper) {
fn = Ctor || createCtor(fn);
}
return fn.apply(thisBinding, args);
}
return wrapper;
}
function createInverter(setter, toIteratee) {
return function(object, iteratee2) {
return baseInverter(object, setter, toIteratee(iteratee2), {});
};
}
function createMathOperation(operator, defaultValue) {
return function(value, other) {
var result2;
if (value === undefined2 && other === undefined2) {
return defaultValue;
}
if (value !== undefined2) {
result2 = value;
}
if (other !== undefined2) {
if (result2 === undefined2) {
return other;
}
if (typeof value == "string" || typeof other == "string") {
value = baseToString(value);
other = baseToString(other);
} else {
value = baseToNumber(value);
other = baseToNumber(other);
}
result2 = operator(value, other);
}
return result2;
};
}
function createOver(arrayFunc) {
return flatRest(function(iteratees) {
iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
return baseRest(function(args) {
var thisArg = this;
return arrayFunc(iteratees, function(iteratee2) {
return apply(iteratee2, thisArg, args);
});
});
});
}
function createPadding(length, chars) {
chars = chars === undefined2 ? " " : baseToString(chars);
var charsLength = chars.length;
if (charsLength < 2) {
return charsLength ? baseRepeat(chars, length) : chars;
}
var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
return hasUnicode(chars) ? castSlice(stringToArray(result2), 0, length).join("") : result2.slice(0, length);
}
function createPartial(func, bitmask, thisArg, partials) {
var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
function wrapper() {
var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn = this && this !== root2 && this instanceof wrapper ? Ctor : func;
while (++leftIndex < leftLength) {
args[leftIndex] = partials[leftIndex];
}
while (argsLength--) {
args[leftIndex++] = arguments[++argsIndex];
}
return apply(fn, isBind ? thisArg : this, args);
}
return wrapper;
}
function createRange(fromRight) {
return function(start2, end, step) {
if (step && typeof step != "number" && isIterateeCall(start2, end, step)) {
end = step = undefined2;
}
start2 = toFinite(start2);
if (end === undefined2) {
end = start2;
start2 = 0;
} else {
end = toFinite(end);
}
step = step === undefined2 ? start2 < end ? 1 : -1 : toFinite(step);
return baseRange(start2, end, step, fromRight);
};
}
function createRelationalOperation(operator) {
return function(value, other) {
if (!(typeof value == "string" && typeof other == "string")) {
value = toNumber(value);
other = toNumber(other);
}
return operator(value, other);
};
}
function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary2, arity) {
var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials;
bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG;
bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
}
var newData = [
func,
bitmask,
thisArg,
newPartials,
newHolders,
newPartialsRight,
newHoldersRight,
argPos,
ary2,
arity
];
var result2 = wrapFunc.apply(undefined2, newData);
if (isLaziable(func)) {
setData(result2, newData);
}
result2.placeholder = placeholder;
return setWrapToString(result2, func, bitmask);
}
function createRound(methodName) {
var func = Math2[methodName];
return function(number3, precision) {
number3 = toNumber(number3);
precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
if (precision && nativeIsFinite(number3)) {
var pair = (toString(number3) + "e").split("e"), value = func(pair[0] + "e" + (+pair[1] + precision));
pair = (toString(value) + "e").split("e");
return +(pair[0] + "e" + (+pair[1] - precision));
}
return func(number3);
};
}
var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY) ? noop3 : function(values2) {
return new Set2(values2);
};
function createToPairs(keysFunc) {
return function(object) {
var tag = getTag(object);
if (tag == mapTag) {
return mapToArray(object);
}
if (tag == setTag) {
return setToPairs(object);
}
return baseToPairs(object, keysFunc(object));
};
}
function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) {
var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
if (!isBindKey && typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
var length = partials ? partials.length : 0;
if (!length) {
bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
partials = holders = undefined2;
}
ary2 = ary2 === undefined2 ? ary2 : nativeMax(toInteger(ary2), 0);
arity = arity === undefined2 ? arity : toInteger(arity);
length -= holders ? holders.length : 0;
if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
var partialsRight = partials, holdersRight = holders;
partials = holders = undefined2;
}
var data = isBindKey ? undefined2 : getData(func);
var newData = [
func,
bitmask,
thisArg,
partials,
holders,
partialsRight,
holdersRight,
argPos,
ary2,
arity
];
if (data) {
mergeData(newData, data);
}
func = newData[0];
bitmask = newData[1];
thisArg = newData[2];
partials = newData[3];
holders = newData[4];
arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0);
if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
}
if (!bitmask || bitmask == WRAP_BIND_FLAG) {
var result2 = createBind(func, bitmask, thisArg);
} else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
result2 = createCurry(func, bitmask, arity);
} else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
result2 = createPartial(func, bitmask, thisArg, partials);
} else {
result2 = createHybrid.apply(undefined2, newData);
}
var setter = data ? baseSetData : setData;
return setWrapToString(setter(result2, newData), func, bitmask);
}
function customDefaultsAssignIn(objValue, srcValue, key, object) {
if (objValue === undefined2 || eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key)) {
return srcValue;
}
return objValue;
}
function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
if (isObject(objValue) && isObject(srcValue)) {
stack.set(srcValue, objValue);
baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack);
stack["delete"](srcValue);
}
return objValue;
}
function customOmitClone(value) {
return isPlainObject(value) ? undefined2 : value;
}
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
var arrStacked = stack.get(array);
var othStacked = stack.get(other);
if (arrStacked && othStacked) {
return arrStacked == other && othStacked == array;
}
var index2 = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2;
stack.set(array, other);
stack.set(other, array);
while (++index2 < arrLength) {
var arrValue = array[index2], othValue = other[index2];
if (customizer) {
var compared = isPartial ? customizer(othValue, arrValue, index2, other, array, stack) : customizer(arrValue, othValue, index2, array, other, stack);
}
if (compared !== undefined2) {
if (compared) {
continue;
}
result2 = false;
break;
}
if (seen) {
if (!arraySome(other, function(othValue2, othIndex) {
if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
return seen.push(othIndex);
}
})) {
result2 = false;
break;
}
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
result2 = false;
break;
}
}
stack["delete"](array);
stack["delete"](other);
return result2;
}
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
switch (tag) {
case dataViewTag:
if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
return false;
}
object = object.buffer;
other = other.buffer;
case arrayBufferTag:
if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) {
return false;
}
return true;
case boolTag:
case dateTag:
case numberTag:
return eq(+object, +other);
case errorTag:
return object.name == other.name && object.message == other.message;
case regexpTag:
case stringTag:
return object == other + "";
case mapTag:
var convert = mapToArray;
case setTag:
var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
convert || (convert = setToArray);
if (object.size != other.size && !isPartial) {
return false;
}
var stacked = stack.get(object);
if (stacked) {
return stacked == other;
}
bitmask |= COMPARE_UNORDERED_FLAG;
stack.set(object, other);
var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
stack["delete"](object);
return result2;
case symbolTag:
if (symbolValueOf) {
return symbolValueOf.call(object) == symbolValueOf.call(other);
}
}
return false;
}
function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index2 = objLength;
while (index2--) {
var key = objProps[index2];
if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
return false;
}
}
var objStacked = stack.get(object);
var othStacked = stack.get(other);
if (objStacked && othStacked) {
return objStacked == other && othStacked == object;
}
var result2 = true;
stack.set(object, other);
stack.set(other, object);
var skipCtor = isPartial;
while (++index2 < objLength) {
key = objProps[index2];
var objValue = object[key], othValue = other[key];
if (customizer) {
var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
}
if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
result2 = false;
break;
}
skipCtor || (skipCtor = key == "constructor");
}
if (result2 && !skipCtor) {
var objCtor = object.constructor, othCtor = other.constructor;
if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
result2 = false;
}
}
stack["delete"](object);
stack["delete"](other);
return result2;
}
function flatRest(func) {
return setToString(overRest(func, undefined2, flatten), func + "");
}
function getAllKeys(object) {
return baseGetAllKeys(object, keys, getSymbols);
}
function getAllKeysIn(object) {
return baseGetAllKeys(object, keysIn, getSymbolsIn);
}
var getData = !metaMap ? noop3 : function(func) {
return metaMap.get(func);
};
function getFuncName(func) {
var result2 = func.name + "", array = realNames[result2], length = hasOwnProperty.call(realNames, result2) ? array.length : 0;
while (length--) {
var data = array[length], otherFunc = data.func;
if (otherFunc == null || otherFunc == func) {
return data.name;
}
}
return result2;
}
function getHolder(func) {
var object = hasOwnProperty.call(lodash, "placeholder") ? lodash : func;
return object.placeholder;
}
function getIteratee() {
var result2 = lodash.iteratee || iteratee;
result2 = result2 === iteratee ? baseIteratee : result2;
return arguments.length ? result2(arguments[0], arguments[1]) : result2;
}
function getMapData(map3, key) {
var data = map3.__data__;
return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
}
function getMatchData(object) {
var result2 = keys(object), length = result2.length;
while (length--) {
var key = result2[length], value = object[key];
result2[length] = [key, value, isStrictComparable(value)];
}
return result2;
}
function getNative(object, key) {
var value = getValue(object, key);
return baseIsNative(value) ? value : undefined2;
}
function getRawTag(value) {
var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
try {
value[symToStringTag] = undefined2;
var unmasked = true;
} catch (e) {
}
var result2 = nativeObjectToString.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag] = tag;
} else {
delete value[symToStringTag];
}
}
return result2;
}
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
if (object == null) {
return [];
}
object = Object2(object);
return arrayFilter(nativeGetSymbols(object), function(symbol) {
return propertyIsEnumerable.call(object, symbol);
});
};
var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
var result2 = [];
while (object) {
arrayPush(result2, getSymbols(object));
object = getPrototype(object);
}
return result2;
};
var getTag = baseGetTag;
if (DataView2 && getTag(new DataView2(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {
getTag = function(value) {
var result2 = baseGetTag(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : "";
if (ctorString) {
switch (ctorString) {
case dataViewCtorString:
return dataViewTag;
case mapCtorString:
return mapTag;
case promiseCtorString:
return promiseTag;
case setCtorString:
return setTag;
case weakMapCtorString:
return weakMapTag;
}
}
return result2;
};
}
function getView(start2, end, transforms) {
var index2 = -1, length = transforms.length;
while (++index2 < length) {
var data = transforms[index2], size2 = data.size;
switch (data.type) {
case "drop":
start2 += size2;
break;
case "dropRight":
end -= size2;
break;
case "take":
end = nativeMin(end, start2 + size2);
break;
case "takeRight":
start2 = nativeMax(start2, end - size2);
break;
}
}
return { "start": start2, "end": end };
}
function getWrapDetails(source) {
var match = source.match(reWrapDetails);
return match ? match[1].split(reSplitDetails) : [];
}
function hasPath(object, path2, hasFunc) {
path2 = castPath(path2, object);
var index2 = -1, length = path2.length, result2 = false;
while (++index2 < length) {
var key = toKey(path2[index2]);
if (!(result2 = object != null && hasFunc(object, key))) {
break;
}
object = object[key];
}
if (result2 || ++index2 != length) {
return result2;
}
length = object == null ? 0 : object.length;
return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));
}
function initCloneArray(array) {
var length = array.length, result2 = new array.constructor(length);
if (length && typeof array[0] == "string" && hasOwnProperty.call(array, "index")) {
result2.index = array.index;
result2.input = array.input;
}
return result2;
}
function initCloneObject(object) {
return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
}
function initCloneByTag(object, tag, isDeep) {
var Ctor = object.constructor;
switch (tag) {
case arrayBufferTag:
return cloneArrayBuffer(object);
case boolTag:
case dateTag:
return new Ctor(+object);
case dataViewTag:
return cloneDataView(object, isDeep);
case float32Tag:
case float64Tag:
case int8Tag:
case int16Tag:
case int32Tag:
case uint8Tag:
case uint8ClampedTag:
case uint16Tag:
case uint32Tag:
return cloneTypedArray(object, isDeep);
case mapTag:
return new Ctor();
case numberTag:
case stringTag:
return new Ctor(object);
case regexpTag:
return cloneRegExp(object);
case setTag:
return new Ctor();
case symbolTag:
return cloneSymbol(object);
}
}
function insertWrapDetails(source, details2) {
var length = details2.length;
if (!length) {
return source;
}
var lastIndex = length - 1;
details2[lastIndex] = (length > 1 ? "& " : "") + details2[lastIndex];
details2 = details2.join(length > 2 ? ", " : " ");
return source.replace(reWrapComment, "{\n/* [wrapped with " + details2 + "] */\n");
}
function isFlattenable(value) {
return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
}
function isIndex(value, length) {
var type2 = typeof value;
length = length == null ? MAX_SAFE_INTEGER : length;
return !!length && (type2 == "number" || type2 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
}
function isIterateeCall(value, index2, object) {
if (!isObject(object)) {
return false;
}
var type2 = typeof index2;
if (type2 == "number" ? isArrayLike(object) && isIndex(index2, object.length) : type2 == "string" && index2 in object) {
return eq(object[index2], value);
}
return false;
}
function isKey(value, object) {
if (isArray(value)) {
return false;
}
var type2 = typeof value;
if (type2 == "number" || type2 == "symbol" || type2 == "boolean" || value == null || isSymbol(value)) {
return true;
}
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object);
}
function isKeyable(value) {
var type2 = typeof value;
return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
}
function isLaziable(func) {
var funcName = getFuncName(func), other = lodash[funcName];
if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) {
return false;
}
if (func === other) {
return true;
}
var data = getData(other);
return !!data && func === data[0];
}
function isMasked(func) {
return !!maskSrcKey && maskSrcKey in func;
}
var isMaskable = coreJsData ? isFunction : stubFalse;
function isPrototype(value) {
var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
return value === proto;
}
function isStrictComparable(value) {
return value === value && !isObject(value);
}
function matchesStrictComparable(key, srcValue) {
return function(object) {
if (object == null) {
return false;
}
return object[key] === srcValue && (srcValue !== undefined2 || key in Object2(object));
};
}
function memoizeCapped(func) {
var result2 = memoize(func, function(key) {
if (cache.size === MAX_MEMOIZE_SIZE) {
cache.clear();
}
return key;
});
var cache = result2.cache;
return result2;
}
function mergeData(data, source) {
var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG;
if (!(isCommon || isCombo)) {
return data;
}
if (srcBitmask & WRAP_BIND_FLAG) {
data[2] = source[2];
newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
}
var value = source[3];
if (value) {
var partials = data[3];
data[3] = partials ? composeArgs(partials, value, source[4]) : value;
data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
}
value = source[5];
if (value) {
partials = data[5];
data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
}
value = source[7];
if (value) {
data[7] = value;
}
if (srcBitmask & WRAP_ARY_FLAG) {
data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
}
if (data[9] == null) {
data[9] = source[9];
}
data[0] = source[0];
data[1] = newBitmask;
return data;
}
function nativeKeysIn(object) {
var result2 = [];
if (object != null) {
for (var key in Object2(object)) {
result2.push(key);
}
}
return result2;
}
function objectToString(value) {
return nativeObjectToString.call(value);
}
function overRest(func, start2, transform3) {
start2 = nativeMax(start2 === undefined2 ? func.length - 1 : start2, 0);
return function() {
var args = arguments, index2 = -1, length = nativeMax(args.length - start2, 0), array = Array2(length);
while (++index2 < length) {
array[index2] = args[start2 + index2];
}
index2 = -1;
var otherArgs = Array2(start2 + 1);
while (++index2 < start2) {
otherArgs[index2] = args[index2];
}
otherArgs[start2] = transform3(array);
return apply(func, this, otherArgs);
};
}
function parent(object, path2) {
return path2.length < 2 ? object : baseGet(object, baseSlice(path2, 0, -1));
}
function reorder(array, indexes) {
var arrLength = array.length, length = nativeMin(indexes.length, arrLength), oldArray = copyArray(array);
while (length--) {
var index2 = indexes[length];
array[length] = isIndex(index2, arrLength) ? oldArray[index2] : undefined2;
}
return array;
}
function safeGet(object, key) {
if (key === "constructor" && typeof object[key] === "function") {
return;
}
if (key == "__proto__") {
return;
}
return object[key];
}
var setData = shortOut(baseSetData);
var setTimeout2 = ctxSetTimeout || function(func, wait2) {
return root2.setTimeout(func, wait2);
};
var setToString = shortOut(baseSetToString);
function setWrapToString(wrapper, reference, bitmask) {
var source = reference + "";
return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
}
function shortOut(func) {
var count2 = 0, lastCalled = 0;
return function() {
var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);
lastCalled = stamp;
if (remaining > 0) {
if (++count2 >= HOT_COUNT) {
return arguments[0];
}
} else {
count2 = 0;
}
return func.apply(undefined2, arguments);
};
}
function shuffleSelf(array, size2) {
var index2 = -1, length = array.length, lastIndex = length - 1;
size2 = size2 === undefined2 ? length : size2;
while (++index2 < size2) {
var rand = baseRandom(index2, lastIndex), value = array[rand];
array[rand] = array[index2];
array[index2] = value;
}
array.length = size2;
return array;
}
var stringToPath = memoizeCapped(function(string) {
var result2 = [];
if (string.charCodeAt(0) === 46) {
result2.push("");
}
string.replace(rePropName, function(match, number3, quote, subString) {
result2.push(quote ? subString.replace(reEscapeChar, "$1") : number3 || match);
});
return result2;
});
function toKey(value) {
if (typeof value == "string" || isSymbol(value)) {
return value;
}
var result2 = value + "";
return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2;
}
function toSource(func) {
if (func != null) {
try {
return funcToString.call(func);
} catch (e) {
}
try {
return func + "";
} catch (e) {
}
}
return "";
}
function updateWrapDetails(details2, bitmask) {
arrayEach(wrapFlags, function(pair) {
var value = "_." + pair[0];
if (bitmask & pair[1] && !arrayIncludes(details2, value)) {
details2.push(value);
}
});
return details2.sort();
}
function wrapperClone(wrapper) {
if (wrapper instanceof LazyWrapper) {
return wrapper.clone();
}
var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
result2.__actions__ = copyArray(wrapper.__actions__);
result2.__index__ = wrapper.__index__;
result2.__values__ = wrapper.__values__;
return result2;
}
function chunk(array, size2, guard) {
if (guard ? isIterateeCall(array, size2, guard) : size2 === undefined2) {
size2 = 1;
} else {
size2 = nativeMax(toInteger(size2), 0);
}
var length = array == null ? 0 : array.length;
if (!length || size2 < 1) {
return [];
}
var index2 = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2));
while (index2 < length) {
result2[resIndex++] = baseSlice(array, index2, index2 += size2);
}
return result2;
}
function compact(array) {
var index2 = -1, length = array == null ? 0 : array.length, resIndex = 0, result2 = [];
while (++index2 < length) {
var value = array[index2];
if (value) {
result2[resIndex++] = value;
}
}
return result2;
}
function concat() {
var length = arguments.length;
if (!length) {
return [];
}
var args = Array2(length - 1), array = arguments[0], index2 = length;
while (index2--) {
args[index2 - 1] = arguments[index2];
}
return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
}
var difference = baseRest(function(array, values2) {
return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true)) : [];
});
var differenceBy = baseRest(function(array, values2) {
var iteratee2 = last(values2);
if (isArrayLikeObject(iteratee2)) {
iteratee2 = undefined2;
}
return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : [];
});
var differenceWith = baseRest(function(array, values2) {
var comparator = last(values2);
if (isArrayLikeObject(comparator)) {
comparator = undefined2;
}
return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : [];
});
function drop(array, n, guard) {
var length = array == null ? 0 : array.length;
if (!length) {
return [];
}
n = guard || n === undefined2 ? 1 : toInteger(n);
return baseSlice(array, n < 0 ? 0 : n, length);
}
function dropRight(array, n, guard) {
var length = array == null ? 0 : array.length;
if (!length) {
return [];
}
n = guard || n === undefined2 ? 1 : toInteger(n);
n = length - n;
return baseSlice(array, 0, n < 0 ? 0 : n);
}
function dropRightWhile(array, predicate) {
return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : [];
}
function dropWhile(array, predicate) {
return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : [];
}
function fill(array, value, start2, end) {
var length = array == null ? 0 : array.length;
if (!length) {
return [];
}
if (start2 && typeof start2 != "number" && isIterateeCall(array, value, start2)) {
start2 = 0;
end = length;
}
return baseFill(array, value, start2, end);
}
function findIndex(array, predicate, fromIndex) {
var length = array == null ? 0 : array.length;
if (!length) {
return -1;
}
var index2 = fromIndex == null ? 0 : toInteger(fromIndex);
if (index2 < 0) {
index2 = nativeMax(length + index2, 0);
}
return baseFindIndex(array, getIteratee(predicate, 3), index2);
}
function findLastIndex(array, predicate, fromIndex) {
var length = array == null ? 0 : array.length;
if (!length) {
return -1;
}
var index2 = length - 1;
if (fromIndex !== undefined2) {
index2 = toInteger(fromIndex);
index2 = fromIndex < 0 ? nativeMax(length + index2, 0) : nativeMin(index2, length - 1);
}
return baseFindIndex(array, getIteratee(predicate, 3), index2, true);
}
function flatten(array) {
var length = array == null ? 0 : array.length;
return length ? baseFlatten(array, 1) : [];
}
function flattenDeep(array) {
var length = array == null ? 0 : array.length;
return length ? baseFlatten(array, INFINITY) : [];
}
function flattenDepth(array, depth) {
var length = array == null ? 0 : array.length;
if (!length) {
return [];
}
depth = depth === undefined2 ? 1 : toInteger(depth);
return baseFlatten(array, depth);
}
function fromPairs(pairs) {
var index2 = -1, length = pairs == null ? 0 : pairs.length, result2 = {};
while (++index2 < length) {
var pair = pairs[index2];
result2[pair[0]] = pair[1];
}
return result2;
}
function head(array) {
return array && array.length ? array[0] : undefined2;
}
function indexOf(array, value, fromIndex) {
var length = array == null ? 0 : array.length;
if (!length) {
return -1;
}
var index2 = fromIndex == null ? 0 : toInteger(fromIndex);
if (index2 < 0) {
index2 = nativeMax(length + index2, 0);
}
return baseIndexOf(array, value, index2);
}
function initial(array) {
var length = array == null ? 0 : array.length;
return length ? baseSlice(array, 0, -1) : [];
}
var intersection = baseRest(function(arrays) {
var mapped = arrayMap(arrays, castArrayLikeObject);
return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];
});
var intersectionBy = baseRest(function(arrays) {
var iteratee2 = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject);
if (iteratee2 === last(mapped)) {
iteratee2 = undefined2;
} else {
mapped.pop();
}
return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : [];
});
var intersectionWith = baseRest(function(arrays) {
var comparator = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject);
comparator = typeof comparator == "function" ? comparator : undefined2;
if (comparator) {
mapped.pop();
}
return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
});
function join(array, separator) {
return array == null ? "" : nativeJoin.call(array, separator);
}
function last(array) {
var length = array == null ? 0 : array.length;
return length ? array[length - 1] : undefined2;
}
function lastIndexOf(array, value, fromIndex) {
var length = array == null ? 0 : array.length;
if (!length) {
return -1;
}
var index2 = length;
if (fromIndex !== undefined2) {
index2 = toInteger(fromIndex);
index2 = index2 < 0 ? nativeMax(length + index2, 0) : nativeMin(index2, length - 1);
}
return value === value ? strictLastIndexOf(array, value, index2) : baseFindIndex(array, baseIsNaN, index2, true);
}
function nth(array, n) {
return array && array.length ? baseNth(array, toInteger(n)) : undefined2;
}
var pull = baseRest(pullAll);
function pullAll(array, values2) {
return array && array.length && values2 && values2.length ? basePullAll(array, values2) : array;
}
function pullAllBy(array, values2, iteratee2) {
return array && array.length && values2 && values2.length ? basePullAll(array, values2, getIteratee(iteratee2, 2)) : array;
}
function pullAllWith(array, values2, comparator) {
return array && array.length && values2 && values2.length ? basePullAll(array, values2, undefined2, comparator) : array;
}
var pullAt = flatRest(function(array, indexes) {
var length = array == null ? 0 : array.length, result2 = baseAt(array, indexes);
basePullAt(array, arrayMap(indexes, function(index2) {
return isIndex(index2, length) ? +index2 : index2;
}).sort(compareAscending));
return result2;
});
function remove2(array, predicate) {
var result2 = [];
if (!(array && array.length)) {
return result2;
}
var index2 = -1, indexes = [], length = array.length;
predicate = getIteratee(predicate, 3);
while (++index2 < length) {
var value = array[index2];
if (predicate(value, index2, array)) {
result2.push(value);
indexes.push(index2);
}
}
basePullAt(array, indexes);
return result2;
}
function reverse(array) {
return array == null ? array : nativeReverse.call(array);
}
function slice2(array, start2, end) {
var length = array == null ? 0 : array.length;
if (!length) {
return [];
}
if (end && typeof end != "number" && isIterateeCall(array, start2, end)) {
start2 = 0;
end = length;
} else {
start2 = start2 == null ? 0 : toInteger(start2);
end = end === undefined2 ? length : toInteger(end);
}
return baseSlice(array, start2, end);
}
function sortedIndex(array, value) {
return baseSortedIndex(array, value);
}
function sortedIndexBy(array, value, iteratee2) {
return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2));
}
function sortedIndexOf(array, value) {
var length = array == null ? 0 : array.length;
if (length) {
var index2 = baseSortedIndex(array, value);
if (index2 < length && eq(array[index2], value)) {
return index2;
}
}
return -1;
}
function sortedLastIndex(array, value) {
return baseSortedIndex(array, value, true);
}
function sortedLastIndexBy(array, value, iteratee2) {
return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2), true);
}
function sortedLastIndexOf(array, value) {
var length = array == null ? 0 : array.length;
if (length) {
var index2 = baseSortedIndex(array, value, true) - 1;
if (eq(array[index2], value)) {
return index2;
}
}
return -1;
}
function sortedUniq(array) {
return array && array.length ? baseSortedUniq(array) : [];
}
function sortedUniqBy(array, iteratee2) {
return array && array.length ? baseSortedUniq(array, getIteratee(iteratee2, 2)) : [];
}
function tail(array) {
var length = array == null ? 0 : array.length;
return length ? baseSlice(array, 1, length) : [];
}
function take(array, n, guard) {
if (!(array && array.length)) {
return [];
}
n = guard || n === undefined2 ? 1 : toInteger(n);
return baseSlice(array, 0, n < 0 ? 0 : n);
}
function takeRight(array, n, guard) {
var length = array == null ? 0 : array.length;
if (!length) {
return [];
}
n = guard || n === undefined2 ? 1 : toInteger(n);
n = length - n;
return baseSlice(array, n < 0 ? 0 : n, length);
}
function takeRightWhile(array, predicate) {
return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : [];
}
function takeWhile(array, predicate) {
return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : [];
}
var union = baseRest(function(arrays) {
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
});
var unionBy = baseRest(function(arrays) {
var iteratee2 = last(arrays);
if (isArrayLikeObject(iteratee2)) {
iteratee2 = undefined2;
}
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2));
});
var unionWith = baseRest(function(arrays) {
var comparator = last(arrays);
comparator = typeof comparator == "function" ? comparator : undefined2;
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator);
});
function uniq(array) {
return array && array.length ? baseUniq(array) : [];
}
function uniqBy(array, iteratee2) {
return array && array.length ? baseUniq(array, getIteratee(iteratee2, 2)) : [];
}
function uniqWith(array, comparator) {
comparator = typeof comparator == "function" ? comparator : undefined2;
return array && array.length ? baseUniq(array, undefined2, comparator) : [];
}
function unzip(array) {
if (!(array && array.length)) {
return [];
}
var length = 0;
array = arrayFilter(array, function(group) {
if (isArrayLikeObject(group)) {
length = nativeMax(group.length, length);
return true;
}
});
return baseTimes(length, function(index2) {
return arrayMap(array, baseProperty(index2));
});
}
function unzipWith(array, iteratee2) {
if (!(array && array.length)) {
return [];
}
var result2 = unzip(array);
if (iteratee2 == null) {
return result2;
}
return arrayMap(result2, function(group) {
return apply(iteratee2, undefined2, group);
});
}
var without = baseRest(function(array, values2) {
return isArrayLikeObject(array) ? baseDifference(array, values2) : [];
});
var xor = baseRest(function(arrays) {
return baseXor(arrayFilter(arrays, isArrayLikeObject));
});
var xorBy = baseRest(function(arrays) {
var iteratee2 = last(arrays);
if (isArrayLikeObject(iteratee2)) {
iteratee2 = undefined2;
}
return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2));
});
var xorWith = baseRest(function(arrays) {
var comparator = last(arrays);
comparator = typeof comparator == "function" ? comparator : undefined2;
return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator);
});
var zip = baseRest(unzip);
function zipObject(props, values2) {
return baseZipObject(props || [], values2 || [], assignValue);
}
function zipObjectDeep(props, values2) {
return baseZipObject(props || [], values2 || [], baseSet);
}
var zipWith = baseRest(function(arrays) {
var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2;
iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2;
return unzipWith(arrays, iteratee2);
});
function chain(value) {
var result2 = lodash(value);
result2.__chain__ = true;
return result2;
}
function tap(value, interceptor) {
interceptor(value);
return value;
}
function thru(value, interceptor) {
return interceptor(value);
}
var wrapperAt = flatRest(function(paths) {
var length = paths.length, start2 = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) {
return baseAt(object, paths);
};
if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start2)) {
return this.thru(interceptor);
}
value = value.slice(start2, +start2 + (length ? 1 : 0));
value.__actions__.push({
"func": thru,
"args": [interceptor],
"thisArg": undefined2
});
return new LodashWrapper(value, this.__chain__).thru(function(array) {
if (length && !array.length) {
array.push(undefined2);
}
return array;
});
});
function wrapperChain() {
return chain(this);
}
function wrapperCommit() {
return new LodashWrapper(this.value(), this.__chain__);
}
function wrapperNext() {
if (this.__values__ === undefined2) {
this.__values__ = toArray(this.value());
}
var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++];
return { "done": done, "value": value };
}
function wrapperToIterator() {
return this;
}
function wrapperPlant(value) {
var result2, parent2 = this;
while (parent2 instanceof baseLodash) {
var clone2 = wrapperClone(parent2);
clone2.__index__ = 0;
clone2.__values__ = undefined2;
if (result2) {
previous.__wrapped__ = clone2;
} else {
result2 = clone2;
}
var previous = clone2;
parent2 = parent2.__wrapped__;
}
previous.__wrapped__ = value;
return result2;
}
function wrapperReverse() {
var value = this.__wrapped__;
if (value instanceof LazyWrapper) {
var wrapped = value;
if (this.__actions__.length) {
wrapped = new LazyWrapper(this);
}
wrapped = wrapped.reverse();
wrapped.__actions__.push({
"func": thru,
"args": [reverse],
"thisArg": undefined2
});
return new LodashWrapper(wrapped, this.__chain__);
}
return this.thru(reverse);
}
function wrapperValue() {
return baseWrapperValue(this.__wrapped__, this.__actions__);
}
var countBy = createAggregator(function(result2, value, key) {
if (hasOwnProperty.call(result2, key)) {
++result2[key];
} else {
baseAssignValue(result2, key, 1);
}
});
function every(collection, predicate, guard) {
var func = isArray(collection) ? arrayEvery : baseEvery;
if (guard && isIterateeCall(collection, predicate, guard)) {
predicate = undefined2;
}
return func(collection, getIteratee(predicate, 3));
}
function filter2(collection, predicate) {
var func = isArray(collection) ? arrayFilter : baseFilter;
return func(collection, getIteratee(predicate, 3));
}
var find3 = createFind(findIndex);
var findLast = createFind(findLastIndex);
function flatMap(collection, iteratee2) {
return baseFlatten(map2(collection, iteratee2), 1);
}
function flatMapDeep(collection, iteratee2) {
return baseFlatten(map2(collection, iteratee2), INFINITY);
}
function flatMapDepth(collection, iteratee2, depth) {
depth = depth === undefined2 ? 1 : toInteger(depth);
return baseFlatten(map2(collection, iteratee2), depth);
}
function forEach(collection, iteratee2) {
var func = isArray(collection) ? arrayEach : baseEach;
return func(collection, getIteratee(iteratee2, 3));
}
function forEachRight(collection, iteratee2) {
var func = isArray(collection) ? arrayEachRight : baseEachRight;
return func(collection, getIteratee(iteratee2, 3));
}
var groupBy = createAggregator(function(result2, value, key) {
if (hasOwnProperty.call(result2, key)) {
result2[key].push(value);
} else {
baseAssignValue(result2, key, [value]);
}
});
function includes(collection, value, fromIndex, guard) {
collection = isArrayLike(collection) ? collection : values(collection);
fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
var length = collection.length;
if (fromIndex < 0) {
fromIndex = nativeMax(length + fromIndex, 0);
}
return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
}
var invokeMap = baseRest(function(collection, path2, args) {
var index2 = -1, isFunc = typeof path2 == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : [];
baseEach(collection, function(value) {
result2[++index2] = isFunc ? apply(path2, value, args) : baseInvoke(value, path2, args);
});
return result2;
});
var keyBy = createAggregator(function(result2, value, key) {
baseAssignValue(result2, key, value);
});
function map2(collection, iteratee2) {
var func = isArray(collection) ? arrayMap : baseMap;
return func(collection, getIteratee(iteratee2, 3));
}
function orderBy(collection, iteratees, orders, guard) {
if (collection == null) {
return [];
}
if (!isArray(iteratees)) {
iteratees = iteratees == null ? [] : [iteratees];
}
orders = guard ? undefined2 : orders;
if (!isArray(orders)) {
orders = orders == null ? [] : [orders];
}
return baseOrderBy(collection, iteratees, orders);
}
var partition = createAggregator(function(result2, value, key) {
result2[key ? 0 : 1].push(value);
}, function() {
return [[], []];
});
function reduce(collection, iteratee2, accumulator) {
var func = isArray(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3;
return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach);
}
function reduceRight(collection, iteratee2, accumulator) {
var func = isArray(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3;
return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight);
}
function reject(collection, predicate) {
var func = isArray(collection) ? arrayFilter : baseFilter;
return func(collection, negate(getIteratee(predicate, 3)));
}
function sample(collection) {
var func = isArray(collection) ? arraySample : baseSample;
return func(collection);
}
function sampleSize(collection, n, guard) {
if (guard ? isIterateeCall(collection, n, guard) : n === undefined2) {
n = 1;
} else {
n = toInteger(n);
}
var func = isArray(collection) ? arraySampleSize : baseSampleSize;
return func(collection, n);
}
function shuffle(collection) {
var func = isArray(collection) ? arrayShuffle : baseShuffle;
return func(collection);
}
function size(collection) {
if (collection == null) {
return 0;
}
if (isArrayLike(collection)) {
return isString(collection) ? stringSize(collection) : collection.length;
}
var tag = getTag(collection);
if (tag == mapTag || tag == setTag) {
return collection.size;
}
return baseKeys(collection).length;
}
function some(collection, predicate, guard) {
var func = isArray(collection) ? arraySome : baseSome;
if (guard && isIterateeCall(collection, predicate, guard)) {
predicate = undefined2;
}
return func(collection, getIteratee(predicate, 3));
}
var sortBy = baseRest(function(collection, iteratees) {
if (collection == null) {
return [];
}
var length = iteratees.length;
if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
iteratees = [];
} else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
iteratees = [iteratees[0]];
}
return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
});
var now2 = ctxNow || function() {
return root2.Date.now();
};
function after(n, func) {
if (typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
n = toInteger(n);
return function() {
if (--n < 1) {
return func.apply(this, arguments);
}
};
}
function ary(func, n, guard) {
n = guard ? undefined2 : n;
n = func && n == null ? func.length : n;
return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n);
}
function before(n, func) {
var result2;
if (typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
n = toInteger(n);
return function() {
if (--n > 0) {
result2 = func.apply(this, arguments);
}
if (n <= 1) {
func = undefined2;
}
return result2;
};
}
var bind = baseRest(function(func, thisArg, partials) {
var bitmask = WRAP_BIND_FLAG;
if (partials.length) {
var holders = replaceHolders(partials, getHolder(bind));
bitmask |= WRAP_PARTIAL_FLAG;
}
return createWrap(func, bitmask, thisArg, partials, holders);
});
var bindKey2 = baseRest(function(object, key, partials) {
var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
if (partials.length) {
var holders = replaceHolders(partials, getHolder(bindKey2));
bitmask |= WRAP_PARTIAL_FLAG;
}
return createWrap(key, bitmask, object, partials, holders);
});
function curry(func, arity, guard) {
arity = guard ? undefined2 : arity;
var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
result2.placeholder = curry.placeholder;
return result2;
}
function curryRight(func, arity, guard) {
arity = guard ? undefined2 : arity;
var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
result2.placeholder = curryRight.placeholder;
return result2;
}
function debounce(func, wait2, options) {
var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
if (typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
wait2 = toNumber(wait2) || 0;
if (isObject(options)) {
leading = !!options.leading;
maxing = "maxWait" in options;
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait2) : maxWait;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs, thisArg = lastThis;
lastArgs = lastThis = undefined2;
lastInvokeTime = time;
result2 = func.apply(thisArg, args);
return result2;
}
function leadingEdge(time) {
lastInvokeTime = time;
timerId = setTimeout2(timerExpired, wait2);
return leading ? invokeFunc(time) : result2;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait2 - timeSinceLastCall;
return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
return lastCallTime === undefined2 || timeSinceLastCall >= wait2 || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now2();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
timerId = setTimeout2(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = undefined2;
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = undefined2;
return result2;
}
function cancel() {
if (timerId !== undefined2) {
clearTimeout2(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined2;
}
function flush2() {
return timerId === undefined2 ? result2 : trailingEdge(now2());
}
function debounced() {
var time = now2(), isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === undefined2) {
return leadingEdge(lastCallTime);
}
if (maxing) {
clearTimeout2(timerId);
timerId = setTimeout2(timerExpired, wait2);
return invokeFunc(lastCallTime);
}
}
if (timerId === undefined2) {
timerId = setTimeout2(timerExpired, wait2);
}
return result2;
}
debounced.cancel = cancel;
debounced.flush = flush2;
return debounced;
}
var defer = baseRest(function(func, args) {
return baseDelay(func, 1, args);
});
var delay = baseRest(function(func, wait2, args) {
return baseDelay(func, toNumber(wait2) || 0, args);
});
function flip(func) {
return createWrap(func, WRAP_FLIP_FLAG);
}
function memoize(func, resolver) {
if (typeof func != "function" || resolver != null && typeof resolver != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
var memoized = function() {
var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
if (cache.has(key)) {
return cache.get(key);
}
var result2 = func.apply(this, args);
memoized.cache = cache.set(key, result2) || cache;
return result2;
};
memoized.cache = new (memoize.Cache || MapCache)();
return memoized;
}
memoize.Cache = MapCache;
function negate(predicate) {
if (typeof predicate != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
return function() {
var args = arguments;
switch (args.length) {
case 0:
return !predicate.call(this);
case 1:
return !predicate.call(this, args[0]);
case 2:
return !predicate.call(this, args[0], args[1]);
case 3:
return !predicate.call(this, args[0], args[1], args[2]);
}
return !predicate.apply(this, args);
};
}
function once(func) {
return before(2, func);
}
var overArgs = castRest(function(func, transforms) {
transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
var funcsLength = transforms.length;
return baseRest(function(args) {
var index2 = -1, length = nativeMin(args.length, funcsLength);
while (++index2 < length) {
args[index2] = transforms[index2].call(this, args[index2]);
}
return apply(func, this, args);
});
});
var partial = baseRest(function(func, partials) {
var holders = replaceHolders(partials, getHolder(partial));
return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders);
});
var partialRight = baseRest(function(func, partials) {
var holders = replaceHolders(partials, getHolder(partialRight));
return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders);
});
var rearg = flatRest(function(func, indexes) {
return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes);
});
function rest(func, start2) {
if (typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
start2 = start2 === undefined2 ? start2 : toInteger(start2);
return baseRest(func, start2);
}
function spread(func, start2) {
if (typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
start2 = start2 == null ? 0 : nativeMax(toInteger(start2), 0);
return baseRest(function(args) {
var array = args[start2], otherArgs = castSlice(args, 0, start2);
if (array) {
arrayPush(otherArgs, array);
}
return apply(func, this, otherArgs);
});
}
function throttle(func, wait2, options) {
var leading = true, trailing = true;
if (typeof func != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
if (isObject(options)) {
leading = "leading" in options ? !!options.leading : leading;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
return debounce(func, wait2, {
"leading": leading,
"maxWait": wait2,
"trailing": trailing
});
}
function unary(func) {
return ary(func, 1);
}
function wrap(value, wrapper) {
return partial(castFunction(wrapper), value);
}
function castArray() {
if (!arguments.length) {
return [];
}
var value = arguments[0];
return isArray(value) ? value : [value];
}
function clone(value) {
return baseClone(value, CLONE_SYMBOLS_FLAG);
}
function cloneWith(value, customizer) {
customizer = typeof customizer == "function" ? customizer : undefined2;
return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
}
function cloneDeep2(value) {
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
}
function cloneDeepWith(value, customizer) {
customizer = typeof customizer == "function" ? customizer : undefined2;
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
}
function conformsTo(object, source) {
return source == null || baseConformsTo(object, source, keys(source));
}
function eq(value, other) {
return value === other || value !== value && other !== other;
}
var gt = createRelationalOperation(baseGt);
var gte = createRelationalOperation(function(value, other) {
return value >= other;
});
var isArguments = baseIsArguments(function() {
return arguments;
}()) ? baseIsArguments : function(value) {
return isObjectLike(value) && hasOwnProperty.call(value, "callee") && !propertyIsEnumerable.call(value, "callee");
};
var isArray = Array2.isArray;
var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
function isArrayLike(value) {
return value != null && isLength(value.length) && !isFunction(value);
}
function isArrayLikeObject(value) {
return isObjectLike(value) && isArrayLike(value);
}
function isBoolean(value) {
return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag;
}
var isBuffer = nativeIsBuffer || stubFalse;
var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
function isElement(value) {
return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
}
function isEmpty(value) {
if (value == null) {
return true;
}
if (isArrayLike(value) && (isArray(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) {
return !value.length;
}
var tag = getTag(value);
if (tag == mapTag || tag == setTag) {
return !value.size;
}
if (isPrototype(value)) {
return !baseKeys(value).length;
}
for (var key in value) {
if (hasOwnProperty.call(value, key)) {
return false;
}
}
return true;
}
function isEqual(value, other) {
return baseIsEqual(value, other);
}
function isEqualWith(value, other, customizer) {
customizer = typeof customizer == "function" ? customizer : undefined2;
var result2 = customizer ? customizer(value, other) : undefined2;
return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2;
}
function isError(value) {
if (!isObjectLike(value)) {
return false;
}
var tag = baseGetTag(value);
return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value);
}
function isFinite2(value) {
return typeof value == "number" && nativeIsFinite(value);
}
function isFunction(value) {
if (!isObject(value)) {
return false;
}
var tag = baseGetTag(value);
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
function isInteger(value) {
return typeof value == "number" && value == toInteger(value);
}
function isLength(value) {
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
function isObject(value) {
var type2 = typeof value;
return value != null && (type2 == "object" || type2 == "function");
}
function isObjectLike(value) {
return value != null && typeof value == "object";
}
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
function isMatch(object, source) {
return object === source || baseIsMatch(object, source, getMatchData(source));
}
function isMatchWith(object, source, customizer) {
customizer = typeof customizer == "function" ? customizer : undefined2;
return baseIsMatch(object, source, getMatchData(source), customizer);
}
function isNaN2(value) {
return isNumber(value) && value != +value;
}
function isNative(value) {
if (isMaskable(value)) {
throw new Error2(CORE_ERROR_TEXT);
}
return baseIsNative(value);
}
function isNull(value) {
return value === null;
}
function isNil(value) {
return value == null;
}
function isNumber(value) {
return typeof value == "number" || isObjectLike(value) && baseGetTag(value) == numberTag;
}
function isPlainObject(value) {
if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
return false;
}
var proto = getPrototype(value);
if (proto === null) {
return true;
}
var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
}
var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
function isSafeInteger(value) {
return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
}
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
function isString(value) {
return typeof value == "string" || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag;
}
function isSymbol(value) {
return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag;
}
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
function isUndefined(value) {
return value === undefined2;
}
function isWeakMap(value) {
return isObjectLike(value) && getTag(value) == weakMapTag;
}
function isWeakSet(value) {
return isObjectLike(value) && baseGetTag(value) == weakSetTag;
}
var lt = createRelationalOperation(baseLt);
var lte = createRelationalOperation(function(value, other) {
return value <= other;
});
function toArray(value) {
if (!value) {
return [];
}
if (isArrayLike(value)) {
return isString(value) ? stringToArray(value) : copyArray(value);
}
if (symIterator && value[symIterator]) {
return iteratorToArray(value[symIterator]());
}
var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values;
return func(value);
}
function toFinite(value) {
if (!value) {
return value === 0 ? value : 0;
}
value = toNumber(value);
if (value === INFINITY || value === -INFINITY) {
var sign = value < 0 ? -1 : 1;
return sign * MAX_INTEGER;
}
return value === value ? value : 0;
}
function toInteger(value) {
var result2 = toFinite(value), remainder = result2 % 1;
return result2 === result2 ? remainder ? result2 - remainder : result2 : 0;
}
function toLength(value) {
return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
}
function toNumber(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
value = isObject(other) ? other + "" : other;
}
if (typeof value != "string") {
return value === 0 ? value : +value;
}
value = baseTrim(value);
var isBinary = reIsBinary.test(value);
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
function toPlainObject(value) {
return copyObject(value, keysIn(value));
}
function toSafeInteger(value) {
return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0;
}
function toString(value) {
return value == null ? "" : baseToString(value);
}
var assign2 = createAssigner(function(object, source) {
if (isPrototype(source) || isArrayLike(source)) {
copyObject(source, keys(source), object);
return;
}
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
assignValue(object, key, source[key]);
}
}
});
var assignIn = createAssigner(function(object, source) {
copyObject(source, keysIn(source), object);
});
var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
copyObject(source, keysIn(source), object, customizer);
});
var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
copyObject(source, keys(source), object, customizer);
});
var at = flatRest(baseAt);
function create2(prototype, properties) {
var result2 = baseCreate(prototype);
return properties == null ? result2 : baseAssign(result2, properties);
}
var defaults = baseRest(function(object, sources) {
object = Object2(object);
var index2 = -1;
var length = sources.length;
var guard = length > 2 ? sources[2] : undefined2;
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
length = 1;
}
while (++index2 < length) {
var source = sources[index2];
var props = keysIn(source);
var propsIndex = -1;
var propsLength = props.length;
while (++propsIndex < propsLength) {
var key = props[propsIndex];
var value = object[key];
if (value === undefined2 || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) {
object[key] = source[key];
}
}
}
return object;
});
var defaultsDeep = baseRest(function(args) {
args.push(undefined2, customDefaultsMerge);
return apply(mergeWith, undefined2, args);
});
function findKey(object, predicate) {
return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
}
function findLastKey(object, predicate) {
return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
}
function forIn(object, iteratee2) {
return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn);
}
function forInRight(object, iteratee2) {
return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn);
}
function forOwn(object, iteratee2) {
return object && baseForOwn(object, getIteratee(iteratee2, 3));
}
function forOwnRight(object, iteratee2) {
return object && baseForOwnRight(object, getIteratee(iteratee2, 3));
}
function functions(object) {
return object == null ? [] : baseFunctions(object, keys(object));
}
function functionsIn(object) {
return object == null ? [] : baseFunctions(object, keysIn(object));
}
function get3(object, path2, defaultValue) {
var result2 = object == null ? undefined2 : baseGet(object, path2);
return result2 === undefined2 ? defaultValue : result2;
}
function has(object, path2) {
return object != null && hasPath(object, path2, baseHas);
}
function hasIn(object, path2) {
return object != null && hasPath(object, path2, baseHasIn);
}
var invert = createInverter(function(result2, value, key) {
if (value != null && typeof value.toString != "function") {
value = nativeObjectToString.call(value);
}
result2[value] = key;
}, constant(identity4));
var invertBy = createInverter(function(result2, value, key) {
if (value != null && typeof value.toString != "function") {
value = nativeObjectToString.call(value);
}
if (hasOwnProperty.call(result2, value)) {
result2[value].push(key);
} else {
result2[value] = [key];
}
}, getIteratee);
var invoke = baseRest(baseInvoke);
function keys(object) {
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}
function keysIn(object) {
return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
}
function mapKeys(object, iteratee2) {
var result2 = {};
iteratee2 = getIteratee(iteratee2, 3);
baseForOwn(object, function(value, key, object2) {
baseAssignValue(result2, iteratee2(value, key, object2), value);
});
return result2;
}
function mapValues(object, iteratee2) {
var result2 = {};
iteratee2 = getIteratee(iteratee2, 3);
baseForOwn(object, function(value, key, object2) {
baseAssignValue(result2, key, iteratee2(value, key, object2));
});
return result2;
}
var merge = createAssigner(function(object, source, srcIndex) {
baseMerge(object, source, srcIndex);
});
var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
baseMerge(object, source, srcIndex, customizer);
});
var omit = flatRest(function(object, paths) {
var result2 = {};
if (object == null) {
return result2;
}
var isDeep = false;
paths = arrayMap(paths, function(path2) {
path2 = castPath(path2, object);
isDeep || (isDeep = path2.length > 1);
return path2;
});
copyObject(object, getAllKeysIn(object), result2);
if (isDeep) {
result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
}
var length = paths.length;
while (length--) {
baseUnset(result2, paths[length]);
}
return result2;
});
function omitBy(object, predicate) {
return pickBy(object, negate(getIteratee(predicate)));
}
var pick = flatRest(function(object, paths) {
return object == null ? {} : basePick(object, paths);
});
function pickBy(object, predicate) {
if (object == null) {
return {};
}
var props = arrayMap(getAllKeysIn(object), function(prop) {
return [prop];
});
predicate = getIteratee(predicate);
return basePickBy(object, props, function(value, path2) {
return predicate(value, path2[0]);
});
}
function result(object, path2, defaultValue) {
path2 = castPath(path2, object);
var index2 = -1, length = path2.length;
if (!length) {
length = 1;
object = undefined2;
}
while (++index2 < length) {
var value = object == null ? undefined2 : object[toKey(path2[index2])];
if (value === undefined2) {
index2 = length;
value = defaultValue;
}
object = isFunction(value) ? value.call(object) : value;
}
return object;
}
function set3(object, path2, value) {
return object == null ? object : baseSet(object, path2, value);
}
function setWith(object, path2, value, customizer) {
customizer = typeof customizer == "function" ? customizer : undefined2;
return object == null ? object : baseSet(object, path2, value, customizer);
}
var toPairs = createToPairs(keys);
var toPairsIn = createToPairs(keysIn);
function transform2(object, iteratee2, accumulator) {
var isArr = isArray(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object);
iteratee2 = getIteratee(iteratee2, 4);
if (accumulator == null) {
var Ctor = object && object.constructor;
if (isArrLike) {
accumulator = isArr ? new Ctor() : [];
} else if (isObject(object)) {
accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
} else {
accumulator = {};
}
}
(isArrLike ? arrayEach : baseForOwn)(object, function(value, index2, object2) {
return iteratee2(accumulator, value, index2, object2);
});
return accumulator;
}
function unset(object, path2) {
return object == null ? true : baseUnset(object, path2);
}
function update2(object, path2, updater) {
return object == null ? object : baseUpdate(object, path2, castFunction(updater));
}
function updateWith(object, path2, updater, customizer) {
customizer = typeof customizer == "function" ? customizer : undefined2;
return object == null ? object : baseUpdate(object, path2, castFunction(updater), customizer);
}
function values(object) {
return object == null ? [] : baseValues(object, keys(object));
}
function valuesIn(object) {
return object == null ? [] : baseValues(object, keysIn(object));
}
function clamp(number3, lower2, upper) {
if (upper === undefined2) {
upper = lower2;
lower2 = undefined2;
}
if (upper !== undefined2) {
upper = toNumber(upper);
upper = upper === upper ? upper : 0;
}
if (lower2 !== undefined2) {
lower2 = toNumber(lower2);
lower2 = lower2 === lower2 ? lower2 : 0;
}
return baseClamp(toNumber(number3), lower2, upper);
}
function inRange(number3, start2, end) {
start2 = toFinite(start2);
if (end === undefined2) {
end = start2;
start2 = 0;
} else {
end = toFinite(end);
}
number3 = toNumber(number3);
return baseInRange(number3, start2, end);
}
function random(lower2, upper, floating) {
if (floating && typeof floating != "boolean" && isIterateeCall(lower2, upper, floating)) {
upper = floating = undefined2;
}
if (floating === undefined2) {
if (typeof upper == "boolean") {
floating = upper;
upper = undefined2;
} else if (typeof lower2 == "boolean") {
floating = lower2;
lower2 = undefined2;
}
}
if (lower2 === undefined2 && upper === undefined2) {
lower2 = 0;
upper = 1;
} else {
lower2 = toFinite(lower2);
if (upper === undefined2) {
upper = lower2;
lower2 = 0;
} else {
upper = toFinite(upper);
}
}
if (lower2 > upper) {
var temp = lower2;
lower2 = upper;
upper = temp;
}
if (floating || lower2 % 1 || upper % 1) {
var rand = nativeRandom();
return nativeMin(lower2 + rand * (upper - lower2 + freeParseFloat("1e-" + ((rand + "").length - 1))), upper);
}
return baseRandom(lower2, upper);
}
var camelCase = createCompounder(function(result2, word, index2) {
word = word.toLowerCase();
return result2 + (index2 ? capitalize(word) : word);
});
function capitalize(string) {
return upperFirst(toString(string).toLowerCase());
}
function deburr(string) {
string = toString(string);
return string && string.replace(reLatin, deburrLetter).replace(reComboMark, "");
}
function endsWith(string, target, position) {
string = toString(string);
target = baseToString(target);
var length = string.length;
position = position === undefined2 ? length : baseClamp(toInteger(position), 0, length);
var end = position;
position -= target.length;
return position >= 0 && string.slice(position, end) == target;
}
function escape(string) {
string = toString(string);
return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string;
}
function escapeRegExp(string) {
string = toString(string);
return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string;
}
var kebabCase = createCompounder(function(result2, word, index2) {
return result2 + (index2 ? "-" : "") + word.toLowerCase();
});
var lowerCase = createCompounder(function(result2, word, index2) {
return result2 + (index2 ? " " : "") + word.toLowerCase();
});
var lowerFirst = createCaseFirst("toLowerCase");
function pad(string, length, chars) {
string = toString(string);
length = toInteger(length);
var strLength = length ? stringSize(string) : 0;
if (!length || strLength >= length) {
return string;
}
var mid = (length - strLength) / 2;
return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars);
}
function padEnd(string, length, chars) {
string = toString(string);
length = toInteger(length);
var strLength = length ? stringSize(string) : 0;
return length && strLength < length ? string + createPadding(length - strLength, chars) : string;
}
function padStart(string, length, chars) {
string = toString(string);
length = toInteger(length);
var strLength = length ? stringSize(string) : 0;
return length && strLength < length ? createPadding(length - strLength, chars) + string : string;
}
function parseInt2(string, radix, guard) {
if (guard || radix == null) {
radix = 0;
} else if (radix) {
radix = +radix;
}
return nativeParseInt(toString(string).replace(reTrimStart, ""), radix || 0);
}
function repeat(string, n, guard) {
if (guard ? isIterateeCall(string, n, guard) : n === undefined2) {
n = 1;
} else {
n = toInteger(n);
}
return baseRepeat(toString(string), n);
}
function replace() {
var args = arguments, string = toString(args[0]);
return args.length < 3 ? string : string.replace(args[1], args[2]);
}
var snakeCase = createCompounder(function(result2, word, index2) {
return result2 + (index2 ? "_" : "") + word.toLowerCase();
});
function split(string, separator, limit) {
if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) {
separator = limit = undefined2;
}
limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0;
if (!limit) {
return [];
}
string = toString(string);
if (string && (typeof separator == "string" || separator != null && !isRegExp(separator))) {
separator = baseToString(separator);
if (!separator && hasUnicode(string)) {
return castSlice(stringToArray(string), 0, limit);
}
}
return string.split(separator, limit);
}
var startCase = createCompounder(function(result2, word, index2) {
return result2 + (index2 ? " " : "") + upperFirst(word);
});
function startsWith(string, target, position) {
string = toString(string);
position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length);
target = baseToString(target);
return string.slice(position, position + target.length) == target;
}
function template(string, options, guard) {
var settings = lodash.templateSettings;
if (guard && isIterateeCall(string, options, guard)) {
options = undefined2;
}
string = toString(string);
options = assignInWith({}, options, settings, customDefaultsAssignIn);
var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys);
var isEscaping, isEvaluating, index2 = 0, interpolate = options.interpolate || reNoMatch, source = "__p += '";
var reDelimiters = RegExp2((options.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options.evaluate || reNoMatch).source + "|$", "g");
var sourceURL = "//# sourceURL=" + (hasOwnProperty.call(options, "sourceURL") ? (options.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n";
string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
interpolateValue || (interpolateValue = esTemplateValue);
source += string.slice(index2, offset).replace(reUnescapedString, escapeStringChar);
if (escapeValue) {
isEscaping = true;
source += "' +\n__e(" + escapeValue + ") +\n'";
}
if (evaluateValue) {
isEvaluating = true;
source += "';\n" + evaluateValue + ";\n__p += '";
}
if (interpolateValue) {
source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
}
index2 = offset + match.length;
return match;
});
source += "';\n";
var variable = hasOwnProperty.call(options, "variable") && options.variable;
if (!variable) {
source = "with (obj) {\n" + source + "\n}\n";
} else if (reForbiddenIdentifierChars.test(variable)) {
throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT);
}
source = (isEvaluating ? source.replace(reEmptyStringLeading, "") : source).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;");
source = "function(" + (variable || "obj") + ") {\n" + (variable ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (isEscaping ? ", __e = _.escape" : "") + (isEvaluating ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + source + "return __p\n}";
var result2 = attempt(function() {
return Function2(importsKeys, sourceURL + "return " + source).apply(undefined2, importsValues);
});
result2.source = source;
if (isError(result2)) {
throw result2;
}
return result2;
}
function toLower(value) {
return toString(value).toLowerCase();
}
function toUpper(value) {
return toString(value).toUpperCase();
}
function trim(string, chars, guard) {
string = toString(string);
if (string && (guard || chars === undefined2)) {
return baseTrim(string);
}
if (!string || !(chars = baseToString(chars))) {
return string;
}
var strSymbols = stringToArray(string), chrSymbols = stringToArray(chars), start2 = charsStartIndex(strSymbols, chrSymbols), end = charsEndIndex(strSymbols, chrSymbols) + 1;
return castSlice(strSymbols, start2, end).join("");
}
function trimEnd(string, chars, guard) {
string = toString(string);
if (string && (guard || chars === undefined2)) {
return string.slice(0, trimmedEndIndex(string) + 1);
}
if (!string || !(chars = baseToString(chars))) {
return string;
}
var strSymbols = stringToArray(string), end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
return castSlice(strSymbols, 0, end).join("");
}
function trimStart(string, chars, guard) {
string = toString(string);
if (string && (guard || chars === undefined2)) {
return string.replace(reTrimStart, "");
}
if (!string || !(chars = baseToString(chars))) {
return string;
}
var strSymbols = stringToArray(string), start2 = charsStartIndex(strSymbols, stringToArray(chars));
return castSlice(strSymbols, start2).join("");
}
function truncate(string, options) {
var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION;
if (isObject(options)) {
var separator = "separator" in options ? options.separator : separator;
length = "length" in options ? toInteger(options.length) : length;
omission = "omission" in options ? baseToString(options.omission) : omission;
}
string = toString(string);
var strLength = string.length;
if (hasUnicode(string)) {
var strSymbols = stringToArray(string);
strLength = strSymbols.length;
}
if (length >= strLength) {
return string;
}
var end = length - stringSize(omission);
if (end < 1) {
return omission;
}
var result2 = strSymbols ? castSlice(strSymbols, 0, end).join("") : string.slice(0, end);
if (separator === undefined2) {
return result2 + omission;
}
if (strSymbols) {
end += result2.length - end;
}
if (isRegExp(separator)) {
if (string.slice(end).search(separator)) {
var match, substring = result2;
if (!separator.global) {
separator = RegExp2(separator.source, toString(reFlags.exec(separator)) + "g");
}
separator.lastIndex = 0;
while (match = separator.exec(substring)) {
var newEnd = match.index;
}
result2 = result2.slice(0, newEnd === undefined2 ? end : newEnd);
}
} else if (string.indexOf(baseToString(separator), end) != end) {
var index2 = result2.lastIndexOf(separator);
if (index2 > -1) {
result2 = result2.slice(0, index2);
}
}
return result2 + omission;
}
function unescape(string) {
string = toString(string);
return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string;
}
var upperCase = createCompounder(function(result2, word, index2) {
return result2 + (index2 ? " " : "") + word.toUpperCase();
});
var upperFirst = createCaseFirst("toUpperCase");
function words(string, pattern, guard) {
string = toString(string);
pattern = guard ? undefined2 : pattern;
if (pattern === undefined2) {
return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
}
return string.match(pattern) || [];
}
var attempt = baseRest(function(func, args) {
try {
return apply(func, undefined2, args);
} catch (e) {
return isError(e) ? e : new Error2(e);
}
});
var bindAll = flatRest(function(object, methodNames) {
arrayEach(methodNames, function(key) {
key = toKey(key);
baseAssignValue(object, key, bind(object[key], object));
});
return object;
});
function cond(pairs) {
var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee();
pairs = !length ? [] : arrayMap(pairs, function(pair) {
if (typeof pair[1] != "function") {
throw new TypeError2(FUNC_ERROR_TEXT);
}
return [toIteratee(pair[0]), pair[1]];
});
return baseRest(function(args) {
var index2 = -1;
while (++index2 < length) {
var pair = pairs[index2];
if (apply(pair[0], this, args)) {
return apply(pair[1], this, args);
}
}
});
}
function conforms(source) {
return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
}
function constant(value) {
return function() {
return value;
};
}
function defaultTo(value, defaultValue) {
return value == null || value !== value ? defaultValue : value;
}
var flow = createFlow();
var flowRight = createFlow(true);
function identity4(value) {
return value;
}
function iteratee(func) {
return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG));
}
function matches(source) {
return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
}
function matchesProperty(path2, srcValue) {
return baseMatchesProperty(path2, baseClone(srcValue, CLONE_DEEP_FLAG));
}
var method = baseRest(function(path2, args) {
return function(object) {
return baseInvoke(object, path2, args);
};
});
var methodOf = baseRest(function(object, args) {
return function(path2) {
return baseInvoke(object, path2, args);
};
});
function mixin(object, source, options) {
var props = keys(source), methodNames = baseFunctions(source, props);
if (options == null && !(isObject(source) && (methodNames.length || !props.length))) {
options = source;
source = object;
object = this;
methodNames = baseFunctions(source, keys(source));
}
var chain2 = !(isObject(options) && "chain" in options) || !!options.chain, isFunc = isFunction(object);
arrayEach(methodNames, function(methodName) {
var func = source[methodName];
object[methodName] = func;
if (isFunc) {
object.prototype[methodName] = function() {
var chainAll = this.__chain__;
if (chain2 || chainAll) {
var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__);
actions.push({ "func": func, "args": arguments, "thisArg": object });
result2.__chain__ = chainAll;
return result2;
}
return func.apply(object, arrayPush([this.value()], arguments));
};
}
});
return object;
}
function noConflict() {
if (root2._ === this) {
root2._ = oldDash;
}
return this;
}
function noop3() {
}
function nthArg(n) {
n = toInteger(n);
return baseRest(function(args) {
return baseNth(args, n);
});
}
var over = createOver(arrayMap);
var overEvery = createOver(arrayEvery);
var overSome = createOver(arraySome);
function property(path2) {
return isKey(path2) ? baseProperty(toKey(path2)) : basePropertyDeep(path2);
}
function propertyOf(object) {
return function(path2) {
return object == null ? undefined2 : baseGet(object, path2);
};
}
var range = createRange();
var rangeRight = createRange(true);
function stubArray() {
return [];
}
function stubFalse() {
return false;
}
function stubObject() {
return {};
}
function stubString() {
return "";
}
function stubTrue() {
return true;
}
function times(n, iteratee2) {
n = toInteger(n);
if (n < 1 || n > MAX_SAFE_INTEGER) {
return [];
}
var index2 = MAX_ARRAY_LENGTH, length = nativeMin(n, MAX_ARRAY_LENGTH);
iteratee2 = getIteratee(iteratee2);
n -= MAX_ARRAY_LENGTH;
var result2 = baseTimes(length, iteratee2);
while (++index2 < n) {
iteratee2(index2);
}
return result2;
}
function toPath(value) {
if (isArray(value)) {
return arrayMap(value, toKey);
}
return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
}
function uniqueId(prefix) {
var id2 = ++idCounter;
return toString(prefix) + id2;
}
var add2 = createMathOperation(function(augend, addend) {
return augend + addend;
}, 0);
var ceil = createRound("ceil");
var divide = createMathOperation(function(dividend, divisor) {
return dividend / divisor;
}, 1);
var floor = createRound("floor");
function max4(array) {
return array && array.length ? baseExtremum(array, identity4, baseGt) : undefined2;
}
function maxBy(array, iteratee2) {
return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseGt) : undefined2;
}
function mean(array) {
return baseMean(array, identity4);
}
function meanBy(array, iteratee2) {
return baseMean(array, getIteratee(iteratee2, 2));
}
function min3(array) {
return array && array.length ? baseExtremum(array, identity4, baseLt) : undefined2;
}
function minBy(array, iteratee2) {
return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseLt) : undefined2;
}
var multiply = createMathOperation(function(multiplier, multiplicand) {
return multiplier * multiplicand;
}, 1);
var round = createRound("round");
var subtract = createMathOperation(function(minuend, subtrahend) {
return minuend - subtrahend;
}, 0);
function sum(array) {
return array && array.length ? baseSum(array, identity4) : 0;
}
function sumBy(array, iteratee2) {
return array && array.length ? baseSum(array, getIteratee(iteratee2, 2)) : 0;
}
lodash.after = after;
lodash.ary = ary;
lodash.assign = assign2;
lodash.assignIn = assignIn;
lodash.assignInWith = assignInWith;
lodash.assignWith = assignWith;
lodash.at = at;
lodash.before = before;
lodash.bind = bind;
lodash.bindAll = bindAll;
lodash.bindKey = bindKey2;
lodash.castArray = castArray;
lodash.chain = chain;
lodash.chunk = chunk;
lodash.compact = compact;
lodash.concat = concat;
lodash.cond = cond;
lodash.conforms = conforms;
lodash.constant = constant;
lodash.countBy = countBy;
lodash.create = create2;
lodash.curry = curry;
lodash.curryRight = curryRight;
lodash.debounce = debounce;
lodash.defaults = defaults;
lodash.defaultsDeep = defaultsDeep;
lodash.defer = defer;
lodash.delay = delay;
lodash.difference = difference;
lodash.differenceBy = differenceBy;
lodash.differenceWith = differenceWith;
lodash.drop = drop;
lodash.dropRight = dropRight;
lodash.dropRightWhile = dropRightWhile;
lodash.dropWhile = dropWhile;
lodash.fill = fill;
lodash.filter = filter2;
lodash.flatMap = flatMap;
lodash.flatMapDeep = flatMapDeep;
lodash.flatMapDepth = flatMapDepth;
lodash.flatten = flatten;
lodash.flattenDeep = flattenDeep;
lodash.flattenDepth = flattenDepth;
lodash.flip = flip;
lodash.flow = flow;
lodash.flowRight = flowRight;
lodash.fromPairs = fromPairs;
lodash.functions = functions;
lodash.functionsIn = functionsIn;
lodash.groupBy = groupBy;
lodash.initial = initial;
lodash.intersection = intersection;
lodash.intersectionBy = intersectionBy;
lodash.intersectionWith = intersectionWith;
lodash.invert = invert;
lodash.invertBy = invertBy;
lodash.invokeMap = invokeMap;
lodash.iteratee = iteratee;
lodash.keyBy = keyBy;
lodash.keys = keys;
lodash.keysIn = keysIn;
lodash.map = map2;
lodash.mapKeys = mapKeys;
lodash.mapValues = mapValues;
lodash.matches = matches;
lodash.matchesProperty = matchesProperty;
lodash.memoize = memoize;
lodash.merge = merge;
lodash.mergeWith = mergeWith;
lodash.method = method;
lodash.methodOf = methodOf;
lodash.mixin = mixin;
lodash.negate = negate;
lodash.nthArg = nthArg;
lodash.omit = omit;
lodash.omitBy = omitBy;
lodash.once = once;
lodash.orderBy = orderBy;
lodash.over = over;
lodash.overArgs = overArgs;
lodash.overEvery = overEvery;
lodash.overSome = overSome;
lodash.partial = partial;
lodash.partialRight = partialRight;
lodash.partition = partition;
lodash.pick = pick;
lodash.pickBy = pickBy;
lodash.property = property;
lodash.propertyOf = propertyOf;
lodash.pull = pull;
lodash.pullAll = pullAll;
lodash.pullAllBy = pullAllBy;
lodash.pullAllWith = pullAllWith;
lodash.pullAt = pullAt;
lodash.range = range;
lodash.rangeRight = rangeRight;
lodash.rearg = rearg;
lodash.reject = reject;
lodash.remove = remove2;
lodash.rest = rest;
lodash.reverse = reverse;
lodash.sampleSize = sampleSize;
lodash.set = set3;
lodash.setWith = setWith;
lodash.shuffle = shuffle;
lodash.slice = slice2;
lodash.sortBy = sortBy;
lodash.sortedUniq = sortedUniq;
lodash.sortedUniqBy = sortedUniqBy;
lodash.split = split;
lodash.spread = spread;
lodash.tail = tail;
lodash.take = take;
lodash.takeRight = takeRight;
lodash.takeRightWhile = takeRightWhile;
lodash.takeWhile = takeWhile;
lodash.tap = tap;
lodash.throttle = throttle;
lodash.thru = thru;
lodash.toArray = toArray;
lodash.toPairs = toPairs;
lodash.toPairsIn = toPairsIn;
lodash.toPath = toPath;
lodash.toPlainObject = toPlainObject;
lodash.transform = transform2;
lodash.unary = unary;
lodash.union = union;
lodash.unionBy = unionBy;
lodash.unionWith = unionWith;
lodash.uniq = uniq;
lodash.uniqBy = uniqBy;
lodash.uniqWith = uniqWith;
lodash.unset = unset;
lodash.unzip = unzip;
lodash.unzipWith = unzipWith;
lodash.update = update2;
lodash.updateWith = updateWith;
lodash.values = values;
lodash.valuesIn = valuesIn;
lodash.without = without;
lodash.words = words;
lodash.wrap = wrap;
lodash.xor = xor;
lodash.xorBy = xorBy;
lodash.xorWith = xorWith;
lodash.zip = zip;
lodash.zipObject = zipObject;
lodash.zipObjectDeep = zipObjectDeep;
lodash.zipWith = zipWith;
lodash.entries = toPairs;
lodash.entriesIn = toPairsIn;
lodash.extend = assignIn;
lodash.extendWith = assignInWith;
mixin(lodash, lodash);
lodash.add = add2;
lodash.attempt = attempt;
lodash.camelCase = camelCase;
lodash.capitalize = capitalize;
lodash.ceil = ceil;
lodash.clamp = clamp;
lodash.clone = clone;
lodash.cloneDeep = cloneDeep2;
lodash.cloneDeepWith = cloneDeepWith;
lodash.cloneWith = cloneWith;
lodash.conformsTo = conformsTo;
lodash.deburr = deburr;
lodash.defaultTo = defaultTo;
lodash.divide = divide;
lodash.endsWith = endsWith;
lodash.eq = eq;
lodash.escape = escape;
lodash.escapeRegExp = escapeRegExp;
lodash.every = every;
lodash.find = find3;
lodash.findIndex = findIndex;
lodash.findKey = findKey;
lodash.findLast = findLast;
lodash.findLastIndex = findLastIndex;
lodash.findLastKey = findLastKey;
lodash.floor = floor;
lodash.forEach = forEach;
lodash.forEachRight = forEachRight;
lodash.forIn = forIn;
lodash.forInRight = forInRight;
lodash.forOwn = forOwn;
lodash.forOwnRight = forOwnRight;
lodash.get = get3;
lodash.gt = gt;
lodash.gte = gte;
lodash.has = has;
lodash.hasIn = hasIn;
lodash.head = head;
lodash.identity = identity4;
lodash.includes = includes;
lodash.indexOf = indexOf;
lodash.inRange = inRange;
lodash.invoke = invoke;
lodash.isArguments = isArguments;
lodash.isArray = isArray;
lodash.isArrayBuffer = isArrayBuffer;
lodash.isArrayLike = isArrayLike;
lodash.isArrayLikeObject = isArrayLikeObject;
lodash.isBoolean = isBoolean;
lodash.isBuffer = isBuffer;
lodash.isDate = isDate;
lodash.isElement = isElement;
lodash.isEmpty = isEmpty;
lodash.isEqual = isEqual;
lodash.isEqualWith = isEqualWith;
lodash.isError = isError;
lodash.isFinite = isFinite2;
lodash.isFunction = isFunction;
lodash.isInteger = isInteger;
lodash.isLength = isLength;
lodash.isMap = isMap;
lodash.isMatch = isMatch;
lodash.isMatchWith = isMatchWith;
lodash.isNaN = isNaN2;
lodash.isNative = isNative;
lodash.isNil = isNil;
lodash.isNull = isNull;
lodash.isNumber = isNumber;
lodash.isObject = isObject;
lodash.isObjectLike = isObjectLike;
lodash.isPlainObject = isPlainObject;
lodash.isRegExp = isRegExp;
lodash.isSafeInteger = isSafeInteger;
lodash.isSet = isSet;
lodash.isString = isString;
lodash.isSymbol = isSymbol;
lodash.isTypedArray = isTypedArray;
lodash.isUndefined = isUndefined;
lodash.isWeakMap = isWeakMap;
lodash.isWeakSet = isWeakSet;
lodash.join = join;
lodash.kebabCase = kebabCase;
lodash.last = last;
lodash.lastIndexOf = lastIndexOf;
lodash.lowerCase = lowerCase;
lodash.lowerFirst = lowerFirst;
lodash.lt = lt;
lodash.lte = lte;
lodash.max = max4;
lodash.maxBy = maxBy;
lodash.mean = mean;
lodash.meanBy = meanBy;
lodash.min = min3;
lodash.minBy = minBy;
lodash.stubArray = stubArray;
lodash.stubFalse = stubFalse;
lodash.stubObject = stubObject;
lodash.stubString = stubString;
lodash.stubTrue = stubTrue;
lodash.multiply = multiply;
lodash.nth = nth;
lodash.noConflict = noConflict;
lodash.noop = noop3;
lodash.now = now2;
lodash.pad = pad;
lodash.padEnd = padEnd;
lodash.padStart = padStart;
lodash.parseInt = parseInt2;
lodash.random = random;
lodash.reduce = reduce;
lodash.reduceRight = reduceRight;
lodash.repeat = repeat;
lodash.replace = replace;
lodash.result = result;
lodash.round = round;
lodash.runInContext = runInContext2;
lodash.sample = sample;
lodash.size = size;
lodash.snakeCase = snakeCase;
lodash.some = some;
lodash.sortedIndex = sortedIndex;
lodash.sortedIndexBy = sortedIndexBy;
lodash.sortedIndexOf = sortedIndexOf;
lodash.sortedLastIndex = sortedLastIndex;
lodash.sortedLastIndexBy = sortedLastIndexBy;
lodash.sortedLastIndexOf = sortedLastIndexOf;
lodash.startCase = startCase;
lodash.startsWith = startsWith;
lodash.subtract = subtract;
lodash.sum = sum;
lodash.sumBy = sumBy;
lodash.template = template;
lodash.times = times;
lodash.toFinite = toFinite;
lodash.toInteger = toInteger;
lodash.toLength = toLength;
lodash.toLower = toLower;
lodash.toNumber = toNumber;
lodash.toSafeInteger = toSafeInteger;
lodash.toString = toString;
lodash.toUpper = toUpper;
lodash.trim = trim;
lodash.trimEnd = trimEnd;
lodash.trimStart = trimStart;
lodash.truncate = truncate;
lodash.unescape = unescape;
lodash.uniqueId = uniqueId;
lodash.upperCase = upperCase;
lodash.upperFirst = upperFirst;
lodash.each = forEach;
lodash.eachRight = forEachRight;
lodash.first = head;
mixin(lodash, function() {
var source = {};
baseForOwn(lodash, function(func, methodName) {
if (!hasOwnProperty.call(lodash.prototype, methodName)) {
source[methodName] = func;
}
});
return source;
}(), { "chain": false });
lodash.VERSION = VERSION;
arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) {
lodash[methodName].placeholder = lodash;
});
arrayEach(["drop", "take"], function(methodName, index2) {
LazyWrapper.prototype[methodName] = function(n) {
n = n === undefined2 ? 1 : nativeMax(toInteger(n), 0);
var result2 = this.__filtered__ && !index2 ? new LazyWrapper(this) : this.clone();
if (result2.__filtered__) {
result2.__takeCount__ = nativeMin(n, result2.__takeCount__);
} else {
result2.__views__.push({
"size": nativeMin(n, MAX_ARRAY_LENGTH),
"type": methodName + (result2.__dir__ < 0 ? "Right" : "")
});
}
return result2;
};
LazyWrapper.prototype[methodName + "Right"] = function(n) {
return this.reverse()[methodName](n).reverse();
};
});
arrayEach(["filter", "map", "takeWhile"], function(methodName, index2) {
var type2 = index2 + 1, isFilter = type2 == LAZY_FILTER_FLAG || type2 == LAZY_WHILE_FLAG;
LazyWrapper.prototype[methodName] = function(iteratee2) {
var result2 = this.clone();
result2.__iteratees__.push({
"iteratee": getIteratee(iteratee2, 3),
"type": type2
});
result2.__filtered__ = result2.__filtered__ || isFilter;
return result2;
};
});
arrayEach(["head", "last"], function(methodName, index2) {
var takeName = "take" + (index2 ? "Right" : "");
LazyWrapper.prototype[methodName] = function() {
return this[takeName](1).value()[0];
};
});
arrayEach(["initial", "tail"], function(methodName, index2) {
var dropName = "drop" + (index2 ? "" : "Right");
LazyWrapper.prototype[methodName] = function() {
return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
};
});
LazyWrapper.prototype.compact = function() {
return this.filter(identity4);
};
LazyWrapper.prototype.find = function(predicate) {
return this.filter(predicate).head();
};
LazyWrapper.prototype.findLast = function(predicate) {
return this.reverse().find(predicate);
};
LazyWrapper.prototype.invokeMap = baseRest(function(path2, args) {
if (typeof path2 == "function") {
return new LazyWrapper(this);
}
return this.map(function(value) {
return baseInvoke(value, path2, args);
});
});
LazyWrapper.prototype.reject = function(predicate) {
return this.filter(negate(getIteratee(predicate)));
};
LazyWrapper.prototype.slice = function(start2, end) {
start2 = toInteger(start2);
var result2 = this;
if (result2.__filtered__ && (start2 > 0 || end < 0)) {
return new LazyWrapper(result2);
}
if (start2 < 0) {
result2 = result2.takeRight(-start2);
} else if (start2) {
result2 = result2.drop(start2);
}
if (end !== undefined2) {
end = toInteger(end);
result2 = end < 0 ? result2.dropRight(-end) : result2.take(end - start2);
}
return result2;
};
LazyWrapper.prototype.takeRightWhile = function(predicate) {
return this.reverse().takeWhile(predicate).reverse();
};
LazyWrapper.prototype.toArray = function() {
return this.take(MAX_ARRAY_LENGTH);
};
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), isTaker = /^(?:head|last)$/.test(methodName), lodashFunc = lodash[isTaker ? "take" + (methodName == "last" ? "Right" : "") : methodName], retUnwrapped = isTaker || /^find/.test(methodName);
if (!lodashFunc) {
return;
}
lodash.prototype[methodName] = function() {
var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray(value);
var interceptor = function(value2) {
var result3 = lodashFunc.apply(lodash, arrayPush([value2], args));
return isTaker && chainAll ? result3[0] : result3;
};
if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) {
isLazy = useLazy = false;
}
var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid;
if (!retUnwrapped && useLazy) {
value = onlyLazy ? value : new LazyWrapper(this);
var result2 = func.apply(value, args);
result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 });
return new LodashWrapper(result2, chainAll);
}
if (isUnwrapped && onlyLazy) {
return func.apply(this, args);
}
result2 = this.thru(interceptor);
return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2;
};
});
arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) {
var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName);
lodash.prototype[methodName] = function() {
var args = arguments;
if (retUnwrapped && !this.__chain__) {
var value = this.value();
return func.apply(isArray(value) ? value : [], args);
}
return this[chainName](function(value2) {
return func.apply(isArray(value2) ? value2 : [], args);
});
};
});
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
var lodashFunc = lodash[methodName];
if (lodashFunc) {
var key = lodashFunc.name + "";
if (!hasOwnProperty.call(realNames, key)) {
realNames[key] = [];
}
realNames[key].push({ "name": methodName, "func": lodashFunc });
}
});
realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{
"name": "wrapper",
"func": undefined2
}];
LazyWrapper.prototype.clone = lazyClone;
LazyWrapper.prototype.reverse = lazyReverse;
LazyWrapper.prototype.value = lazyValue;
lodash.prototype.at = wrapperAt;
lodash.prototype.chain = wrapperChain;
lodash.prototype.commit = wrapperCommit;
lodash.prototype.next = wrapperNext;
lodash.prototype.plant = wrapperPlant;
lodash.prototype.reverse = wrapperReverse;
lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
lodash.prototype.first = lodash.prototype.head;
if (symIterator) {
lodash.prototype[symIterator] = wrapperToIterator;
}
return lodash;
};
var _ = runInContext();
if (typeof define == "function" && typeof define.amd == "object" && define.amd) {
root2._ = _;
define(function() {
return _;
});
} else if (freeModule) {
(freeModule.exports = _)._ = _;
freeExports._ = _;
} else {
root2._ = _;
}
}).call(exports);
}
});
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => BCPlugin
});
module.exports = __toCommonJS(main_exports);
// node_modules/juggl-api/dist/index.mjs
var import_obsidian = require("obsidian");
var CAT_DANGLING = "dangling";
var CORE_STORE_ID = "core";
var VizId = class {
constructor(id2, storeId) {
this.id = id2;
this.storeId = storeId;
}
toString() {
return `${this.storeId}:${this.id}`;
}
toId() {
return this.toString();
}
static fromId(id2) {
const split = id2.split(":");
const storeId = split[0];
const _id = split.slice(1).join(":");
return new VizId(_id, storeId);
}
static fromNode(node) {
return VizId.fromId(node.id());
}
static fromNodes(nodes) {
return nodes.map((n) => VizId.fromNode(n));
}
static fromFile(file) {
return new VizId(file.name, "core");
}
static toId(id2, storeId) {
return new VizId(id2, storeId).toId();
}
};
var _parseTags = function(tags) {
return [].concat(...tags.map((tag) => {
tag = tag.slice(1);
const hSplit = tag.split("/");
const tags2 = [];
for (const i in hSplit) {
const hTag = hSplit.slice(0, parseInt(i) + 1).join("-");
tags2.push(`tag-${hTag}`);
}
return tags2;
}));
};
var getClasses = function(file, metadataCache) {
if (file) {
const classes = [];
if (["png", "jpg", "jpeg", "gif", "bmp", "svg", "tiff"].contains(file.extension)) {
classes.push("image");
} else if (["mp3", "webm", "wav", "m4a", "ogg", "3gp", "flac"].contains(file.extension)) {
classes.push("audio");
} else if (["mp4", "webm", "ogv"].contains(file.extension)) {
classes.push("video");
} else if (file.extension === "pdf") {
classes.push("pdf");
}
if (file.extension === "md") {
classes.push("note");
const cache = metadataCache.getFileCache(file);
if (cache == null ? void 0 : cache.frontmatter) {
if ("image" in cache.frontmatter) {
classes.push("image");
}
if ("tags" in cache.frontmatter) {
const tags = (0, import_obsidian.parseFrontMatterTags)(cache.frontmatter);
if (tags) {
classes.push(..._parseTags(tags));
}
}
if ("cssclass" in cache.frontmatter) {
const clazzes = (0, import_obsidian.parseFrontMatterStringArray)(cache.frontmatter, "cssclass");
if (clazzes) {
classes.push(...clazzes);
}
}
}
if (cache == null ? void 0 : cache.tags) {
classes.push(..._parseTags(cache.tags.map((t) => t.tag)));
}
} else {
classes.push("file");
}
return classes;
}
return [CAT_DANGLING];
};
var nodeFromFile = async function(file, plugin, settings, id2) {
if (!id2) {
id2 = VizId.toId(file.name, CORE_STORE_ID);
}
const cache = plugin.app.metadataCache.getFileCache(file);
const name = file.extension === "md" ? file.basename : file.name;
const classes = getClasses(file, plugin.app.metadataCache).join(" ");
const data = {
id: id2,
name,
path: file.path
};
if (["png", "jpg", "jpeg", "gif", "bmp", "svg", "tiff"].contains(file.extension)) {
try {
data["resource_url"] = `http://localhost:${plugin.settings.imgServerPort}/${encodeURI(file.path)}`;
} catch (e) {
}
}
if (settings.readContent && file.extension == "md") {
data["content"] = await plugin.app.vault.cachedRead(file);
}
const frontmatter = cache == null ? void 0 : cache.frontmatter;
if (frontmatter) {
Object.keys(frontmatter).forEach((k) => {
if (!(k === "position")) {
if (k === "image") {
const imageField = frontmatter[k];
try {
new URL(imageField);
data[k] = imageField;
} catch (e) {
try {
data[k] = `http://localhost:${plugin.settings.imgServerPort}/${encodeURI(imageField)}`;
} catch (e3) {
}
}
} else {
data[k] = frontmatter[k];
}
}
});
}
return {
group: "nodes",
data,
classes
};
};
var nodeDangling = function(path2) {
return {
group: "nodes",
data: {
id: VizId.toId(path2, CORE_STORE_ID),
name: path2
},
classes: "dangling"
};
};
var wikilinkRegex = "\\[\\[([^\\]\\r\\n]+?)\\]\\]";
var nameRegex = "[^\\W\\d]\\w*";
var regexEscape = function(str) {
return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
};
var parseTypedLink = function(link2, line, typedLinkPrefix) {
const regexPublishedIn = new RegExp(`^${regexEscape(typedLinkPrefix)} (publishedIn) (\\d\\d\\d\\d) (${wikilinkRegex},? *)+$`);
const matchPI = regexPublishedIn.exec(line);
if (!(matchPI === null)) {
return {
class: "type-publishedIn",
isInline: false,
properties: {
year: matchPI[2],
context: "",
type: "publishedIn"
}
};
}
const regex = new RegExp(`^${regexEscape(typedLinkPrefix)} (${nameRegex}) (${wikilinkRegex},? *)+$`);
const match = regex.exec(line);
const splitLink = link2.original.split("|");
let alias = null;
if (splitLink.length > 1) {
alias = splitLink.slice(1).join().slice(0, -2);
}
if (!(match === null)) {
return {
class: `type-${match[1]}`,
isInline: false,
properties: {
alias,
context: "",
type: match[1]
}
};
}
return null;
};
var getPlugin = function(app2) {
if ("juggl" in app2.plugins.plugins) {
return app2.plugins.plugins["juggl"];
}
return null;
};
// src/main.ts
var import_obsidian44 = require("obsidian");
// node_modules/obsidian-community-lib/dist/utils.js
var feather = __toESM(require_feather());
var import_obsidian2 = require("obsidian");
async function wait(delay) {
return new Promise((resolve) => setTimeout(resolve, delay));
}
function addFeatherIcon(name, attr2 = { viewBox: "0 0 24 24", width: "100", height: "100" }) {
if (feather.icons[name]) {
const iconName = `feather-${name}`;
(0, import_obsidian2.addIcon)(iconName, feather.icons[name].toSvg(attr2));
return iconName;
} else {
throw Error(`This Icon (${name}) doesn't exist in the Feather Library.`);
}
}
async function copy(content, success = () => new import_obsidian2.Notice("Copied to clipboard"), failure = (reason) => {
new import_obsidian2.Notice("Could not copy to clipboard");
console.log({ reason });
}) {
await navigator.clipboard.writeText(content).then(success, failure);
}
var isInVault = (noteName, sourcePath = "") => !!app.metadataCache.getFirstLinkpathDest(noteName, sourcePath);
function hoverPreview(event, view, to) {
const targetEl = event.target;
app.workspace.trigger("hover-link", {
event,
source: view.getViewType(),
hoverParent: view,
targetEl,
linktext: to
});
}
async function createNewMDNote(newName, currFilePath = "") {
const newFileFolder = app.fileManager.getNewFileParent(currFilePath).path;
const newFilePath = (0, import_obsidian2.normalizePath)(`${newFileFolder}${newFileFolder === "/" ? "" : "/"}${addMD(newName)}`);
return await app.vault.create(newFilePath, "");
}
var addMD = (noteName) => {
return noteName.match(/\.MD$|\.md$/m) ? noteName : noteName + ".md";
};
async function openOrSwitch(dest, event, options = { createNewFile: true }) {
const { workspace } = app;
let destFile = app.metadataCache.getFirstLinkpathDest(dest, "");
if (!destFile && options.createNewFile) {
destFile = await createNewMDNote(dest);
} else if (!destFile && !options.createNewFile)
return;
const leavesWithDestAlreadyOpen = [];
workspace.iterateAllLeaves((leaf) => {
var _a;
if (leaf.view instanceof import_obsidian2.MarkdownView) {
const file = (_a = leaf.view) === null || _a === void 0 ? void 0 : _a.file;
if (file && file.basename + "." + file.extension === dest) {
leavesWithDestAlreadyOpen.push(leaf);
}
}
});
if (leavesWithDestAlreadyOpen.length > 0) {
workspace.setActiveLeaf(leavesWithDestAlreadyOpen[0]);
} else {
const mode = app.vault.getConfig("defaultViewMode");
const leaf = event.ctrlKey || event.getModifierState("Meta") ? workspace.splitActiveLeaf() : workspace.getUnpinnedLeaf();
await leaf.openFile(destFile, { active: true, mode });
}
}
async function openView(viewType, viewClass, side = "right") {
let leaf = null;
for (leaf of app.workspace.getLeavesOfType(viewType)) {
if (leaf.view instanceof viewClass) {
return leaf.view;
}
await leaf.setViewState({ type: "empty" });
break;
}
leaf = (leaf !== null && leaf !== void 0 ? leaf : side === "right") ? app.workspace.getRightLeaf(false) : app.workspace.getLeftLeaf(false);
await leaf.setViewState({
type: viewType,
active: true
});
return leaf.view;
}
function resolvedLinksComplete(noFiles) {
const { resolvedLinks } = app.metadataCache;
return Object.keys(resolvedLinks).length === noFiles;
}
async function waitForResolvedLinks(delay = 1e3, max4 = 50) {
const noFiles = app.vault.getMarkdownFiles().length;
let i = 0;
while (!resolvedLinksComplete(noFiles) && i < max4) {
await wait(delay);
i++;
}
if (i === max4) {
throw Error("Obsidian-Community-Lib: ResolvedLinks did not finish initialising. `max` iterations was reached first.");
}
}
// src/constants.ts
var MATRIX_VIEW = "BC-matrix";
var DUCK_VIEW = "BC-ducks";
var TREE_VIEW = "BC-tree";
var TRAIL_ICON = "BC-trail-icon";
var TRAIL_ICON_SVG = '<path fill="currentColor" stroke="currentColor" d="M48.8,4c-6,0-13.5,0.5-19.7,3.3S17.9,15.9,17.9,25c0,5,2.6,9.7,6.1,13.9s8.1,8.3,12.6,12.3s9,7.8,12.2,11.5 c3.2,3.7,5.1,7.1,5.1,10.2c0,14.4-13.4,19.3-13.4,19.3c-0.7,0.2-1.2,0.8-1.3,1.5s0.1,1.4,0.7,1.9c0.6,0.5,1.3,0.6,2,0.3 c0,0,16.1-6.1,16.1-23c0-4.6-2.6-8.8-6.1-12.8c-3.5-4-8.1-7.9-12.6-11.8c-4.5-3.9-8.9-7.9-12.2-11.8c-3.2-3.9-5.2-7.7-5.2-11.4 c0-7.8,3.6-11.6,8.8-14S43,8,48.8,8c4.6,0,9.3,0,11,0c0.7,0,1.4-0.4,1.7-1c0.3-0.6,0.3-1.4,0-2s-1-1-1.7-1C58.3,4,53.4,4,48.8,4 L48.8,4z M78.1,4c-0.6,0-1.2,0.2-1.6,0.7l-8.9,9.9c-0.5,0.6-0.7,1.4-0.3,2.2c0.3,0.7,1,1.2,1.8,1.2h0.1l-2.8,2.6 c-0.6,0.6-0.8,1.4-0.5,2.2c0.3,0.8,1,1.3,1.9,1.3h1.3l-4.5,4.6c-0.6,0.6-0.7,1.4-0.4,2.2c0.3,0.7,1,1.2,1.8,1.2h10v4 c0,0.7,0.4,1.4,1,1.8c0.6,0.4,1.4,0.4,2,0c0.6-0.4,1-1,1-1.8v-4h10c0.8,0,1.5-0.5,1.8-1.2c0.3-0.7,0.1-1.6-0.4-2.2L86.9,24h1.3 c0.8,0,1.6-0.5,1.9-1.3c0.3-0.8,0.1-1.6-0.5-2.2l-2.8-2.6h0.1c0.8,0,1.5-0.5,1.8-1.2c0.3-0.7,0.2-1.6-0.3-2.2l-8.9-9.9 C79.1,4.3,78.6,4,78.1,4L78.1,4z M78,9l4.4,4.9h-0.7c-0.8,0-1.6,0.5-1.9,1.3c-0.3,0.8-0.1,1.6,0.5,2.2l2.8,2.6h-1.1 c-0.8,0-1.5,0.5-1.8,1.2c-0.3,0.7-0.1,1.6,0.4,2.2l4.5,4.6H70.8l4.5-4.6c0.6-0.6,0.7-1.4,0.4-2.2c-0.3-0.7-1-1.2-1.8-1.2h-1.1 l2.8-2.6c0.6-0.6,0.8-1.4,0.5-2.2c-0.3-0.8-1-1.3-1.9-1.3h-0.7L78,9z M52.4,12c-4.1,0-7.1,0.5-9.4,1.5c-2.3,1-3.8,2.5-4.5,4.3 c-0.7,1.8-0.5,3.6,0.1,5.2c0.6,1.5,1.5,2.9,2.5,3.9c5.4,5.4,18.1,12.6,29.6,21c5.8,4.2,11.2,8.6,15.1,13c3.9,4.4,6.2,8.7,6.2,12.4 c0,14.5-12.9,18.7-12.9,18.7c-0.7,0.2-1.2,0.8-1.4,1.5s0.1,1.5,0.7,1.9c0.6,0.5,1.3,0.6,2,0.3c0,0,15.6-5.6,15.6-22.5 c0-5.3-2.9-10.3-7.2-15.1C84.6,53.6,79,49,73.1,44.7c-11.8-8.6-24.8-16.3-29.2-20.6c-0.6-0.6-1.2-1.5-1.6-2.4 c-0.3-0.9-0.4-1.7-0.1-2.4c0.3-0.7,0.8-1.4,2.3-2c1.5-0.7,4.1-1.2,7.8-1.2c4.9,0,9.4,0.1,9.4,0.1c0.7,0,1.4-0.3,1.8-1 c0.4-0.6,0.4-1.4,0-2.1c-0.4-0.6-1.1-1-1.8-1C61.9,12.1,57.3,12,52.4,12L52.4,12z M24,46c-0.5,0-1.1,0.2-1.4,0.6L9.2,60.5 c-0.6,0.6-0.7,1.4-0.4,2.2c0.3,0.7,1,1.2,1.8,1.2h3l-6.5,6.8c-0.6,0.6-0.7,1.4-0.4,2.2s1,1.2,1.8,1.2H13l-8.5,8.6 C4,83.2,3.8,84,4.2,84.8C4.5,85.5,5.2,86,6,86h16v5.4c0,0.7,0.4,1.4,1,1.8c0.6,0.4,1.4,0.4,2,0c0.6-0.4,1-1,1-1.8V86h16 c0.8,0,1.5-0.5,1.8-1.2c0.3-0.7,0.1-1.6-0.4-2.2L35,74h4.4c0.8,0,1.5-0.5,1.8-1.2s0.2-1.6-0.4-2.2l-6.5-6.8h3 c0.8,0,1.5-0.5,1.8-1.2c0.3-0.7,0.2-1.6-0.4-2.2L25.4,46.6C25.1,46.2,24.5,46,24,46L24,46z M24,50.9l8.7,9h-3 c-0.8,0-1.5,0.5-1.8,1.2s-0.2,1.6,0.4,2.2l6.5,6.8h-4.5c-0.8,0-1.5,0.5-1.8,1.2c-0.3,0.7-0.1,1.6,0.4,2.2l8.5,8.6H10.8l8.5-8.6 c0.6-0.6,0.7-1.4,0.4-2.2c-0.3-0.7-1-1.2-1.8-1.2h-4.5l6.5-6.8c0.6-0.6,0.7-1.4,0.4-2.2c-0.3-0.7-1-1.2-1.8-1.2h-3L24,50.9z"/>';
var DUCK_ICON = "BC-duck-icon";
var DUCK_ICON_SVG = '<path fill="currentColor" stroke="currentColor" d="M72,31c0-1.5-1.2-2.8-2.8-2.8c-1.5,0-2.8,1.2-2.8,2.8s1.2,2.8,2.8,2.8C70.8,33.8,72,32.6,72,31z M80.4,47.7c10.7,0,19.4-8.7,19.4-19.4H88.4c-0.1-0.6-0.1-1.1-0.2-1.7c-1.6-7.1-7.3-12.8-14.3-144c-1.6-0.4-3.1-0.5-4.6-0.5c-10.7,0-19.4,8.7-19.4,19.4v13.9h-9.4c-6.8,0-13.6-2.4-18.2-7.3c-0.7-0.7-1.6-1.1-2.4-11c-1.7,0-3.3,1.3-3.3,3.3c0,16.4,12.5,31,28.6,32.6c1.6,0.2,3.1-1.1,3.1-2.8v-2.8c0-1.4-1-2.6-2.4-2.7c-7.9-09-14.8-6.2-18.4-13.5c4.1,1.6,8.5,2.5,13.1,2.5l17.7,0.1V31c0-6.1,5-11.1,11.1-11.1c0.9,0,1.8,0.1,2.7,0.3c3.9,0.9,7.2,4.2,8.1,8.1C814,34.4,78,39.1,74,41l-4.7,2.3v12.4l2.1,2.4c1.5,1.8,3.4,4.7,3.5,8.8c0.1,3.4-1.3,6.7-3.9,9.4c-3,3-7,4.8-11.2,4.8H43.9c-1,0-2.1-01-3.2-0.2C25.2,79.5,12.3,68.1,8.7,53.2h5.1c-1.2-2.7-2-5.5-2.5-8.3H5.4c-3.3,0-6,3-5.5,6.3c2.9,20.3,19.4,36.1,40,38c1.3,0.1,2.6,02,4,0.2h15.8c12.5,0,23.7-10.2,23.4-22.7c-0.1-5.4-2.2-10.3-5.6-14.1v-4.9H80.4L80.4,47.7z"/>';
var splitLinksRegex = new RegExp(/\[\[(.+?)\]\]/g);
var dropHeaderOrAlias = new RegExp(/\[\[([^#|]+)\]\]/);
var regNFlags = new RegExp(/^.(.*?)\W(\w*)$/);
var TRAIL_LENGTHS = [
"Shortest",
"Longest",
"All"
];
var VISTYPES = [
"Force Directed Graph",
"Tidy Tree",
"Circle Packing",
"Edge Bundling",
"Arc Diagram",
"Sunburst",
"Tree Map",
"Icicle",
"Radial Tree"
];
var DIRECTIONS = ["up", "same", "down", "next", "prev"];
var ARROW_DIRECTIONS = {
up: "\u2191",
same: "\u2194",
down: "\u2193",
next: "\u2192",
prev: "\u2190"
};
var RELATIONS = ["Parent", "Sibling", "Child"];
var REAlCLOSED = ["Real", "Closed"];
var ALLUNLINKED = ["All", "No Unlinked"];
var CODEBLOCK_TYPES = ["tree", "juggl"];
var CODEBLOCK_FIELDS = [
"type",
"dir",
"fields",
"depth",
"title",
"flat",
"content",
"from",
"implied"
];
var JUGGL_CB_DEFAULTS = {
animateLayout: true,
autoAddNodes: false,
autoExpand: false,
autoZoom: false,
coreStore: "core",
expandInitial: false,
fdgdLayout: "d3-force",
filter: "",
height: "750px",
hoverEdges: false,
layout: "force-directed",
limit: 250,
mergeEdges: true,
metaKeyHover: true,
mode: "workspace",
navigator: true,
openWithShift: false,
readContent: true,
styleGroups: [],
toolbar: true,
width: "100%",
zoomSpeed: 1
};
var JUGGL_TRAIL_DEFAULTS = Object.assign(JUGGL_CB_DEFAULTS, {
animateLayout: true,
autoZoom: false,
fdgdLayout: "d3-force",
height: "300px",
readContent: false,
toolbar: false,
navigator: false
});
CODEBLOCK_FIELDS.push(...Object.keys(JUGGL_CB_DEFAULTS));
var blankUserHier = () => {
return { up: [], same: [], down: [], next: [], prev: [] };
};
var blankRealNImplied = () => {
return {
up: { reals: [], implieds: [] },
down: { reals: [], implieds: [] },
same: { reals: [], implieds: [] },
next: { reals: [], implieds: [] },
prev: { reals: [], implieds: [] }
};
};
var [
BC_I_AUNT,
BC_I_COUSIN,
BC_I_SIBLING_1,
BC_I_SIBLING_2,
BC_I_REFLEXIVE,
BC_I_PARENT
] = [
"BC-Aunt",
"BC-Cousin",
"BC-Sibling-1",
"BC-Sibling-2",
"BC-Reflexive",
"BC-Parent"
];
var [
BC_FOLDER_NOTE,
BC_FOLDER_NOTE_SUBFOLDERS,
BC_FOLDER_NOTE_RECURSIVE,
BC_TAG_NOTE,
BC_TAG_NOTE_FIELD,
BC_TAG_NOTE_EXACT,
BC_LINK_NOTE,
BC_TRAVERSE_NOTE,
BC_REGEX_NOTE,
BC_REGEX_NOTE_FIELD,
BC_DV_NOTE,
BC_DV_NOTE_FIELD,
BC_IGNORE,
BC_IGNORE_DENDRON,
BC_HIDE_TRAIL,
BC_ORDER
] = [
"BC-folder-note",
"BC-folder-note-subfolders",
"BC-folder-note-recursive",
"BC-tag-note",
"BC-tag-note-field",
"BC-tag-note-exact",
"BC-link-note",
"BC-traverse-note",
"BC-regex-note",
"BC-regex-note-field",
"BC-dataview-note",
"BC-dataview-note-field",
"BC-ignore",
"BC-ignore-dendron",
"BC-hide-trail",
"BC-order"
];
var BC_FIELDS_INFO = [
{
field: BC_FOLDER_NOTE,
desc: "Set this note as a Breadcrumbs folder-note. All other notes in this folder will be added to the graph with the field name specified in this key's value",
afterYaml: ": ",
afterInline: ":: ",
alt: true
},
{
field: BC_FOLDER_NOTE_SUBFOLDERS,
desc: "Link to notes in subfolders with the given field.",
afterYaml: ": ",
afterInline: ":: ",
alt: false
},
{
field: BC_FOLDER_NOTE_RECURSIVE,
desc: "Recursively add notes in subfolders to the foldernote of _that_ subfolder.",
afterYaml: ": true",
afterInline: ":: true",
alt: false
},
{
field: BC_TAG_NOTE,
desc: "Set this note as a Breadcrumbs tag-note. All other notes with this tag will be added to the graph using the default fieldName specified in `Settings > Alternative Hierarchies > Tag Notes > Default Field`, or using the fieldName you specify with `BC-tag-note-field: fieldName`",
afterYaml: ": '#",
afterInline: ":: #",
alt: true
},
{
field: BC_TAG_NOTE_FIELD,
desc: "Manually choose the field for this tag-note to use",
afterYaml: ": ",
afterInline: ":: ",
alt: false
},
{
field: BC_TAG_NOTE_EXACT,
desc: "Only look for notes with the exact tag. i.e. `#A` won't match `#A/B`",
afterYaml: ": true",
afterInline: ":: true",
alt: false
},
{
field: BC_LINK_NOTE,
desc: "Set this note as a Breadcrumbs link-note. All links leaving this note will be added to the graph with the field name specified in this key's value.",
afterYaml: ": ",
afterInline: ":: ",
alt: true
},
{
field: BC_TRAVERSE_NOTE,
desc: "Set this note as a Breadcrumbs traverse-note. Starting from this note, the Obsidian graph will be traversed in depth-first order, and all notes along the way will be added to the BC graph using the fieldName you specify",
afterYaml: ": ",
afterInline: ":: ",
alt: true
},
{
field: BC_REGEX_NOTE,
desc: "Set this note as a Breadcrumbs regex-note. The value of this field is a regular expression (of the form '/regex/flags'). All note names that match the regex will be added to the BC graph using the default fieldName specified in `Settings > Alternative Hierarchies > Regex Notes > Default Field`, or using the fieldName you specify in 'BC-regex-note-field'.",
afterYaml: ": '/",
afterInline: ":: /",
alt: true
},
{
field: BC_REGEX_NOTE_FIELD,
desc: "Manually choose the field for this regex-note to use",
afterYaml: ": ",
afterInline: ":: ",
alt: false
},
{
field: BC_DV_NOTE,
desc: "Set this note as a Breadcrumbs Dataview-note. The value of this field is a Dataview `from` query. All notes that match the query will be added to the BC graph using the default fieldName specified in `Settings > Alternative Hierarchies > Dataview Notes > Default Field`, or using the fieldName you specify in 'BC-dataview-note-field'.",
afterYaml: ": '",
afterInline: ":: ",
alt: true
},
{
field: BC_DV_NOTE_FIELD,
desc: "Manually choose the field for this Dataview-note to use",
afterYaml: ": ",
afterInline: ":: ",
alt: false
},
{
field: BC_IGNORE,
desc: "Tells Breadcrumbs to ignore a note from its index entirely. This is useful if you want to use Breadcrumbs to index notes, but you don't want to show them in the graph.",
afterYaml: ": true",
afterInline: ":: true",
alt: false
},
{
field: BC_IGNORE_DENDRON,
desc: "Tells Breadcrumbs to not treat this note as a dendron note (only useful if the note name has you dendron splitter in it, usually a period `.`).",
afterYaml: ": true",
afterInline: ":: true",
alt: false
},
{
field: BC_HIDE_TRAIL,
desc: "Don't show the trail in this note",
afterYaml: ": true",
afterInline: ":: true",
alt: false
},
{
field: BC_ORDER,
desc: "Set the order of this note in the Matrix view. A lower value places this note higher in the order.",
afterYaml: ": ",
afterInline: ":: ",
alt: false
}
];
var BC_ALTS = BC_FIELDS_INFO.filter((f) => f.alt).map((f) => f.field);
var ILLEGAL_FILENAME_CHARS = [
"\\",
"/",
":",
"*",
"?",
'"',
"<",
">",
"|"
];
var DATAVIEW_MISSING = "The Dataview plugin must be installed for this to work";
var API_NAME = "BCAPI";
var DEFAULT_SETTINGS = {
addDendronNotes: false,
addDateNotes: false,
aliasesInIndex: false,
alphaSortAsc: true,
altLinkFields: [],
CSVPaths: "",
createIndexIndent: " ",
dateFormat: "YYYY-MM-DD",
dateNoteFormat: "yyyy-MM-dd",
dateNoteField: "next",
dataviewNoteField: "up",
dateNoteAddMonth: "",
dateNoteAddYear: "",
debugMode: "WARN",
dendronNoteDelimiter: ".",
dendronNoteField: "up",
dvWaitTime: 5e3,
enableAlphaSort: true,
enableRelationSuggestor: false,
fieldSuggestor: true,
filterImpliedSiblingsOfDifferentTypes: false,
jugglLayout: "hierarchy",
limitWriteBCCheckboxes: [],
CHECKBOX_STATES_OVERWRITTEN: false,
gridDefaultDepth: 25,
hierarchyNotes: [""],
hierarchyNoteIsParent: false,
HNUpField: "",
indexNotes: [""],
namingSystemField: "",
namingSystemRegex: "",
namingSystemSplit: ".",
namingSystemEndsWithDelimiter: false,
refreshOnNoteChange: false,
useAllMetadata: true,
openMatrixOnLoad: true,
openDuckOnLoad: false,
openDownOnLoad: true,
parseJugglLinksWithoutJuggl: false,
showNameOrType: true,
showRelationType: true,
regexNoteField: "",
relSuggestorTrigger: "\\",
rlLeaf: true,
showAllPathsIfNoneToIndexNote: false,
showAllAliases: true,
showBCs: true,
showBCsInEditLPMode: false,
showRefreshNotice: true,
showImpliedRelations: true,
showTrail: true,
showGrid: true,
showJuggl: false,
showPrevNext: true,
sortByNameShowAlias: false,
squareDirectionsOrder: [0, 1, 2, 3, 4],
limitTrailCheckboxes: [],
limitJumpToFirstFields: [],
showAll: "All",
noPathMessage: `This note has no real or implied parents`,
tagNoteField: "",
threadIntoNewPane: false,
threadingTemplate: "{{field}} of {{current}}",
threadingDirTemplates: { up: "", same: "", down: "", next: "", prev: "" },
threadUnderCursor: false,
trailSeperator: "\u2192",
treatCurrNodeAsImpliedSibling: false,
trimDendronNotes: false,
respectReadableLineLength: true,
userHiers: [
{
up: ["up"],
same: ["same"],
down: ["down"],
next: ["next"],
prev: ["prev"]
}
],
writeBCsInline: false,
showWriteAllBCsCmd: false,
visGraph: "Force Directed Graph",
visRelation: "Parent",
visClosed: "Real",
visAll: "All",
wikilinkIndex: true,
impliedRelations: {
siblingIdentity: false,
sameParentIsSibling: true,
siblingsSiblingIsSibling: false,
siblingsParentIsParent: false,
parentsSiblingsIsParents: false,
parentsParentsIsParent: false,
cousinsIsSibling: false
},
refreshOnNoteSave: false,
showUpInJuggl: false
};
// src/Views/MatrixView.ts
var import_loglevel14 = __toESM(require_loglevel());
var import_obsidian10 = require("obsidian");
// src/Debugger.ts
var import_loglevel = __toESM(require_loglevel());
var Debugger = class {
constructor(plugin) {
this.debugLessThan = (level) => import_loglevel.levels[this.plugin.settings.debugMode] < level;
this.plugin = plugin;
}
start2G(group) {
if (this.debugLessThan(3))
console.groupCollapsed(group);
}
end2G(...msgs) {
if (this.debugLessThan(3)) {
if (msgs.length)
(0, import_loglevel.info)(...msgs);
console.groupEnd();
}
}
start1G(group) {
if (this.debugLessThan(2))
console.groupCollapsed(group);
}
end1G(...msgs) {
if (this.debugLessThan(2)) {
if (msgs.length)
(0, import_loglevel.debug)(...msgs);
console.groupEnd();
}
}
startGs(...groups) {
this.start2G(groups[0]);
if (groups[1])
this.start1G(groups[1]);
}
endGs(count2, ...msgs) {
if (count2 === 1)
this.end2G(...msgs);
else {
this.end1G();
this.end2G(...msgs);
}
}
};
// node_modules/svelte/internal/index.mjs
function noop() {
}
function assign(tar, src) {
for (const k in src)
tar[k] = src[k];
return tar;
}
function run(fn) {
return fn();
}
function blank_object() {
return /* @__PURE__ */ Object.create(null);
}
function run_all(fns) {
fns.forEach(run);
}
function is_function(thing) {
return typeof thing === "function";
}
function safe_not_equal(a2, b) {
return a2 != a2 ? b == b : a2 !== b || (a2 && typeof a2 === "object" || typeof a2 === "function");
}
var src_url_equal_anchor;
function src_url_equal(element_src, url) {
if (!src_url_equal_anchor) {
src_url_equal_anchor = document.createElement("a");
}
src_url_equal_anchor.href = url;
return element_src === src_url_equal_anchor.href;
}
function is_empty(obj) {
return Object.keys(obj).length === 0;
}
function create_slot(definition, ctx, $$scope, fn) {
if (definition) {
const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);
return definition[0](slot_ctx);
}
}
function get_slot_context(definition, ctx, $$scope, fn) {
return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;
}
function get_slot_changes(definition, $$scope, dirty, fn) {
if (definition[2] && fn) {
const lets = definition[2](fn(dirty));
if ($$scope.dirty === void 0) {
return lets;
}
if (typeof lets === "object") {
const merged = [];
const len = Math.max($$scope.dirty.length, lets.length);
for (let i = 0; i < len; i += 1) {
merged[i] = $$scope.dirty[i] | lets[i];
}
return merged;
}
return $$scope.dirty | lets;
}
return $$scope.dirty;
}
function update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {
if (slot_changes) {
const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);
slot.p(slot_context, slot_changes);
}
}
function get_all_dirty_from_scope($$scope) {
if ($$scope.ctx.length > 32) {
const dirty = [];
const length = $$scope.ctx.length / 32;
for (let i = 0; i < length; i++) {
dirty[i] = -1;
}
return dirty;
}
return -1;
}
function exclude_internal_props(props) {
const result = {};
for (const k in props)
if (k[0] !== "$")
result[k] = props[k];
return result;
}
function null_to_empty(value) {
return value == null ? "" : value;
}
var is_hydrating = false;
function start_hydrating() {
is_hydrating = true;
}
function end_hydrating() {
is_hydrating = false;
}
function append(target, node) {
target.appendChild(node);
}
function append_styles(target, style_sheet_id, styles) {
const append_styles_to = get_root_for_style(target);
if (!append_styles_to.getElementById(style_sheet_id)) {
const style = element("style");
style.id = style_sheet_id;
style.textContent = styles;
append_stylesheet(append_styles_to, style);
}
}
function get_root_for_style(node) {
if (!node)
return document;
const root2 = node.getRootNode ? node.getRootNode() : node.ownerDocument;
if (root2 && root2.host) {
return root2;
}
return node.ownerDocument;
}
function append_stylesheet(node, style) {
append(node.head || node, style);
}
function insert(target, node, anchor) {
target.insertBefore(node, anchor || null);
}
function detach(node) {
node.parentNode.removeChild(node);
}
function destroy_each(iterations, detaching) {
for (let i = 0; i < iterations.length; i += 1) {
if (iterations[i])
iterations[i].d(detaching);
}
}
function element(name) {
return document.createElement(name);
}
function svg_element(name) {
return document.createElementNS("http://www.w3.org/2000/svg", name);
}
function text(data) {
return document.createTextNode(data);
}
function space() {
return text(" ");
}
function empty() {
return text("");
}
function listen(node, event, handler, options) {
node.addEventListener(event, handler, options);
return () => node.removeEventListener(event, handler, options);
}
function attr(node, attribute, value) {
if (value == null)
node.removeAttribute(attribute);
else if (node.getAttribute(attribute) !== value)
node.setAttribute(attribute, value);
}
function get_binding_group_value(group, __value, checked) {
const value = /* @__PURE__ */ new Set();
for (let i = 0; i < group.length; i += 1) {
if (group[i].checked)
value.add(group[i].__value);
}
if (!checked) {
value.delete(__value);
}
return Array.from(value);
}
function children(element2) {
return Array.from(element2.childNodes);
}
function set_data(text2, data) {
data = "" + data;
if (text2.wholeText !== data)
text2.data = data;
}
function set_input_value(input, value) {
input.value = value == null ? "" : value;
}
function set_style(node, key, value, important) {
node.style.setProperty(key, value, important ? "important" : "");
}
function select_option(select, value) {
for (let i = 0; i < select.options.length; i += 1) {
const option = select.options[i];
if (option.__value === value) {
option.selected = true;
return;
}
}
select.selectedIndex = -1;
}
function select_value(select) {
const selected_option = select.querySelector(":checked") || select.options[0];
return selected_option && selected_option.__value;
}
var current_component;
function set_current_component(component) {
current_component = component;
}
function get_current_component() {
if (!current_component)
throw new Error("Function called outside component initialization");
return current_component;
}
function onMount(fn) {
get_current_component().$$.on_mount.push(fn);
}
var dirty_components = [];
var binding_callbacks = [];
var render_callbacks = [];
var flush_callbacks = [];
var resolved_promise = Promise.resolve();
var update_scheduled = false;
function schedule_update() {
if (!update_scheduled) {
update_scheduled = true;
resolved_promise.then(flush);
}
}
function add_render_callback(fn) {
render_callbacks.push(fn);
}
var flushing = false;
var seen_callbacks = /* @__PURE__ */ new Set();
function flush() {
if (flushing)
return;
flushing = true;
do {
for (let i = 0; i < dirty_components.length; i += 1) {
const component = dirty_components[i];
set_current_component(component);
update(component.$$);
}
set_current_component(null);
dirty_components.length = 0;
while (binding_callbacks.length)
binding_callbacks.pop()();
for (let i = 0; i < render_callbacks.length; i += 1) {
const callback = render_callbacks[i];
if (!seen_callbacks.has(callback)) {
seen_callbacks.add(callback);
callback();
}
}
render_callbacks.length = 0;
} while (dirty_components.length);
while (flush_callbacks.length) {
flush_callbacks.pop()();
}
update_scheduled = false;
flushing = false;
seen_callbacks.clear();
}
function update($$) {
if ($$.fragment !== null) {
$$.update();
run_all($$.before_update);
const dirty = $$.dirty;
$$.dirty = [-1];
$$.fragment && $$.fragment.p($$.ctx, dirty);
$$.after_update.forEach(add_render_callback);
}
}
var outroing = /* @__PURE__ */ new Set();
var outros;
function group_outros() {
outros = {
r: 0,
c: [],
p: outros
};
}
function check_outros() {
if (!outros.r) {
run_all(outros.c);
}
outros = outros.p;
}
function transition_in(block, local) {
if (block && block.i) {
outroing.delete(block);
block.i(local);
}
}
function transition_out(block, local, detach2, callback) {
if (block && block.o) {
if (outroing.has(block))
return;
outroing.add(block);
outros.c.push(() => {
outroing.delete(block);
if (callback) {
if (detach2)
block.d(1);
callback();
}
});
block.o(local);
}
}
var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : global;
function get_spread_update(levels2, updates) {
const update2 = {};
const to_null_out = {};
const accounted_for = { $$scope: 1 };
let i = levels2.length;
while (i--) {
const o = levels2[i];
const n = updates[i];
if (n) {
for (const key in o) {
if (!(key in n))
to_null_out[key] = 1;
}
for (const key in n) {
if (!accounted_for[key]) {
update2[key] = n[key];
accounted_for[key] = 1;
}
}
levels2[i] = n;
} else {
for (const key in o) {
accounted_for[key] = 1;
}
}
}
for (const key in to_null_out) {
if (!(key in update2))
update2[key] = void 0;
}
return update2;
}
function get_spread_object(spread_props) {
return typeof spread_props === "object" && spread_props !== null ? spread_props : {};
}
function create_component(block) {
block && block.c();
}
function mount_component(component, target, anchor, customElement) {
const { fragment, on_mount, on_destroy, after_update } = component.$$;
fragment && fragment.m(target, anchor);
if (!customElement) {
add_render_callback(() => {
const new_on_destroy = on_mount.map(run).filter(is_function);
if (on_destroy) {
on_destroy.push(...new_on_destroy);
} else {
run_all(new_on_destroy);
}
component.$$.on_mount = [];
});
}
after_update.forEach(add_render_callback);
}
function destroy_component(component, detaching) {
const $$ = component.$$;
if ($$.fragment !== null) {
run_all($$.on_destroy);
$$.fragment && $$.fragment.d(detaching);
$$.on_destroy = $$.fragment = null;
$$.ctx = [];
}
}
function make_dirty(component, i) {
if (component.$$.dirty[0] === -1) {
dirty_components.push(component);
schedule_update();
component.$$.dirty.fill(0);
}
component.$$.dirty[i / 31 | 0] |= 1 << i % 31;
}
function init(component, options, instance24, create_fragment24, not_equal, props, append_styles2, dirty = [-1]) {
const parent_component = current_component;
set_current_component(component);
const $$ = component.$$ = {
fragment: null,
ctx: null,
props,
update: noop,
not_equal,
bound: blank_object(),
on_mount: [],
on_destroy: [],
on_disconnect: [],
before_update: [],
after_update: [],
context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
callbacks: blank_object(),
dirty,
skip_bound: false,
root: options.target || parent_component.$$.root
};
append_styles2 && append_styles2($$.root);
let ready = false;
$$.ctx = instance24 ? instance24(component, options.props || {}, (i, ret, ...rest) => {
const value = rest.length ? rest[0] : ret;
if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
if (!$$.skip_bound && $$.bound[i])
$$.bound[i](value);
if (ready)
make_dirty(component, i);
}
return ret;
}) : [];
$$.update();
ready = true;
run_all($$.before_update);
$$.fragment = create_fragment24 ? create_fragment24($$.ctx) : false;
if (options.target) {
if (options.hydrate) {
start_hydrating();
const nodes = children(options.target);
$$.fragment && $$.fragment.l(nodes);
nodes.forEach(detach);
} else {
$$.fragment && $$.fragment.c();
}
if (options.intro)
transition_in(component.$$.fragment);
mount_component(component, options.target, options.anchor, options.customElement);
end_hydrating();
flush();
}
set_current_component(parent_component);
}
var SvelteElement;
if (typeof HTMLElement === "function") {
SvelteElement = class extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: "open" });
}
connectedCallback() {
const { on_mount } = this.$$;
this.$$.on_disconnect = on_mount.map(run).filter(is_function);
for (const key in this.$$.slotted) {
this.appendChild(this.$$.slotted[key]);
}
}
attributeChangedCallback(attr2, _oldValue, newValue) {
this[attr2] = newValue;
}
disconnectedCallback() {
run_all(this.$$.on_disconnect);
}
$destroy() {
destroy_component(this, 1);
this.$destroy = noop;
}
$on(type2, callback) {
const callbacks = this.$$.callbacks[type2] || (this.$$.callbacks[type2] = []);
callbacks.push(callback);
return () => {
const index2 = callbacks.indexOf(callback);
if (index2 !== -1)
callbacks.splice(index2, 1);
};
}
$set($$props) {
if (this.$$set && !is_empty($$props)) {
this.$$.skip_bound = true;
this.$$set($$props);
this.$$.skip_bound = false;
}
}
};
}
var SvelteComponent = class {
$destroy() {
destroy_component(this, 1);
this.$destroy = noop;
}
$on(type2, callback) {
const callbacks = this.$$.callbacks[type2] || (this.$$.callbacks[type2] = []);
callbacks.push(callback);
return () => {
const index2 = callbacks.indexOf(callback);
if (index2 !== -1)
callbacks.splice(index2, 1);
};
}
$set($$props) {
if (this.$$set && !is_empty($$props)) {
this.$$.skip_bound = true;
this.$$set($$props);
this.$$.skip_bound = false;
}
}
};
// src/refreshIndex.ts
var import_graphology2 = __toESM(require_graphology_umd_min());
var import_loglevel13 = __toESM(require_loglevel());
var import_obsidian9 = require("obsidian");
// src/AlternativeHierarchies/CSVCrumbs.ts
var import_loglevel5 = __toESM(require_loglevel());
var import_obsidian4 = require("obsidian");
// src/Utils/ObsidianUtils.ts
var import_loglevel3 = __toESM(require_loglevel());
var import_obsidian3 = require("obsidian");
// src/Utils/generalUtils.ts
var import_loglevel2 = __toESM(require_loglevel());
var dropPath = (path2) => path2.replace(/^.*\//, "");
var dropDendron = (path2, settings) => settings.trimDendronNotes ? path2.split(settings.dendronNoteDelimiter).last() : path2;
var dropPathNDendron = (path2, settings) => dropDendron(dropPath(path2), settings);
var dropFolder = (path2) => path2.split("/").last().split(".").slice(0, -1).join(".");
var splitAndTrim = (fields) => {
if (!fields || fields === "")
return [];
else
return fields.split(",").map((str) => str.trim());
};
function padArray(arr, finalLength, filler = "") {
const copy3 = [...arr];
const currLength = copy3.length;
if (currLength > finalLength)
throw new Error("Current length is greater than final length");
else if (currLength === finalLength)
return copy3;
else {
for (let i = currLength; i < finalLength; i++)
copy3.push(filler);
return copy3;
}
}
function transpose(A2) {
const cols = A2[0].length;
const AT = [];
for (let j = 0; j < cols; j++)
AT.push(A2.map((row) => row[j]));
return AT;
}
function runs(arr) {
const runs2 = [];
let i = 0;
while (i < arr.length) {
const currValue = arr[i];
runs2.push({ value: currValue, first: i, last: void 0 });
while (currValue === arr[i]) {
i++;
}
runs2.last().last = i - 1;
}
return runs2;
}
function swapItems(i, j, arr) {
const max4 = arr.length - 1;
if (i < 0 || i > max4 || j < 0 || j > max4)
return arr;
const tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
return arr;
}
function strToRegex(input) {
const match = input.match(regNFlags);
if (!match)
return null;
const [, innerRegex, flags] = match;
try {
const regex = new RegExp(innerRegex, flags);
return regex;
} catch (e) {
(0, import_loglevel2.warn)(e);
return null;
}
}
function escapeRegex(string) {
return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
}
// src/Utils/ObsidianUtils.ts
var getSettings = () => app.plugins.plugins.breadcrumbs.settings;
var getCurrFile = () => app.workspace.getActiveFile();
var getBaseFromMDPath = (path2) => {
const splitSlash = path2.split("/").last();
if (splitSlash.endsWith(".md")) {
return splitSlash.split(".md").slice(0, -1).join(".");
} else
return splitSlash;
};
var getDVBasename = (file) => file.basename || file.name;
var getFolderName = (file) => {
var _a;
return ((_a = file == null ? void 0 : file.parent) == null ? void 0 : _a.name) || file.folder;
};
function makeWiki(str, wikiQ = true) {
let copy3 = str.slice();
if (wikiQ) {
copy3 = "[[" + copy3;
copy3 += "]]";
}
return copy3;
}
function dropWikilinks(str) {
let copy3 = str.slice();
if (copy3.startsWith("[[") && copy3.endsWith("]]"))
copy3 = copy3.slice(2, -2);
return copy3;
}
var createOrUpdateYaml = async (key, value, file, frontmatter, api) => {
const valueStr = value.toString();
if (!frontmatter || frontmatter[key] === void 0) {
(0, import_loglevel3.info)(`Creating: ${key}: ${valueStr}`);
await api.createYamlProperty(key, `['${valueStr}']`, file);
} else if ([...[frontmatter[key]]].flat(3).some((val) => val == valueStr)) {
(0, import_loglevel3.info)("Already Exists!");
return;
} else {
const oldValueFlat = [...[frontmatter[key]]].flat(4);
const newValue = [...oldValueFlat, `'${valueStr}'`];
(0, import_loglevel3.info)(`Updating: ${key}: ${newValue}`);
await api.update(key, `[${newValue.join(", ")}]`, file);
}
};
function changeYaml(yaml, key, newVal) {
if (yaml === "") {
return `${key}: ['${newVal}']`;
} else {
const parsed = (0, import_obsidian3.parseYaml)(yaml);
const value = parsed[key];
if (value === void 0) {
parsed[key] = newVal;
} else if (typeof value === "string" && value !== newVal) {
parsed[key] = [value, newVal];
} else if (typeof (value == null ? void 0 : value[0]) === "string" && value.includes && !value.includes(newVal)) {
parsed[key] = [...value, newVal];
}
return (0, import_obsidian3.stringifyYaml)(parsed);
}
}
function splitAtYaml2(content) {
if (!content.startsWith("---\n"))
return ["", content];
else {
const splits = content.split("---");
return [
splits.slice(0, 2).join("---") + "---",
splits.slice(2).join("---")
];
}
}
var dropHash = (tag) => tag.startsWith("#") ? tag.slice(1) : tag;
var addHash = (tag) => tag.startsWith("#") ? tag : `#${tag}`;
function getAlt(node, plugin) {
var _a;
const { altLinkFields, showAllAliases } = plugin.settings;
if (altLinkFields.length) {
const file = app.metadataCache.getFirstLinkpathDest(node, "");
if (file) {
const metadata = app.metadataCache.getFileCache(file);
for (const altField of altLinkFields) {
const value = (_a = metadata == null ? void 0 : metadata.frontmatter) == null ? void 0 : _a[altField];
const arr = typeof value === "string" ? splitAndTrim(value) : value;
if (value)
return showAllAliases ? arr.join(", ") : arr[0];
}
}
} else
return null;
}
async function waitForCache(plugin) {
var _a;
if (app.plugins.enabledPlugins.has("dataview")) {
let basename;
while (!basename || !app.plugins.plugins.dataview.api.page(basename)) {
await wait(100);
basename = (_a = getCurrFile()) == null ? void 0 : _a.basename;
}
} else {
await waitForResolvedLinks(app);
}
}
var linkClass = (to, realQ = true) => `internal-link BC-Link ${isInVault(to) ? "" : "is-unresolved"} ${realQ ? "" : "BC-Implied"}`;
var getDVApi = (plugin) => {
var _a;
return (_a = app.plugins.plugins.dataview) == null ? void 0 : _a.api;
};
function isInsideYaml() {
const { workspace, metadataCache } = app;
const { activeLeaf } = workspace;
const {
state: { mode }
} = activeLeaf.getViewState();
if (mode !== "source")
return null;
const { editor } = activeLeaf.view;
const file = getCurrFile();
if (!file)
return null;
const { frontmatter } = metadataCache.getFileCache(file);
if (!frontmatter)
return false;
const { start: start2, end } = frontmatter.position;
const currOff = editor.posToOffset(editor.getCursor());
if (currOff >= start2.offset && currOff <= end.offset)
return true;
else
return false;
}
// src/Utils/graphUtils.ts
var import_graphology = __toESM(require_graphology_umd_min());
var import_graphology_traversal = __toESM(require_graphology_traversal());
var import_loglevel4 = __toESM(require_loglevel());
// src/Utils/HierUtils.ts
function getFields(userHiers, dir = "all") {
const fields = [];
userHiers.forEach((hier) => {
if (dir === "all") {
DIRECTIONS.forEach((eachDir) => {
fields.push(...hier[eachDir]);
});
} else {
fields.push(...hier[dir]);
}
});
return fields;
}
var getOppDir = (dir) => {
switch (dir) {
case "up":
return "down";
case "down":
return "up";
case "same":
return "same";
case "next":
return "prev";
case "prev":
return "next";
}
};
function getFieldInfo(userHiers, field) {
let fieldDir;
let fieldHier;
DIRECTIONS.forEach((dir) => {
userHiers.forEach((hier) => {
if (hier[dir].includes(field)) {
fieldDir = dir;
fieldHier = hier;
return;
}
});
});
return { fieldHier, fieldDir };
}
function getOppFields(userHiers, field, dir) {
if (field.endsWith(">"))
return [field.slice(0, -4)];
const oppFields = [fallbackOppField(field, dir)];
const { fieldHier, fieldDir } = getFieldInfo(userHiers, field);
if (!fieldHier || !fieldDir)
return oppFields;
const oppDir = getOppDir(fieldDir);
oppFields.unshift(...fieldHier[oppDir]);
return oppFields;
}
var hierToStr = (hier) => DIRECTIONS.map((dir) => `${ARROW_DIRECTIONS[dir]}: ${hier[dir].join(", ")}`).join("\n");
var fallbackField = (field, dir) => `${field} <${ARROW_DIRECTIONS[dir]}>`;
var fallbackOppField = (field, dir) => `${field} <${ARROW_DIRECTIONS[getOppDir(dir)]}>`;
function iterateHiers(userHiers, fn) {
userHiers.forEach((hier) => {
DIRECTIONS.forEach((dir) => {
hier[dir].forEach((field) => {
fn(hier, dir, field);
});
});
});
}
// src/Utils/graphUtils.ts
function closeImpliedLinks(real, implied) {
const closedG = real.copy();
implied.forEachEdge((key, a2, s, t) => {
closedG.mergeEdge(t, s, a2);
});
return closedG;
}
function removeUnlinkedNodes(g) {
const copy3 = g.copy();
copy3.forEachNode((node) => {
if (!copy3.degree(node))
copy3.dropNode(node);
});
return copy3;
}
function getSubInDirs(g, ...dirs) {
const sub = new import_graphology.MultiGraph();
g == null ? void 0 : g.forEachEdge((k, a2, s, t) => {
if (dirs.includes(a2.dir)) {
addNodesIfNot(sub, [s, t], { order: a2.order });
sub.addEdge(s, t, a2);
}
});
return sub;
}
function getSubForFields(g, fields) {
const sub = new import_graphology.MultiGraph();
g.forEachEdge((k, a2, s, t) => {
if (fields.includes(a2.field)) {
addNodesIfNot(sub, [s, t], { order: a2.order });
sub.addEdge(s, t, a2);
}
});
return sub;
}
function getReflexiveClosure(g, userHiers) {
const copy3 = g.copy();
copy3.forEachEdge((k, a2, s, t) => {
const { dir, field } = a2;
if (field === void 0)
return;
const oppDir = getOppDir(dir);
const oppField = dir === "same" ? field : getOppFields(userHiers, field, dir)[0];
addNodesIfNot(copy3, [s, t], { order: 9999 });
addEdgeIfNot(copy3, t, s, {
dir: oppDir,
field: oppField,
implied: BC_I_REFLEXIVE
});
});
return copy3;
}
function addNodesIfNot(g, nodes, attr2 = { order: 9999 }) {
for (const node of nodes) {
g.updateNode(node, (exstantAttrs) => {
const extantOrder = exstantAttrs.order;
return {
...exstantAttrs,
order: extantOrder && extantOrder < 9999 ? extantOrder : attr2.order
};
});
}
}
function addEdgeIfNot(g, source, target, attr2) {
if (!g.hasEdge(source, target))
g.addEdge(source, target, attr2);
}
var getSinks = (g) => g.filterNodes((node) => g.hasNode(node) && !g.outDegree(node));
var getOutNeighbours = (g, node) => g.hasNode(node) ? g.outNeighbors(node) : [];
var getInNeighbours = (g, node) => g.hasNode(node) ? g.inNeighbors(node) : [];
function dfsAllPaths(g, start2) {
const queue = [{ node: start2, path: [] }];
const visited = {};
const allPaths = [];
let i = 0;
while (queue.length > 0 && i < 1e3) {
i++;
const { node, path: path2 } = queue.shift();
const extPath = [node, ...path2];
const succsNotVisited = g.hasNode(node) ? g.filterOutNeighbors(node, (succ) => !visited[succ] || visited[succ] < 5) : [];
const newItems = succsNotVisited.map((succ) => {
visited[succ] = visited[succ] ? visited[succ] + 1 : 1;
return { node: succ, path: extPath };
});
queue.unshift(...newItems);
if (!g.hasNode(node) || !g.outDegree(node))
allPaths.push(extPath);
}
return allPaths;
}
function bfsAllPaths(g, start2) {
const pathsArr = [];
const queue = [{ node: start2, path: [] }];
let i = 0;
while (queue.length !== 0 && i < 1e3) {
i++;
const { node, path: path2 } = queue.shift();
const extPath = [node, ...path2];
const succs = g.hasNode(node) ? g.filterOutNeighbors(node, (n) => !path2.includes(n)) : [];
for (const node2 of succs) {
queue.push({ node: node2, path: extPath });
}
if (!g.hasNode(node) || succs.length === 0) {
pathsArr.push(extPath);
}
}
pathsArr.forEach((path2) => {
if (path2.length)
path2.splice(path2.length - 1, 1);
});
(0, import_loglevel4.info)({ pathsArr });
return pathsArr;
}
function removeCycles(g, startNode) {
const copy3 = g.copy();
let prevNode = null;
(0, import_graphology_traversal.dfsFromNode)(copy3, startNode, (n) => {
copy3.forEachOutNeighbor(n, (t) => {
if (t === prevNode && copy3.hasEdge(t, prevNode)) {
try {
copy3.dropEdge(t, prevNode);
} catch (error6) {
console.error(t, prevNode, error6);
}
}
});
prevNode = n;
});
return copy3;
}
function buildObsGraph() {
const ObsG = new import_graphology.MultiGraph();
const { resolvedLinks, unresolvedLinks } = app.metadataCache;
for (const source in resolvedLinks) {
if (!source.endsWith(".md"))
continue;
const sourceBase = getBaseFromMDPath(source);
addNodesIfNot(ObsG, [sourceBase]);
for (const dest in resolvedLinks[source]) {
if (!dest.endsWith(".md"))
continue;
const destBase = getBaseFromMDPath(dest);
addNodesIfNot(ObsG, [destBase]);
ObsG.addEdge(sourceBase, destBase, { resolved: true });
}
}
for (const source in unresolvedLinks) {
const sourceBase = getBaseFromMDPath(source);
addNodesIfNot(ObsG, [sourceBase]);
for (const dest in unresolvedLinks[source]) {
const destBase = getBaseFromMDPath(dest);
addNodesIfNot(ObsG, [destBase]);
if (sourceBase === destBase)
continue;
ObsG.addEdge(sourceBase, destBase, { resolved: false });
}
}
(0, import_loglevel4.info)({ ObsG });
return ObsG;
}
function populateMain(settings, mainG, source, field, target, sourceOrder, targetOrder, fillOpp = false) {
const { userHiers } = settings;
const dir = getFieldInfo(userHiers, field).fieldDir;
addNodesIfNot(mainG, [source], {
order: sourceOrder
});
addNodesIfNot(mainG, [target], {
order: targetOrder
});
addEdgeIfNot(mainG, source, target, {
dir,
field
});
if (fillOpp) {
addEdgeIfNot(mainG, target, source, {
dir: getOppDir(dir),
field: getOppFields(userHiers, field, dir)[0]
});
}
}
var getTargetOrder = (frontms, target) => {
var _a, _b;
return parseInt((_b = (_a = frontms.find((ff) => {
var _a2;
return ((_a2 = ff == null ? void 0 : ff.file) == null ? void 0 : _a2.basename) === target;
})) == null ? void 0 : _a[BC_ORDER]) != null ? _b : "9999");
};
var getSourceOrder = (frontm) => {
var _a;
return parseInt((_a = frontm[BC_ORDER]) != null ? _a : "9999");
};
function getRealnImplied(plugin, currNode, dir = null) {
const realsnImplieds = blankRealNImplied();
const { settings, closedG } = plugin;
const { userHiers } = settings;
if (!closedG.hasNode(currNode))
return realsnImplieds;
closedG.forEachEdge(currNode, (k, a2, s, t) => {
const { field, dir: edgeDir, implied } = a2;
const oppField = getOppFields(userHiers, field, edgeDir)[0];
(dir ? [dir, getOppDir(dir)] : DIRECTIONS).forEach((currDir) => {
const oppDir = getOppDir(currDir);
if (s === currNode && (edgeDir === currDir || edgeDir === oppDir)) {
const arr = realsnImplieds[edgeDir].reals;
if (arr.findIndex((item) => item.to === t) === -1) {
arr.push({ to: t, field, implied });
}
} else if (edgeDir === currDir || edgeDir === oppDir) {
const arr = realsnImplieds[getOppDir(edgeDir)].implieds;
if (arr.findIndex((item) => item.to === s) === -1) {
arr.push({
to: s,
field: oppField,
implied
});
}
}
});
});
return realsnImplieds;
}
// src/AlternativeHierarchies/CSVCrumbs.ts
async function getCSVRows(plugin) {
const { CSVPaths } = plugin.settings;
const CSVRows = [];
if (CSVPaths === "")
return CSVRows;
const fullPath = (0, import_obsidian4.normalizePath)(CSVPaths);
const content = await app.vault.adapter.read(fullPath);
const lines = content.split("\n");
const headers = lines[0].split(",").map((head) => head.trim());
lines.slice(1).forEach((row) => {
const rowObj = {};
row.split(",").map((head) => dropWikilinks(head.trim())).forEach((item, i) => {
rowObj[headers[i]] = item;
});
(0, import_loglevel5.debug)({ rowObj });
CSVRows.push(rowObj);
});
return CSVRows;
}
function addCSVCrumbs(g, CSVRows, dir, field) {
CSVRows.forEach((row) => {
addNodesIfNot(g, [row.file]);
if (field === "" || !row[field])
return;
addNodesIfNot(g, [row[field]]);
addEdgeIfNot(g, row.file, row[field], { dir, field });
});
}
// src/AlternativeHierarchies/DataviewNotes.ts
var import_loglevel6 = __toESM(require_loglevel());
var import_obsidian5 = require("obsidian");
function addDataviewNotesToGraph(plugin, eligableAlts, frontms, mainG) {
const { settings } = plugin;
const { userHiers, dataviewNoteField } = settings;
const dv = getDVApi(plugin);
if (!dv && eligableAlts.length) {
new import_obsidian5.Notice(DATAVIEW_MISSING);
return;
}
const fields = getFields(userHiers);
eligableAlts.forEach((altFile) => {
var _a;
const basename = getDVBasename(altFile.file);
let query = altFile[BC_DV_NOTE];
if (query.hasOwnProperty("path")) {
query = `[[${query.path}]]`;
}
let field = (_a = altFile[BC_DV_NOTE_FIELD]) != null ? _a : dataviewNoteField || fields[0];
let targets = [];
try {
targets = dv.pages(query).values;
} catch (er) {
new import_obsidian5.Notice(`${query} is not a valid Dataview from-query`);
(0, import_loglevel6.warn)(er);
}
for (const target of targets) {
if (target[BC_IGNORE])
continue;
const targetBN = getDVBasename(target.file);
const sourceOrder = getSourceOrder(altFile);
const targetOrder = getTargetOrder(frontms, targetBN);
populateMain(settings, mainG, basename, field, targetBN, sourceOrder, targetOrder, true);
}
});
}
// src/AlternativeHierarchies/DateNotes.ts
var luxon = __toESM(require_luxon());
function addDateNotesToGraph(plugin, frontms, mainG) {
const { settings } = plugin;
const {
addDateNotes,
dateNoteAddMonth,
dateNoteAddYear,
dateNoteFormat,
dateNoteField
} = settings;
if (!addDateNotes)
return;
const { regex } = luxon.DateTime.fromFormatExplain("", dateNoteFormat);
frontms.forEach((page) => {
const { file } = page;
const { day } = file;
if (!day || !regex.test(getDVBasename(file)))
return;
const today = getDVBasename(file);
const tomorrow = day.plus({ days: 1 });
const tomStr = tomorrow.toFormat(dateNoteFormat);
populateMain(settings, mainG, today, dateNoteField, tomStr, 9999, 9999, true);
});
}
// src/AlternativeHierarchies/DendronNotes.ts
var getDendronParent = (dendron, splitter) => dendron.split(splitter).slice(0, -1).join(splitter);
function addDendronNotesToGraph(plugin, frontms, mainG) {
const { settings } = plugin;
const { addDendronNotes, dendronNoteDelimiter, dendronNoteField } = settings;
if (!addDendronNotes)
return;
for (const frontm of frontms) {
if (frontm[BC_IGNORE_DENDRON] || frontm[BC_IGNORE])
continue;
let curr = getDVBasename(frontm.file);
let parent = getDendronParent(curr, dendronNoteDelimiter);
while (parent !== "") {
const parentFile = frontms.find((fm) => getDVBasename(fm.file) === parent);
if (!parentFile || parentFile[BC_IGNORE_DENDRON] !== true) {
populateMain(settings, mainG, curr, dendronNoteField, parent, 9999, 9999, true);
}
curr = parent;
parent = getDendronParent(parent, dendronNoteDelimiter);
}
}
}
// src/AlternativeHierarchies/FolderNotes.ts
var import_obsidian6 = require("obsidian");
var getSubsFromFolder = (folder) => {
const otherNotes = [], subFolders = [];
folder.children.forEach((tAbstract) => {
if (tAbstract instanceof import_obsidian6.TFile)
otherNotes.push(tAbstract);
else
subFolders.push(tAbstract);
});
return { otherNotes, subFolders };
};
function addFolderNotesToGraph(plugin, folderNotes, frontms, mainG) {
const { settings } = plugin;
const { userHiers } = settings;
const fields = getFields(userHiers);
folderNotes.forEach((altFile) => {
const { file } = altFile;
const basename = getDVBasename(file);
const topFolderName = getFolderName(file);
const topFolder = app.vault.getAbstractFileByPath(topFolderName);
const targets = frontms.map((ff) => ff.file).filter((other) => getFolderName(other) === topFolderName && other.path !== file.path && !other[BC_IGNORE]).map(getDVBasename);
const field = altFile[BC_FOLDER_NOTE];
if (typeof field !== "string" || !fields.includes(field))
return;
targets.forEach((target) => {
const sourceOrder = getSourceOrder(altFile);
const targetOrder = getTargetOrder(frontms, basename);
populateMain(settings, mainG, basename, field, target, sourceOrder, targetOrder, true);
});
if (altFile[BC_FOLDER_NOTE_SUBFOLDERS]) {
const subfolderField = altFile[BC_FOLDER_NOTE_SUBFOLDERS];
if (typeof subfolderField !== "string" || !fields.includes(subfolderField))
return;
const { subFolders } = getSubsFromFolder(topFolder);
subFolders.forEach((subFolder) => {
subFolder.children.forEach((child) => {
if (child instanceof import_obsidian6.TFile) {
const childBasename = getDVBasename(child);
populateMain(settings, mainG, basename, subfolderField, childBasename, 9999, 9999, true);
}
});
});
}
if (altFile[BC_FOLDER_NOTE_RECURSIVE]) {
const { subFolders } = getSubsFromFolder(topFolder);
const folderQueue = [...subFolders];
let currFolder = folderQueue.shift();
while (currFolder !== void 0) {
const { otherNotes, subFolders: subFolders2 } = getSubsFromFolder(currFolder);
const folderNote = currFolder.name;
const targets2 = otherNotes.map(getDVBasename);
const sourceOrder = 9999;
const targetOrder = 9999;
const parentFolderNote = currFolder.parent.name;
populateMain(settings, mainG, parentFolderNote, field, folderNote, sourceOrder, targetOrder, true);
targets2.forEach((target) => {
if (target === folderNote)
return;
const sourceOrder2 = 9999;
const targetOrder2 = 9999;
populateMain(settings, mainG, folderNote, field, target, sourceOrder2, targetOrder2, true);
});
folderQueue.push(...subFolders2);
currFolder = folderQueue.shift();
}
}
});
}
// src/AlternativeHierarchies/HierarchyNotes/HierarchyNotes.ts
async function getHierarchyNoteItems(file) {
const { listItems } = app.metadataCache.getFileCache(file);
if (!listItems)
return [];
const basename = getDVBasename(file);
const { hierarchyNoteIsParent } = getSettings();
const lines = (await app.vault.cachedRead(file)).split("\n");
const hierarchyNoteItems = [];
const afterBulletReg = new RegExp(/\s*[+*-]\s(.*$)/);
const dropWikiLinksReg = new RegExp(/\[\[(.*?)\]\]/);
const fieldReg = new RegExp(/(.*?)\[\[.*?\]\]/);
for (const item of listItems) {
const line = lines[item.position.start.line];
const afterBulletCurr = afterBulletReg.exec(line)[1];
const note = dropWikiLinksReg.exec(afterBulletCurr)[1];
let field = fieldReg.exec(afterBulletCurr)[1].trim() || null;
const { parent } = item;
if (parent >= 0) {
const parentNote = lines[parent];
const afterBulletParent = afterBulletReg.exec(parentNote)[1];
const dropWikiParent = dropWikiLinksReg.exec(afterBulletParent)[1];
hierarchyNoteItems.push({
note,
parent: dropWikiParent,
field
});
} else {
hierarchyNoteItems.push({
note,
parent: hierarchyNoteIsParent ? basename : null,
field
});
}
}
return hierarchyNoteItems;
}
function addHNsToGraph(settings, hnArr, mainG) {
const { HNUpField, userHiers } = settings;
const upFields = getFields(userHiers, "up");
hnArr.forEach((hnItem, i) => {
var _a, _b;
const { note, field, parent } = hnItem;
const targetField = field != null ? field : HNUpField || upFields[0];
const dir = (_a = getFieldInfo(userHiers, targetField)) == null ? void 0 : _a.fieldDir;
const oppDir = getOppDir(dir);
const oppField = getOppFields(userHiers, targetField, dir)[0];
if (parent === null) {
const s = note;
const t = (_b = hnArr[i + 1]) == null ? void 0 : _b.note;
addNodesIfNot(mainG, [s, t]);
addEdgeIfNot(mainG, s, t, { dir: oppDir, field: oppField });
} else {
addNodesIfNot(mainG, [note, parent]);
if (settings.showUpInJuggl) {
addEdgeIfNot(mainG, note, parent, {
dir,
field: targetField
});
}
addEdgeIfNot(mainG, parent, note, {
dir: oppDir,
field: oppField
});
}
});
}
// src/AlternativeHierarchies/JugglLinks.ts
async function getJugglLinks(plugin, files) {
const { settings, db } = plugin;
db.start2G("getJugglLinks");
const { userHiers } = settings;
const typedLinksArr = await Promise.all(files.map(async (file) => {
var _a, _b;
const jugglLink = { file, links: [] };
const links = (_b = (_a = app.metadataCache.getFileCache(file)) == null ? void 0 : _a.links) != null ? _b : [];
const content = links.length ? await app.vault.cachedRead(file) : "";
const lines = content.split("\n");
links.forEach((link2) => {
var _a2, _b2, _c, _d, _e, _f, _g;
const lineNo = link2.position.start.line;
const line = lines[lineNo];
const linksInLine = (_c = (_b2 = (_a2 = line.match(splitLinksRegex)) == null ? void 0 : _a2.map((link3) => link3.slice(2, link3.length - 2))) == null ? void 0 : _b2.map((innerText) => innerText.split("|")[0])) != null ? _c : [];
const typedLinkPrefix = (_e = (_d = app.plugins.plugins.juggl) == null ? void 0 : _d.settings.typedLinkPrefix) != null ? _e : "-";
const parsedLinks = parseTypedLink(link2, line, typedLinkPrefix);
const field = (_g = (_f = parsedLinks == null ? void 0 : parsedLinks.properties) == null ? void 0 : _f.type) != null ? _g : "";
if (field === "")
return;
const { fieldDir } = getFieldInfo(userHiers, field) || {};
if (!fieldDir)
return;
jugglLink.links.push({
dir: fieldDir,
field,
linksInLine
});
});
return jugglLink;
}));
const allFields = getFields(userHiers);
const filteredLinks = typedLinksArr.map((jugglLink) => {
jugglLink.links = jugglLink.links.filter((link2) => allFields.includes(link2.field));
return jugglLink;
});
db.end2G({ filteredLinks });
return filteredLinks;
}
function addJugglLinksToGraph(settings, jugglLinks, frontms, mainG) {
jugglLinks.forEach((jugglLink) => {
const { basename } = jugglLink.file;
jugglLink.links.forEach((link2) => {
const { dir, field, linksInLine } = link2;
if (dir === "")
return;
const sourceOrder = getTargetOrder(frontms, basename);
linksInLine.forEach((linkInLine) => {
const targetsOrder = getTargetOrder(frontms, linkInLine);
populateMain(settings, mainG, basename, field, linkInLine, sourceOrder, targetsOrder);
});
});
});
}
// src/AlternativeHierarchies/LinkNotes.ts
function addLinkNotesToGraph(plugin, eligableAlts, frontms, mainG) {
const { settings } = plugin;
const { userHiers } = settings;
const fields = getFields(userHiers);
eligableAlts.forEach((altFile) => {
var _a, _b, _c, _d;
const linkNoteFile = altFile.file;
const linkNoteBasename = getDVBasename(linkNoteFile);
let field = altFile[BC_LINK_NOTE];
if (typeof field !== "string" || !fields.includes(field))
return;
const links = (_b = (_a = app.metadataCache.getFileCache(linkNoteFile)) == null ? void 0 : _a.links) == null ? void 0 : _b.map((l) => l.link.match(/[^#|]+/)[0]);
const embeds = (_d = (_c = app.metadataCache.getFileCache(linkNoteFile)) == null ? void 0 : _c.embeds) == null ? void 0 : _d.map((l) => l.link.match(/[^#|]+/)[0]);
const targets = [...links != null ? links : [], ...embeds != null ? embeds : []];
for (const target of targets) {
const sourceOrder = getSourceOrder(altFile);
const targetOrder = getTargetOrder(frontms, linkNoteBasename);
populateMain(settings, mainG, linkNoteBasename, field, target, sourceOrder, targetOrder, true);
}
});
}
// src/AlternativeHierarchies/RegexNotes.ts
var import_loglevel7 = __toESM(require_loglevel());
function addRegexNotesToGraph(plugin, eligableAlts, frontms, mainG) {
const { settings } = plugin;
const { userHiers, regexNoteField } = settings;
const fields = getFields(userHiers);
eligableAlts.forEach((altFile) => {
const regexNoteFile = altFile.file;
const regexNoteBasename = getDVBasename(regexNoteFile);
const regex = strToRegex(altFile[BC_REGEX_NOTE]);
(0, import_loglevel7.info)({ regex });
let field = altFile[BC_REGEX_NOTE_FIELD];
if (typeof field !== "string" || !fields.includes(field))
field = regexNoteField || fields[0];
const targets = [];
frontms.forEach((page) => {
if (page[BC_IGNORE])
return;
const basename = getDVBasename(page.file);
if (basename !== regexNoteBasename && regex.test(basename))
targets.push(basename);
});
for (const target of targets) {
const sourceOrder = getSourceOrder(altFile);
const targetOrder = getTargetOrder(frontms, regexNoteBasename);
populateMain(settings, mainG, regexNoteBasename, field, target, sourceOrder, targetOrder, true);
}
});
}
// src/AlternativeHierarchies/TagNotes.ts
var import_loglevel8 = __toESM(require_loglevel());
var getAllTags = (file, withHash = true) => {
var _a, _b;
const { tags, frontmatter } = app.metadataCache.getFileCache(file);
const allTags = [];
tags == null ? void 0 : tags.forEach((t) => allTags.push(dropHash(t.tag)));
[(_a = frontmatter == null ? void 0 : frontmatter.tags) != null ? _a : []].flat().forEach((t) => {
splitAndTrim(t).forEach((innerT) => allTags.push(dropHash(innerT)));
});
[(_b = frontmatter == null ? void 0 : frontmatter.tag) != null ? _b : []].flat().forEach((t) => {
splitAndTrim(t).forEach((innerT) => allTags.push(dropHash(innerT)));
});
return allTags.map((t) => (withHash ? "#" : "") + t.toLowerCase());
};
function addTagNotesToGraph(plugin, eligableAlts, frontms, mainG) {
const { settings } = plugin;
const { userHiers, tagNoteField } = settings;
const fields = getFields(userHiers);
eligableAlts.forEach((altFile) => {
var _a;
const tagNoteFile = altFile.file;
const tagNoteBasename = getDVBasename(tagNoteFile);
const tag = addHash(altFile[BC_TAG_NOTE].trim().toLowerCase());
(0, import_loglevel8.info)({ tag });
const hasThisTag = (file) => {
const allTags = getAllTags(file);
return altFile[BC_TAG_NOTE_EXACT] !== void 0 ? allTags.includes(tag) : allTags.some((t) => t.includes(tag));
};
const targets = frontms.map((ff) => ff.file).filter((file) => file.path !== tagNoteFile.path && hasThisTag(file) && !file[BC_IGNORE]).map(getDVBasename);
(0, import_loglevel8.info)({ targets });
let field = (_a = altFile[BC_TAG_NOTE_FIELD]) != null ? _a : tagNoteField || fields[0];
targets.forEach((target) => {
const sourceOrder = getSourceOrder(altFile);
const targetOrder = getTargetOrder(frontms, tagNoteBasename);
populateMain(settings, mainG, tagNoteBasename, field, target, sourceOrder, targetOrder, true);
});
});
}
// src/AlternativeHierarchies/TraverseNotes.ts
var import_loglevel9 = __toESM(require_loglevel());
function addTraverseNotesToGraph(plugin, traverseNotes, mainG, obsG) {
const { settings } = plugin;
const { userHiers } = settings;
const fields = getFields(userHiers);
traverseNotes.forEach((altFile) => {
const { file } = altFile;
const basename = getDVBasename(file);
const noCycles = removeCycles(obsG, basename);
let field = altFile[BC_TRAVERSE_NOTE];
if (typeof field !== "string" || !fields.includes(field))
return;
const allPaths = dfsAllPaths(noCycles, basename);
(0, import_loglevel9.info)(allPaths);
const reversed = [...allPaths].map((path2) => path2.reverse());
reversed.forEach((path2) => {
path2.forEach((node, i) => {
const next = path2[i + 1];
if (next === void 0)
return;
populateMain(settings, mainG, node, field, next, 9999, 9999, true);
});
});
});
}
// src/Relations.ts
function addSiblingsFromSameParent(g, settings) {
const { userHiers, treatCurrNodeAsImpliedSibling } = settings;
g.forEachNode((currN, a2) => {
g.forEachOutEdge(currN, (k, currNAttr, s, parentNode) => {
var _a;
if (currNAttr.dir !== "up")
return;
const { fieldDir, fieldHier } = getFieldInfo(userHiers, currNAttr.field);
const field = (_a = fieldHier.same[0]) != null ? _a : fallbackField(currNAttr.field, fieldDir);
g.forEachOutEdge(parentNode, (k2, a3, s2, impliedSibling) => {
if (a3.dir !== "down" || !treatCurrNodeAsImpliedSibling && impliedSibling === currN)
return;
addEdgeIfNot(g, currN, impliedSibling, {
dir: "same",
field,
implied: BC_I_SIBLING_1
});
});
});
});
}
function addSiblingsParentIsParent(g) {
g.forEachNode((currN, a2) => {
g.forEachOutEdge(currN, (k, currNAttr, s, sibling) => {
if (currNAttr.dir !== "same")
return;
g.forEachOutEdge(sibling, (k2, a3, s2, parent) => {
const { dir, field } = a3;
if (dir !== "up")
return;
addEdgeIfNot(g, currN, parent, {
dir: "up",
field,
implied: BC_I_PARENT
});
});
});
});
}
function addAuntsUncles(g) {
g.forEachNode((currN, a2) => {
g.forEachOutEdge(currN, (k, currEAttr, s, parentNode) => {
if (currEAttr.dir !== "up")
return;
g.forEachOutEdge(parentNode, (k2, a3, s2, uncle) => {
if (a3.dir !== "same")
return;
addEdgeIfNot(g, currN, uncle, {
dir: "up",
field: currEAttr.field,
implied: BC_I_AUNT
});
});
});
});
}
function addCousins(g) {
g.forEachNode((currN, a2) => {
g.forEachOutEdge(currN, (k, currEAttr, s, parentNode) => {
if (currEAttr.dir !== "up")
return;
g.forEachOutEdge(parentNode, (k2, parentSiblingAttr, s2, uncle) => {
if (parentSiblingAttr.dir !== "same")
return;
g.forEachOutEdge(uncle, (k3, a3, s3, cousin) => {
if (a3.dir !== "down" || currN === cousin)
return;
addEdgeIfNot(g, currN, cousin, {
dir: "same",
field: parentSiblingAttr.field,
implied: BC_I_COUSIN
});
});
});
});
});
}
function addStructuralEquivalenceSiblings(g) {
g.forEachNode((currN, a2) => {
g.forEachInEdge(currN, (k, aSis, sis, _) => {
if (aSis.dir !== "same")
return;
g.forEachInEdge(currN, (k2, aBro, bro, _2) => {
if (aBro.dir !== "same" || sis === bro)
return;
if (aBro.field === aSis.field) {
addEdgeIfNot(g, sis, bro, {
dir: "same",
field: aBro.field,
implied: BC_I_SIBLING_2
});
}
});
});
});
}
// src/Views/TrailView.ts
var import_loglevel12 = __toESM(require_loglevel());
var import_obsidian8 = require("obsidian");
// src/Components/NextPrev.svelte
function add_css(target) {
append_styles(target, "svelte-11g23nm", ".BC-nexts.svelte-11g23nm div.svelte-11g23nm{text-align:right}.BC-nexts.svelte-11g23nm.svelte-11g23nm{border-left:1px solid var(--background-modifier-border)}.BC-prevs.svelte-11g23nm.svelte-11g23nm{border-right:1px solid var(--background-modifier-border)}.BC-NextPrev-Container.svelte-11g23nm.svelte-11g23nm{display:grid;grid-template-columns:1fr 1fr}");
}
function get_each_context(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[8] = list[i].field;
child_ctx[9] = list[i].real;
child_ctx[10] = list[i].to;
return child_ctx;
}
function get_each_context_1(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[8] = list[i].field;
child_ctx[9] = list[i].real;
child_ctx[10] = list[i].to;
return child_ctx;
}
function create_each_block_1(ctx) {
let div;
let strong;
let t0_value = ctx[8] + "";
let t0;
let t1;
let t2_value = ctx[10] + "";
let t2;
let t3;
let div_class_value;
let mounted;
let dispose;
function click_handler(...args) {
return ctx[4](ctx[10], ...args);
}
function mouseover_handler(...args) {
return ctx[5](ctx[10], ...args);
}
return {
c() {
div = element("div");
strong = element("strong");
t0 = text(t0_value);
t1 = space();
t2 = text(t2_value);
t3 = space();
attr(div, "class", div_class_value = linkClass(ctx[10], ctx[9]) + " BC-prev svelte-11g23nm");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, strong);
append(strong, t0);
append(div, t1);
append(div, t2);
append(div, t3);
if (!mounted) {
dispose = [
listen(div, "click", click_handler),
listen(div, "mouseover", mouseover_handler)
];
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if (dirty & 2 && t0_value !== (t0_value = ctx[8] + ""))
set_data(t0, t0_value);
if (dirty & 2 && t2_value !== (t2_value = ctx[10] + ""))
set_data(t2, t2_value);
if (dirty & 2 && div_class_value !== (div_class_value = linkClass(ctx[10], ctx[9]) + " BC-prev svelte-11g23nm")) {
attr(div, "class", div_class_value);
}
},
d(detaching) {
if (detaching)
detach(div);
mounted = false;
run_all(dispose);
}
};
}
function create_each_block(ctx) {
let div;
let t0_value = ctx[10] + "";
let t0;
let t1;
let strong;
let t2_value = ctx[8] + "";
let t2;
let t3;
let div_class_value;
let mounted;
let dispose;
function click_handler_1(...args) {
return ctx[6](ctx[10], ...args);
}
function mouseover_handler_1(...args) {
return ctx[7](ctx[10], ...args);
}
return {
c() {
div = element("div");
t0 = text(t0_value);
t1 = space();
strong = element("strong");
t2 = text(t2_value);
t3 = space();
attr(div, "class", div_class_value = linkClass(ctx[10], ctx[9]) + " BC-next svelte-11g23nm");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, t0);
append(div, t1);
append(div, strong);
append(strong, t2);
append(div, t3);
if (!mounted) {
dispose = [
listen(div, "click", click_handler_1),
listen(div, "mouseover", mouseover_handler_1)
];
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if (dirty & 1 && t0_value !== (t0_value = ctx[10] + ""))
set_data(t0, t0_value);
if (dirty & 1 && t2_value !== (t2_value = ctx[8] + ""))
set_data(t2, t2_value);
if (dirty & 1 && div_class_value !== (div_class_value = linkClass(ctx[10], ctx[9]) + " BC-next svelte-11g23nm")) {
attr(div, "class", div_class_value);
}
},
d(detaching) {
if (detaching)
detach(div);
mounted = false;
run_all(dispose);
}
};
}
function create_fragment(ctx) {
let div2;
let div0;
let span0;
let t;
let div1;
let span1;
let each_value_1 = ctx[1];
let each_blocks_1 = [];
for (let i = 0; i < each_value_1.length; i += 1) {
each_blocks_1[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i));
}
let each_value = ctx[0];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i));
}
return {
c() {
div2 = element("div");
div0 = element("div");
span0 = element("span");
for (let i = 0; i < each_blocks_1.length; i += 1) {
each_blocks_1[i].c();
}
t = space();
div1 = element("div");
span1 = element("span");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(div0, "class", "BC-prevs svelte-11g23nm");
attr(div1, "class", "BC-nexts svelte-11g23nm");
attr(div2, "class", "BC-NextPrev-Container svelte-11g23nm");
},
m(target, anchor) {
insert(target, div2, anchor);
append(div2, div0);
append(div0, span0);
for (let i = 0; i < each_blocks_1.length; i += 1) {
each_blocks_1[i].m(span0, null);
}
append(div2, t);
append(div2, div1);
append(div1, span1);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(span1, null);
}
},
p(ctx2, [dirty]) {
if (dirty & 6) {
each_value_1 = ctx2[1];
let i;
for (i = 0; i < each_value_1.length; i += 1) {
const child_ctx = get_each_context_1(ctx2, each_value_1, i);
if (each_blocks_1[i]) {
each_blocks_1[i].p(child_ctx, dirty);
} else {
each_blocks_1[i] = create_each_block_1(child_ctx);
each_blocks_1[i].c();
each_blocks_1[i].m(span0, null);
}
}
for (; i < each_blocks_1.length; i += 1) {
each_blocks_1[i].d(1);
}
each_blocks_1.length = each_value_1.length;
}
if (dirty & 5) {
each_value = ctx2[0];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block(child_ctx);
each_blocks[i].c();
each_blocks[i].m(span1, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(div2);
destroy_each(each_blocks_1, detaching);
destroy_each(each_blocks, detaching);
}
};
}
function instance($$self, $$props, $$invalidate) {
let { plugin } = $$props;
let { next } = $$props;
let { prev } = $$props;
const activeLeafView = app.workspace.activeLeaf.view;
const click_handler = async (to, e) => await openOrSwitch(to, e);
const mouseover_handler = (to, e) => hoverPreview(e, activeLeafView, to);
const click_handler_1 = async (to, e) => await openOrSwitch(to, e);
const mouseover_handler_1 = (to, e) => hoverPreview(e, activeLeafView, to);
$$self.$$set = ($$props2) => {
if ("plugin" in $$props2)
$$invalidate(3, plugin = $$props2.plugin);
if ("next" in $$props2)
$$invalidate(0, next = $$props2.next);
if ("prev" in $$props2)
$$invalidate(1, prev = $$props2.prev);
};
return [
next,
prev,
activeLeafView,
plugin,
click_handler,
mouseover_handler,
click_handler_1,
mouseover_handler_1
];
}
var NextPrev = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance, create_fragment, safe_not_equal, { plugin: 3, next: 0, prev: 1 }, add_css);
}
};
var NextPrev_default = NextPrev;
// src/Components/TrailGrid.svelte
function add_css2(target) {
append_styles(target, "svelte-dgw0hd", "div.BC-grid-wrapper.svelte-dgw0hd.svelte-dgw0hd{position:relative}div.BC-trail-grid.svelte-dgw0hd.svelte-dgw0hd{border:2px solid var(--background-modifier-border);display:grid;align-items:stretch;width:auto;height:auto}.BC-grid-options.svelte-dgw0hd.svelte-dgw0hd{position:absolute;top:0px;right:0px;height:35px;width:32px;border:1px solid var(--background-modifier-border);border-radius:10px;text-align:center;transition:width 0.3s;overflow-wrap:normal;overflow:hidden}div.BC-grid-options.svelte-dgw0hd.svelte-dgw0hd:hover{padding:5px;width:fit-content}div.BC-grid-options.svelte-dgw0hd:hover .BC-grid-options-icon.svelte-dgw0hd{display:none}.BC-grid-options-options.svelte-dgw0hd.svelte-dgw0hd{display:none}div.BC-grid-options.svelte-dgw0hd:hover .BC-grid-options-options.svelte-dgw0hd{display:unset}.BC-depth-button.svelte-dgw0hd.svelte-dgw0hd{padding:3px 5px}div.BC-trail-grid-item.svelte-dgw0hd.svelte-dgw0hd{display:flex;flex-direction:column;border:1px solid var(--background-modifier-border);align-items:center;justify-content:center;padding:2px;font-size:smaller}div.BC-trail-grid-item.BC-filler.svelte-dgw0hd.svelte-dgw0hd{opacity:0.7}");
}
function get_each_context2(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[15] = list[i];
child_ctx[17] = i;
return child_ctx;
}
function get_each_context_12(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[18] = list[i].value;
child_ctx[19] = list[i].first;
child_ctx[20] = list[i].last;
return child_ctx;
}
function create_each_block_12(ctx) {
var _a;
let div1;
let div0;
let t0_value = ((_a = getAlt(ctx[18], ctx[0])) != null ? _a : dropDendron(ctx[18], ctx[5])) + "";
let t0;
let div0_class_value;
let t1;
let div1_class_value;
let mounted;
let dispose;
function click_handler(...args) {
return ctx[10](ctx[18], ...args);
}
function mouseover_handler(...args) {
return ctx[11](ctx[18], ...args);
}
return {
c() {
div1 = element("div");
div0 = element("div");
t0 = text(t0_value);
t1 = space();
attr(div0, "class", div0_class_value = null_to_empty(linkClass(ctx[18])) + " svelte-dgw0hd");
attr(div1, "class", div1_class_value = "BC-trail-grid-item " + (ctx[18] === "" ? "BC-filler" : "") + " svelte-dgw0hd");
set_style(div1, "grid-area", ctx[19] + 1 + " / " + (ctx[17] + 1) + " / " + (ctx[20] + 2) + " / " + (ctx[17] + 2));
},
m(target, anchor) {
insert(target, div1, anchor);
append(div1, div0);
append(div0, t0);
append(div1, t1);
if (!mounted) {
dispose = [
listen(div1, "click", click_handler),
listen(div1, "mouseover", mouseover_handler)
];
mounted = true;
}
},
p(new_ctx, dirty) {
var _a2;
ctx = new_ctx;
if (dirty & 17 && t0_value !== (t0_value = ((_a2 = getAlt(ctx[18], ctx[0])) != null ? _a2 : dropDendron(ctx[18], ctx[5])) + ""))
set_data(t0, t0_value);
if (dirty & 16 && div0_class_value !== (div0_class_value = null_to_empty(linkClass(ctx[18])) + " svelte-dgw0hd")) {
attr(div0, "class", div0_class_value);
}
if (dirty & 16 && div1_class_value !== (div1_class_value = "BC-trail-grid-item " + (ctx[18] === "" ? "BC-filler" : "") + " svelte-dgw0hd")) {
attr(div1, "class", div1_class_value);
}
if (dirty & 16) {
set_style(div1, "grid-area", ctx[19] + 1 + " / " + (ctx[17] + 1) + " / " + (ctx[20] + 2) + " / " + (ctx[17] + 2));
}
},
d(detaching) {
if (detaching)
detach(div1);
mounted = false;
run_all(dispose);
}
};
}
function create_each_block2(ctx) {
let each_1_anchor;
let each_value_1 = ctx[4][ctx[17]];
let each_blocks = [];
for (let i = 0; i < each_value_1.length; i += 1) {
each_blocks[i] = create_each_block_12(get_each_context_12(ctx, each_value_1, i));
}
return {
c() {
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
each_1_anchor = empty();
},
m(target, anchor) {
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(target, anchor);
}
insert(target, each_1_anchor, anchor);
},
p(ctx2, dirty) {
if (dirty & 113) {
each_value_1 = ctx2[4][ctx2[17]];
let i;
for (i = 0; i < each_value_1.length; i += 1) {
const child_ctx = get_each_context_12(ctx2, each_value_1, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block_12(child_ctx);
each_blocks[i].c();
each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value_1.length;
}
},
d(detaching) {
destroy_each(each_blocks, detaching);
if (detaching)
detach(each_1_anchor);
}
};
}
function create_fragment2(ctx) {
let div2;
let div0;
let t0;
let div1;
let span3;
let span0;
let t2;
let span2;
let button0;
let t3;
let button0_disabled_value;
let t4;
let span1;
let t5;
let t6;
let button1;
let t7;
let button1_disabled_value;
let mounted;
let dispose;
let each_value = ctx[3];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block2(get_each_context2(ctx, each_value, i));
}
return {
c() {
div2 = element("div");
div0 = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
t0 = space();
div1 = element("div");
span3 = element("span");
span0 = element("span");
span0.textContent = "\u2699\uFE0F";
t2 = space();
span2 = element("span");
button0 = element("button");
t3 = text("-");
t4 = space();
span1 = element("span");
t5 = text(ctx[1]);
t6 = space();
button1 = element("button");
t7 = text("+");
attr(div0, "class", "BC-trail-grid svelte-dgw0hd");
set_style(div0, "grid-template-columns", "1fr ".repeat(ctx[3].length));
set_style(div0, "grid-template-rows", "1fr ".repeat(ctx[2].length));
attr(span0, "class", "BC-grid-options-icon svelte-dgw0hd");
attr(button0, "class", "BC-depth-button svelte-dgw0hd");
button0.disabled = button0_disabled_value = ctx[1] === 1;
attr(span1, "class", "tree-item-flair");
attr(button1, "class", "BC-depth-button svelte-dgw0hd");
button1.disabled = button1_disabled_value = ctx[1] === ctx[7];
attr(span2, "class", "BC-grid-options-options svelte-dgw0hd");
attr(div1, "class", "BC-grid-options svelte-dgw0hd");
attr(div2, "class", "BC-grid-wrapper svelte-dgw0hd");
},
m(target, anchor) {
insert(target, div2, anchor);
append(div2, div0);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div0, null);
}
append(div2, t0);
append(div2, div1);
append(div1, span3);
append(span3, span0);
append(span3, t2);
append(span3, span2);
append(span2, button0);
append(button0, t3);
append(span2, t4);
append(span2, span1);
append(span1, t5);
append(span2, t6);
append(span2, button1);
append(button1, t7);
if (!mounted) {
dispose = [
listen(button0, "click", ctx[12]),
listen(button1, "click", ctx[13])
];
mounted = true;
}
},
p(ctx2, [dirty]) {
if (dirty & 121) {
each_value = ctx2[3];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context2(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block2(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div0, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
if (dirty & 8) {
set_style(div0, "grid-template-columns", "1fr ".repeat(ctx2[3].length));
}
if (dirty & 4) {
set_style(div0, "grid-template-rows", "1fr ".repeat(ctx2[2].length));
}
if (dirty & 2 && button0_disabled_value !== (button0_disabled_value = ctx2[1] === 1)) {
button0.disabled = button0_disabled_value;
}
if (dirty & 2)
set_data(t5, ctx2[1]);
if (dirty & 2 && button1_disabled_value !== (button1_disabled_value = ctx2[1] === ctx2[7])) {
button1.disabled = button1_disabled_value;
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(div2);
destroy_each(each_blocks, detaching);
mounted = false;
run_all(dispose);
}
};
}
function instance2($$self, $$props, $$invalidate) {
let paddedTrails;
let transposedTrails;
let allRuns;
let { sortedTrails } = $$props;
let { plugin } = $$props;
const { settings } = plugin;
const { gridDefaultDepth } = settings;
const activeLeafView = app.workspace.activeLeaf.view;
const maxLength = sortedTrails.last().length;
let depth = Math.min(maxLength, gridDefaultDepth);
let slicedTrails = sortedTrails;
const click_handler = async (value, e) => await openOrSwitch(value, e);
const mouseover_handler = (value, e) => hoverPreview(e, activeLeafView, value);
const click_handler_1 = () => $$invalidate(1, depth -= 1);
const click_handler_2 = () => $$invalidate(1, depth += 1);
$$self.$$set = ($$props2) => {
if ("sortedTrails" in $$props2)
$$invalidate(8, sortedTrails = $$props2.sortedTrails);
if ("plugin" in $$props2)
$$invalidate(0, plugin = $$props2.plugin);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & 262) {
$: {
$$invalidate(2, slicedTrails = []);
sortedTrails.forEach((trail) => {
const slice2 = trail.slice(maxLength - depth);
if (slice2.length)
slicedTrails.push(slice2);
});
}
}
if ($$self.$$.dirty & 6) {
$:
$$invalidate(9, paddedTrails = slicedTrails.map((trail) => padArray(trail, depth)));
}
if ($$self.$$.dirty & 512) {
$:
$$invalidate(3, transposedTrails = transpose(paddedTrails));
}
if ($$self.$$.dirty & 8) {
$:
$$invalidate(4, allRuns = transposedTrails.map(runs));
}
};
return [
plugin,
depth,
slicedTrails,
transposedTrails,
allRuns,
settings,
activeLeafView,
maxLength,
sortedTrails,
paddedTrails,
click_handler,
mouseover_handler,
click_handler_1,
click_handler_2
];
}
var TrailGrid = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance2, create_fragment2, safe_not_equal, { sortedTrails: 8, plugin: 0 }, add_css2);
}
};
var TrailGrid_default = TrailGrid;
// src/Components/TrailPath.svelte
function add_css3(target) {
append_styles(target, "svelte-3c1frp", "span.BC-trail-path-container.svelte-3c1frp{display:flex;justify-content:space-between}");
}
function get_each_context3(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[13] = list[i];
return child_ctx;
}
function get_each_context_13(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[16] = list[i];
child_ctx[18] = i;
return child_ctx;
}
function create_else_block(ctx) {
let each_1_anchor;
let each_value_1 = ctx[13];
let each_blocks = [];
for (let i = 0; i < each_value_1.length; i += 1) {
each_blocks[i] = create_each_block_13(get_each_context_13(ctx, each_value_1, i));
}
return {
c() {
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
each_1_anchor = empty();
},
m(target, anchor) {
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(target, anchor);
}
insert(target, each_1_anchor, anchor);
},
p(ctx2, dirty) {
if (dirty & 186) {
each_value_1 = ctx2[13];
let i;
for (i = 0; i < each_value_1.length; i += 1) {
const child_ctx = get_each_context_13(ctx2, each_value_1, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block_13(child_ctx);
each_blocks[i].c();
each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value_1.length;
}
},
d(detaching) {
destroy_each(each_blocks, detaching);
if (detaching)
detach(each_1_anchor);
}
};
}
function create_if_block_1(ctx) {
let span;
return {
c() {
span = element("span");
span.textContent = `${ctx[6]}`;
attr(span, "class", "BC-empty-trail");
},
m(target, anchor) {
insert(target, span, anchor);
},
p: noop,
d(detaching) {
if (detaching)
detach(span);
}
};
}
function create_if_block_2(ctx) {
let span;
return {
c() {
span = element("span");
span.textContent = `${" " + ctx[7] + " "}`;
attr(span, "class", "BC-trail-sep");
},
m(target, anchor) {
insert(target, span, anchor);
},
p: noop,
d(detaching) {
if (detaching)
detach(span);
}
};
}
function create_each_block_13(ctx) {
var _a;
let span;
let t0_value = ((_a = getAlt(ctx[16], ctx[1])) != null ? _a : dropDendron(ctx[16], ctx[4])) + "";
let t0;
let t1;
let if_block_anchor;
let mounted;
let dispose;
function click_handler(...args) {
return ctx[8](ctx[16], ...args);
}
function mouseover_handler(...args) {
return ctx[9](ctx[16], ...args);
}
let if_block = ctx[18] < ctx[13].length - 1 && create_if_block_2(ctx);
return {
c() {
span = element("span");
t0 = text(t0_value);
t1 = space();
if (if_block)
if_block.c();
if_block_anchor = empty();
attr(span, "class", "internal-link BC-Link");
},
m(target, anchor) {
insert(target, span, anchor);
append(span, t0);
insert(target, t1, anchor);
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
if (!mounted) {
dispose = [
listen(span, "click", click_handler),
listen(span, "mouseover", mouseover_handler)
];
mounted = true;
}
},
p(new_ctx, dirty) {
var _a2;
ctx = new_ctx;
if (dirty & 10 && t0_value !== (t0_value = ((_a2 = getAlt(ctx[16], ctx[1])) != null ? _a2 : dropDendron(ctx[16], ctx[4])) + ""))
set_data(t0, t0_value);
if (ctx[18] < ctx[13].length - 1) {
if (if_block) {
if_block.p(ctx, dirty);
} else {
if_block = create_if_block_2(ctx);
if_block.c();
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
},
d(detaching) {
if (detaching)
detach(span);
if (detaching)
detach(t1);
if (if_block)
if_block.d(detaching);
if (detaching)
detach(if_block_anchor);
mounted = false;
run_all(dispose);
}
};
}
function create_each_block3(ctx) {
let div;
let t;
function select_block_type(ctx2, dirty) {
if (!ctx2[13].length)
return create_if_block_1;
return create_else_block;
}
let current_block_type = select_block_type(ctx, -1);
let if_block = current_block_type(ctx);
return {
c() {
div = element("div");
if_block.c();
t = space();
},
m(target, anchor) {
insert(target, div, anchor);
if_block.m(div, null);
append(div, t);
},
p(ctx2, dirty) {
if (current_block_type === (current_block_type = select_block_type(ctx2, dirty)) && if_block) {
if_block.p(ctx2, dirty);
} else {
if_block.d(1);
if_block = current_block_type(ctx2);
if (if_block) {
if_block.c();
if_block.m(div, t);
}
}
},
d(detaching) {
if (detaching)
detach(div);
if_block.d();
}
};
}
function create_if_block(ctx) {
let div;
let button;
let t;
let mounted;
let dispose;
return {
c() {
div = element("div");
button = element("button");
t = text(ctx[2]);
attr(button, "class", "button-div");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, button);
append(button, t);
if (!mounted) {
dispose = [
listen(button, "click", ctx[10]),
listen(button, "contextmenu", ctx[11])
];
mounted = true;
}
},
p(ctx2, dirty) {
if (dirty & 4)
set_data(t, ctx2[2]);
},
d(detaching) {
if (detaching)
detach(div);
mounted = false;
run_all(dispose);
}
};
}
function create_fragment3(ctx) {
let span;
let div;
let t;
let each_value = ctx[3];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block3(get_each_context3(ctx, each_value, i));
}
let if_block = ctx[0].length > 1 && create_if_block(ctx);
return {
c() {
span = element("span");
div = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
t = space();
if (if_block)
if_block.c();
attr(div, "class", "trails-div");
attr(span, "class", "BC-trail-path-container svelte-3c1frp");
},
m(target, anchor) {
insert(target, span, anchor);
append(span, div);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div, null);
}
append(span, t);
if (if_block)
if_block.m(span, null);
},
p(ctx2, [dirty]) {
if (dirty & 250) {
each_value = ctx2[3];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context3(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block3(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
if (ctx2[0].length > 1) {
if (if_block) {
if_block.p(ctx2, dirty);
} else {
if_block = create_if_block(ctx2);
if_block.c();
if_block.m(span, null);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(span);
destroy_each(each_blocks, detaching);
if (if_block)
if_block.d();
}
};
}
function instance3($$self, $$props, $$invalidate) {
let trailsToShow;
let { sortedTrails } = $$props;
let { plugin } = $$props;
const { settings } = plugin;
const { view } = app.workspace.activeLeaf;
let { showAll, noPathMessage, trailSeperator } = settings;
let trail_length = showAll;
const click_handler = async (crumb, e) => await openOrSwitch(crumb, e);
const mouseover_handler = (crumb, e) => hoverPreview(e, view, crumb);
const click_handler_1 = () => $$invalidate(2, trail_length = getTrailLength(trail_length));
const contextmenu_handler = (e) => {
e.preventDefault();
$$invalidate(2, trail_length = getTrailLength(trail_length, -1));
};
$$self.$$set = ($$props2) => {
if ("sortedTrails" in $$props2)
$$invalidate(0, sortedTrails = $$props2.sortedTrails);
if ("plugin" in $$props2)
$$invalidate(1, plugin = $$props2.plugin);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & 5) {
$:
$$invalidate(3, trailsToShow = trail_length == "All" ? sortedTrails : trail_length == "Shortest" ? [sortedTrails[0]] : [sortedTrails.last()]);
}
};
return [
sortedTrails,
plugin,
trail_length,
trailsToShow,
settings,
view,
noPathMessage,
trailSeperator,
click_handler,
mouseover_handler,
click_handler_1,
contextmenu_handler
];
}
var TrailPath = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance3, create_fragment3, safe_not_equal, { sortedTrails: 0, plugin: 1 }, add_css3);
}
};
var TrailPath_default = TrailPath;
// src/Visualisations/Juggl.ts
var import_loglevel11 = __toESM(require_loglevel());
var import_obsidian7 = require("obsidian");
// src/Commands/CreateIndex.ts
var import_lodash = __toESM(require_lodash());
var import_loglevel10 = __toESM(require_loglevel());
function addAliasesToIndex(plugin, index2) {
var _a, _b, _c, _d;
const { aliasesInIndex } = plugin.settings;
const lines = index2.slice().split("\n");
if (aliasesInIndex) {
for (let line of lines) {
const [indent, ...content] = line.split("- ");
const note = content.join("- ");
if (!note)
continue;
const currFile = app.metadataCache.getFirstLinkpathDest(note, "");
if (currFile !== null) {
const cache = app.metadataCache.getFileCache(currFile);
const alias = (_b = (_a = cache == null ? void 0 : cache.frontmatter) == null ? void 0 : _a.alias) != null ? _b : [];
const aliases = (_d = (_c = cache == null ? void 0 : cache.frontmatter) == null ? void 0 : _c.aliases) != null ? _d : [];
const allAliases = [...[alias].flat(3), ...[aliases].flat(3)];
if (allAliases.length) {
line += ` (${allAliases.join(", ")})`;
}
}
}
}
return lines.join("\n");
}
function createIndex(allPaths, asWikilinks, indent = " ") {
let index2 = "";
const copy3 = (0, import_lodash.cloneDeep)(allPaths);
const reversed = copy3.map((path2) => path2.reverse());
reversed.forEach((path2) => path2.shift());
const realIndent = indent === "\\t" ? " " : indent;
const visited = {};
reversed.forEach((path2) => {
for (let depth = 0; depth < path2.length; depth++) {
const currNode = path2[depth];
if (visited.hasOwnProperty(currNode) && visited[currNode].includes(depth))
continue;
else {
index2 += `${realIndent.repeat(depth)}- ${asWikilinks ? makeWiki(currNode) : currNode}
`;
if (!visited.hasOwnProperty(currNode))
visited[currNode] = [];
visited[currNode].push(depth);
}
}
});
return index2;
}
async function copyLocalIndex(plugin) {
const { settings, closedG } = plugin;
const { wikilinkIndex, createIndexIndent } = settings;
const { basename } = getCurrFile();
const onlyDowns = getSubInDirs(closedG, "down");
const allPaths = dfsAllPaths(onlyDowns, basename);
const index2 = addAliasesToIndex(plugin, createIndex(allPaths, wikilinkIndex, createIndexIndent));
(0, import_loglevel10.info)({ index: index2 });
await copy(index2);
}
async function copyGlobalIndex(plugin) {
const { settings, closedG } = plugin;
const { wikilinkIndex, createIndexIndent } = settings;
const onlyDowns = getSubInDirs(closedG, "down");
const onlyUps = getSubInDirs(closedG, "up");
const sinks = getSinks(onlyUps);
let globalIndex = "";
sinks.forEach((terminal) => {
globalIndex += terminal + "\n";
const allPaths = dfsAllPaths(onlyDowns, terminal);
globalIndex += addAliasesToIndex(plugin, createIndex(allPaths, wikilinkIndex, createIndexIndent)) + "\n";
});
(0, import_loglevel10.info)({ globalIndex });
await copy(globalIndex);
}
var indexToLinePairs = (index2, flat = false) => index2.split("\n").map((line) => {
const [indent, ...content] = line.split("- ");
return [flat ? "" : indent, content.join("- ")];
}).filter((pair) => pair[1] !== "");
// src/Components/JugglButton.svelte
function create_fragment4(ctx) {
let button;
let t;
let mounted;
let dispose;
return {
c() {
button = element("button");
t = text(ctx[3]);
attr(button, "type", "button");
attr(button, "class", "juggl-button");
attr(button, "aria-label", ctx[2]);
button.disabled = ctx[1];
},
m(target, anchor) {
insert(target, button, anchor);
append(button, t);
if (!mounted) {
dispose = listen(button, "click", function() {
if (is_function(ctx[0]))
ctx[0].apply(this, arguments);
});
mounted = true;
}
},
p(new_ctx, [dirty]) {
ctx = new_ctx;
if (dirty & 8)
set_data(t, ctx[3]);
if (dirty & 4) {
attr(button, "aria-label", ctx[2]);
}
if (dirty & 2) {
button.disabled = ctx[1];
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(button);
mounted = false;
dispose();
}
};
}
function instance4($$self, $$props, $$invalidate) {
let renderedIcon;
let { icon } = $$props;
let { onClick } = $$props;
let { disabled = false } = $$props;
let { title = "" } = $$props;
$$self.$$set = ($$props2) => {
if ("icon" in $$props2)
$$invalidate(4, icon = $$props2.icon);
if ("onClick" in $$props2)
$$invalidate(0, onClick = $$props2.onClick);
if ("disabled" in $$props2)
$$invalidate(1, disabled = $$props2.disabled);
if ("title" in $$props2)
$$invalidate(2, title = $$props2.title);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & 16) {
$:
$$invalidate(3, renderedIcon = icon);
}
};
return [onClick, disabled, title, renderedIcon, icon];
}
var JugglButton = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance4, create_fragment4, safe_not_equal, {
icon: 4,
onClick: 0,
disabled: 1,
title: 2
});
}
};
var JugglButton_default = JugglButton;
// src/Components/JugglDepth.svelte
function create_if_block2(ctx) {
let div;
let jugglbutton0;
let t0;
let jugglbutton1;
let t1;
let jugglbutton2;
let current;
jugglbutton0 = new JugglButton_default({
props: {
icon: "-",
disabled: ctx[3] <= 0,
onClick: ctx[4]
}
});
jugglbutton1 = new JugglButton_default({
props: {
icon: ctx[3],
disabled: true,
onClick: null
}
});
jugglbutton2 = new JugglButton_default({
props: {
icon: "+",
disabled: ctx[3] >= ctx[1],
onClick: ctx[5]
}
});
return {
c() {
div = element("div");
create_component(jugglbutton0.$$.fragment);
t0 = space();
create_component(jugglbutton1.$$.fragment);
t1 = space();
create_component(jugglbutton2.$$.fragment);
attr(div, "class", "cy-toolbar-section");
},
m(target, anchor) {
insert(target, div, anchor);
mount_component(jugglbutton0, div, null);
append(div, t0);
mount_component(jugglbutton1, div, null);
append(div, t1);
mount_component(jugglbutton2, div, null);
current = true;
},
p(ctx2, dirty) {
const jugglbutton0_changes = {};
if (dirty & 8)
jugglbutton0_changes.disabled = ctx2[3] <= 0;
if (dirty & 12)
jugglbutton0_changes.onClick = ctx2[4];
jugglbutton0.$set(jugglbutton0_changes);
const jugglbutton1_changes = {};
if (dirty & 8)
jugglbutton1_changes.icon = ctx2[3];
jugglbutton1.$set(jugglbutton1_changes);
const jugglbutton2_changes = {};
if (dirty & 10)
jugglbutton2_changes.disabled = ctx2[3] >= ctx2[1];
if (dirty & 12)
jugglbutton2_changes.onClick = ctx2[5];
jugglbutton2.$set(jugglbutton2_changes);
},
i(local) {
if (current)
return;
transition_in(jugglbutton0.$$.fragment, local);
transition_in(jugglbutton1.$$.fragment, local);
transition_in(jugglbutton2.$$.fragment, local);
current = true;
},
o(local) {
transition_out(jugglbutton0.$$.fragment, local);
transition_out(jugglbutton1.$$.fragment, local);
transition_out(jugglbutton2.$$.fragment, local);
current = false;
},
d(detaching) {
if (detaching)
detach(div);
destroy_component(jugglbutton0);
destroy_component(jugglbutton1);
destroy_component(jugglbutton2);
}
};
}
function create_fragment5(ctx) {
let if_block_anchor;
let current;
let if_block = ctx[0] && create_if_block2(ctx);
return {
c() {
if (if_block)
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
current = true;
},
p(ctx2, [dirty]) {
if (ctx2[0]) {
if (if_block) {
if_block.p(ctx2, dirty);
if (dirty & 1) {
transition_in(if_block, 1);
}
} else {
if_block = create_if_block2(ctx2);
if_block.c();
transition_in(if_block, 1);
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
} else if (if_block) {
group_outros();
transition_out(if_block, 1, 1, () => {
if_block = null;
});
check_outros();
}
},
i(local) {
if (current)
return;
transition_in(if_block);
current = true;
},
o(local) {
transition_out(if_block);
current = false;
},
d(detaching) {
if (if_block)
if_block.d(detaching);
if (detaching)
detach(if_block_anchor);
}
};
}
function instance5($$self, $$props, $$invalidate) {
let { visible = true } = $$props;
let { maxDepth } = $$props;
let { onUpdateDepth } = $$props;
let depth = maxDepth;
const func = () => {
$$invalidate(3, depth -= 1);
onUpdateDepth(depth);
};
const func_12 = () => {
$$invalidate(3, depth += 1);
onUpdateDepth(depth);
};
$$self.$$set = ($$props2) => {
if ("visible" in $$props2)
$$invalidate(0, visible = $$props2.visible);
if ("maxDepth" in $$props2)
$$invalidate(1, maxDepth = $$props2.maxDepth);
if ("onUpdateDepth" in $$props2)
$$invalidate(2, onUpdateDepth = $$props2.onUpdateDepth);
};
return [visible, maxDepth, onUpdateDepth, depth, func, func_12];
}
var JugglDepth = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance5, create_fragment5, safe_not_equal, {
visible: 0,
maxDepth: 1,
onUpdateDepth: 2
});
}
};
var JugglDepth_default = JugglDepth;
// src/Visualisations/Juggl.ts
var STORE_ID = "core";
var BCStoreEvents = class extends import_obsidian7.Events {
};
var BCStore = class extends import_obsidian7.Component {
constructor(graph, metadata, depthMap) {
super();
this.graph = graph;
this.cache = metadata;
this.depthMap = depthMap;
}
asString(node) {
const id2 = VizId.fromNode(node);
return id2.id.slice(0, -3);
}
getFile(nodeId) {
return this.cache.getFirstLinkpathDest(nodeId.id, "");
}
async connectNodes(allNodes, newNodes, graph) {
const edges = [];
const nodesListS = new Set(allNodes.map((node) => this.asString(node)).filter((s) => s));
newNodes.forEach((node) => {
const name = this.asString(node);
if (!this.graph.hasNode(name)) {
return;
}
this.graph.forEachOutEdge(this.asString(node), (key, attr2, source, target) => {
if (nodesListS.has(target)) {
edges.push({
data: {
id: `BC:${source}->${target}`,
source: VizId.toId(source, STORE_ID) + ".md",
target: VizId.toId(target, STORE_ID) + ".md",
type: attr2.field,
dir: attr2.dir
},
classes: `type-${attr2.field} dir-${attr2.dir} breadcrumbs$`
});
}
});
});
return Promise.resolve(edges);
}
getEvents(view) {
return new BCStoreEvents();
}
async getNeighbourhood(nodeIds, view) {
const new_nodes = [];
for (const nodeId of nodeIds) {
const name = nodeId.id.slice(0, -3);
if (!this.graph.hasNode(name)) {
continue;
}
for (const new_node of this.graph.neighbors(name)) {
new_nodes.push(await this.get(new VizId(new_node + ".md", STORE_ID), view));
}
}
return new_nodes;
}
refreshNode(id2, view) {
return;
}
storeId() {
return STORE_ID;
}
get(nodeId, view) {
const file = this.getFile(nodeId);
let depth = 0;
if (this.depthMap && nodeId.id in this.depthMap) {
depth = this.depthMap[nodeId.id];
}
if (file === null) {
const dangling = nodeDangling(nodeId.id);
dangling.data.depth = depth;
return Promise.resolve(dangling);
}
const cache = this.cache.getFileCache(file);
if (cache === null) {
(0, import_loglevel11.info)("returning empty cache", nodeId);
return Promise.resolve(nodeDangling(nodeId.id));
}
return nodeFromFile(file, view.plugin, view.settings, nodeId.toId()).then((node) => {
node.data.depth = depth;
return node;
});
}
};
function createJuggl(plugin, target, initialNodes, args, depthMap = null) {
try {
const jugglPlugin = getPlugin(app);
if (!jugglPlugin) {
return;
}
for (let key in JUGGL_CB_DEFAULTS) {
if (key in args && args[key] === void 0)
args[key] = JUGGL_CB_DEFAULTS[key];
}
const bcStore = new BCStore(plugin.mainG, app.metadataCache, depthMap);
const stores = {
coreStore: bcStore,
dataStores: [bcStore]
};
const juggl = jugglPlugin.createJuggl(target, args, stores, initialNodes);
plugin.addChild(juggl);
(0, import_loglevel11.info)({ juggl });
return juggl;
} catch (error6) {
(0, import_loglevel11.warn)({ error: error6 });
return null;
}
}
function zoomToSource(juggl, source) {
if (!juggl) {
return;
}
juggl.on("vizReady", (viz) => {
viz.one("layoutstop", (e) => {
const viz2 = e.cy;
const node = viz2.$id(VizId.toId(source + ".md", STORE_ID));
viz2.animate({
center: {
eles: node
},
duration: 250,
queue: false,
zoom: 1.7
});
});
});
}
function zoomToGraph(juggl) {
juggl.on("vizReady", (viz) => {
viz.fit(viz.nodes());
});
}
function createDepthMap(paths, source, offset = 0) {
let depthMap = {};
depthMap[source + ".md"] = 0;
paths.forEach((path2) => {
for (let i = 0; i < path2.length; i++) {
const name = path2[i] + ".md";
const depth = path2.length - i - 1 + offset;
if (name in depthMap) {
depthMap[name] = Math.min(depthMap[name], depth);
} else {
depthMap[name] = depth;
}
}
});
return depthMap;
}
function updateDepth(juggl, depth) {
juggl.viz.$(`[depth>${depth}]`).addClass("filtered");
juggl.viz.$(`[depth<=${depth}]`).removeClass("filtered");
}
function createJugglTrail(plugin, target, paths, source, args) {
const toolbarDiv = document.createElement("div");
toolbarDiv.addClass("cy-toolbar");
target.appendChild(toolbarDiv);
const sectDiv = document.createElement("div");
sectDiv.addClass("cy-toolbar-section");
toolbarDiv.appendChild(sectDiv);
const amtChildren = target.children.length;
let jugglUp = null;
let jugglDown = null;
new JugglButton_default({
target: sectDiv,
props: {
icon: "\u2191",
onClick: () => {
if (jugglUp) {
target.children[amtChildren].classList.remove("juggl-hide");
depthUp.$set({ visible: true });
}
if (jugglDown) {
target.children[amtChildren + 1].classList.add("juggl-hide");
depthDown.$set({ visible: false });
}
},
disabled: false,
title: "Show up graph"
}
});
new JugglButton_default({
target: sectDiv,
props: {
icon: "\u2193",
onClick: () => {
if (jugglDown) {
target.children[amtChildren + 1].classList.remove("juggl-hide");
depthUp.$set({ visible: false });
if (jugglUp) {
target.children[amtChildren].classList.add("juggl-hide");
depthDown.$set({ visible: true });
}
return;
}
const sub = getSubInDirs(plugin.mainG, "down", "up");
const closed = getReflexiveClosure(sub, plugin.settings.userHiers);
const subClosed = getSubInDirs(closed, "down");
const { createIndexIndent } = plugin.settings;
const allPaths = dfsAllPaths(subClosed, source);
const index2 = createIndex(allPaths, false, createIndexIndent);
const lines = index2.split("\n").map((line) => {
const [indent, ...content] = line.split("- ");
return content.join("- ");
}).filter((pair) => pair);
let depthMapDown = createDepthMap(allPaths, source);
const maxDepthDown = Math.max(...Object.values(depthMapDown));
depthDown = new JugglDepth_default({
target: toolbarDiv,
props: {
maxDepth: maxDepthDown,
onUpdateDepth: (d) => {
updateDepth(jugglDown, d);
}
}
});
let nodesS = new Set(lines);
nodesS.add(source);
const nodes2 = Array.from(nodesS).map((s) => s + ".md");
const argsDown = Object.assign({}, args);
const layout2 = plugin.settings.jugglLayout;
if (layout2 === "hierarchy") {
argsDown.layout = {
name: "dagre",
animate: false,
ranker: (graph) => {
Object.keys(graph._nodes).forEach((id2) => {
const name = VizId.fromId(id2).id;
if (name in depthMapDown) {
graph._nodes[id2].rank = depthMapDown[name] + 1;
} else {
graph._nodes[id2].rank = 0;
}
});
}
};
} else {
argsDown.layout = layout2;
}
const isFdgd2 = layout2 === "cola" || layout2 === "d3-force";
if (isFdgd2) {
argsDown.fdgdLayout = layout2;
argsDown.layout = "force-directed";
} else {
argsDown.autoZoom = true;
argsDown.animateLayout = false;
}
jugglDown = createJuggl(plugin, target, nodes2, argsDown, depthMapDown);
if (isFdgd2) {
zoomToSource(jugglDown, source);
} else {
zoomToGraph(jugglDown);
}
if (jugglUp) {
target.children[amtChildren].addClass("juggl-hide");
depthUp.$set({ visible: false });
}
},
disabled: false,
title: "Show down graph"
}
});
const depthMapUp = createDepthMap(paths, source, 1);
const maxDepthUp = Math.max(...Object.values(depthMapUp));
let depthDown;
const depthUp = new JugglDepth_default({
target: toolbarDiv,
props: {
maxDepth: maxDepthUp,
onUpdateDepth: (d) => {
updateDepth(jugglUp, d);
}
}
});
let nodes = Array.from(new Set(paths.reduce((prev, curr) => prev.concat(curr), [])));
nodes.push(source);
nodes = nodes.map((s) => s + ".md");
const argsUp = Object.assign({}, args);
const layout = plugin.settings.jugglLayout;
if (layout === "hierarchy") {
argsUp.layout = {
name: "dagre",
animate: false,
ranker: (graph) => {
Object.keys(graph._nodes).forEach((id2) => {
const name = VizId.fromId(id2).id;
if (name in depthMapUp) {
graph._nodes[id2].rank = maxDepthUp - depthMapUp[name] + 1;
} else {
graph._nodes[id2].rank = maxDepthUp + 2;
}
});
}
};
} else {
argsUp.layout = layout;
}
const isFdgd = layout === "cola" || layout === "d3-force";
if (isFdgd) {
argsUp.fdgdLayout = layout;
argsUp.layout = "force-directed";
} else {
argsUp.autoZoom = true;
argsUp.animateLayout = false;
}
jugglUp = createJuggl(plugin, target, nodes, argsUp, depthMapUp);
if (isFdgd) {
zoomToSource(jugglUp, source);
} else {
zoomToGraph(jugglUp);
}
}
// src/Views/TrailView.ts
function getLimitedTrailSub(plugin) {
const { settings, mainG, closedG } = plugin;
const { limitTrailCheckboxes, userHiers } = settings;
if (getFields(userHiers).every((field) => limitTrailCheckboxes.includes(field))) {
return getSubInDirs(closedG, "up");
} else {
const oppFields = limitTrailCheckboxes.map((field) => {
var _a;
return (_a = getOppFields(userHiers, field, "up")) == null ? void 0 : _a[0];
}).filter((field) => field !== void 0);
const subGraph = getSubForFields(mainG, [
...limitTrailCheckboxes,
...oppFields
]);
const closed = getReflexiveClosure(subGraph, userHiers);
return getSubInDirs(closed, "up");
}
}
function getBreadcrumbs(settings, g, currFile) {
const { basename, extension } = currFile;
if (extension !== "md")
return null;
const allTrails = bfsAllPaths(g, basename);
let filteredTrails = [...allTrails];
const { indexNotes, showAllPathsIfNoneToIndexNote } = settings;
if (indexNotes[0] && filteredTrails.length) {
filteredTrails = filteredTrails.filter((trail) => indexNotes.includes(trail[0]));
if (filteredTrails.length === 0 && showAllPathsIfNoneToIndexNote)
filteredTrails = [...allTrails];
}
const sortedTrails = filteredTrails.filter((trail) => trail.length > 0).sort((a2, b) => a2.length - b.length);
return sortedTrails;
}
function getNextNPrev(plugin, currNode) {
const { mainG } = plugin;
const { userHiers } = plugin.settings;
if (!mainG)
return null;
const nextNPrev = blankRealNImplied();
mainG.forEachEdge(currNode, (k, a2, s, t) => {
const { dir, field, implied } = a2;
if (dir !== "next" && dir !== "prev")
return;
if (s === currNode) {
nextNPrev[dir].reals.push({ field, to: t, implied });
} else {
const oppField = getOppFields(userHiers, field, dir)[0];
nextNPrev[getOppDir(dir)].implieds.push({
field: oppField,
to: s,
implied
});
}
});
return nextNPrev;
}
function getTrailLength(curr, offset = 1) {
const index2 = (TRAIL_LENGTHS.indexOf(curr) + offset) % TRAIL_LENGTHS.length;
return TRAIL_LENGTHS[index2 < 0 ? TRAIL_LENGTHS.length + index2 : index2];
}
async function drawTrail(plugin) {
var _a, _b, _c, _d;
try {
const { settings, db, mainG } = plugin;
const {
showBCs,
noPathMessage,
respectReadableLineLength,
showTrail,
showGrid,
showJuggl,
showPrevNext,
showBCsInEditLPMode
} = settings;
db.start2G("drawTrail");
const activeMDView = app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView);
const mode = activeMDView == null ? void 0 : activeMDView.getMode();
if (!showBCs || !activeMDView || mode !== "preview" && !showBCsInEditLPMode) {
(_a = activeMDView == null ? void 0 : activeMDView.containerEl.querySelector(".BC-trail")) == null ? void 0 : _a.remove();
return db.end2G();
}
const { file } = activeMDView;
const { frontmatter } = (_b = app.metadataCache.getFileCache(file)) != null ? _b : {};
if ((frontmatter == null ? void 0 : frontmatter[BC_HIDE_TRAIL]) || (frontmatter == null ? void 0 : frontmatter["kanban-plugin"]))
return db.end2G();
const { basename } = file;
if (!mainG.hasNode(basename))
return db.end2G();
const view = mode === "preview" ? activeMDView.previewMode.containerEl.querySelector("div.markdown-preview-view") : activeMDView.contentEl.querySelector("div.markdown-source-view");
(_c = activeMDView.containerEl.querySelectorAll(".BC-trail")) == null ? void 0 : _c.forEach((trail) => trail.remove());
const closedUp = getLimitedTrailSub(plugin);
const sortedTrails = getBreadcrumbs(settings, closedUp, file);
(0, import_loglevel12.info)({ sortedTrails });
const {
next: { reals: rNext, implieds: iNext },
prev: { reals: rPrev, implieds: iPrev }
} = getNextNPrev(plugin, basename);
const next = [...rNext];
iNext.forEach((i) => {
if (next.findIndex((n) => n.to === i.to) === -1)
next.push(i);
});
const prev = [...rPrev];
iPrev.forEach((i) => {
if (prev.findIndex((n) => n.to === i.to) === -1)
prev.push(i);
});
const noItems = !sortedTrails.length && !next.length && !prev.length;
if (noItems && noPathMessage === "")
return db.end2G();
const selectorForMaxWidth = mode === "preview" ? ".markdown-preview-view.is-readable-line-width .markdown-preview-sizer" : "";
const elForMaxWidth = selectorForMaxWidth !== "" ? document.querySelector(selectorForMaxWidth) : null;
const max_width = elForMaxWidth ? getComputedStyle(elForMaxWidth).getPropertyValue("max-width") : "100%";
const trailDiv = createDiv({
cls: `BC-trail ${respectReadableLineLength ? "is-readable-line-width markdown-preview-sizer markdown-preview-section" : ""}`,
attr: {
style: (mode !== "preview" ? `max-width: ${max_width};` : "") + `margin: 0 auto;${respectReadableLineLength ? "width: var(--file-line-width);" : "width: 100%"}`
}
});
plugin.visited.push([file.path, trailDiv]);
if (mode === "preview") {
view.querySelector("div.markdown-preview-sizer").before(trailDiv);
} else {
const cmGutter = view.querySelector("div.cm-gutters");
if (cmGutter) {
requestAnimationFrame(() => {
const gutterHeight = trailDiv.getBoundingClientRect().height;
cmGutter.style.paddingTop = `${gutterHeight + 4}px`;
});
}
(_d = view.querySelector("div.cm-contentContainer")) == null ? void 0 : _d.before(trailDiv);
}
trailDiv.empty();
if (settings.indexNotes.includes(basename)) {
trailDiv.innerText = "Index Note";
return db.end2G();
}
if (noItems) {
trailDiv.innerText = noPathMessage;
return db.end2G();
}
const targetProps = {
target: trailDiv,
props: { sortedTrails, plugin }
};
if (showTrail && sortedTrails.length)
new TrailPath_default(targetProps);
if (showGrid && sortedTrails.length)
new TrailGrid_default(targetProps);
if (showPrevNext && (next.length || prev.length)) {
new NextPrev_default({
target: trailDiv,
props: { plugin, next, prev }
});
}
if (showJuggl && sortedTrails.length) {
createJugglTrail(plugin, trailDiv, sortedTrails, basename, JUGGL_TRAIL_DEFAULTS);
}
db.end2G();
} catch (err) {
(0, import_loglevel12.error)(err);
plugin.db.end2G();
}
}
// src/refreshIndex.ts
function getDVMetadataCache(plugin) {
const { db } = plugin;
const api = getDVApi(plugin);
db.start1G("getDVMetadataCache");
const frontms = api.pages().values;
db.end1G({ frontms });
return frontms;
}
function getObsMetadataCache(plugin, files) {
const { db } = plugin;
db.start1G("getObsMetadataCache");
const frontms = files.map((file) => {
const { frontmatter } = app.metadataCache.getFileCache(file);
return frontmatter ? { file, ...frontmatter } : { file };
});
db.end1G({ frontms });
return frontms;
}
var isDVProxy = (item) => typeof item.defaultComparator === "function";
function unproxy(item) {
const unproxied = [];
const queue = [item];
while (queue.length) {
const currItem = queue.shift();
if (isDVProxy(currItem))
queue.push(...currItem.values);
else
unproxied.push(currItem);
}
return unproxied;
}
function parseFieldValue(value) {
if (!value)
return [];
const parsed = [];
try {
if (typeof value === "string") {
const splits = value.match(splitLinksRegex);
if (splits !== null) {
const linkNames = splits.map((link2) => getBaseFromMDPath(link2.match(dropHeaderOrAlias)[1]));
parsed.push(...linkNames);
}
} else {
const rawValues = [value].flat(4);
(0, import_loglevel13.debug)(...rawValues);
rawValues.forEach((rawItem) => {
if (!rawItem)
return;
const unProxied = unproxy(rawItem);
unProxied.forEach((value2) => {
if (typeof value2 === "string" || typeof value2 === "number") {
const rawAsString = value2.toString();
const splits = rawAsString.match(splitLinksRegex);
if (splits !== null) {
const strs = splits.map((link2) => getBaseFromMDPath(link2.match(dropHeaderOrAlias)[1]));
parsed.push(...strs);
} else {
const basename = getBaseFromMDPath(rawAsString);
parsed.push(basename.split("#")[0].split("|")[0]);
}
} else if (value2.path !== void 0) {
const basename = getBaseFromMDPath(value2.path);
if (basename !== void 0)
parsed.push(basename);
}
});
});
}
return parsed;
} catch (err) {
(0, import_loglevel13.error)(err);
return parsed;
}
}
async function buildMainG(plugin) {
const mainG = new import_graphology2.MultiGraph();
try {
const { settings, db } = plugin;
const { userHiers, CSVPaths, parseJugglLinksWithoutJuggl, hierarchyNotes } = settings;
db.start2G("initGraphs");
if (userHiers.length === 0) {
db.end2G();
new import_obsidian9.Notice("You do not have any Breadcrumbs hierarchies set up.");
return mainG;
}
const files = app.vault.getMarkdownFiles();
const dvQ = app.plugins.enabledPlugins.has("dataview");
let frontms = dvQ ? getDVMetadataCache(plugin) : getObsMetadataCache(plugin, files);
const CSVRows = CSVPaths !== "" ? await getCSVRows(plugin) : [];
const eligableAlts = {};
BC_ALTS.forEach((alt) => eligableAlts[alt] = []);
db.start2G("addFrontmatterToGraph");
frontms.forEach((page) => {
BC_ALTS.forEach((alt) => {
if (page[alt] !== void 0 && page[alt] !== null)
eligableAlts[alt].push(page);
});
const basename = getDVBasename(page.file);
const sourceOrder = getSourceOrder(page);
iterateHiers(userHiers, (hier, dir, field) => {
const values = parseFieldValue(page[field]);
values.forEach((target) => {
if (target.startsWith("<%") || target.startsWith("{{"))
return;
const targetOrder = getTargetOrder(frontms, target);
populateMain(settings, mainG, basename, field, target, sourceOrder, targetOrder);
});
if (CSVRows.length)
addCSVCrumbs(mainG, CSVRows, dir, field);
});
});
db.end2G();
const jugglLinks = app.plugins.plugins.juggl || parseJugglLinksWithoutJuggl ? await getJugglLinks(plugin, files) : [];
if (jugglLinks.length)
addJugglLinksToGraph(settings, jugglLinks, frontms, mainG);
db.start2G("Alternative Hierarchies");
db.start2G("Hierarchy Notes");
if (hierarchyNotes.length) {
for (const noteOrFolder of hierarchyNotes) {
if (noteOrFolder.endsWith("/")) {
const folder = app.vault.getAbstractFileByPath((0, import_obsidian9.normalizePath)(noteOrFolder));
if (!(folder instanceof import_obsidian9.TFolder))
continue;
for (const child of folder.children) {
if (child instanceof import_obsidian9.TFile) {
addHNsToGraph(settings, await getHierarchyNoteItems(child), mainG);
}
}
} else {
const file = app.metadataCache.getFirstLinkpathDest(noteOrFolder, "");
if (file)
addHNsToGraph(settings, await getHierarchyNoteItems(file), mainG);
}
}
}
db.end2G();
db.start2G("Folder Notes");
addFolderNotesToGraph(plugin, eligableAlts[BC_FOLDER_NOTE], frontms, mainG);
db.end2G();
db.start2G("Tag Notes");
addTagNotesToGraph(plugin, eligableAlts[BC_TAG_NOTE], frontms, mainG);
db.end2G();
db.start2G("Link Notes");
addLinkNotesToGraph(plugin, eligableAlts[BC_LINK_NOTE], frontms, mainG);
db.end2G();
db.start2G("Regex Notes");
addRegexNotesToGraph(plugin, eligableAlts[BC_REGEX_NOTE], frontms, mainG);
db.end2G();
db.start2G("Traverse Notes");
addTraverseNotesToGraph(plugin, eligableAlts[BC_TRAVERSE_NOTE], mainG, buildObsGraph());
db.end2G();
db.start2G("Dendron Notes");
addDendronNotesToGraph(plugin, frontms, mainG);
db.end2G();
db.start2G("Dataview Notes");
addDataviewNotesToGraph(plugin, eligableAlts[BC_DV_NOTE], frontms, mainG);
db.end2G();
db.start2G("Date Notes");
addDateNotesToGraph(plugin, frontms, mainG);
db.end2G();
db.end2G();
files.forEach((file) => addNodesIfNot(mainG, [file.basename]));
db.end2G("graphs inited", { mainG });
return mainG;
} catch (err) {
(0, import_loglevel13.error)(err);
plugin.db.end2G();
return mainG;
}
}
function buildClosedG(plugin) {
const { mainG, settings } = plugin;
const {
userHiers,
impliedRelations: {
sameParentIsSibling,
parentsSiblingsIsParents,
cousinsIsSibling,
siblingsSiblingIsSibling,
siblingsParentIsParent
}
} = settings;
let closedG = getReflexiveClosure(mainG, userHiers);
if (sameParentIsSibling)
addSiblingsFromSameParent(closedG, settings);
if (siblingsParentIsParent)
addSiblingsParentIsParent(closedG);
if (parentsSiblingsIsParents)
addAuntsUncles(closedG);
if (cousinsIsSibling)
addCousins(closedG);
if (siblingsSiblingIsSibling)
addStructuralEquivalenceSiblings(closedG);
return closedG;
}
async function refreshIndex(plugin) {
var _a;
if (!plugin.activeLeafChange)
plugin.registerActiveLeafChangeEvent();
if (!plugin.layoutChange)
plugin.registerLayoutChangeEvent();
plugin.mainG = await buildMainG(plugin);
plugin.closedG = buildClosedG(plugin);
for (const { type: type2 } of plugin.VIEWS)
await ((_a = plugin.getActiveTYPEView(type2)) == null ? void 0 : _a.draw());
if (plugin.settings.showBCs)
await drawTrail(plugin);
if (plugin.settings.showRefreshNotice)
new import_obsidian9.Notice("BC Index refreshed");
}
// src/Components/MatrixButtons.svelte
function add_css4(target) {
append_styles(target, "svelte-barhym", "button.svelte-barhym{padding:1px 6px 2px 6px;margin-right:6px}");
}
function create_if_block3(ctx) {
let button;
let mounted;
let dispose;
return {
c() {
button = element("button");
button.textContent = `${ctx[2] ? "\u2197" : "\u2198"}`;
attr(button, "class", "BC-sort-button svelte-barhym");
attr(button, "aria-label", "Alphabetical Sorting Order");
},
m(target, anchor) {
insert(target, button, anchor);
if (!mounted) {
dispose = listen(button, "click", ctx[5]);
mounted = true;
}
},
p: noop,
d(detaching) {
if (detaching)
detach(button);
mounted = false;
dispose();
}
};
}
function create_fragment6(ctx) {
let button;
let t1;
let if_block_anchor;
let mounted;
let dispose;
let if_block = ctx[3] && create_if_block3(ctx);
return {
c() {
button = element("button");
button.textContent = "\u21BB";
t1 = space();
if (if_block)
if_block.c();
if_block_anchor = empty();
attr(button, "class", "BC-refresh-button svelte-barhym");
attr(button, "aria-label", "Refresh Index");
},
m(target, anchor) {
insert(target, button, anchor);
insert(target, t1, anchor);
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
if (!mounted) {
dispose = listen(button, "click", ctx[4]);
mounted = true;
}
},
p(ctx2, [dirty]) {
if (ctx2[3])
if_block.p(ctx2, dirty);
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(button);
if (detaching)
detach(t1);
if (if_block)
if_block.d(detaching);
if (detaching)
detach(if_block_anchor);
mounted = false;
dispose();
}
};
}
function instance6($$self, $$props, $$invalidate) {
let { matrixView } = $$props;
const { plugin } = matrixView;
const { alphaSortAsc, enableAlphaSort } = plugin.settings;
const click_handler = async () => await refreshIndex(plugin);
const click_handler_1 = async () => {
$$invalidate(1, plugin.settings.alphaSortAsc = !alphaSortAsc, plugin);
await plugin.saveSettings();
await matrixView.draw();
};
$$self.$$set = ($$props2) => {
if ("matrixView" in $$props2)
$$invalidate(0, matrixView = $$props2.matrixView);
};
return [
matrixView,
plugin,
alphaSortAsc,
enableAlphaSort,
click_handler,
click_handler_1
];
}
var MatrixButtons = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance6, create_fragment6, safe_not_equal, { matrixView: 0 }, add_css4);
}
};
var MatrixButtons_default = MatrixButtons;
// src/Components/Matrix.svelte
function add_css5(target) {
append_styles(target, "svelte-1p44ezg", ".BC-Matrix.svelte-1p44ezg.svelte-1p44ezg{padding:5px;font-variant-numeric:tabular-nums;line-height:1.5}.BC-Matrix.svelte-1p44ezg>div.svelte-1p44ezg{border:3px solid var(--background-modifier-border);border-radius:3px;margin:3px;position:relative;height:fit-content}.BC-Matrix-square.svelte-1p44ezg.svelte-1p44ezg{border:1px solid var(--background-modifier-border)}.BC-Matrix-headers.svelte-1p44ezg.svelte-1p44ezg{display:flex;justify-content:space-between;align-items:center}.BC-Matrix-header.svelte-1p44ezg.svelte-1p44ezg{margin:2px;padding:0px 10px}h4.BC-Matrix-header.svelte-1p44ezg.svelte-1p44ezg:first-letter{text-transform:capitalize}ol.svelte-1p44ezg.svelte-1p44ezg{margin:3px;padding-left:30px}.BC-Matrix.svelte-1p44ezg li.svelte-1p44ezg{margin:0.1em}");
}
function get_each_context4(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[13] = list[i];
return child_ctx;
}
function get_each_context_14(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[16] = list[i].field;
child_ctx[17] = list[i].impliedItems;
child_ctx[18] = list[i].realItems;
return child_ctx;
}
function get_each_context_2(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[21] = list[i].alt;
child_ctx[22] = list[i].cls;
child_ctx[23] = list[i].implied;
child_ctx[24] = list[i].to;
child_ctx[25] = list[i].parent;
return child_ctx;
}
function get_each_context_3(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[21] = list[i].alt;
child_ctx[22] = list[i].cls;
child_ctx[23] = list[i].implied;
child_ctx[24] = list[i].to;
return child_ctx;
}
function create_if_block4(ctx) {
let div1;
let div0;
let h4;
let t0_value = ctx[16] + "";
let t0;
let t1;
let t2;
let t3;
let if_block0 = ctx[7] && create_if_block_5(ctx);
let if_block1 = ctx[18].length && create_if_block_4(ctx);
let if_block2 = ctx[4] && ctx[17].length && create_if_block_12(ctx);
return {
c() {
div1 = element("div");
div0 = element("div");
h4 = element("h4");
t0 = text(t0_value);
t1 = space();
if (if_block0)
if_block0.c();
t2 = space();
if (if_block1)
if_block1.c();
t3 = space();
if (if_block2)
if_block2.c();
attr(h4, "class", "BC-Matrix-header svelte-1p44ezg");
attr(div0, "class", "BC-Matrix-headers svelte-1p44ezg");
attr(div1, "class", "BC-Matrix-square svelte-1p44ezg");
},
m(target, anchor) {
insert(target, div1, anchor);
append(div1, div0);
append(div0, h4);
append(h4, t0);
append(div0, t1);
if (if_block0)
if_block0.m(div0, null);
append(div1, t2);
if (if_block1)
if_block1.m(div1, null);
append(div1, t3);
if (if_block2)
if_block2.m(div1, null);
},
p(ctx2, dirty) {
if (dirty & 1 && t0_value !== (t0_value = ctx2[16] + ""))
set_data(t0, t0_value);
if (ctx2[7])
if_block0.p(ctx2, dirty);
if (ctx2[18].length) {
if (if_block1) {
if_block1.p(ctx2, dirty);
} else {
if_block1 = create_if_block_4(ctx2);
if_block1.c();
if_block1.m(div1, t3);
}
} else if (if_block1) {
if_block1.d(1);
if_block1 = null;
}
if (ctx2[4] && ctx2[17].length) {
if (if_block2) {
if_block2.p(ctx2, dirty);
} else {
if_block2 = create_if_block_12(ctx2);
if_block2.c();
if_block2.m(div1, null);
}
} else if (if_block2) {
if_block2.d(1);
if_block2 = null;
}
},
d(detaching) {
if (detaching)
detach(div1);
if (if_block0)
if_block0.d();
if (if_block1)
if_block1.d();
if (if_block2)
if_block2.d();
}
};
}
function create_if_block_5(ctx) {
let h6;
let t_value = ctx[18].length ? "Real" : "Implied";
let t;
return {
c() {
h6 = element("h6");
t = text(t_value);
attr(h6, "class", "BC-Matrix-header svelte-1p44ezg");
},
m(target, anchor) {
insert(target, h6, anchor);
append(h6, t);
},
p(ctx2, dirty) {
if (dirty & 1 && t_value !== (t_value = ctx2[18].length ? "Real" : "Implied"))
set_data(t, t_value);
},
d(detaching) {
if (detaching)
detach(h6);
}
};
}
function create_if_block_4(ctx) {
let ol;
let each_value_3 = ctx[18];
let each_blocks = [];
for (let i = 0; i < each_value_3.length; i += 1) {
each_blocks[i] = create_each_block_3(get_each_context_3(ctx, each_value_3, i));
}
return {
c() {
ol = element("ol");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(ol, "class", "svelte-1p44ezg");
},
m(target, anchor) {
insert(target, ol, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(ol, null);
}
},
p(ctx2, dirty) {
if (dirty & 45) {
each_value_3 = ctx2[18];
let i;
for (i = 0; i < each_value_3.length; i += 1) {
const child_ctx = get_each_context_3(ctx2, each_value_3, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block_3(child_ctx);
each_blocks[i].c();
each_blocks[i].m(ol, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value_3.length;
}
},
d(detaching) {
if (detaching)
detach(ol);
destroy_each(each_blocks, detaching);
}
};
}
function create_each_block_3(ctx) {
var _a;
let li;
let div;
let t0_value = ((_a = ctx[21]) != null ? _a : dropPathNDendron(ctx[24], ctx[3])) + "";
let t0;
let div_class_value;
let div_aria_label_value;
let div_aria_label_position_value;
let t1;
let mounted;
let dispose;
function click_handler(...args) {
return ctx[8](ctx[24], ...args);
}
function mouseover_handler(...args) {
return ctx[9](ctx[24], ...args);
}
return {
c() {
var _a2;
li = element("li");
div = element("div");
t0 = text(t0_value);
t1 = space();
attr(div, "class", div_class_value = ctx[22] + " " + ((_a2 = ctx[23]) != null ? _a2 : "") + " svelte-1p44ezg");
attr(div, "aria-label", div_aria_label_value = ctx[21] ? ctx[24] : "");
attr(div, "aria-label-position", div_aria_label_position_value = ctx[5] ? "left" : "right");
attr(li, "class", "svelte-1p44ezg");
},
m(target, anchor) {
insert(target, li, anchor);
append(li, div);
append(div, t0);
append(li, t1);
if (!mounted) {
dispose = [
listen(div, "click", click_handler),
listen(div, "mouseover", mouseover_handler)
];
mounted = true;
}
},
p(new_ctx, dirty) {
var _a2, _b;
ctx = new_ctx;
if (dirty & 1 && t0_value !== (t0_value = ((_a2 = ctx[21]) != null ? _a2 : dropPathNDendron(ctx[24], ctx[3])) + ""))
set_data(t0, t0_value);
if (dirty & 1 && div_class_value !== (div_class_value = ctx[22] + " " + ((_b = ctx[23]) != null ? _b : "") + " svelte-1p44ezg")) {
attr(div, "class", div_class_value);
}
if (dirty & 1 && div_aria_label_value !== (div_aria_label_value = ctx[21] ? ctx[24] : "")) {
attr(div, "aria-label", div_aria_label_value);
}
},
d(detaching) {
if (detaching)
detach(li);
mounted = false;
run_all(dispose);
}
};
}
function create_if_block_12(ctx) {
let div;
let h4;
let t1;
let t2;
let ol;
let ol_start_value;
let if_block = ctx[17].length && create_if_block_22(ctx);
let each_value_2 = ctx[17];
let each_blocks = [];
for (let i = 0; i < each_value_2.length; i += 1) {
each_blocks[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i));
}
return {
c() {
div = element("div");
h4 = element("h4");
h4.textContent = `${" "}`;
t1 = space();
if (if_block)
if_block.c();
t2 = space();
ol = element("ol");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(h4, "class", "BC-Matrix-header svelte-1p44ezg");
attr(div, "class", "BC-Matrix-headers svelte-1p44ezg");
attr(ol, "start", ol_start_value = ctx[18].length + 1);
attr(ol, "class", "svelte-1p44ezg");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, h4);
append(div, t1);
if (if_block)
if_block.m(div, null);
insert(target, t2, anchor);
insert(target, ol, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(ol, null);
}
},
p(ctx2, dirty) {
if (ctx2[17].length) {
if (if_block) {
if_block.p(ctx2, dirty);
} else {
if_block = create_if_block_22(ctx2);
if_block.c();
if_block.m(div, null);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
if (dirty & 111) {
each_value_2 = ctx2[17];
let i;
for (i = 0; i < each_value_2.length; i += 1) {
const child_ctx = get_each_context_2(ctx2, each_value_2, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block_2(child_ctx);
each_blocks[i].c();
each_blocks[i].m(ol, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value_2.length;
}
if (dirty & 1 && ol_start_value !== (ol_start_value = ctx2[18].length + 1)) {
attr(ol, "start", ol_start_value);
}
},
d(detaching) {
if (detaching)
detach(div);
if (if_block)
if_block.d();
if (detaching)
detach(t2);
if (detaching)
detach(ol);
destroy_each(each_blocks, detaching);
}
};
}
function create_if_block_22(ctx) {
let if_block_anchor;
let if_block = ctx[7] && ctx[18].length && create_if_block_3(ctx);
return {
c() {
if (if_block)
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
},
p(ctx2, dirty) {
if (ctx2[7] && ctx2[18].length) {
if (if_block) {
} else {
if_block = create_if_block_3(ctx2);
if_block.c();
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
},
d(detaching) {
if (if_block)
if_block.d(detaching);
if (detaching)
detach(if_block_anchor);
}
};
}
function create_if_block_3(ctx) {
let h6;
return {
c() {
h6 = element("h6");
h6.textContent = "Implied";
attr(h6, "class", "BC-Matrix-header svelte-1p44ezg");
},
m(target, anchor) {
insert(target, h6, anchor);
},
d(detaching) {
if (detaching)
detach(h6);
}
};
}
function create_each_block_2(ctx) {
var _a;
let li;
let div;
let t_value = ((_a = ctx[21]) != null ? _a : dropPathNDendron(ctx[24], ctx[3])) + "";
let t;
let div_class_value;
let div_aria_label_value;
let div_aria_label_position_value;
let li_class_value;
let mounted;
let dispose;
function click_handler_1(...args) {
return ctx[10](ctx[24], ...args);
}
function mouseover_handler_1(...args) {
return ctx[11](ctx[24], ...args);
}
return {
c() {
var _a2;
li = element("li");
div = element("div");
t = text(t_value);
attr(div, "class", div_class_value = ctx[22] + " " + ((_a2 = ctx[23]) != null ? _a2 : "") + " svelte-1p44ezg");
attr(div, "aria-label", div_aria_label_value = (ctx[21] ? `${ctx[24]}
` : "") + (ctx[25] ? "\u2191 " + ctx[25] : ""));
attr(div, "aria-label-position", div_aria_label_position_value = ctx[5] ? "left" : "right");
attr(li, "class", li_class_value = "BC-Implied " + (ctx[6] && ctx[24] === ctx[1].basename ? "BC-active-note" : "") + " svelte-1p44ezg");
},
m(target, anchor) {
insert(target, li, anchor);
append(li, div);
append(div, t);
if (!mounted) {
dispose = [
listen(div, "click", click_handler_1),
listen(div, "mouseover", mouseover_handler_1)
];
mounted = true;
}
},
p(new_ctx, dirty) {
var _a2, _b;
ctx = new_ctx;
if (dirty & 1 && t_value !== (t_value = ((_a2 = ctx[21]) != null ? _a2 : dropPathNDendron(ctx[24], ctx[3])) + ""))
set_data(t, t_value);
if (dirty & 1 && div_class_value !== (div_class_value = ctx[22] + " " + ((_b = ctx[23]) != null ? _b : "") + " svelte-1p44ezg")) {
attr(div, "class", div_class_value);
}
if (dirty & 1 && div_aria_label_value !== (div_aria_label_value = (ctx[21] ? `${ctx[24]}
` : "") + (ctx[25] ? "\u2191 " + ctx[25] : ""))) {
attr(div, "aria-label", div_aria_label_value);
}
if (dirty & 3 && li_class_value !== (li_class_value = "BC-Implied " + (ctx[6] && ctx[24] === ctx[1].basename ? "BC-active-note" : "") + " svelte-1p44ezg")) {
attr(li, "class", li_class_value);
}
},
d(detaching) {
if (detaching)
detach(li);
mounted = false;
run_all(dispose);
}
};
}
function create_each_block_14(ctx) {
let if_block_anchor;
let if_block = (ctx[18].length || ctx[4] && ctx[17].length) && create_if_block4(ctx);
return {
c() {
if (if_block)
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
},
p(ctx2, dirty) {
if (ctx2[18].length || ctx2[4] && ctx2[17].length) {
if (if_block) {
if_block.p(ctx2, dirty);
} else {
if_block = create_if_block4(ctx2);
if_block.c();
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
},
d(detaching) {
if (if_block)
if_block.d(detaching);
if (detaching)
detach(if_block_anchor);
}
};
}
function create_each_block4(ctx) {
let div;
let t;
let each_value_1 = ctx[13];
let each_blocks = [];
for (let i = 0; i < each_value_1.length; i += 1) {
each_blocks[i] = create_each_block_14(get_each_context_14(ctx, each_value_1, i));
}
return {
c() {
div = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
t = space();
attr(div, "class", "BC-matrix-hier svelte-1p44ezg");
},
m(target, anchor) {
insert(target, div, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div, null);
}
append(div, t);
},
p(ctx2, dirty) {
if (dirty & 255) {
each_value_1 = ctx2[13];
let i;
for (i = 0; i < each_value_1.length; i += 1) {
const child_ctx = get_each_context_14(ctx2, each_value_1, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block_14(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div, t);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value_1.length;
}
},
d(detaching) {
if (detaching)
detach(div);
destroy_each(each_blocks, detaching);
}
};
}
function create_fragment7(ctx) {
let div0;
let matrixbuttons;
let t;
let div1;
let div1_class_value;
let current;
matrixbuttons = new MatrixButtons_default({
props: { matrixView: ctx[2] }
});
let each_value = ctx[0];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block4(get_each_context4(ctx, each_value, i));
}
return {
c() {
div0 = element("div");
create_component(matrixbuttons.$$.fragment);
t = space();
div1 = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(div0, "class", "BC-matrix-buttons");
attr(div1, "class", div1_class_value = "BC-Matrix markdown-preview-view " + (ctx[0].length ? "" : "BC-empty-view") + " svelte-1p44ezg");
},
m(target, anchor) {
insert(target, div0, anchor);
mount_component(matrixbuttons, div0, null);
insert(target, t, anchor);
insert(target, div1, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div1, null);
}
current = true;
},
p(ctx2, [dirty]) {
const matrixbuttons_changes = {};
if (dirty & 4)
matrixbuttons_changes.matrixView = ctx2[2];
matrixbuttons.$set(matrixbuttons_changes);
if (dirty & 255) {
each_value = ctx2[0];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context4(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block4(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div1, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
if (!current || dirty & 1 && div1_class_value !== (div1_class_value = "BC-Matrix markdown-preview-view " + (ctx2[0].length ? "" : "BC-empty-view") + " svelte-1p44ezg")) {
attr(div1, "class", div1_class_value);
}
},
i(local) {
if (current)
return;
transition_in(matrixbuttons.$$.fragment, local);
current = true;
},
o(local) {
transition_out(matrixbuttons.$$.fragment, local);
current = false;
},
d(detaching) {
if (detaching)
detach(div0);
destroy_component(matrixbuttons);
if (detaching)
detach(t);
if (detaching)
detach(div1);
destroy_each(each_blocks, detaching);
}
};
}
function instance7($$self, $$props, $$invalidate) {
let { hierSquares } = $$props;
let { currFile } = $$props;
let { matrixView } = $$props;
const { plugin } = matrixView;
const { settings } = plugin;
const { showImpliedRelations, rlLeaf, treatCurrNodeAsImpliedSibling, showRelationType } = settings;
const click_handler = async (to, e) => await openOrSwitch(to, e);
const mouseover_handler = (to, event) => hoverPreview(event, matrixView, to);
const click_handler_1 = async (to, e) => await openOrSwitch(to, e);
const mouseover_handler_1 = (to, e) => hoverPreview(e, matrixView, to);
$$self.$$set = ($$props2) => {
if ("hierSquares" in $$props2)
$$invalidate(0, hierSquares = $$props2.hierSquares);
if ("currFile" in $$props2)
$$invalidate(1, currFile = $$props2.currFile);
if ("matrixView" in $$props2)
$$invalidate(2, matrixView = $$props2.matrixView);
};
return [
hierSquares,
currFile,
matrixView,
settings,
showImpliedRelations,
rlLeaf,
treatCurrNodeAsImpliedSibling,
showRelationType,
click_handler,
mouseover_handler,
click_handler_1,
mouseover_handler_1
];
}
var Matrix = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance7, create_fragment7, safe_not_equal, {
hierSquares: 0,
currFile: 1,
matrixView: 2
}, add_css5);
}
};
var Matrix_default = Matrix;
// src/Views/MatrixView.ts
function getMatrixNeighbours(plugin, currNode) {
const { closedG, settings } = plugin;
const { userHiers } = settings;
const neighbours = blankRealNImplied();
if (!closedG)
return neighbours;
closedG.forEachEdge(currNode, (k, a2, s, t) => {
const { field, dir, implied } = a2;
if (s === currNode) {
neighbours[dir].reals.push({ to: t, field, implied });
} else {
neighbours[getOppDir(dir)].implieds.push({
to: s,
field: getOppFields(userHiers, field, dir)[0],
implied
});
}
});
return neighbours;
}
var MatrixView = class extends import_obsidian10.ItemView {
constructor(leaf, plugin) {
super(leaf);
this.icon = TRAIL_ICON;
this.toInternalLinkObj = (to, realQ = true, parent, implied) => {
return {
to,
cls: linkClass(to, realQ),
alt: this.getAlt(to),
order: this.getOrder(to),
parent,
implied
};
};
this.getOrder = (node) => Number.parseInt(this.plugin.mainG.getNodeAttribute(node, "order"));
this.sortItemsAlpha = (a2, b) => {
var _a, _b;
const { sortByNameShowAlias, alphaSortAsc } = this.plugin.settings;
const aToSort = (sortByNameShowAlias ? a2.to : (_a = a2.alt) != null ? _a : a2.to).toLowerCase();
const bToSort = (sortByNameShowAlias ? b.to : (_b = b.alt) != null ? _b : b.to).toLowerCase();
const less = alphaSortAsc ? -1 : 1;
const more = alphaSortAsc ? 1 : -1;
return aToSort < bToSort ? less : more;
};
this.plugin = plugin;
this.db = new Debugger(plugin);
}
async onload() {
super.onload();
const { plugin } = this;
app.workspace.onLayoutReady(() => {
setTimeout(async () => await this.draw(), app.plugins.plugins.dataview ? app.plugins.plugins.dataview.api ? 1 : plugin.settings.dvWaitTime : 3e3);
});
}
getViewType() {
return MATRIX_VIEW;
}
getDisplayText() {
return "Breadcrumbs Matrix";
}
async onOpen() {
}
onClose() {
var _a;
(_a = this.view) == null ? void 0 : _a.$destroy();
return Promise.resolve();
}
getAlt(node) {
const { plugin } = this;
const { altLinkFields, showAllAliases } = plugin.settings;
if (!altLinkFields.length)
return null;
const dv = getDVApi(plugin);
if (dv) {
const page = dv.page(node);
if (!page)
return null;
for (const alt of altLinkFields) {
const value = page[alt];
const arr = typeof value === "string" ? splitAndTrim(value) : value;
if (value)
return showAllAliases ? arr.join(", ") : arr[0];
}
} else {
const file = app.metadataCache.getFirstLinkpathDest(node, "");
if (file) {
const { frontmatter } = app.metadataCache.getFileCache(file);
for (const altField of altLinkFields) {
const value = frontmatter == null ? void 0 : frontmatter[altField];
const arr = typeof value === "string" ? splitAndTrim(value) : value;
if (value)
return showAllAliases ? arr.join(", ") : arr[0];
}
}
}
}
removeDuplicateImplied(reals, implieds) {
const realTos = reals.map((real) => real.to);
return implieds.filter((implied) => !realTos.includes(implied.to));
}
getHierSquares(userHiers, currFile) {
const { plugin } = this;
const { mainG, settings } = plugin;
const { enableAlphaSort, squareDirectionsOrder } = settings;
if (!mainG)
return [];
const { basename } = currFile;
if (!mainG.hasNode(basename))
return [];
const realsnImplieds = getMatrixNeighbours(plugin, basename);
return userHiers.map((hier) => {
const filteredRealNImplied = blankRealNImplied();
const resultsFilter = (item, dir, oppDir, arrow) => hier[dir].includes(item.field) || item.field.includes(`<${arrow}>`) && hier[oppDir].includes(item.field.split(" <")[0]);
for (const dir in realsnImplieds) {
const oppDir = getOppDir(dir);
const arrow = ARROW_DIRECTIONS[dir];
const { reals, implieds } = realsnImplieds[dir];
filteredRealNImplied[dir].reals = reals.filter((real) => resultsFilter(real, dir, oppDir, arrow)).map((item) => this.toInternalLinkObj(item.to, true, null, item.implied));
filteredRealNImplied[dir].implieds = implieds.filter((implied) => resultsFilter(implied, dir, oppDir, arrow)).map((item) => this.toInternalLinkObj(item.to, false, null, item.implied));
}
let {
up: { reals: ru, implieds: iu },
same: { reals: rs, implieds: is },
down: { reals: rd, implieds: id2 },
next: { reals: rn, implieds: iN },
prev: { reals: rp, implieds: ip }
} = filteredRealNImplied;
[iu, is, id2, iN, ip] = [
this.removeDuplicateImplied(ru, iu),
this.removeDuplicateImplied(rs, is),
this.removeDuplicateImplied(rd, id2),
this.removeDuplicateImplied(rn, iN),
this.removeDuplicateImplied(rp, ip)
];
const iSameNoDup = [];
is.forEach((impSib) => {
if (iSameNoDup.every((noDup) => noDup.to !== impSib.to)) {
iSameNoDup.push(impSib);
}
});
is = iSameNoDup;
const getFieldInHier = (dir) => hier[dir][0] ? hier[dir].join(", ") : `${hier[getOppDir(dir)].join(",")}${ARROW_DIRECTIONS[dir]}`;
const squares = [ru, rs, rd, rn, rp, iu, is, id2, iN, ip];
if (enableAlphaSort)
squares.forEach((sq) => sq.sort(this.sortItemsAlpha));
squares.forEach((sq) => sq.sort((a2, b) => a2.order - b.order));
(0, import_loglevel14.info)([
{ ru },
{ rs },
{ rd },
{ rn },
{ rp },
{ iu },
{ is },
{ id: id2 },
{ iN },
{ ip }
]);
const square = [
{
realItems: ru,
impliedItems: iu,
field: getFieldInHier("up")
},
{
realItems: rs,
impliedItems: is,
field: getFieldInHier("same")
},
{
realItems: rd,
impliedItems: id2,
field: getFieldInHier("down")
},
{
realItems: rn,
impliedItems: iN,
field: getFieldInHier("next")
},
{
realItems: rp,
impliedItems: ip,
field: getFieldInHier("prev")
}
];
return squareDirectionsOrder.map((order) => square[order]);
});
}
async draw() {
try {
const { contentEl, db, plugin } = this;
db.start2G("Draw Matrix View");
contentEl.empty();
const { userHiers } = plugin.settings;
const currFile = getCurrFile();
if (!currFile)
return;
const hierSquares = this.getHierSquares(userHiers, currFile).filter((squareArr) => squareArr.some((sq) => sq.realItems.length + sq.impliedItems.length > 0));
new Matrix_default({
target: contentEl,
props: { hierSquares, matrixView: this, currFile }
});
db.end2G();
} catch (err) {
(0, import_loglevel14.error)(err);
this.db.end2G();
}
}
};
// src/API.ts
var BCAPI = class {
constructor(plugin) {
this.DIRECTIONS = DIRECTIONS;
this.ARROW_DIRECTIONS = ARROW_DIRECTIONS;
this.buildObsGraph = buildObsGraph;
this.refreshIndex = async () => await refreshIndex(this.plugin);
this.getSubInDirs = (dirs, g = this.mainG) => getSubInDirs(g, ...dirs);
this.getSubForFields = (fields, g = this.mainG) => getSubForFields(g, fields);
this.dfsAllPaths = (fromNode = ((_a) => (_a = getCurrFile()) == null ? void 0 : _a.basename)(), g = this.mainG) => dfsAllPaths(g, fromNode);
this.createIndex = (allPaths, wikilinks = false, indent = " ") => createIndex(allPaths, wikilinks, indent);
this.getMatrixNeighbours = (fromNode = ((_b) => (_b = getCurrFile()) == null ? void 0 : _b.basename)()) => getMatrixNeighbours(this.plugin, fromNode);
this.getOppDir = (dir) => getOppDir(dir);
this.getOppFields = (field) => {
const { fieldDir } = getFieldInfo(this.plugin.settings.userHiers, field);
return getOppFields(this.plugin.settings.userHiers, field, fieldDir);
};
this.getFieldInfo = (field) => getFieldInfo(this.plugin.settings.userHiers, field);
this.getFields = (dir) => getFields(this.plugin.settings.userHiers, dir != null ? dir : "all");
this.plugin = plugin;
this.mainG = this.plugin.mainG;
this.closedG = this.plugin.closedG;
}
iterateHiers(cb) {
iterateHiers(this.plugin.settings.userHiers, cb);
}
};
// src/AlternativeHierarchies/HierarchyNotes/HierNoteModal.ts
var import_obsidian14 = require("obsidian");
// src/AlternativeHierarchies/HierarchyNotes/HierarchyNoteManipulator.ts
var import_loglevel15 = __toESM(require_loglevel());
var import_obsidian13 = require("obsidian");
// src/AlternativeHierarchies/HierarchyNotes/ModifyHierItemModal.ts
var import_obsidian12 = require("obsidian");
// src/Components/ModifyHNItemComp.svelte
var import_console = require("console");
var import_obsidian11 = require("obsidian");
function add_css6(target) {
append_styles(target, "svelte-13g4k7i", "pre.svelte-13g4k7i{display:inline}");
}
function create_if_block_23(ctx) {
let if_block_anchor;
function select_block_type(ctx2, dirty) {
if (ctx2[2].depth === 0)
return create_if_block_32;
return create_else_block2;
}
let current_block_type = select_block_type(ctx, -1);
let if_block = current_block_type(ctx);
return {
c() {
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
},
p(ctx2, dirty) {
if (current_block_type === (current_block_type = select_block_type(ctx2, dirty)) && if_block) {
if_block.p(ctx2, dirty);
} else {
if_block.d(1);
if_block = current_block_type(ctx2);
if (if_block) {
if_block.c();
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
}
},
d(detaching) {
if_block.d(detaching);
if (detaching)
detach(if_block_anchor);
}
};
}
function create_else_block2(ctx) {
let div;
let pre;
let t_value = ctx[6](ctx[5], ctx[2].depth - 4, true) + "";
let t;
return {
c() {
div = element("div");
pre = element("pre");
t = text(t_value);
attr(pre, "class", "svelte-13g4k7i");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, pre);
append(pre, t);
},
p(ctx2, dirty) {
if (dirty & 36 && t_value !== (t_value = ctx2[6](ctx2[5], ctx2[2].depth - 4, true) + ""))
set_data(t, t_value);
},
d(detaching) {
if (detaching)
detach(div);
}
};
}
function create_if_block_32(ctx) {
let div;
return {
c() {
div = element("div");
div.textContent = "Can't add parent to top level item, choose another direction";
},
m(target, anchor) {
insert(target, div, anchor);
},
p: noop,
d(detaching) {
if (detaching)
detach(div);
}
};
}
function create_if_block_13(ctx) {
let div;
let pre;
let t_value = ctx[6](ctx[5], ctx[2].depth + 4, true) + "";
let t;
return {
c() {
div = element("div");
pre = element("pre");
t = text(t_value);
attr(pre, "class", "svelte-13g4k7i");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, pre);
append(pre, t);
},
p(ctx2, dirty) {
if (dirty & 36 && t_value !== (t_value = ctx2[6](ctx2[5], ctx2[2].depth + 4, true) + ""))
set_data(t, t_value);
},
d(detaching) {
if (detaching)
detach(div);
}
};
}
function create_if_block5(ctx) {
let div;
let pre;
let t_value = ctx[6](ctx[5], ctx[2].depth, true) + "";
let t;
return {
c() {
div = element("div");
pre = element("pre");
t = text(t_value);
attr(pre, "class", "svelte-13g4k7i");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, pre);
append(pre, t);
},
p(ctx2, dirty) {
if (dirty & 36 && t_value !== (t_value = ctx2[6](ctx2[5], ctx2[2].depth, true) + ""))
set_data(t, t_value);
},
d(detaching) {
if (detaching)
detach(div);
}
};
}
function create_fragment8(ctx) {
let h5;
let t0;
let t1_value = ARROW_DIRECTIONS[ctx[0]] + "";
let t1;
let t2;
let t3_value = dropWikilinks(ctx[2].line) + "";
let t3;
let t4;
let div1;
let t5;
let div0;
let pre;
let strong;
let t6_value = ctx[6](dropWikilinks(ctx[2].line), ctx[2].depth, true) + "";
let t6;
let t7;
let t8;
let select;
let option0;
let option1;
let option2;
let t12;
let input;
let t13;
let button;
let mounted;
let dispose;
let if_block0 = ctx[0] === "up" && create_if_block_23(ctx);
function select_block_type_1(ctx2, dirty) {
if (ctx2[0] === "same")
return create_if_block5;
if (ctx2[0] === "down")
return create_if_block_13;
}
let current_block_type = select_block_type_1(ctx, -1);
let if_block1 = current_block_type && current_block_type(ctx);
return {
c() {
h5 = element("h5");
t0 = text("Add an ");
t1 = text(t1_value);
t2 = text(" to ");
t3 = text(t3_value);
t4 = space();
div1 = element("div");
if (if_block0)
if_block0.c();
t5 = space();
div0 = element("div");
pre = element("pre");
strong = element("strong");
t6 = text(t6_value);
t7 = space();
if (if_block1)
if_block1.c();
t8 = space();
select = element("select");
option0 = element("option");
option0.textContent = "up";
option1 = element("option");
option1.textContent = "same";
option2 = element("option");
option2.textContent = "down";
t12 = space();
input = element("input");
t13 = space();
button = element("button");
button.textContent = "Add";
attr(pre, "class", "svelte-13g4k7i");
option0.__value = "up";
option0.value = option0.__value;
option1.__value = "same";
option1.value = option1.__value;
option2.__value = "down";
option2.value = option2.__value;
attr(select, "class", "dropdown");
attr(select, "width", "1");
if (ctx[0] === void 0)
add_render_callback(() => ctx[8].call(select));
attr(input, "type", "text");
attr(input, "placeholder", "New item");
},
m(target, anchor) {
insert(target, h5, anchor);
append(h5, t0);
append(h5, t1);
append(h5, t2);
append(h5, t3);
insert(target, t4, anchor);
insert(target, div1, anchor);
if (if_block0)
if_block0.m(div1, null);
append(div1, t5);
append(div1, div0);
append(div0, pre);
append(pre, strong);
append(strong, t6);
append(div1, t7);
if (if_block1)
if_block1.m(div1, null);
append(div1, t8);
append(div1, select);
append(select, option0);
append(select, option1);
append(select, option2);
select_option(select, ctx[0]);
append(div1, t12);
append(div1, input);
ctx[9](input);
set_input_value(input, ctx[5]);
append(div1, t13);
append(div1, button);
if (!mounted) {
dispose = [
listen(select, "change", ctx[8]),
listen(input, "input", ctx[10]),
listen(button, "click", ctx[11])
];
mounted = true;
}
},
p(ctx2, [dirty]) {
if (dirty & 1 && t1_value !== (t1_value = ARROW_DIRECTIONS[ctx2[0]] + ""))
set_data(t1, t1_value);
if (dirty & 4 && t3_value !== (t3_value = dropWikilinks(ctx2[2].line) + ""))
set_data(t3, t3_value);
if (ctx2[0] === "up") {
if (if_block0) {
if_block0.p(ctx2, dirty);
} else {
if_block0 = create_if_block_23(ctx2);
if_block0.c();
if_block0.m(div1, t5);
}
} else if (if_block0) {
if_block0.d(1);
if_block0 = null;
}
if (dirty & 4 && t6_value !== (t6_value = ctx2[6](dropWikilinks(ctx2[2].line), ctx2[2].depth, true) + ""))
set_data(t6, t6_value);
if (current_block_type === (current_block_type = select_block_type_1(ctx2, dirty)) && if_block1) {
if_block1.p(ctx2, dirty);
} else {
if (if_block1)
if_block1.d(1);
if_block1 = current_block_type && current_block_type(ctx2);
if (if_block1) {
if_block1.c();
if_block1.m(div1, t8);
}
}
if (dirty & 1) {
select_option(select, ctx2[0]);
}
if (dirty & 32 && input.value !== ctx2[5]) {
set_input_value(input, ctx2[5]);
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(h5);
if (detaching)
detach(t4);
if (detaching)
detach(div1);
if (if_block0)
if_block0.d();
if (if_block1) {
if_block1.d();
}
ctx[9](null);
mounted = false;
run_all(dispose);
}
};
}
function instance8($$self, $$props, $$invalidate) {
let { modal } = $$props;
let { settings } = $$props;
let { hnItem } = $$props;
let { file } = $$props;
let { rel } = $$props;
let inputEl;
let newItem = app.workspace.activeLeaf.view.file.basename;
const buildNewItem = (newItem2, depth = hnItem.depth, preview = false) => `${" ".repeat(Math.round(depth / (preview ? 2 : 1)))}- ${preview ? newItem2 || "<Empty>" : makeWiki(newItem2)}`;
function select_change_handler() {
rel = select_value(this);
$$invalidate(0, rel);
}
function input_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
inputEl = $$value;
$$invalidate(4, inputEl);
});
}
function input_input_handler() {
newItem = this.value;
$$invalidate(5, newItem);
}
const click_handler = async (e) => {
if (rel === "up" && hnItem.depth === 0) {
new import_obsidian11.Notice("Can't add parent to top level item, choose another direction");
return;
} else {
try {
const content = await app.vault.read(file);
const lines = content.split("\n");
const lineNo = rel === "up" ? hnItem.lineNo : hnItem.lineNo + 1;
const depth = rel === "up" ? hnItem.depth - 4 : rel === "down" ? hnItem.depth + 4 : hnItem.depth;
lines.splice(lineNo, 0, buildNewItem(newItem, depth));
await app.vault.modify(file, lines.join("\n"));
modal.close();
} catch (err) {
(0, import_console.error)(err);
new import_obsidian11.Notice("An error occured, please check the console");
}
}
};
$$self.$$set = ($$props2) => {
if ("modal" in $$props2)
$$invalidate(1, modal = $$props2.modal);
if ("settings" in $$props2)
$$invalidate(7, settings = $$props2.settings);
if ("hnItem" in $$props2)
$$invalidate(2, hnItem = $$props2.hnItem);
if ("file" in $$props2)
$$invalidate(3, file = $$props2.file);
if ("rel" in $$props2)
$$invalidate(0, rel = $$props2.rel);
};
return [
rel,
modal,
hnItem,
file,
inputEl,
newItem,
buildNewItem,
settings,
select_change_handler,
input_binding,
input_input_handler,
click_handler
];
}
var ModifyHNItemComp = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance8, create_fragment8, safe_not_equal, {
modal: 1,
settings: 7,
hnItem: 2,
file: 3,
rel: 0
}, add_css6);
}
};
var ModifyHNItemComp_default = ModifyHNItemComp;
// src/AlternativeHierarchies/HierarchyNotes/ModifyHierItemModal.ts
var ModifyHierItemModal = class extends import_obsidian12.Modal {
constructor(plugin, hnItem, file, rel) {
super(app);
this.plugin = plugin;
this.modal = this;
this.hnItem = hnItem;
this.file = file;
this.rel = rel;
}
onOpen() {
const { contentEl } = this;
contentEl.empty();
this.mount = new ModifyHNItemComp_default({
target: contentEl,
props: {
modal: this,
settings: this.plugin.settings,
hnItem: this.hnItem,
file: this.file,
rel: this.rel
}
});
}
onClose() {
this.mount.$destroy();
this.contentEl.empty();
}
};
// src/AlternativeHierarchies/HierarchyNotes/HierarchyNoteManipulator.ts
var HierarchyNoteManipulator = class extends import_obsidian13.FuzzySuggestModal {
constructor(plugin, hierNoteName) {
super(app);
this.plugin = plugin;
this.settings = this.plugin.settings;
this.hierNoteName = hierNoteName;
const chooseOverride = (evt) => {
this.chooser.useSelectedItem(evt);
return false;
};
this.scope.register([], "Delete", chooseOverride);
this.scope.register(["Shift"], "ArrowUp", chooseOverride);
this.scope.register(["Shift"], "ArrowRight", chooseOverride);
this.scope.register(["Shift"], "ArrowDown", chooseOverride);
}
async onOpen() {
this.setPlaceholder("HN Manipulator");
this.setInstructions([
{ command: "Shift + Enter", purpose: "Jump to item" },
{ command: "Shift + \u2191", purpose: "Add parent" },
{ command: "Shift + \u2192", purpose: "Add sibling" },
{ command: "Shift + \u2193 / Enter / Click", purpose: "Add child" },
{ command: "Delete", purpose: "Delete item" }
]);
this.file = app.metadataCache.getFirstLinkpathDest(this.hierNoteName, "");
if (!this.file)
this.lines = [];
console.log(this);
const content = await app.vault.cachedRead(this.file);
this.lines = content.split("\n");
this.listItems = app.metadataCache.getFileCache(this.file).listItems;
console.log(this);
super.onOpen();
}
getItems() {
const items = this.listItems.map((item) => {
const i = item.position.start.line;
return { i, line: this.lines[i] };
}).map((item) => {
const splits = item.line.split("- ");
const depth = splits[0].length;
const line = splits.slice(1).join("- ");
return { depth, line, lineNo: item.i };
});
(0, import_loglevel15.info)(items);
return items;
}
getItemText(item) {
return `${" ".repeat(item.depth)}- ${dropWikilinks(item.line)}`;
}
renderSuggestion(item, el) {
super.renderSuggestion(item, el);
el.innerText = `${" ".repeat(item.item.depth)}- ${dropWikilinks(item.item.line)}`;
}
async deleteItem(item) {
try {
this.lines.splice(item.lineNo, 1);
this.listItems.splice(item.lineNo, 1);
await app.vault.modify(this.file, this.lines.join("\n"));
new import_obsidian13.Notice("Item deleted Succesfully");
} catch (err) {
(0, import_loglevel15.error)(err);
new import_obsidian13.Notice("An error occured. Please check the console");
}
}
onChooseItem(item, evt) {
if (evt instanceof KeyboardEvent && evt.key === "Delete") {
this.deleteItem(item);
} else if (evt instanceof KeyboardEvent && evt.key == "Enter" && evt.shiftKey) {
const view = app.workspace.getActiveViewOfType(import_obsidian13.MarkdownView);
const { editor } = view != null ? view : {};
if (!editor)
return;
view.leaf.openFile(this.file, { active: true, mode: "source" });
editor.setCursor({ line: item.lineNo, ch: item.depth + 2 });
} else if (evt instanceof KeyboardEvent || evt instanceof MouseEvent) {
let rel;
if (evt instanceof MouseEvent && evt.type == "click")
rel = "down";
if (evt instanceof KeyboardEvent) {
if (evt.key === "Enter")
rel = "down";
}
if (evt instanceof KeyboardEvent && evt.shiftKey) {
if (evt.key === "ArrowUp")
rel = "up";
if (evt.key === "ArrowDown")
rel = "down";
if (evt.key === "ArrowRight")
rel = "same";
}
new ModifyHierItemModal(this.plugin, item, this.file, rel).open();
this.close();
}
}
};
// src/AlternativeHierarchies/HierarchyNotes/HierNoteModal.ts
var HierarchyNoteSelectorModal = class extends import_obsidian14.FuzzySuggestModal {
constructor(plugin) {
super(app);
this.plugin = plugin;
this.settings = this.plugin.settings;
}
onOpen() {
this.setPlaceholder("HN Chooser");
const { hierarchyNotes } = this.settings;
if (hierarchyNotes.length === 0) {
this.close();
new import_obsidian14.Notice("No hierarchy notes found");
} else if (hierarchyNotes.length === 1 && !hierarchyNotes[0].endsWith("/")) {
this.close();
new HierarchyNoteManipulator(this.plugin, hierarchyNotes[0]).open();
} else {
super.onOpen();
}
}
getItems() {
const { hierarchyNotes } = this.settings;
if (hierarchyNotes.length == 1 && hierarchyNotes[0].endsWith("/")) {
let folder = hierarchyNotes[0].slice(0, -1);
if (app.plugins.plugins.dataview != void 0) {
let pages = app.plugins.plugins.dataview.api.pages(`"${folder}"`);
return pages.values.map((page) => page.file.path);
} else {
new import_obsidian14.Notice("make sure you have dataview enabled");
}
} else
return hierarchyNotes;
}
getItemText(item) {
return `${item}`;
}
renderSuggestion(item, el) {
super.renderSuggestion(item, el);
}
onChooseItem(item, evt) {
new HierarchyNoteManipulator(this.plugin, item).open();
this.close();
}
};
// src/Codeblocks.ts
var import_loglevel16 = __toESM(require_loglevel());
var import_obsidian16 = require("obsidian");
// src/Components/RenderMarkdown.svelte
var import_obsidian15 = require("obsidian");
function add_css7(target) {
append_styles(target, "svelte-7e9i10", "div.BC-note-content.svelte-7e9i10{padding-left:20px}");
}
function create_fragment9(ctx) {
let div;
return {
c() {
div = element("div");
attr(div, "class", "BC-note-content svelte-7e9i10");
},
m(target, anchor) {
insert(target, div, anchor);
ctx[2](div);
},
p: noop,
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(div);
ctx[2](null);
}
};
}
function instance9($$self, $$props, $$invalidate) {
var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
let { path: path2 } = $$props;
function getContent(note) {
return __awaiter(this, void 0, void 0, function* () {
const file = app.metadataCache.getFirstLinkpathDest(note, "");
return yield app.vault.cachedRead(file);
});
}
let el;
onMount(() => __awaiter(void 0, void 0, void 0, function* () {
import_obsidian15.MarkdownRenderer.renderMarkdown(yield getContent(path2), el, path2, null);
}));
function div_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
el = $$value;
$$invalidate(0, el);
});
}
$$self.$$set = ($$props2) => {
if ("path" in $$props2)
$$invalidate(1, path2 = $$props2.path);
};
return [el, path2, div_binding];
}
var RenderMarkdown = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance9, create_fragment9, safe_not_equal, { path: 1 }, add_css7);
}
};
var RenderMarkdown_default = RenderMarkdown;
// src/Components/CBTree.svelte
function add_css8(target) {
append_styles(target, "svelte-1df5nr5", ".BC-tree.svelte-1df5nr5{padding-left:5px}pre.indent.svelte-1df5nr5{display:inline;background-color:transparent;position:top}details.svelte-1df5nr5{display:inline-block}.is-unresolved.svelte-1df5nr5{color:var(--text-muted)}");
}
function get_each_context5(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[17] = list[i][0];
child_ctx[18] = list[i][1];
return child_ctx;
}
function create_if_block_24(ctx) {
let h3;
let t0;
let t1;
let t2;
return {
c() {
h3 = element("h3");
t0 = text(ctx[8]);
t1 = text(" of ");
t2 = text(ctx[4]);
},
m(target, anchor) {
insert(target, h3, anchor);
append(h3, t0);
append(h3, t1);
append(h3, t2);
},
p(ctx2, dirty) {
if (dirty & 16)
set_data(t2, ctx2[4]);
},
d(detaching) {
if (detaching)
detach(h3);
}
};
}
function create_if_block6(ctx) {
let current_block_type_index;
let if_block;
let if_block_anchor;
let current;
const if_block_creators = [create_if_block_14, create_else_block3];
const if_blocks = [];
function select_block_type(ctx2, dirty) {
if (ctx2[7] === "open" || ctx2[7] === "closed")
return 0;
return 1;
}
current_block_type_index = select_block_type(ctx, -1);
if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
return {
c() {
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if_blocks[current_block_type_index].m(target, anchor);
insert(target, if_block_anchor, anchor);
current = true;
},
p(ctx2, dirty) {
if_block.p(ctx2, dirty);
},
i(local) {
if (current)
return;
transition_in(if_block);
current = true;
},
o(local) {
transition_out(if_block);
current = false;
},
d(detaching) {
if_blocks[current_block_type_index].d(detaching);
if (detaching)
detach(if_block_anchor);
}
};
}
function create_else_block3(ctx) {
let div;
let pre;
let t0_value = ctx[17] + "-";
let t0;
let t1;
let span;
let a2;
let t2_value = dropDendron(ctx[18], ctx[5]) + "";
let t2;
let a_class_value;
let t3;
let mounted;
let dispose;
function click_handler_1(...args) {
return ctx[15](ctx[18], ...args);
}
function mouseover_handler_1(...args) {
return ctx[16](ctx[18], ...args);
}
return {
c() {
div = element("div");
pre = element("pre");
t0 = text(t0_value);
t1 = space();
span = element("span");
a2 = element("a");
t2 = text(t2_value);
t3 = space();
attr(pre, "class", "indent svelte-1df5nr5");
attr(a2, "class", a_class_value = "internal-link " + (isInVault(ctx[18]) ? "" : "is-unresolved") + " svelte-1df5nr5");
attr(span, "class", "internal-link");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, pre);
append(pre, t0);
append(div, t1);
append(div, span);
append(span, a2);
append(a2, t2);
append(div, t3);
if (!mounted) {
dispose = [
listen(span, "click", click_handler_1),
listen(span, "mouseover", mouseover_handler_1)
];
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if (dirty & 1 && t0_value !== (t0_value = ctx[17] + "-"))
set_data(t0, t0_value);
if (dirty & 1 && t2_value !== (t2_value = dropDendron(ctx[18], ctx[5]) + ""))
set_data(t2, t2_value);
if (dirty & 1 && a_class_value !== (a_class_value = "internal-link " + (isInVault(ctx[18]) ? "" : "is-unresolved") + " svelte-1df5nr5")) {
attr(a2, "class", a_class_value);
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(div);
mounted = false;
run_all(dispose);
}
};
}
function create_if_block_14(ctx) {
let div;
let pre;
let t0_value = ctx[17] + "";
let t0;
let t1;
let details2;
let summary;
let span;
let a2;
let t2_value = dropDendron(ctx[18], ctx[5]) + "";
let t2;
let a_class_value;
let t3;
let rendermarkdown;
let details_open_value;
let t4;
let current;
let mounted;
let dispose;
function click_handler(...args) {
return ctx[13](ctx[18], ...args);
}
function mouseover_handler(...args) {
return ctx[14](ctx[18], ...args);
}
rendermarkdown = new RenderMarkdown_default({ props: { path: ctx[18] } });
return {
c() {
div = element("div");
pre = element("pre");
t0 = text(t0_value);
t1 = space();
details2 = element("details");
summary = element("summary");
span = element("span");
a2 = element("a");
t2 = text(t2_value);
t3 = space();
create_component(rendermarkdown.$$.fragment);
t4 = space();
attr(pre, "class", "indent svelte-1df5nr5");
attr(a2, "class", a_class_value = "internal-link " + (isInVault(ctx[18]) ? "" : "is-unresolved") + " svelte-1df5nr5");
attr(span, "class", "internal-link");
details2.open = details_open_value = ctx[7] === "open";
attr(details2, "class", "svelte-1df5nr5");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, pre);
append(pre, t0);
append(div, t1);
append(div, details2);
append(details2, summary);
append(summary, span);
append(span, a2);
append(a2, t2);
append(details2, t3);
mount_component(rendermarkdown, details2, null);
append(div, t4);
current = true;
if (!mounted) {
dispose = [
listen(span, "click", click_handler),
listen(span, "mouseover", mouseover_handler)
];
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if ((!current || dirty & 1) && t0_value !== (t0_value = ctx[17] + ""))
set_data(t0, t0_value);
if ((!current || dirty & 1) && t2_value !== (t2_value = dropDendron(ctx[18], ctx[5]) + ""))
set_data(t2, t2_value);
if (!current || dirty & 1 && a_class_value !== (a_class_value = "internal-link " + (isInVault(ctx[18]) ? "" : "is-unresolved") + " svelte-1df5nr5")) {
attr(a2, "class", a_class_value);
}
const rendermarkdown_changes = {};
if (dirty & 1)
rendermarkdown_changes.path = ctx[18];
rendermarkdown.$set(rendermarkdown_changes);
},
i(local) {
if (current)
return;
transition_in(rendermarkdown.$$.fragment, local);
current = true;
},
o(local) {
transition_out(rendermarkdown.$$.fragment, local);
current = false;
},
d(detaching) {
if (detaching)
detach(div);
destroy_component(rendermarkdown);
mounted = false;
run_all(dispose);
}
};
}
function create_each_block5(ctx) {
let show_if = meetsConditions(ctx[17], ctx[18], ctx[1], ctx[2], ctx[3]);
let if_block_anchor;
let current;
let if_block = show_if && create_if_block6(ctx);
return {
c() {
if (if_block)
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
current = true;
},
p(ctx2, dirty) {
if (dirty & 15)
show_if = meetsConditions(ctx2[17], ctx2[18], ctx2[1], ctx2[2], ctx2[3]);
if (show_if) {
if (if_block) {
if_block.p(ctx2, dirty);
if (dirty & 15) {
transition_in(if_block, 1);
}
} else {
if_block = create_if_block6(ctx2);
if_block.c();
transition_in(if_block, 1);
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
} else if (if_block) {
group_outros();
transition_out(if_block, 1, 1, () => {
if_block = null;
});
check_outros();
}
},
i(local) {
if (current)
return;
transition_in(if_block);
current = true;
},
o(local) {
transition_out(if_block);
current = false;
},
d(detaching) {
if (if_block)
if_block.d(detaching);
if (detaching)
detach(if_block_anchor);
}
};
}
function create_fragment10(ctx) {
let t;
let div;
let current;
let if_block = ctx[6] !== false && create_if_block_24(ctx);
let each_value = ctx[0];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block5(get_each_context5(ctx, each_value, i));
}
const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
each_blocks[i] = null;
});
return {
c() {
if (if_block)
if_block.c();
t = space();
div = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(div, "class", "BC-tree svelte-1df5nr5");
},
m(target, anchor) {
if (if_block)
if_block.m(target, anchor);
insert(target, t, anchor);
insert(target, div, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div, null);
}
current = true;
},
p(ctx2, [dirty]) {
if (ctx2[6] !== false)
if_block.p(ctx2, dirty);
if (dirty & 687) {
each_value = ctx2[0];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context5(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
transition_in(each_blocks[i], 1);
} else {
each_blocks[i] = create_each_block5(child_ctx);
each_blocks[i].c();
transition_in(each_blocks[i], 1);
each_blocks[i].m(div, null);
}
}
group_outros();
for (i = each_value.length; i < each_blocks.length; i += 1) {
out(i);
}
check_outros();
}
},
i(local) {
if (current)
return;
for (let i = 0; i < each_value.length; i += 1) {
transition_in(each_blocks[i]);
}
current = true;
},
o(local) {
each_blocks = each_blocks.filter(Boolean);
for (let i = 0; i < each_blocks.length; i += 1) {
transition_out(each_blocks[i]);
}
current = false;
},
d(detaching) {
if (if_block)
if_block.d(detaching);
if (detaching)
detach(t);
if (detaching)
detach(div);
destroy_each(each_blocks, detaching);
}
};
}
function instance10($$self, $$props, $$invalidate) {
let { plugin } = $$props;
let { el } = $$props;
let { lines } = $$props;
let { froms } = $$props;
let { min: min3 } = $$props;
let { max: max4 } = $$props;
let { basename } = $$props;
let { parsedSource } = $$props;
const { settings } = plugin;
const { title, content, dir } = parsedSource;
const activeLeafView = app.workspace.activeLeaf.view;
const click_handler = async (link2, e) => await openOrSwitch(link2, e);
const mouseover_handler = (link2, e) => hoverPreview(e, activeLeafView, link2);
const click_handler_1 = async (link2, e) => await openOrSwitch(link2, e);
const mouseover_handler_1 = (link2, e) => hoverPreview(e, activeLeafView, link2);
$$self.$$set = ($$props2) => {
if ("plugin" in $$props2)
$$invalidate(10, plugin = $$props2.plugin);
if ("el" in $$props2)
$$invalidate(11, el = $$props2.el);
if ("lines" in $$props2)
$$invalidate(0, lines = $$props2.lines);
if ("froms" in $$props2)
$$invalidate(1, froms = $$props2.froms);
if ("min" in $$props2)
$$invalidate(2, min3 = $$props2.min);
if ("max" in $$props2)
$$invalidate(3, max4 = $$props2.max);
if ("basename" in $$props2)
$$invalidate(4, basename = $$props2.basename);
if ("parsedSource" in $$props2)
$$invalidate(12, parsedSource = $$props2.parsedSource);
};
return [
lines,
froms,
min3,
max4,
basename,
settings,
title,
content,
dir,
activeLeafView,
plugin,
el,
parsedSource,
click_handler,
mouseover_handler,
click_handler_1,
mouseover_handler_1
];
}
var CBTree = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance10, create_fragment10, safe_not_equal, {
plugin: 10,
el: 11,
lines: 0,
froms: 1,
min: 2,
max: 3,
basename: 4,
parsedSource: 12
}, add_css8);
}
};
var CBTree_default = CBTree;
// src/Codeblocks.ts
function getCodeblockCB(plugin) {
const { settings, db } = plugin;
const { userHiers, createIndexIndent } = settings;
return (source, el, ctx) => {
var _a;
db.start2G("Codeblock");
const parsedSource = parseCodeBlockSource(source);
const err = codeblockError(plugin, parsedSource);
if (err !== "") {
el.innerHTML = err;
db.end2G();
return;
}
let min3 = 0, max4 = Infinity;
let { depth, dir, fields, from, implied, flat } = parsedSource;
if (depth !== void 0) {
const minNum = parseInt(depth[0]);
if (!isNaN(minNum))
min3 = minNum;
const maxNum = parseInt(depth[1]);
if (!isNaN(maxNum))
max4 = maxNum;
}
const currFile = app.metadataCache.getFirstLinkpathDest(ctx.sourcePath, "");
const { basename } = currFile;
let froms = void 0;
if (from !== void 0) {
try {
const api = getDVApi(plugin);
if (api) {
const pages = (_a = api.pagePaths(from)) == null ? void 0 : _a.values;
froms = pages.map(dropFolder);
} else
new import_obsidian16.Notice("Dataview must be enabled for `from` to work.");
} catch (e) {
new import_obsidian16.Notice(`The query "${from}" failed.`);
}
}
const oppDir = getOppDir(dir);
const sub = implied === false ? getSubInDirs(plugin.mainG, dir) : getSubInDirs(plugin.mainG, dir, oppDir);
const closed = getReflexiveClosure(sub, userHiers);
const subFields = fields != null ? fields : getFields(userHiers);
const subClosed = getSubForFields(getSubInDirs(closed, dir), subFields);
const allPaths = dfsAllPaths(subClosed, basename);
const index2 = createIndex(allPaths, false, createIndexIndent);
(0, import_loglevel16.info)({ allPaths, index: index2 });
const lines = indexToLinePairs(index2, flat);
switch (parsedSource.type) {
case "tree":
new CBTree_default({
target: el,
props: {
plugin,
el,
min: min3,
max: max4,
lines,
froms,
basename,
parsedSource
}
});
break;
case "juggl":
createdJugglCB(plugin, el, parsedSource, lines, froms, basename, min3, max4);
break;
}
db.end2G();
};
}
var parseAsBool = (value) => value === "true" ? true : value === "false" ? false : value;
function parseCodeBlockSource(source) {
const lines = source.split("\n");
const getValue = (type2) => {
var _a, _b, _c;
return (_c = (_b = (_a = lines.find((l) => l.startsWith(`${type2}:`))) == null ? void 0 : _a.split(":")) == null ? void 0 : _b[1]) == null ? void 0 : _c.trim();
};
const results = {};
CODEBLOCK_FIELDS.forEach((field) => {
const value = getValue(field);
results[field] = parseAsBool(value);
});
results.fields = results.fields ? splitAndTrim(results.fields) : void 0;
if (results.depth) {
const match = results.depth.match(/(\d*)-?(\d*)/);
results.depth = [match[1], match[2]];
}
return results;
}
function codeblockError(plugin, parsedSource) {
var _a;
const { dir, fields, type: type2, title, depth, flat, content, from, implied } = parsedSource;
const { userHiers } = plugin.settings;
let err = "";
if (!CODEBLOCK_TYPES.includes(type2))
err += `<code>type: ${type2}</code> is not a valid type. It must be one of: ${CODEBLOCK_TYPES.map((type3) => `<code>${type3}</code>`).join(", ")}.</br>`;
const validDir = DIRECTIONS.includes(dir);
if (!validDir)
err += `<code>dir: ${dir}</code> is not a valid direction.</br>`;
const allFields = getFields(userHiers);
(_a = [fields].flat()) == null ? void 0 : _a.forEach((f) => {
if (f !== void 0 && !allFields.includes(f))
err += `<code>fields: ${f}</code> is not a field in your hierarchies.</br>`;
});
if (title !== void 0 && title !== false)
err += `<code>title: ${title}</code> is not a valid value. It has to be <code>false</code>, or leave the entire line out.</br>`;
if (depth !== void 0 && depth.every((num) => isNaN(parseInt(num))))
err += `<code>depth: ${depth}</code> is not a valid value. It has to be a number.</br>`;
if (flat !== void 0 && flat !== true)
err += `<code>flat: ${flat}</code> is not a valid value. It has to be <code>true</code>, or leave the entire line out.</br>`;
if (content !== void 0 && content !== "open" && content !== "closed")
err += `<code>content: ${content}</code> is not a valid value. It has to be <code>open</code> or <code>closed</code>, or leave the entire line out.</br>`;
if (from !== void 0 && !app.plugins.enabledPlugins.has("dataview")) {
err += `Dataview must be enabled to use <code>from</code>.</br>`;
}
if (implied !== void 0 && implied !== false)
err += `<code>implied: ${implied}</code> is not a valid value. It has to be <code>false</code>, or leave the entire line out.</br>`;
return err === "" ? "" : `${err}</br>
A valid example would be:
<pre><code>
type: tree
dir: ${validDir ? dir : "down"}
fields: ${allFields.map((f) => {
return { f, dir: getFieldInfo(userHiers, f).fieldDir };
}).filter((info14) => info14.dir === dir).map((info14) => info14.f).join(", ") || "child"}
depth: 3
</code></pre>`;
}
var indentToDepth = (indent) => indent.length / 2 + 1;
function meetsConditions(indent, node, froms, min3, max4) {
const depth = indentToDepth(indent);
return depth >= min3 && depth <= max4 && (froms === void 0 || froms.includes(node));
}
function createdJugglCB(plugin, target, args, lines, froms, source, min3, max4) {
const nodes = lines.filter(([indent, node]) => meetsConditions(indent, node, froms, min3, max4)).map(([_, node]) => node + ".md");
if (min3 <= 0)
nodes.push(source + ".md");
createJuggl(plugin, target, nodes, args);
}
// src/Commands/jumpToFirstDir.ts
var import_obsidian17 = require("obsidian");
async function jumpToFirstDir(plugin, dir) {
var _a;
const { limitJumpToFirstFields } = plugin.settings;
const file = getCurrFile();
if (!file) {
new import_obsidian17.Notice("You need to be focussed on a Markdown file");
return;
}
const { basename } = file;
const realsNImplieds = getRealnImplied(plugin, basename, dir)[dir];
const allBCs = [...realsNImplieds.reals, ...realsNImplieds.implieds];
if (allBCs.length === 0) {
new import_obsidian17.Notice(`No ${dir} found`);
return;
}
const toNode = (_a = allBCs.find((bc) => limitJumpToFirstFields.includes(bc.field))) == null ? void 0 : _a.to;
if (!toNode) {
new import_obsidian17.Notice(`No note was found in ${dir} given the limited fields allowed: ${limitJumpToFirstFields.join(", ")}`);
return;
}
const toFile = app.metadataCache.getFirstLinkpathDest(toNode, "");
await app.workspace.activeLeaf.openFile(toFile);
}
// src/Commands/threading.ts
var import_obsidian18 = require("obsidian");
var resolveThreadingNameTemplate = (template, currFile, field, dir, dateFormat) => template ? template.replace("{{current}}", currFile.basename).replace("{{field}}", field).replace("{{dir}}", dir).replace("{{date}}", moment().format(dateFormat)) : "Untitled";
function makeFilenameUnique(filename) {
let i = 1, newName = filename;
while (app.metadataCache.getFirstLinkpathDest(newName, "")) {
if (i === 1)
newName += ` ${i}`;
else
newName = newName.slice(0, -2) + ` ${i}`;
i++;
}
return newName;
}
async function resolveThreadingContentTemplate(writeBCsInline, templatePath, oppField, currFile, crumb) {
let newContent = crumb;
if (templatePath) {
const templateFile = app.metadataCache.getFirstLinkpathDest(templatePath, "");
const template = await app.vault.cachedRead(templateFile);
newContent = template.replace(/\{\{BC-thread-crumb\}\}/i, writeBCsInline ? `${oppField}:: [[${currFile.basename}]]` : `${oppField}: ['${currFile.basename}']`);
}
return newContent;
}
async function thread(plugin, field) {
var _a;
const { settings } = plugin;
const {
userHiers,
threadingTemplate,
dateFormat,
threadIntoNewPane,
threadingDirTemplates,
threadUnderCursor,
writeBCsInline
} = settings;
const currFile = getCurrFile();
if (!currFile)
return;
const newFileParent = app.fileManager.getNewFileParent(currFile.path);
const dir = getFieldInfo(userHiers, field).fieldDir;
const oppField = getOppFields(userHiers, field, dir)[0];
let newBasename = resolveThreadingNameTemplate(threadingTemplate, currFile, field, dir, dateFormat);
newBasename = makeFilenameUnique(newBasename);
const oppCrumb = writeBCsInline ? `${oppField}:: [[${currFile.basename}]]` : `---
${oppField}: ['${currFile.basename}']
---`;
const templatePath = threadingDirTemplates[dir];
const newContent = await resolveThreadingContentTemplate(writeBCsInline, templatePath, oppField, currFile, oppCrumb);
const newFile = await app.vault.create((0, import_obsidian18.normalizePath)(`${newFileParent.path}/${newBasename}.md`), newContent);
if (!writeBCsInline) {
const { api } = (_a = app.plugins.plugins.metaedit) != null ? _a : {};
if (!api) {
new import_obsidian18.Notice("Metaedit must be enabled to write to yaml. Alternatively, toggle the setting `Write Breadcrumbs Inline` to use Dataview inline fields instead.");
return;
}
await createOrUpdateYaml(field, newFile.basename, currFile, app.metadataCache.getFileCache(currFile).frontmatter, api);
} else {
const crumb = `${field}:: [[${newFile.basename}]]`;
const { editor } = app.workspace.activeLeaf.view;
if (threadUnderCursor || !editor) {
editor.replaceRange(crumb, editor.getCursor());
} else {
let content = await app.vault.read(currFile);
const splits = splitAtYaml2(content);
content = splits[0] + (splits[0].length ? "\n" : "") + crumb + (splits[1].length ? "\n" : "") + splits[1];
await app.vault.modify(currFile, content);
}
}
const leaf = threadIntoNewPane ? app.workspace.getLeaf(true) : app.workspace.activeLeaf;
await leaf.openFile(newFile, { active: true, mode: "source" });
if (templatePath) {
if (app.plugins.plugins["templater-obsidian"]) {
app.commands.executeCommandById("templater-obsidian:replace-in-file-templater");
} else {
new import_obsidian18.Notice("The Templater plugin must be enabled to resolve the templates in the new note");
}
}
if (threadingTemplate) {
const editor = leaf.view.editor;
editor.setCursor(editor.getValue().length);
} else {
const noteNameInputs = document.getElementsByClassName("view-header-title");
const newNoteInputEl = Array.from(noteNameInputs).find((input) => input.innerText === newBasename);
newNoteInputEl.innerText = "";
newNoteInputEl.focus();
}
}
// src/Commands/WriteBCs.ts
var import_loglevel17 = __toESM(require_loglevel());
var import_obsidian19 = require("obsidian");
async function writeBCToFile(plugin, currFile) {
const { settings, mainG } = plugin;
const file = currFile != null ? currFile : getCurrFile();
const { limitWriteBCCheckboxes, writeBCsInline, userHiers } = settings;
const succInfo = mainG.mapInEdges(file.basename, (k, a2, s, t) => {
const { field, dir } = a2;
const oppField = getOppFields(userHiers, field, dir)[0];
return { succ: s, field: oppField };
});
for (const { succ, field } of succInfo) {
if (!limitWriteBCCheckboxes.includes(field))
return;
const content = await app.vault.read(file);
const [yaml, afterYaml] = splitAtYaml2(content);
if (!writeBCsInline) {
const inner = yaml === "" ? yaml : yaml.slice(4, -4);
const newYaml = changeYaml(inner, field, succ);
const newContent = `---
${newYaml}
---${afterYaml}`;
await app.vault.modify(file, newContent);
} else {
const newContent = yaml + (yaml.length ? "\n" : "") + `${field}:: [[${succ}]]` + (afterYaml.length ? "\n" : "") + afterYaml;
await app.vault.modify(file, newContent);
}
}
}
async function writeBCsToAllFiles(plugin) {
if (!plugin.settings.showWriteAllBCsCmd) {
new import_obsidian19.Notice("You first need to enable this command in Breadcrumbs' settings.");
return;
}
if (window.confirm("This action will write the implied Breadcrumbs of each file to that file.\nIt uses the MetaEdit plugins API to update the YAML, so it should only affect that frontmatter of your note.\nI can't promise that nothing bad will happen. **This operation cannot be undone**.")) {
if (window.confirm("Are you sure? You have been warned that this operation will attempt to update all files with implied breadcrumbs.")) {
if (window.confirm("For real, please make a back up before.")) {
const notice = new import_obsidian19.Notice("Operation Started");
const problemFiles = [];
for (const file of app.vault.getMarkdownFiles()) {
try {
await writeBCToFile(plugin, file);
} catch (e) {
problemFiles.push(file.path);
}
}
notice.setMessage("Operation Complete");
if (problemFiles.length) {
new import_obsidian19.Notice("Some files were not updated due to errors. Check the console to see which ones.");
(0, import_loglevel17.warn)({ problemFiles });
}
}
}
}
}
// src/FieldSuggestor.ts
var import_obsidian20 = require("obsidian");
var FieldSuggestor = class extends import_obsidian20.EditorSuggest {
constructor(plugin) {
super(app);
this.getSuggestions = (context) => {
const { query } = context;
return BC_FIELDS_INFO.map((sug) => sug.field).filter((sug) => sug.includes(query));
};
this.plugin = plugin;
}
onTrigger(cursor, editor, _) {
var _a;
const sub = editor.getLine(cursor.line).substring(0, cursor.ch);
const match = (_a = sub.match(/^BC-(.*)$/)) == null ? void 0 : _a[1];
if (match !== void 0) {
return {
end: cursor,
start: {
ch: sub.lastIndexOf(match),
line: cursor.line
},
query: match
};
}
return null;
}
renderSuggestion(suggestion, el) {
var _a;
el.createDiv({
text: suggestion.replace("BC-", ""),
cls: "BC-suggester-container",
attr: {
"aria-label": (_a = BC_FIELDS_INFO.find((f) => f.field === suggestion)) == null ? void 0 : _a.desc,
"aria-label-position": "right"
}
});
}
selectSuggestion(suggestion) {
const { context, plugin } = this;
if (!context)
return;
const field = BC_FIELDS_INFO.find((f) => f.field === suggestion);
const replacement = `${suggestion}${field == null ? void 0 : field[isInsideYaml(app) ? "afterYaml" : "afterInline"]}`;
context.editor.replaceRange(replacement, { ch: 0, line: context.start.line }, context.end);
}
};
// src/RelationSuggestor.ts
var import_obsidian21 = require("obsidian");
var RelationSuggestor = class extends import_obsidian21.EditorSuggest {
constructor(plugin) {
super(app);
this.getSuggestions = (context) => {
const { query } = context;
const { userHiers } = this.plugin.settings;
return getFields(userHiers).filter((sug) => sug.includes(query));
};
this.plugin = plugin;
}
onTrigger(cursor, editor, _) {
var _a;
const trig = this.plugin.settings.relSuggestorTrigger;
const sub = editor.getLine(cursor.line).substring(0, cursor.ch);
const regex = new RegExp(`.*?${escapeRegex(trig)}(.*)$`);
const match = (_a = regex.exec(sub)) == null ? void 0 : _a[1];
if (match === void 0)
return null;
return {
start: {
ch: sub.lastIndexOf(trig),
line: cursor.line
},
end: cursor,
query: match
};
}
renderSuggestion(suggestion, el) {
el.createDiv({
text: suggestion,
cls: "codeblock-suggestion"
});
}
selectSuggestion(suggestion) {
const { context, plugin } = this;
if (!context)
return;
const trig = plugin.settings.relSuggestorTrigger;
const { start: start2, end, editor } = context;
const replacement = suggestion + (isInsideYaml(app) ? ": " : ":: ") + "[[";
editor.replaceRange(replacement, { ch: start2.ch + 1 - trig.length, line: start2.line }, end);
}
};
// src/Settings/BreadcrumbsSettingTab.ts
var import_obsidian40 = require("obsidian");
// src/Components/KoFi.svelte
function add_css9(target) {
append_styles(target, "svelte-1j4tt4j", ".BC-Kofi-button.svelte-1j4tt4j{margin-top:10px}");
}
function create_fragment11(ctx) {
let script;
let script_src_value;
let t;
let div;
let mounted;
let dispose;
return {
c() {
script = element("script");
t = space();
div = element("div");
attr(script, "type", "text/javascript");
if (!src_url_equal(script.src, script_src_value = "https://ko-fi.com/widgets/widget_2.js"))
attr(script, "src", script_src_value);
attr(div, "class", "BC-Kofi-button svelte-1j4tt4j");
},
m(target, anchor) {
append(document.head, script);
insert(target, t, anchor);
insert(target, div, anchor);
ctx[2](div);
if (!mounted) {
dispose = listen(script, "load", ctx[1]);
mounted = true;
}
},
p: noop,
i: noop,
o: noop,
d(detaching) {
detach(script);
if (detaching)
detach(t);
if (detaching)
detach(div);
ctx[2](null);
mounted = false;
dispose();
}
};
}
function instance11($$self, $$props, $$invalidate) {
let button;
const initializeKofi = () => {
kofiwidget2.init("Support Breadcrumbs development!", "#29abe0", "G2G454TZF");
$$invalidate(0, button.innerHTML = kofiwidget2.getHTML(), button);
};
function div_binding($$value) {
binding_callbacks[$$value ? "unshift" : "push"](() => {
button = $$value;
$$invalidate(0, button);
});
}
return [button, initializeKofi, div_binding];
}
var KoFi = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance11, create_fragment11, safe_not_equal, {}, add_css9);
}
};
var KoFi_default = KoFi;
// src/Settings/CreateIndexSettings.ts
var import_obsidian22 = require("obsidian");
function addCreateIndexSettings(plugin, cmdsDetails) {
const { settings } = plugin;
const createIndexDetails = subDetails("Create Index", cmdsDetails);
new import_obsidian22.Setting(createIndexDetails).setName("Add wiklink brackets").setDesc(fragWithHTML("When creating an index, should it wrap the note name in wikilinks <code>[[]]</code> or not.\n\u2705 = yes, \u274C = no.")).addToggle((toggle) => toggle.setValue(settings.wikilinkIndex).onChange(async (value) => {
settings.wikilinkIndex = value;
await plugin.saveSettings();
}));
new import_obsidian22.Setting(createIndexDetails).setName("Indent Character").setDesc(fragWithHTML("The character(s) used to indent the index. These can be anything you want, but will usually be either spaces or tabs. Enter <code>\\t</code> to use tabs.")).addText((text2) => {
text2.setValue(settings.createIndexIndent).onChange(async (value) => {
settings.createIndexIndent = value;
await plugin.saveSettings();
});
});
new import_obsidian22.Setting(createIndexDetails).setName("Show aliases of notes in index").setDesc("Show the aliases of each note in brackets.\n\u2705 = yes, \u274C = no.").addToggle((toggle) => toggle.setValue(settings.aliasesInIndex).onChange(async (value) => {
settings.aliasesInIndex = value;
await plugin.saveSettings();
}));
}
// src/Settings/CSVSettings.ts
var import_obsidian23 = require("obsidian");
function addCSVSettings(plugin, alternativeHierarchyDetails) {
const { settings } = plugin;
const csvDetails = subDetails("CSV Notes", alternativeHierarchyDetails);
new import_obsidian23.Setting(csvDetails).setName("CSV Breadcrumb Paths").setDesc("The file path of a csv files with breadcrumbs information.").addText((text2) => {
text2.setValue(settings.CSVPaths);
text2.inputEl.onblur = async () => {
settings.CSVPaths = text2.inputEl.value;
await plugin.saveSettings();
};
});
}
// src/Settings/DataviewNoteSettings.ts
var import_obsidian24 = require("obsidian");
function addDataviewSettings(plugin, alternativeHierarchyDetails) {
const { settings } = plugin;
const { userHiers } = settings;
const fields = getFields(userHiers);
const dvDetails = subDetails("Dataview Notes", alternativeHierarchyDetails);
new import_obsidian24.Setting(dvDetails).setName("Default Dataview Note Field").setDesc(fragWithHTML("By default, Dataview notes use the first field in your hierarchies (usually an <code>\u2191</code> field). Choose a different one to use by default, without having to specify <code>BC-dataview-note-field: {field}</code>.</br>If you don't want to choose a default, select the blank option at the bottom of the list.")).addDropdown((dd) => {
fields.forEach((field) => dd.addOption(field, field));
dd.addOption("", "").setValue(settings.dataviewNoteField).onChange(async (field) => {
settings.dataviewNoteField = field;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
}
// src/Settings/DateNoteSettings.ts
var import_obsidian25 = require("obsidian");
function addDateNoteSettings(plugin, alternativeHierarchyDetails) {
const { settings } = plugin;
const { userHiers } = settings;
const fields = getFields(userHiers);
const fieldOptions = { "": "" };
fields.forEach((field) => fieldOptions[field] = field);
const dateNoteDetails = subDetails("Date Notes", alternativeHierarchyDetails);
new import_obsidian25.Setting(dateNoteDetails).setName("Add Date Notes to Graph").setDesc("Breadcrumbs will try to link each daily note to the next one using the date format you provide in the settings below.").addToggle((toggle) => {
toggle.setValue(settings.addDateNotes).onChange(async (value) => {
settings.addDateNotes = value;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
new import_obsidian25.Setting(dateNoteDetails).setName("Daily Note Format").setDesc(fragWithHTML(`The Luxon date format of your daily notes.</br><strong>Note</strong>: Luxon uses different formats to Moment, so your format for the Daily Notes plugin may not work here. Be sure to check out <a href="https://moment.github.io/luxon/#/formatting?id=table-of-tokens">the docs</a> to find the right format.<br>You can escape characters by wrapping them in single quotes (e.g. <code>yyyy-MM-dd 'Daily Note'</code>)`)).addText((text2) => {
text2.setValue(settings.dateNoteFormat);
text2.inputEl.onblur = async () => {
settings.dateNoteFormat = text2.getValue();
await plugin.saveSettings();
await refreshIndex(plugin);
};
});
new import_obsidian25.Setting(dateNoteDetails).setName("Date Note Field").setDesc(fragWithHTML("Select a field to point to tomorrow's note from the current note. The opposite field will be used to point to yesterday's note.")).addDropdown((dd) => {
dd.addOptions(fieldOptions).setValue(settings.dateNoteField).onChange(async (field) => {
settings.dateNoteField = field;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
}
// src/Settings/DebuggingSettings.ts
var import_loglevel18 = __toESM(require_loglevel());
var import_obsidian26 = require("obsidian");
function addDebuggingsSettings(plugin, containerEl) {
const { settings } = plugin;
const debugDetails = details("Debugging", containerEl);
new import_obsidian26.Setting(debugDetails).setName("Debug Mode").setDesc(fragWithHTML("Set the minimum level of debug messages to console log. If you choose <code>TRACE</code>, then everything will be logged. If you choose <code>ERROR</code>, then only the most necessary issues will be logged. <code>SILENT</code> will turn off all logs.")).addDropdown((dd) => {
Object.keys(import_loglevel18.default.levels).forEach((key) => dd.addOption(key, key));
dd.setValue(settings.debugMode).onChange(async (value) => {
import_loglevel18.default.setLevel(value);
settings.debugMode = value;
await plugin.saveSettings();
});
});
debugDetails.createEl("button", { text: "Console log settings" }, (el) => {
el.addEventListener("click", () => console.log(settings));
});
}
// src/Settings/DendronSettings.ts
var import_obsidian27 = require("obsidian");
function addDendronSettings(plugin, alternativeHierarchyDetails) {
const { settings } = plugin;
const { userHiers } = settings;
const fields = getFields(userHiers);
const dendronDetails = subDetails("Dendron Notes", alternativeHierarchyDetails);
new import_obsidian27.Setting(dendronDetails).setName("Add Dendron notes to graph").setDesc(fragWithHTML("Dendron notes create a hierarchy using note names.</br><code>nmath.algebra</code> is a note about algebra, whose parent is <code>math</code>.</br><code>nmath.calculus.limits</code> is a note about limits whose parent is the note <code>math.calculus</code>, the parent of which is <code>math</code>.")).addToggle((toggle) => toggle.setValue(settings.addDendronNotes).onChange(async (value) => {
settings.addDendronNotes = value;
await plugin.saveSettings();
}));
new import_obsidian27.Setting(dendronDetails).setName("Delimiter").setDesc(fragWithHTML("Which delimiter should Breadcrumbs look for? The default is <code>.</code>.")).addText((text2) => {
text2.setPlaceholder("Delimiter").setValue(settings.dendronNoteDelimiter);
text2.inputEl.onblur = async () => {
const value = text2.getValue();
if (value)
settings.dendronNoteDelimiter = value;
else {
new import_obsidian27.Notice(`The delimiter can't be blank`);
settings.dendronNoteDelimiter = DEFAULT_SETTINGS.dendronNoteDelimiter;
}
await plugin.saveSettings();
};
});
new import_obsidian27.Setting(dendronDetails).setName("Trim Dendron Note Names").setDesc(fragWithHTML("When displaying a dendron note name, should it be trimmed to only show the last item in the chain?</br>e.g. <code>A.B.C</code> \u2192 <code>C</code>.")).addToggle((toggle) => toggle.setValue(settings.trimDendronNotes).onChange(async (value) => {
settings.trimDendronNotes = value;
await plugin.saveSettings();
await plugin.getActiveTYPEView(MATRIX_VIEW).draw();
}));
new import_obsidian27.Setting(dendronDetails).setName("Dendron Note Field").setDesc("Which field should Breadcrumbs use for Dendron notes?").addDropdown((dd) => {
fields.forEach((field) => dd.addOption(field, field));
dd.setValue(settings.dendronNoteField);
dd.onChange(async (value) => {
settings.dendronNoteField = value;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
}
// src/Settings/GeneralSettings.ts
var import_obsidian28 = require("obsidian");
function addGeneralSettings(plugin, containerEl) {
const { settings } = plugin;
const generalDetails = details("General Options", containerEl);
new import_obsidian28.Setting(generalDetails).setName("Refresh Index on Note Change").setDesc(fragWithHTML("Refresh the Breadcrumbs index data everytime you change notes.</br><strong>Note</strong>: This can be very slow on large vaults.")).addToggle((toggle) => toggle.setValue(settings.refreshOnNoteChange).onChange(async (value) => {
settings.refreshOnNoteChange = value;
await plugin.saveSettings();
}));
new import_obsidian28.Setting(generalDetails).setName("Refresh Index On Note Save").addToggle((toggle) => toggle.setValue(settings.refreshOnNoteSave).onChange(async (value) => {
settings.refreshOnNoteSave = value;
await plugin.saveSettings();
}));
new import_obsidian28.Setting(generalDetails).setName("Show Refresh Index Notice").setDesc("When Refreshing Index, should it show a notice once the operation is complete?").addToggle((toggle) => toggle.setValue(settings.showRefreshNotice).onChange(async (value) => {
settings.showRefreshNotice = value;
await plugin.saveSettings();
}));
new import_obsidian28.Setting(generalDetails).setName("Alias Fields").setDesc(fragWithHTML("A comma-separated list of fields used to specify aliases. These fields will be checked, in order, to display an alternate note title in different views.</br>This field will probably be <code>alias</code> or <code>aliases</code>, but it can be anything, like <code>title</code>.")).addText((text2) => {
text2.setValue(settings.altLinkFields.join(", "));
text2.inputEl.onblur = async () => {
settings.altLinkFields = splitAndTrim(text2.getValue());
await plugin.saveSettings();
};
});
new import_obsidian28.Setting(generalDetails).setName("Only show first alias").setDesc("If a note has an alias (using the fields in the setting above), should only the first one be shown?").addToggle((toggle) => toggle.setValue(!settings.showAllAliases).onChange(async (value) => {
settings.showAllAliases = !value;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
new import_obsidian28.Setting(generalDetails).setName("Use yaml or inline fields for hierarchy data").setDesc("If enabled, Breadcrumbs will make it's hierarchy using yaml fields, and inline Dataview fields.\nIf this is disabled, it will only use Juggl links (See below).").addToggle((toggle) => toggle.setValue(settings.useAllMetadata).onChange(async (value) => {
settings.useAllMetadata = value;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
new import_obsidian28.Setting(generalDetails).setName("Use Juggl link syntax without having Juggl installed.").setDesc(fragWithHTML(`Should Breadcrumbs look for <a href="https://juggl.io/Link+Types" aria-label="https://juggl.io/Link+Types">Juggl links</a> even if you don't have Juggl installed? If you do have Juggl installed, it will always look for Juggl links.`)).addToggle((toggle) => toggle.setValue(settings.parseJugglLinksWithoutJuggl).onChange(async (value) => {
settings.parseJugglLinksWithoutJuggl = value;
await plugin.saveSettings();
}));
new import_obsidian28.Setting(generalDetails).setName("Enable Field Suggestor").setDesc(fragWithHTML("Alot of Breadcrumbs features require a metadata (or inline Dataview) field to work. For example, `BC-folder-note`.</br>The Field Suggestor will show an autocomplete menu with all available Breadcrumbs field options when you type <code>BC-</code> at the start of a line.")).addToggle((toggle) => toggle.setValue(settings.fieldSuggestor).onChange(async (value) => {
settings.fieldSuggestor = value;
await plugin.saveSettings();
}));
new import_obsidian28.Setting(generalDetails).setName("Enable Relation Suggestor").setDesc(fragWithHTML("Enable an editor suggestor which gets triggered by a custom string to show a list of relations from your hierarchies to insert.")).addToggle((toggle) => toggle.setValue(settings.enableRelationSuggestor).onChange(async (value) => {
settings.enableRelationSuggestor = value;
await plugin.saveSettings();
}));
new import_obsidian28.Setting(generalDetails).setName("Relation Suggestor Trigger").setDesc(fragWithHTML("The string used to trigger the relation suggestor. Default is <code>\\</code>.")).addText((text2) => text2.setValue(settings.relSuggestorTrigger).onChange(async (value) => {
settings.relSuggestorTrigger = value;
await plugin.saveSettings();
}));
if (app.plugins.plugins.dataview !== void 0) {
new import_obsidian28.Setting(generalDetails).setName("Dataview Wait Time").setDesc("Enter an integer number of seconds to wait for the Dataview Index to load. The larger your vault, the longer it will take. The default is 5 seconds.").addText((text2) => text2.setPlaceholder("Seconds").setValue((settings.dvWaitTime / 1e3).toString()).onChange(async (value) => {
const num = Number(value);
if (num > 0) {
settings.dvWaitTime = num * 1e3;
await plugin.saveSettings();
} else {
new import_obsidian28.Notice("The interval must be a non-negative number");
}
}));
}
}
// src/Settings/HierarchyNoteSettings.ts
var import_obsidian29 = require("obsidian");
function addHierarchyNoteSettings(plugin, alternativeHierarchyDetails) {
const { settings } = plugin;
const hierarchyNoteDetails = subDetails("Hierarchy Notes", alternativeHierarchyDetails);
new import_obsidian29.Setting(hierarchyNoteDetails).setName("Hierarchy Note(s)").setDesc(fragWithHTML("A comma-separated list of notes used to create external Breadcrumb structures.<br>You can also point to a <em>folder</em> of hierarchy notes by entering <code>folderName/</code> (ending with a <code>/</code>).<br>Hierarchy note names and folders of hierarchy notes can both be entered in the same comma-separated list.")).addText((text2) => {
text2.setPlaceholder("Hierarchy Note(s)").setValue(settings.hierarchyNotes.join(", "));
text2.inputEl.onblur = async () => {
const splits = splitAndTrim(text2.getValue());
settings.hierarchyNotes = splits;
await plugin.saveSettings();
};
});
new import_obsidian29.Setting(hierarchyNoteDetails).setName("Hierarchy note is parent of top-level items").setDesc("Should the actual hierarchy note be treated as the parent of all the top-level items in the list? \u2705 = Yes, \u274C = No").addToggle((toggle) => {
toggle.setValue(settings.hierarchyNoteIsParent).onChange(async (value) => {
settings.hierarchyNoteIsParent = value;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
new import_obsidian29.Setting(hierarchyNoteDetails).setName("Default Hierarchy Note Field").setDesc(fragWithHTML("By default, hierarchy notes use the first <code>up</code> field in your hierarchies. Choose a different one to use by default. If you don't want to choose a default, select the blank option at the bottom of the list.")).addDropdown((dd) => {
const upFields = getFields(settings.userHiers, "up");
const options = {};
upFields.forEach((field) => options[field] = field);
dd.addOptions(options).setValue(settings.HNUpField || upFields[0]).onChange(async (field) => {
settings.HNUpField = field;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
}
// src/Components/UserHierarchies.svelte
var import_obsidian30 = require("obsidian");
// node_modules/svelte-icons/components/IconBase.svelte
function add_css10(target) {
append_styles(target, "svelte-c8tyih", "svg.svelte-c8tyih{stroke:currentColor;fill:currentColor;stroke-width:0;width:100%;height:auto;max-height:100%}");
}
function create_if_block7(ctx) {
let title_1;
let t;
return {
c() {
title_1 = svg_element("title");
t = text(ctx[0]);
},
m(target, anchor) {
insert(target, title_1, anchor);
append(title_1, t);
},
p(ctx2, dirty) {
if (dirty & 1)
set_data(t, ctx2[0]);
},
d(detaching) {
if (detaching)
detach(title_1);
}
};
}
function create_fragment12(ctx) {
let svg;
let if_block_anchor;
let current;
let if_block = ctx[0] && create_if_block7(ctx);
const default_slot_template = ctx[3].default;
const default_slot = create_slot(default_slot_template, ctx, ctx[2], null);
return {
c() {
svg = svg_element("svg");
if (if_block)
if_block.c();
if_block_anchor = empty();
if (default_slot)
default_slot.c();
attr(svg, "xmlns", "http://www.w3.org/2000/svg");
attr(svg, "viewBox", ctx[1]);
attr(svg, "class", "svelte-c8tyih");
},
m(target, anchor) {
insert(target, svg, anchor);
if (if_block)
if_block.m(svg, null);
append(svg, if_block_anchor);
if (default_slot) {
default_slot.m(svg, null);
}
current = true;
},
p(ctx2, [dirty]) {
if (ctx2[0]) {
if (if_block) {
if_block.p(ctx2, dirty);
} else {
if_block = create_if_block7(ctx2);
if_block.c();
if_block.m(svg, if_block_anchor);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
if (default_slot) {
if (default_slot.p && (!current || dirty & 4)) {
update_slot_base(default_slot, default_slot_template, ctx2, ctx2[2], !current ? get_all_dirty_from_scope(ctx2[2]) : get_slot_changes(default_slot_template, ctx2[2], dirty, null), null);
}
}
if (!current || dirty & 2) {
attr(svg, "viewBox", ctx2[1]);
}
},
i(local) {
if (current)
return;
transition_in(default_slot, local);
current = true;
},
o(local) {
transition_out(default_slot, local);
current = false;
},
d(detaching) {
if (detaching)
detach(svg);
if (if_block)
if_block.d();
if (default_slot)
default_slot.d(detaching);
}
};
}
function instance12($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
let { title = null } = $$props;
let { viewBox } = $$props;
$$self.$$set = ($$props2) => {
if ("title" in $$props2)
$$invalidate(0, title = $$props2.title);
if ("viewBox" in $$props2)
$$invalidate(1, viewBox = $$props2.viewBox);
if ("$$scope" in $$props2)
$$invalidate(2, $$scope = $$props2.$$scope);
};
return [title, viewBox, $$scope, slots];
}
var IconBase = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance12, create_fragment12, safe_not_equal, { title: 0, viewBox: 1 }, add_css10);
}
};
var IconBase_default = IconBase;
// node_modules/svelte-icons/fa/FaListUl.svelte
function create_default_slot(ctx) {
let path2;
return {
c() {
path2 = svg_element("path");
attr(path2, "d", "M48 48a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm448 16H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z");
},
m(target, anchor) {
insert(target, path2, anchor);
},
d(detaching) {
if (detaching)
detach(path2);
}
};
}
function create_fragment13(ctx) {
let iconbase;
let current;
const iconbase_spread_levels = [{ viewBox: "0 0 512 512" }, ctx[0]];
let iconbase_props = {
$$slots: { default: [create_default_slot] },
$$scope: { ctx }
};
for (let i = 0; i < iconbase_spread_levels.length; i += 1) {
iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]);
}
iconbase = new IconBase_default({ props: iconbase_props });
return {
c() {
create_component(iconbase.$$.fragment);
},
m(target, anchor) {
mount_component(iconbase, target, anchor);
current = true;
},
p(ctx2, [dirty]) {
const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {};
if (dirty & 2) {
iconbase_changes.$$scope = { dirty, ctx: ctx2 };
}
iconbase.$set(iconbase_changes);
},
i(local) {
if (current)
return;
transition_in(iconbase.$$.fragment, local);
current = true;
},
o(local) {
transition_out(iconbase.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(iconbase, detaching);
}
};
}
function instance13($$self, $$props, $$invalidate) {
$$self.$$set = ($$new_props) => {
$$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));
};
$$props = exclude_internal_props($$props);
return [$$props];
}
var FaListUl = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance13, create_fragment13, safe_not_equal, {});
}
};
var FaListUl_default = FaListUl;
// node_modules/svelte-icons/fa/FaPlus.svelte
function create_default_slot2(ctx) {
let path2;
return {
c() {
path2 = svg_element("path");
attr(path2, "d", "M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z");
},
m(target, anchor) {
insert(target, path2, anchor);
},
d(detaching) {
if (detaching)
detach(path2);
}
};
}
function create_fragment14(ctx) {
let iconbase;
let current;
const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, ctx[0]];
let iconbase_props = {
$$slots: { default: [create_default_slot2] },
$$scope: { ctx }
};
for (let i = 0; i < iconbase_spread_levels.length; i += 1) {
iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]);
}
iconbase = new IconBase_default({ props: iconbase_props });
return {
c() {
create_component(iconbase.$$.fragment);
},
m(target, anchor) {
mount_component(iconbase, target, anchor);
current = true;
},
p(ctx2, [dirty]) {
const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {};
if (dirty & 2) {
iconbase_changes.$$scope = { dirty, ctx: ctx2 };
}
iconbase.$set(iconbase_changes);
},
i(local) {
if (current)
return;
transition_in(iconbase.$$.fragment, local);
current = true;
},
o(local) {
transition_out(iconbase.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(iconbase, detaching);
}
};
}
function instance14($$self, $$props, $$invalidate) {
$$self.$$set = ($$new_props) => {
$$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));
};
$$props = exclude_internal_props($$props);
return [$$props];
}
var FaPlus = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance14, create_fragment14, safe_not_equal, {});
}
};
var FaPlus_default = FaPlus;
// node_modules/svelte-icons/fa/FaRegTrashAlt.svelte
function create_default_slot3(ctx) {
let path2;
return {
c() {
path2 = svg_element("path");
attr(path2, "d", "M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z");
},
m(target, anchor) {
insert(target, path2, anchor);
},
d(detaching) {
if (detaching)
detach(path2);
}
};
}
function create_fragment15(ctx) {
let iconbase;
let current;
const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, ctx[0]];
let iconbase_props = {
$$slots: { default: [create_default_slot3] },
$$scope: { ctx }
};
for (let i = 0; i < iconbase_spread_levels.length; i += 1) {
iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]);
}
iconbase = new IconBase_default({ props: iconbase_props });
return {
c() {
create_component(iconbase.$$.fragment);
},
m(target, anchor) {
mount_component(iconbase, target, anchor);
current = true;
},
p(ctx2, [dirty]) {
const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {};
if (dirty & 2) {
iconbase_changes.$$scope = { dirty, ctx: ctx2 };
}
iconbase.$set(iconbase_changes);
},
i(local) {
if (current)
return;
transition_in(iconbase.$$.fragment, local);
current = true;
},
o(local) {
transition_out(iconbase.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(iconbase, detaching);
}
};
}
function instance15($$self, $$props, $$invalidate) {
$$self.$$set = ($$new_props) => {
$$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));
};
$$props = exclude_internal_props($$props);
return [$$props];
}
var FaRegTrashAlt = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance15, create_fragment15, safe_not_equal, {});
}
};
var FaRegTrashAlt_default = FaRegTrashAlt;
// src/Components/UserHierarchies.svelte
function add_css11(target) {
append_styles(target, "svelte-1e9on6f", "label.BC-Arrow-Label.svelte-1e9on6f.svelte-1e9on6f{display:inline-block;width:20px !important}div.BC-Buttons.svelte-1e9on6f.svelte-1e9on6f{padding-bottom:5px}details.BC-Hier-Details.svelte-1e9on6f.svelte-1e9on6f{border:1px solid var(--background-modifier-border);border-radius:10px;padding:10px 5px 10px 10px;margin-bottom:15px}.BC-Hier-Details.svelte-1e9on6f summary.svelte-1e9on6f::marker{font-size:10px}.BC-Hier-Details.svelte-1e9on6f summary button.svelte-1e9on6f{float:right}.icon.svelte-1e9on6f.svelte-1e9on6f{color:var(--text-normal);display:inline-block;padding-top:3px;width:17px;height:17px}");
}
function get_each_context6(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[13] = list[i];
child_ctx[15] = i;
return child_ctx;
}
function get_each_context_15(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[16] = list[i];
return child_ctx;
}
function create_each_block_15(ctx) {
let div;
let label;
let t0_value = ARROW_DIRECTIONS[ctx[16]] + "";
let t0;
let label_for_value;
let t1;
let input;
let input_name_value;
let input_value_value;
let mounted;
let dispose;
function change_handler(...args) {
return ctx[11](ctx[15], ctx[16], ...args);
}
return {
c() {
var _a, _b;
div = element("div");
label = element("label");
t0 = text(t0_value);
t1 = space();
input = element("input");
attr(label, "class", "BC-Arrow-Label svelte-1e9on6f");
attr(label, "for", label_for_value = ctx[16]);
attr(input, "type", "text");
attr(input, "size", "20");
attr(input, "name", input_name_value = ctx[16]);
input.value = input_value_value = (_b = (_a = ctx[13][ctx[16]]) == null ? void 0 : _a.join(", ")) != null ? _b : "";
},
m(target, anchor) {
insert(target, div, anchor);
append(div, label);
append(label, t0);
append(div, t1);
append(div, input);
if (!mounted) {
dispose = listen(input, "change", change_handler);
mounted = true;
}
},
p(new_ctx, dirty) {
var _a, _b;
ctx = new_ctx;
if (dirty & 2 && input_value_value !== (input_value_value = (_b = (_a = ctx[13][ctx[16]]) == null ? void 0 : _a.join(", ")) != null ? _b : "") && input.value !== input_value_value) {
input.value = input_value_value;
}
},
d(detaching) {
if (detaching)
detach(div);
mounted = false;
dispose();
}
};
}
function create_each_block6(ctx) {
let details2;
let summary;
let t0_value = DIRECTIONS.map(func).map(func_1).join(" ") + "";
let t0;
let t1;
let span;
let button0;
let t3;
let button1;
let t5;
let button2;
let t7;
let t8;
let mounted;
let dispose;
function func(...args) {
return ctx[7](ctx[13], ...args);
}
function click_handler_3() {
return ctx[8](ctx[15]);
}
function click_handler_4() {
return ctx[9](ctx[15]);
}
function click_handler_5() {
return ctx[10](ctx[15]);
}
let each_value_1 = DIRECTIONS;
let each_blocks = [];
for (let i = 0; i < each_value_1.length; i += 1) {
each_blocks[i] = create_each_block_15(get_each_context_15(ctx, each_value_1, i));
}
return {
c() {
details2 = element("details");
summary = element("summary");
t0 = text(t0_value);
t1 = space();
span = element("span");
button0 = element("button");
button0.textContent = "\u2191";
t3 = space();
button1 = element("button");
button1.textContent = "\u2193";
t5 = space();
button2 = element("button");
button2.textContent = "X";
t7 = space();
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
t8 = space();
attr(button0, "aria-label", "Swap with Hierarchy Above");
attr(button0, "class", "svelte-1e9on6f");
attr(button1, "aria-label", "Swap with Hierarchy Below");
attr(button1, "class", "svelte-1e9on6f");
attr(button2, "aria-label", "Remove Hierarchy");
attr(button2, "class", "svelte-1e9on6f");
attr(span, "class", "BC-Buttons");
attr(summary, "class", "svelte-1e9on6f");
attr(details2, "class", "BC-Hier-Details svelte-1e9on6f");
},
m(target, anchor) {
insert(target, details2, anchor);
append(details2, summary);
append(summary, t0);
append(summary, t1);
append(summary, span);
append(span, button0);
append(span, t3);
append(span, button1);
append(span, t5);
append(span, button2);
append(details2, t7);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(details2, null);
}
append(details2, t8);
if (!mounted) {
dispose = [
listen(button0, "click", click_handler_3),
listen(button1, "click", click_handler_4),
listen(button2, "click", click_handler_5)
];
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if (dirty & 2 && t0_value !== (t0_value = DIRECTIONS.map(func).map(func_1).join(" ") + ""))
set_data(t0, t0_value);
if (dirty & 15) {
each_value_1 = DIRECTIONS;
let i;
for (i = 0; i < each_value_1.length; i += 1) {
const child_ctx = get_each_context_15(ctx, each_value_1, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block_15(child_ctx);
each_blocks[i].c();
each_blocks[i].m(details2, t8);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value_1.length;
}
},
d(detaching) {
if (detaching)
detach(details2);
destroy_each(each_blocks, detaching);
mounted = false;
run_all(dispose);
}
};
}
function create_fragment16(ctx) {
let div4;
let div3;
let button0;
let div0;
let faplus;
let t0;
let button1;
let div1;
let faregtrashalt;
let t1;
let button2;
let div2;
let falistul;
let t2;
let current;
let mounted;
let dispose;
faplus = new FaPlus_default({});
faregtrashalt = new FaRegTrashAlt_default({});
falistul = new FaListUl_default({});
let each_value = ctx[1];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block6(get_each_context6(ctx, each_value, i));
}
return {
c() {
div4 = element("div");
div3 = element("div");
button0 = element("button");
div0 = element("div");
create_component(faplus.$$.fragment);
t0 = space();
button1 = element("button");
div1 = element("div");
create_component(faregtrashalt.$$.fragment);
t1 = space();
button2 = element("button");
div2 = element("div");
create_component(falistul.$$.fragment);
t2 = space();
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(div0, "class", "icon svelte-1e9on6f");
attr(button0, "aria-label", "Add New Hierarchy");
attr(div1, "class", "icon svelte-1e9on6f");
attr(button1, "aria-label", "Reset All Hierarchies");
attr(div2, "class", "icon svelte-1e9on6f");
attr(button2, "aria-label", "Show Hierarchies");
attr(div3, "class", "BC-Buttons svelte-1e9on6f");
},
m(target, anchor) {
insert(target, div4, anchor);
append(div4, div3);
append(div3, button0);
append(button0, div0);
mount_component(faplus, div0, null);
append(div3, t0);
append(div3, button1);
append(button1, div1);
mount_component(faregtrashalt, div1, null);
append(div3, t1);
append(div3, button2);
append(button2, div2);
mount_component(falistul, div2, null);
append(div4, t2);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div4, null);
}
current = true;
if (!mounted) {
dispose = [
listen(button0, "click", ctx[4]),
listen(button1, "click", ctx[5]),
listen(button2, "click", ctx[6])
];
mounted = true;
}
},
p(ctx2, [dirty]) {
if (dirty & 15) {
each_value = ctx2[1];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context6(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block6(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div4, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
},
i(local) {
if (current)
return;
transition_in(faplus.$$.fragment, local);
transition_in(faregtrashalt.$$.fragment, local);
transition_in(falistul.$$.fragment, local);
current = true;
},
o(local) {
transition_out(faplus.$$.fragment, local);
transition_out(faregtrashalt.$$.fragment, local);
transition_out(falistul.$$.fragment, local);
current = false;
},
d(detaching) {
if (detaching)
detach(div4);
destroy_component(faplus);
destroy_component(faregtrashalt);
destroy_component(falistul);
destroy_each(each_blocks, detaching);
mounted = false;
run_all(dispose);
}
};
}
var func_1 = (dirFields) => `(${dirFields})`;
function instance16($$self, $$props, $$invalidate) {
var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
let { plugin } = $$props;
const { settings } = plugin;
let currHiers = [...plugin.settings.userHiers];
function update2(currHiers2) {
return __awaiter(this, void 0, void 0, function* () {
$$invalidate(0, plugin.settings.userHiers = currHiers2, plugin);
yield plugin.saveSettings();
});
}
const click_handler = async () => $$invalidate(1, currHiers = [...currHiers, blankUserHier()]);
const click_handler_1 = async () => {
if (window.confirm("Are you sure you want to reset all hierarchies?")) {
$$invalidate(1, currHiers = []);
await update2(currHiers);
}
};
const click_handler_2 = () => new import_obsidian30.Notice(currHiers.map(hierToStr).join("\n\n"));
const func = (hier, dir) => {
var _a, _b;
return (_b = (_a = hier[dir]) == null ? void 0 : _a.join(", ")) != null ? _b : "";
};
const click_handler_3 = async (i) => {
$$invalidate(1, currHiers = swapItems(i, i - 1, currHiers));
await update2(currHiers);
};
const click_handler_4 = async (i) => {
$$invalidate(1, currHiers = swapItems(i, i + 1, currHiers));
await update2(currHiers);
};
const click_handler_5 = async (i) => {
const oldHier = currHiers.splice(i, 1)[0];
oldHier.up.forEach((upField) => {
const index2 = settings.limitTrailCheckboxes.indexOf(upField);
if (index2 > -1)
settings.limitTrailCheckboxes.splice(index2, 1);
});
DIRECTIONS.forEach((dir) => {
oldHier[dir].forEach((field) => {
const indexI = settings.limitJumpToFirstFields.indexOf(field);
if (indexI > -1)
settings.limitJumpToFirstFields.splice(indexI, 1);
const indexJ = settings.limitWriteBCCheckboxes.indexOf(field);
if (indexJ > -1)
settings.limitJumpToFirstFields.splice(indexJ, 1);
});
});
$$invalidate(1, currHiers);
await update2(currHiers);
};
const change_handler = async (i, dir, e) => {
const { value } = e.target;
const splits = splitAndTrim(value);
$$invalidate(1, currHiers[i][dir] = splits, currHiers);
await update2(currHiers);
splits.forEach((split) => {
if (dir === "up" && !settings.limitTrailCheckboxes.includes(split))
settings.limitTrailCheckboxes.push(split);
if (!settings.limitJumpToFirstFields.includes(split))
settings.limitJumpToFirstFields.push(split);
if (!settings.limitWriteBCCheckboxes.includes(split))
settings.limitWriteBCCheckboxes.push(split);
});
await plugin.saveSettings();
};
$$self.$$set = ($$props2) => {
if ("plugin" in $$props2)
$$invalidate(0, plugin = $$props2.plugin);
};
return [
plugin,
currHiers,
settings,
update2,
click_handler,
click_handler_1,
click_handler_2,
func,
click_handler_3,
click_handler_4,
click_handler_5,
change_handler
];
}
var UserHierarchies = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance16, create_fragment16, safe_not_equal, { plugin: 0 }, add_css11);
}
};
var UserHierarchies_default = UserHierarchies;
// src/Settings/HierarchySettings.ts
function addHierarchySettings(plugin, containerEl) {
const fieldDetails = details("Hierarchies", containerEl);
fieldDetails.createEl("p", {
text: "Here you can set up different hierarchies you use in your vault. To add a new hierarchy, click the plus button. Then, fill in the field names of your hierachy into the 5 boxes that appear."
});
fieldDetails.createEl("p", {
text: "For each direction, you can enter multiple field names in a comma-seperated list. For example: `parent, broader, upper`"
});
new UserHierarchies_default({
target: fieldDetails,
props: { plugin }
});
}
// src/Components/Checkboxes.svelte
var import_loglevel19 = __toESM(require_loglevel());
function add_css12(target) {
append_styles(target, "svelte-d1my4i", ".grid.svelte-d1my4i{display:grid;grid-template-columns:repeat(auto-fit, minmax(100px, 1fr))}");
}
function get_each_context7(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[12] = list[i];
return child_ctx;
}
function create_each_block7(ctx) {
let div;
let label;
let input;
let input_value_value;
let t0;
let t1_value = ctx[12] + "";
let t1;
let t2;
let mounted;
let dispose;
return {
c() {
div = element("div");
label = element("label");
input = element("input");
t0 = space();
t1 = text(t1_value);
t2 = space();
attr(input, "type", "checkbox");
input.__value = input_value_value = ctx[12];
input.value = input.__value;
ctx[8][0].push(input);
},
m(target, anchor) {
insert(target, div, anchor);
append(div, label);
append(label, input);
input.checked = ~ctx[1].indexOf(input.__value);
append(label, t0);
append(label, t1);
append(div, t2);
if (!mounted) {
dispose = [
listen(input, "change", ctx[7]),
listen(input, "change", ctx[9])
];
mounted = true;
}
},
p(ctx2, dirty) {
if (dirty & 1 && input_value_value !== (input_value_value = ctx2[12])) {
input.__value = input_value_value;
input.value = input.__value;
}
if (dirty & 2) {
input.checked = ~ctx2[1].indexOf(input.__value);
}
if (dirty & 1 && t1_value !== (t1_value = ctx2[12] + ""))
set_data(t1, t1_value);
},
d(detaching) {
if (detaching)
detach(div);
ctx[8][0].splice(ctx[8][0].indexOf(input), 1);
mounted = false;
run_all(dispose);
}
};
}
function create_fragment17(ctx) {
let div0;
let button;
let t0;
let t1_value = ctx[2] ? "None" : "All";
let t1;
let t2;
let div1;
let mounted;
let dispose;
let each_value = ctx[0];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block7(get_each_context7(ctx, each_value, i));
}
return {
c() {
div0 = element("div");
button = element("button");
t0 = text("Select ");
t1 = text(t1_value);
t2 = space();
div1 = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(div1, "class", "grid svelte-d1my4i");
},
m(target, anchor) {
insert(target, div0, anchor);
append(div0, button);
append(button, t0);
append(button, t1);
insert(target, t2, anchor);
insert(target, div1, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div1, null);
}
if (!mounted) {
dispose = listen(button, "click", ctx[6]);
mounted = true;
}
},
p(ctx2, [dirty]) {
if (dirty & 4 && t1_value !== (t1_value = ctx2[2] ? "None" : "All"))
set_data(t1, t1_value);
if (dirty & 11) {
each_value = ctx2[0];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context7(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block7(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div1, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(div0);
if (detaching)
detach(t2);
if (detaching)
detach(div1);
destroy_each(each_blocks, detaching);
mounted = false;
dispose();
}
};
}
function instance17($$self, $$props, $$invalidate) {
let toNone;
var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
let { plugin } = $$props;
let { settingName } = $$props;
let { options } = $$props;
const { settings } = plugin;
let selected = settings[settingName];
function save() {
return __awaiter(this, void 0, void 0, function* () {
if (settings[settingName] === void 0)
return (0, import_loglevel19.warn)(settingName + " not found in BC settings");
settings[settingName] = selected;
yield plugin.saveSettings();
yield refreshIndex(plugin);
});
}
const $$binding_groups = [[]];
const click_handler = async () => {
if (toNone)
$$invalidate(1, selected = []);
else
$$invalidate(1, selected = options);
await save();
};
function input_change_handler() {
selected = get_binding_group_value($$binding_groups[0], this.__value, this.checked);
$$invalidate(1, selected);
}
const change_handler = async () => await save();
$$self.$$set = ($$props2) => {
if ("plugin" in $$props2)
$$invalidate(4, plugin = $$props2.plugin);
if ("settingName" in $$props2)
$$invalidate(5, settingName = $$props2.settingName);
if ("options" in $$props2)
$$invalidate(0, options = $$props2.options);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & 2) {
$:
$$invalidate(2, toNone = selected.length === 0 ? false : true);
}
};
return [
options,
selected,
toNone,
save,
plugin,
settingName,
click_handler,
input_change_handler,
$$binding_groups,
change_handler
];
}
var Checkboxes = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance17, create_fragment17, safe_not_equal, { plugin: 4, settingName: 5, options: 0 }, add_css12);
}
};
var Checkboxes_default = Checkboxes;
// src/Settings/JumpToNextSettings.ts
function addJumpToNextSettings(plugin, viewDetails) {
const { settings } = plugin;
const jumpToDirDetails = subDetails("Jump to Next Direction", viewDetails);
jumpToDirDetails.createDiv({ cls: "setting-item-name", text: "Limit which fields to jump to" });
new Checkboxes_default({
target: jumpToDirDetails,
props: {
plugin,
settingName: "limitJumpToFirstFields",
options: getFields(settings.userHiers)
}
});
}
// src/Settings/MatrixViewSettings.ts
var import_obsidian31 = require("obsidian");
function addMatrixViewSettings(plugin, viewDetails) {
const { settings } = plugin;
const MLViewDetails = subDetails("Matrix View", viewDetails);
new import_obsidian31.Setting(MLViewDetails).setName("Show all field names or just relation types").setDesc(fragWithHTML("Show the list of metadata fields for each relation type (e.g. <code>parent, broader, upper</code>), or just the name of the relation type, i.e. '<code>Parent</code>', '<code>Sibling</code>', '<code>Child</code>'.</br>\u2705 = show the full list.")).addToggle((toggle) => toggle.setValue(settings.showNameOrType).onChange(async (value) => {
settings.showNameOrType = value;
await plugin.saveSettings();
await plugin.getActiveTYPEView(MATRIX_VIEW).draw();
}));
new import_obsidian31.Setting(MLViewDetails).setName("Show Relationship Type").setDesc(fragWithHTML("Show whether a link is real or implied.")).addToggle((toggle) => toggle.setValue(settings.showRelationType).onChange(async (value) => {
settings.showRelationType = value;
await plugin.saveSettings();
await plugin.getActiveTYPEView(MATRIX_VIEW).draw();
}));
new import_obsidian31.Setting(MLViewDetails).setName("Directions Order").setDesc(fragWithHTML(`Change the order in which the directions appear in the Matrix view.</br>The default is "up, same, down, next, prev" (<code>01234</code>).
<ul>
<li>0 \u2192 up</li>
<li>1 \u2192 same</li>
<li>2 \u2192 down</li>
<li>3 \u2192 next</li>
<li>4 \u2192 prev</li>
</ul>
<strong>Note</strong>: You can remove numbers to hide those directions in the Matrix View. For example, <code>02</code> will only show up and down, in that order.`)).addText((text2) => {
text2.setValue(settings.squareDirectionsOrder.join(""));
text2.inputEl.onblur = async () => {
const value = text2.getValue();
const values = value.split("");
if (value.length <= 5 && values.every((value2) => ["0", "1", "2", "3", "4"].includes(value2))) {
settings.squareDirectionsOrder = values.map((order) => Number.parseInt(order));
await plugin.saveSettings();
await plugin.getActiveTYPEView(MATRIX_VIEW).draw();
} else {
new import_obsidian31.Notice('The value must be a 5 digit number using only the digits "0", "1", "2", "3", "4"');
}
};
});
new import_obsidian31.Setting(MLViewDetails).setName("Enable Alphabetical Sorting").setDesc("By default, items in the Matrix view are sorted by the order they appear in your notes. Toggle this on to enable alphabetical sorting.").addToggle((toggle) => toggle.setValue(settings.enableAlphaSort).onChange(async (value) => {
settings.enableAlphaSort = value;
await plugin.saveSettings();
await plugin.getActiveTYPEView(MATRIX_VIEW).draw();
}));
new import_obsidian31.Setting(MLViewDetails).setName("Sort Alphabetically Ascending/Descending").setDesc("Sort square items alphabetically in Ascending (\u2705) or Descending (\u274C) order.").addToggle((toggle) => toggle.setValue(settings.alphaSortAsc).onChange(async (value) => {
settings.alphaSortAsc = value;
await plugin.saveSettings();
await plugin.getActiveTYPEView(MATRIX_VIEW).draw();
}));
new import_obsidian31.Setting(MLViewDetails).setName("Sort by note name, but show alias").setDesc("When this is turned off, notes will first be sorted by their alias, and then by their name if no alias is found. Turn this on to sort by note name always, but still show the alias in the results.").addToggle((toggle) => toggle.setValue(settings.sortByNameShowAlias).onChange(async (value) => {
settings.sortByNameShowAlias = value;
await plugin.saveSettings();
await plugin.getActiveTYPEView(MATRIX_VIEW).draw();
}));
new import_obsidian31.Setting(MLViewDetails).setName("Show Implied Relations").setDesc("Whether or not to show implied relations at all.").addToggle((toggle) => toggle.setValue(settings.showImpliedRelations).onChange(async (value) => {
settings.showImpliedRelations = value;
await plugin.saveSettings();
await plugin.getActiveTYPEView(MATRIX_VIEW).draw();
}));
new import_obsidian31.Setting(MLViewDetails).setName("Open View in Right or Left side").setDesc("When loading the matrix view, should it open on the left or right side leaf? \u2705 = Right, \u274C = Left.").addToggle((toggle) => toggle.setValue(settings.rlLeaf).onChange(async (value) => {
settings.rlLeaf = value;
await plugin.saveSettings();
app.workspace.detachLeavesOfType(MATRIX_VIEW);
await openView(app, MATRIX_VIEW, MatrixView, value ? "right" : "left");
}));
}
// src/Settings/NoSystemSettings.ts
var import_obsidian32 = require("obsidian");
function addNoSystemSettings(plugin, alternativeHierarchyDetails) {
const { settings } = plugin;
const { userHiers } = settings;
const fields = getFields(userHiers);
const noSystemDetails = subDetails("Naming System", alternativeHierarchyDetails);
new import_obsidian32.Setting(noSystemDetails).setName("Naming System Regex").setDesc(fragWithHTML("If you name your notes using the Johnny Decimal System or a related system, enter a regular expression matching the longest possible naming system you use. The regex should only match the naming system part of the name, not the actual note title.</br> For example, if you use the Johnny Decimal System, you might use <code>/^\\d\\.\\d\\.\\w/g</code> to match the note named <code>1.2.a Cars</code>.</br>If you don't want to choose a default, select the blank option at the bottom of the list.")).addText((text2) => {
text2.setValue(settings.namingSystemRegex);
text2.inputEl.onblur = async () => {
const value = text2.getValue();
if (value === "" || strToRegex(value)) {
settings.namingSystemRegex = value;
await plugin.saveSettings();
await refreshIndex(plugin);
} else {
new import_obsidian32.Notice("Invalid Regex");
}
};
});
new import_obsidian32.Setting(noSystemDetails).setName("Naming System Delimiter").setDesc(fragWithHTML("What character do you use to split up your naming convention? For example, if you use <code>1.2.a.b</code>, then your delimiter is a period (<code>.</code>).")).addText((text2) => {
text2.setValue(settings.namingSystemSplit);
text2.inputEl.onblur = async () => {
const value = text2.getValue();
settings.namingSystemSplit = value;
await plugin.saveSettings();
await refreshIndex(plugin);
};
});
new import_obsidian32.Setting(noSystemDetails).setName("Naming System Field").setDesc("Which field should Breadcrumbs use for Naming System notes?").addDropdown((dd) => {
fields.forEach((field) => {
dd.addOption(field, field);
});
dd.setValue(settings.namingSystemField);
dd.onChange(async (value) => {
settings.namingSystemField = value;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
new import_obsidian32.Setting(noSystemDetails).setName("Naming System Ends with Delimiter").setDesc(fragWithHTML("Does your naming convention end with the delimiter? For example, <code>1.2. Note</code> does end with the delimiter, but <code>1.2 Note</code> does not.</br>For matching purposes, it is highly recommended to name your notes with the delimiter on the end. Only turn this setting on if you do name your notes this way, but know that the results may not be as accurate if you don't.")).addToggle((tog) => tog.setValue(settings.namingSystemEndsWithDelimiter).onChange(async (value) => {
settings.namingSystemEndsWithDelimiter = value;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
}
// src/Settings/RegexNoteSettings.ts
var import_obsidian33 = require("obsidian");
function addRegexNoteSettings(plugin, alternativeHierarchyDetails) {
const { settings } = plugin;
const regexNoteDetails = subDetails("Regex Notes", alternativeHierarchyDetails);
new import_obsidian33.Setting(regexNoteDetails).setName("Default Regex Note Field").setDesc(fragWithHTML("By default, regex notes use the first field in your hierarchies (usually an <code>\u2191</code> field). Choose a different one to use by default, without having to specify <code>BC-regex-note-field: {field}</code>.</br>If you don't want to choose a default, select the blank option at the bottom of the list.")).addDropdown((dd) => {
const options = {};
getFields(settings.userHiers).forEach((field) => options[field] = field);
dd.addOptions(Object.assign(options, { "": "" })).setValue(settings.regexNoteField).onChange(async (field) => {
settings.regexNoteField = field;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
}
// src/Settings/RelationSettings.ts
var import_obsidian34 = require("obsidian");
function addRelationSettings(plugin, containerEl) {
const { settings } = plugin;
const relationDetails = details("Relationships", containerEl);
function mermaidDiagram(diagramStr) {
import_obsidian34.MarkdownRenderer.renderMarkdown(diagramStr, relationDetails.createDiv(), "", null);
}
relationDetails.createEl("p", {
text: "Here you can toggle on/off different types of implied relationships. All of your explicit (real) relationships will still show, but you can choose which implied ones get filled in.\nAll implied relationships are given a CSS class of the type of implied relation, so you can style them differently. For example `.BC-Aunt`."
});
new import_obsidian34.Setting(relationDetails).setName("Same Parent is Siblings").setDesc("If one note shares a parent with another, treat them as siblings").addToggle((tg) => tg.setValue(settings.impliedRelations.sameParentIsSibling).onChange(async (val) => {
settings.impliedRelations.sameParentIsSibling = val;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
mermaidDiagram("```mermaid\nflowchart LR\nMe -->|up| Dad\nSister -->|up| Dad\nMe <-.->|same| Sister\n```");
new import_obsidian34.Setting(relationDetails).setName("Siblings' Siblings").setDesc("Treat your siblings' siblings as your siblings").addToggle((tg) => tg.setValue(settings.impliedRelations.siblingsSiblingIsSibling).onChange(async (val) => {
settings.impliedRelations.siblingsSiblingIsSibling = val;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
mermaidDiagram("```mermaid\nflowchart LR\nMe -->|same| Sister\nMe -->|same| Brother\nSister <-.->|same| Brother\n```");
new import_obsidian34.Setting(relationDetails).setName("Siblings' Parent is Parent").setDesc("Your siblings' parents are your parents").addToggle((tg) => tg.setValue(settings.impliedRelations.siblingsParentIsParent).onChange(async (val) => {
settings.impliedRelations.siblingsParentIsParent = val;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
mermaidDiagram("```mermaid\nflowchart LR\nSister -->|up| Dad\nSister <-->|same| Me\nMe -.->|up| Dad\n```");
new import_obsidian34.Setting(relationDetails).setName("Aunt/Uncle").setDesc("Treat your parent's siblings as your parents (aunts/uncles)").addToggle((tg) => tg.setValue(settings.impliedRelations.parentsSiblingsIsParents).onChange(async (val) => {
settings.impliedRelations.parentsSiblingsIsParents = val;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
mermaidDiagram("```mermaid\nflowchart LR\nMe -->|up| Dad\nDad -->|same| Uncle\nMe -.->|up| Uncle\n```");
new import_obsidian34.Setting(relationDetails).setName("Cousins").setDesc("Treat the cousins of a note as siblings (parents' siblings' children are cousins)").addToggle((tg) => tg.setValue(settings.impliedRelations.cousinsIsSibling).onChange(async (val) => {
settings.impliedRelations.cousinsIsSibling = val;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
mermaidDiagram("```mermaid\nflowchart LR\nMe -->|up| Dad\nDad -->|same| Uncle\nUncle -->|down| Cousin\nMe <-.->|same| Cousin\n```");
new import_obsidian34.Setting(relationDetails).setName("Make Current Note an Implied Sibling").setDesc("Techincally, the current note is always it's own implied sibling. By default, it is not show as such. Toggle this on to make it show.").addToggle((toggle) => toggle.setValue(settings.treatCurrNodeAsImpliedSibling).onChange(async (value) => {
settings.treatCurrNodeAsImpliedSibling = value;
await plugin.saveSettings();
await refreshIndex(plugin);
}));
}
// src/Settings/TagNoteSettings.ts
var import_obsidian35 = require("obsidian");
function addTagNoteSettings(plugin, alternativeHierarchyDetails) {
const { settings } = plugin;
const tagNoteDetails = subDetails("Tag Notes", alternativeHierarchyDetails);
new import_obsidian35.Setting(tagNoteDetails).setName("Default Tag Note Field").setDesc(fragWithHTML("By default, tag notes use the first field in your hierarchies (usually an <code>\u2191</code> field). Choose a different one to use by default, without having to specify <code>BC-tag-note-field: {field}</code>.</br>If you don't want to choose a default, select the blank option at the bottom of the list.")).addDropdown((dd) => {
const options = {};
getFields(settings.userHiers).forEach((field) => options[field] = field);
dd.addOptions(Object.assign(options, { "": "" })).setValue(settings.tagNoteField).onChange(async (field) => {
settings.tagNoteField = field;
await plugin.saveSettings();
await refreshIndex(plugin);
});
});
}
// src/Settings/ThreadingSettings.ts
var import_obsidian36 = require("obsidian");
function addThreadingSettings(plugin, cmdsDetails) {
const { settings } = plugin;
const threadingDetails = subDetails("Threading", cmdsDetails);
threadingDetails.createDiv({
text: "Settings for the commands `Create new <field> from current note`"
});
new import_obsidian36.Setting(threadingDetails).setName("Open new threads in new pane or current pane").addToggle((tog) => {
tog.setValue(settings.threadIntoNewPane);
tog.onChange(async (value) => {
settings.threadIntoNewPane = value;
await plugin.saveSettings();
});
});
new import_obsidian36.Setting(threadingDetails).setName("Thread under Cursor").setDesc(fragWithHTML("If the setting <code>Write Breadcrumbs Inline</code> is enabled, where should the new Breadcrumb be added to the current note? \u2705 = Under the cursor, \u274C = At the top of the note (under the yaml, if applicable)")).addToggle((tog) => {
tog.setValue(settings.threadUnderCursor);
tog.onChange(async (value) => {
settings.threadUnderCursor = value;
await plugin.saveSettings();
});
});
new import_obsidian36.Setting(threadingDetails).setName("New Note Name Template").setDesc(fragWithHTML(`When threading into a new note, choose the template for the new note name.</br>
Options include:</br>
<ul>
<li><code>{{field}}</code>: the field being thread into</li>
<li><code>{{dir}}</code>: the direction being thread into</li>
<li><code>{{current}}</code>: the current note name</li>
<li><code>{{date}}</code>: the current date (Set the format in the setting below)</li>
</ul>`)).addText((text2) => {
text2.setValue(settings.threadingTemplate);
text2.inputEl.onblur = async () => {
const value = text2.getValue();
if (ILLEGAL_FILENAME_CHARS.some((char) => value.includes(char))) {
new import_obsidian36.Notice(`File name cannot contain any of these characters: ${ILLEGAL_FILENAME_CHARS.join(" ")}`);
text2.setValue(settings.threadingTemplate);
} else {
settings.threadingTemplate = value;
await plugin.saveSettings();
}
};
});
new import_obsidian36.Setting(threadingDetails).setName("Date Format").setDesc("The date format used in the Threading Template (setting above)").addMomentFormat((format2) => {
format2.setDefaultFormat(DEFAULT_SETTINGS.dateFormat).setValue(settings.dateFormat).onChange(async (value) => {
settings.dateFormat = value;
await plugin.saveSettings();
});
});
const threadDirTemplatesSetting = new import_obsidian36.Setting(threadingDetails).setClass("thread-dir-templates").setName("Templater Template per Direction").setDesc(fragWithHTML(`For each direction to be thread into, choose a Templater template to insert into the new note.</br>
Give the basename, or the full file path (e.g. <code>Templates/Parent Template</code>).`));
DIRECTIONS.forEach((dir) => threadDirTemplatesSetting.addText((text2) => {
text2.setPlaceholder(ARROW_DIRECTIONS[dir]).setValue(settings.threadingDirTemplates[dir]);
text2.inputEl.onblur = async () => {
settings.threadingDirTemplates[dir] = text2.getValue();
await plugin.saveSettings();
};
}));
}
// src/Settings/TrailSettings.ts
var import_obsidian37 = require("obsidian");
function addTrailViewSettings(plugin, viewDetails) {
const { settings } = plugin;
const trailDetails = subDetails("Trail/Grid/Juggl", viewDetails);
new import_obsidian37.Setting(trailDetails).setName("Show Breadcrumbs in Edit/Live-Preview Mode").setDesc("It always shows in preview mode, but should it also show in the other two?").addToggle((toggle) => toggle.setValue(settings.showBCsInEditLPMode).onChange(async (value) => {
settings.showBCsInEditLPMode = value;
await plugin.saveSettings();
await drawTrail(plugin);
}));
trailDetails.createEl("hr");
trailDetails.createDiv({
cls: "setting-item-name",
text: "Limit Trail View to only show certain fields"
});
new Checkboxes_default({
target: trailDetails,
props: {
plugin,
settingName: "limitTrailCheckboxes",
options: getFields(settings.userHiers, "up")
}
});
const viewsToShow = new import_obsidian37.Setting(trailDetails).setName("Views to show").setDesc("Choose which of the views to show at the top of the note. Juggl View requires the Juggl plugin.").addToggle((toggle) => {
toggle.setTooltip("Trail view").setValue(settings.showTrail).onChange(async (value) => {
settings.showTrail = value;
await plugin.saveSettings();
await drawTrail(plugin);
});
}).addToggle((toggle) => {
toggle.setTooltip("Grid view").setValue(settings.showGrid).onChange(async (value) => {
settings.showGrid = value;
await plugin.saveSettings();
await drawTrail(plugin);
});
}).addToggle((toggle) => {
toggle.setTooltip("Next/Previous view").setValue(settings.showPrevNext).onChange(async (value) => {
settings.showPrevNext = value;
await plugin.saveSettings();
await drawTrail(plugin);
});
});
if (app.plugins.plugins.juggl !== void 0) {
viewsToShow.addToggle((toggle) => {
toggle.setTooltip("Juggl view").setValue(settings.showJuggl).onChange(async (value) => {
settings.showJuggl = value;
await plugin.saveSettings();
await drawTrail(plugin);
});
});
}
new import_obsidian37.Setting(trailDetails).setName("Grid view depth").setDesc("Limit the initial depth of the grid view").addSlider((slider) => {
slider.setLimits(0, 25, 1).setValue(settings.gridDefaultDepth).setDynamicTooltip();
slider.sliderEl.onblur = async () => {
settings.gridDefaultDepth = slider.getValue();
await plugin.saveSettings();
await drawTrail(plugin);
};
});
new import_obsidian37.Setting(trailDetails).setName("Index Note(s)").setDesc(fragWithHTML("The note that all of your other notes lead back to. The parent of all your parent notes. Just enter the basename.</br>You can also have multiple index notes (comma-separated list).</br>Leaving this field empty will make the trail show all paths going as far up the parent-tree as possible.")).addText((text2) => {
text2.setPlaceholder("Index Note").setValue(settings.indexNotes.join(", "));
text2.inputEl.onblur = async () => {
const splits = splitAndTrim(text2.getValue());
if (splits[0] === void 0 || splits.every((index2) => isInVault(index2))) {
settings.indexNotes = splits;
await plugin.saveSettings();
} else
new import_obsidian37.Notice("Atleast one of the notes is not in your vault");
};
});
new import_obsidian37.Setting(trailDetails).setName("Shows all paths if none to index note are found").setDesc("If you have an index note chosen, but the trail view has no paths going up to those index notes, should it show all paths instead?").addToggle((toggle) => toggle.setValue(settings.showAllPathsIfNoneToIndexNote).onChange(async (value) => {
settings.showAllPathsIfNoneToIndexNote = value;
await plugin.saveSettings();
await drawTrail(plugin);
}));
new import_obsidian37.Setting(trailDetails).setName("Default: All, Longest, or Shortest").setDesc("If multiple paths are found going up the parent tree, which of them should show?").addDropdown((dd) => {
const options = {};
TRAIL_LENGTHS.forEach((length) => {
options[length] = length;
});
dd.addOptions(options);
dd.setValue(settings.showAll);
dd.onChange(async (val) => {
settings.showAll = val;
await plugin.saveSettings();
await drawTrail(plugin);
});
});
new import_obsidian37.Setting(trailDetails).setName("Seperator").setDesc(fragWithHTML("The character to show between crumbs in the breadcrumb trail. The default is <code>\u2192</code>")).addText((text2) => text2.setPlaceholder("\u2192").setValue(settings.trailSeperator).onChange(async (value) => {
settings.trailSeperator = value;
await plugin.saveSettings();
await drawTrail(plugin);
}));
new import_obsidian37.Setting(trailDetails).setName("No path found message").setDesc("The text to display when no path to the index note is found, or the current note has no parent.").addText((text2) => text2.setPlaceholder("No path to index note was found").setValue(settings.noPathMessage).onChange(async (value) => {
settings.noPathMessage = value;
await plugin.saveSettings();
await drawTrail(plugin);
}));
new import_obsidian37.Setting(trailDetails).setName("Respect Readable Line Length").setDesc("Should the breadcrumbs trail adjust its width to the readable line length, or use as much space as possible? \u2705 = use readable line length.").addToggle((toggle) => toggle.setValue(settings.respectReadableLineLength).onChange(async (value) => {
settings.respectReadableLineLength = value;
await plugin.saveSettings();
await drawTrail(plugin);
}));
new import_obsidian37.Setting(trailDetails).setName("Show up fields in Juggl").setDesc("Juggl will show both up and down fields").addToggle((toggle) => {
toggle.setValue(settings.showUpInJuggl).onChange(async (value) => {
settings.showUpInJuggl = value;
await plugin.saveSettings();
});
});
new import_obsidian37.Setting(trailDetails).setName("Juggl view layout").setDesc(fragWithHTML("The layout type to use for the Juggl view.<br>The hierarchy layout is most natural for Breadcrumbs, but for large graphs D3 Force is recommended.")).addDropdown((dc) => {
dc.addOption("hierarchy", "Hierarchy");
dc.addOption("d3-force", "D3 Force");
dc.addOption("cola", "Cola Force");
dc.addOption("grid", "Grid");
dc.addOption("concentric", "Concentric");
dc.setValue(settings.jugglLayout);
dc.onChange(async (value) => {
settings.jugglLayout = value;
await plugin.saveSettings();
await drawTrail(plugin);
});
});
}
// src/Settings/VisModalSettings.ts
var import_obsidian38 = require("obsidian");
function addVisModalSettings(plugin, viewDetails) {
const { settings } = plugin;
const visModalDetails = subDetails("Visualisation Modal", viewDetails);
new import_obsidian38.Setting(visModalDetails).setName("Default Visualisation Type").setDesc("Which visualisation to show by default").addDropdown((cb) => {
VISTYPES.forEach((option) => {
cb.addOption(option, option);
});
cb.setValue(settings.visGraph);
cb.onChange(async (value) => {
settings.visGraph = value;
await plugin.saveSettings();
});
});
new import_obsidian38.Setting(visModalDetails).setName("Default Relation").setDesc("Which relation type to show first when opening the modal").addDropdown((dd) => {
RELATIONS.forEach((option) => {
dd.addOption(option, option);
});
dd.setValue(settings.visRelation);
dd.onChange(async (value) => {
settings.visRelation = value;
await plugin.saveSettings();
});
});
new import_obsidian38.Setting(visModalDetails).setName("Default Real/Closed").setDesc("Show the real or closed graph by default").addDropdown((cb) => {
REAlCLOSED.forEach((option) => {
cb.addOption(option, option);
});
cb.setValue(settings.visClosed);
cb.onChange(async (value) => {
settings.visClosed = value;
await plugin.saveSettings();
});
});
new import_obsidian38.Setting(visModalDetails).setName("Default Unlinked").setDesc("Show all nodes or only those which have links by default").addDropdown((cb) => {
ALLUNLINKED.forEach((option) => {
cb.addOption(option, option);
});
cb.setValue(settings.visAll);
cb.onChange(async (value) => {
settings.visAll = value;
await plugin.saveSettings();
});
});
}
// src/Settings/WriteBCsSettings.ts
var import_obsidian39 = require("obsidian");
function addWriteBCsSettings(plugin, cmdsDetails) {
const { settings } = plugin;
const writeBCsToFileDetails = subDetails("Write Breadcrumbs to File", cmdsDetails);
writeBCsToFileDetails.createDiv({
cls: "setting-item-name",
text: "Limit to only write certain fields"
});
new Checkboxes_default({
target: writeBCsToFileDetails,
props: {
plugin,
options: getFields(settings.userHiers),
settingName: "limitWriteBCCheckboxes"
}
});
new import_obsidian39.Setting(writeBCsToFileDetails).setName("Write Inline").setDesc("When writing BCs to file, should they be written inline (using Dataview syntax), or into the YAML of the note?").addToggle((toggle) => toggle.setValue(settings.writeBCsInline).onChange(async (value) => {
settings.writeBCsInline = value;
await plugin.saveSettings();
}));
new import_obsidian39.Setting(writeBCsToFileDetails).setName(fragWithHTML("Show the <code>Write Breadcrumbs to ALL Files</code> command")).setDesc("This command attempts to update ALL files with implied breadcrumbs pointing to them. So, it is not shown by default (even though it has 3 confirmation boxes to ensure you want to run it").addToggle((toggle) => toggle.setValue(settings.showWriteAllBCsCmd).onChange(async (value) => {
settings.showWriteAllBCsCmd = value;
await plugin.saveSettings();
}));
}
// src/Settings/BreadcrumbsSettingTab.ts
var fragWithHTML = (html) => createFragment((frag) => frag.createDiv().innerHTML = html);
var details = (text2, parent) => parent.createEl("details", {}, (d) => d.createEl("summary", { text: text2 }));
var subDetails = (text2, parent) => parent.createDiv({
attr: { style: "padding-left: 10px;" }
}).createEl("details", {}, (d) => d.createEl("summary", { text: text2 }));
var BCSettingTab = class extends import_obsidian40.PluginSettingTab {
constructor(plugin) {
super(app, plugin);
this.plugin = plugin;
}
async display() {
const { plugin, containerEl } = this;
const { settings } = plugin;
containerEl.empty();
containerEl.createEl("h2", { text: "Breadcrumbs Settings" });
containerEl.addClass("BC-settings-tab");
addHierarchySettings(plugin, containerEl);
addRelationSettings(plugin, containerEl);
addGeneralSettings(plugin, containerEl);
const viewDetails = details("Views", containerEl);
new import_obsidian40.Setting(viewDetails).setName("Open Views by Default").setDesc(fragWithHTML("Choose which of the views to open onload<br/>Order is: Trail/Grid/Juggl, Matrix, Ducks, Tree")).addToggle((toggle) => toggle.setTooltip("Trail/Grid/Juggl").setValue(settings.showBCs).onChange(async (value) => {
settings.showBCs = value;
await plugin.saveSettings();
await drawTrail(plugin);
})).addToggle((toggle) => {
toggle.setTooltip("Matrix View").setValue(settings.openMatrixOnLoad).onChange(async (value) => {
settings.openMatrixOnLoad = value;
await plugin.saveSettings();
});
}).addToggle((toggle) => {
toggle.setTooltip("Ducks View").setValue(settings.openDuckOnLoad).onChange(async (value) => {
settings.openDuckOnLoad = value;
await plugin.saveSettings();
});
}).addToggle((toggle) => {
toggle.setTooltip("Tree View").setValue(settings.openDownOnLoad).onChange(async (value) => {
settings.openDownOnLoad = value;
await plugin.saveSettings();
});
});
viewDetails.createEl("hr");
addMatrixViewSettings(plugin, viewDetails);
addTrailViewSettings(plugin, viewDetails);
addVisModalSettings(plugin, viewDetails);
const alternativeHierarchyDetails = details("Alternative Hierarchies", containerEl);
addTagNoteSettings(plugin, alternativeHierarchyDetails);
addRegexNoteSettings(plugin, alternativeHierarchyDetails);
addNoSystemSettings(plugin, alternativeHierarchyDetails);
addHierarchyNoteSettings(plugin, alternativeHierarchyDetails);
addCSVSettings(plugin, alternativeHierarchyDetails);
addDendronSettings(plugin, alternativeHierarchyDetails);
addDataviewSettings(plugin, alternativeHierarchyDetails);
addDateNoteSettings(plugin, alternativeHierarchyDetails);
const cmdsDetails = details("Commands", containerEl);
addWriteBCsSettings(plugin, cmdsDetails);
addCreateIndexSettings(plugin, cmdsDetails);
addThreadingSettings(plugin, cmdsDetails);
addJumpToNextSettings(plugin, cmdsDetails);
addDebuggingsSettings(plugin, containerEl);
new KoFi_default({ target: containerEl });
}
};
// src/Views/DucksView.ts
var import_obsidian41 = require("obsidian");
// node_modules/svelte-icons/fa/FaInfo.svelte
function create_default_slot4(ctx) {
let path2;
return {
c() {
path2 = svg_element("path");
attr(path2, "d", "M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z");
},
m(target, anchor) {
insert(target, path2, anchor);
},
d(detaching) {
if (detaching)
detach(path2);
}
};
}
function create_fragment18(ctx) {
let iconbase;
let current;
const iconbase_spread_levels = [{ viewBox: "0 0 192 512" }, ctx[0]];
let iconbase_props = {
$$slots: { default: [create_default_slot4] },
$$scope: { ctx }
};
for (let i = 0; i < iconbase_spread_levels.length; i += 1) {
iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]);
}
iconbase = new IconBase_default({ props: iconbase_props });
return {
c() {
create_component(iconbase.$$.fragment);
},
m(target, anchor) {
mount_component(iconbase, target, anchor);
current = true;
},
p(ctx2, [dirty]) {
const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {};
if (dirty & 2) {
iconbase_changes.$$scope = { dirty, ctx: ctx2 };
}
iconbase.$set(iconbase_changes);
},
i(local) {
if (current)
return;
transition_in(iconbase.$$.fragment, local);
current = true;
},
o(local) {
transition_out(iconbase.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(iconbase, detaching);
}
};
}
function instance18($$self, $$props, $$invalidate) {
$$self.$$set = ($$new_props) => {
$$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));
};
$$props = exclude_internal_props($$props);
return [$$props];
}
var FaInfo = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance18, create_fragment18, safe_not_equal, {});
}
};
var FaInfo_default = FaInfo;
// src/Components/Ducks.svelte
function add_css13(target) {
append_styles(target, "svelte-gmdm3a", ".icon.svelte-gmdm3a{color:var(--text-normal);display:inline-block;padding-top:5px !important;width:20px;height:20px}");
}
function get_each_context8(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[13] = list[i];
return child_ctx;
}
function create_each_block8(ctx) {
let div;
let a2;
let t0_value = ctx[13] + "";
let t0;
let t1;
let mounted;
let dispose;
function click_handler(...args) {
return ctx[8](ctx[13], ...args);
}
function mouseover_handler(...args) {
return ctx[9](ctx[13], ...args);
}
return {
c() {
div = element("div");
a2 = element("a");
t0 = text(t0_value);
t1 = space();
attr(a2, "class", "internal-link");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, a2);
append(a2, t0);
append(div, t1);
if (!mounted) {
dispose = [
listen(div, "click", click_handler),
listen(div, "mouseover", mouseover_handler)
];
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if (dirty & 8 && t0_value !== (t0_value = ctx[13] + ""))
set_data(t0, t0_value);
},
d(detaching) {
if (detaching)
detach(div);
mounted = false;
run_all(dispose);
}
};
}
function create_fragment19(ctx) {
let div;
let h6;
let t1;
let span;
let fainfo;
let span_aria_label_value;
let t2;
let label;
let t3;
let input0;
let t4;
let input1;
let t5;
let current;
let mounted;
let dispose;
fainfo = new FaInfo_default({});
let each_value = ctx[3];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block8(get_each_context8(ctx, each_value, i));
}
return {
c() {
div = element("div");
h6 = element("h6");
h6.textContent = "Notes without Breadcrumbs";
t1 = space();
span = element("span");
create_component(fainfo.$$.fragment);
t2 = space();
label = element("label");
t3 = text("Filter:\r\n ");
input0 = element("input");
t4 = space();
input1 = element("input");
t5 = space();
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(span, "class", "icon svelte-gmdm3a");
attr(span, "aria-label", span_aria_label_value = `A Regex used to filter the results.
If 'Include' is checked, it will only show notes that match the regex.
If 'Include' is not checked, this regex will filter out notes that match it.`);
attr(input0, "type", "text");
attr(input0, "placeholder", "Regex");
attr(input1, "aria-label", "Include");
attr(input1, "type", "checkbox");
attr(div, "class", "BC-Ducks markdown-preview-view");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, h6);
append(div, t1);
append(div, span);
mount_component(fainfo, span, null);
append(div, t2);
append(div, label);
append(label, t3);
append(label, input0);
set_input_value(input0, ctx[1]);
append(div, t4);
append(div, input1);
input1.checked = ctx[2];
append(div, t5);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div, null);
}
current = true;
if (!mounted) {
dispose = [
listen(input0, "input", ctx[6]),
listen(input1, "change", ctx[7])
];
mounted = true;
}
},
p(ctx2, [dirty]) {
if (dirty & 2 && input0.value !== ctx2[1]) {
set_input_value(input0, ctx2[1]);
}
if (dirty & 4) {
input1.checked = ctx2[2];
}
if (dirty & 9) {
each_value = ctx2[3];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context8(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block8(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
},
i(local) {
if (current)
return;
transition_in(fainfo.$$.fragment, local);
current = true;
},
o(local) {
transition_out(fainfo.$$.fragment, local);
current = false;
},
d(detaching) {
if (detaching)
detach(div);
destroy_component(fainfo);
destroy_each(each_blocks, detaching);
mounted = false;
run_all(dispose);
}
};
}
function instance19($$self, $$props, $$invalidate) {
let ducks;
let { plugin } = $$props;
let { ducksView } = $$props;
const { mainG } = plugin;
const files = app.vault.getMarkdownFiles();
let query = "";
let regex = new RegExp(query, "g");
let include = true;
const getDucks = (regex2) => {
if (!regex2)
return;
return files.map((file) => file.basename).filter((name) => !mainG.neighbors(name).length && include === regex2.test(name));
};
function input0_input_handler() {
query = this.value;
$$invalidate(1, query);
}
function input1_change_handler() {
include = this.checked;
$$invalidate(2, include);
}
const click_handler = async (duck, e) => await openOrSwitch(duck, e);
const mouseover_handler = (duck, e) => hoverPreview(e, ducksView, duck);
$$self.$$set = ($$props2) => {
if ("plugin" in $$props2)
$$invalidate(4, plugin = $$props2.plugin);
if ("ducksView" in $$props2)
$$invalidate(0, ducksView = $$props2.ducksView);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & 2) {
$: {
try {
const newReg = new RegExp(query, "g");
$$invalidate(5, regex = newReg);
} catch (e) {
}
}
}
if ($$self.$$.dirty & 32) {
$:
$$invalidate(3, ducks = getDucks(regex));
}
};
return [
ducksView,
query,
include,
ducks,
plugin,
regex,
input0_input_handler,
input1_change_handler,
click_handler,
mouseover_handler
];
}
var Ducks = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance19, create_fragment19, safe_not_equal, { plugin: 4, ducksView: 0 }, add_css13);
}
};
var Ducks_default = Ducks;
// src/Views/DucksView.ts
var DucksView = class extends import_obsidian41.ItemView {
constructor(leaf, plugin) {
super(leaf);
this.icon = DUCK_ICON;
this.plugin = plugin;
}
async onload() {
super.onload();
await this.plugin.saveSettings();
app.workspace.onLayoutReady(async () => {
await this.draw();
});
}
getViewType() {
return DUCK_VIEW;
}
getDisplayText() {
return "Breadcrumbs Ducks";
}
async onOpen() {
}
onClose() {
var _a;
(_a = this.view) == null ? void 0 : _a.$destroy();
return Promise.resolve();
}
async draw() {
this.contentEl.empty();
this.view = new Ducks_default({
target: this.contentEl,
props: { plugin: this.plugin, ducksView: this }
});
}
};
// src/Views/TreeView.ts
var import_obsidian42 = require("obsidian");
// src/Components/SideTree.svelte
var import_loglevel20 = __toESM(require_loglevel());
// node_modules/svelte-icons/fa/FaFire.svelte
function create_default_slot5(ctx) {
let path2;
return {
c() {
path2 = svg_element("path");
attr(path2, "d", "M216 23.86c0-23.8-30.65-32.77-44.15-13.04C48 191.85 224 200 224 288c0 35.63-29.11 64.46-64.85 63.99-35.17-.45-63.15-29.77-63.15-64.94v-85.51c0-21.7-26.47-32.23-41.43-16.5C27.8 213.16 0 261.33 0 320c0 105.87 86.13 192 192 192s192-86.13 192-192c0-170.29-168-193-168-296.14z");
},
m(target, anchor) {
insert(target, path2, anchor);
},
d(detaching) {
if (detaching)
detach(path2);
}
};
}
function create_fragment20(ctx) {
let iconbase;
let current;
const iconbase_spread_levels = [{ viewBox: "0 0 384 512" }, ctx[0]];
let iconbase_props = {
$$slots: { default: [create_default_slot5] },
$$scope: { ctx }
};
for (let i = 0; i < iconbase_spread_levels.length; i += 1) {
iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]);
}
iconbase = new IconBase_default({ props: iconbase_props });
return {
c() {
create_component(iconbase.$$.fragment);
},
m(target, anchor) {
mount_component(iconbase, target, anchor);
current = true;
},
p(ctx2, [dirty]) {
const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {};
if (dirty & 2) {
iconbase_changes.$$scope = { dirty, ctx: ctx2 };
}
iconbase.$set(iconbase_changes);
},
i(local) {
if (current)
return;
transition_in(iconbase.$$.fragment, local);
current = true;
},
o(local) {
transition_out(iconbase.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(iconbase, detaching);
}
};
}
function instance20($$self, $$props, $$invalidate) {
$$self.$$set = ($$new_props) => {
$$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));
};
$$props = exclude_internal_props($$props);
return [$$props];
}
var FaFire = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance20, create_fragment20, safe_not_equal, {});
}
};
var FaFire_default = FaFire;
// node_modules/svelte-icons/fa/FaRegSnowflake.svelte
function create_default_slot6(ctx) {
let path2;
return {
c() {
path2 = svg_element("path");
attr(path2, "d", "M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z");
},
m(target, anchor) {
insert(target, path2, anchor);
},
d(detaching) {
if (detaching)
detach(path2);
}
};
}
function create_fragment21(ctx) {
let iconbase;
let current;
const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, ctx[0]];
let iconbase_props = {
$$slots: { default: [create_default_slot6] },
$$scope: { ctx }
};
for (let i = 0; i < iconbase_spread_levels.length; i += 1) {
iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]);
}
iconbase = new IconBase_default({ props: iconbase_props });
return {
c() {
create_component(iconbase.$$.fragment);
},
m(target, anchor) {
mount_component(iconbase, target, anchor);
current = true;
},
p(ctx2, [dirty]) {
const iconbase_changes = dirty & 1 ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(ctx2[0])]) : {};
if (dirty & 2) {
iconbase_changes.$$scope = { dirty, ctx: ctx2 };
}
iconbase.$set(iconbase_changes);
},
i(local) {
if (current)
return;
transition_in(iconbase.$$.fragment, local);
current = true;
},
o(local) {
transition_out(iconbase.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(iconbase, detaching);
}
};
}
function instance21($$self, $$props, $$invalidate) {
$$self.$$set = ($$new_props) => {
$$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));
};
$$props = exclude_internal_props($$props);
return [$$props];
}
var FaRegSnowflake = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance21, create_fragment21, safe_not_equal, {});
}
};
var FaRegSnowflake_default = FaRegSnowflake;
// src/Components/SideTree.svelte
function add_css14(target) {
append_styles(target, "svelte-8j6nux", "button.svelte-8j6nux{display:inline;padding:1px 6px 2px 6px}.BC-downs.svelte-8j6nux{padding-left:5px}pre.svelte-8j6nux{display:inline}.is-unresolved.svelte-8j6nux{color:var(--text-muted)}.icon.svelte-8j6nux{color:var(--text-normal);display:inline-block;padding-top:5px !important;width:20px;height:20px}");
}
function get_each_context9(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[16] = list[i];
return child_ctx;
}
function get_each_context_16(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[19] = list[i];
return child_ctx;
}
function create_else_block4(ctx) {
let fafire;
let current;
fafire = new FaFire_default({});
return {
c() {
create_component(fafire.$$.fragment);
},
m(target, anchor) {
mount_component(fafire, target, anchor);
current = true;
},
i(local) {
if (current)
return;
transition_in(fafire.$$.fragment, local);
current = true;
},
o(local) {
transition_out(fafire.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(fafire, detaching);
}
};
}
function create_if_block_15(ctx) {
let faregsnowflake;
let current;
faregsnowflake = new FaRegSnowflake_default({});
return {
c() {
create_component(faregsnowflake.$$.fragment);
},
m(target, anchor) {
mount_component(faregsnowflake, target, anchor);
current = true;
},
i(local) {
if (current)
return;
transition_in(faregsnowflake.$$.fragment, local);
current = true;
},
o(local) {
transition_out(faregsnowflake.$$.fragment, local);
current = false;
},
d(detaching) {
destroy_component(faregsnowflake, detaching);
}
};
}
function create_each_block_16(ctx) {
let option;
let t_value = ctx[19] + "";
let t;
let option_value_value;
return {
c() {
option = element("option");
t = text(t_value);
option.__value = option_value_value = ctx[19];
option.value = option.__value;
},
m(target, anchor) {
insert(target, option, anchor);
append(option, t);
},
p: noop,
d(detaching) {
if (detaching)
detach(option);
}
};
}
function create_if_block8(ctx) {
let div;
let pre;
let t0_value = ctx[16][0] + "-";
let t0;
let t1;
let span;
let a2;
let t2_value = dropDendron(ctx[16][1], ctx[6]) + "";
let t2;
let a_class_value;
let t3;
let mounted;
let dispose;
function click_handler_2(...args) {
return ctx[10](ctx[16], ...args);
}
function mouseover_handler(...args) {
return ctx[11](ctx[16], ...args);
}
return {
c() {
div = element("div");
pre = element("pre");
t0 = text(t0_value);
t1 = space();
span = element("span");
a2 = element("a");
t2 = text(t2_value);
t3 = space();
attr(pre, "class", "svelte-8j6nux");
attr(a2, "class", a_class_value = "internal-link " + (isInVault(ctx[16][1]) ? "" : "is-unresolved") + " svelte-8j6nux");
attr(span, "class", "internal-link");
},
m(target, anchor) {
insert(target, div, anchor);
append(div, pre);
append(pre, t0);
append(div, t1);
append(div, span);
append(span, a2);
append(a2, t2);
append(div, t3);
if (!mounted) {
dispose = [
listen(span, "click", click_handler_2),
listen(span, "mouseover", mouseover_handler)
];
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if (dirty & 32 && t0_value !== (t0_value = ctx[16][0] + "-"))
set_data(t0, t0_value);
if (dirty & 32 && t2_value !== (t2_value = dropDendron(ctx[16][1], ctx[6]) + ""))
set_data(t2, t2_value);
if (dirty & 32 && a_class_value !== (a_class_value = "internal-link " + (isInVault(ctx[16][1]) ? "" : "is-unresolved") + " svelte-8j6nux")) {
attr(a2, "class", a_class_value);
}
},
d(detaching) {
if (detaching)
detach(div);
mounted = false;
run_all(dispose);
}
};
}
function create_each_block9(ctx) {
let if_block_anchor;
let if_block = ctx[16].length > 1 && create_if_block8(ctx);
return {
c() {
if (if_block)
if_block.c();
if_block_anchor = empty();
},
m(target, anchor) {
if (if_block)
if_block.m(target, anchor);
insert(target, if_block_anchor, anchor);
},
p(ctx2, dirty) {
if (ctx2[16].length > 1) {
if (if_block) {
if_block.p(ctx2, dirty);
} else {
if_block = create_if_block8(ctx2);
if_block.c();
if_block.m(if_block_anchor.parentNode, if_block_anchor);
}
} else if (if_block) {
if_block.d(1);
if_block = null;
}
},
d(detaching) {
if (if_block)
if_block.d(detaching);
if (detaching)
detach(if_block_anchor);
}
};
}
function create_fragment22(ctx) {
let span;
let current_block_type_index;
let if_block;
let span_aria_label_value;
let t0;
let button;
let t2;
let select;
let t3;
let div;
let current;
let mounted;
let dispose;
const if_block_creators = [create_if_block_15, create_else_block4];
const if_blocks = [];
function select_block_type(ctx2, dirty) {
if (ctx2[4])
return 0;
return 1;
}
current_block_type_index = select_block_type(ctx, -1);
if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
let each_value_1 = DIRECTIONS;
let each_blocks_1 = [];
for (let i = 0; i < each_value_1.length; i += 1) {
each_blocks_1[i] = create_each_block_16(get_each_context_16(ctx, each_value_1, i));
}
let each_value = ctx[5];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block9(get_each_context9(ctx, each_value, i));
}
return {
c() {
span = element("span");
if_block.c();
t0 = space();
button = element("button");
button.textContent = "\u21BB";
t2 = space();
select = element("select");
for (let i = 0; i < each_blocks_1.length; i += 1) {
each_blocks_1[i].c();
}
t3 = space();
div = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
attr(span, "class", "icon svelte-8j6nux");
attr(span, "aria-label", span_aria_label_value = ctx[4] ? `Frozen on: ${ctx[3]}` : "Unfrozen");
attr(span, "aria-label-position", "left");
attr(button, "aria-label", "Refresh Stats View (also refreshes Breadcrumbs Index)");
attr(button, "class", "svelte-8j6nux");
attr(select, "class", "dropdown");
if (ctx[2] === void 0)
add_render_callback(() => ctx[9].call(select));
attr(div, "class", "BC-downs svelte-8j6nux");
},
m(target, anchor) {
insert(target, span, anchor);
if_blocks[current_block_type_index].m(span, null);
insert(target, t0, anchor);
insert(target, button, anchor);
insert(target, t2, anchor);
insert(target, select, anchor);
for (let i = 0; i < each_blocks_1.length; i += 1) {
each_blocks_1[i].m(select, null);
}
select_option(select, ctx[2]);
insert(target, t3, anchor);
insert(target, div, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div, null);
}
current = true;
if (!mounted) {
dispose = [
listen(span, "click", ctx[7]),
listen(button, "click", ctx[8]),
listen(select, "change", ctx[9])
];
mounted = true;
}
},
p(ctx2, [dirty]) {
let previous_block_index = current_block_type_index;
current_block_type_index = select_block_type(ctx2, dirty);
if (current_block_type_index !== previous_block_index) {
group_outros();
transition_out(if_blocks[previous_block_index], 1, 1, () => {
if_blocks[previous_block_index] = null;
});
check_outros();
if_block = if_blocks[current_block_type_index];
if (!if_block) {
if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
if_block.c();
} else {
}
transition_in(if_block, 1);
if_block.m(span, null);
}
if (!current || dirty & 24 && span_aria_label_value !== (span_aria_label_value = ctx2[4] ? `Frozen on: ${ctx2[3]}` : "Unfrozen")) {
attr(span, "aria-label", span_aria_label_value);
}
if (dirty & 0) {
each_value_1 = DIRECTIONS;
let i;
for (i = 0; i < each_value_1.length; i += 1) {
const child_ctx = get_each_context_16(ctx2, each_value_1, i);
if (each_blocks_1[i]) {
each_blocks_1[i].p(child_ctx, dirty);
} else {
each_blocks_1[i] = create_each_block_16(child_ctx);
each_blocks_1[i].c();
each_blocks_1[i].m(select, null);
}
}
for (; i < each_blocks_1.length; i += 1) {
each_blocks_1[i].d(1);
}
each_blocks_1.length = each_value_1.length;
}
if (dirty & 4) {
select_option(select, ctx2[2]);
}
if (dirty & 98) {
each_value = ctx2[5];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context9(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block9(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
},
i(local) {
if (current)
return;
transition_in(if_block);
current = true;
},
o(local) {
transition_out(if_block);
current = false;
},
d(detaching) {
if (detaching)
detach(span);
if_blocks[current_block_type_index].d();
if (detaching)
detach(t0);
if (detaching)
detach(button);
if (detaching)
detach(t2);
if (detaching)
detach(select);
destroy_each(each_blocks_1, detaching);
if (detaching)
detach(t3);
if (detaching)
detach(div);
destroy_each(each_blocks, detaching);
mounted = false;
run_all(dispose);
}
};
}
function instance22($$self, $$props, $$invalidate) {
var _a;
let { plugin } = $$props;
let { view } = $$props;
const { settings, app: app2, closedG } = plugin;
const { createIndexIndent } = settings;
let dir = "down";
let frozen = false;
let { basename } = (_a = getCurrFile()) !== null && _a !== void 0 ? _a : {};
plugin.registerEvent(app2.workspace.on("active-leaf-change", () => {
var _a2;
if (frozen)
return;
$$invalidate(3, basename = (_a2 = getCurrFile()) === null || _a2 === void 0 ? void 0 : _a2.basename);
}));
let lines;
const click_handler = () => {
var _a2;
$$invalidate(4, frozen = !frozen);
if (!frozen)
$$invalidate(3, basename = (_a2 = getCurrFile()) == null ? void 0 : _a2.basename);
};
const click_handler_1 = async () => {
await refreshIndex(plugin);
await view.draw();
};
function select_change_handler() {
dir = select_value(this);
$$invalidate(2, dir);
}
const click_handler_2 = async (line, e) => await openOrSwitch(line[1], e);
const mouseover_handler = (line, e) => hoverPreview(e, view, line[1]);
$$self.$$set = ($$props2) => {
if ("plugin" in $$props2)
$$invalidate(0, plugin = $$props2.plugin);
if ("view" in $$props2)
$$invalidate(1, view = $$props2.view);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & 12) {
$: {
const dirG = getSubInDirs(closedG, dir);
const allPaths = dfsAllPaths(dirG, basename);
const index2 = createIndex(allPaths, false, createIndexIndent);
(0, import_loglevel20.info)({ allPaths, index: index2 });
$$invalidate(5, lines = indexToLinePairs(index2));
}
}
};
return [
plugin,
view,
dir,
basename,
frozen,
lines,
settings,
click_handler,
click_handler_1,
select_change_handler,
click_handler_2,
mouseover_handler
];
}
var SideTree = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance22, create_fragment22, safe_not_equal, { plugin: 0, view: 1 }, add_css14);
}
};
var SideTree_default = SideTree;
// src/Views/TreeView.ts
var TreeView = class extends import_obsidian42.ItemView {
constructor(leaf, plugin) {
super(leaf);
this.icon = addFeatherIcon("corner-right-down");
this.plugin = plugin;
}
async onload() {
super.onload();
app.workspace.onLayoutReady(async () => {
await this.draw();
});
}
getViewType() {
return TREE_VIEW;
}
getDisplayText() {
return "Breadcrumbs Down";
}
async onOpen() {
}
onClose() {
var _a;
(_a = this.view) == null ? void 0 : _a.$destroy();
return Promise.resolve();
}
async draw() {
this.contentEl.empty();
this.view = new SideTree_default({
target: this.contentEl,
props: { plugin: this.plugin, view: this }
});
}
};
// node_modules/d3-array/src/ascending.js
function ascending_default(a2, b) {
return a2 < b ? -1 : a2 > b ? 1 : a2 >= b ? 0 : NaN;
}
// node_modules/d3-array/src/bisector.js
function bisector_default(f) {
let delta = f;
let compare = f;
if (f.length === 1) {
delta = (d, x4) => f(d) - x4;
compare = ascendingComparator(f);
}
function left(a2, x4, lo, hi) {
if (lo == null)
lo = 0;
if (hi == null)
hi = a2.length;
while (lo < hi) {
const mid = lo + hi >>> 1;
if (compare(a2[mid], x4) < 0)
lo = mid + 1;
else
hi = mid;
}
return lo;
}
function right(a2, x4, lo, hi) {
if (lo == null)
lo = 0;
if (hi == null)
hi = a2.length;
while (lo < hi) {
const mid = lo + hi >>> 1;
if (compare(a2[mid], x4) > 0)
hi = mid;
else
lo = mid + 1;
}
return lo;
}
function center(a2, x4, lo, hi) {
if (lo == null)
lo = 0;
if (hi == null)
hi = a2.length;
const i = left(a2, x4, lo, hi - 1);
return i > lo && delta(a2[i - 1], x4) > -delta(a2[i], x4) ? i - 1 : i;
}
return { left, center, right };
}
function ascendingComparator(f) {
return (d, x4) => ascending_default(f(d), x4);
}
// node_modules/d3-array/src/number.js
function number_default(x4) {
return x4 === null ? NaN : +x4;
}
// node_modules/d3-array/src/bisect.js
var ascendingBisect = bisector_default(ascending_default);
var bisectRight = ascendingBisect.right;
var bisectLeft = ascendingBisect.left;
var bisectCenter = bisector_default(number_default).center;
var bisect_default = bisectRight;
// node_modules/d3-array/src/ticks.js
var e10 = Math.sqrt(50);
var e5 = Math.sqrt(10);
var e2 = Math.sqrt(2);
function ticks_default(start2, stop, count2) {
var reverse, i = -1, n, ticks, step;
stop = +stop, start2 = +start2, count2 = +count2;
if (start2 === stop && count2 > 0)
return [start2];
if (reverse = stop < start2)
n = start2, start2 = stop, stop = n;
if ((step = tickIncrement(start2, stop, count2)) === 0 || !isFinite(step))
return [];
if (step > 0) {
let r0 = Math.round(start2 / step), r1 = Math.round(stop / step);
if (r0 * step < start2)
++r0;
if (r1 * step > stop)
--r1;
ticks = new Array(n = r1 - r0 + 1);
while (++i < n)
ticks[i] = (r0 + i) * step;
} else {
step = -step;
let r0 = Math.round(start2 * step), r1 = Math.round(stop * step);
if (r0 / step < start2)
++r0;
if (r1 / step > stop)
--r1;
ticks = new Array(n = r1 - r0 + 1);
while (++i < n)
ticks[i] = (r0 + i) / step;
}
if (reverse)
ticks.reverse();
return ticks;
}
function tickIncrement(start2, stop, count2) {
var step = (stop - start2) / Math.max(0, count2), power = Math.floor(Math.log(step) / Math.LN10), error6 = step / Math.pow(10, power);
return power >= 0 ? (error6 >= e10 ? 10 : error6 >= e5 ? 5 : error6 >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error6 >= e10 ? 10 : error6 >= e5 ? 5 : error6 >= e2 ? 2 : 1);
}
function tickStep(start2, stop, count2) {
var step0 = Math.abs(stop - start2) / Math.max(0, count2), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error6 = step0 / step1;
if (error6 >= e10)
step1 *= 10;
else if (error6 >= e5)
step1 *= 5;
else if (error6 >= e2)
step1 *= 2;
return stop < start2 ? -step1 : step1;
}
// node_modules/d3-array/src/max.js
function max(values, valueof) {
let max4;
if (valueof === void 0) {
for (const value of values) {
if (value != null && (max4 < value || max4 === void 0 && value >= value)) {
max4 = value;
}
}
} else {
let index2 = -1;
for (let value of values) {
if ((value = valueof(value, ++index2, values)) != null && (max4 < value || max4 === void 0 && value >= value)) {
max4 = value;
}
}
}
return max4;
}
// node_modules/d3-array/src/range.js
function range_default(start2, stop, step) {
start2 = +start2, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start2, start2 = 0, 1) : n < 3 ? 1 : +step;
var i = -1, n = Math.max(0, Math.ceil((stop - start2) / step)) | 0, range = new Array(n);
while (++i < n) {
range[i] = start2 + i * step;
}
return range;
}
// node_modules/d3-dispatch/src/dispatch.js
var noop2 = { value: () => {
} };
function dispatch() {
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t))
throw new Error("illegal type: " + t);
_[t] = [];
}
return new Dispatch(_);
}
function Dispatch(_) {
this._ = _;
}
function parseTypenames(typenames, types) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0)
name = t.slice(i + 1), t = t.slice(0, i);
if (t && !types.hasOwnProperty(t))
throw new Error("unknown type: " + t);
return { type: t, name };
});
}
Dispatch.prototype = dispatch.prototype = {
constructor: Dispatch,
on: function(typename, callback) {
var _ = this._, T = parseTypenames(typename + "", _), t, i = -1, n = T.length;
if (arguments.length < 2) {
while (++i < n)
if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name)))
return t;
return;
}
if (callback != null && typeof callback !== "function")
throw new Error("invalid callback: " + callback);
while (++i < n) {
if (t = (typename = T[i]).type)
_[t] = set(_[t], typename.name, callback);
else if (callback == null)
for (t in _)
_[t] = set(_[t], typename.name, null);
}
return this;
},
copy: function() {
var copy3 = {}, _ = this._;
for (var t in _)
copy3[t] = _[t].slice();
return new Dispatch(copy3);
},
call: function(type2, that) {
if ((n = arguments.length - 2) > 0)
for (var args = new Array(n), i = 0, n, t; i < n; ++i)
args[i] = arguments[i + 2];
if (!this._.hasOwnProperty(type2))
throw new Error("unknown type: " + type2);
for (t = this._[type2], i = 0, n = t.length; i < n; ++i)
t[i].value.apply(that, args);
},
apply: function(type2, that, args) {
if (!this._.hasOwnProperty(type2))
throw new Error("unknown type: " + type2);
for (var t = this._[type2], i = 0, n = t.length; i < n; ++i)
t[i].value.apply(that, args);
}
};
function get(type2, name) {
for (var i = 0, n = type2.length, c3; i < n; ++i) {
if ((c3 = type2[i]).name === name) {
return c3.value;
}
}
}
function set(type2, name, callback) {
for (var i = 0, n = type2.length; i < n; ++i) {
if (type2[i].name === name) {
type2[i] = noop2, type2 = type2.slice(0, i).concat(type2.slice(i + 1));
break;
}
}
if (callback != null)
type2.push({ name, value: callback });
return type2;
}
var dispatch_default = dispatch;
// node_modules/d3-selection/src/namespaces.js
var xhtml = "http://www.w3.org/1999/xhtml";
var namespaces_default = {
svg: "http://www.w3.org/2000/svg",
xhtml,
xlink: "http://www.w3.org/1999/xlink",
xml: "http://www.w3.org/XML/1998/namespace",
xmlns: "http://www.w3.org/2000/xmlns/"
};
// node_modules/d3-selection/src/namespace.js
function namespace_default(name) {
var prefix = name += "", i = prefix.indexOf(":");
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns")
name = name.slice(i + 1);
return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name;
}
// node_modules/d3-selection/src/creator.js
function creatorInherit(name) {
return function() {
var document2 = this.ownerDocument, uri = this.namespaceURI;
return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name);
};
}
function creatorFixed(fullname) {
return function() {
return this.ownerDocument.createElementNS(fullname.space, fullname.local);
};
}
function creator_default(name) {
var fullname = namespace_default(name);
return (fullname.local ? creatorFixed : creatorInherit)(fullname);
}
// node_modules/d3-selection/src/selector.js
function none() {
}
function selector_default(selector) {
return selector == null ? none : function() {
return this.querySelector(selector);
};
}
// node_modules/d3-selection/src/selection/select.js
function select_default(select) {
if (typeof select !== "function")
select = selector_default(select);
for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node)
subnode.__data__ = node.__data__;
subgroup[i] = subnode;
}
}
}
return new Selection(subgroups, this._parents);
}
// node_modules/d3-selection/src/array.js
function array_default(x4) {
return typeof x4 === "object" && "length" in x4 ? x4 : Array.from(x4);
}
// node_modules/d3-selection/src/selectorAll.js
function empty2() {
return [];
}
function selectorAll_default(selector) {
return selector == null ? empty2 : function() {
return this.querySelectorAll(selector);
};
}
// node_modules/d3-selection/src/selection/selectAll.js
function arrayAll(select) {
return function() {
var group = select.apply(this, arguments);
return group == null ? [] : array_default(group);
};
}
function selectAll_default(select) {
if (typeof select === "function")
select = arrayAll(select);
else
select = selectorAll_default(select);
for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
subgroups.push(select.call(node, node.__data__, i, group));
parents.push(node);
}
}
}
return new Selection(subgroups, parents);
}
// node_modules/d3-selection/src/matcher.js
function matcher_default(selector) {
return function() {
return this.matches(selector);
};
}
function childMatcher(selector) {
return function(node) {
return node.matches(selector);
};
}
// node_modules/d3-selection/src/selection/selectChild.js
var find = Array.prototype.find;
function childFind(match) {
return function() {
return find.call(this.children, match);
};
}
function childFirst() {
return this.firstElementChild;
}
function selectChild_default(match) {
return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match)));
}
// node_modules/d3-selection/src/selection/selectChildren.js
var filter = Array.prototype.filter;
function children2() {
return this.children;
}
function childrenFilter(match) {
return function() {
return filter.call(this.children, match);
};
}
function selectChildren_default(match) {
return this.selectAll(match == null ? children2 : childrenFilter(typeof match === "function" ? match : childMatcher(match)));
}
// node_modules/d3-selection/src/selection/filter.js
function filter_default(match) {
if (typeof match !== "function")
match = matcher_default(match);
for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
subgroup.push(node);
}
}
}
return new Selection(subgroups, this._parents);
}
// node_modules/d3-selection/src/selection/sparse.js
function sparse_default(update2) {
return new Array(update2.length);
}
// node_modules/d3-selection/src/selection/enter.js
function enter_default() {
return new Selection(this._enter || this._groups.map(sparse_default), this._parents);
}
function EnterNode(parent, datum2) {
this.ownerDocument = parent.ownerDocument;
this.namespaceURI = parent.namespaceURI;
this._next = null;
this._parent = parent;
this.__data__ = datum2;
}
EnterNode.prototype = {
constructor: EnterNode,
appendChild: function(child) {
return this._parent.insertBefore(child, this._next);
},
insertBefore: function(child, next) {
return this._parent.insertBefore(child, next);
},
querySelector: function(selector) {
return this._parent.querySelector(selector);
},
querySelectorAll: function(selector) {
return this._parent.querySelectorAll(selector);
}
};
// node_modules/d3-selection/src/constant.js
function constant_default(x4) {
return function() {
return x4;
};
}
// node_modules/d3-selection/src/selection/data.js
function bindIndex(parent, group, enter, update2, exit, data) {
var i = 0, node, groupLength = group.length, dataLength = data.length;
for (; i < dataLength; ++i) {
if (node = group[i]) {
node.__data__ = data[i];
update2[i] = node;
} else {
enter[i] = new EnterNode(parent, data[i]);
}
}
for (; i < groupLength; ++i) {
if (node = group[i]) {
exit[i] = node;
}
}
}
function bindKey(parent, group, enter, update2, exit, data, key) {
var i, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue;
for (i = 0; i < groupLength; ++i) {
if (node = group[i]) {
keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + "";
if (nodeByKeyValue.has(keyValue)) {
exit[i] = node;
} else {
nodeByKeyValue.set(keyValue, node);
}
}
}
for (i = 0; i < dataLength; ++i) {
keyValue = key.call(parent, data[i], i, data) + "";
if (node = nodeByKeyValue.get(keyValue)) {
update2[i] = node;
node.__data__ = data[i];
nodeByKeyValue.delete(keyValue);
} else {
enter[i] = new EnterNode(parent, data[i]);
}
}
for (i = 0; i < groupLength; ++i) {
if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) {
exit[i] = node;
}
}
}
function datum(node) {
return node.__data__;
}
function data_default(value, key) {
if (!arguments.length)
return Array.from(this, datum);
var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups;
if (typeof value !== "function")
value = constant_default(value);
for (var m2 = groups.length, update2 = new Array(m2), enter = new Array(m2), exit = new Array(m2), j = 0; j < m2; ++j) {
var parent = parents[j], group = groups[j], groupLength = group.length, data = array_default(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = new Array(dataLength), updateGroup = update2[j] = new Array(dataLength), exitGroup = exit[j] = new Array(groupLength);
bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
if (previous = enterGroup[i0]) {
if (i0 >= i1)
i1 = i0 + 1;
while (!(next = updateGroup[i1]) && ++i1 < dataLength)
;
previous._next = next || null;
}
}
}
update2 = new Selection(update2, parents);
update2._enter = enter;
update2._exit = exit;
return update2;
}
// node_modules/d3-selection/src/selection/exit.js
function exit_default() {
return new Selection(this._exit || this._groups.map(sparse_default), this._parents);
}
// node_modules/d3-selection/src/selection/join.js
function join_default(onenter, onupdate, onexit) {
var enter = this.enter(), update2 = this, exit = this.exit();
enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
if (onupdate != null)
update2 = onupdate(update2);
if (onexit == null)
exit.remove();
else
onexit(exit);
return enter && update2 ? enter.merge(update2).order() : update2;
}
// node_modules/d3-selection/src/selection/merge.js
function merge_default(selection2) {
if (!(selection2 instanceof Selection))
throw new Error("invalid merge");
for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group0[i] || group1[i]) {
merge[i] = node;
}
}
}
for (; j < m0; ++j) {
merges[j] = groups0[j];
}
return new Selection(merges, this._parents);
}
// node_modules/d3-selection/src/selection/order.js
function order_default() {
for (var groups = this._groups, j = -1, m2 = groups.length; ++j < m2; ) {
for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
if (node = group[i]) {
if (next && node.compareDocumentPosition(next) ^ 4)
next.parentNode.insertBefore(node, next);
next = node;
}
}
}
return this;
}
// node_modules/d3-selection/src/selection/sort.js
function sort_default(compare) {
if (!compare)
compare = ascending;
function compareNode(a2, b) {
return a2 && b ? compare(a2.__data__, b.__data__) : !a2 - !b;
}
for (var groups = this._groups, m2 = groups.length, sortgroups = new Array(m2), j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group[i]) {
sortgroup[i] = node;
}
}
sortgroup.sort(compareNode);
}
return new Selection(sortgroups, this._parents).order();
}
function ascending(a2, b) {
return a2 < b ? -1 : a2 > b ? 1 : a2 >= b ? 0 : NaN;
}
// node_modules/d3-selection/src/selection/call.js
function call_default() {
var callback = arguments[0];
arguments[0] = this;
callback.apply(null, arguments);
return this;
}
// node_modules/d3-selection/src/selection/nodes.js
function nodes_default() {
return Array.from(this);
}
// node_modules/d3-selection/src/selection/node.js
function node_default() {
for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) {
for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
var node = group[i];
if (node)
return node;
}
}
return null;
}
// node_modules/d3-selection/src/selection/size.js
function size_default() {
let size = 0;
for (const node of this)
++size;
return size;
}
// node_modules/d3-selection/src/selection/empty.js
function empty_default() {
return !this.node();
}
// node_modules/d3-selection/src/selection/each.js
function each_default(callback) {
for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) {
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
if (node = group[i])
callback.call(node, node.__data__, i, group);
}
}
return this;
}
// node_modules/d3-selection/src/selection/attr.js
function attrRemove(name) {
return function() {
this.removeAttribute(name);
};
}
function attrRemoveNS(fullname) {
return function() {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
function attrConstant(name, value) {
return function() {
this.setAttribute(name, value);
};
}
function attrConstantNS(fullname, value) {
return function() {
this.setAttributeNS(fullname.space, fullname.local, value);
};
}
function attrFunction(name, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null)
this.removeAttribute(name);
else
this.setAttribute(name, v);
};
}
function attrFunctionNS(fullname, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null)
this.removeAttributeNS(fullname.space, fullname.local);
else
this.setAttributeNS(fullname.space, fullname.local, v);
};
}
function attr_default(name, value) {
var fullname = namespace_default(name);
if (arguments.length < 2) {
var node = this.node();
return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname);
}
return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value));
}
// node_modules/d3-selection/src/window.js
function window_default(node) {
return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView;
}
// node_modules/d3-selection/src/selection/style.js
function styleRemove(name) {
return function() {
this.style.removeProperty(name);
};
}
function styleConstant(name, value, priority) {
return function() {
this.style.setProperty(name, value, priority);
};
}
function styleFunction(name, value, priority) {
return function() {
var v = value.apply(this, arguments);
if (v == null)
this.style.removeProperty(name);
else
this.style.setProperty(name, v, priority);
};
}
function style_default(name, value, priority) {
return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name);
}
function styleValue(node, name) {
return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name);
}
// node_modules/d3-selection/src/selection/property.js
function propertyRemove(name) {
return function() {
delete this[name];
};
}
function propertyConstant(name, value) {
return function() {
this[name] = value;
};
}
function propertyFunction(name, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null)
delete this[name];
else
this[name] = v;
};
}
function property_default(name, value) {
return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name];
}
// node_modules/d3-selection/src/selection/classed.js
function classArray(string) {
return string.trim().split(/^|\s+/);
}
function classList(node) {
return node.classList || new ClassList(node);
}
function ClassList(node) {
this._node = node;
this._names = classArray(node.getAttribute("class") || "");
}
ClassList.prototype = {
add: function(name) {
var i = this._names.indexOf(name);
if (i < 0) {
this._names.push(name);
this._node.setAttribute("class", this._names.join(" "));
}
},
remove: function(name) {
var i = this._names.indexOf(name);
if (i >= 0) {
this._names.splice(i, 1);
this._node.setAttribute("class", this._names.join(" "));
}
},
contains: function(name) {
return this._names.indexOf(name) >= 0;
}
};
function classedAdd(node, names) {
var list = classList(node), i = -1, n = names.length;
while (++i < n)
list.add(names[i]);
}
function classedRemove(node, names) {
var list = classList(node), i = -1, n = names.length;
while (++i < n)
list.remove(names[i]);
}
function classedTrue(names) {
return function() {
classedAdd(this, names);
};
}
function classedFalse(names) {
return function() {
classedRemove(this, names);
};
}
function classedFunction(names, value) {
return function() {
(value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
};
}
function classed_default(name, value) {
var names = classArray(name + "");
if (arguments.length < 2) {
var list = classList(this.node()), i = -1, n = names.length;
while (++i < n)
if (!list.contains(names[i]))
return false;
return true;
}
return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value));
}
// node_modules/d3-selection/src/selection/text.js
function textRemove() {
this.textContent = "";
}
function textConstant(value) {
return function() {
this.textContent = value;
};
}
function textFunction(value) {
return function() {
var v = value.apply(this, arguments);
this.textContent = v == null ? "" : v;
};
}
function text_default(value) {
return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent;
}
// node_modules/d3-selection/src/selection/html.js
function htmlRemove() {
this.innerHTML = "";
}
function htmlConstant(value) {
return function() {
this.innerHTML = value;
};
}
function htmlFunction(value) {
return function() {
var v = value.apply(this, arguments);
this.innerHTML = v == null ? "" : v;
};
}
function html_default(value) {
return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML;
}
// node_modules/d3-selection/src/selection/raise.js
function raise() {
if (this.nextSibling)
this.parentNode.appendChild(this);
}
function raise_default() {
return this.each(raise);
}
// node_modules/d3-selection/src/selection/lower.js
function lower() {
if (this.previousSibling)
this.parentNode.insertBefore(this, this.parentNode.firstChild);
}
function lower_default() {
return this.each(lower);
}
// node_modules/d3-selection/src/selection/append.js
function append_default(name) {
var create2 = typeof name === "function" ? name : creator_default(name);
return this.select(function() {
return this.appendChild(create2.apply(this, arguments));
});
}
// node_modules/d3-selection/src/selection/insert.js
function constantNull() {
return null;
}
function insert_default(name, before) {
var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before);
return this.select(function() {
return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null);
});
}
// node_modules/d3-selection/src/selection/remove.js
function remove() {
var parent = this.parentNode;
if (parent)
parent.removeChild(this);
}
function remove_default() {
return this.each(remove);
}
// node_modules/d3-selection/src/selection/clone.js
function selection_cloneShallow() {
var clone = this.cloneNode(false), parent = this.parentNode;
return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
}
function selection_cloneDeep() {
var clone = this.cloneNode(true), parent = this.parentNode;
return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
}
function clone_default(deep) {
return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
}
// node_modules/d3-selection/src/selection/datum.js
function datum_default(value) {
return arguments.length ? this.property("__data__", value) : this.node().__data__;
}
// node_modules/d3-selection/src/selection/on.js
function contextListener(listener) {
return function(event) {
listener.call(this, event, this.__data__);
};
}
function parseTypenames2(typenames) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0)
name = t.slice(i + 1), t = t.slice(0, i);
return { type: t, name };
});
}
function onRemove(typename) {
return function() {
var on = this.__on;
if (!on)
return;
for (var j = 0, i = -1, m2 = on.length, o; j < m2; ++j) {
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
this.removeEventListener(o.type, o.listener, o.options);
} else {
on[++i] = o;
}
}
if (++i)
on.length = i;
else
delete this.__on;
};
}
function onAdd(typename, value, options) {
return function() {
var on = this.__on, o, listener = contextListener(value);
if (on)
for (var j = 0, m2 = on.length; j < m2; ++j) {
if ((o = on[j]).type === typename.type && o.name === typename.name) {
this.removeEventListener(o.type, o.listener, o.options);
this.addEventListener(o.type, o.listener = listener, o.options = options);
o.value = value;
return;
}
}
this.addEventListener(typename.type, listener, options);
o = { type: typename.type, name: typename.name, value, listener, options };
if (!on)
this.__on = [o];
else
on.push(o);
};
}
function on_default(typename, value, options) {
var typenames = parseTypenames2(typename + ""), i, n = typenames.length, t;
if (arguments.length < 2) {
var on = this.node().__on;
if (on)
for (var j = 0, m2 = on.length, o; j < m2; ++j) {
for (i = 0, o = on[j]; i < n; ++i) {
if ((t = typenames[i]).type === o.type && t.name === o.name) {
return o.value;
}
}
}
return;
}
on = value ? onAdd : onRemove;
for (i = 0; i < n; ++i)
this.each(on(typenames[i], value, options));
return this;
}
// node_modules/d3-selection/src/selection/dispatch.js
function dispatchEvent(node, type2, params) {
var window2 = window_default(node), event = window2.CustomEvent;
if (typeof event === "function") {
event = new event(type2, params);
} else {
event = window2.document.createEvent("Event");
if (params)
event.initEvent(type2, params.bubbles, params.cancelable), event.detail = params.detail;
else
event.initEvent(type2, false, false);
}
node.dispatchEvent(event);
}
function dispatchConstant(type2, params) {
return function() {
return dispatchEvent(this, type2, params);
};
}
function dispatchFunction(type2, params) {
return function() {
return dispatchEvent(this, type2, params.apply(this, arguments));
};
}
function dispatch_default2(type2, params) {
return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type2, params));
}
// node_modules/d3-selection/src/selection/iterator.js
function* iterator_default() {
for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) {
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
if (node = group[i])
yield node;
}
}
}
// node_modules/d3-selection/src/selection/index.js
var root = [null];
function Selection(groups, parents) {
this._groups = groups;
this._parents = parents;
}
function selection() {
return new Selection([[document.documentElement]], root);
}
function selection_selection() {
return this;
}
Selection.prototype = selection.prototype = {
constructor: Selection,
select: select_default,
selectAll: selectAll_default,
selectChild: selectChild_default,
selectChildren: selectChildren_default,
filter: filter_default,
data: data_default,
enter: enter_default,
exit: exit_default,
join: join_default,
merge: merge_default,
selection: selection_selection,
order: order_default,
sort: sort_default,
call: call_default,
nodes: nodes_default,
node: node_default,
size: size_default,
empty: empty_default,
each: each_default,
attr: attr_default,
style: style_default,
property: property_default,
classed: classed_default,
text: text_default,
html: html_default,
raise: raise_default,
lower: lower_default,
append: append_default,
insert: insert_default,
remove: remove_default,
clone: clone_default,
datum: datum_default,
on: on_default,
dispatch: dispatch_default2,
[Symbol.iterator]: iterator_default
};
var selection_default = selection;
// node_modules/d3-selection/src/select.js
function select_default2(selector) {
return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root);
}
// node_modules/d3-selection/src/sourceEvent.js
function sourceEvent_default(event) {
let sourceEvent;
while (sourceEvent = event.sourceEvent)
event = sourceEvent;
return event;
}
// node_modules/d3-selection/src/pointer.js
function pointer_default(event, node) {
event = sourceEvent_default(event);
if (node === void 0)
node = event.currentTarget;
if (node) {
var svg = node.ownerSVGElement || node;
if (svg.createSVGPoint) {
var point3 = svg.createSVGPoint();
point3.x = event.clientX, point3.y = event.clientY;
point3 = point3.matrixTransform(node.getScreenCTM().inverse());
return [point3.x, point3.y];
}
if (node.getBoundingClientRect) {
var rect = node.getBoundingClientRect();
return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
}
}
return [event.pageX, event.pageY];
}
// node_modules/d3-drag/src/noevent.js
function nopropagation(event) {
event.stopImmediatePropagation();
}
function noevent_default(event) {
event.preventDefault();
event.stopImmediatePropagation();
}
// node_modules/d3-drag/src/nodrag.js
function nodrag_default(view) {
var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, true);
if ("onselectstart" in root2) {
selection2.on("selectstart.drag", noevent_default, true);
} else {
root2.__noselect = root2.style.MozUserSelect;
root2.style.MozUserSelect = "none";
}
}
function yesdrag(view, noclick) {
var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null);
if (noclick) {
selection2.on("click.drag", noevent_default, true);
setTimeout(function() {
selection2.on("click.drag", null);
}, 0);
}
if ("onselectstart" in root2) {
selection2.on("selectstart.drag", null);
} else {
root2.style.MozUserSelect = root2.__noselect;
delete root2.__noselect;
}
}
// node_modules/d3-drag/src/constant.js
var constant_default2 = (x4) => () => x4;
// node_modules/d3-drag/src/event.js
function DragEvent(type2, {
sourceEvent,
subject,
target,
identifier,
active,
x: x4,
y: y4,
dx,
dy,
dispatch: dispatch2
}) {
Object.defineProperties(this, {
type: { value: type2, enumerable: true, configurable: true },
sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
subject: { value: subject, enumerable: true, configurable: true },
target: { value: target, enumerable: true, configurable: true },
identifier: { value: identifier, enumerable: true, configurable: true },
active: { value: active, enumerable: true, configurable: true },
x: { value: x4, enumerable: true, configurable: true },
y: { value: y4, enumerable: true, configurable: true },
dx: { value: dx, enumerable: true, configurable: true },
dy: { value: dy, enumerable: true, configurable: true },
_: { value: dispatch2 }
});
}
DragEvent.prototype.on = function() {
var value = this._.on.apply(this._, arguments);
return value === this._ ? this : value;
};
// node_modules/d3-drag/src/drag.js
function defaultFilter(event) {
return !event.ctrlKey && !event.button;
}
function defaultContainer() {
return this.parentNode;
}
function defaultSubject(event, d) {
return d == null ? { x: event.x, y: event.y } : d;
}
function defaultTouchable() {
return navigator.maxTouchPoints || "ontouchstart" in this;
}
function drag_default() {
var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0;
function drag(selection2) {
selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
}
function mousedowned(event, d) {
if (touchending || !filter2.call(this, event, d))
return;
var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse");
if (!gesture)
return;
select_default2(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
nodrag_default(event.view);
nopropagation(event);
mousemoving = false;
mousedownx = event.clientX;
mousedowny = event.clientY;
gesture("start", event);
}
function mousemoved(event) {
noevent_default(event);
if (!mousemoving) {
var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
mousemoving = dx * dx + dy * dy > clickDistance2;
}
gestures.mouse("drag", event);
}
function mouseupped(event) {
select_default2(event.view).on("mousemove.drag mouseup.drag", null);
yesdrag(event.view, mousemoving);
noevent_default(event);
gestures.mouse("end", event);
}
function touchstarted(event, d) {
if (!filter2.call(this, event, d))
return;
var touches = event.changedTouches, c3 = container.call(this, event, d), n = touches.length, i, gesture;
for (i = 0; i < n; ++i) {
if (gesture = beforestart(this, c3, event, d, touches[i].identifier, touches[i])) {
nopropagation(event);
gesture("start", event, touches[i]);
}
}
}
function touchmoved(event) {
var touches = event.changedTouches, n = touches.length, i, gesture;
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
noevent_default(event);
gesture("drag", event, touches[i]);
}
}
}
function touchended(event) {
var touches = event.changedTouches, n = touches.length, i, gesture;
if (touchending)
clearTimeout(touchending);
touchending = setTimeout(function() {
touchending = null;
}, 500);
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
nopropagation(event);
gesture("end", event, touches[i]);
}
}
}
function beforestart(that, container2, event, d, identifier, touch) {
var dispatch2 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s;
if ((s = subject.call(that, new DragEvent("beforestart", {
sourceEvent: event,
target: drag,
identifier,
active,
x: p[0],
y: p[1],
dx: 0,
dy: 0,
dispatch: dispatch2
}), d)) == null)
return;
dx = s.x - p[0] || 0;
dy = s.y - p[1] || 0;
return function gesture(type2, event2, touch2) {
var p0 = p, n;
switch (type2) {
case "start":
gestures[identifier] = gesture, n = active++;
break;
case "end":
delete gestures[identifier], --active;
case "drag":
p = pointer_default(touch2 || event2, container2), n = active;
break;
}
dispatch2.call(type2, that, new DragEvent(type2, {
sourceEvent: event2,
subject: s,
target: drag,
identifier,
active: n,
x: p[0] + dx,
y: p[1] + dy,
dx: p[0] - p0[0],
dy: p[1] - p0[1],
dispatch: dispatch2
}), d);
};
}
drag.filter = function(_) {
return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2;
};
drag.container = function(_) {
return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container;
};
drag.subject = function(_) {
return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject;
};
drag.touchable = function(_) {
return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable;
};
drag.on = function() {
var value = listeners.on.apply(listeners, arguments);
return value === listeners ? drag : value;
};
drag.clickDistance = function(_) {
return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
};
return drag;
}
// node_modules/d3-color/src/define.js
function define_default(constructor, factory, prototype) {
constructor.prototype = factory.prototype = prototype;
prototype.constructor = constructor;
}
function extend(parent, definition) {
var prototype = Object.create(parent.prototype);
for (var key in definition)
prototype[key] = definition[key];
return prototype;
}
// node_modules/d3-color/src/color.js
function Color() {
}
var darker = 0.7;
var brighter = 1 / darker;
var reI = "\\s*([+-]?\\d+)\\s*";
var reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*";
var reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
var reHex = /^#([0-9a-f]{3,8})$/;
var reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$");
var reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$");
var reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$");
var reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$");
var reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$");
var reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
var named = {
aliceblue: 15792383,
antiquewhite: 16444375,
aqua: 65535,
aquamarine: 8388564,
azure: 15794175,
beige: 16119260,
bisque: 16770244,
black: 0,
blanchedalmond: 16772045,
blue: 255,
blueviolet: 9055202,
brown: 10824234,
burlywood: 14596231,
cadetblue: 6266528,
chartreuse: 8388352,
chocolate: 13789470,
coral: 16744272,
cornflowerblue: 6591981,
cornsilk: 16775388,
crimson: 14423100,
cyan: 65535,
darkblue: 139,
darkcyan: 35723,
darkgoldenrod: 12092939,
darkgray: 11119017,
darkgreen: 25600,
darkgrey: 11119017,
darkkhaki: 12433259,
darkmagenta: 9109643,
darkolivegreen: 5597999,
darkorange: 16747520,
darkorchid: 10040012,
darkred: 9109504,
darksalmon: 15308410,
darkseagreen: 9419919,
darkslateblue: 4734347,
darkslategray: 3100495,
darkslategrey: 3100495,
darkturquoise: 52945,
darkviolet: 9699539,
deeppink: 16716947,
deepskyblue: 49151,
dimgray: 6908265,
dimgrey: 6908265,
dodgerblue: 2003199,
firebrick: 11674146,
floralwhite: 16775920,
forestgreen: 2263842,
fuchsia: 16711935,
gainsboro: 14474460,
ghostwhite: 16316671,
gold: 16766720,
goldenrod: 14329120,
gray: 8421504,
green: 32768,
greenyellow: 11403055,
grey: 8421504,
honeydew: 15794160,
hotpink: 16738740,
indianred: 13458524,
indigo: 4915330,
ivory: 16777200,
khaki: 15787660,
lavender: 15132410,
lavenderblush: 16773365,
lawngreen: 8190976,
lemonchiffon: 16775885,
lightblue: 11393254,
lightcoral: 15761536,
lightcyan: 14745599,
lightgoldenrodyellow: 16448210,
lightgray: 13882323,
lightgreen: 9498256,
lightgrey: 13882323,
lightpink: 16758465,
lightsalmon: 16752762,
lightseagreen: 2142890,
lightskyblue: 8900346,
lightslategray: 7833753,
lightslategrey: 7833753,
lightsteelblue: 11584734,
lightyellow: 16777184,
lime: 65280,
limegreen: 3329330,
linen: 16445670,
magenta: 16711935,
maroon: 8388608,
mediumaquamarine: 6737322,
mediumblue: 205,
mediumorchid: 12211667,
mediumpurple: 9662683,
mediumseagreen: 3978097,
mediumslateblue: 8087790,
mediumspringgreen: 64154,
mediumturquoise: 4772300,
mediumvioletred: 13047173,
midnightblue: 1644912,
mintcream: 16121850,
mistyrose: 16770273,
moccasin: 16770229,
navajowhite: 16768685,
navy: 128,
oldlace: 16643558,
olive: 8421376,
olivedrab: 7048739,
orange: 16753920,
orangered: 16729344,
orchid: 14315734,
palegoldenrod: 15657130,
palegreen: 10025880,
paleturquoise: 11529966,
palevioletred: 14381203,
papayawhip: 16773077,
peachpuff: 16767673,
peru: 13468991,
pink: 16761035,
plum: 14524637,
powderblue: 11591910,
purple: 8388736,
rebeccapurple: 6697881,
red: 16711680,
rosybrown: 12357519,
royalblue: 4286945,
saddlebrown: 9127187,
salmon: 16416882,
sandybrown: 16032864,
seagreen: 3050327,
seashell: 16774638,
sienna: 10506797,
silver: 12632256,
skyblue: 8900331,
slateblue: 6970061,
slategray: 7372944,
slategrey: 7372944,
snow: 16775930,
springgreen: 65407,
steelblue: 4620980,
tan: 13808780,
teal: 32896,
thistle: 14204888,
tomato: 16737095,
turquoise: 4251856,
violet: 15631086,
wheat: 16113331,
white: 16777215,
whitesmoke: 16119285,
yellow: 16776960,
yellowgreen: 10145074
};
define_default(Color, color, {
copy: function(channels) {
return Object.assign(new this.constructor(), this, channels);
},
displayable: function() {
return this.rgb().displayable();
},
hex: color_formatHex,
formatHex: color_formatHex,
formatHsl: color_formatHsl,
formatRgb: color_formatRgb,
toString: color_formatRgb
});
function color_formatHex() {
return this.rgb().formatHex();
}
function color_formatHsl() {
return hslConvert(this).formatHsl();
}
function color_formatRgb() {
return this.rgb().formatRgb();
}
function color(format2) {
var m2, l;
format2 = (format2 + "").trim().toLowerCase();
return (m2 = reHex.exec(format2)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format2)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format2)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format2)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format2)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null;
}
function rgbn(n) {
return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1);
}
function rgba(r, g, b, a2) {
if (a2 <= 0)
r = g = b = NaN;
return new Rgb(r, g, b, a2);
}
function rgbConvert(o) {
if (!(o instanceof Color))
o = color(o);
if (!o)
return new Rgb();
o = o.rgb();
return new Rgb(o.r, o.g, o.b, o.opacity);
}
function rgb(r, g, b, opacity) {
return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
}
function Rgb(r, g, b, opacity) {
this.r = +r;
this.g = +g;
this.b = +b;
this.opacity = +opacity;
}
define_default(Rgb, rgb, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
rgb: function() {
return this;
},
displayable: function() {
return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);
},
hex: rgb_formatHex,
formatHex: rgb_formatHex,
formatRgb: rgb_formatRgb,
toString: rgb_formatRgb
}));
function rgb_formatHex() {
return "#" + hex(this.r) + hex(this.g) + hex(this.b);
}
function rgb_formatRgb() {
var a2 = this.opacity;
a2 = isNaN(a2) ? 1 : Math.max(0, Math.min(1, a2));
return (a2 === 1 ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a2 === 1 ? ")" : ", " + a2 + ")");
}
function hex(value) {
value = Math.max(0, Math.min(255, Math.round(value) || 0));
return (value < 16 ? "0" : "") + value.toString(16);
}
function hsla(h, s, l, a2) {
if (a2 <= 0)
h = s = l = NaN;
else if (l <= 0 || l >= 1)
h = s = NaN;
else if (s <= 0)
h = NaN;
return new Hsl(h, s, l, a2);
}
function hslConvert(o) {
if (o instanceof Hsl)
return new Hsl(o.h, o.s, o.l, o.opacity);
if (!(o instanceof Color))
o = color(o);
if (!o)
return new Hsl();
if (o instanceof Hsl)
return o;
o = o.rgb();
var r = o.r / 255, g = o.g / 255, b = o.b / 255, min3 = Math.min(r, g, b), max4 = Math.max(r, g, b), h = NaN, s = max4 - min3, l = (max4 + min3) / 2;
if (s) {
if (r === max4)
h = (g - b) / s + (g < b) * 6;
else if (g === max4)
h = (b - r) / s + 2;
else
h = (r - g) / s + 4;
s /= l < 0.5 ? max4 + min3 : 2 - max4 - min3;
h *= 60;
} else {
s = l > 0 && l < 1 ? 0 : h;
}
return new Hsl(h, s, l, o.opacity);
}
function hsl(h, s, l, opacity) {
return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
}
function Hsl(h, s, l, opacity) {
this.h = +h;
this.s = +s;
this.l = +l;
this.opacity = +opacity;
}
define_default(Hsl, hsl, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
rgb: function() {
var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;
return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);
},
displayable: function() {
return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);
},
formatHsl: function() {
var a2 = this.opacity;
a2 = isNaN(a2) ? 1 : Math.max(0, Math.min(1, a2));
return (a2 === 1 ? "hsl(" : "hsla(") + (this.h || 0) + ", " + (this.s || 0) * 100 + "%, " + (this.l || 0) * 100 + "%" + (a2 === 1 ? ")" : ", " + a2 + ")");
}
}));
function hsl2rgb(h, m1, m2) {
return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
}
// node_modules/d3-color/src/math.js
var radians = Math.PI / 180;
var degrees = 180 / Math.PI;
// node_modules/d3-color/src/cubehelix.js
var A = -0.14861;
var B = 1.78277;
var C = -0.29227;
var D = -0.90649;
var E = 1.97294;
var ED = E * D;
var EB = E * B;
var BC_DA = B * C - D * A;
function cubehelixConvert(o) {
if (o instanceof Cubehelix)
return new Cubehelix(o.h, o.s, o.l, o.opacity);
if (!(o instanceof Rgb))
o = rgbConvert(o);
var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), h = s ? Math.atan2(k, bl) * degrees - 120 : NaN;
return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
}
function cubehelix(h, s, l, opacity) {
return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
}
function Cubehelix(h, s, l, opacity) {
this.h = +h;
this.s = +s;
this.l = +l;
this.opacity = +opacity;
}
define_default(Cubehelix, cubehelix, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
},
rgb: function() {
var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, l = +this.l, a2 = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh2 = Math.cos(h), sinh2 = Math.sin(h);
return new Rgb(255 * (l + a2 * (A * cosh2 + B * sinh2)), 255 * (l + a2 * (C * cosh2 + D * sinh2)), 255 * (l + a2 * (E * cosh2)), this.opacity);
}
}));
// node_modules/d3-interpolate/src/basis.js
function basis(t1, v0, v1, v2, v3) {
var t2 = t1 * t1, t3 = t2 * t1;
return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;
}
function basis_default(values) {
var n = values.length - 1;
return function(t) {
var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
return basis((t - i / n) * n, v0, v1, v2, v3);
};
}
// node_modules/d3-interpolate/src/basisClosed.js
function basisClosed_default(values) {
var n = values.length;
return function(t) {
var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];
return basis((t - i / n) * n, v0, v1, v2, v3);
};
}
// node_modules/d3-interpolate/src/constant.js
var constant_default3 = (x4) => () => x4;
// node_modules/d3-interpolate/src/color.js
function linear(a2, d) {
return function(t) {
return a2 + t * d;
};
}
function exponential(a2, b, y4) {
return a2 = Math.pow(a2, y4), b = Math.pow(b, y4) - a2, y4 = 1 / y4, function(t) {
return Math.pow(a2 + t * b, y4);
};
}
function hue(a2, b) {
var d = b - a2;
return d ? linear(a2, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant_default3(isNaN(a2) ? b : a2);
}
function gamma(y4) {
return (y4 = +y4) === 1 ? nogamma : function(a2, b) {
return b - a2 ? exponential(a2, b, y4) : constant_default3(isNaN(a2) ? b : a2);
};
}
function nogamma(a2, b) {
var d = b - a2;
return d ? linear(a2, d) : constant_default3(isNaN(a2) ? b : a2);
}
// node_modules/d3-interpolate/src/rgb.js
var rgb_default = function rgbGamma(y4) {
var color2 = gamma(y4);
function rgb2(start2, end) {
var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity);
return function(t) {
start2.r = r(t);
start2.g = g(t);
start2.b = b(t);
start2.opacity = opacity(t);
return start2 + "";
};
}
rgb2.gamma = rgbGamma;
return rgb2;
}(1);
function rgbSpline(spline) {
return function(colors) {
var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color2;
for (i = 0; i < n; ++i) {
color2 = rgb(colors[i]);
r[i] = color2.r || 0;
g[i] = color2.g || 0;
b[i] = color2.b || 0;
}
r = spline(r);
g = spline(g);
b = spline(b);
color2.opacity = 1;
return function(t) {
color2.r = r(t);
color2.g = g(t);
color2.b = b(t);
return color2 + "";
};
};
}
var rgbBasis = rgbSpline(basis_default);
var rgbBasisClosed = rgbSpline(basisClosed_default);
// node_modules/d3-interpolate/src/numberArray.js
function numberArray_default(a2, b) {
if (!b)
b = [];
var n = a2 ? Math.min(b.length, a2.length) : 0, c3 = b.slice(), i;
return function(t) {
for (i = 0; i < n; ++i)
c3[i] = a2[i] * (1 - t) + b[i] * t;
return c3;
};
}
function isNumberArray(x4) {
return ArrayBuffer.isView(x4) && !(x4 instanceof DataView);
}
// node_modules/d3-interpolate/src/array.js
function genericArray(a2, b) {
var nb = b ? b.length : 0, na = a2 ? Math.min(nb, a2.length) : 0, x4 = new Array(na), c3 = new Array(nb), i;
for (i = 0; i < na; ++i)
x4[i] = value_default(a2[i], b[i]);
for (; i < nb; ++i)
c3[i] = b[i];
return function(t) {
for (i = 0; i < na; ++i)
c3[i] = x4[i](t);
return c3;
};
}
// node_modules/d3-interpolate/src/date.js
function date_default(a2, b) {
var d = new Date();
return a2 = +a2, b = +b, function(t) {
return d.setTime(a2 * (1 - t) + b * t), d;
};
}
// node_modules/d3-interpolate/src/number.js
function number_default2(a2, b) {
return a2 = +a2, b = +b, function(t) {
return a2 * (1 - t) + b * t;
};
}
// node_modules/d3-interpolate/src/object.js
function object_default(a2, b) {
var i = {}, c3 = {}, k;
if (a2 === null || typeof a2 !== "object")
a2 = {};
if (b === null || typeof b !== "object")
b = {};
for (k in b) {
if (k in a2) {
i[k] = value_default(a2[k], b[k]);
} else {
c3[k] = b[k];
}
}
return function(t) {
for (k in i)
c3[k] = i[k](t);
return c3;
};
}
// node_modules/d3-interpolate/src/string.js
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
var reB = new RegExp(reA.source, "g");
function zero(b) {
return function() {
return b;
};
}
function one(b) {
return function(t) {
return b(t) + "";
};
}
function string_default(a2, b) {
var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];
a2 = a2 + "", b = b + "";
while ((am = reA.exec(a2)) && (bm = reB.exec(b))) {
if ((bs = bm.index) > bi) {
bs = b.slice(bi, bs);
if (s[i])
s[i] += bs;
else
s[++i] = bs;
}
if ((am = am[0]) === (bm = bm[0])) {
if (s[i])
s[i] += bm;
else
s[++i] = bm;
} else {
s[++i] = null;
q.push({ i, x: number_default2(am, bm) });
}
bi = reB.lastIndex;
}
if (bi < b.length) {
bs = b.slice(bi);
if (s[i])
s[i] += bs;
else
s[++i] = bs;
}
return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function(t) {
for (var i2 = 0, o; i2 < b; ++i2)
s[(o = q[i2]).i] = o.x(t);
return s.join("");
});
}
// node_modules/d3-interpolate/src/value.js
function value_default(a2, b) {
var t = typeof b, c3;
return b == null || t === "boolean" ? constant_default3(b) : (t === "number" ? number_default2 : t === "string" ? (c3 = color(b)) ? (b = c3, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default2)(a2, b);
}
// node_modules/d3-interpolate/src/round.js
function round_default(a2, b) {
return a2 = +a2, b = +b, function(t) {
return Math.round(a2 * (1 - t) + b * t);
};
}
// node_modules/d3-interpolate/src/transform/decompose.js
var degrees2 = 180 / Math.PI;
var identity = {
translateX: 0,
translateY: 0,
rotate: 0,
skewX: 0,
scaleX: 1,
scaleY: 1
};
function decompose_default(a2, b, c3, d, e, f) {
var scaleX, scaleY, skewX;
if (scaleX = Math.sqrt(a2 * a2 + b * b))
a2 /= scaleX, b /= scaleX;
if (skewX = a2 * c3 + b * d)
c3 -= a2 * skewX, d -= b * skewX;
if (scaleY = Math.sqrt(c3 * c3 + d * d))
c3 /= scaleY, d /= scaleY, skewX /= scaleY;
if (a2 * d < b * c3)
a2 = -a2, b = -b, skewX = -skewX, scaleX = -scaleX;
return {
translateX: e,
translateY: f,
rotate: Math.atan2(b, a2) * degrees2,
skewX: Math.atan(skewX) * degrees2,
scaleX,
scaleY
};
}
// node_modules/d3-interpolate/src/transform/parse.js
var svgNode;
function parseCss(value) {
const m2 = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");
return m2.isIdentity ? identity : decompose_default(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f);
}
function parseSvg(value) {
if (value == null)
return identity;
if (!svgNode)
svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
svgNode.setAttribute("transform", value);
if (!(value = svgNode.transform.baseVal.consolidate()))
return identity;
value = value.matrix;
return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f);
}
// node_modules/d3-interpolate/src/transform/index.js
function interpolateTransform(parse, pxComma, pxParen, degParen) {
function pop(s) {
return s.length ? s.pop() + " " : "";
}
function translate(xa, ya, xb, yb, s, q) {
if (xa !== xb || ya !== yb) {
var i = s.push("translate(", null, pxComma, null, pxParen);
q.push({ i: i - 4, x: number_default2(xa, xb) }, { i: i - 2, x: number_default2(ya, yb) });
} else if (xb || yb) {
s.push("translate(" + xb + pxComma + yb + pxParen);
}
}
function rotate(a2, b, s, q) {
if (a2 !== b) {
if (a2 - b > 180)
b += 360;
else if (b - a2 > 180)
a2 += 360;
q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default2(a2, b) });
} else if (b) {
s.push(pop(s) + "rotate(" + b + degParen);
}
}
function skewX(a2, b, s, q) {
if (a2 !== b) {
q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default2(a2, b) });
} else if (b) {
s.push(pop(s) + "skewX(" + b + degParen);
}
}
function scale(xa, ya, xb, yb, s, q) {
if (xa !== xb || ya !== yb) {
var i = s.push(pop(s) + "scale(", null, ",", null, ")");
q.push({ i: i - 4, x: number_default2(xa, xb) }, { i: i - 2, x: number_default2(ya, yb) });
} else if (xb !== 1 || yb !== 1) {
s.push(pop(s) + "scale(" + xb + "," + yb + ")");
}
}
return function(a2, b) {
var s = [], q = [];
a2 = parse(a2), b = parse(b);
translate(a2.translateX, a2.translateY, b.translateX, b.translateY, s, q);
rotate(a2.rotate, b.rotate, s, q);
skewX(a2.skewX, b.skewX, s, q);
scale(a2.scaleX, a2.scaleY, b.scaleX, b.scaleY, s, q);
a2 = b = null;
return function(t) {
var i = -1, n = q.length, o;
while (++i < n)
s[(o = q[i]).i] = o.x(t);
return s.join("");
};
};
}
var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
// node_modules/d3-interpolate/src/zoom.js
var epsilon2 = 1e-12;
function cosh(x4) {
return ((x4 = Math.exp(x4)) + 1 / x4) / 2;
}
function sinh(x4) {
return ((x4 = Math.exp(x4)) - 1 / x4) / 2;
}
function tanh(x4) {
return ((x4 = Math.exp(2 * x4)) - 1) / (x4 + 1);
}
var zoom_default = function zoomRho(rho, rho2, rho4) {
function zoom(p0, p1) {
var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;
if (d2 < epsilon2) {
S = Math.log(w1 / w0) / rho;
i = function(t) {
return [
ux0 + t * dx,
uy0 + t * dy,
w0 * Math.exp(rho * t * S)
];
};
} else {
var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
S = (r1 - r0) / rho;
i = function(t) {
var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
return [
ux0 + u * dx,
uy0 + u * dy,
w0 * coshr0 / cosh(rho * s + r0)
];
};
}
i.duration = S * 1e3 * rho / Math.SQRT2;
return i;
}
zoom.rho = function(_) {
var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;
return zoomRho(_1, _2, _4);
};
return zoom;
}(Math.SQRT2, 2, 4);
// node_modules/d3-interpolate/src/cubehelix.js
function cubehelix2(hue2) {
return function cubehelixGamma(y4) {
y4 = +y4;
function cubehelix3(start2, end) {
var h = hue2((start2 = cubehelix(start2)).h, (end = cubehelix(end)).h), s = nogamma(start2.s, end.s), l = nogamma(start2.l, end.l), opacity = nogamma(start2.opacity, end.opacity);
return function(t) {
start2.h = h(t);
start2.s = s(t);
start2.l = l(Math.pow(t, y4));
start2.opacity = opacity(t);
return start2 + "";
};
}
cubehelix3.gamma = cubehelixGamma;
return cubehelix3;
}(1);
}
var cubehelix_default = cubehelix2(hue);
var cubehelixLong = cubehelix2(nogamma);
// node_modules/d3-interpolate/src/quantize.js
function quantize_default(interpolator, n) {
var samples = new Array(n);
for (var i = 0; i < n; ++i)
samples[i] = interpolator(i / (n - 1));
return samples;
}
// node_modules/d3-timer/src/timer.js
var frame = 0;
var timeout = 0;
var interval = 0;
var pokeDelay = 1e3;
var taskHead;
var taskTail;
var clockLast = 0;
var clockNow = 0;
var clockSkew = 0;
var clock = typeof performance === "object" && performance.now ? performance : Date;
var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {
setTimeout(f, 17);
};
function now() {
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
}
function clearNow() {
clockNow = 0;
}
function Timer() {
this._call = this._time = this._next = null;
}
Timer.prototype = timer.prototype = {
constructor: Timer,
restart: function(callback, delay, time) {
if (typeof callback !== "function")
throw new TypeError("callback is not a function");
time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
if (!this._next && taskTail !== this) {
if (taskTail)
taskTail._next = this;
else
taskHead = this;
taskTail = this;
}
this._call = callback;
this._time = time;
sleep();
},
stop: function() {
if (this._call) {
this._call = null;
this._time = Infinity;
sleep();
}
}
};
function timer(callback, delay, time) {
var t = new Timer();
t.restart(callback, delay, time);
return t;
}
function timerFlush() {
now();
++frame;
var t = taskHead, e;
while (t) {
if ((e = clockNow - t._time) >= 0)
t._call.call(null, e);
t = t._next;
}
--frame;
}
function wake() {
clockNow = (clockLast = clock.now()) + clockSkew;
frame = timeout = 0;
try {
timerFlush();
} finally {
frame = 0;
nap();
clockNow = 0;
}
}
function poke() {
var now2 = clock.now(), delay = now2 - clockLast;
if (delay > pokeDelay)
clockSkew -= delay, clockLast = now2;
}
function nap() {
var t0, t1 = taskHead, t2, time = Infinity;
while (t1) {
if (t1._call) {
if (time > t1._time)
time = t1._time;
t0 = t1, t1 = t1._next;
} else {
t2 = t1._next, t1._next = null;
t1 = t0 ? t0._next = t2 : taskHead = t2;
}
}
taskTail = t0;
sleep(time);
}
function sleep(time) {
if (frame)
return;
if (timeout)
timeout = clearTimeout(timeout);
var delay = time - clockNow;
if (delay > 24) {
if (time < Infinity)
timeout = setTimeout(wake, time - clock.now() - clockSkew);
if (interval)
interval = clearInterval(interval);
} else {
if (!interval)
clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
frame = 1, setFrame(wake);
}
}
// node_modules/d3-timer/src/timeout.js
function timeout_default(callback, delay, time) {
var t = new Timer();
delay = delay == null ? 0 : +delay;
t.restart((elapsed) => {
t.stop();
callback(elapsed + delay);
}, delay, time);
return t;
}
// node_modules/d3-transition/src/transition/schedule.js
var emptyOn = dispatch_default("start", "end", "cancel", "interrupt");
var emptyTween = [];
var CREATED = 0;
var SCHEDULED = 1;
var STARTING = 2;
var STARTED = 3;
var RUNNING = 4;
var ENDING = 5;
var ENDED = 6;
function schedule_default(node, name, id2, index2, group, timing) {
var schedules = node.__transition;
if (!schedules)
node.__transition = {};
else if (id2 in schedules)
return;
create(node, id2, {
name,
index: index2,
group,
on: emptyOn,
tween: emptyTween,
time: timing.time,
delay: timing.delay,
duration: timing.duration,
ease: timing.ease,
timer: null,
state: CREATED
});
}
function init2(node, id2) {
var schedule = get2(node, id2);
if (schedule.state > CREATED)
throw new Error("too late; already scheduled");
return schedule;
}
function set2(node, id2) {
var schedule = get2(node, id2);
if (schedule.state > STARTED)
throw new Error("too late; already running");
return schedule;
}
function get2(node, id2) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id2]))
throw new Error("transition not found");
return schedule;
}
function create(node, id2, self2) {
var schedules = node.__transition, tween;
schedules[id2] = self2;
self2.timer = timer(schedule, 0, self2.time);
function schedule(elapsed) {
self2.state = SCHEDULED;
self2.timer.restart(start2, self2.delay, self2.time);
if (self2.delay <= elapsed)
start2(elapsed - self2.delay);
}
function start2(elapsed) {
var i, j, n, o;
if (self2.state !== SCHEDULED)
return stop();
for (i in schedules) {
o = schedules[i];
if (o.name !== self2.name)
continue;
if (o.state === STARTED)
return timeout_default(start2);
if (o.state === RUNNING) {
o.state = ENDED;
o.timer.stop();
o.on.call("interrupt", node, node.__data__, o.index, o.group);
delete schedules[i];
} else if (+i < id2) {
o.state = ENDED;
o.timer.stop();
o.on.call("cancel", node, node.__data__, o.index, o.group);
delete schedules[i];
}
}
timeout_default(function() {
if (self2.state === STARTED) {
self2.state = RUNNING;
self2.timer.restart(tick2, self2.delay, self2.time);
tick2(elapsed);
}
});
self2.state = STARTING;
self2.on.call("start", node, node.__data__, self2.index, self2.group);
if (self2.state !== STARTING)
return;
self2.state = STARTED;
tween = new Array(n = self2.tween.length);
for (i = 0, j = -1; i < n; ++i) {
if (o = self2.tween[i].value.call(node, node.__data__, self2.index, self2.group)) {
tween[++j] = o;
}
}
tween.length = j + 1;
}
function tick2(elapsed) {
var t = elapsed < self2.duration ? self2.ease.call(null, elapsed / self2.duration) : (self2.timer.restart(stop), self2.state = ENDING, 1), i = -1, n = tween.length;
while (++i < n) {
tween[i].call(node, t);
}
if (self2.state === ENDING) {
self2.on.call("end", node, node.__data__, self2.index, self2.group);
stop();
}
}
function stop() {
self2.state = ENDED;
self2.timer.stop();
delete schedules[id2];
for (var i in schedules)
return;
delete node.__transition;
}
}
// node_modules/d3-transition/src/interrupt.js
function interrupt_default(node, name) {
var schedules = node.__transition, schedule, active, empty3 = true, i;
if (!schedules)
return;
name = name == null ? null : name + "";
for (i in schedules) {
if ((schedule = schedules[i]).name !== name) {
empty3 = false;
continue;
}
active = schedule.state > STARTING && schedule.state < ENDING;
schedule.state = ENDED;
schedule.timer.stop();
schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
delete schedules[i];
}
if (empty3)
delete node.__transition;
}
// node_modules/d3-transition/src/selection/interrupt.js
function interrupt_default2(name) {
return this.each(function() {
interrupt_default(this, name);
});
}
// node_modules/d3-transition/src/transition/tween.js
function tweenRemove(id2, name) {
var tween0, tween1;
return function() {
var schedule = set2(this, id2), tween = schedule.tween;
if (tween !== tween0) {
tween1 = tween0 = tween;
for (var i = 0, n = tween1.length; i < n; ++i) {
if (tween1[i].name === name) {
tween1 = tween1.slice();
tween1.splice(i, 1);
break;
}
}
}
schedule.tween = tween1;
};
}
function tweenFunction(id2, name, value) {
var tween0, tween1;
if (typeof value !== "function")
throw new Error();
return function() {
var schedule = set2(this, id2), tween = schedule.tween;
if (tween !== tween0) {
tween1 = (tween0 = tween).slice();
for (var t = { name, value }, i = 0, n = tween1.length; i < n; ++i) {
if (tween1[i].name === name) {
tween1[i] = t;
break;
}
}
if (i === n)
tween1.push(t);
}
schedule.tween = tween1;
};
}
function tween_default(name, value) {
var id2 = this._id;
name += "";
if (arguments.length < 2) {
var tween = get2(this.node(), id2).tween;
for (var i = 0, n = tween.length, t; i < n; ++i) {
if ((t = tween[i]).name === name) {
return t.value;
}
}
return null;
}
return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value));
}
function tweenValue(transition2, name, value) {
var id2 = transition2._id;
transition2.each(function() {
var schedule = set2(this, id2);
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
});
return function(node) {
return get2(node, id2).value[name];
};
}
// node_modules/d3-transition/src/transition/interpolate.js
function interpolate_default(a2, b) {
var c3;
return (typeof b === "number" ? number_default2 : b instanceof color ? rgb_default : (c3 = color(b)) ? (b = c3, rgb_default) : string_default)(a2, b);
}
// node_modules/d3-transition/src/transition/attr.js
function attrRemove2(name) {
return function() {
this.removeAttribute(name);
};
}
function attrRemoveNS2(fullname) {
return function() {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
function attrConstant2(name, interpolate, value1) {
var string00, string1 = value1 + "", interpolate0;
return function() {
var string0 = this.getAttribute(name);
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
};
}
function attrConstantNS2(fullname, interpolate, value1) {
var string00, string1 = value1 + "", interpolate0;
return function() {
var string0 = this.getAttributeNS(fullname.space, fullname.local);
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
};
}
function attrFunction2(name, interpolate, value) {
var string00, string10, interpolate0;
return function() {
var string0, value1 = value(this), string1;
if (value1 == null)
return void this.removeAttribute(name);
string0 = this.getAttribute(name);
string1 = value1 + "";
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
};
}
function attrFunctionNS2(fullname, interpolate, value) {
var string00, string10, interpolate0;
return function() {
var string0, value1 = value(this), string1;
if (value1 == null)
return void this.removeAttributeNS(fullname.space, fullname.local);
string0 = this.getAttributeNS(fullname.space, fullname.local);
string1 = value1 + "";
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
};
}
function attr_default2(name, value) {
var fullname = namespace_default(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate_default;
return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i, value));
}
// node_modules/d3-transition/src/transition/attrTween.js
function attrInterpolate(name, i) {
return function(t) {
this.setAttribute(name, i.call(this, t));
};
}
function attrInterpolateNS(fullname, i) {
return function(t) {
this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));
};
}
function attrTweenNS(fullname, value) {
var t0, i0;
function tween() {
var i = value.apply(this, arguments);
if (i !== i0)
t0 = (i0 = i) && attrInterpolateNS(fullname, i);
return t0;
}
tween._value = value;
return tween;
}
function attrTween(name, value) {
var t0, i0;
function tween() {
var i = value.apply(this, arguments);
if (i !== i0)
t0 = (i0 = i) && attrInterpolate(name, i);
return t0;
}
tween._value = value;
return tween;
}
function attrTween_default(name, value) {
var key = "attr." + name;
if (arguments.length < 2)
return (key = this.tween(key)) && key._value;
if (value == null)
return this.tween(key, null);
if (typeof value !== "function")
throw new Error();
var fullname = namespace_default(name);
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
}
// node_modules/d3-transition/src/transition/delay.js
function delayFunction(id2, value) {
return function() {
init2(this, id2).delay = +value.apply(this, arguments);
};
}
function delayConstant(id2, value) {
return value = +value, function() {
init2(this, id2).delay = value;
};
}
function delay_default(value) {
var id2 = this._id;
return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay;
}
// node_modules/d3-transition/src/transition/duration.js
function durationFunction(id2, value) {
return function() {
set2(this, id2).duration = +value.apply(this, arguments);
};
}
function durationConstant(id2, value) {
return value = +value, function() {
set2(this, id2).duration = value;
};
}
function duration_default(value) {
var id2 = this._id;
return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration;
}
// node_modules/d3-transition/src/transition/ease.js
function easeConstant(id2, value) {
if (typeof value !== "function")
throw new Error();
return function() {
set2(this, id2).ease = value;
};
}
function ease_default(value) {
var id2 = this._id;
return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease;
}
// node_modules/d3-transition/src/transition/easeVarying.js
function easeVarying(id2, value) {
return function() {
var v = value.apply(this, arguments);
if (typeof v !== "function")
throw new Error();
set2(this, id2).ease = v;
};
}
function easeVarying_default(value) {
if (typeof value !== "function")
throw new Error();
return this.each(easeVarying(this._id, value));
}
// node_modules/d3-transition/src/transition/filter.js
function filter_default2(match) {
if (typeof match !== "function")
match = matcher_default(match);
for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
subgroup.push(node);
}
}
}
return new Transition(subgroups, this._parents, this._name, this._id);
}
// node_modules/d3-transition/src/transition/merge.js
function merge_default2(transition2) {
if (transition2._id !== this._id)
throw new Error();
for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group0[i] || group1[i]) {
merge[i] = node;
}
}
}
for (; j < m0; ++j) {
merges[j] = groups0[j];
}
return new Transition(merges, this._parents, this._name, this._id);
}
// node_modules/d3-transition/src/transition/on.js
function start(name) {
return (name + "").trim().split(/^|\s+/).every(function(t) {
var i = t.indexOf(".");
if (i >= 0)
t = t.slice(0, i);
return !t || t === "start";
});
}
function onFunction(id2, name, listener) {
var on0, on1, sit = start(name) ? init2 : set2;
return function() {
var schedule = sit(this, id2), on = schedule.on;
if (on !== on0)
(on1 = (on0 = on).copy()).on(name, listener);
schedule.on = on1;
};
}
function on_default2(name, listener) {
var id2 = this._id;
return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener));
}
// node_modules/d3-transition/src/transition/remove.js
function removeFunction(id2) {
return function() {
var parent = this.parentNode;
for (var i in this.__transition)
if (+i !== id2)
return;
if (parent)
parent.removeChild(this);
};
}
function remove_default2() {
return this.on("end.remove", removeFunction(this._id));
}
// node_modules/d3-transition/src/transition/select.js
function select_default3(select) {
var name = this._name, id2 = this._id;
if (typeof select !== "function")
select = selector_default(select);
for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node)
subnode.__data__ = node.__data__;
subgroup[i] = subnode;
schedule_default(subgroup[i], name, id2, i, subgroup, get2(node, id2));
}
}
}
return new Transition(subgroups, this._parents, name, id2);
}
// node_modules/d3-transition/src/transition/selectAll.js
function selectAll_default2(select) {
var name = this._name, id2 = this._id;
if (typeof select !== "function")
select = selectorAll_default(select);
for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
for (var children3 = select.call(node, node.__data__, i, group), child, inherit2 = get2(node, id2), k = 0, l = children3.length; k < l; ++k) {
if (child = children3[k]) {
schedule_default(child, name, id2, k, children3, inherit2);
}
}
subgroups.push(children3);
parents.push(node);
}
}
}
return new Transition(subgroups, parents, name, id2);
}
// node_modules/d3-transition/src/transition/selection.js
var Selection2 = selection_default.prototype.constructor;
function selection_default2() {
return new Selection2(this._groups, this._parents);
}
// node_modules/d3-transition/src/transition/style.js
function styleNull(name, interpolate) {
var string00, string10, interpolate0;
return function() {
var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name));
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1);
};
}
function styleRemove2(name) {
return function() {
this.style.removeProperty(name);
};
}
function styleConstant2(name, interpolate, value1) {
var string00, string1 = value1 + "", interpolate0;
return function() {
var string0 = styleValue(this, name);
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
};
}
function styleFunction2(name, interpolate, value) {
var string00, string10, interpolate0;
return function() {
var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + "";
if (value1 == null)
string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
};
}
function styleMaybeRemove(id2, name) {
var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2;
return function() {
var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0;
if (on !== on0 || listener0 !== listener)
(on1 = (on0 = on).copy()).on(event, listener0 = listener);
schedule.on = on1;
};
}
function style_default2(name, value, priority) {
var i = (name += "") === "transform" ? interpolateTransformCss : interpolate_default;
return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i, value), priority).on("end.style." + name, null);
}
// node_modules/d3-transition/src/transition/styleTween.js
function styleInterpolate(name, i, priority) {
return function(t) {
this.style.setProperty(name, i.call(this, t), priority);
};
}
function styleTween(name, value, priority) {
var t, i0;
function tween() {
var i = value.apply(this, arguments);
if (i !== i0)
t = (i0 = i) && styleInterpolate(name, i, priority);
return t;
}
tween._value = value;
return tween;
}
function styleTween_default(name, value, priority) {
var key = "style." + (name += "");
if (arguments.length < 2)
return (key = this.tween(key)) && key._value;
if (value == null)
return this.tween(key, null);
if (typeof value !== "function")
throw new Error();
return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
}
// node_modules/d3-transition/src/transition/text.js
function textConstant2(value) {
return function() {
this.textContent = value;
};
}
function textFunction2(value) {
return function() {
var value1 = value(this);
this.textContent = value1 == null ? "" : value1;
};
}
function text_default2(value) {
return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + ""));
}
// node_modules/d3-transition/src/transition/textTween.js
function textInterpolate(i) {
return function(t) {
this.textContent = i.call(this, t);
};
}
function textTween(value) {
var t0, i0;
function tween() {
var i = value.apply(this, arguments);
if (i !== i0)
t0 = (i0 = i) && textInterpolate(i);
return t0;
}
tween._value = value;
return tween;
}
function textTween_default(value) {
var key = "text";
if (arguments.length < 1)
return (key = this.tween(key)) && key._value;
if (value == null)
return this.tween(key, null);
if (typeof value !== "function")
throw new Error();
return this.tween(key, textTween(value));
}
// node_modules/d3-transition/src/transition/transition.js
function transition_default() {
var name = this._name, id0 = this._id, id1 = newId();
for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
var inherit2 = get2(node, id0);
schedule_default(node, name, id1, i, group, {
time: inherit2.time + inherit2.delay + inherit2.duration,
delay: 0,
duration: inherit2.duration,
ease: inherit2.ease
});
}
}
}
return new Transition(groups, this._parents, name, id1);
}
// node_modules/d3-transition/src/transition/end.js
function end_default() {
var on0, on1, that = this, id2 = that._id, size = that.size();
return new Promise(function(resolve, reject) {
var cancel = { value: reject }, end = { value: function() {
if (--size === 0)
resolve();
} };
that.each(function() {
var schedule = set2(this, id2), on = schedule.on;
if (on !== on0) {
on1 = (on0 = on).copy();
on1._.cancel.push(cancel);
on1._.interrupt.push(cancel);
on1._.end.push(end);
}
schedule.on = on1;
});
if (size === 0)
resolve();
});
}
// node_modules/d3-transition/src/transition/index.js
var id = 0;
function Transition(groups, parents, name, id2) {
this._groups = groups;
this._parents = parents;
this._name = name;
this._id = id2;
}
function transition(name) {
return selection_default().transition(name);
}
function newId() {
return ++id;
}
var selection_prototype = selection_default.prototype;
Transition.prototype = transition.prototype = {
constructor: Transition,
select: select_default3,
selectAll: selectAll_default2,
filter: filter_default2,
merge: merge_default2,
selection: selection_default2,
transition: transition_default,
call: selection_prototype.call,
nodes: selection_prototype.nodes,
node: selection_prototype.node,
size: selection_prototype.size,
empty: selection_prototype.empty,
each: selection_prototype.each,
on: on_default2,
attr: attr_default2,
attrTween: attrTween_default,
style: style_default2,
styleTween: styleTween_default,
text: text_default2,
textTween: textTween_default,
remove: remove_default2,
tween: tween_default,
delay: delay_default,
duration: duration_default,
ease: ease_default,
easeVarying: easeVarying_default,
end: end_default,
[Symbol.iterator]: selection_prototype[Symbol.iterator]
};
// node_modules/d3-ease/src/cubic.js
function cubicInOut(t) {
return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
}
// node_modules/d3-transition/src/selection/transition.js
var defaultTiming = {
time: null,
delay: 0,
duration: 250,
ease: cubicInOut
};
function inherit(node, id2) {
var timing;
while (!(timing = node.__transition) || !(timing = timing[id2])) {
if (!(node = node.parentNode)) {
throw new Error(`transition ${id2} not found`);
}
}
return timing;
}
function transition_default2(name) {
var id2, timing;
if (name instanceof Transition) {
id2 = name._id, name = name._name;
} else {
id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
}
for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
schedule_default(node, name, id2, i, group, timing || inherit(node, id2));
}
}
}
return new Transition(groups, this._parents, name, id2);
}
// node_modules/d3-transition/src/selection/index.js
selection_default.prototype.interrupt = interrupt_default2;
selection_default.prototype.transition = transition_default2;
// node_modules/d3-brush/src/brush.js
var { abs, max: max2, min } = Math;
function number1(e) {
return [+e[0], +e[1]];
}
function number2(e) {
return [number1(e[0]), number1(e[1])];
}
var X = {
name: "x",
handles: ["w", "e"].map(type),
input: function(x4, e) {
return x4 == null ? null : [[+x4[0], e[0][1]], [+x4[1], e[1][1]]];
},
output: function(xy) {
return xy && [xy[0][0], xy[1][0]];
}
};
var Y = {
name: "y",
handles: ["n", "s"].map(type),
input: function(y4, e) {
return y4 == null ? null : [[e[0][0], +y4[0]], [e[1][0], +y4[1]]];
},
output: function(xy) {
return xy && [xy[0][1], xy[1][1]];
}
};
var XY = {
name: "xy",
handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type),
input: function(xy) {
return xy == null ? null : number2(xy);
},
output: function(xy) {
return xy;
}
};
function type(t) {
return { type: t };
}
// node_modules/d3-path/src/path.js
var pi = Math.PI;
var tau = 2 * pi;
var epsilon = 1e-6;
var tauEpsilon = tau - epsilon;
function Path() {
this._x0 = this._y0 = this._x1 = this._y1 = null;
this._ = "";
}
function path() {
return new Path();
}
Path.prototype = path.prototype = {
constructor: Path,
moveTo: function(x4, y4) {
this._ += "M" + (this._x0 = this._x1 = +x4) + "," + (this._y0 = this._y1 = +y4);
},
closePath: function() {
if (this._x1 !== null) {
this._x1 = this._x0, this._y1 = this._y0;
this._ += "Z";
}
},
lineTo: function(x4, y4) {
this._ += "L" + (this._x1 = +x4) + "," + (this._y1 = +y4);
},
quadraticCurveTo: function(x1, y1, x4, y4) {
this._ += "Q" + +x1 + "," + +y1 + "," + (this._x1 = +x4) + "," + (this._y1 = +y4);
},
bezierCurveTo: function(x1, y1, x22, y22, x4, y4) {
this._ += "C" + +x1 + "," + +y1 + "," + +x22 + "," + +y22 + "," + (this._x1 = +x4) + "," + (this._y1 = +y4);
},
arcTo: function(x1, y1, x22, y22, r) {
x1 = +x1, y1 = +y1, x22 = +x22, y22 = +y22, r = +r;
var x0 = this._x1, y0 = this._y1, x21 = x22 - x1, y21 = y22 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;
if (r < 0)
throw new Error("negative radius: " + r);
if (this._x1 === null) {
this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
} else if (!(l01_2 > epsilon))
;
else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {
this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
} else {
var x20 = x22 - x0, y20 = y22 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;
if (Math.abs(t01 - 1) > epsilon) {
this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
}
this._ += "A" + r + "," + r + ",0,0," + +(y01 * x20 > x01 * y20) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
}
},
arc: function(x4, y4, r, a0, a1, ccw) {
x4 = +x4, y4 = +y4, r = +r, ccw = !!ccw;
var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x4 + dx, y0 = y4 + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;
if (r < 0)
throw new Error("negative radius: " + r);
if (this._x1 === null) {
this._ += "M" + x0 + "," + y0;
} else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
this._ += "L" + x0 + "," + y0;
}
if (!r)
return;
if (da < 0)
da = da % tau + tau;
if (da > tauEpsilon) {
this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x4 - dx) + "," + (y4 - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
} else if (da > epsilon) {
this._ += "A" + r + "," + r + ",0," + +(da >= pi) + "," + cw + "," + (this._x1 = x4 + r * Math.cos(a1)) + "," + (this._y1 = y4 + r * Math.sin(a1));
}
},
rect: function(x4, y4, w, h) {
this._ += "M" + (this._x0 = this._x1 = +x4) + "," + (this._y0 = this._y1 = +y4) + "h" + +w + "v" + +h + "h" + -w + "Z";
},
toString: function() {
return this._;
}
};
var path_default = path;
// node_modules/d3-force/src/center.js
function center_default(x4, y4) {
var nodes, strength = 1;
if (x4 == null)
x4 = 0;
if (y4 == null)
y4 = 0;
function force() {
var i, n = nodes.length, node, sx = 0, sy = 0;
for (i = 0; i < n; ++i) {
node = nodes[i], sx += node.x, sy += node.y;
}
for (sx = (sx / n - x4) * strength, sy = (sy / n - y4) * strength, i = 0; i < n; ++i) {
node = nodes[i], node.x -= sx, node.y -= sy;
}
}
force.initialize = function(_) {
nodes = _;
};
force.x = function(_) {
return arguments.length ? (x4 = +_, force) : x4;
};
force.y = function(_) {
return arguments.length ? (y4 = +_, force) : y4;
};
force.strength = function(_) {
return arguments.length ? (strength = +_, force) : strength;
};
return force;
}
// node_modules/d3-quadtree/src/add.js
function add_default(d) {
const x4 = +this._x.call(null, d), y4 = +this._y.call(null, d);
return add(this.cover(x4, y4), x4, y4, d);
}
function add(tree, x4, y4, d) {
if (isNaN(x4) || isNaN(y4))
return tree;
var parent, node = tree._root, leaf = { data: d }, x0 = tree._x0, y0 = tree._y0, x1 = tree._x1, y1 = tree._y1, xm, ym, xp, yp, right, bottom, i, j;
if (!node)
return tree._root = leaf, tree;
while (node.length) {
if (right = x4 >= (xm = (x0 + x1) / 2))
x0 = xm;
else
x1 = xm;
if (bottom = y4 >= (ym = (y0 + y1) / 2))
y0 = ym;
else
y1 = ym;
if (parent = node, !(node = node[i = bottom << 1 | right]))
return parent[i] = leaf, tree;
}
xp = +tree._x.call(null, node.data);
yp = +tree._y.call(null, node.data);
if (x4 === xp && y4 === yp)
return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
do {
parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
if (right = x4 >= (xm = (x0 + x1) / 2))
x0 = xm;
else
x1 = xm;
if (bottom = y4 >= (ym = (y0 + y1) / 2))
y0 = ym;
else
y1 = ym;
} while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));
return parent[j] = node, parent[i] = leaf, tree;
}
function addAll(data) {
var d, i, n = data.length, x4, y4, xz = new Array(n), yz = new Array(n), x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;
for (i = 0; i < n; ++i) {
if (isNaN(x4 = +this._x.call(null, d = data[i])) || isNaN(y4 = +this._y.call(null, d)))
continue;
xz[i] = x4;
yz[i] = y4;
if (x4 < x0)
x0 = x4;
if (x4 > x1)
x1 = x4;
if (y4 < y0)
y0 = y4;
if (y4 > y1)
y1 = y4;
}
if (x0 > x1 || y0 > y1)
return this;
this.cover(x0, y0).cover(x1, y1);
for (i = 0; i < n; ++i) {
add(this, xz[i], yz[i], data[i]);
}
return this;
}
// node_modules/d3-quadtree/src/cover.js
function cover_default(x4, y4) {
if (isNaN(x4 = +x4) || isNaN(y4 = +y4))
return this;
var x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1;
if (isNaN(x0)) {
x1 = (x0 = Math.floor(x4)) + 1;
y1 = (y0 = Math.floor(y4)) + 1;
} else {
var z = x1 - x0 || 1, node = this._root, parent, i;
while (x0 > x4 || x4 >= x1 || y0 > y4 || y4 >= y1) {
i = (y4 < y0) << 1 | x4 < x0;
parent = new Array(4), parent[i] = node, node = parent, z *= 2;
switch (i) {
case 0:
x1 = x0 + z, y1 = y0 + z;
break;
case 1:
x0 = x1 - z, y1 = y0 + z;
break;
case 2:
x1 = x0 + z, y0 = y1 - z;
break;
case 3:
x0 = x1 - z, y0 = y1 - z;
break;
}
}
if (this._root && this._root.length)
this._root = node;
}
this._x0 = x0;
this._y0 = y0;
this._x1 = x1;
this._y1 = y1;
return this;
}
// node_modules/d3-quadtree/src/data.js
function data_default2() {
var data = [];
this.visit(function(node) {
if (!node.length)
do
data.push(node.data);
while (node = node.next);
});
return data;
}
// node_modules/d3-quadtree/src/extent.js
function extent_default(_) {
return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]];
}
// node_modules/d3-quadtree/src/quad.js
function quad_default(node, x0, y0, x1, y1) {
this.node = node;
this.x0 = x0;
this.y0 = y0;
this.x1 = x1;
this.y1 = y1;
}
// node_modules/d3-quadtree/src/find.js
function find_default(x4, y4, radius) {
var data, x0 = this._x0, y0 = this._y0, x1, y1, x22, y22, x32 = this._x1, y32 = this._y1, quads = [], node = this._root, q, i;
if (node)
quads.push(new quad_default(node, x0, y0, x32, y32));
if (radius == null)
radius = Infinity;
else {
x0 = x4 - radius, y0 = y4 - radius;
x32 = x4 + radius, y32 = y4 + radius;
radius *= radius;
}
while (q = quads.pop()) {
if (!(node = q.node) || (x1 = q.x0) > x32 || (y1 = q.y0) > y32 || (x22 = q.x1) < x0 || (y22 = q.y1) < y0)
continue;
if (node.length) {
var xm = (x1 + x22) / 2, ym = (y1 + y22) / 2;
quads.push(new quad_default(node[3], xm, ym, x22, y22), new quad_default(node[2], x1, ym, xm, y22), new quad_default(node[1], xm, y1, x22, ym), new quad_default(node[0], x1, y1, xm, ym));
if (i = (y4 >= ym) << 1 | x4 >= xm) {
q = quads[quads.length - 1];
quads[quads.length - 1] = quads[quads.length - 1 - i];
quads[quads.length - 1 - i] = q;
}
} else {
var dx = x4 - +this._x.call(null, node.data), dy = y4 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;
if (d2 < radius) {
var d = Math.sqrt(radius = d2);
x0 = x4 - d, y0 = y4 - d;
x32 = x4 + d, y32 = y4 + d;
data = node.data;
}
}
}
return data;
}
// node_modules/d3-quadtree/src/remove.js
function remove_default3(d) {
if (isNaN(x4 = +this._x.call(null, d)) || isNaN(y4 = +this._y.call(null, d)))
return this;
var parent, node = this._root, retainer, previous, next, x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1, x4, y4, xm, ym, right, bottom, i, j;
if (!node)
return this;
if (node.length)
while (true) {
if (right = x4 >= (xm = (x0 + x1) / 2))
x0 = xm;
else
x1 = xm;
if (bottom = y4 >= (ym = (y0 + y1) / 2))
y0 = ym;
else
y1 = ym;
if (!(parent = node, node = node[i = bottom << 1 | right]))
return this;
if (!node.length)
break;
if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3])
retainer = parent, j = i;
}
while (node.data !== d)
if (!(previous = node, node = node.next))
return this;
if (next = node.next)
delete node.next;
if (previous)
return next ? previous.next = next : delete previous.next, this;
if (!parent)
return this._root = next, this;
next ? parent[i] = next : delete parent[i];
if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {
if (retainer)
retainer[j] = node;
else
this._root = node;
}
return this;
}
function removeAll(data) {
for (var i = 0, n = data.length; i < n; ++i)
this.remove(data[i]);
return this;
}
// node_modules/d3-quadtree/src/root.js
function root_default() {
return this._root;
}
// node_modules/d3-quadtree/src/size.js
function size_default2() {
var size = 0;
this.visit(function(node) {
if (!node.length)
do
++size;
while (node = node.next);
});
return size;
}
// node_modules/d3-quadtree/src/visit.js
function visit_default(callback) {
var quads = [], q, node = this._root, child, x0, y0, x1, y1;
if (node)
quads.push(new quad_default(node, this._x0, this._y0, this._x1, this._y1));
while (q = quads.pop()) {
if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
if (child = node[3])
quads.push(new quad_default(child, xm, ym, x1, y1));
if (child = node[2])
quads.push(new quad_default(child, x0, ym, xm, y1));
if (child = node[1])
quads.push(new quad_default(child, xm, y0, x1, ym));
if (child = node[0])
quads.push(new quad_default(child, x0, y0, xm, ym));
}
}
return this;
}
// node_modules/d3-quadtree/src/visitAfter.js
function visitAfter_default(callback) {
var quads = [], next = [], q;
if (this._root)
quads.push(new quad_default(this._root, this._x0, this._y0, this._x1, this._y1));
while (q = quads.pop()) {
var node = q.node;
if (node.length) {
var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
if (child = node[0])
quads.push(new quad_default(child, x0, y0, xm, ym));
if (child = node[1])
quads.push(new quad_default(child, xm, y0, x1, ym));
if (child = node[2])
quads.push(new quad_default(child, x0, ym, xm, y1));
if (child = node[3])
quads.push(new quad_default(child, xm, ym, x1, y1));
}
next.push(q);
}
while (q = next.pop()) {
callback(q.node, q.x0, q.y0, q.x1, q.y1);
}
return this;
}
// node_modules/d3-quadtree/src/x.js
function defaultX(d) {
return d[0];
}
function x_default(_) {
return arguments.length ? (this._x = _, this) : this._x;
}
// node_modules/d3-quadtree/src/y.js
function defaultY(d) {
return d[1];
}
function y_default(_) {
return arguments.length ? (this._y = _, this) : this._y;
}
// node_modules/d3-quadtree/src/quadtree.js
function quadtree(nodes, x4, y4) {
var tree = new Quadtree(x4 == null ? defaultX : x4, y4 == null ? defaultY : y4, NaN, NaN, NaN, NaN);
return nodes == null ? tree : tree.addAll(nodes);
}
function Quadtree(x4, y4, x0, y0, x1, y1) {
this._x = x4;
this._y = y4;
this._x0 = x0;
this._y0 = y0;
this._x1 = x1;
this._y1 = y1;
this._root = void 0;
}
function leaf_copy(leaf) {
var copy3 = { data: leaf.data }, next = copy3;
while (leaf = leaf.next)
next = next.next = { data: leaf.data };
return copy3;
}
var treeProto = quadtree.prototype = Quadtree.prototype;
treeProto.copy = function() {
var copy3 = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child;
if (!node)
return copy3;
if (!node.length)
return copy3._root = leaf_copy(node), copy3;
nodes = [{ source: node, target: copy3._root = new Array(4) }];
while (node = nodes.pop()) {
for (var i = 0; i < 4; ++i) {
if (child = node.source[i]) {
if (child.length)
nodes.push({ source: child, target: node.target[i] = new Array(4) });
else
node.target[i] = leaf_copy(child);
}
}
}
return copy3;
};
treeProto.add = add_default;
treeProto.addAll = addAll;
treeProto.cover = cover_default;
treeProto.data = data_default2;
treeProto.extent = extent_default;
treeProto.find = find_default;
treeProto.remove = remove_default3;
treeProto.removeAll = removeAll;
treeProto.root = root_default;
treeProto.size = size_default2;
treeProto.visit = visit_default;
treeProto.visitAfter = visitAfter_default;
treeProto.x = x_default;
treeProto.y = y_default;
// node_modules/d3-force/src/constant.js
function constant_default5(x4) {
return function() {
return x4;
};
}
// node_modules/d3-force/src/jiggle.js
function jiggle_default(random) {
return (random() - 0.5) * 1e-6;
}
// node_modules/d3-force/src/collide.js
function x(d) {
return d.x + d.vx;
}
function y(d) {
return d.y + d.vy;
}
function collide_default(radius) {
var nodes, radii, random, strength = 1, iterations = 1;
if (typeof radius !== "function")
radius = constant_default5(radius == null ? 1 : +radius);
function force() {
var i, n = nodes.length, tree, node, xi, yi, ri, ri2;
for (var k = 0; k < iterations; ++k) {
tree = quadtree(nodes, x, y).visitAfter(prepare);
for (i = 0; i < n; ++i) {
node = nodes[i];
ri = radii[node.index], ri2 = ri * ri;
xi = node.x + node.vx;
yi = node.y + node.vy;
tree.visit(apply);
}
}
function apply(quad, x0, y0, x1, y1) {
var data = quad.data, rj = quad.r, r = ri + rj;
if (data) {
if (data.index > node.index) {
var x4 = xi - data.x - data.vx, y4 = yi - data.y - data.vy, l = x4 * x4 + y4 * y4;
if (l < r * r) {
if (x4 === 0)
x4 = jiggle_default(random), l += x4 * x4;
if (y4 === 0)
y4 = jiggle_default(random), l += y4 * y4;
l = (r - (l = Math.sqrt(l))) / l * strength;
node.vx += (x4 *= l) * (r = (rj *= rj) / (ri2 + rj));
node.vy += (y4 *= l) * r;
data.vx -= x4 * (r = 1 - r);
data.vy -= y4 * r;
}
}
return;
}
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
}
}
function prepare(quad) {
if (quad.data)
return quad.r = radii[quad.data.index];
for (var i = quad.r = 0; i < 4; ++i) {
if (quad[i] && quad[i].r > quad.r) {
quad.r = quad[i].r;
}
}
}
function initialize() {
if (!nodes)
return;
var i, n = nodes.length, node;
radii = new Array(n);
for (i = 0; i < n; ++i)
node = nodes[i], radii[node.index] = +radius(node, i, nodes);
}
force.initialize = function(_nodes, _random) {
nodes = _nodes;
random = _random;
initialize();
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = +_, force) : strength;
};
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : radius;
};
return force;
}
// node_modules/d3-force/src/link.js
function index(d) {
return d.index;
}
function find2(nodeById, nodeId) {
var node = nodeById.get(nodeId);
if (!node)
throw new Error("node not found: " + nodeId);
return node;
}
function link_default(links) {
var id2 = index, strength = defaultStrength, strengths, distance = constant_default5(30), distances, nodes, count2, bias, random, iterations = 1;
if (links == null)
links = [];
function defaultStrength(link2) {
return 1 / Math.min(count2[link2.source.index], count2[link2.target.index]);
}
function force(alpha) {
for (var k = 0, n = links.length; k < iterations; ++k) {
for (var i = 0, link2, source, target, x4, y4, l, b; i < n; ++i) {
link2 = links[i], source = link2.source, target = link2.target;
x4 = target.x + target.vx - source.x - source.vx || jiggle_default(random);
y4 = target.y + target.vy - source.y - source.vy || jiggle_default(random);
l = Math.sqrt(x4 * x4 + y4 * y4);
l = (l - distances[i]) / l * alpha * strengths[i];
x4 *= l, y4 *= l;
target.vx -= x4 * (b = bias[i]);
target.vy -= y4 * b;
source.vx += x4 * (b = 1 - b);
source.vy += y4 * b;
}
}
}
function initialize() {
if (!nodes)
return;
var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d, i2) => [id2(d, i2, nodes), d])), link2;
for (i = 0, count2 = new Array(n); i < m2; ++i) {
link2 = links[i], link2.index = i;
if (typeof link2.source !== "object")
link2.source = find2(nodeById, link2.source);
if (typeof link2.target !== "object")
link2.target = find2(nodeById, link2.target);
count2[link2.source.index] = (count2[link2.source.index] || 0) + 1;
count2[link2.target.index] = (count2[link2.target.index] || 0) + 1;
}
for (i = 0, bias = new Array(m2); i < m2; ++i) {
link2 = links[i], bias[i] = count2[link2.source.index] / (count2[link2.source.index] + count2[link2.target.index]);
}
strengths = new Array(m2), initializeStrength();
distances = new Array(m2), initializeDistance();
}
function initializeStrength() {
if (!nodes)
return;
for (var i = 0, n = links.length; i < n; ++i) {
strengths[i] = +strength(links[i], i, links);
}
}
function initializeDistance() {
if (!nodes)
return;
for (var i = 0, n = links.length; i < n; ++i) {
distances[i] = +distance(links[i], i, links);
}
}
force.initialize = function(_nodes, _random) {
nodes = _nodes;
random = _random;
initialize();
};
force.links = function(_) {
return arguments.length ? (links = _, initialize(), force) : links;
};
force.id = function(_) {
return arguments.length ? (id2 = _, force) : id2;
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initializeStrength(), force) : strength;
};
force.distance = function(_) {
return arguments.length ? (distance = typeof _ === "function" ? _ : constant_default5(+_), initializeDistance(), force) : distance;
};
return force;
}
// node_modules/d3-force/src/lcg.js
var a = 1664525;
var c = 1013904223;
var m = 4294967296;
function lcg_default() {
let s = 1;
return () => (s = (a * s + c) % m) / m;
}
// node_modules/d3-force/src/simulation.js
function x2(d) {
return d.x;
}
function y2(d) {
return d.y;
}
var initialRadius = 10;
var initialAngle = Math.PI * (3 - Math.sqrt(5));
function simulation_default(nodes) {
var simulation, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer(step), event = dispatch_default("tick", "end"), random = lcg_default();
if (nodes == null)
nodes = [];
function step() {
tick2();
event.call("tick", simulation);
if (alpha < alphaMin) {
stepper.stop();
event.call("end", simulation);
}
}
function tick2(iterations) {
var i, n = nodes.length, node;
if (iterations === void 0)
iterations = 1;
for (var k = 0; k < iterations; ++k) {
alpha += (alphaTarget - alpha) * alphaDecay;
forces.forEach(function(force) {
force(alpha);
});
for (i = 0; i < n; ++i) {
node = nodes[i];
if (node.fx == null)
node.x += node.vx *= velocityDecay;
else
node.x = node.fx, node.vx = 0;
if (node.fy == null)
node.y += node.vy *= velocityDecay;
else
node.y = node.fy, node.vy = 0;
}
}
return simulation;
}
function initializeNodes() {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.index = i;
if (node.fx != null)
node.x = node.fx;
if (node.fy != null)
node.y = node.fy;
if (isNaN(node.x) || isNaN(node.y)) {
var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle;
node.x = radius * Math.cos(angle);
node.y = radius * Math.sin(angle);
}
if (isNaN(node.vx) || isNaN(node.vy)) {
node.vx = node.vy = 0;
}
}
}
function initializeForce(force) {
if (force.initialize)
force.initialize(nodes, random);
return force;
}
initializeNodes();
return simulation = {
tick: tick2,
restart: function() {
return stepper.restart(step), simulation;
},
stop: function() {
return stepper.stop(), simulation;
},
nodes: function(_) {
return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;
},
alpha: function(_) {
return arguments.length ? (alpha = +_, simulation) : alpha;
},
alphaMin: function(_) {
return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
},
alphaDecay: function(_) {
return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
},
alphaTarget: function(_) {
return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
},
velocityDecay: function(_) {
return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
},
randomSource: function(_) {
return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;
},
force: function(name, _) {
return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name);
},
find: function(x4, y4, radius) {
var i = 0, n = nodes.length, dx, dy, d2, node, closest;
if (radius == null)
radius = Infinity;
else
radius *= radius;
for (i = 0; i < n; ++i) {
node = nodes[i];
dx = x4 - node.x;
dy = y4 - node.y;
d2 = dx * dx + dy * dy;
if (d2 < radius)
closest = node, radius = d2;
}
return closest;
},
on: function(name, _) {
return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
}
};
}
// node_modules/d3-force/src/manyBody.js
function manyBody_default() {
var nodes, node, random, alpha, strength = constant_default5(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81;
function force(_) {
var i, n = nodes.length, tree = quadtree(nodes, x2, y2).visitAfter(accumulate);
for (alpha = _, i = 0; i < n; ++i)
node = nodes[i], tree.visit(apply);
}
function initialize() {
if (!nodes)
return;
var i, n = nodes.length, node2;
strengths = new Array(n);
for (i = 0; i < n; ++i)
node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes);
}
function accumulate(quad) {
var strength2 = 0, q, c3, weight = 0, x4, y4, i;
if (quad.length) {
for (x4 = y4 = i = 0; i < 4; ++i) {
if ((q = quad[i]) && (c3 = Math.abs(q.value))) {
strength2 += q.value, weight += c3, x4 += c3 * q.x, y4 += c3 * q.y;
}
}
quad.x = x4 / weight;
quad.y = y4 / weight;
} else {
q = quad;
q.x = q.data.x;
q.y = q.data.y;
do
strength2 += strengths[q.data.index];
while (q = q.next);
}
quad.value = strength2;
}
function apply(quad, x1, _, x22) {
if (!quad.value)
return true;
var x4 = quad.x - node.x, y4 = quad.y - node.y, w = x22 - x1, l = x4 * x4 + y4 * y4;
if (w * w / theta2 < l) {
if (l < distanceMax2) {
if (x4 === 0)
x4 = jiggle_default(random), l += x4 * x4;
if (y4 === 0)
y4 = jiggle_default(random), l += y4 * y4;
if (l < distanceMin2)
l = Math.sqrt(distanceMin2 * l);
node.vx += x4 * quad.value * alpha / l;
node.vy += y4 * quad.value * alpha / l;
}
return true;
} else if (quad.length || l >= distanceMax2)
return;
if (quad.data !== node || quad.next) {
if (x4 === 0)
x4 = jiggle_default(random), l += x4 * x4;
if (y4 === 0)
y4 = jiggle_default(random), l += y4 * y4;
if (l < distanceMin2)
l = Math.sqrt(distanceMin2 * l);
}
do
if (quad.data !== node) {
w = strengths[quad.data.index] * alpha / l;
node.vx += x4 * w;
node.vy += y4 * w;
}
while (quad = quad.next);
}
force.initialize = function(_nodes, _random) {
nodes = _nodes;
random = _random;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : strength;
};
force.distanceMin = function(_) {
return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
};
force.distanceMax = function(_) {
return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
};
force.theta = function(_) {
return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
};
return force;
}
// node_modules/d3-format/src/formatDecimal.js
function formatDecimal_default(x4) {
return Math.abs(x4 = Math.round(x4)) >= 1e21 ? x4.toLocaleString("en").replace(/,/g, "") : x4.toString(10);
}
function formatDecimalParts(x4, p) {
if ((i = (x4 = p ? x4.toExponential(p - 1) : x4.toExponential()).indexOf("e")) < 0)
return null;
var i, coefficient = x4.slice(0, i);
return [
coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
+x4.slice(i + 1)
];
}
// node_modules/d3-format/src/exponent.js
function exponent_default(x4) {
return x4 = formatDecimalParts(Math.abs(x4)), x4 ? x4[1] : NaN;
}
// node_modules/d3-format/src/formatGroup.js
function formatGroup_default(grouping, thousands) {
return function(value, width) {
var i = value.length, t = [], j = 0, g = grouping[0], length = 0;
while (i > 0 && g > 0) {
if (length + g + 1 > width)
g = Math.max(1, width - length);
t.push(value.substring(i -= g, i + g));
if ((length += g + 1) > width)
break;
g = grouping[j = (j + 1) % grouping.length];
}
return t.reverse().join(thousands);
};
}
// node_modules/d3-format/src/formatNumerals.js
function formatNumerals_default(numerals) {
return function(value) {
return value.replace(/[0-9]/g, function(i) {
return numerals[+i];
});
};
}
// node_modules/d3-format/src/formatSpecifier.js
var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
function formatSpecifier(specifier) {
if (!(match = re.exec(specifier)))
throw new Error("invalid format: " + specifier);
var match;
return new FormatSpecifier({
fill: match[1],
align: match[2],
sign: match[3],
symbol: match[4],
zero: match[5],
width: match[6],
comma: match[7],
precision: match[8] && match[8].slice(1),
trim: match[9],
type: match[10]
});
}
formatSpecifier.prototype = FormatSpecifier.prototype;
function FormatSpecifier(specifier) {
this.fill = specifier.fill === void 0 ? " " : specifier.fill + "";
this.align = specifier.align === void 0 ? ">" : specifier.align + "";
this.sign = specifier.sign === void 0 ? "-" : specifier.sign + "";
this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + "";
this.zero = !!specifier.zero;
this.width = specifier.width === void 0 ? void 0 : +specifier.width;
this.comma = !!specifier.comma;
this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;
this.trim = !!specifier.trim;
this.type = specifier.type === void 0 ? "" : specifier.type + "";
}
FormatSpecifier.prototype.toString = function() {
return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type;
};
// node_modules/d3-format/src/formatTrim.js
function formatTrim_default(s) {
out:
for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
switch (s[i]) {
case ".":
i0 = i1 = i;
break;
case "0":
if (i0 === 0)
i0 = i;
i1 = i;
break;
default:
if (!+s[i])
break out;
if (i0 > 0)
i0 = 0;
break;
}
}
return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
}
// node_modules/d3-format/src/formatPrefixAuto.js
var prefixExponent;
function formatPrefixAuto_default(x4, p) {
var d = formatDecimalParts(x4, p);
if (!d)
return x4 + "";
var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;
return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + formatDecimalParts(x4, Math.max(0, p + i - 1))[0];
}
// node_modules/d3-format/src/formatRounded.js
function formatRounded_default(x4, p) {
var d = formatDecimalParts(x4, p);
if (!d)
return x4 + "";
var coefficient = d[0], exponent = d[1];
return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0");
}
// node_modules/d3-format/src/formatTypes.js
var formatTypes_default = {
"%": (x4, p) => (x4 * 100).toFixed(p),
"b": (x4) => Math.round(x4).toString(2),
"c": (x4) => x4 + "",
"d": formatDecimal_default,
"e": (x4, p) => x4.toExponential(p),
"f": (x4, p) => x4.toFixed(p),
"g": (x4, p) => x4.toPrecision(p),
"o": (x4) => Math.round(x4).toString(8),
"p": (x4, p) => formatRounded_default(x4 * 100, p),
"r": formatRounded_default,
"s": formatPrefixAuto_default,
"X": (x4) => Math.round(x4).toString(16).toUpperCase(),
"x": (x4) => Math.round(x4).toString(16)
};
// node_modules/d3-format/src/identity.js
function identity_default(x4) {
return x4;
}
// node_modules/d3-format/src/locale.js
var map = Array.prototype.map;
var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
function locale_default(locale2) {
var group = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity_default : formatGroup_default(map.call(locale2.grouping, Number), locale2.thousands + ""), currencyPrefix = locale2.currency === void 0 ? "" : locale2.currency[0] + "", currencySuffix = locale2.currency === void 0 ? "" : locale2.currency[1] + "", decimal = locale2.decimal === void 0 ? "." : locale2.decimal + "", numerals = locale2.numerals === void 0 ? identity_default : formatNumerals_default(map.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? "%" : locale2.percent + "", minus = locale2.minus === void 0 ? "\u2212" : locale2.minus + "", nan = locale2.nan === void 0 ? "NaN" : locale2.nan + "";
function newFormat(specifier) {
specifier = formatSpecifier(specifier);
var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero2 = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type;
if (type2 === "n")
comma = true, type2 = "g";
else if (!formatTypes_default[type2])
precision === void 0 && (precision = 12), trim = true, type2 = "g";
if (zero2 || fill === "0" && align === "=")
zero2 = true, fill = "0", align = "=";
var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type2) ? "0" + type2.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type2) ? percent : "";
var formatType = formatTypes_default[type2], maybeSuffix = /[defgprs%]/.test(type2);
precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));
function format2(value) {
var valuePrefix = prefix, valueSuffix = suffix, i, n, c3;
if (type2 === "c") {
valueSuffix = formatType(value) + valueSuffix;
value = "";
} else {
value = +value;
var valueNegative = value < 0 || 1 / value < 0;
value = isNaN(value) ? nan : formatType(Math.abs(value), precision);
if (trim)
value = formatTrim_default(value);
if (valueNegative && +value === 0 && sign !== "+")
valueNegative = false;
valuePrefix = (valueNegative ? sign === "(" ? sign : minus : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
valueSuffix = (type2 === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
if (maybeSuffix) {
i = -1, n = value.length;
while (++i < n) {
if (c3 = value.charCodeAt(i), 48 > c3 || c3 > 57) {
valueSuffix = (c3 === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
value = value.slice(0, i);
break;
}
}
}
}
if (comma && !zero2)
value = group(value, Infinity);
var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : "";
if (comma && zero2)
value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
switch (align) {
case "<":
value = valuePrefix + value + valueSuffix + padding;
break;
case "=":
value = valuePrefix + padding + value + valueSuffix;
break;
case "^":
value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
break;
default:
value = padding + valuePrefix + value + valueSuffix;
break;
}
return numerals(value);
}
format2.toString = function() {
return specifier + "";
};
return format2;
}
function formatPrefix2(specifier, value) {
var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];
return function(value2) {
return f(k * value2) + prefix;
};
}
return {
format: newFormat,
formatPrefix: formatPrefix2
};
}
// node_modules/d3-format/src/defaultLocale.js
var locale;
var format;
var formatPrefix;
defaultLocale({
thousands: ",",
grouping: [3],
currency: ["$", ""]
});
function defaultLocale(definition) {
locale = locale_default(definition);
format = locale.format;
formatPrefix = locale.formatPrefix;
return locale;
}
// node_modules/d3-format/src/precisionFixed.js
function precisionFixed_default(step) {
return Math.max(0, -exponent_default(Math.abs(step)));
}
// node_modules/d3-format/src/precisionPrefix.js
function precisionPrefix_default(step, value) {
return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step)));
}
// node_modules/d3-format/src/precisionRound.js
function precisionRound_default(step, max4) {
step = Math.abs(step), max4 = Math.abs(max4) - step;
return Math.max(0, exponent_default(max4) - exponent_default(step)) + 1;
}
// node_modules/d3-hierarchy/src/cluster.js
function defaultSeparation(a2, b) {
return a2.parent === b.parent ? 1 : 2;
}
function meanX(children3) {
return children3.reduce(meanXReduce, 0) / children3.length;
}
function meanXReduce(x4, c3) {
return x4 + c3.x;
}
function maxY(children3) {
return 1 + children3.reduce(maxYReduce, 0);
}
function maxYReduce(y4, c3) {
return Math.max(y4, c3.y);
}
function leafLeft(node) {
var children3;
while (children3 = node.children)
node = children3[0];
return node;
}
function leafRight(node) {
var children3;
while (children3 = node.children)
node = children3[children3.length - 1];
return node;
}
function cluster_default() {
var separation = defaultSeparation, dx = 1, dy = 1, nodeSize = false;
function cluster(root2) {
var previousNode, x4 = 0;
root2.eachAfter(function(node) {
var children3 = node.children;
if (children3) {
node.x = meanX(children3);
node.y = maxY(children3);
} else {
node.x = previousNode ? x4 += separation(node, previousNode) : 0;
node.y = 0;
previousNode = node;
}
});
var left = leafLeft(root2), right = leafRight(root2), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
return root2.eachAfter(nodeSize ? function(node) {
node.x = (node.x - root2.x) * dx;
node.y = (root2.y - node.y) * dy;
} : function(node) {
node.x = (node.x - x0) / (x1 - x0) * dx;
node.y = (1 - (root2.y ? node.y / root2.y : 1)) * dy;
});
}
cluster.separation = function(x4) {
return arguments.length ? (separation = x4, cluster) : separation;
};
cluster.size = function(x4) {
return arguments.length ? (nodeSize = false, dx = +x4[0], dy = +x4[1], cluster) : nodeSize ? null : [dx, dy];
};
cluster.nodeSize = function(x4) {
return arguments.length ? (nodeSize = true, dx = +x4[0], dy = +x4[1], cluster) : nodeSize ? [dx, dy] : null;
};
return cluster;
}
// node_modules/d3-hierarchy/src/hierarchy/count.js
function count(node) {
var sum = 0, children3 = node.children, i = children3 && children3.length;
if (!i)
sum = 1;
else
while (--i >= 0)
sum += children3[i].value;
node.value = sum;
}
function count_default() {
return this.eachAfter(count);
}
// node_modules/d3-hierarchy/src/hierarchy/each.js
function each_default2(callback, that) {
let index2 = -1;
for (const node of this) {
callback.call(that, node, ++index2, this);
}
return this;
}
// node_modules/d3-hierarchy/src/hierarchy/eachBefore.js
function eachBefore_default(callback, that) {
var node = this, nodes = [node], children3, i, index2 = -1;
while (node = nodes.pop()) {
callback.call(that, node, ++index2, this);
if (children3 = node.children) {
for (i = children3.length - 1; i >= 0; --i) {
nodes.push(children3[i]);
}
}
}
return this;
}
// node_modules/d3-hierarchy/src/hierarchy/eachAfter.js
function eachAfter_default(callback, that) {
var node = this, nodes = [node], next = [], children3, i, n, index2 = -1;
while (node = nodes.pop()) {
next.push(node);
if (children3 = node.children) {
for (i = 0, n = children3.length; i < n; ++i) {
nodes.push(children3[i]);
}
}
}
while (node = next.pop()) {
callback.call(that, node, ++index2, this);
}
return this;
}
// node_modules/d3-hierarchy/src/hierarchy/find.js
function find_default2(callback, that) {
let index2 = -1;
for (const node of this) {
if (callback.call(that, node, ++index2, this)) {
return node;
}
}
}
// node_modules/d3-hierarchy/src/hierarchy/sum.js
function sum_default(value) {
return this.eachAfter(function(node) {
var sum = +value(node.data) || 0, children3 = node.children, i = children3 && children3.length;
while (--i >= 0)
sum += children3[i].value;
node.value = sum;
});
}
// node_modules/d3-hierarchy/src/hierarchy/sort.js
function sort_default2(compare) {
return this.eachBefore(function(node) {
if (node.children) {
node.children.sort(compare);
}
});
}
// node_modules/d3-hierarchy/src/hierarchy/path.js
function path_default2(end) {
var start2 = this, ancestor = leastCommonAncestor(start2, end), nodes = [start2];
while (start2 !== ancestor) {
start2 = start2.parent;
nodes.push(start2);
}
var k = nodes.length;
while (end !== ancestor) {
nodes.splice(k, 0, end);
end = end.parent;
}
return nodes;
}
function leastCommonAncestor(a2, b) {
if (a2 === b)
return a2;
var aNodes = a2.ancestors(), bNodes = b.ancestors(), c3 = null;
a2 = aNodes.pop();
b = bNodes.pop();
while (a2 === b) {
c3 = a2;
a2 = aNodes.pop();
b = bNodes.pop();
}
return c3;
}
// node_modules/d3-hierarchy/src/hierarchy/ancestors.js
function ancestors_default() {
var node = this, nodes = [node];
while (node = node.parent) {
nodes.push(node);
}
return nodes;
}
// node_modules/d3-hierarchy/src/hierarchy/descendants.js
function descendants_default() {
return Array.from(this);
}
// node_modules/d3-hierarchy/src/hierarchy/leaves.js
function leaves_default() {
var leaves = [];
this.eachBefore(function(node) {
if (!node.children) {
leaves.push(node);
}
});
return leaves;
}
// node_modules/d3-hierarchy/src/hierarchy/links.js
function links_default() {
var root2 = this, links = [];
root2.each(function(node) {
if (node !== root2) {
links.push({ source: node.parent, target: node });
}
});
return links;
}
// node_modules/d3-hierarchy/src/hierarchy/iterator.js
function* iterator_default2() {
var node = this, current, next = [node], children3, i, n;
do {
current = next.reverse(), next = [];
while (node = current.pop()) {
yield node;
if (children3 = node.children) {
for (i = 0, n = children3.length; i < n; ++i) {
next.push(children3[i]);
}
}
}
} while (next.length);
}
// node_modules/d3-hierarchy/src/hierarchy/index.js
function hierarchy(data, children3) {
if (data instanceof Map) {
data = [void 0, data];
if (children3 === void 0)
children3 = mapChildren;
} else if (children3 === void 0) {
children3 = objectChildren;
}
var root2 = new Node(data), node, nodes = [root2], child, childs, i, n;
while (node = nodes.pop()) {
if ((childs = children3(node.data)) && (n = (childs = Array.from(childs)).length)) {
node.children = childs;
for (i = n - 1; i >= 0; --i) {
nodes.push(child = childs[i] = new Node(childs[i]));
child.parent = node;
child.depth = node.depth + 1;
}
}
}
return root2.eachBefore(computeHeight);
}
function node_copy() {
return hierarchy(this).eachBefore(copyData);
}
function objectChildren(d) {
return d.children;
}
function mapChildren(d) {
return Array.isArray(d) ? d[1] : null;
}
function copyData(node) {
if (node.data.value !== void 0)
node.value = node.data.value;
node.data = node.data.data;
}
function computeHeight(node) {
var height = 0;
do
node.height = height;
while ((node = node.parent) && node.height < ++height);
}
function Node(data) {
this.data = data;
this.depth = this.height = 0;
this.parent = null;
}
Node.prototype = hierarchy.prototype = {
constructor: Node,
count: count_default,
each: each_default2,
eachAfter: eachAfter_default,
eachBefore: eachBefore_default,
find: find_default2,
sum: sum_default,
sort: sort_default2,
path: path_default2,
ancestors: ancestors_default,
descendants: descendants_default,
leaves: leaves_default,
links: links_default,
copy: node_copy,
[Symbol.iterator]: iterator_default2
};
// node_modules/d3-hierarchy/src/accessors.js
function required(f) {
if (typeof f !== "function")
throw new Error();
return f;
}
// node_modules/d3-hierarchy/src/constant.js
function constantZero() {
return 0;
}
function constant_default6(x4) {
return function() {
return x4;
};
}
// node_modules/d3-hierarchy/src/treemap/round.js
function round_default2(node) {
node.x0 = Math.round(node.x0);
node.y0 = Math.round(node.y0);
node.x1 = Math.round(node.x1);
node.y1 = Math.round(node.y1);
}
// node_modules/d3-hierarchy/src/treemap/dice.js
function dice_default(parent, x0, y0, x1, y1) {
var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (x1 - x0) / parent.value;
while (++i < n) {
node = nodes[i], node.y0 = y0, node.y1 = y1;
node.x0 = x0, node.x1 = x0 += node.value * k;
}
}
// node_modules/d3-hierarchy/src/partition.js
function partition_default() {
var dx = 1, dy = 1, padding = 0, round = false;
function partition(root2) {
var n = root2.height + 1;
root2.x0 = root2.y0 = padding;
root2.x1 = dx;
root2.y1 = dy / n;
root2.eachBefore(positionNode(dy, n));
if (round)
root2.eachBefore(round_default2);
return root2;
}
function positionNode(dy2, n) {
return function(node) {
if (node.children) {
dice_default(node, node.x0, dy2 * (node.depth + 1) / n, node.x1, dy2 * (node.depth + 2) / n);
}
var x0 = node.x0, y0 = node.y0, x1 = node.x1 - padding, y1 = node.y1 - padding;
if (x1 < x0)
x0 = x1 = (x0 + x1) / 2;
if (y1 < y0)
y0 = y1 = (y0 + y1) / 2;
node.x0 = x0;
node.y0 = y0;
node.x1 = x1;
node.y1 = y1;
};
}
partition.round = function(x4) {
return arguments.length ? (round = !!x4, partition) : round;
};
partition.size = function(x4) {
return arguments.length ? (dx = +x4[0], dy = +x4[1], partition) : [dx, dy];
};
partition.padding = function(x4) {
return arguments.length ? (padding = +x4, partition) : padding;
};
return partition;
}
// node_modules/d3-hierarchy/src/stratify.js
var preroot = { depth: -1 };
var ambiguous = {};
function defaultId(d) {
return d.id;
}
function defaultParentId(d) {
return d.parentId;
}
function stratify_default() {
var id2 = defaultId, parentId = defaultParentId;
function stratify2(data) {
var nodes = Array.from(data), n = nodes.length, d, i, root2, parent, node, nodeId, nodeKey, nodeByKey = /* @__PURE__ */ new Map();
for (i = 0; i < n; ++i) {
d = nodes[i], node = nodes[i] = new Node(d);
if ((nodeId = id2(d, i, data)) != null && (nodeId += "")) {
nodeKey = node.id = nodeId;
nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node);
}
if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) {
node.parent = nodeId;
}
}
for (i = 0; i < n; ++i) {
node = nodes[i];
if (nodeId = node.parent) {
parent = nodeByKey.get(nodeId);
if (!parent)
throw new Error("missing: " + nodeId);
if (parent === ambiguous)
throw new Error("ambiguous: " + nodeId);
if (parent.children)
parent.children.push(node);
else
parent.children = [node];
node.parent = parent;
} else {
if (root2)
throw new Error("multiple roots");
root2 = node;
}
}
if (!root2)
throw new Error("no root");
root2.parent = preroot;
root2.eachBefore(function(node2) {
node2.depth = node2.parent.depth + 1;
--n;
}).eachBefore(computeHeight);
root2.parent = null;
if (n > 0)
throw new Error("cycle");
return root2;
}
stratify2.id = function(x4) {
return arguments.length ? (id2 = required(x4), stratify2) : id2;
};
stratify2.parentId = function(x4) {
return arguments.length ? (parentId = required(x4), stratify2) : parentId;
};
return stratify2;
}
// node_modules/d3-hierarchy/src/tree.js
function defaultSeparation2(a2, b) {
return a2.parent === b.parent ? 1 : 2;
}
function nextLeft(v) {
var children3 = v.children;
return children3 ? children3[0] : v.t;
}
function nextRight(v) {
var children3 = v.children;
return children3 ? children3[children3.length - 1] : v.t;
}
function moveSubtree(wm, wp, shift) {
var change = shift / (wp.i - wm.i);
wp.c -= change;
wp.s += shift;
wm.c += change;
wp.z += shift;
wp.m += shift;
}
function executeShifts(v) {
var shift = 0, change = 0, children3 = v.children, i = children3.length, w;
while (--i >= 0) {
w = children3[i];
w.z += shift;
w.m += shift;
shift += w.s + (change += w.c);
}
}
function nextAncestor(vim, v, ancestor) {
return vim.a.parent === v.parent ? vim.a : ancestor;
}
function TreeNode(node, i) {
this._ = node;
this.parent = null;
this.children = null;
this.A = null;
this.a = this;
this.z = 0;
this.m = 0;
this.c = 0;
this.s = 0;
this.t = null;
this.i = i;
}
TreeNode.prototype = Object.create(Node.prototype);
function treeRoot(root2) {
var tree = new TreeNode(root2, 0), node, nodes = [tree], child, children3, i, n;
while (node = nodes.pop()) {
if (children3 = node._.children) {
node.children = new Array(n = children3.length);
for (i = n - 1; i >= 0; --i) {
nodes.push(child = node.children[i] = new TreeNode(children3[i], i));
child.parent = node;
}
}
}
(tree.parent = new TreeNode(null, 0)).children = [tree];
return tree;
}
function tree_default() {
var separation = defaultSeparation2, dx = 1, dy = 1, nodeSize = null;
function tree(root2) {
var t = treeRoot(root2);
t.eachAfter(firstWalk), t.parent.m = -t.z;
t.eachBefore(secondWalk);
if (nodeSize)
root2.eachBefore(sizeNode);
else {
var left = root2, right = root2, bottom = root2;
root2.eachBefore(function(node) {
if (node.x < left.x)
left = node;
if (node.x > right.x)
right = node;
if (node.depth > bottom.depth)
bottom = node;
});
var s = left === right ? 1 : separation(left, right) / 2, tx = s - left.x, kx = dx / (right.x + s + tx), ky = dy / (bottom.depth || 1);
root2.eachBefore(function(node) {
node.x = (node.x + tx) * kx;
node.y = node.depth * ky;
});
}
return root2;
}
function firstWalk(v) {
var children3 = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;
if (children3) {
executeShifts(v);
var midpoint = (children3[0].z + children3[children3.length - 1].z) / 2;
if (w) {
v.z = w.z + separation(v._, w._);
v.m = v.z - midpoint;
} else {
v.z = midpoint;
}
} else if (w) {
v.z = w.z + separation(v._, w._);
}
v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
}
function secondWalk(v) {
v._.x = v.z + v.parent.m;
v.m += v.parent.m;
}
function apportion(v, w, ancestor) {
if (w) {
var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;
while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
vom = nextLeft(vom);
vop = nextRight(vop);
vop.a = v;
shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
if (shift > 0) {
moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
sip += shift;
sop += shift;
}
sim += vim.m;
sip += vip.m;
som += vom.m;
sop += vop.m;
}
if (vim && !nextRight(vop)) {
vop.t = vim;
vop.m += sim - sop;
}
if (vip && !nextLeft(vom)) {
vom.t = vip;
vom.m += sip - som;
ancestor = v;
}
}
return ancestor;
}
function sizeNode(node) {
node.x *= dx;
node.y = node.depth * dy;
}
tree.separation = function(x4) {
return arguments.length ? (separation = x4, tree) : separation;
};
tree.size = function(x4) {
return arguments.length ? (nodeSize = false, dx = +x4[0], dy = +x4[1], tree) : nodeSize ? null : [dx, dy];
};
tree.nodeSize = function(x4) {
return arguments.length ? (nodeSize = true, dx = +x4[0], dy = +x4[1], tree) : nodeSize ? [dx, dy] : null;
};
return tree;
}
// node_modules/d3-hierarchy/src/treemap/slice.js
function slice_default(parent, x0, y0, x1, y1) {
var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (y1 - y0) / parent.value;
while (++i < n) {
node = nodes[i], node.x0 = x0, node.x1 = x1;
node.y0 = y0, node.y1 = y0 += node.value * k;
}
}
// node_modules/d3-hierarchy/src/treemap/squarify.js
var phi = (1 + Math.sqrt(5)) / 2;
function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
var rows = [], nodes = parent.children, row, nodeValue, i0 = 0, i1 = 0, n = nodes.length, dx, dy, value = parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta;
while (i0 < n) {
dx = x1 - x0, dy = y1 - y0;
do
sumValue = nodes[i1++].value;
while (!sumValue && i1 < n);
minValue = maxValue = sumValue;
alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
beta = sumValue * sumValue * alpha;
minRatio = Math.max(maxValue / beta, beta / minValue);
for (; i1 < n; ++i1) {
sumValue += nodeValue = nodes[i1].value;
if (nodeValue < minValue)
minValue = nodeValue;
if (nodeValue > maxValue)
maxValue = nodeValue;
beta = sumValue * sumValue * alpha;
newRatio = Math.max(maxValue / beta, beta / minValue);
if (newRatio > minRatio) {
sumValue -= nodeValue;
break;
}
minRatio = newRatio;
}
rows.push(row = { value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1) });
if (row.dice)
dice_default(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
else
slice_default(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
value -= sumValue, i0 = i1;
}
return rows;
}
var squarify_default = function custom(ratio) {
function squarify(parent, x0, y0, x1, y1) {
squarifyRatio(ratio, parent, x0, y0, x1, y1);
}
squarify.ratio = function(x4) {
return custom((x4 = +x4) > 1 ? x4 : 1);
};
return squarify;
}(phi);
// node_modules/d3-hierarchy/src/treemap/index.js
function treemap_default() {
var tile = squarify_default, round = false, dx = 1, dy = 1, paddingStack = [0], paddingInner = constantZero, paddingTop = constantZero, paddingRight = constantZero, paddingBottom = constantZero, paddingLeft = constantZero;
function treemap(root2) {
root2.x0 = root2.y0 = 0;
root2.x1 = dx;
root2.y1 = dy;
root2.eachBefore(positionNode);
paddingStack = [0];
if (round)
root2.eachBefore(round_default2);
return root2;
}
function positionNode(node) {
var p = paddingStack[node.depth], x0 = node.x0 + p, y0 = node.y0 + p, x1 = node.x1 - p, y1 = node.y1 - p;
if (x1 < x0)
x0 = x1 = (x0 + x1) / 2;
if (y1 < y0)
y0 = y1 = (y0 + y1) / 2;
node.x0 = x0;
node.y0 = y0;
node.x1 = x1;
node.y1 = y1;
if (node.children) {
p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
x0 += paddingLeft(node) - p;
y0 += paddingTop(node) - p;
x1 -= paddingRight(node) - p;
y1 -= paddingBottom(node) - p;
if (x1 < x0)
x0 = x1 = (x0 + x1) / 2;
if (y1 < y0)
y0 = y1 = (y0 + y1) / 2;
tile(node, x0, y0, x1, y1);
}
}
treemap.round = function(x4) {
return arguments.length ? (round = !!x4, treemap) : round;
};
treemap.size = function(x4) {
return arguments.length ? (dx = +x4[0], dy = +x4[1], treemap) : [dx, dy];
};
treemap.tile = function(x4) {
return arguments.length ? (tile = required(x4), treemap) : tile;
};
treemap.padding = function(x4) {
return arguments.length ? treemap.paddingInner(x4).paddingOuter(x4) : treemap.paddingInner();
};
treemap.paddingInner = function(x4) {
return arguments.length ? (paddingInner = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingInner;
};
treemap.paddingOuter = function(x4) {
return arguments.length ? treemap.paddingTop(x4).paddingRight(x4).paddingBottom(x4).paddingLeft(x4) : treemap.paddingTop();
};
treemap.paddingTop = function(x4) {
return arguments.length ? (paddingTop = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingTop;
};
treemap.paddingRight = function(x4) {
return arguments.length ? (paddingRight = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingRight;
};
treemap.paddingBottom = function(x4) {
return arguments.length ? (paddingBottom = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingBottom;
};
treemap.paddingLeft = function(x4) {
return arguments.length ? (paddingLeft = typeof x4 === "function" ? x4 : constant_default6(+x4), treemap) : paddingLeft;
};
return treemap;
}
// node_modules/d3-hierarchy/src/treemap/binary.js
function binary_default(parent, x0, y0, x1, y1) {
var nodes = parent.children, i, n = nodes.length, sum, sums = new Array(n + 1);
for (sums[0] = sum = i = 0; i < n; ++i) {
sums[i + 1] = sum += nodes[i].value;
}
partition(0, n, parent.value, x0, y0, x1, y1);
function partition(i2, j, value, x02, y02, x12, y12) {
if (i2 >= j - 1) {
var node = nodes[i2];
node.x0 = x02, node.y0 = y02;
node.x1 = x12, node.y1 = y12;
return;
}
var valueOffset = sums[i2], valueTarget = value / 2 + valueOffset, k = i2 + 1, hi = j - 1;
while (k < hi) {
var mid = k + hi >>> 1;
if (sums[mid] < valueTarget)
k = mid + 1;
else
hi = mid;
}
if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i2 + 1 < k)
--k;
var valueLeft = sums[k] - valueOffset, valueRight = value - valueLeft;
if (x12 - x02 > y12 - y02) {
var xk = value ? (x02 * valueRight + x12 * valueLeft) / value : x12;
partition(i2, k, valueLeft, x02, y02, xk, y12);
partition(k, j, valueRight, xk, y02, x12, y12);
} else {
var yk = value ? (y02 * valueRight + y12 * valueLeft) / value : y12;
partition(i2, k, valueLeft, x02, y02, x12, yk);
partition(k, j, valueRight, x02, yk, x12, y12);
}
}
}
// node_modules/d3-scale/src/init.js
function initRange(domain, range) {
switch (arguments.length) {
case 0:
break;
case 1:
this.range(domain);
break;
default:
this.range(range).domain(domain);
break;
}
return this;
}
// node_modules/d3-scale/src/ordinal.js
var implicit = Symbol("implicit");
function ordinal() {
var index2 = /* @__PURE__ */ new Map(), domain = [], range = [], unknown = implicit;
function scale(d) {
var key = d + "", i = index2.get(key);
if (!i) {
if (unknown !== implicit)
return unknown;
index2.set(key, i = domain.push(d));
}
return range[(i - 1) % range.length];
}
scale.domain = function(_) {
if (!arguments.length)
return domain.slice();
domain = [], index2 = /* @__PURE__ */ new Map();
for (const value of _) {
const key = value + "";
if (index2.has(key))
continue;
index2.set(key, domain.push(value));
}
return scale;
};
scale.range = function(_) {
return arguments.length ? (range = Array.from(_), scale) : range.slice();
};
scale.unknown = function(_) {
return arguments.length ? (unknown = _, scale) : unknown;
};
scale.copy = function() {
return ordinal(domain, range).unknown(unknown);
};
initRange.apply(scale, arguments);
return scale;
}
// node_modules/d3-scale/src/band.js
function band() {
var scale = ordinal().unknown(void 0), domain = scale.domain, ordinalRange = scale.range, r0 = 0, r1 = 1, step, bandwidth, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5;
delete scale.unknown;
function rescale() {
var n = domain().length, reverse = r1 < r0, start2 = reverse ? r1 : r0, stop = reverse ? r0 : r1;
step = (stop - start2) / Math.max(1, n - paddingInner + paddingOuter * 2);
if (round)
step = Math.floor(step);
start2 += (stop - start2 - step * (n - paddingInner)) * align;
bandwidth = step * (1 - paddingInner);
if (round)
start2 = Math.round(start2), bandwidth = Math.round(bandwidth);
var values = range_default(n).map(function(i) {
return start2 + step * i;
});
return ordinalRange(reverse ? values.reverse() : values);
}
scale.domain = function(_) {
return arguments.length ? (domain(_), rescale()) : domain();
};
scale.range = function(_) {
return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];
};
scale.rangeRound = function(_) {
return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();
};
scale.bandwidth = function() {
return bandwidth;
};
scale.step = function() {
return step;
};
scale.round = function(_) {
return arguments.length ? (round = !!_, rescale()) : round;
};
scale.padding = function(_) {
return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
};
scale.paddingInner = function(_) {
return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
};
scale.paddingOuter = function(_) {
return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
};
scale.align = function(_) {
return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
};
scale.copy = function() {
return band(domain(), [r0, r1]).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);
};
return initRange.apply(rescale(), arguments);
}
function pointish(scale) {
var copy3 = scale.copy;
scale.padding = scale.paddingOuter;
delete scale.paddingInner;
delete scale.paddingOuter;
scale.copy = function() {
return pointish(copy3());
};
return scale;
}
function point() {
return pointish(band.apply(null, arguments).paddingInner(1));
}
// node_modules/d3-scale/src/constant.js
function constants(x4) {
return function() {
return x4;
};
}
// node_modules/d3-scale/src/number.js
function number(x4) {
return +x4;
}
// node_modules/d3-scale/src/continuous.js
var unit = [0, 1];
function identity2(x4) {
return x4;
}
function normalize(a2, b) {
return (b -= a2 = +a2) ? function(x4) {
return (x4 - a2) / b;
} : constants(isNaN(b) ? NaN : 0.5);
}
function clamper(a2, b) {
var t;
if (a2 > b)
t = a2, a2 = b, b = t;
return function(x4) {
return Math.max(a2, Math.min(b, x4));
};
}
function bimap(domain, range, interpolate) {
var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
if (d1 < d0)
d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
else
d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
return function(x4) {
return r0(d0(x4));
};
}
function polymap(domain, range, interpolate) {
var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i = -1;
if (domain[j] < domain[0]) {
domain = domain.slice().reverse();
range = range.slice().reverse();
}
while (++i < j) {
d[i] = normalize(domain[i], domain[i + 1]);
r[i] = interpolate(range[i], range[i + 1]);
}
return function(x4) {
var i2 = bisect_default(domain, x4, 1, j) - 1;
return r[i2](d[i2](x4));
};
}
function copy2(source, target) {
return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
}
function transformer() {
var domain = unit, range = unit, interpolate = value_default, transform2, untransform, unknown, clamp = identity2, piecewise, output, input;
function rescale() {
var n = Math.min(domain.length, range.length);
if (clamp !== identity2)
clamp = clamper(domain[0], domain[n - 1]);
piecewise = n > 2 ? polymap : bimap;
output = input = null;
return scale;
}
function scale(x4) {
return x4 == null || isNaN(x4 = +x4) ? unknown : (output || (output = piecewise(domain.map(transform2), range, interpolate)))(transform2(clamp(x4)));
}
scale.invert = function(y4) {
return clamp(untransform((input || (input = piecewise(range, domain.map(transform2), number_default2)))(y4)));
};
scale.domain = function(_) {
return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();
};
scale.range = function(_) {
return arguments.length ? (range = Array.from(_), rescale()) : range.slice();
};
scale.rangeRound = function(_) {
return range = Array.from(_), interpolate = round_default, rescale();
};
scale.clamp = function(_) {
return arguments.length ? (clamp = _ ? true : identity2, rescale()) : clamp !== identity2;
};
scale.interpolate = function(_) {
return arguments.length ? (interpolate = _, rescale()) : interpolate;
};
scale.unknown = function(_) {
return arguments.length ? (unknown = _, scale) : unknown;
};
return function(t, u) {
transform2 = t, untransform = u;
return rescale();
};
}
function continuous() {
return transformer()(identity2, identity2);
}
// node_modules/d3-scale/src/tickFormat.js
function tickFormat(start2, stop, count2, specifier) {
var step = tickStep(start2, stop, count2), precision;
specifier = formatSpecifier(specifier == null ? ",f" : specifier);
switch (specifier.type) {
case "s": {
var value = Math.max(Math.abs(start2), Math.abs(stop));
if (specifier.precision == null && !isNaN(precision = precisionPrefix_default(step, value)))
specifier.precision = precision;
return formatPrefix(specifier, value);
}
case "":
case "e":
case "g":
case "p":
case "r": {
if (specifier.precision == null && !isNaN(precision = precisionRound_default(step, Math.max(Math.abs(start2), Math.abs(stop)))))
specifier.precision = precision - (specifier.type === "e");
break;
}
case "f":
case "%": {
if (specifier.precision == null && !isNaN(precision = precisionFixed_default(step)))
specifier.precision = precision - (specifier.type === "%") * 2;
break;
}
}
return format(specifier);
}
// node_modules/d3-scale/src/linear.js
function linearish(scale) {
var domain = scale.domain;
scale.ticks = function(count2) {
var d = domain();
return ticks_default(d[0], d[d.length - 1], count2 == null ? 10 : count2);
};
scale.tickFormat = function(count2, specifier) {
var d = domain();
return tickFormat(d[0], d[d.length - 1], count2 == null ? 10 : count2, specifier);
};
scale.nice = function(count2) {
if (count2 == null)
count2 = 10;
var d = domain();
var i0 = 0;
var i1 = d.length - 1;
var start2 = d[i0];
var stop = d[i1];
var prestep;
var step;
var maxIter = 10;
if (stop < start2) {
step = start2, start2 = stop, stop = step;
step = i0, i0 = i1, i1 = step;
}
while (maxIter-- > 0) {
step = tickIncrement(start2, stop, count2);
if (step === prestep) {
d[i0] = start2;
d[i1] = stop;
return domain(d);
} else if (step > 0) {
start2 = Math.floor(start2 / step) * step;
stop = Math.ceil(stop / step) * step;
} else if (step < 0) {
start2 = Math.ceil(start2 * step) / step;
stop = Math.floor(stop * step) / step;
} else {
break;
}
prestep = step;
}
return scale;
};
return scale;
}
function linear2() {
var scale = continuous();
scale.copy = function() {
return copy2(scale, linear2());
};
initRange.apply(scale, arguments);
return linearish(scale);
}
// node_modules/d3-scale-chromatic/src/colors.js
function colors_default(specifier) {
var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;
while (i < n)
colors[i] = "#" + specifier.slice(i * 6, ++i * 6);
return colors;
}
// node_modules/d3-scale-chromatic/src/categorical/category10.js
var category10_default = colors_default("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
// node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js
var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.5, 0.8));
var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.5, 0.8));
var c2 = cubehelix();
function rainbow_default(t) {
if (t < 0 || t > 1)
t -= Math.floor(t);
var ts = Math.abs(t - 0.5);
c2.h = 360 * t - 100;
c2.s = 1.5 - 1.5 * ts;
c2.l = 0.8 - 0.9 * ts;
return c2 + "";
}
// node_modules/d3-shape/src/constant.js
function constant_default7(x4) {
return function constant() {
return x4;
};
}
// node_modules/d3-shape/src/math.js
var abs2 = Math.abs;
var atan2 = Math.atan2;
var cos = Math.cos;
var max3 = Math.max;
var min2 = Math.min;
var sin = Math.sin;
var sqrt = Math.sqrt;
var epsilon3 = 1e-12;
var pi2 = Math.PI;
var halfPi = pi2 / 2;
var tau2 = 2 * pi2;
function acos(x4) {
return x4 > 1 ? 0 : x4 < -1 ? pi2 : Math.acos(x4);
}
function asin(x4) {
return x4 >= 1 ? halfPi : x4 <= -1 ? -halfPi : Math.asin(x4);
}
// node_modules/d3-shape/src/arc.js
function arcInnerRadius(d) {
return d.innerRadius;
}
function arcOuterRadius(d) {
return d.outerRadius;
}
function arcStartAngle(d) {
return d.startAngle;
}
function arcEndAngle(d) {
return d.endAngle;
}
function arcPadAngle(d) {
return d && d.padAngle;
}
function intersect(x0, y0, x1, y1, x22, y22, x32, y32) {
var x10 = x1 - x0, y10 = y1 - y0, x322 = x32 - x22, y322 = y32 - y22, t = y322 * x10 - x322 * y10;
if (t * t < epsilon3)
return;
t = (x322 * (y0 - y22) - y322 * (x0 - x22)) / t;
return [x0 + t * x10, y0 + t * y10];
}
function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
var x01 = x0 - x1, y01 = y0 - y1, lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x0 + ox, y11 = y0 + oy, x10 = x1 + ox, y10 = y1 + oy, x00 = (x11 + x10) / 2, y00 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D2 = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * sqrt(max3(0, r * r * d2 - D2 * D2)), cx0 = (D2 * dy - dx * d) / d2, cy0 = (-D2 * dx - dy * d) / d2, cx1 = (D2 * dy + dx * d) / d2, cy1 = (-D2 * dx + dy * d) / d2, dx0 = cx0 - x00, dy0 = cy0 - y00, dx1 = cx1 - x00, dy1 = cy1 - y00;
if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1)
cx0 = cx1, cy0 = cy1;
return {
cx: cx0,
cy: cy0,
x01: -ox,
y01: -oy,
x11: cx0 * (r1 / r - 1),
y11: cy0 * (r1 / r - 1)
};
}
function arc_default() {
var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant_default7(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context = null;
function arc() {
var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi, a1 = endAngle.apply(this, arguments) - halfPi, da = abs2(a1 - a0), cw = a1 > a0;
if (!context)
context = buffer = path_default();
if (r1 < r0)
r = r1, r1 = r0, r0 = r;
if (!(r1 > epsilon3))
context.moveTo(0, 0);
else if (da > tau2 - epsilon3) {
context.moveTo(r1 * cos(a0), r1 * sin(a0));
context.arc(0, 0, r1, a0, a1, !cw);
if (r0 > epsilon3) {
context.moveTo(r0 * cos(a1), r0 * sin(a1));
context.arc(0, 0, r0, a1, a0, cw);
}
} else {
var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > epsilon3 && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), rc = min2(abs2(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t0, t1;
if (rp > epsilon3) {
var p0 = asin(rp / r0 * sin(ap)), p1 = asin(rp / r1 * sin(ap));
if ((da0 -= p0 * 2) > epsilon3)
p0 *= cw ? 1 : -1, a00 += p0, a10 -= p0;
else
da0 = 0, a00 = a10 = (a0 + a1) / 2;
if ((da1 -= p1 * 2) > epsilon3)
p1 *= cw ? 1 : -1, a01 += p1, a11 -= p1;
else
da1 = 0, a01 = a11 = (a0 + a1) / 2;
}
var x01 = r1 * cos(a01), y01 = r1 * sin(a01), x10 = r0 * cos(a10), y10 = r0 * sin(a10);
if (rc > epsilon3) {
var x11 = r1 * cos(a11), y11 = r1 * sin(a11), x00 = r0 * cos(a00), y00 = r0 * sin(a00), oc;
if (da < pi2 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {
var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);
rc0 = min2(rc, (r0 - lc) / (kc - 1));
rc1 = min2(rc, (r1 - lc) / (kc + 1));
}
}
if (!(da1 > epsilon3))
context.moveTo(x01, y01);
else if (rc1 > epsilon3) {
t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
if (rc1 < rc)
context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);
else {
context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);
context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);
}
} else
context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
if (!(r0 > epsilon3) || !(da0 > epsilon3))
context.lineTo(x10, y10);
else if (rc0 > epsilon3) {
t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
if (rc0 < rc)
context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);
else {
context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);
context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);
context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);
}
} else
context.arc(0, 0, r0, a10, a00, cw);
}
context.closePath();
if (buffer)
return context = null, buffer + "" || null;
}
arc.centroid = function() {
var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a2 = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi2 / 2;
return [cos(a2) * r, sin(a2) * r];
};
arc.innerRadius = function(_) {
return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant_default7(+_), arc) : innerRadius;
};
arc.outerRadius = function(_) {
return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant_default7(+_), arc) : outerRadius;
};
arc.cornerRadius = function(_) {
return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant_default7(+_), arc) : cornerRadius;
};
arc.padRadius = function(_) {
return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant_default7(+_), arc) : padRadius;
};
arc.startAngle = function(_) {
return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant_default7(+_), arc) : startAngle;
};
arc.endAngle = function(_) {
return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant_default7(+_), arc) : endAngle;
};
arc.padAngle = function(_) {
return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant_default7(+_), arc) : padAngle;
};
arc.context = function(_) {
return arguments.length ? (context = _ == null ? null : _, arc) : context;
};
return arc;
}
// node_modules/d3-shape/src/array.js
var slice = Array.prototype.slice;
function array_default2(x4) {
return typeof x4 === "object" && "length" in x4 ? x4 : Array.from(x4);
}
// node_modules/d3-shape/src/curve/linear.js
function Linear(context) {
this._context = context;
}
Linear.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._point = 0;
},
lineEnd: function() {
if (this._line || this._line !== 0 && this._point === 1)
this._context.closePath();
this._line = 1 - this._line;
},
point: function(x4, y4) {
x4 = +x4, y4 = +y4;
switch (this._point) {
case 0:
this._point = 1;
this._line ? this._context.lineTo(x4, y4) : this._context.moveTo(x4, y4);
break;
case 1:
this._point = 2;
default:
this._context.lineTo(x4, y4);
break;
}
}
};
function linear_default(context) {
return new Linear(context);
}
// node_modules/d3-shape/src/point.js
function x3(p) {
return p[0];
}
function y3(p) {
return p[1];
}
// node_modules/d3-shape/src/line.js
function line_default(x4, y4) {
var defined = constant_default7(true), context = null, curve = linear_default, output = null;
x4 = typeof x4 === "function" ? x4 : x4 === void 0 ? x3 : constant_default7(x4);
y4 = typeof y4 === "function" ? y4 : y4 === void 0 ? y3 : constant_default7(y4);
function line(data) {
var i, n = (data = array_default2(data)).length, d, defined0 = false, buffer;
if (context == null)
output = curve(buffer = path_default());
for (i = 0; i <= n; ++i) {
if (!(i < n && defined(d = data[i], i, data)) === defined0) {
if (defined0 = !defined0)
output.lineStart();
else
output.lineEnd();
}
if (defined0)
output.point(+x4(d, i, data), +y4(d, i, data));
}
if (buffer)
return output = null, buffer + "" || null;
}
line.x = function(_) {
return arguments.length ? (x4 = typeof _ === "function" ? _ : constant_default7(+_), line) : x4;
};
line.y = function(_) {
return arguments.length ? (y4 = typeof _ === "function" ? _ : constant_default7(+_), line) : y4;
};
line.defined = function(_) {
return arguments.length ? (defined = typeof _ === "function" ? _ : constant_default7(!!_), line) : defined;
};
line.curve = function(_) {
return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
};
line.context = function(_) {
return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
};
return line;
}
// node_modules/d3-shape/src/curve/radial.js
var curveRadialLinear = curveRadial(linear_default);
function Radial(curve) {
this._curve = curve;
}
Radial.prototype = {
areaStart: function() {
this._curve.areaStart();
},
areaEnd: function() {
this._curve.areaEnd();
},
lineStart: function() {
this._curve.lineStart();
},
lineEnd: function() {
this._curve.lineEnd();
},
point: function(a2, r) {
this._curve.point(r * Math.sin(a2), r * -Math.cos(a2));
}
};
function curveRadial(curve) {
function radial(context) {
return new Radial(curve(context));
}
radial._curve = curve;
return radial;
}
// node_modules/d3-shape/src/lineRadial.js
function lineRadial(l) {
var c3 = l.curve;
l.angle = l.x, delete l.x;
l.radius = l.y, delete l.y;
l.curve = function(_) {
return arguments.length ? c3(curveRadial(_)) : c3()._curve;
};
return l;
}
function lineRadial_default() {
return lineRadial(line_default().curve(curveRadialLinear));
}
// node_modules/d3-shape/src/link/index.js
function linkSource(d) {
return d.source;
}
function linkTarget(d) {
return d.target;
}
function link(curve) {
var source = linkSource, target = linkTarget, x4 = x3, y4 = y3, context = null;
function link2() {
var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
if (!context)
context = buffer = path_default();
curve(context, +x4.apply(this, (argv[0] = s, argv)), +y4.apply(this, argv), +x4.apply(this, (argv[0] = t, argv)), +y4.apply(this, argv));
if (buffer)
return context = null, buffer + "" || null;
}
link2.source = function(_) {
return arguments.length ? (source = _, link2) : source;
};
link2.target = function(_) {
return arguments.length ? (target = _, link2) : target;
};
link2.x = function(_) {
return arguments.length ? (x4 = typeof _ === "function" ? _ : constant_default7(+_), link2) : x4;
};
link2.y = function(_) {
return arguments.length ? (y4 = typeof _ === "function" ? _ : constant_default7(+_), link2) : y4;
};
link2.context = function(_) {
return arguments.length ? (context = _ == null ? null : _, link2) : context;
};
return link2;
}
function curveHorizontal(context, x0, y0, x1, y1) {
context.moveTo(x0, y0);
context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
}
function linkHorizontal() {
return link(curveHorizontal);
}
// node_modules/d3-shape/src/curve/basis.js
function point2(that, x4, y4) {
that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x4) / 6, (that._y0 + 4 * that._y1 + y4) / 6);
}
function Basis(context) {
this._context = context;
}
Basis.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._y0 = this._y1 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 3:
point2(this, this._x1, this._y1);
case 2:
this._context.lineTo(this._x1, this._y1);
break;
}
if (this._line || this._line !== 0 && this._point === 1)
this._context.closePath();
this._line = 1 - this._line;
},
point: function(x4, y4) {
x4 = +x4, y4 = +y4;
switch (this._point) {
case 0:
this._point = 1;
this._line ? this._context.lineTo(x4, y4) : this._context.moveTo(x4, y4);
break;
case 1:
this._point = 2;
break;
case 2:
this._point = 3;
this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);
default:
point2(this, x4, y4);
break;
}
this._x0 = this._x1, this._x1 = x4;
this._y0 = this._y1, this._y1 = y4;
}
};
// node_modules/d3-shape/src/curve/bundle.js
function Bundle(context, beta) {
this._basis = new Basis(context);
this._beta = beta;
}
Bundle.prototype = {
lineStart: function() {
this._x = [];
this._y = [];
this._basis.lineStart();
},
lineEnd: function() {
var x4 = this._x, y4 = this._y, j = x4.length - 1;
if (j > 0) {
var x0 = x4[0], y0 = y4[0], dx = x4[j] - x0, dy = y4[j] - y0, i = -1, t;
while (++i <= j) {
t = i / j;
this._basis.point(this._beta * x4[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y4[i] + (1 - this._beta) * (y0 + t * dy));
}
}
this._x = this._y = null;
this._basis.lineEnd();
},
point: function(x4, y4) {
this._x.push(+x4);
this._y.push(+y4);
}
};
var bundle_default = function custom2(beta) {
function bundle(context) {
return beta === 1 ? new Basis(context) : new Bundle(context, beta);
}
bundle.beta = function(beta2) {
return custom2(+beta2);
};
return bundle;
}(0.85);
// node_modules/d3-zoom/src/constant.js
var constant_default8 = (x4) => () => x4;
// node_modules/d3-zoom/src/event.js
function ZoomEvent(type2, {
sourceEvent,
target,
transform: transform2,
dispatch: dispatch2
}) {
Object.defineProperties(this, {
type: { value: type2, enumerable: true, configurable: true },
sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
target: { value: target, enumerable: true, configurable: true },
transform: { value: transform2, enumerable: true, configurable: true },
_: { value: dispatch2 }
});
}
// node_modules/d3-zoom/src/transform.js
function Transform(k, x4, y4) {
this.k = k;
this.x = x4;
this.y = y4;
}
Transform.prototype = {
constructor: Transform,
scale: function(k) {
return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
},
translate: function(x4, y4) {
return x4 === 0 & y4 === 0 ? this : new Transform(this.k, this.x + this.k * x4, this.y + this.k * y4);
},
apply: function(point3) {
return [point3[0] * this.k + this.x, point3[1] * this.k + this.y];
},
applyX: function(x4) {
return x4 * this.k + this.x;
},
applyY: function(y4) {
return y4 * this.k + this.y;
},
invert: function(location) {
return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
},
invertX: function(x4) {
return (x4 - this.x) / this.k;
},
invertY: function(y4) {
return (y4 - this.y) / this.k;
},
rescaleX: function(x4) {
return x4.copy().domain(x4.range().map(this.invertX, this).map(x4.invert, x4));
},
rescaleY: function(y4) {
return y4.copy().domain(y4.range().map(this.invertY, this).map(y4.invert, y4));
},
toString: function() {
return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
}
};
var identity3 = new Transform(1, 0, 0);
transform.prototype = Transform.prototype;
function transform(node) {
while (!node.__zoom)
if (!(node = node.parentNode))
return identity3;
return node.__zoom;
}
// node_modules/d3-zoom/src/noevent.js
function nopropagation3(event) {
event.stopImmediatePropagation();
}
function noevent_default3(event) {
event.preventDefault();
event.stopImmediatePropagation();
}
// node_modules/d3-zoom/src/zoom.js
function defaultFilter2(event) {
return (!event.ctrlKey || event.type === "wheel") && !event.button;
}
function defaultExtent() {
var e = this;
if (e instanceof SVGElement) {
e = e.ownerSVGElement || e;
if (e.hasAttribute("viewBox")) {
e = e.viewBox.baseVal;
return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
}
return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
}
return [[0, 0], [e.clientWidth, e.clientHeight]];
}
function defaultTransform() {
return this.__zoom || identity3;
}
function defaultWheelDelta(event) {
return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1);
}
function defaultTouchable2() {
return navigator.maxTouchPoints || "ontouchstart" in this;
}
function defaultConstrain(transform2, extent, translateExtent) {
var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1];
return transform2.translate(dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1));
}
function zoom_default2() {
var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10;
function zoom(selection2) {
selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
}
zoom.transform = function(collection, transform2, point3, event) {
var selection2 = collection.selection ? collection.selection() : collection;
selection2.property("__zoom", defaultTransform);
if (collection !== selection2) {
schedule(collection, transform2, point3, event);
} else {
selection2.interrupt().each(function() {
gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end();
});
}
};
zoom.scaleBy = function(selection2, k, p, event) {
zoom.scaleTo(selection2, function() {
var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k;
return k0 * k1;
}, p, event);
};
zoom.scaleTo = function(selection2, k, p, event) {
zoom.transform(selection2, function() {
var e = extent.apply(this, arguments), t0 = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k;
return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
}, p, event);
};
zoom.translateBy = function(selection2, x4, y4, event) {
zoom.transform(selection2, function() {
return constrain(this.__zoom.translate(typeof x4 === "function" ? x4.apply(this, arguments) : x4, typeof y4 === "function" ? y4.apply(this, arguments) : y4), extent.apply(this, arguments), translateExtent);
}, null, event);
};
zoom.translateTo = function(selection2, x4, y4, p, event) {
zoom.transform(selection2, function() {
var e = extent.apply(this, arguments), t = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
return constrain(identity3.translate(p0[0], p0[1]).scale(t.k).translate(typeof x4 === "function" ? -x4.apply(this, arguments) : -x4, typeof y4 === "function" ? -y4.apply(this, arguments) : -y4), e, translateExtent);
}, p, event);
};
function scale(transform2, k) {
k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y);
}
function translate(transform2, p0, p1) {
var x4 = p0[0] - p1[0] * transform2.k, y4 = p0[1] - p1[1] * transform2.k;
return x4 === transform2.x && y4 === transform2.y ? transform2 : new Transform(transform2.k, x4, y4);
}
function centroid(extent2) {
return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2];
}
function schedule(transition2, transform2, point3, event) {
transition2.on("start.zoom", function() {
gesture(this, arguments).event(event).start();
}).on("interrupt.zoom end.zoom", function() {
gesture(this, arguments).event(event).end();
}).tween("zoom", function() {
var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point3 == null ? centroid(e) : typeof point3 === "function" ? point3.apply(that, args) : point3, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a2 = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i = interpolate(a2.invert(p).concat(w / a2.k), b.invert(p).concat(w / b.k));
return function(t) {
if (t === 1)
t = b;
else {
var l = i(t), k = w / l[2];
t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
}
g.zoom(null, t);
};
});
}
function gesture(that, args, clean) {
return !clean && that.__zooming || new Gesture(that, args);
}
function Gesture(that, args) {
this.that = that;
this.args = args;
this.active = 0;
this.sourceEvent = null;
this.extent = extent.apply(that, args);
this.taps = 0;
}
Gesture.prototype = {
event: function(event) {
if (event)
this.sourceEvent = event;
return this;
},
start: function() {
if (++this.active === 1) {
this.that.__zooming = this;
this.emit("start");
}
return this;
},
zoom: function(key, transform2) {
if (this.mouse && key !== "mouse")
this.mouse[1] = transform2.invert(this.mouse[0]);
if (this.touch0 && key !== "touch")
this.touch0[1] = transform2.invert(this.touch0[0]);
if (this.touch1 && key !== "touch")
this.touch1[1] = transform2.invert(this.touch1[0]);
this.that.__zoom = transform2;
this.emit("zoom");
return this;
},
end: function() {
if (--this.active === 0) {
delete this.that.__zooming;
this.emit("end");
}
return this;
},
emit: function(type2) {
var d = select_default2(this.that).datum();
listeners.call(type2, this.that, new ZoomEvent(type2, {
sourceEvent: this.sourceEvent,
target: zoom,
type: type2,
transform: this.that.__zoom,
dispatch: listeners
}), d);
}
};
function wheeled(event, ...args) {
if (!filter2.apply(this, arguments))
return;
var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event);
if (g.wheel) {
if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
g.mouse[1] = t.invert(g.mouse[0] = p);
}
clearTimeout(g.wheel);
} else if (t.k === k)
return;
else {
g.mouse = [p, t.invert(p)];
interrupt_default(this);
g.start();
}
noevent_default3(event);
g.wheel = setTimeout(wheelidled, wheelDelay);
g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
function wheelidled() {
g.wheel = null;
g.end();
}
}
function mousedowned(event, ...args) {
if (touchending || !filter2.apply(this, arguments))
return;
var g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), currentTarget = event.currentTarget, x0 = event.clientX, y0 = event.clientY;
nodrag_default(event.view);
nopropagation3(event);
g.mouse = [p, this.__zoom.invert(p)];
interrupt_default(this);
g.start();
function mousemoved(event2) {
noevent_default3(event2);
if (!g.moved) {
var dx = event2.clientX - x0, dy = event2.clientY - y0;
g.moved = dx * dx + dy * dy > clickDistance2;
}
g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent));
}
function mouseupped(event2) {
v.on("mousemove.zoom mouseup.zoom", null);
yesdrag(event2.view, g.moved);
noevent_default3(event2);
g.event(event2).end();
}
}
function dblclicked(event, ...args) {
if (!filter2.apply(this, arguments))
return;
var t0 = this.__zoom, p0 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p0), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);
noevent_default3(event);
if (duration > 0)
select_default2(this).transition().duration(duration).call(schedule, t1, p0, event);
else
select_default2(this).call(zoom.transform, t1, p0, event);
}
function touchstarted(event, ...args) {
if (!filter2.apply(this, arguments))
return;
var touches = event.touches, n = touches.length, g = gesture(this, args, event.changedTouches.length === n).event(event), started, i, t, p;
nopropagation3(event);
for (i = 0; i < n; ++i) {
t = touches[i], p = pointer_default(t, this);
p = [p, this.__zoom.invert(p), t.identifier];
if (!g.touch0)
g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;
else if (!g.touch1 && g.touch0[2] !== p[2])
g.touch1 = p, g.taps = 0;
}
if (touchstarting)
touchstarting = clearTimeout(touchstarting);
if (started) {
if (g.taps < 2)
touchfirst = p[0], touchstarting = setTimeout(function() {
touchstarting = null;
}, touchDelay);
interrupt_default(this);
g.start();
}
}
function touchmoved(event, ...args) {
if (!this.__zooming)
return;
var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t, p, l;
noevent_default3(event);
for (i = 0; i < n; ++i) {
t = touches[i], p = pointer_default(t, this);
if (g.touch0 && g.touch0[2] === t.identifier)
g.touch0[0] = p;
else if (g.touch1 && g.touch1[2] === t.identifier)
g.touch1[0] = p;
}
t = g.that.__zoom;
if (g.touch1) {
var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
t = scale(t, Math.sqrt(dp / dl));
p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
} else if (g.touch0)
p = g.touch0[0], l = g.touch0[1];
else
return;
g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
}
function touchended(event, ...args) {
if (!this.__zooming)
return;
var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t;
nopropagation3(event);
if (touchending)
clearTimeout(touchending);
touchending = setTimeout(function() {
touchending = null;
}, touchDelay);
for (i = 0; i < n; ++i) {
t = touches[i];
if (g.touch0 && g.touch0[2] === t.identifier)
delete g.touch0;
else if (g.touch1 && g.touch1[2] === t.identifier)
delete g.touch1;
}
if (g.touch1 && !g.touch0)
g.touch0 = g.touch1, delete g.touch1;
if (g.touch0)
g.touch0[1] = this.__zoom.invert(g.touch0[0]);
else {
g.end();
if (g.taps === 2) {
t = pointer_default(t, this);
if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {
var p = select_default2(this).on("dblclick.zoom");
if (p)
p.apply(this, arguments);
}
}
}
}
zoom.wheelDelta = function(_) {
return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default8(+_), zoom) : wheelDelta;
};
zoom.filter = function(_) {
return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default8(!!_), zoom) : filter2;
};
zoom.touchable = function(_) {
return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default8(!!_), zoom) : touchable;
};
zoom.extent = function(_) {
return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default8([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
};
zoom.scaleExtent = function(_) {
return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
};
zoom.translateExtent = function(_) {
return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
};
zoom.constrain = function(_) {
return arguments.length ? (constrain = _, zoom) : constrain;
};
zoom.duration = function(_) {
return arguments.length ? (duration = +_, zoom) : duration;
};
zoom.interpolate = function(_) {
return arguments.length ? (interpolate = _, zoom) : interpolate;
};
zoom.on = function() {
var value = listeners.on.apply(listeners, arguments);
return value === listeners ? zoom : value;
};
zoom.clickDistance = function(_) {
return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
};
zoom.tapDistance = function(_) {
return arguments.length ? (tapDistance = +_, zoom) : tapDistance;
};
return zoom;
}
// src/Visualisations/VisModal.ts
var import_obsidian43 = require("obsidian");
// src/Components/VisComp.svelte
var import_loglevel21 = __toESM(require_loglevel());
// src/Visualisations/ArcDiagram.ts
var arcDiagram = (graph, currFile, modal, width, height) => {
const data = graphlibToD3(graph);
const margin = { top: 20, right: 20, bottom: 20, left: 150 };
const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width);
const nodes = data.nodes.map(({ id: id2, name }) => ({
id: id2,
name,
sourceLinks: [],
targetLinks: []
}));
const nodeById = new Map(nodes.map((d) => [d.id, d]));
const links = data.links.map(({ source, target }) => ({
source: nodeById.get(source),
target: nodeById.get(target)
}));
for (const link2 of links) {
const { source, target } = link2;
source.sourceLinks.push(link2);
target.targetLinks.push(link2);
}
svg.append("style").text(`
path {
stroke: #808080;
opacity: 0.8;
}
text {
stroke: var(--text-a);
opacity: 0.8;
}
.hover g.primary text {
fill: black;
}
.hover g.secondary text {
fill: #333;
}
.hover .secondary {
color: red;
}
.hover path.primary {
stroke: #333;
stroke-opacity: 1;
}
.hover rect {
opacity: 1;
cursor: pointer;
}
`);
const y4 = point(nodes.map((d) => d.name).sort(ascending_default), [
margin.top,
height - margin.bottom
]);
const label = svg.append("g").attr("font-family", "sans-serif").attr("font-size", 10).attr("text-anchor", "end").selectAll("g").data(nodes).join("g").attr("transform", (d) => `translate(${margin.left},${d.y = y4(d.name)})`).call((g) => g.append("text").attr("x", -6).attr("dy", "0.35em").text((d) => d.name)).call((g) => g.append("circle").attr("r", 3));
const path2 = svg.insert("g", "*").attr("fill", "none").attr("stroke-opacity", 0.6).attr("stroke-width", 1.5).selectAll("path").data(links).join("path").attr("d", arc);
const step = 104;
const nodeClick = (event, dest) => {
openOrSwitch(dest, event);
modal.close();
};
const overlay = svg.append("g").attr("fill", "none").attr("pointer-events", "all").selectAll("rect").data(nodes).join("rect").attr("width", margin.left + 40).attr("height", step).attr("y", (d) => y4(d.name) - step / 2).on("mouseover", (d) => {
svg.classed("hover", true);
label.classed("primary", (n) => n === d);
label.classed("secondary", (n) => n.sourceLinks.some((l) => l.target === d) || n.targetLinks.some((l) => l.source === d));
path2.classed("primary", (l) => l.source === d || l.target === d).filter(".primary").raise();
}).on("mouseout", (d) => {
svg.classed("hover", false);
label.classed("primary", false);
label.classed("secondary", false);
path2.classed("primary", false).order();
}).on("click", (event, d) => {
nodeClick(event, d.name);
});
function arc(d) {
const y1 = d.source.y;
const y22 = d.target.y;
const r = Math.abs(y22 - y1) / 2;
return `M${margin.left},${y1}A${r},${r} 0,0,${y1 < y22 ? 1 : 0} ${margin.left},${y22}`;
}
function zoomed({ transform: transform2 }) {
svg.attr("transform", transform2);
}
svg.call(zoom_default2().extent([
[0, 0],
[width, height]
]).scaleExtent([0.5, 8]).on("zoom", zoomed));
};
// src/Visualisations/CirclePacking.ts
var circlePacking = (graph, currFile, modal, width, height) => {
const flatAdj = dfsFlatAdjList(graph, currFile.basename);
console.log({ flatAdj });
const hierarchy2 = stratify_default()(flatAdj);
console.log({ hierarchy: hierarchy2 });
const adjList = bfsAdjList(graph, currFile.basename);
console.log({ adjList });
const noDoubles = [...adjList];
noDoubles.forEach((a2, i) => {
if (noDoubles.some((b, j) => i !== j && a2.name === b.name)) {
const index2 = noDoubles.findIndex((b, j) => i !== j && a2.name === b.name);
noDoubles.splice(index2, 1);
}
});
console.log({ noDoubles });
const linkArr = noDoubles.map((d) => {
return { source: d.name, target: d.parentId };
});
const links = linkArr.map((d) => Object.create(d));
const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width);
const nodeColour = getComputedStyle(document.body).getPropertyValue("--text-accent");
const node = svg.append("g").selectAll("circle").data(noDoubles).join("circle").attr("r", (d) => Math.round(d.height / 10) + 10).attr("cx", width / 2).attr("cy", height / 2).style("fill", nodeColour).style("fill-opacity", 0.6).attr("stroke", nodeColour).style("stroke-width", 4);
node.attr("aria-label", (d) => d.name);
const nodeClick = (event, dest) => {
const currFile2 = getCurrFile();
openOrSwitch(dest, event);
modal.close();
};
node.on("click", (event, d) => {
nodeClick(event, d.name);
});
const link2 = svg.append("g").attr("stroke", "#868282").attr("stroke-opacity", 0.6).selectAll("line").data(links).join("line").attr("stroke-width", 0.8);
const simulation = simulation_default().force("center", center_default().x(width / 2).y(height / 2)).force("charge", manyBody_default().strength(0.5)).force("collide", collide_default().strength(0.025).radius(30).iterations(1));
simulation.nodes(noDoubles).on("tick", function(d) {
node.attr("cx", (d2) => d2.x).attr("cy", (d2) => d2.y);
});
function zoomed({ transform: transform2 }) {
node.attr("transform", transform2);
}
svg.call(zoom_default2().extent([
[0, 0],
[width, height]
]).scaleExtent([0.5, 8]).on("zoom", zoomed));
const drag = (simulation2) => {
function dragstarted(event, d) {
if (!event.active)
simulation2.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(event, d) {
d.fx = event.x;
d.fy = event.y;
}
function dragended(event, d) {
if (!event.active)
simulation2.alphaTarget(0);
d.fx = null;
d.fy = null;
}
return drag_default().on("start", dragstarted).on("drag", dragged).on("end", dragended);
};
node.call(drag(simulation));
};
// src/Visualisations/EdgeBundling.ts
var edgeBundling = (graph, currFile, modal, width, height) => {
const flatAdj = dfsFlatAdjList(graph, currFile.basename);
console.log({ flatAdj });
const hier = stratify_default()(flatAdj);
console.log({ hier });
const PADDING_BUBBLE = 15;
const PADDING_LABEL = 30;
const BUBBLE_SIZE_MIN = 4;
const BUBBLE_SIZE_MAX = 20;
var diameter = 560, radius = diameter / 2, innerRadius = radius - 170;
var cluster = cluster_default().size([360, innerRadius]);
var line = lineRadial_default().curve(bundle_default.beta(0.85)).radius(function(d) {
return d[1];
}).angle(function(d) {
return d[0] / 180 * Math.PI;
});
const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width).append("g").attr("transform", "translate(" + radius + "," + radius + ")");
var link2 = svg.append("g").selectAll(".link"), label = svg.append("g").selectAll(".label"), bubble = svg.append("g").selectAll(".bubble");
var bubbleSizeScale = linear2().domain([0, 100]).range([BUBBLE_SIZE_MIN, BUBBLE_SIZE_MAX]);
var root2 = packageHierarchy(hier).sum(function(d) {
console.log(d);
return d.height;
});
cluster(root2);
const leaves = root2.leaves();
const _link = link2.data(packageImports(leaves)).enter().append("path").each(function(d) {
d.source = d[0], d.target = d[d.length - 1];
}).attr("class", "link").attr("d", line).attr("fill", "none").attr("stroke", "black");
const _label = label.data(leaves).enter().append("text").attr("class", "label").attr("dy", "0.31em").attr("transform", function(d) {
return "rotate(" + (d.x - 90) + ")translate(" + (d.y + PADDING_LABEL) + ",0)" + (d.x < 180 ? "" : "rotate(180)");
}).attr("text-anchor", function(d) {
return d.x < 180 ? "start" : "end";
}).text(function(d) {
return d.data.key;
});
const _bubble = bubble.data(leaves).enter().append("circle").attr("class", "bubble").attr("transform", function(d) {
return "rotate(" + (d.x - 90) + ")translate(" + (d.y + PADDING_BUBBLE) + ",0)";
}).attr("r", (d) => bubbleSizeScale(d.value)).attr("stroke", "black").attr("fill", "#69a3b2").style("opacity", 0.2);
function packageHierarchy(classes) {
var map2 = {};
function find3(name, data) {
var node = map2[name], i;
if (!node) {
node = map2[name] = data || { name, children: [] };
if (name.length) {
node.parent = find3(name.substring(0, i = name.lastIndexOf(".")));
node.parent.children.push(node);
node.key = name.substring(i + 1);
}
}
return node;
}
classes.forEach(function(d) {
find3(d.name, d);
});
return hierarchy(map2[""]);
}
function packageImports(nodes) {
var map2 = {}, imports = [];
nodes.forEach(function(d) {
map2[d.data.name] = d;
});
nodes.forEach(function(d) {
if (d.data.imports)
d.data.imports.forEach(function(i) {
imports.push(map2[d.data.name].path(map2[i]));
});
});
return imports;
}
};
// src/Visualisations/ForceDirectedG.ts
var forceDirectedG = (graph, currFile, modal, width, height) => {
const { settings } = modal.plugin;
let nodeToGetTo = currFile.basename;
console.log({ nodeToGetTo });
console.time("Find all paths");
console.timeEnd("Find all paths");
const defaultNodeColour = getComputedStyle(document.body).getPropertyValue("--text-accent");
let currNodeColour = defaultNodeColour;
const colourChangeInput = select_default2(".d3-graph").append("input").attr("type", "color");
colourChangeInput.on("change", function changeColor(el) {
currNodeColour = el.target.value;
node.transition().duration(300).style("fill", (d) => {
if (d.index === currNodeIndex)
return;
return currNodeColour;
});
});
const data = graphlibToD3(graph);
const links = data.links.map((d) => Object.create(d));
const currNode = data.nodes.find((node2) => node2.name === currFile.basename);
let currNodeIndex;
if (!currNode) {
const id2 = data.nodes.length;
data.nodes.push({ id: id2, name: currFile.basename });
currNodeIndex = id2;
} else {
currNodeIndex = currNode.id;
}
const nodes = data.nodes.map((d) => Object.create(d));
const simulation = simulation_default(nodes).force("link", link_default(links).id((d) => d.id)).force("charge", manyBody_default().strength(-8)).force("center", center_default(width / 2, height / 2).strength(0.5));
const drag = (simulation2) => {
function dragstarted(event, d) {
if (!event.active)
simulation2.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(event, d) {
d.fx = event.x;
d.fy = event.y;
}
function dragended(event, d) {
if (!event.active)
simulation2.alphaTarget(0);
d.fx = null;
d.fy = null;
}
return drag_default().on("start", dragstarted).on("drag", dragged).on("end", dragended);
};
const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width).attr("class", "forceDirectedG");
const link2 = svg.append("g").attr("stroke", "#868282").attr("stroke-opacity", 0.6).selectAll("line").data(links).join("line").attr("stroke-width", 0.8).attr("marker-end", "url(#end)");
var path2 = svg.append("svg:g").selectAll("path").data(links).enter().append("svg:path").attr("class", "link").attr("marker-end", "url(#end)");
const arrowHead = svg.append("svg:defs").selectAll("marker").data(["end"]).enter().append("svg:marker").attr("id", String).attr("viewBox", "0 -5 10 10").attr("refX", 20).attr("refY", 0.1).attr("markerWidth", 6).attr("markerHeight", 6).attr("orient", "auto").attr("stroke-width", 10).append("svg:path").attr("d", "M0,-5L10,0L0,5");
const nameFromIndex = (d) => data.nodes.find((node2) => node2.id === d.index).name;
const indexFromName = (name) => data.nodes.find((node2) => node2.name === name).id;
const node = svg.append("g").selectAll("circle").data(nodes).join("circle").attr("r", 5).attr("fill", (d) => {
if (nameFromIndex(d) === currFile.basename) {
return "#ffffff";
} else {
return currNodeColour;
}
}).call(drag(simulation));
node.attr("aria-label", (d) => d.name);
const nodeClick = (event, dest) => {
openOrSwitch(dest, event);
modal.close();
};
node.on("click", (event, d) => {
nodeClick(event, d.name);
});
node.on("mousedown", (event, d) => {
if (event.button === 2) {
nodeToGetTo = d.name;
node.style("fill", (n) => {
if (n.name === nodeToGetTo) {
return "#ff0000";
} else
return currNodeColour;
});
}
});
function linked(a2, b) {
if (a2 === b)
return true;
const linkedArr = links.find((link3) => link3.source.index === a2 && link3.target.index === b || link3.target.index === a2 && link3.source.index === b);
return !!linkedArr;
}
node.on("mouseover", (event, d) => {
node.transition().duration(150).style("opacity", (o) => {
return linked(d.index, o.index) ? 1 : 0.2;
});
link2.transition().duration(150).style("opacity", function(o) {
return o.source.index === d.index || o.target.index === d.index ? 1 : 0.2;
});
const hoveredNode = nameFromIndex(d);
}).on("mouseout", unfocus);
function focusNeighbours(d, event) {
}
function unfocus() {
node.style("opacity", 1);
link2.style("opacity", 1).style("stroke", "#868282");
}
simulation.on("tick", () => {
link2.attr("x1", (d) => d.source.x).attr("y1", (d) => d.source.y).attr("x2", (d) => d.target.x).attr("y2", (d) => d.target.y);
node.attr("cx", (d) => d.x).attr("cy", (d) => d.y);
});
function zoomed({ transform: transform2 }) {
node.attr("transform", transform2);
link2.attr("transform", transform2);
}
svg.call(zoom_default2().extent([
[0, 0],
[width, height]
]).scaleExtent([0.5, 10]).on("zoom", zoomed));
function saveGraph() {
const clone = svg.clone(true);
localStorage.setItem("FDG", JSON.stringify(clone));
}
};
// src/Visualisations/Icicle.ts
var icicle = (graph, currFile, modal, width, viewHeight) => {
const flatAdj = dfsFlatAdjList(graph, currFile.basename);
console.log({ flatAdj });
const hier = stratify_default()(flatAdj);
console.log({ hier });
const format2 = format(",d");
const color2 = ordinal(quantize_default(rainbow_default, hier.children.length + 1));
const partition = (data) => {
const root3 = hierarchy(data).sum((d) => d.value).sort((a2, b) => b.height - a2.height || b.value - a2.value);
return partition_default().size([viewHeight, (root3.height + 1) * width / 3])(root3);
};
const root2 = partition(hier);
let focus = root2;
const svg = select_default2(".d3-graph").append("svg").attr("height", viewHeight).attr("width", width).style("font", "10px sans-serif");
const cell = svg.selectAll("g").data(root2.descendants()).join("g").attr("transform", (d) => `translate(${d.y0},${d.x0})`);
const rect = cell.append("rect").attr("width", (d) => d.y1 - d.y0 - 1).attr("height", (d) => rectHeight(d)).attr("fill-opacity", 0.6).attr("fill", (d) => {
if (!d.depth)
return "#ccc";
while (d.depth > 1)
d = d.parent;
return color2(d.data.data.name);
}).style("cursor", "pointer").on("click", clicked);
const text2 = cell.append("text").style("user-select", "none").attr("pointer-events", "none").attr("x", 4).attr("y", 13);
text2.append("tspan").text((d) => d.data.data.name);
const tspan = text2.append("tspan").attr("fill-opacity", (d) => (labelVisible(d) ? 1 : 0) * 0.7).text((d) => ` ${format2(d.value)}`);
cell.append("title").text((d) => `${d.ancestors().map((d2) => d2.data.data.name)}`);
function clicked(event, p) {
console.log({ p });
focus = focus === p ? p = p.parent : p;
root2.each((d) => {
d.target = {
x0: (d.x0 - p.x0) / (p.x1 - p.x0) * viewHeight,
x1: (d.x1 - p.x0) / (p.x1 - p.x0) * viewHeight,
y0: d.y0 - p.y0,
y1: d.y1 - p.y0
};
console.log(d.target.x0);
});
const t = cell.transition().duration(750).attr("transform", (d) => `translate(${d.target.y0},${d.target.x0})`);
rect.transition(t).attr("height", (d) => rectHeight(d.target));
text2.transition(t).attr("fill-opacity", (d) => +labelVisible(d.target));
tspan.transition(t).attr("fill-opacity", (d) => (labelVisible(d) ? 1 : 0) * 0.7);
}
function rectHeight(d) {
console.log({ d });
return d.x1 - d.x0 - Math.min(1, (d.x1 - d.x0) / 2);
}
function labelVisible(d) {
return d.y1 <= width && d.y0 >= 0 && d.x1 - d.x0 > 16;
}
};
// src/Visualisations/RadialTree.ts
var radialTree = (graph, currFile, modal, width, height) => {
const flatAdj = dfsFlatAdjList(graph, currFile.basename);
console.log({ flatAdj });
const hierarchy2 = stratify_default()(flatAdj);
console.log({ hierarchy: hierarchy2 });
const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width);
const root2 = hierarchy(hierarchy2, (d) => d.children).sum((d) => d.children ? 0 : 1).sort((a2, b) => a2.depth - b.depth);
const outerRadius = width / 2;
const innerRadius = outerRadius - 170;
const cluster = cluster_default().size([360, innerRadius]).separation((a2, b) => 1);
const color2 = ordinal().domain(graph.nodes()).range(category10_default);
function maxLength(d) {
return d.data.data.depth + (d.children ? max(d.children, maxLength) : 0);
}
function setRadius(d, y0, k) {
d.radius = (y0 += d.data.data.depth) * k;
if (d.children)
d.children.forEach((d2) => setRadius(d2, y0, k));
}
function setColor(d) {
var name = d.data.data.name;
d.color = color2.domain().indexOf(name) >= 0 ? color2(name) : d.parent ? d.parent.color : null;
if (d.children)
d.children.forEach(setColor);
}
function linkVariable(d) {
return linkStep(d.source.x, d.source.radius, d.target.x, d.target.radius);
}
function linkConstant(d) {
return linkStep(d.source.x, d.source.y, d.target.x, d.target.y);
}
function linkExtensionVariable(d) {
return linkStep(d.target.x, d.target.radius, d.target.x, innerRadius);
}
function linkExtensionConstant(d) {
return linkStep(d.target.x, d.target.y, d.target.x, innerRadius);
}
function linkStep(startAngle, startRadius, endAngle, endRadius) {
const c0 = Math.cos(startAngle = (startAngle - 90) / 180 * Math.PI);
const s0 = Math.sin(startAngle);
const c1 = Math.cos(endAngle = (endAngle - 90) / 180 * Math.PI);
const s1 = Math.sin(endAngle);
return "M" + startRadius * c0 + "," + startRadius * s0 + (endAngle === startAngle ? "" : "A" + startRadius + "," + startRadius + " 0 0 " + (endAngle > startAngle ? 1 : 0) + " " + startRadius * c1 + "," + startRadius * s1) + "L" + endRadius * c1 + "," + endRadius * s1;
}
const legend = (svg2) => {
const g = svg2.selectAll("g").data(color2.domain()).join("g").attr("transform", (d, i) => `translate(${-outerRadius},${-outerRadius + i * 20})`);
g.append("rect").attr("width", 18).attr("height", 18).attr("fill", color2);
g.append("text").attr("x", 24).attr("y", 9).attr("dy", "0.35em").text((d) => d);
};
cluster(root2);
setRadius(root2, root2.data.data.depth = 0, innerRadius / maxLength(root2));
setColor(root2);
svg.append("g").call(legend);
svg.append("style").text(`
.link--active {
stroke: #000 !important;
stroke-width: 1.5px;
}
.link-extension--active {
stroke-opacity: .6;
}
.label--active {
font-weight: bold;
}
`);
const linkExtension = svg.append("g").attr("fill", "none").attr("stroke", "#000").attr("stroke-opacity", 0.25).selectAll("path").data(root2.links().filter((d) => !d.target.children)).join("path").each(function(d) {
d.target.linkExtensionNode = this;
}).attr("d", linkExtensionConstant);
const link2 = svg.append("g").attr("fill", "none").attr("stroke", "#000").selectAll("path").data(root2.links()).join("path").each(function(d) {
d.target.linkNode = this;
}).attr("d", linkConstant).attr("stroke", (d) => d.target.color);
const label = svg.append("g").selectAll("text").data(root2.leaves()).join("text").attr("dy", ".31em").attr("transform", (d) => `rotate(${d.x - 90}) translate(${innerRadius + 4},0)${d.x < 180 ? "" : " rotate(180)"}`).attr("text-anchor", (d) => d.x < 180 ? "start" : "end").text((d) => d.data.data.name).on("mouseover", mouseovered(true)).on("mouseout", mouseovered(false));
function mouseovered(active) {
return function(event, d) {
select_default2(this).classed("label--active", active);
select_default2(d.linkExtensionNode).classed("link-extension--active", active).raise();
do
select_default2(d.linkNode).classed("link--active", active).raise();
while (d = d.parent);
};
}
function zoomed({ transform: transform2 }) {
linkExtension.attr("transform", transform2);
link2.attr("transform", transform2);
label.attr("transform", transform2);
}
svg.call(zoom_default2().extent([
[0, 0],
[width, height]
]).scaleExtent([0.5, 8]).on("zoom", zoomed));
};
// src/Visualisations/Sunburst.ts
var sunburst = (graph, currFile, modal, width, height) => {
const flatAdj = dfsFlatAdjList(graph, currFile.basename);
console.log({ flatAdj });
const hierarchy2 = stratify_default()(flatAdj);
console.log({ hierarchy: hierarchy2 });
var radius = Math.min(width, height) / 2;
var color2 = ordinal(category10_default);
var g = select_default2("svg").attr("width", width).attr("height", height).append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var g = select_default2("svg").attr("width", width).attr("height", height).append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var g = select_default2("svg").attr("width", width).attr("height", height).append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var partition = partition_default().size([2 * Math.PI, radius]);
var root2 = hierarchy(hierarchy2).sum(function(d) {
return d.height;
});
partition(root2);
var arc = arc_default().startAngle(function(d) {
return d.x0;
}).endAngle(function(d) {
return d.x1;
}).innerRadius(function(d) {
return d.y0;
}).outerRadius(function(d) {
return d.y1;
});
g.selectAll("path").data(root2.descendants()).enter().append("path").attr("display", function(d) {
return d.depth ? null : "none";
}).attr("d", arc).style("stroke", "#fff").style("fill", function(d) {
return color2((d.children ? d : d.parent).data.name);
});
};
// src/Visualisations/TidyTree.ts
var tidyTree = (graph, currFile, modal, width, height) => {
const tree = (data) => {
const root3 = hierarchy(data);
root3.dx = 10;
root3.dy = width / (root3.height + 1);
return tree_default().nodeSize([root3.dx, root3.dy])(root3);
};
const flatAdj = dfsFlatAdjList(graph, currFile.basename);
console.log({ flatAdj });
const hierarchy2 = stratify_default()(flatAdj);
console.log({ hierarchy: hierarchy2 });
const root2 = tree(hierarchy2);
console.log(root2);
let x0 = Infinity;
let x1 = -x0;
root2.each((d) => {
if (d.x > x1)
x1 = d.x;
if (d.x < x0)
x0 = d.x;
});
const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width);
const g = svg.append("g").attr("font-family", "sans-serif").attr("font-size", 10).attr("transform", `translate(${root2.dy / 3},${root2.dx - x0})`);
const link2 = g.append("g").attr("fill", "none").attr("stroke", "#555").attr("stroke-opacity", 0.4).attr("stroke-width", 1.5).selectAll("path").data(root2.links()).join("path").attr("d", linkHorizontal().x((d) => d.y).y((d) => d.x));
const node = g.append("g").attr("stroke-linejoin", "round").attr("stroke-width", 10).selectAll("g").data(root2.descendants()).join("g").attr("transform", (d) => `translate(${d.y},${d.x})`);
node.append("circle").attr("fill", (d) => d.children ? "#555" : "#999").attr("r", 10);
node.attr("aria-label", (d) => {
console.log(d);
return d.data.data.name;
});
const nodeClick = (event, dest) => {
openOrSwitch(dest, event);
modal.close();
};
node.on("click", (event, d) => {
console.log({ d });
nodeClick(event, d.data.data.name);
});
node.append("text").attr("dy", "0.31em").attr("x", (d) => d.children ? -6 : 6).attr("text-anchor", (d) => d.children ? "end" : "start").text((d) => d.data.data.name).clone(true).lower().attr("stroke", "white");
function zoomed({ transform: transform2 }) {
svg.attr("transform", transform2);
}
svg.call(zoom_default2().extent([
[0, 0],
[width, height]
]).scaleExtent([0.5, 8]).on("zoom", zoomed));
};
// src/Visualisations/TreeMap.ts
var treeMap = (graph, currFile, modal, width, height) => {
const flatAdj = dfsFlatAdjList(graph, currFile.basename);
console.log({ flatAdj });
const hierarchy2 = stratify_default()(flatAdj);
console.log({ hierarchy: hierarchy2 });
const root2 = treemap_default().tile(binary_default).size([width, height]).padding(1).round(true)(hierarchy2.sum((d) => d.height).sort((a2, b) => b.height - a2.height));
const svg = select_default2(".d3-graph").append("svg").attr("height", height).attr("width", width).style("font", "10px sans-serif");
const leaf = svg.selectAll("g").data(root2.leaves()).join("g").attr("transform", (d) => `translate(${d.x0},${d.y0})`);
leaf.attr("aria-label", (d) => d.data.name);
const color2 = ordinal(category10_default);
leaf.append("rect").attr("fill", (d) => {
while (d.depth > 1)
d = d.parent;
return color2(d.data.id);
}).attr("fill-opacity", 0.6).attr("width", (d) => d.x1 - d.x0).attr("height", (d) => d.y1 - d.y0);
leaf.append("clipPath").append("use");
const nodeClick = (event, dest) => {
openOrSwitch(dest, event);
modal.close();
};
leaf.on("click", (event, d) => {
console.log({ d });
nodeClick(event, d.data.name);
});
function zoomed({ transform: transform2 }) {
svg.attr("transform", transform2);
}
svg.call(zoom_default2().extent([
[0, 0],
[width, height]
]).scaleExtent([0.5, 8]).on("zoom", zoomed));
};
// src/Components/VisComp.svelte
function get_each_context10(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[23] = list[i].text;
child_ctx[24] = list[i].options;
child_ctx[25] = list[i].val;
child_ctx[26] = list;
child_ctx[27] = i;
return child_ctx;
}
function get_each_context_17(ctx, list, i) {
const child_ctx = ctx.slice();
child_ctx[28] = list[i];
return child_ctx;
}
function create_each_block_17(ctx) {
let option;
let t_value = ctx[28] + "";
let t;
let option_value_value;
return {
c() {
option = element("option");
t = text(t_value);
option.__value = option_value_value = ctx[28];
option.value = option.__value;
},
m(target, anchor) {
insert(target, option, anchor);
append(option, t);
},
p(ctx2, dirty) {
if (dirty & 1 && t_value !== (t_value = ctx2[28] + ""))
set_data(t, t_value);
if (dirty & 1 && option_value_value !== (option_value_value = ctx2[28])) {
option.__value = option_value_value;
option.value = option.__value;
}
},
d(detaching) {
if (detaching)
detach(option);
}
};
}
function create_each_block10(ctx) {
let span;
let t0_value = ctx[23] + "";
let t0;
let t1;
let select;
let t2;
let mounted;
let dispose;
let each_value_1 = ctx[24];
let each_blocks = [];
for (let i = 0; i < each_value_1.length; i += 1) {
each_blocks[i] = create_each_block_17(get_each_context_17(ctx, each_value_1, i));
}
function select_change_handler() {
ctx[2].call(select, ctx[26], ctx[27]);
}
return {
c() {
span = element("span");
t0 = text(t0_value);
t1 = text(":\r\n ");
select = element("select");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
t2 = space();
if (ctx[25] === void 0)
add_render_callback(select_change_handler);
},
m(target, anchor) {
insert(target, span, anchor);
append(span, t0);
append(span, t1);
append(span, select);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(select, null);
}
select_option(select, ctx[25]);
append(span, t2);
if (!mounted) {
dispose = listen(select, "change", select_change_handler);
mounted = true;
}
},
p(new_ctx, dirty) {
ctx = new_ctx;
if (dirty & 1 && t0_value !== (t0_value = ctx[23] + ""))
set_data(t0, t0_value);
if (dirty & 1) {
each_value_1 = ctx[24];
let i;
for (i = 0; i < each_value_1.length; i += 1) {
const child_ctx = get_each_context_17(ctx, each_value_1, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block_17(child_ctx);
each_blocks[i].c();
each_blocks[i].m(select, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value_1.length;
}
if (dirty & 1) {
select_option(select, ctx[25]);
}
},
d(detaching) {
if (detaching)
detach(span);
destroy_each(each_blocks, detaching);
mounted = false;
dispose();
}
};
}
function create_fragment23(ctx) {
let div0;
let t;
let div1;
let each_value = ctx[0];
let each_blocks = [];
for (let i = 0; i < each_value.length; i += 1) {
each_blocks[i] = create_each_block10(get_each_context10(ctx, each_value, i));
}
return {
c() {
div0 = element("div");
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].c();
}
t = space();
div1 = element("div");
attr(div1, "class", "d3-graph");
},
m(target, anchor) {
insert(target, div0, anchor);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(div0, null);
}
insert(target, t, anchor);
insert(target, div1, anchor);
},
p(ctx2, [dirty]) {
if (dirty & 1) {
each_value = ctx2[0];
let i;
for (i = 0; i < each_value.length; i += 1) {
const child_ctx = get_each_context10(ctx2, each_value, i);
if (each_blocks[i]) {
each_blocks[i].p(child_ctx, dirty);
} else {
each_blocks[i] = create_each_block10(child_ctx);
each_blocks[i].c();
each_blocks[i].m(div0, null);
}
}
for (; i < each_blocks.length; i += 1) {
each_blocks[i].d(1);
}
each_blocks.length = each_value.length;
}
},
i: noop,
o: noop,
d(detaching) {
if (detaching)
detach(div0);
destroy_each(each_blocks, detaching);
if (detaching)
detach(t);
if (detaching)
detach(div1);
}
};
}
function instance23($$self, $$props, $$invalidate) {
let argArr;
let { modal } = $$props;
const { plugin } = modal;
const { mainG, settings } = plugin;
const { visGraph, visRelation, visClosed, visAll } = settings;
const currFile = getCurrFile();
const selectors = [
{
text: "Type",
options: VISTYPES,
val: visGraph
},
{
text: "Relation",
options: RELATIONS,
val: visRelation
},
{
text: "Close Implied",
options: REAlCLOSED,
val: visClosed
},
{
text: "No Unlinked",
options: ALLUNLINKED,
val: visAll
}
];
const [width, height] = [Math.round(window.innerWidth / 1.3), Math.round(window.innerHeight / 1.3)];
const [up, same, down] = [
getSubInDirs(mainG, "up"),
getSubInDirs(mainG, "same"),
getSubInDirs(mainG, "down")
];
const [closedParentNoSingle, closedSiblingNoSingle, closedChildNoSingle] = [
closeImpliedLinks(up, down),
closeImpliedLinks(same, same),
closeImpliedLinks(down, up)
];
const graphs = {
Parent: {
Real: {
All: up,
"No Unlinked": removeUnlinkedNodes(up)
},
Closed: {
All: closedParentNoSingle,
"No Unlinked": removeUnlinkedNodes(closedParentNoSingle)
}
},
Sibling: {
Real: {
All: same,
"No Unlinked": removeUnlinkedNodes(same)
},
Closed: {
All: closedSiblingNoSingle,
"No Unlinked": removeUnlinkedNodes(closedSiblingNoSingle)
}
},
Child: {
Real: {
All: down,
"No Unlinked": removeUnlinkedNodes(down)
},
Closed: {
All: closedChildNoSingle,
"No Unlinked": removeUnlinkedNodes(closedChildNoSingle)
}
}
};
const types = {
"Force Directed Graph": forceDirectedG,
"Tidy Tree": tidyTree,
"Circle Packing": circlePacking,
"Edge Bundling": edgeBundling,
"Arc Diagram": arcDiagram,
Sunburst: sunburst,
"Tree Map": treeMap,
Icicle: icicle,
"Radial Tree": radialTree
};
function draw(type2) {
if (!document.querySelector(".d3-graph")) {
setTimeout(() => {
var _a;
(_a = document.querySelector(".d3-graph")) === null || _a === void 0 ? void 0 : _a.empty();
try {
types[type2](...argArr);
} catch (error6) {
(0, import_loglevel21.warn)(error6);
}
}, 10);
} else {
document.querySelector(".d3-graph").empty();
try {
types[type2](...argArr);
} catch (error6) {
(0, import_loglevel21.warn)(error6);
}
}
}
function select_change_handler(each_value, each_index) {
each_value[each_index].val = select_value(this);
$$invalidate(0, selectors);
}
$$self.$$set = ($$props2) => {
if ("modal" in $$props2)
$$invalidate(1, modal = $$props2.modal);
};
$$self.$$.update = () => {
if ($$self.$$.dirty & 3) {
$:
argArr = [
graphs[selectors[1].val][selectors[2].val][selectors[3].val],
app,
currFile,
modal,
width,
height
];
}
if ($$self.$$.dirty & 1) {
$:
draw(selectors[0].val);
}
};
return [selectors, modal, select_change_handler];
}
var VisComp = class extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance23, create_fragment23, safe_not_equal, { modal: 1 });
}
};
var VisComp_default = VisComp;
// src/Visualisations/VisModal.ts
function graphlibToD3(g) {
const d3Graph = { nodes: [], links: [] };
const nodeIDs = {};
g.nodes().forEach((node, i) => {
d3Graph.nodes.push({ id: i, name: node });
nodeIDs[node] = i;
});
g.forEachEdge((k, a2, s, t) => {
d3Graph.links.push({
source: nodeIDs[s],
target: nodeIDs[t]
});
});
return d3Graph;
}
function bfsAdjList(g, startNode) {
const queue = [startNode];
const adjList = [];
let i = 0;
while (queue.length && i < 1e3) {
i++;
const currNode = queue.shift();
const neighbours = {
succs: getOutNeighbours(g, currNode),
pres: getInNeighbours(g, currNode)
};
console.log({ currNode, neighbours });
const next = {
name: currNode,
pres: void 0,
succs: void 0,
parentId: i,
depth: i
};
if (neighbours.succs.length) {
next.succs = neighbours.succs;
queue.push(...neighbours.succs);
}
if (neighbours.pres.length) {
next.pres = neighbours.pres;
}
adjList.push(next);
}
const maxDepth = adjList.sort((a2, b) => a2.depth - b.depth).last().depth;
adjList.forEach((item) => item.height = maxDepth - item.depth);
return adjList;
}
function dfsFlatAdjList(g, startNode) {
const nodes = g.nodes();
const nodeCount = nodes.length;
const visits = {};
nodes.forEach((node, i2) => {
visits[node] = nodeCount * i2;
});
const queue = [startNode];
const adjList = [];
let depth = 1;
let i = 0;
while (queue.length && i < 1e3) {
i++;
const currNode = queue.shift();
const next = getOutNeighbours(g, currNode);
if (next.length) {
queue.unshift(...next);
next.forEach((succ) => {
const parentId = nodeCount * nodes.indexOf(succ);
if (!adjList.some((adjItem) => adjItem.name === currNode && adjItem.parentId === parentId)) {
adjList.push({
id: visits[currNode],
name: currNode,
parentId,
depth
});
visits[currNode]++;
}
});
depth++;
} else {
adjList.push({
id: visits[currNode],
name: currNode,
parentId: 999999999,
depth
});
depth = 1;
visits[currNode]++;
}
}
adjList.push({
id: 999999999,
name: "CONTAINER",
parentId: void 0,
depth: 0
});
const maxDepth = adjList.sort((a2, b) => a2.depth - b.depth).last().depth;
adjList.forEach((item) => item.height = maxDepth - item.depth);
console.log({ visits });
return adjList;
}
var stratify = stratify_default().id(function(d) {
console.log({ d });
return d.name;
}).parentId(function(d) {
return d.parentId;
});
var VisModal8 = class extends import_obsidian43.Modal {
constructor(plugin) {
super(app);
this.plugin = plugin;
this.modal = this;
}
onOpen() {
new import_obsidian43.Notice("Alot of these features may not work, it is still very experimental.");
const { contentEl } = this;
contentEl.empty();
new VisComp_default({
target: contentEl,
props: {
modal: this
}
});
}
onClose() {
this.contentEl.empty();
}
};
// src/main.ts
var BCPlugin = class extends import_obsidian44.Plugin {
constructor() {
super(...arguments);
this.visited = [];
this.activeLeafChange = void 0;
this.layoutChange = void 0;
this.loadSettings = async () => this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
this.saveSettings = async () => await this.saveData(this.settings);
}
registerActiveLeafChangeEvent() {
this.activeLeafChange = app.workspace.on("file-open", async () => {
if (this.settings.refreshOnNoteChange)
await refreshIndex(this);
else {
const activeView = this.getActiveTYPEView(MATRIX_VIEW);
if (activeView)
await activeView.draw();
}
});
this.registerEvent(this.activeLeafChange);
}
registerLayoutChangeEvent() {
this.layoutChange = app.workspace.on("layout-change", async () => {
if (this.settings.showBCs)
await drawTrail(this);
});
this.registerEvent(this.layoutChange);
}
async onload() {
console.log("loading breadcrumbs plugin");
await this.loadSettings();
this.addSettingTab(new BCSettingTab(this));
this.db = new Debugger(this);
const { settings } = this;
const {
fieldSuggestor,
enableRelationSuggestor,
openMatrixOnLoad,
openDuckOnLoad,
openDownOnLoad,
showBCs,
userHiers
} = settings;
if (fieldSuggestor)
this.registerEditorSuggest(new FieldSuggestor(this));
if (enableRelationSuggestor)
this.registerEditorSuggest(new RelationSuggestor(this));
if (settings.limitTrailCheckboxes.length === 0)
settings.limitTrailCheckboxes = getFields(settings.userHiers);
if (typeof settings.showAll === "boolean")
settings.showAll = settings.showAll ? "All" : "Shortest";
this.VIEWS = [
{
plain: "Matrix",
type: MATRIX_VIEW,
constructor: MatrixView,
openOnLoad: openMatrixOnLoad
},
{
plain: "Duck",
type: DUCK_VIEW,
constructor: DucksView,
openOnLoad: openDuckOnLoad
},
{
plain: "Down",
type: TREE_VIEW,
constructor: TreeView,
openOnLoad: openDownOnLoad
}
];
for (const { constructor, type: type2 } of this.VIEWS) {
this.registerView(type2, (leaf) => new constructor(leaf, this));
}
(0, import_obsidian44.addIcon)(DUCK_ICON, DUCK_ICON_SVG);
(0, import_obsidian44.addIcon)(TRAIL_ICON, TRAIL_ICON_SVG);
await waitForCache(this);
this.mainG = await buildMainG(this);
this.closedG = buildClosedG(this);
app.workspace.onLayoutReady(async () => {
var _a;
const noFiles = app.vault.getMarkdownFiles().length;
if (((_a = this.mainG) == null ? void 0 : _a.nodes().length) < noFiles) {
await wait(3e3);
this.mainG = await buildMainG(this);
this.closedG = buildClosedG(this);
}
for (const { openOnLoad, type: type2, constructor } of this.VIEWS)
if (openOnLoad)
await openView(type2, constructor);
if (showBCs)
await drawTrail(this);
this.registerActiveLeafChangeEvent();
this.registerLayoutChangeEvent();
const saveCommandDefinition = app.commands.commands["editor:save-file"];
const save = saveCommandDefinition == null ? void 0 : saveCommandDefinition.callback;
if (typeof save === "function") {
saveCommandDefinition.callback = async () => {
await save();
if (this.settings.refreshOnNoteSave) {
await refreshIndex(this);
const activeView = this.getActiveTYPEView(MATRIX_VIEW);
if (activeView)
await activeView.draw();
}
};
}
app.workspace.iterateAllLeaves((leaf) => {
if (leaf instanceof import_obsidian44.MarkdownView)
leaf.view.previewMode.rerender(true);
});
});
for (const { type: type2, plain, constructor } of this.VIEWS) {
this.addCommand({
id: `show-${type2}-view`,
name: `Open ${plain} View`,
checkCallback: async (checking) => {
if (checking)
return app.workspace.getLeavesOfType(type2).length === 0;
await openView(type2, constructor);
}
});
}
this.addCommand({
id: "open-vis-modal",
name: "Open Visualisation Modal",
callback: () => new VisModal8(this).open()
});
this.addCommand({
id: "manipulate-hierarchy-notes",
name: "Adjust Hierarchy Notes",
callback: () => new HierarchyNoteSelectorModal(this).open()
});
this.addCommand({
id: "Refresh-Breadcrumbs-Index",
name: "Refresh Breadcrumbs Index",
callback: async () => await refreshIndex(this)
});
this.addCommand({
id: "Toggle-trail-in-Edit&LP",
name: "Toggle: Show Trail/Grid in Edit & LP mode",
callback: async () => {
settings.showBCsInEditLPMode = !settings.showBCsInEditLPMode;
await this.saveSettings();
await drawTrail(this);
}
});
this.addCommand({
id: "Write-Breadcrumbs-to-Current-File",
name: "Write Breadcrumbs to Current File",
callback: async () => await writeBCToFile(this)
});
this.addCommand({
id: "Write-Breadcrumbs-to-All-Files",
name: "Write Breadcrumbs to **ALL** Files",
callback: async () => await writeBCsToAllFiles(this)
});
this.addCommand({
id: "local-index",
name: "Copy a Local Index to the clipboard",
callback: async () => await copyLocalIndex(this)
});
this.addCommand({
id: "global-index",
name: "Copy a Global Index to the clipboard",
callback: async () => await copyGlobalIndex(this)
});
["up", "down", "next", "prev"].forEach((dir) => {
this.addCommand({
id: `jump-to-first-${dir}`,
name: `Jump to first '${dir}'`,
callback: async () => await jumpToFirstDir(this, dir)
});
});
getFields(userHiers).forEach((field) => {
this.addCommand({
id: `new-file-with-curr-as-${field}`,
name: `Create a new '${field}' from the current note`,
callback: async () => await thread(this, field)
});
});
this.addRibbonIcon(addFeatherIcon("tv"), "Breadcrumbs Visualisation", () => new VisModal8(this).open());
this.registerMarkdownCodeBlockProcessor("breadcrumbs", getCodeblockCB(this));
const jugglPlugin = getPlugin(app);
if (jugglPlugin) {
this.bcStore = new BCStore(this.mainG, app.metadataCache);
jugglPlugin.registerStore(this.bcStore);
}
this.api = new BCAPI(this);
(window[API_NAME] = this.api) && this.register(() => delete window[API_NAME]);
}
getActiveTYPEView(type2) {
const { constructor } = this.VIEWS.find((view) => view.type === type2);
const leaves = app.workspace.getLeavesOfType(type2);
if (leaves && leaves.length >= 1) {
const { view } = leaves[0];
if (view instanceof constructor)
return view;
}
return null;
}
onunload() {
console.log("unloading");
this.VIEWS.forEach(async (view) => {
app.workspace.getLeavesOfType(view.type).forEach((leaf) => {
leaf.detach();
});
});
this.visited.forEach((visit) => visit[1].remove());
if (this.bcStore) {
const jugglPlugin = getPlugin(app);
if (jugglPlugin) {
jugglPlugin.removeStore(this.bcStore);
}
}
}
};
/*!
Copyright (c) 2016 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/**
* @license
* Lodash <https://lodash.com/>
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvd2VicGFjay9ib290c3RyYXAiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2RlZHVwZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZnJvbS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctYXQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3ZhbGlkYXRlLXNldC1wcm90b3R5cGUtb2YtYXJndW1lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2ljb24uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3NyYy9pY29ucy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9zcmMvcmVwbGFjZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL3RvLXN2Zy5qcyIsICJub2RlX21vZHVsZXMvbG9nbGV2ZWwvbGliL2xvZ2xldmVsLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaG9sb2d5L3NyYy91dGlscy5qcyIsICJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICJub2RlX21vZHVsZXMvb2JsaXRlcmF0b3IvaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3N1cHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2l0ZXIuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3Rha2UuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2Vycm9ycy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaW5kaWNlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvYXR0cmlidXRlcy9ub2Rlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvYXR0cmlidXRlcy9lZGdlcy5qcyIsICJub2RlX21vZHVsZXMvb2JsaXRlcmF0b3IvY2hhaW4uanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2l0ZXJhdGlvbi9lZGdlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaXRlcmF0aW9uL25laWdoYm9ycy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaXRlcmF0aW9uL2FkamFjZW5jeS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvc2VyaWFsaXphdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2NsYXNzZXMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdXRpbHMvaXMtZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3N1cHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2ZvcmVhY2guanMiLCAibm9kZV9tb2R1bGVzL21uZW1vbmlzdC91dGlscy90eXBlZC1hcnJheXMuanMiLCAibm9kZV9tb2R1bGVzL21uZW1vbmlzdC91dGlscy9pdGVyYWJsZXMuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2l0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9tbmVtb25pc3QvZml4ZWQtZGVxdWUuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdHJhdmVyc2FsL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaG9sb2d5LXRyYXZlcnNhbC9iZnMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdHJhdmVyc2FsL2Rmcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS10cmF2ZXJzYWwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2Zvcm1hdHMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3V0aWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2VuZ2xpc2guanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2Zvcm1hdHRlci5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvaW52YWxpZC5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL3pvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9zeXN0ZW1ab25lLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvem9uZXMvSUFOQVpvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9maXhlZE9mZnNldFpvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9pbnZhbGlkWm9uZS5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvem9uZVV0aWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9zZXR0aW5ncy5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvbG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9yZWdleFBhcnNlci5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2R1cmF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW50ZXJ2YWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbmZvLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9kaWZmLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9kaWdpdHMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3Rva2VuUGFyc2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9jb252ZXJzaW9ucy5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2RhdGV0aW1lLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvbHV4b24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9sb2Rhc2guanMiLCAic3JjL21haW4udHMiLCAibm9kZV9tb2R1bGVzL2p1Z2dsLWFwaS9kaXN0L2luZGV4Lm1qcyIsICJub2RlX21vZHVsZXMvb2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzLmpzIiwgInNyYy9jb25zdGFudHMudHMiLCAic3JjL1ZpZXdzL01hdHJpeFZpZXcudHMiLCAic3JjL0RlYnVnZ2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvaW50ZXJuYWwvaW5kZXgubWpzIiwgInNyYy9yZWZyZXNoSW5kZXgudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvQ1NWQ3J1bWJzLnRzIiwgInNyYy9VdGlscy9PYnNpZGlhblV0aWxzLnRzIiwgInNyYy9VdGlscy9nZW5lcmFsVXRpbHMudHMiLCAic3JjL1V0aWxzL2dyYXBoVXRpbHMudHMiLCAic3JjL1V0aWxzL0hpZXJVdGlscy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EYXRhdmlld05vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RhdGVOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EZW5kcm9uTm90ZXMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvRm9sZGVyTm90ZXMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSGllcmFyY2h5Tm90ZXMvSGllcmFyY2h5Tm90ZXMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSnVnZ2xMaW5rcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9MaW5rTm90ZXMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvUmVnZXhOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9UYWdOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9UcmF2ZXJzZU5vdGVzLnRzIiwgInNyYy9SZWxhdGlvbnMudHMiLCAic3JjL1ZpZXdzL1RyYWlsVmlldy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvTmV4dFByZXYuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL05leHRQcmV2LnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvVHJhaWxHcmlkLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9UcmFpbEdyaWQuc3ZlbHRlIiwgInNyYy9zcmMvQ29tcG9uZW50cy9UcmFpbFBhdGguc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1RyYWlsUGF0aC5zdmVsdGUiLCAic3JjL1Zpc3VhbGlzYXRpb25zL0p1Z2dsLnRzIiwgInNyYy9Db21tYW5kcy9DcmVhdGVJbmRleC50cyIsICJzcmMvQ29tcG9uZW50cy9KdWdnbEJ1dHRvbi5zdmVsdGUiLCAic3JjL3NyYy9Db21wb25lbnRzL0p1Z2dsQnV0dG9uLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvSnVnZ2xEZXB0aC5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvSnVnZ2xEZXB0aC5zdmVsdGUiLCAic3JjL3NyYy9Db21wb25lbnRzL01hdHJpeEJ1dHRvbnMuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL01hdHJpeEJ1dHRvbnMuc3ZlbHRlIiwgInNyYy9zcmMvQ29tcG9uZW50cy9NYXRyaXguc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL01hdHJpeC5zdmVsdGUiLCAic3JjL0FQSS50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9IaWVyTm90ZU1vZGFsLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0hpZXJhcmNoeU5vdGVzL0hpZXJhcmNoeU5vdGVNYW5pcHVsYXRvci50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9Nb2RpZnlIaWVySXRlbU1vZGFsLnRzIiwgInNyYy9zcmMvQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZSIsICJzcmMvQ29kZWJsb2Nrcy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvUmVuZGVyTWFya2Rvd24uc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1JlbmRlck1hcmtkb3duLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvQ0JUcmVlLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9DQlRyZWUuc3ZlbHRlIiwgInNyYy9Db21tYW5kcy9qdW1wVG9GaXJzdERpci50cyIsICJzcmMvQ29tbWFuZHMvdGhyZWFkaW5nLnRzIiwgInNyYy9Db21tYW5kcy9Xcml0ZUJDcy50cyIsICJzcmMvRmllbGRTdWdnZXN0b3IudHMiLCAic3JjL1JlbGF0aW9uU3VnZ2VzdG9yLnRzIiwgInNyYy9TZXR0aW5ncy9CcmVhZGNydW1ic1NldHRpbmdUYWIudHMiLCAic3JjL0NvbXBvbmVudHMvS29GaS5zdmVsdGUiLCAic3JjL1NldHRpbmdzL0NyZWF0ZUluZGV4U2V0dGluZ3MudHMiLCAic3JjL1NldHRpbmdzL0NTVlNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9EYXRhdmlld05vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvRGF0ZU5vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvRGVidWdnaW5nU2V0dGluZ3MudHMiLCAic3JjL1NldHRpbmdzL0RlbmRyb25TZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvR2VuZXJhbFNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9IaWVyYXJjaHlOb3RlU2V0dGluZ3MudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1VzZXJIaWVyYXJjaGllcy5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvVXNlckhpZXJhcmNoaWVzLnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvc3ZlbHRlLWljb25zL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFMaXN0VWwuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFQbHVzLnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvc3ZlbHRlLWljb25zL2ZhL0ZhUmVnVHJhc2hBbHQuc3ZlbHRlIiwgInNyYy9TZXR0aW5ncy9IaWVyYXJjaHlTZXR0aW5ncy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGUiLCAic3JjL1NldHRpbmdzL0p1bXBUb05leHRTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvTWF0cml4Vmlld1NldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9Ob1N5c3RlbVNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9SZWdleE5vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvUmVsYXRpb25TZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVGFnTm90ZVNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9UaHJlYWRpbmdTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVHJhaWxTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVmlzTW9kYWxTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvV3JpdGVCQ3NTZXR0aW5ncy50cyIsICJzcmMvVmlld3MvRHVja3NWaWV3LnRzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFJbmZvLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvRHVja3Muc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL0R1Y2tzLnN2ZWx0ZSIsICJzcmMvVmlld3MvVHJlZVZpZXcudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1NpZGVUcmVlLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9TaWRlVHJlZS5zdmVsdGUiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS1pY29ucy9mYS9GYUZpcmUuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFSZWdTbm93Zmxha2Uuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0b3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9udW1iZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90aWNrcy5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heC5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3JhbmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY3JlYXRvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbWF0Y2hlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VtcHR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3R5bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi90ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbG93ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5zZXJ0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXR1bS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NvdXJjZUV2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZHJhZy5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2V2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9kcmFnLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9tYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY3ViZWhlbGl4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXJBcnJheS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvZGF0ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlci5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL29iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3ZhbHVlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcm91bmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvem9vbS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2N1YmVoZWxpeC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3F1YW50aXplLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW50ZXJwb2xhdGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vcmVtb3ZlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3RBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlVHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHJhbnNpdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1icnVzaC9zcmMvYnJ1c2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXBhdGgvc3JjL3BhdGguanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9jZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9hZGQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9jb3Zlci5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9leHRlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9xdWFkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvZmluZC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3JlbW92ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3Jvb3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9zaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvdmlzaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy92aXNpdEFmdGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMveC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3kuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9xdWFkdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvamlnZ2xlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvY29sbGlkZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2xpbmsuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9sY2cuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9zaW11bGF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvbWFueUJvZHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0RGVjaW1hbC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRTcGVjaWZpZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRQcmVmaXhBdXRvLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uRml4ZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uUHJlZml4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvblJvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2NsdXN0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2NvdW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoQmVmb3JlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoQWZ0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2ZpbmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3N1bS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvc29ydC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvcGF0aC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvYW5jZXN0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9kZXNjZW5kYW50cy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvbGVhdmVzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9saW5rcy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2FjY2Vzc29ycy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3JvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvZGljZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9wYXJ0aXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvc3RyYXRpZnkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3NsaWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvc3F1YXJpZnkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZW1hcC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2luaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9vcmRpbmFsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvYmFuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY29udGludW91cy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RpY2tGb3JtYXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9saW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvY29sb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL2NhdGVnb3J5MTAuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9yYWluYm93LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9tYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJjLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9saW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9wb2ludC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2xpbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9yYWRpYWwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9saW5lUmFkaWFsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbGluay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2Jhc2lzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvYnVuZGxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvem9vbS5qcyIsICJzcmMvVmlzdWFsaXNhdGlvbnMvVmlzTW9kYWwudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9BcmNEaWFncmFtLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9DaXJjbGVQYWNraW5nLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9FZGdlQnVuZGxpbmcudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL0ZvcmNlRGlyZWN0ZWRHLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9JY2ljbGUudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL1JhZGlhbFRyZWUudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL1N1bmJ1cnN0LnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9UaWR5VHJlZS50cyIsICJzcmMvVmlzdWFsaXNhdGlvbnMvVHJlZU1hcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZmVhdGhlclwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJmZWF0aGVyXCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsICIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwgIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTYgSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBjbGFzc05hbWVzID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvLyBkb24ndCBpbmhlcml0IGZyb20gT2JqZWN0IHNvIHdlIGNhbiBza2lwIGhhc093blByb3BlcnR5IGNoZWNrIGxhdGVyXG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTUxODMyOC9jcmVhdGluZy1qcy1vYmplY3Qtd2l0aC1vYmplY3QtY3JlYXRlbnVsbCNhbnN3ZXItMjEwNzkyMzJcblx0XHRmdW5jdGlvbiBTdG9yYWdlT2JqZWN0KCkge31cblx0XHRTdG9yYWdlT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0XHRmdW5jdGlvbiBfcGFyc2VBcnJheSAocmVzdWx0U2V0LCBhcnJheSkge1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHRfcGFyc2UocmVzdWx0U2V0LCBhcnJheVtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdFx0ZnVuY3Rpb24gX3BhcnNlTnVtYmVyIChyZXN1bHRTZXQsIG51bSkge1xuXHRcdFx0cmVzdWx0U2V0W251bV0gPSB0cnVlO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIF9wYXJzZU9iamVjdCAocmVzdWx0U2V0LCBvYmplY3QpIHtcblx0XHRcdGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChvYmplY3QsIGspKSB7XG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlIHRvIGZhbHNlIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQgdG8gYXZvaWQgY2hhbmdpbmcgb2JqZWN0IHN0cnVjdHVyZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vd3d3LnNtYXNoaW5nbWFnYXppbmUuY29tLzIwMTIvMTEvd3JpdGluZy1mYXN0LW1lbW9yeS1lZmZpY2llbnQtamF2YXNjcmlwdC8jZGUtcmVmZXJlbmNpbmctbWlzY29uY2VwdGlvbnNcblx0XHRcdFx0XHRyZXN1bHRTZXRba10gPSAhIW9iamVjdFtrXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBTUEFDRSA9IC9cXHMrLztcblx0XHRmdW5jdGlvbiBfcGFyc2VTdHJpbmcgKHJlc3VsdFNldCwgc3RyKSB7XG5cdFx0XHR2YXIgYXJyYXkgPSBzdHIuc3BsaXQoU1BBQ0UpO1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHRyZXN1bHRTZXRbYXJyYXlbaV1dID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfcGFyc2UgKHJlc3VsdFNldCwgYXJnKSB7XG5cdFx0XHRpZiAoIWFyZykgcmV0dXJuO1xuXHRcdFx0dmFyIGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuXG5cdFx0XHQvLyAnZm9vIGJhcidcblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRfcGFyc2VTdHJpbmcocmVzdWx0U2V0LCBhcmcpO1xuXG5cdFx0XHQvLyBbJ2ZvbycsICdiYXInLCAuLi5dXG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0XHRfcGFyc2VBcnJheShyZXN1bHRTZXQsIGFyZyk7XG5cblx0XHRcdC8vIHsgJ2Zvbyc6IHRydWUsIC4uLiB9XG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdF9wYXJzZU9iamVjdChyZXN1bHRTZXQsIGFyZyk7XG5cblx0XHRcdC8vICcxMzAnXG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdF9wYXJzZU51bWJlcihyZXN1bHRTZXQsIGFyZyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gX2NsYXNzTmFtZXMgKCkge1xuXHRcdFx0Ly8gZG9uJ3QgbGVhayBhcmd1bWVudHNcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRrYWFudG9ub3YvYmx1ZWJpcmQvd2lraS9PcHRpbWl6YXRpb24ta2lsbGVycyMzMi1sZWFraW5nLWFyZ3VtZW50c1xuXHRcdFx0dmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgYXJncyA9IEFycmF5KGxlbik7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjbGFzc1NldCA9IG5ldyBTdG9yYWdlT2JqZWN0KCk7XG5cdFx0XHRfcGFyc2VBcnJheShjbGFzc1NldCwgYXJncyk7XG5cblx0XHRcdHZhciBsaXN0ID0gW107XG5cblx0XHRcdGZvciAodmFyIGsgaW4gY2xhc3NTZXQpIHtcblx0XHRcdFx0aWYgKGNsYXNzU2V0W2tdKSB7XG5cdFx0XHRcdFx0bGlzdC5wdXNoKGspXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxpc3Quam9pbignICcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBfY2xhc3NOYW1lcztcblx0fSkoKTtcblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwgInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEMoKTtcbiAgICBmb3IgKDshKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmdcbiAgICAgICAgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSlcbiAgICAgICAgOiBzdGVwLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxuLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwgInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwgInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuICB0cnkge1xuICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCAidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCAidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwgInZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIiwgInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvckNvbnN0cnVjdG9yLCBUT19TVFJJTkdfVEFHLCBmYWxzZSwgdHJ1ZSk7XG4gIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBoaWRlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGhpZGUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBleGlzdCA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGV4aXN0ID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCAiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgaGlkZShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsICJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNoYXJlZCgnbmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZycsIEZ1bmN0aW9uLnRvU3RyaW5nKTtcbiIsICJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCAidmFyIE8gPSAnb2JqZWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09IE8gJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSBPICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gTyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09IE8gJiYgZ2xvYmFsKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiIsICJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcblxubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCAidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9IDc7XG59KTtcbiIsICIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQuY2FsbChpdCwgJycpIDogT2JqZWN0KGl0KTtcbn0gOiBPYmplY3Q7XG4iLCAidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCkge1xuICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGhpZGUoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCAidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbmlmIChJdGVyYXRvclByb3RvdHlwZSA9PSB1bmRlZmluZWQpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5pZiAoIUlTX1BVUkUgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgbmF0aXZlRnVuY3Rpb25Ub1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QobmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKFdlYWtNYXApKTtcbiIsICJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBzY3JpcHQgPSAnc2NyaXB0JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhqcyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyBzY3JpcHQgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvJyArIHNjcmlwdCArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaSsrXSwgUHJvcGVydGllc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG5cbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCAiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwgImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsICJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBhcnJheUluZGV4T2YgPSBhcnJheUluY2x1ZGVzKGZhbHNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsICJ2YXIgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cycpO1xuXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb3JyZWN0U2V0dGVyID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBjb3JyZWN0U2V0dGVyID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIHZhbGlkYXRlU2V0UHJvdG90eXBlT2ZBcmd1bWVudHMoTywgcHJvdG8pO1xuICAgIGlmIChjb3JyZWN0U2V0dGVyKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgUmVmbGVjdCA9IGdsb2JhbC5SZWZsZWN0O1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhuYXRpdmVGdW5jdGlvblRvU3RyaW5nKS5zcGxpdCgndG9TdHJpbmcnKTtcblxuc2hhcmVkKCdpbnNwZWN0U291cmNlJywgZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoaXQpO1xufSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgaGlkZSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBoaWRlKE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsICIvLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgaGlkZShnbG9iYWwsIGtleSwgdmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsICJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwgInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjEuMycsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnXHUwMEE5IDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsICJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBDT05WRVJUX1RPX1NUUklORzogdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBDT05WRVJUX1RPX1NUUklORzogZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBwb3MsIENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbn07XG4iLCAidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihsZW5ndGgsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwgIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iLCAidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwgInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCAidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxuLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsICJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNikpO1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhwcm90bykgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH1cbn07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdXG4gICAgfHwgKE5BVElWRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG4iLCAidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSBjb2RlUG9pbnRBdChzdHJpbmcsIGluZGV4LCB0cnVlKTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsICJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsICJpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBERUZBVUxUX0FUVFJTIGZyb20gJy4vZGVmYXVsdC1hdHRycy5qc29uJztcblxuY2xhc3MgSWNvbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbnRlbnRzLCB0YWdzID0gW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29udGVudHMgPSBjb250ZW50cztcbiAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIHRoaXMuYXR0cnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0FUVFJTLFxuICAgICAgLi4ueyBjbGFzczogYGZlYXRoZXIgZmVhdGhlci0ke25hbWV9YCB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNWRyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdmcoYXR0cnMgPSB7fSkge1xuICAgIGNvbnN0IGNvbWJpbmVkQXR0cnMgPSB7XG4gICAgICAuLi50aGlzLmF0dHJzLFxuICAgICAgLi4uYXR0cnMsXG4gICAgICAuLi57IGNsYXNzOiBjbGFzc25hbWVzKHRoaXMuYXR0cnMuY2xhc3MsIGF0dHJzLmNsYXNzKSB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gYDxzdmcgJHthdHRyc1RvU3RyaW5nKGNvbWJpbmVkQXR0cnMpfT4ke3RoaXMuY29udGVudHN9PC9zdmc+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBJY29uYC5cbiAgICpcbiAgICogQWRkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIElmIG9sZCBjb2RlIGV4cGVjdHMgYGZlYXRoZXIuaWNvbnMuPG5hbWU+YFxuICAgKiB0byBiZSBhIHN0cmluZywgYHRvU3RyaW5nKClgIHdpbGwgZ2V0IGltcGxpY2l0bHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGF0dHJpYnV0ZXMgb2JqZWN0IHRvIHN0cmluZyBvZiBIVE1MIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJzVG9TdHJpbmcoYXR0cnMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoa2V5ID0+IGAke2tleX09XCIke2F0dHJzW2tleV19XCJgKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEljb247XG4iLCAiaW1wb3J0IEljb24gZnJvbSAnLi9pY29uJztcbmltcG9ydCBpY29ucyBmcm9tICcuLi9kaXN0L2ljb25zLmpzb24nO1xuaW1wb3J0IHRhZ3MgZnJvbSAnLi90YWdzLmpzb24nO1xuXG5leHBvcnQgZGVmYXVsdCBPYmplY3Qua2V5cyhpY29ucylcbiAgLm1hcChrZXkgPT4gbmV3IEljb24oa2V5LCBpY29uc1trZXldLCB0YWdzW2tleV0pKVxuICAucmVkdWNlKChvYmplY3QsIGljb24pID0+IHtcbiAgICBvYmplY3RbaWNvbi5uYW1lXSA9IGljb247XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSwge30pO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcbmltcG9ydCB0b1N2ZyBmcm9tICcuL3RvLXN2Zyc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICcuL3JlcGxhY2UnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgaWNvbnMsIHRvU3ZnLCByZXBsYWNlIH07XG4iLCAiLyogZXNsaW50LWVudiBicm93c2VyICovXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBSZXBsYWNlIGFsbCBIVE1MIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGBkYXRhLWZlYXRoZXJgIGF0dHJpYnV0ZSB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZShhdHRycyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZmVhdGhlci5yZXBsYWNlKClgIG9ubHkgd29ya3MgaW4gYSBicm93c2VyIGVudmlyb25tZW50LicpO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudHNUb1JlcGxhY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1mZWF0aGVyXScpO1xuXG4gIEFycmF5LmZyb20oZWxlbWVudHNUb1JlcGxhY2UpLmZvckVhY2goZWxlbWVudCA9PlxuICAgIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIGF0dHJzKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGEgc2luZ2xlIEhUTUwgZWxlbWVudCB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgYXR0cnMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50QXR0cnMgPSBnZXRBdHRycyhlbGVtZW50KTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnRBdHRyc1snZGF0YS1mZWF0aGVyJ107XG4gIGRlbGV0ZSBlbGVtZW50QXR0cnNbJ2RhdGEtZmVhdGhlciddO1xuXG4gIGNvbnN0IHN2Z1N0cmluZyA9IGljb25zW25hbWVdLnRvU3ZnKHtcbiAgICAuLi5hdHRycyxcbiAgICAuLi5lbGVtZW50QXR0cnMsXG4gICAgLi4ueyBjbGFzczogY2xhc3NuYW1lcyhhdHRycy5jbGFzcywgZWxlbWVudEF0dHJzLmNsYXNzKSB9LFxuICB9KTtcbiAgY29uc3Qgc3ZnRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgIHN2Z1N0cmluZyxcbiAgICAnaW1hZ2Uvc3ZnK3htbCcsXG4gICk7XG4gIGNvbnN0IHN2Z0VsZW1lbnQgPSBzdmdEb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcblxuICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHN2Z0VsZW1lbnQsIGVsZW1lbnQpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBIVE1MIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRBdHRycyhlbGVtZW50KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcykucmVkdWNlKChhdHRycywgYXR0cikgPT4ge1xuICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIHJldHVybiBhdHRycztcbiAgfSwge30pO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gU1ZHIHN0cmluZy5cbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB0b1N2ZyhuYW1lLCBhdHRycyA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICAnZmVhdGhlci50b1N2ZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZygpIGluc3RlYWQuJyxcbiAgKTtcblxuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByZXF1aXJlZCBga2V5YCAoaWNvbiBuYW1lKSBwYXJhbWV0ZXIgaXMgbWlzc2luZy4nKTtcbiAgfVxuXG4gIGlmICghaWNvbnNbbmFtZV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gaWNvbiBtYXRjaGluZyAnJHtcbiAgICAgICAgbmFtZVxuICAgICAgfScuIFNlZSB0aGUgY29tcGxldGUgbGlzdCBvZiBpY29ucyBhdCBodHRwczovL2ZlYXRoZXJpY29ucy5jb21gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaWNvbnNbbmFtZV0udG9TdmcoYXR0cnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1N2ZztcbiIsICIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcyhsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBsb2cubG9nIGFzIGFuIGFsaWFzIGZvciBsb2cuZGVidWdcbiAgICAgICAgdGhpcy5sb2cgPSB0aGlzLmRlYnVnO1xuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSwgbGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHRoaXMsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGRlZmF1bHRMZXZlbCwgZmFjdG9yeSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGN1cnJlbnRMZXZlbDtcbiAgICAgIGRlZmF1bHRMZXZlbCA9IGRlZmF1bHRMZXZlbCA9PSBudWxsID8gXCJXQVJOXCIgOiBkZWZhdWx0TGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjbGVhclBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudExldmVsO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUobGV2ZWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYsIGxldmVsLCBuYW1lKTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgXCJsb2cuc2V0TGV2ZWwoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGxldmVsOiBcIiArIGxldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0RGVmYXVsdExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgICAgZGVmYXVsdExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5zZXRMZXZlbChkZWZhdWx0TGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIHJpZ2h0IGxldmVsXG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGluaXRpYWxMZXZlbCA9IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICgodHlwZW9mIG5hbWUgIT09IFwic3ltYm9sXCIgJiYgdHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHx8IG5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICBuYW1lLCBkZWZhdWx0TG9nZ2VyLmdldExldmVsKCksIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBVdGlsaXRpZXNcbiAqID09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIENvbGxlY3Rpb24gb2YgaGVscGZ1bCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBPYmplY3QuYXNzaWduLWxpa2UgcG9seWZpbGwuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSB0YXJnZXQgICAgICAgLSBGaXJzdCBvYmplY3QuXG4gKiBAcGFyYW0gIHtvYmplY3R9IFsuLi5vYmplY3RzXSAtIE9iamVjdHMgdG8gbWVyZ2UuXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGFzc2lnblBvbHlmaWxsKCkge1xuICBjb25zdCB0YXJnZXQgPSBhcmd1bWVudHNbMF07XG5cbiAgZm9yIChsZXQgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKCFhcmd1bWVudHNbaV0pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBrIGluIGFyZ3VtZW50c1tpXSkgdGFyZ2V0W2tdID0gYXJndW1lbnRzW2ldW2tdO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubGV0IGFzc2lnbiA9IGFzc2lnblBvbHlmaWxsO1xuXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicpIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbmV4cG9ydCB7YXNzaWdufTtcblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZpcnN0IG1hdGNoaW5nIGVkZ2UgZm9yIGdpdmVuIHBhdGguXG4gKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSBleGlzdGVuY2Ugb2Ygc291cmNlICYgdGFyZ2V0LiBUaGlzXG4gKiBtdXN0IGJlIHBlcmZvcm1lZCBieSB0aGUgY2FsbGVyLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgZ3JhcGggIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7YW55fSAgICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAqIEBwYXJhbSAge2FueX0gICAgdGFyZ2V0IC0gVGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGUgICAtIFR5cGUgb2YgdGhlIGVkZ2UgKG1peGVkLCBkaXJlY3RlZCBvciB1bmRpcmVjdGVkKS5cbiAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdFZGdlKGdyYXBoLCBzb3VyY2UsIHRhcmdldCwgdHlwZSkge1xuICBjb25zdCBzb3VyY2VEYXRhID0gZ3JhcGguX25vZGVzLmdldChzb3VyY2UpO1xuXG4gIGxldCBlZGdlID0gbnVsbDtcblxuICBpZiAoIXNvdXJjZURhdGEpIHJldHVybiBlZGdlO1xuXG4gIGlmICh0eXBlID09PSAnbWl4ZWQnKSB7XG4gICAgZWRnZSA9XG4gICAgICAoc291cmNlRGF0YS5vdXQgJiYgc291cmNlRGF0YS5vdXRbdGFyZ2V0XSkgfHxcbiAgICAgIChzb3VyY2VEYXRhLnVuZGlyZWN0ZWQgJiYgc291cmNlRGF0YS51bmRpcmVjdGVkW3RhcmdldF0pO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkaXJlY3RlZCcpIHtcbiAgICBlZGdlID0gc291cmNlRGF0YS5vdXQgJiYgc291cmNlRGF0YS5vdXRbdGFyZ2V0XTtcbiAgfSBlbHNlIHtcbiAgICBlZGdlID0gc291cmNlRGF0YS51bmRpcmVjdGVkICYmIHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgR3JhcGggaW1wbGVtZW50YXRpb24gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICAgdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmFwaCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB2YWx1ZS5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUuZHJvcE5vZGUgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICAgdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgbyAtIFRhcmdldCBPYmplY3QuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvKSB7XG4gIGxldCBrO1xuXG4gIGZvciAoayBpbiBvKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFwicHJpdmF0ZVwiIHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgYnkgY29uY2VhbGluZyBpdFxuICogdXNpbmcgdGhlIGBlbnVtZXJhYmxlYCBvcHRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAgIC0gTWVtYmVyIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgJiB0aGUgZ2l2ZW4gZ2V0dGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgIHRhcmdldCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgLSBNZW1iZXIgbmFtZS5cbiAqIEBwYXJhbSB7bWl4ZWR9ICAgIHZhbHVlICAtIFRoZSBhdHRhY2hlZCBnZXR0ZXIgb3IgZml4ZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkT25seVByb3BlcnR5KHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9O1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZXNjcmlwdG9yLmdldCA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSB2YWx1ZTtcbiAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCBkZXNjcmlwdG9yKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBjb25zdGl0dXRlIHZhbGlkIGhpbnRzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBoaW50cyAtIFRhcmdldCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUhpbnRzKGhpbnRzKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChoaW50cykpIHJldHVybiBmYWxzZTtcblxuICBpZiAoaGludHMuYXR0cmlidXRlcyAmJiAhQXJyYXkuaXNBcnJheShoaW50cy5hdHRyaWJ1dGVzKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBnZW5lcmF0aW5nIGluY3JlbWVudGFsIGlkcyBmb3IgZWRnZXMuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRhbElkU3RhcnRpbmdGcm9tUmFuZG9tQnl0ZSgpIHtcbiAgbGV0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpICYgMHhmZjtcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIHJldHVybiBpKys7XG4gIH07XG59XG4iLCAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIEl0ZXJhdG9yIENsYXNzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBTaW1wbGUgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBsaWJyYXJ5J3MgaXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogSXRlcmF0b3IgY2xhc3MuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0IC0gTmV4dCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gSXRlcmF0b3IobmV4dCkge1xuICBpZiAodHlwZW9mIG5leHQgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9pdGVyYXRvcjogZXhwZWN0aW5nIGEgZnVuY3Rpb24hJyk7XG5cbiAgdGhpcy5uZXh0ID0gbmV4dDtcbn1cblxuLyoqXG4gKiBJZiBzeW1ib2xzIGFyZSBzdXBwb3J0ZWQsIHdlIGFkZCBgbmV4dGAgdG8gYFN5bWJvbC5pdGVyYXRvcmAuXG4gKi9cbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJylcbiAgSXRlcmF0b3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9mIHRoZSBnaXZlbiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtICB7YW55Li4ufSB2YWx1ZXMgLSBWYWx1ZXMuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuSXRlcmF0b3Iub2YgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgIGwgPSBhcmdzLmxlbmd0aCxcbiAgICBpID0gMDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IGFyZ3NbaSsrXX07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gZW1wdHkgaXRlcmF0b3IuXG4gKlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkl0ZXJhdG9yLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7ZG9uZTogdHJ1ZX07XG4gIH0pO1xuXG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5cbi8qKlxuICogUmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGdpdmVuIGluZGV4ZWQgc2VxdWVuY2UuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfEFycmF5fSBzZXF1ZW5jZSAtIFRhcmdldCBzZXF1ZW5jZS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5JdGVyYXRvci5mcm9tU2VxdWVuY2UgPSBmdW5jdGlvbiAoc2VxdWVuY2UpIHtcbiAgdmFyIGkgPSAwLFxuICAgIGwgPSBzZXF1ZW5jZS5sZW5ndGg7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGkgPj0gbCkgcmV0dXJuIHtkb25lOiB0cnVlfTtcblxuICAgIHJldHVybiB7ZG9uZTogZmFsc2UsIHZhbHVlOiBzZXF1ZW5jZVtpKytdfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gIHthbnl9IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5JdGVyYXRvci5pcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVyYXRvcikgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUubmV4dCA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufTtcblxuLyoqXG4gKiBFeHBvcnRpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gSXRlcmF0b3I7XG4iLCAiZXhwb3J0cy5BUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCc7XG5leHBvcnRzLlNZTUJPTF9TVVBQT1JUID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCc7XG4iLCAiLyoqXG4gKiBPYmxpdGVyYXRvciBJdGVyIEZ1bmN0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEZ1bmN0aW9uIGNvZXJjaW5nIHZhbHVlcyB0byBhbiBpdGVyYXRvci4gSXQgY2FuIGJlIHF1aXRlIHVzZWZ1bCB3aGVuIG5lZWRpbmdcbiAqIHRvIGhhbmRsZSBpdGVyYWJsZXMgYW5kIGl0ZXJhdG9ycyB0aGUgc2FtZSB3YXkuXG4gKi9cbnZhciBJdGVyYXRvciA9IHJlcXVpcmUoJy4vaXRlcmF0b3IuanMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0LmpzJyk7XG5cbnZhciBBUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHN1cHBvcnQuQVJSQVlfQlVGRkVSX1NVUFBPUlQ7XG52YXIgU1lNQk9MX1NVUFBPUlQgPSBzdXBwb3J0LlNZTUJPTF9TVVBQT1JUO1xuXG5mdW5jdGlvbiBpdGVyT3JOdWxsKHRhcmdldCkge1xuICAvLyBJbmRleGVkIHNlcXVlbmNlXG4gIGlmIChcbiAgICB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyB8fFxuICAgIEFycmF5LmlzQXJyYXkodGFyZ2V0KSB8fFxuICAgIChBUlJBWV9CVUZGRVJfU1VQUE9SVCAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodGFyZ2V0KSlcbiAgKVxuICAgIHJldHVybiBJdGVyYXRvci5mcm9tU2VxdWVuY2UodGFyZ2V0KTtcblxuICAvLyBJbnZhbGlkIHZhbHVlXG4gIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0JyB8fCB0YXJnZXQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIC8vIEl0ZXJhYmxlXG4gIGlmIChTWU1CT0xfU1VQUE9SVCAmJiB0eXBlb2YgdGFyZ2V0W1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5cbiAgLy8gSXRlcmF0b3IgZHVjay10eXBpbmdcbiAgaWYgKHR5cGVvZiB0YXJnZXQubmV4dCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRhcmdldDtcblxuICAvLyBJbnZhbGlkIG9iamVjdFxuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpdGVyKHRhcmdldCkge1xuICB2YXIgaXRlcmF0b3IgPSBpdGVyT3JOdWxsKHRhcmdldCk7XG5cbiAgaWYgKCFpdGVyYXRvcilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnb2JsaXRlcmF0b3I6IHRhcmdldCBpcyBub3QgaXRlcmFibGUgbm9yIGEgdmFsaWQgaXRlcmF0b3IuJ1xuICAgICk7XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcbiIsICIvKiBlc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiAwICovXG4vKipcbiAqIE9ibGl0ZXJhdG9yIFRha2UgRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogRnVuY3Rpb24gdGFraW5nIG4gb3IgZXZlcnkgdmFsdWUgb2YgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCByZXR1cm5zIHRoZW1cbiAqIGludG8gYW4gYXJyYXkuXG4gKi9cbnZhciBpdGVyID0gcmVxdWlyZSgnLi9pdGVyLmpzJyk7XG5cbi8qKlxuICogVGFrZS5cbiAqXG4gKiBAcGFyYW0gIHtJdGVyYWJsZX0gaXRlcmFibGUgLSBUYXJnZXQgaXRlcmFibGUuXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgW25dICAgICAgLSBPcHRpb25hbCBudW1iZXIgb2YgaXRlbXMgdG8gdGFrZS5cbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRha2UoaXRlcmFibGUsIG4pIHtcbiAgdmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IG4gOiBJbmZpbml0eSxcbiAgICBhcnJheSA9IGwgIT09IEluZmluaXR5ID8gbmV3IEFycmF5KGwpIDogW10sXG4gICAgc3RlcCxcbiAgICBpID0gMDtcblxuICB2YXIgaXRlcmF0b3IgPSBpdGVyKGl0ZXJhYmxlKTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChpID09PSBsKSByZXR1cm4gYXJyYXk7XG5cbiAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgaWYgKGkgIT09IG4pIGFycmF5Lmxlbmd0aCA9IGk7XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICBhcnJheVtpKytdID0gc3RlcC52YWx1ZTtcbiAgfVxufTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgQ3VzdG9tIEVycm9yc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIERlZmluaW5nIGN1c3RvbSBlcnJvcnMgZm9yIGVhc2Ugb2YgdXNlICYgZWFzeSB1bml0IHRlc3RzIGFjcm9zc1xuICogaW1wbGVtZW50YXRpb25zIChub3JtYWxpemVkIHR5cG9sb2d5IHJhdGhlciB0aGFuIHJlbHlpbmcgb24gZXJyb3JcbiAqIG1lc3NhZ2VzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNvcnJlY3QgZXJyb3Igd2FzIGZvdW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubmFtZSA9ICdHcmFwaEVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvciBleHRlbmRzIEdyYXBoRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yJztcblxuICAgIC8vIFRoaXMgaXMgVjggc3BlY2lmaWMgdG8gZW5oYW5jZSBzdGFjayByZWFkYWJpbGl0eVxuICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09ICdmdW5jdGlvbicpXG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yXG4gICAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEdyYXBoRXJyb3IgZXh0ZW5kcyBHcmFwaEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdOb3RGb3VuZEdyYXBoRXJyb3InO1xuXG4gICAgLy8gVGhpcyBpcyBWOCBzcGVjaWZpYyB0byBlbmhhbmNlIHN0YWNrIHJlYWRhYmlsaXR5XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdEZvdW5kR3JhcGhFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVc2FnZUdyYXBoRXJyb3IgZXh0ZW5kcyBHcmFwaEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdVc2FnZUdyYXBoRXJyb3InO1xuXG4gICAgLy8gVGhpcyBpcyBWOCBzcGVjaWZpYyB0byBlbmhhbmNlIHN0YWNrIHJlYWRhYmlsaXR5XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFVzYWdlR3JhcGhFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBHcmFwaG9sb2d5IEludGVybmFsIERhdGEgQ2xhc3Nlc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogSW50ZXJuYWwgY2xhc3NlcyBob3BlZnVsbHkgcmVkdWNlZCB0byBzdHJ1Y3RzIGJ5IGVuZ2luZXMgJiBzdG9yaW5nXG4gKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIG5vZGVzICYgZWRnZXMuXG4gKlxuICogTm90ZSB0aGF0IHRob3NlIGNsYXNzZXMgZG9uJ3QgcmVseSBvbiB0aGUgYGNsYXNzYCBrZXl3b3JkIHRvIGF2b2lkIHNvbWVcbiAqIGNydWZ0IGludHJvZHVjZWQgYnkgbW9zdCBvZiBFUzIwMTUgdHJhbnNwaWxlcnMuXG4gKi9cblxuLyoqXG4gKiBNaXhlZE5vZGVEYXRhIGNsYXNzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTm9kZSdzIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNaXhlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuTWl4ZWROb2RlRGF0YS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIERlZ3JlZXNcbiAgdGhpcy5pbkRlZ3JlZSA9IDA7XG4gIHRoaXMub3V0RGVncmVlID0gMDtcbiAgdGhpcy51bmRpcmVjdGVkRGVncmVlID0gMDtcbiAgdGhpcy5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG4gIHRoaXMudW5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG5cbiAgLy8gSW5kaWNlc1xuICB0aGlzLmluID0ge307XG4gIHRoaXMub3V0ID0ge307XG4gIHRoaXMudW5kaXJlY3RlZCA9IHt9O1xufTtcblxuLyoqXG4gKiBEaXJlY3RlZE5vZGVEYXRhIGNsYXNzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTm9kZSdzIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEaXJlY3RlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuRGlyZWN0ZWROb2RlRGF0YS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIERlZ3JlZXNcbiAgdGhpcy5pbkRlZ3JlZSA9IDA7XG4gIHRoaXMub3V0RGVncmVlID0gMDtcbiAgdGhpcy5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG5cbiAgLy8gSW5kaWNlc1xuICB0aGlzLmluID0ge307XG4gIHRoaXMub3V0ID0ge307XG59O1xuXG5EaXJlY3RlZE5vZGVEYXRhLnByb3RvdHlwZS51cGdyYWRlVG9NaXhlZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVncmVlc1xuICB0aGlzLnVuZGlyZWN0ZWREZWdyZWUgPSAwO1xuICB0aGlzLnVuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy51bmRpcmVjdGVkID0ge307XG59O1xuXG4vKipcbiAqIFVuZGlyZWN0ZWROb2RlRGF0YSBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyAtIE5vZGUncyBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVW5kaXJlY3RlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuVW5kaXJlY3RlZE5vZGVEYXRhLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVncmVlc1xuICB0aGlzLnVuZGlyZWN0ZWREZWdyZWUgPSAwO1xuICB0aGlzLnVuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy51bmRpcmVjdGVkID0ge307XG59O1xuXG5VbmRpcmVjdGVkTm9kZURhdGEucHJvdG90eXBlLnVwZ3JhZGVUb01peGVkID0gZnVuY3Rpb24gKCkge1xuICAvLyBEZWdyZWVzXG4gIHRoaXMuaW5EZWdyZWUgPSAwO1xuICB0aGlzLm91dERlZ3JlZSA9IDA7XG4gIHRoaXMuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy5pbiA9IHt9O1xuICB0aGlzLm91dCA9IHt9O1xufTtcblxuLyoqXG4gKiBFZGdlRGF0YSBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9ICBzdHJpbmcgICAgICAgLSBUaGUgZWRnZSdzIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgc291cmNlICAgICAgIC0gU291cmNlIG9mIHRoZSBlZGdlLlxuICogQHBhcmFtIHtzdHJpbmd9ICB0YXJnZXQgICAgICAgLSBUYXJnZXQgb2YgdGhlIGVkZ2UuXG4gKiBAcGFyYW0ge29iamVjdH0gIGF0dHJpYnV0ZXMgICAtIEVkZ2UncyBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRWRnZURhdGEodW5kaXJlY3RlZCwga2V5LCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICB0aGlzLnVuZGlyZWN0ZWQgPSB1bmRpcmVjdGVkO1xuXG4gIC8vIEV4dHJlbWl0aWVzXG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgSW5kZXhlcyBGdW5jdGlvbnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQnVuY2ggb2YgZnVuY3Rpb25zIHVzZWQgdG8gY29tcHV0ZSBvciBjbGVhciBpbmRleGVzLlxuICovXG5cbi8qKlxuICogRnVuY3Rpb24gdXBkYXRpbmcgdGhlICdzdHJ1Y3R1cmUnIGluZGV4IHdpdGggdGhlIGdpdmVuIGVkZ2UncyBkYXRhLlxuICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIHRoZSBtdWx0aSBncmFwaCwgcmVsYXRlZCBlZGdlcyBhcmUgc3RvcmVkIGluIGFcbiAqIHNldCB0aGF0IGlzIHRoZSBzYW1lIGZvciBBIC0+IEIgJiBCIDwtIEEuXG4gKlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7RWRnZURhdGF9IGVkZ2VEYXRhICAgLSBBZGRlZCBlZGdlJ3MgZGF0YS5cbiAqIEBwYXJhbSB7Tm9kZURhdGF9IHNvdXJjZURhdGEgLSBTb3VyY2Ugbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0ge05vZGVEYXRhfSB0YXJnZXREYXRhIC0gVGFyZ2V0IG5vZGUncyBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RydWN0dXJlSW5kZXgoXG4gIGdyYXBoLFxuICB1bmRpcmVjdGVkLFxuICBlZGdlRGF0YSxcbiAgc291cmNlLFxuICB0YXJnZXQsXG4gIHNvdXJjZURhdGEsXG4gIHRhcmdldERhdGFcbikge1xuICBjb25zdCBtdWx0aSA9IGdyYXBoLm11bHRpO1xuXG4gIGxldCBvdXRLZXkgPSAnb3V0JztcbiAgbGV0IGluS2V5ID0gJ2luJztcblxuICBpZiAodW5kaXJlY3RlZCkgb3V0S2V5ID0gaW5LZXkgPSAndW5kaXJlY3RlZCc7XG5cbiAgbGV0IGFkaiwgY29udGFpbmVyO1xuXG4gIGlmIChtdWx0aSkge1xuICAgIC8vIEhhbmRsaW5nIHNvdXJjZVxuICAgIGFkaiA9IHNvdXJjZURhdGFbb3V0S2V5XTtcbiAgICBjb250YWluZXIgPSBhZGpbdGFyZ2V0XTtcblxuICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29udGFpbmVyID0gbmV3IFNldCgpO1xuICAgICAgYWRqW3RhcmdldF0gPSBjb250YWluZXI7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLmFkZChlZGdlRGF0YSk7XG5cbiAgICAvLyBJZiBzZWxmTG9vcCwgd2UgYnJlYWsgaGVyZVxuICAgIGlmIChzb3VyY2UgPT09IHRhcmdldCAmJiB1bmRpcmVjdGVkKSByZXR1cm47XG5cbiAgICAvLyBIYW5kbGluZyB0YXJnZXQgKHdlIHdvbid0IGFkZCB0aGUgZWRnZSBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHRha2VuXG4gICAgLy8gY2FyZSBvZiB3aXRoIHNvdXJjZSBhYm92ZSlcbiAgICBhZGogPSB0YXJnZXREYXRhW2luS2V5XTtcbiAgICBpZiAodHlwZW9mIGFkaltzb3VyY2VdID09PSAndW5kZWZpbmVkJykgYWRqW3NvdXJjZV0gPSBjb250YWluZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gSGFuZGxpbmcgc291cmNlXG4gICAgc291cmNlRGF0YVtvdXRLZXldW3RhcmdldF0gPSBlZGdlRGF0YTtcblxuICAgIC8vIElmIHNlbGZMb29wLCB3ZSBicmVhayBoZXJlXG4gICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0ICYmIHVuZGlyZWN0ZWQpIHJldHVybjtcblxuICAgIC8vIEhhbmRsaW5nIHRhcmdldFxuICAgIHRhcmdldERhdGFbaW5LZXldW3NvdXJjZV0gPSBlZGdlRGF0YTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNsZWFyaW5nIHRoZSAnc3RydWN0dXJlJyBpbmRleCBkYXRhIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGVkZ2UuXG4gKlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0VkZ2VEYXRhfSBlZGdlRGF0YSAtIERyb3BwZWQgZWRnZSdzIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVkZ2VGcm9tU3RydWN0dXJlSW5kZXgoZ3JhcGgsIHVuZGlyZWN0ZWQsIGVkZ2VEYXRhKSB7XG4gIGNvbnN0IG11bHRpID0gZ3JhcGgubXVsdGk7XG5cbiAgY29uc3Qge3NvdXJjZTogc291cmNlRGF0YSwgdGFyZ2V0OiB0YXJnZXREYXRhfSA9IGVkZ2VEYXRhO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZURhdGEua2V5LFxuICAgIHRhcmdldCA9IHRhcmdldERhdGEua2V5O1xuXG4gIC8vIE5PVEU6IHNpbmNlIHRoZSBlZGdlIHNldCBpcyB0aGUgc2FtZSBmb3Igc291cmNlICYgdGFyZ2V0LCB3ZSBjYW4gb25seVxuICAvLyBhZmZlY3Qgc291cmNlXG4gIGNvbnN0IG91dEtleSA9IHVuZGlyZWN0ZWQgPyAndW5kaXJlY3RlZCcgOiAnb3V0JyxcbiAgICBzb3VyY2VJbmRleCA9IHNvdXJjZURhdGFbb3V0S2V5XTtcblxuICBjb25zdCBpbktleSA9IHVuZGlyZWN0ZWQgPyAndW5kaXJlY3RlZCcgOiAnaW4nO1xuXG4gIGlmICh0YXJnZXQgaW4gc291cmNlSW5kZXgpIHtcbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGNvbnN0IHNldCA9IHNvdXJjZUluZGV4W3RhcmdldF07XG5cbiAgICAgIGlmIChzZXQuc2l6ZSA9PT0gMSkge1xuICAgICAgICBkZWxldGUgc291cmNlSW5kZXhbdGFyZ2V0XTtcbiAgICAgICAgZGVsZXRlIHRhcmdldERhdGFbaW5LZXldW3NvdXJjZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXQuZGVsZXRlKGVkZ2VEYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgZGVsZXRlIHNvdXJjZUluZGV4W3RhcmdldF07XG4gIH1cblxuICBpZiAobXVsdGkpIHJldHVybjtcblxuICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldERhdGFbaW5LZXldO1xuXG4gIGRlbGV0ZSB0YXJnZXRJbmRleFtzb3VyY2VdO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNsZWFyaW5nIHRoZSB3aG9sZSAnc3RydWN0dXJlJyBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSBncmFwaCAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyU3RydWN0dXJlSW5kZXgoZ3JhcGgpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbiAgbGV0IHN0ZXA7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBzdGVwLnZhbHVlLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIHVwZ3JhZGUgYSBzaW1wbGUgYHN0cnVjdHVyZWAgaW5kZXggdG8gYSBtdWx0aSBvbi5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSAgZ3JhcGggLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlU3RydWN0dXJlSW5kZXhUb011bHRpKGdyYXBoKSB7XG4gIGdyYXBoLl9ub2Rlcy5mb3JFYWNoKChkYXRhLCBub2RlKSA9PiB7XG4gICAgLy8gRGlyZWN0ZWRcbiAgICBpZiAoZGF0YS5vdXQpIHtcbiAgICAgIGZvciAoY29uc3QgbmVpZ2hib3IgaW4gZGF0YS5vdXQpIHtcbiAgICAgICAgY29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGVkZ2VzLmFkZChkYXRhLm91dFtuZWlnaGJvcl0pO1xuICAgICAgICBkYXRhLm91dFtuZWlnaGJvcl0gPSBlZGdlcztcbiAgICAgICAgZ3JhcGguX25vZGVzLmdldChuZWlnaGJvcikuaW5bbm9kZV0gPSBlZGdlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVbmRpcmVjdGVkXG4gICAgaWYgKGRhdGEudW5kaXJlY3RlZCkge1xuICAgICAgZm9yIChjb25zdCBuZWlnaGJvciBpbiBkYXRhLnVuZGlyZWN0ZWQpIHtcbiAgICAgICAgaWYgKG5laWdoYm9yID4gbm9kZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGVkZ2VzLmFkZChkYXRhLnVuZGlyZWN0ZWRbbmVpZ2hib3JdKTtcbiAgICAgICAgZGF0YS51bmRpcmVjdGVkW25laWdoYm9yXSA9IGVkZ2VzO1xuICAgICAgICBncmFwaC5fbm9kZXMuZ2V0KG5laWdoYm9yKS51bmRpcmVjdGVkW25vZGVdID0gZWRnZXM7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgTm9kZSBBdHRyaWJ1dGVzIG1ldGhvZHNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YXNzaWduLCBpc1BsYWluT2JqZWN0fSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7SW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsIE5vdEZvdW5kR3JhcGhFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcblxuY29uc3QgTk9ERSA9IDA7XG5jb25zdCBTT1VSQ0UgPSAxO1xuY29uc3QgVEFSR0VUID0gMjtcbmNvbnN0IE9QUE9TSVRFID0gMztcblxuZnVuY3Rpb24gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gIGdyYXBoLFxuICBtZXRob2QsXG4gIG1vZGUsXG4gIG5vZGVPckVkZ2UsXG4gIG5hbWVPckVkZ2UsXG4gIGFkZDEsXG4gIGFkZDJcbikge1xuICBsZXQgbm9kZURhdGEsIGVkZ2VEYXRhLCBhcmcxLCBhcmcyO1xuXG4gIG5vZGVPckVkZ2UgPSAnJyArIG5vZGVPckVkZ2U7XG5cbiAgaWYgKG1vZGUgPT09IE5PREUpIHtcbiAgICBub2RlRGF0YSA9IGdyYXBoLl9ub2Rlcy5nZXQobm9kZU9yRWRnZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlT3JFZGdlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBhcmcxID0gbmFtZU9yRWRnZTtcbiAgICBhcmcyID0gYWRkMTtcbiAgfSBlbHNlIGlmIChtb2RlID09PSBPUFBPU0lURSkge1xuICAgIG5hbWVPckVkZ2UgPSAnJyArIG5hbWVPckVkZ2U7XG5cbiAgICBlZGdlRGF0YSA9IGdyYXBoLl9lZGdlcy5nZXQobmFtZU9yRWRnZSk7XG5cbiAgICBpZiAoIWVkZ2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtuYW1lT3JFZGdlfVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2UgPSBlZGdlRGF0YS5zb3VyY2Uua2V5O1xuICAgIGNvbnN0IHRhcmdldCA9IGVkZ2VEYXRhLnRhcmdldC5rZXk7XG5cbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gc291cmNlKSB7XG4gICAgICBub2RlRGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcbiAgICB9IGVsc2UgaWYgKG5vZGVPckVkZ2UgPT09IHRhcmdldCkge1xuICAgICAgbm9kZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHRoZSBcIiR7bm9kZU9yRWRnZX1cIiBub2RlIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgXCIke25hbWVPckVkZ2V9XCIgZWRnZSAoJHtzb3VyY2V9LCAke3RhcmdldH0pLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXJnMSA9IGFkZDE7XG4gICAgYXJnMiA9IGFkZDI7XG4gIH0gZWxzZSB7XG4gICAgZWRnZURhdGEgPSBncmFwaC5fZWRnZXMuZ2V0KG5vZGVPckVkZ2UpO1xuXG4gICAgaWYgKCFlZGdlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZU9yRWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKG1vZGUgPT09IFNPVVJDRSkge1xuICAgICAgbm9kZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVEYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuICAgIH1cblxuICAgIGFyZzEgPSBuYW1lT3JFZGdlO1xuICAgIGFyZzIgPSBhZGQxO1xuICB9XG5cbiAgcmV0dXJuIFtub2RlRGF0YSwgYXJnMSwgYXJnMl07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVHZXR0ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlc0dldHRlcihDbGFzcywgbWV0aG9kLCBtb2RlKSB7XG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKG5vZGVPckVkZ2UsIG5hbWVPckVkZ2UpIHtcbiAgICBjb25zdCBbZGF0YV0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2VcbiAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuYXR0cmlidXRlcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZUNoZWNrZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlU2V0dGVyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSwgYWRkMikge1xuICAgIGNvbnN0IFtkYXRhLCBuYW1lLCB2YWx1ZV0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2UsXG4gICAgICBhZGQxLFxuICAgICAgYWRkMlxuICAgICk7XG5cbiAgICBkYXRhLmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiBkYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZVVwZGF0ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxLCBhZGQyKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWUsIHVwZGF0ZXJdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMSxcbiAgICAgIGFkZDJcbiAgICApO1xuXG4gICAgaWYgKHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiB1cGRhdGVyIHNob3VsZCBiZSBhIGZ1bmN0aW9uLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGF0YS5hdHRyaWJ1dGVzO1xuICAgIGNvbnN0IHZhbHVlID0gdXBkYXRlcihhdHRyaWJ1dGVzW25hbWVdKTtcblxuICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiBkYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZVJlbW92ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICBkZWxldGUgZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlc1JlcGxhY2VyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSkge1xuICAgIGNvbnN0IFtkYXRhLCBhdHRyaWJ1dGVzXSA9IGZpbmRSZWxldmFudE5vZGVEYXRhKFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1vZGUsXG4gICAgICBub2RlT3JFZGdlLFxuICAgICAgbmFtZU9yRWRnZSxcbiAgICAgIGFkZDFcbiAgICApO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGRhdGEuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnbm9kZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgIHR5cGU6ICdyZXBsYWNlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVzTWVyZ2VyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSkge1xuICAgIGNvbnN0IFtkYXRhLCBhdHRyaWJ1dGVzXSA9IGZpbmRSZWxldmFudE5vZGVEYXRhKFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1vZGUsXG4gICAgICBub2RlT3JFZGdlLFxuICAgICAgbmFtZU9yRWRnZSxcbiAgICAgIGFkZDFcbiAgICApO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGFzc2lnbihkYXRhLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZGF0YTogYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVzVXBkYXRlcihDbGFzcywgbWV0aG9kLCBtb2RlKSB7XG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKG5vZGVPckVkZ2UsIG5hbWVPckVkZ2UsIGFkZDEpIHtcbiAgICBjb25zdCBbZGF0YSwgdXBkYXRlcl0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2UsXG4gICAgICBhZGQxXG4gICAgKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogcHJvdmlkZWQgdXBkYXRlciBpcyBub3QgYSBmdW5jdGlvbi5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBvZiBtZXRob2RzIHRvIGF0dGFjaC5cbiAqL1xuY29uc3QgTk9ERV9BVFRSSUJVVEVTX01FVEhPRFMgPSBbXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBnZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZUdldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgZ2V0JHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc0dldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgaGFzJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVDaGVja2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBzZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZVNldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVVcGRhdGVyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGByZW1vdmUke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZVJlbW92ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYHJlcGxhY2Uke2VsZW1lbnR9QXR0cmlidXRlc2AsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVzUmVwbGFjZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYG1lcmdlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc01lcmdlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc1VwZGF0ZXJcbiAgfVxuXTtcblxuLyoqXG4gKiBBdHRhY2ggZXZlcnkgYXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHMgdG8gYSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIFRhcmdldCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKSB7XG4gIE5PREVfQVRUUklCVVRFU19NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKHtuYW1lLCBhdHRhY2hlcn0pIHtcbiAgICAvLyBGb3Igbm9kZXNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnTm9kZScpLCBOT0RFKTtcblxuICAgIC8vIEZvciBzb3VyY2VzXG4gICAgYXR0YWNoZXIoR3JhcGgsIG5hbWUoJ1NvdXJjZScpLCBTT1VSQ0UpO1xuXG4gICAgLy8gRm9yIHRhcmdldHNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnVGFyZ2V0JyksIFRBUkdFVCk7XG5cbiAgICAvLyBGb3Igb3Bwb3NpdGVzXG4gICAgYXR0YWNoZXIoR3JhcGgsIG5hbWUoJ09wcG9zaXRlJyksIE9QUE9TSVRFKTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBHcmFwaG9sb2d5IEVkZ2UgQXR0cmlidXRlcyBtZXRob2RzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2Fzc2lnbiwgaXNQbGFpbk9iamVjdCwgZ2V0TWF0Y2hpbmdFZGdlfSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7XG4gIEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yLFxuICBOb3RGb3VuZEdyYXBoRXJyb3IsXG4gIFVzYWdlR3JhcGhFcnJvclxufSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgZ2V0dGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZUdldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gU291cmNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHttaXhlZH0gICAgICAgICAgLSBUaGUgYXR0cmlidXRlJ3MgdmFsdWUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgZmluZCB0aGlzIHR5cGUgb2YgZWRnZXMgaW4geW91ciAke3RoaXMudHlwZX0gZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IHVzZSBhIHtzb3VyY2UsdGFyZ2V0fSBjb21ibyB3aGVuIGFza2luZyBhYm91dCBhbiBlZGdlJ3MgYXR0cmlidXRlcyBpbiBhIE11bHRpR3JhcGggc2luY2Ugd2UgY2Fubm90IGluZmVyIHRoZSBvbmUgeW91IHdhbnQgaW5mb3JtYXRpb24gYWJvdXQuYFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2UgPSAnJyArIGVsZW1lbnQsXG4gICAgICAgIHRhcmdldCA9ICcnICsgbmFtZTtcblxuICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXTtcblxuICAgICAgZGF0YSA9IGdldE1hdGNoaW5nRWRnZSh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdHlwZSk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCBhbiBlZGdlIGZvciB0aGUgZ2l2ZW4gcGF0aCAoXCIke3NvdXJjZX1cIiAtIFwiJHt0YXJnZXR9XCIpLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9ICcnICsgZWxlbWVudDtcbiAgICAgIGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuYXR0cmlidXRlc1tuYW1lXTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYW4gYXR0cmlidXRlcyBnZXR0ZXIgbWV0aG9kIG9udG8gdGhlIHByb3ZpZGVkIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgIC0gVHlwZSBvZiB0aGUgZWRnZSB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXR0cmlidXRlc0dldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSB0YXJnZXQgZWxlbWVudCdzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKlxuICAgKiBBcml0eSAzIChvbmx5IGZvciBlZGdlcyk6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIHNvdXJjZSAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAtIFRoZSBlbGVtZW50J3MgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBhcmd1bWVudHNbMV07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09ICh0eXBlID09PSAndW5kaXJlY3RlZCcpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiICR7dHlwZX0gZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLmF0dHJpYnV0ZXM7XG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGFuIGF0dHJpYnV0ZSBjaGVja2VyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgIC0gTWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZUNoZWNrZXIoQ2xhc3MsIG1ldGhvZCwgdHlwZSkge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGlzIHNldCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKlxuICAgKiBBcml0eSAzIChvbmx5IGZvciBlZGdlcyk6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIHNvdXJjZSAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgIC0gQXR0cmlidXRlJ3MgbmFtZS5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBuYW1lO1xuXG4gICAgICBuYW1lID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgc2V0dGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZVNldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge21peGVkfSAgdmFsdWUgICAtIE5ldyBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gU291cmNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKiBAcGFyYW0gIHttaXhlZH0gIHZhbHVlICAgLSBOZXcgYXR0cmlidXRlIHZhbHVlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDMpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIG5hbWU7XG5cbiAgICAgIG5hbWUgPSBhcmd1bWVudHNbMl07XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1szXTtcblxuICAgICAgZGF0YSA9IGdldE1hdGNoaW5nRWRnZSh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdHlwZSk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCBhbiBlZGdlIGZvciB0aGUgZ2l2ZW4gcGF0aCAoXCIke3NvdXJjZX1cIiAtIFwiJHt0YXJnZXR9XCIpLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9ICcnICsgZWxlbWVudDtcbiAgICAgIGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWU7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnZWRnZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgbmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGFuIGF0dHJpYnV0ZSB1cGRhdGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZVVwZGF0ZXIoQ2xhc3MsIG1ldGhvZCwgdHlwZSkge1xuICAvKipcbiAgICogVXBkYXRlIHRoZSBkZXNpcmVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkgdXNpbmdcbiAgICogdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHVwZGF0ZXIpIHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgZmluZCB0aGlzIHR5cGUgb2YgZWRnZXMgaW4geW91ciAke3RoaXMudHlwZX0gZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMykge1xuICAgICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IHVzZSBhIHtzb3VyY2UsdGFyZ2V0fSBjb21ibyB3aGVuIGFza2luZyBhYm91dCBhbiBlZGdlJ3MgYXR0cmlidXRlcyBpbiBhIE11bHRpR3JhcGggc2luY2Ugd2UgY2Fubm90IGluZmVyIHRoZSBvbmUgeW91IHdhbnQgaW5mb3JtYXRpb24gYWJvdXQuYFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2UgPSAnJyArIGVsZW1lbnQsXG4gICAgICAgIHRhcmdldCA9ICcnICsgbmFtZTtcblxuICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHVwZGF0ZXIgPSBhcmd1bWVudHNbM107XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHVwZGF0ZXIgc2hvdWxkIGJlIGEgZnVuY3Rpb24uYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzW25hbWVdID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXNbbmFtZV0pO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAnc2V0JyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgcmVtb3ZlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVSZW1vdmVyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZGVzaXJlZCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IChub2RlIG9yIGVkZ2UpLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSBuYW1lICAgIC0gQXR0cmlidXRlJ3MgbmFtZS5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBTb3VyY2UgZWxlbWVudC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge0dyYXBofSAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBuYW1lO1xuXG4gICAgICBuYW1lID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBkZWxldGUgZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgcmVwbGFjZXIgbWV0aG9kIG9udG8gdGhlIHByb3ZpZGVkIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzICAgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gICBtZXRob2QgICAgICAgIC0gTWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgICAgICAgIC0gVHlwZSBvZiB0aGUgZWRnZSB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXR0cmlidXRlc1JlcGxhY2VyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBlbGVtZW50IChub2RlIG9yIGVkZ2UpLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVsZW1lbnQgICAgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTmV3IGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlICAgICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gIGF0dHJpYnV0ZXMgLSBOZXcgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBhdHRyaWJ1dGVzO1xuXG4gICAgICBhdHRyaWJ1dGVzID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3JlcGxhY2UnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYW4gYXR0cmlidXRlIG1lcmdlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVzTWVyZ2VyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIE1lcmdlIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50ICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gYXR0cmlidXRlcyAtIEF0dHJpYnV0ZXMgdG8gbWVyZ2UuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlICAgICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gIGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIG1lcmdlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgICAgIC0gUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRvbyBtYW55IGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpcyBub3QgZm91bmQuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRyaWJ1dGVzKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIGF0dHJpYnV0ZXM7XG5cbiAgICAgIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYXR0cmlidXRlcykpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHByb3ZpZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhIHBsYWluIG9iamVjdC5gXG4gICAgICApO1xuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBhc3NpZ24oZGF0YS5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ21lcmdlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgdXBkYXRlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVzVXBkYXRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gdXBkYXRlciAtIFVwZGF0ZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge0dyYXBofSAgICAgICAgICAgIC0gUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRvbyBtYW55IGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpcyBub3QgZm91bmQuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChlbGVtZW50LCB1cGRhdGVyKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIHVwZGF0ZXI7XG5cbiAgICAgIHVwZGF0ZXIgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHByb3ZpZGVkIHVwZGF0ZXIgaXMgbm90IGEgZnVuY3Rpb24uYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBvZiBtZXRob2RzIHRvIGF0dGFjaC5cbiAqL1xuY29uc3QgRURHRV9BVFRSSUJVVEVTX01FVEhPRFMgPSBbXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBnZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZUdldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgZ2V0JHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc0dldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgaGFzJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVDaGVja2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBzZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZVNldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVVcGRhdGVyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGByZW1vdmUke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZVJlbW92ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYHJlcGxhY2Uke2VsZW1lbnR9QXR0cmlidXRlc2AsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVzUmVwbGFjZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYG1lcmdlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc01lcmdlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc1VwZGF0ZXJcbiAgfVxuXTtcblxuLyoqXG4gKiBBdHRhY2ggZXZlcnkgYXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHMgdG8gYSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIFRhcmdldCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKSB7XG4gIEVER0VfQVRUUklCVVRFU19NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKHtuYW1lLCBhdHRhY2hlcn0pIHtcbiAgICAvLyBGb3IgZWRnZXNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnRWRnZScpLCAnbWl4ZWQnKTtcblxuICAgIC8vIEZvciBkaXJlY3RlZCBlZGdlc1xuICAgIGF0dGFjaGVyKEdyYXBoLCBuYW1lKCdEaXJlY3RlZEVkZ2UnKSwgJ2RpcmVjdGVkJyk7XG5cbiAgICAvLyBGb3IgdW5kaXJlY3RlZCBlZGdlc1xuICAgIGF0dGFjaGVyKEdyYXBoLCBuYW1lKCdVbmRpcmVjdGVkRWRnZScpLCAndW5kaXJlY3RlZCcpO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIENoYWluIEZ1bmN0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBWYXJpYWRpYyBmdW5jdGlvbiBjb21iaW5pbmcgdGhlIGdpdmVuIGl0ZXJhYmxlcy5cbiAqL1xudmFyIEl0ZXJhdG9yID0gcmVxdWlyZSgnLi9pdGVyYXRvci5qcycpLFxuICBpdGVyID0gcmVxdWlyZSgnLi9pdGVyLmpzJyk7XG5cbi8qKlxuICogQ2hhaW4uXG4gKlxuICogQHBhcmFtICB7Li4uSXRlcmF0b3J9IGl0ZXJhYmxlcyAtIFRhcmdldCBpdGVyYWJsZXMuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjaGFpbigpIHtcbiAgdmFyIGl0ZXJhYmxlcyA9IGFyZ3VtZW50cyxcbiAgICBjdXJyZW50LFxuICAgIGkgPSAtMTtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uIGl0ZXJhdGUoKSB7XG4gICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICBpKys7XG5cbiAgICAgIGlmIChpID49IGl0ZXJhYmxlcy5sZW5ndGgpIHJldHVybiB7ZG9uZTogdHJ1ZX07XG5cbiAgICAgIGN1cnJlbnQgPSBpdGVyKGl0ZXJhYmxlc1tpXSk7XG4gICAgfVxuXG4gICAgdmFyIHN0ZXAgPSBjdXJyZW50Lm5leHQoKTtcblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgcmV0dXJuIGl0ZXJhdGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcDtcbiAgfSk7XG59O1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBFZGdlIEl0ZXJhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBBdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSBHcmFwaCBjbGFzcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb3ZlciBhXG4gKiBncmFwaCdzIGVkZ2VzLlxuICovXG5pbXBvcnQgSXRlcmF0b3IgZnJvbSAnb2JsaXRlcmF0b3IvaXRlcmF0b3InO1xuaW1wb3J0IGNoYWluIGZyb20gJ29ibGl0ZXJhdG9yL2NoYWluJztcbmltcG9ydCB0YWtlIGZyb20gJ29ibGl0ZXJhdG9yL3Rha2UnO1xuXG5pbXBvcnQge0ludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yLCBOb3RGb3VuZEdyYXBoRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogRGVmaW5pdGlvbnMuXG4gKi9cbmNvbnN0IEVER0VTX0lURVJBVElPTiA9IFtcbiAge1xuICAgIG5hbWU6ICdlZGdlcycsXG4gICAgdHlwZTogJ21peGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ2luRWRnZXMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnaW4nXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnb3V0RWRnZXMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnb3V0J1xuICB9LFxuICB7XG4gICAgbmFtZTogJ2luYm91bmRFZGdlcycsXG4gICAgdHlwZTogJ21peGVkJyxcbiAgICBkaXJlY3Rpb246ICdpbidcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdvdXRib3VuZEVkZ2VzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdkaXJlY3RlZEVkZ2VzJyxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAndW5kaXJlY3RlZEVkZ2VzJyxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfVxuXTtcblxuLyoqXG4gKiBGdW5jdGlvbiBjb2xsZWN0aW5nIGVkZ2VzIGZyb20gdGhlIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gIHthcnJheX0gIGVkZ2VzICAtIEVkZ2VzIGFycmF5IHRvIHBvcHVsYXRlLlxuICogQHBhcmFtICB7b2JqZWN0fSBvYmplY3QgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7YXJyYXl9ICAgICAgICAgLSBUaGUgZm91bmQgZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTaW1wbGUoZWRnZXMsIG9iamVjdCkge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSBlZGdlcy5wdXNoKG9iamVjdFtrXS5rZXkpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0TXVsdGkoZWRnZXMsIG9iamVjdCkge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KVxuICAgIG9iamVjdFtrXS5mb3JFYWNoKGVkZ2VEYXRhID0+IGVkZ2VzLnB1c2goZWRnZURhdGEua2V5KSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgZWRnZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgb2JqZWN0ICAgLSBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoU2ltcGxlKG9iamVjdCwgY2FsbGJhY2ssIGF2b2lkKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmplY3QpIHtcbiAgICBpZiAoayA9PT0gYXZvaWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICBjYWxsYmFjayhcbiAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS5zb3VyY2Uua2V5LFxuICAgICAgZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgIGVkZ2VEYXRhLnNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTXVsdGkob2JqZWN0LCBjYWxsYmFjaywgYXZvaWQpIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGlmIChrID09PSBhdm9pZCkgY29udGludWU7XG5cbiAgICBvYmplY3Rba10uZm9yRWFjaChlZGdlRGF0YSA9PlxuICAgICAgY2FsbGJhY2soXG4gICAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgICAgZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZyb20gdGhlIGdpdmVuIG9iamVjdCB0byBtYXRjaCBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTaW1wbGUob2JqZWN0LCBjYWxsYmFjaywgYXZvaWQpIHtcbiAgbGV0IHNob3VsZEJyZWFrID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGlmIChrID09PSBhdm9pZCkgY29udGludWU7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICBlZGdlRGF0YS5rZXksXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICBlZGdlRGF0YS5zb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgICk7XG5cbiAgICBpZiAoc2hvdWxkQnJlYWspIHJldHVybiBlZGdlRGF0YS5rZXk7XG4gIH1cblxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGZpbmRNdWx0aShvYmplY3QsIGNhbGxiYWNrLCBhdm9pZCkge1xuICBsZXQgaXRlcmF0b3IsIHN0ZXAsIGVkZ2VEYXRhLCBzb3VyY2UsIHRhcmdldDtcblxuICBsZXQgc2hvdWxkQnJlYWsgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSB7XG4gICAgaWYgKGsgPT09IGF2b2lkKSBjb250aW51ZTtcblxuICAgIGl0ZXJhdG9yID0gb2JqZWN0W2tdLnZhbHVlcygpO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGVkZ2VEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIHNvdXJjZSA9IGVkZ2VEYXRhLnNvdXJjZTtcbiAgICAgIHRhcmdldCA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2Uua2V5LFxuICAgICAgICB0YXJnZXQua2V5LFxuICAgICAgICBzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgdGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhLmtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgZWRnZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmplY3QgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhdG9yKG9iamVjdCwgYXZvaWQpIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCksXG4gICAgbCA9IGtleXMubGVuZ3RoO1xuXG4gIGxldCBpbm5lciA9IG51bGwsXG4gICAgaSA9IDA7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiBuZXh0KCkge1xuICAgIGxldCBlZGdlRGF0YTtcblxuICAgIGlmIChpbm5lcikge1xuICAgICAgY29uc3Qgc3RlcCA9IGlubmVyLm5leHQoKTtcblxuICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICBpbm5lciA9IG51bGw7XG4gICAgICAgIGkrKztcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgZWRnZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgICBjb25zdCBrID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGsgPT09IGF2b2lkKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICBpbm5lciA9IGVkZ2VEYXRhLnZhbHVlcygpO1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZWRnZTogZWRnZURhdGEua2V5LFxuICAgICAgICBhdHRyaWJ1dGVzOiBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2U6IGVkZ2VEYXRhLnNvdXJjZS5rZXksXG4gICAgICAgIHRhcmdldDogZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgICAgc291cmNlQXR0cmlidXRlczogZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgIHRhcmdldEF0dHJpYnV0ZXM6IGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgICB1bmRpcmVjdGVkOiBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY29sbGVjdGluZyBlZGdlcyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgYXQgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSAge2FycmF5fSAgZWRnZXMgIC0gRWRnZXMgYXJyYXkgdG8gcG9wdWxhdGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9iamVjdCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gIHttaXhlZH0gIGsgICAgICAtIE5laWdoYm9yIGtleS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAgIC0gVGhlIGZvdW5kIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0Rm9yS2V5U2ltcGxlKGVkZ2VzLCBvYmplY3QsIGspIHtcbiAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgaWYgKCFlZGdlRGF0YSkgcmV0dXJuO1xuXG4gIGVkZ2VzLnB1c2goZWRnZURhdGEua2V5KTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEZvcktleU11bHRpKGVkZ2VzLCBvYmplY3QsIGspIHtcbiAgY29uc3QgZWRnZXNEYXRhID0gb2JqZWN0W2tdO1xuXG4gIGlmICghZWRnZXNEYXRhKSByZXR1cm47XG5cbiAgZWRnZXNEYXRhLmZvckVhY2goZWRnZURhdGEgPT4gZWRnZXMucHVzaChlZGdlRGF0YS5rZXkpKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWdkZXMgZnJvbSB0aGUgb2JqZWN0IGF0IGdpdmVuIGtleSB1c2luZ1xuICogYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge21peGVkfSAgICBrICAgICAgICAtIE5laWdoYm9yIGtleS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoRm9yS2V5U2ltcGxlKG9iamVjdCwgaywgY2FsbGJhY2spIHtcbiAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgaWYgKCFlZGdlRGF0YSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gIGNvbnN0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgY2FsbGJhY2soXG4gICAgZWRnZURhdGEua2V5LFxuICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgc291cmNlRGF0YS5rZXksXG4gICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgIHRhcmdldERhdGEuYXR0cmlidXRlcyxcbiAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hGb3JLZXlNdWx0aShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VzRGF0YSA9IG9iamVjdFtrXTtcblxuICBpZiAoIWVkZ2VzRGF0YSkgcmV0dXJuO1xuXG4gIGVkZ2VzRGF0YS5mb3JFYWNoKGVkZ2VEYXRhID0+XG4gICAgY2FsbGJhY2soXG4gICAgICBlZGdlRGF0YS5rZXksXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICBlZGdlRGF0YS5zb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWdkZXMgZnJvbSB0aGUgb2JqZWN0IGF0IGdpdmVuIGtleSB0byBtYXRjaFxuICogb25lIG9mIHRoZW0uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgb2JqZWN0ICAgLSBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHttaXhlZH0gICAgayAgICAgICAgLSBOZWlnaGJvciBrZXkuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAqL1xuZnVuY3Rpb24gZmluZEZvcktleVNpbXBsZShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VEYXRhID0gb2JqZWN0W2tdO1xuXG4gIGlmICghZWRnZURhdGEpIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlO1xuICBjb25zdCB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gIGlmIChcbiAgICBjYWxsYmFjayhcbiAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgKVxuICAgIHJldHVybiBlZGdlRGF0YS5rZXk7XG59XG5cbmZ1bmN0aW9uIGZpbmRGb3JLZXlNdWx0aShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VzRGF0YSA9IG9iamVjdFtrXTtcblxuICBpZiAoIWVkZ2VzRGF0YSkgcmV0dXJuO1xuXG4gIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZWRnZXNEYXRhLnZhbHVlcygpO1xuICBsZXQgc3RlcCwgZWRnZURhdGE7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICBzaG91bGRCcmVhayA9IGNhbGxiYWNrKFxuICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnNvdXJjZS5rZXksXG4gICAgICBlZGdlRGF0YS50YXJnZXQua2V5LFxuICAgICAgZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS50YXJnZXQuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICApO1xuXG4gICAgaWYgKHNob3VsZEJyZWFrKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBlZ2RlcyBmcm9tIHRoZSBvYmplY3QgYXQgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gIHttaXhlZH0gICAgayAgICAgICAgLSBOZWlnaGJvciBrZXkuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSXRlcmF0b3JGb3JLZXkob2JqZWN0LCBrKSB7XG4gIGNvbnN0IHYgPSBvYmplY3Rba107XG5cbiAgaWYgKHYgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IHYudmFsdWVzKCk7XG5cbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmIChzdGVwLmRvbmUpIHJldHVybiBzdGVwO1xuXG4gICAgICBjb25zdCBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVkZ2U6IGVkZ2VEYXRhLmtleSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHNvdXJjZTogZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgICAgICB0YXJnZXQ6IGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICAgICAgc291cmNlQXR0cmlidXRlczogZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdGFyZ2V0QXR0cmlidXRlczogZWRnZURhdGEudGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdW5kaXJlY3RlZDogZWRnZURhdGEudW5kaXJlY3RlZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIEl0ZXJhdG9yLm9mKFtcbiAgICB2LmtleSxcbiAgICB2LmF0dHJpYnV0ZXMsXG4gICAgdi5zb3VyY2Uua2V5LFxuICAgIHYudGFyZ2V0LmtleSxcbiAgICB2LnNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgIHYudGFyZ2V0LmF0dHJpYnV0ZXNcbiAgXSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgZWRnZXMgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgIGdyYXBoIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgLSBUeXBlIG9mIGVkZ2VzIHRvIHJldHJpZXZlLlxuICogQHJldHVybiB7YXJyYXl9ICAgICAgICAgLSBBcnJheSBvZiBlZGdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWRnZUFycmF5KGdyYXBoLCB0eXBlKSB7XG4gIGlmIChncmFwaC5zaXplID09PSAwKSByZXR1cm4gW107XG5cbiAgaWYgKHR5cGUgPT09ICdtaXhlZCcgfHwgdHlwZSA9PT0gZ3JhcGgudHlwZSkge1xuICAgIGlmICh0eXBlb2YgQXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGdyYXBoLl9lZGdlcy5rZXlzKCkpO1xuXG4gICAgcmV0dXJuIHRha2UoZ3JhcGguX2VkZ2VzLmtleXMoKSwgZ3JhcGguX2VkZ2VzLnNpemUpO1xuICB9XG5cbiAgY29uc3Qgc2l6ZSA9XG4gICAgdHlwZSA9PT0gJ3VuZGlyZWN0ZWQnID8gZ3JhcGgudW5kaXJlY3RlZFNpemUgOiBncmFwaC5kaXJlY3RlZFNpemU7XG5cbiAgY29uc3QgbGlzdCA9IG5ldyBBcnJheShzaXplKSxcbiAgICBtYXNrID0gdHlwZSA9PT0gJ3VuZGlyZWN0ZWQnO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZ3JhcGguX2VkZ2VzLnZhbHVlcygpO1xuXG4gIGxldCBpID0gMDtcbiAgbGV0IHN0ZXAsIGRhdGE7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgIGlmIChkYXRhLnVuZGlyZWN0ZWQgPT09IG1hc2spIGxpc3RbaSsrXSA9IGRhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBncmFwaCdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hFZGdlKGdyYXBoLCB0eXBlLCBjYWxsYmFjaykge1xuICBpZiAoZ3JhcGguc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IHNob3VsZEZpbHRlciA9IHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gZ3JhcGgudHlwZTtcbiAgY29uc3QgbWFzayA9IHR5cGUgPT09ICd1bmRpcmVjdGVkJztcblxuICBsZXQgc3RlcCwgZGF0YTtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fZWRnZXMudmFsdWVzKCk7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgIGlmIChzaG91bGRGaWx0ZXIgJiYgZGF0YS51bmRpcmVjdGVkICE9PSBtYXNrKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHtrZXksIGF0dHJpYnV0ZXMsIHNvdXJjZSwgdGFyZ2V0fSA9IGRhdGE7XG5cbiAgICBjYWxsYmFjayhcbiAgICAgIGtleSxcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBzb3VyY2Uua2V5LFxuICAgICAgdGFyZ2V0LmtleSxcbiAgICAgIHNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgICAgdGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICBkYXRhLnVuZGlyZWN0ZWRcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBncmFwaCdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2sgdG8gbWF0Y2ggb25lIG9mXG4gKiB0aGVtLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgICBncmFwaCAgICAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmaW5kRWRnZShncmFwaCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgaWYgKGdyYXBoLnNpemUgPT09IDApIHJldHVybjtcblxuICBjb25zdCBzaG91bGRGaWx0ZXIgPSB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IGdyYXBoLnR5cGU7XG4gIGNvbnN0IG1hc2sgPSB0eXBlID09PSAndW5kaXJlY3RlZCc7XG5cbiAgbGV0IHN0ZXAsIGRhdGE7XG4gIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuICBjb25zdCBpdGVyYXRvciA9IGdyYXBoLl9lZGdlcy52YWx1ZXMoKTtcblxuICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgIGRhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHNob3VsZEZpbHRlciAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09IG1hc2spIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qge2tleSwgYXR0cmlidXRlcywgc291cmNlLCB0YXJnZXR9ID0gZGF0YTtcblxuICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICBrZXksXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgc291cmNlLmtleSxcbiAgICAgIHRhcmdldC5rZXksXG4gICAgICBzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIHRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZGF0YS51bmRpcmVjdGVkXG4gICAgKTtcblxuICAgIGlmIChzaG91bGRCcmVhaykgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBjcmVhdGluZyBhbiBpdGVyYXRvciBvZiBlZGdlcyBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgIGdyYXBoIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlSXRlcmF0b3IoZ3JhcGgsIHR5cGUpIHtcbiAgaWYgKGdyYXBoLnNpemUgPT09IDApIHJldHVybiBJdGVyYXRvci5lbXB0eSgpO1xuXG4gIGNvbnN0IHNob3VsZEZpbHRlciA9IHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gZ3JhcGgudHlwZTtcbiAgY29uc3QgbWFzayA9IHR5cGUgPT09ICd1bmRpcmVjdGVkJztcblxuICBjb25zdCBpdGVyYXRvciA9IGdyYXBoLl9lZGdlcy52YWx1ZXMoKTtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgbGV0IHN0ZXAsIGRhdGE7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmIChzdGVwLmRvbmUpIHJldHVybiBzdGVwO1xuXG4gICAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHNob3VsZEZpbHRlciAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09IG1hc2spIGNvbnRpbnVlO1xuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgIGVkZ2U6IGRhdGEua2V5LFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgc291cmNlOiBkYXRhLnNvdXJjZS5rZXksXG4gICAgICB0YXJnZXQ6IGRhdGEudGFyZ2V0LmtleSxcbiAgICAgIHNvdXJjZUF0dHJpYnV0ZXM6IGRhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICB0YXJnZXRBdHRyaWJ1dGVzOiBkYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgdW5kaXJlY3RlZDogZGF0YS51bmRpcmVjdGVkXG4gICAgfTtcblxuICAgIHJldHVybiB7dmFsdWUsIGRvbmU6IGZhbHNlfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgZWRnZXMgZm9yIHRoZSBnaXZlbiB0eXBlICYgdGhlIGdpdmVuIG5vZGUuXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gbXVsdGkgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gIGRpcmVjdGlvbiAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge2FueX0gICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAgICAgICAtIEFycmF5IG9mIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlQXJyYXlGb3JOb2RlKG11bHRpLCB0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIGNvbnN0IGVkZ2VzID0gW107XG5cbiAgY29uc3QgZm4gPSBtdWx0aSA/IGNvbGxlY3RNdWx0aSA6IGNvbGxlY3RTaW1wbGU7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSBmbihlZGdlcywgbm9kZURhdGEuaW4pO1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIGZuKGVkZ2VzLCBub2RlRGF0YS5vdXQpO1xuXG4gICAgLy8gSGFuZGxpbmcgc2VsZiBsb29wIGVkZ2UgY2FzZVxuICAgIGlmICghZGlyZWN0aW9uICYmIG5vZGVEYXRhLmRpcmVjdGVkU2VsZkxvb3BzID4gMClcbiAgICAgIGVkZ2VzLnNwbGljZShlZGdlcy5sYXN0SW5kZXhPZihub2RlRGF0YS5rZXkpLCAxKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm4oZWRnZXMsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2VzO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gIG11bHRpICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpIG9yIG5vdC5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgLSBUeXBlIG9mIGVkZ2VzIHRvIHJldHJpZXZlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gRnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEVkZ2VGb3JOb2RlKG11bHRpLCB0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhLCBjYWxsYmFjaykge1xuICBjb25zdCBmbiA9IG11bHRpID8gZm9yRWFjaE11bHRpIDogZm9yRWFjaFNpbXBsZTtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIGZuKG5vZGVEYXRhLmluLCBjYWxsYmFjayk7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ2luJylcbiAgICAgIGZuKG5vZGVEYXRhLm91dCwgY2FsbGJhY2ssICFkaXJlY3Rpb24gPyBub2RlRGF0YS5rZXkgOiBudWxsKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm4obm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXMgdXNpbmcgYSBjYWxsYmFjayB0byBtYXRjaCBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uIC0gSW4gb3Igb3V0P1xuICogQHBhcmFtICB7YW55fSAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmaW5kRWRnZUZvck5vZGUobXVsdGksIHR5cGUsIGRpcmVjdGlvbiwgbm9kZURhdGEsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZuID0gbXVsdGkgPyBmaW5kTXVsdGkgOiBmaW5kU2ltcGxlO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIGZvdW5kID0gZm4obm9kZURhdGEuaW4sIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGZvdW5kID0gZm4obm9kZURhdGEub3V0LCBjYWxsYmFjaywgIWRpcmVjdGlvbiA/IG5vZGVEYXRhLmtleSA6IG51bGwpO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGZvdW5kID0gZm4obm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXMgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICBkaXJlY3Rpb24gLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZURhdGEgIC0gVGFyZ2V0IG5vZGUncyBkYXRhLlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVkZ2VJdGVyYXRvckZvck5vZGUodHlwZSwgZGlyZWN0aW9uLCBub2RlRGF0YSkge1xuICBsZXQgaXRlcmF0b3IgPSBJdGVyYXRvci5lbXB0eSgpO1xuXG4gIGlmICh0eXBlICE9PSAndW5kaXJlY3RlZCcpIHtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnb3V0JyAmJiB0eXBlb2Ygbm9kZURhdGEuaW4gIT09ICd1bmRlZmluZWQnKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3Iobm9kZURhdGEuaW4pKTtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nICYmIHR5cGVvZiBub2RlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihcbiAgICAgICAgaXRlcmF0b3IsXG4gICAgICAgIGNyZWF0ZUl0ZXJhdG9yKG5vZGVEYXRhLm91dCwgIWRpcmVjdGlvbiA/IG5vZGVEYXRhLmtleSA6IG51bGwpXG4gICAgICApO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcgJiYgdHlwZW9mIG5vZGVEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3Iobm9kZURhdGEudW5kaXJlY3RlZCkpO1xuICB9XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNyZWF0aW5nIGFuIGFycmF5IG9mIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAgLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHtOb2RlRGF0YX0gc291cmNlRGF0YSAtIFNvdXJjZSBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IG5vZGUuXG4gKiBAcmV0dXJuIHthcnJheX0gICAgICAgICAgICAgICAtIEFycmF5IG9mIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlQXJyYXlGb3JQYXRoKHR5cGUsIG11bHRpLCBkaXJlY3Rpb24sIHNvdXJjZURhdGEsIHRhcmdldCkge1xuICBjb25zdCBmbiA9IG11bHRpID8gY29sbGVjdEZvcktleU11bHRpIDogY29sbGVjdEZvcktleVNpbXBsZTtcblxuICBjb25zdCBlZGdlcyA9IFtdO1xuXG4gIGlmICh0eXBlICE9PSAndW5kaXJlY3RlZCcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEuaW4gIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ291dCcpXG4gICAgICBmbihlZGdlcywgc291cmNlRGF0YS5pbiwgdGFyZ2V0KTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ2luJylcbiAgICAgIGZuKGVkZ2VzLCBzb3VyY2VEYXRhLm91dCwgdGFyZ2V0KTtcblxuICAgIC8vIEhhbmRsaW5nIHNlbGYgbG9vcCBlZGdlIGNhc2VcbiAgICBpZiAoIWRpcmVjdGlvbiAmJiBzb3VyY2VEYXRhLmRpcmVjdGVkU2VsZkxvb3BzID4gMClcbiAgICAgIGVkZ2VzLnNwbGljZShlZGdlcy5sYXN0SW5kZXhPZihzb3VyY2VEYXRhLmtleSksIDEpO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEudW5kaXJlY3RlZCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICBmbihlZGdlcywgc291cmNlRGF0YS51bmRpcmVjdGVkLCB0YXJnZXQpO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2VzO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aCB1c2luZyBhIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge2Jvb2xlYW59ICBtdWx0aSAgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uICAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge05vZGVEYXRhfSBzb3VyY2VEYXRhIC0gU291cmNlIG5vZGUncyBkYXRhLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHRhcmdldCAgICAgLSBUYXJnZXQgbm9kZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAgIC0gRnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEVkZ2VGb3JQYXRoKFxuICB0eXBlLFxuICBtdWx0aSxcbiAgZGlyZWN0aW9uLFxuICBzb3VyY2VEYXRhLFxuICB0YXJnZXQsXG4gIGNhbGxiYWNrXG4pIHtcbiAgY29uc3QgZm4gPSBtdWx0aSA/IGZvckVhY2hGb3JLZXlNdWx0aSA6IGZvckVhY2hGb3JLZXlTaW1wbGU7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5pbiAhPT0gJ3VuZGVmaW5lZCcgJiYgZGlyZWN0aW9uICE9PSAnb3V0JylcbiAgICAgIGZuKHNvdXJjZURhdGEuaW4sIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKHNvdXJjZURhdGEua2V5ICE9PSB0YXJnZXQpXG4gICAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEub3V0ICE9PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gIT09ICdpbicpXG4gICAgICAgIGZuKHNvdXJjZURhdGEub3V0LCB0YXJnZXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgZm4oc291cmNlRGF0YS51bmRpcmVjdGVkLCB0YXJnZXQsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aCB1c2luZyBhIGNhbGxiYWNrIHRvIG1hdGNoXG4gKiBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAgLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHtOb2RlRGF0YX0gc291cmNlRGF0YSAtIFNvdXJjZSBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0YXJnZXQgICAgIC0gVGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgICAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRFZGdlRm9yUGF0aCh0eXBlLCBtdWx0aSwgZGlyZWN0aW9uLCBzb3VyY2VEYXRhLCB0YXJnZXQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZuID0gbXVsdGkgPyBmaW5kRm9yS2V5TXVsdGkgOiBmaW5kRm9yS2V5U2ltcGxlO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VEYXRhLmluICE9PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBmb3VuZCA9IGZuKHNvdXJjZURhdGEuaW4sIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlRGF0YS5rZXkgIT09IHRhcmdldClcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ2luJykge1xuICAgICAgICBmb3VuZCA9IGZuKFxuICAgICAgICAgIHNvdXJjZURhdGEub3V0LFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAhZGlyZWN0aW9uID8gc291cmNlRGF0YS5rZXkgOiBudWxsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS51bmRpcmVjdGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZm91bmQgPSBmbihzb3VyY2VEYXRhLnVuZGlyZWN0ZWQsIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgZWRnZXMgZm9yIHRoZSBnaXZlbiBwYXRoLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICBkaXJlY3Rpb24gIC0gSW4gb3Igb3V0P1xuICogQHBhcmFtICB7Tm9kZURhdGF9IHNvdXJjZURhdGEgLSBTb3VyY2Ugbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdGFyZ2V0ICAgICAtIFRhcmdldCBub2RlLlxuICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrICAgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlSXRlcmF0b3JGb3JQYXRoKHR5cGUsIGRpcmVjdGlvbiwgc291cmNlRGF0YSwgdGFyZ2V0KSB7XG4gIGxldCBpdGVyYXRvciA9IEl0ZXJhdG9yLmVtcHR5KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzb3VyY2VEYXRhLmluICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgZGlyZWN0aW9uICE9PSAnb3V0JyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEuaW5cbiAgICApXG4gICAgICBpdGVyYXRvciA9IGNoYWluKGl0ZXJhdG9yLCBjcmVhdGVJdGVyYXRvckZvcktleShzb3VyY2VEYXRhLmluLCB0YXJnZXQpKTtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzb3VyY2VEYXRhLm91dCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIGRpcmVjdGlvbiAhPT0gJ2luJyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEub3V0XG4gICAgKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3JGb3JLZXkoc291cmNlRGF0YS5vdXQsIHRhcmdldCkpO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygc291cmNlRGF0YS51bmRpcmVjdGVkICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgICAgIGl0ZXJhdG9yID0gY2hhaW4oXG4gICAgICAgIGl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVJdGVyYXRvckZvcktleShzb3VyY2VEYXRhLnVuZGlyZWN0ZWQsIHRhcmdldClcbiAgICAgICk7XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3I7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGFuIGVkZ2UgYXJyYXkgY3JlYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXJyYXlDcmVhdG9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgY2VydGFpbiBlZGdlcy5cbiAgICpcbiAgICogQXJpdHkgMDogUmV0dXJuIGFsbCB0aGUgcmVsZXZhbnQgZWRnZXMuXG4gICAqXG4gICAqIEFyaXR5IDE6IFJldHVybiBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICBub2RlICAgLSBUYXJnZXQgbm9kZS5cbiAgICpcbiAgICogQXJpdHkgMjogUmV0dXJuIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIFRhcmdldCBub2RlLlxuICAgKlxuICAgKiBAcmV0dXJuIHthcnJheXxudW1iZXJ9IC0gVGhlIGVkZ2VzIG9yIHRoZSBudW1iZXIgb2YgZWRnZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCkge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHJldHVybiBbXTtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNyZWF0ZUVkZ2VBcnJheSh0aGlzLCB0eXBlKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcblxuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7c291cmNlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXNcbiAgICAgIHJldHVybiBjcmVhdGVFZGdlQXJyYXlGb3JOb2RlKFxuICAgICAgICB0aGlzLm11bHRpLFxuICAgICAgICB0eXBlID09PSAnbWl4ZWQnID8gdGhpcy50eXBlIDogdHlwZSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBub2RlRGF0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBzb3VyY2Ugbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0XG4gICAgICByZXR1cm4gY3JlYXRlRWRnZUFycmF5Rm9yUGF0aChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy5tdWx0aSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBzb3VyY2VEYXRhLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHRvbyBtYW55IGFyZ3VtZW50cyAoZXhwZWN0aW5nIDAsIDEgb3IgMiBhbmQgZ290ICR7YXJndW1lbnRzLmxlbmd0aH0pLmBcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGF0dGFjaGluZyBhIGVkZ2UgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRm9yRWFjaEVkZ2UoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgZm9yRWFjaE5hbWUgPSAnZm9yRWFjaCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEsIC0xKTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3MgcmVsZXZhbnQgZWRnZXMgYnkgYXBwbHlpbmcgdGhlIGdpdmVuXG4gICAqIGNhbGxiYWNrLlxuICAgKlxuICAgKiBBcml0eSAxOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgYWxsIG9mIGEgbm9kZSdzIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAzOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHNvdXJjZSAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZvckVhY2hOYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpIHJldHVybjtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjYWxsYmFjayA9IHNvdXJjZTtcbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZSh0aGlzLCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgICAgY2FsbGJhY2sgPSB0YXJnZXQ7XG5cbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZURhdGEgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke2ZvckVhY2hOYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciBhIG5vZGUncyBlZGdlc1xuICAgICAgLy8gVE9ETzogbWF5YmUgYXR0YWNoIHRoZSBzdWIgbWV0aG9kIHRvIHRoZSBpbnN0YW5jZSBkeW5hbWljYWxseT9cbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZUZvck5vZGUoXG4gICAgICAgIHRoaXMubXVsdGksXG4gICAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIG5vZGVEYXRhLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7Zm9yRWFjaE5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLl9ub2Rlcy5oYXModGFyZ2V0KSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3RhcmdldH1cIiB0YXJnZXQgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXRcbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZUZvclBhdGgoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMubXVsdGksXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgc291cmNlRGF0YSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06IHRvbyBtYW55IGFyZ3VtZW50cyAoZXhwZWN0aW5nIDEsIDIgb3IgMyBhbmQgZ290ICR7YXJndW1lbnRzLmxlbmd0aH0pLmBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBtYXBwaW5nIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGJ5IGFwcGx5aW5nIHRoZSBnaXZlblxuICAgKiBjYWxsYmFjay5cbiAgICpcbiAgICogQXJpdHkgMTogTWFwIGFsbCB0aGUgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMjogTWFwIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMzogTWFwIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBzb3VyY2UgICAtIFNvdXJjZSBub2RlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIGNvbnN0IG1hcE5hbWUgPSAnbWFwJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG5cbiAgQ2xhc3MucHJvdG90eXBlW21hcE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgIGxldCByZXN1bHQ7XG5cbiAgICAvLyBXZSBrbm93IHRoZSByZXN1bHQgbGVuZ3RoIGJlZm9yZWhhbmRcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBsZW5ndGggPSAwO1xuXG4gICAgICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykgbGVuZ3RoICs9IHRoaXMudW5kaXJlY3RlZFNpemU7XG4gICAgICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSBsZW5ndGggKz0gdGhpcy5kaXJlY3RlZFNpemU7XG5cbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpO1xuXG4gICAgICBsZXQgaSA9IDA7XG5cbiAgICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgICByZXN1bHRbaSsrXSA9IGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgcmVzdWx0IGxlbmd0aCBiZWZvcmVoYW5kXG4gICAgLy8gVE9ETzogd2UgY2FuIGluIHNvbWUgaW5zdGFuY2VzIG9mIHNpbXBsZSBncmFwaHMsIGtub3dpbmcgZGVncmVlXG4gICAgZWxzZSB7XG4gICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgYXJncy5wdXNoKChlLCBlYSwgcywgdCwgc2EsIHRhLCB1KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZmlsdGVyaW5nIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGVcbiAgICogZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEZpbHRlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMjogRmlsdGVyIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMzogRmlsdGVyIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBzb3VyY2UgICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBmaWx0ZXJOYW1lID0gJ2ZpbHRlcicgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtmaWx0ZXJOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgaWYgKGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpKSByZXN1bHQucHVzaChlKTtcbiAgICB9KTtcblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmVkdWNpbmcgdGhlIGdyYXBoJ3MgcmVsZXZhbnQgZWRnZXMgdXNpbmcgdGhlIHByb3ZpZGVkIGFjY3VtdWxhdG9yXG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAxOiBSZWR1Y2UgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDI6IFJlZHVjZSBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDM6IFJlZHVjZSB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgICAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgcmVkdWNlTmFtZSA9ICdyZWR1Y2UnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcblxuICBDbGFzcy5wcm90b3R5cGVbcmVkdWNlTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoIDwgMiB8fCBhcmdzLmxlbmd0aCA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7cmVkdWNlTmFtZX06IGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoZXhwZWN0aW5nIDIsIDMgb3IgNCBhbmQgZ290ICR7YXJncy5sZW5ndGh9KS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMl0gIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7cmVkdWNlTmFtZX06IG1pc3NpbmcgaW5pdGlhbCB2YWx1ZS4gWW91IG11c3QgcHJvdmlkZSBpdCBiZWNhdXNlIHRoZSBjYWxsYmFjayB0YWtlcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGFuZCB3ZSBjYW5ub3QgaW5mZXIgdGhlIGluaXRpYWwgdmFsdWUgZnJvbSB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhcyB5b3UgY291bGQgd2l0aCBhIHNpbXBsZSBhcnJheS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBjYWxsYmFjaztcbiAgICBsZXQgaW5pdGlhbFZhbHVlO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICBpbml0aWFsVmFsdWUgPSBhcmdzWzFdO1xuICAgICAgYXJncyA9IFtdO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IGFyZ3NbMl07XG4gICAgICBhcmdzID0gW2FyZ3NbMF1dO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDQpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJnc1syXTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IGFyZ3NbM107XG4gICAgICBhcmdzID0gW2FyZ3NbMF0sIGFyZ3NbMV1dO1xuICAgIH1cblxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSk7XG4gICAgfSk7XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBicmVha2FibGUgZWRnZSBjYWxsYmFjayBpdGVyYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoXG4gKiBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRmluZEVkZ2UoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgZmluZEVkZ2VOYW1lID0gJ2ZpbmQnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxLCAtMSk7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIG1hdGNoXG4gICAqIG9uZSBvZiB0aGVtIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDI6IEl0ZXJhdGUgb3ZlciBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDM6IEl0ZXJhdGUgb3ZlciB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbZmluZEVkZ2VOYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY2FsbGJhY2sgPSBzb3VyY2U7XG4gICAgICByZXR1cm4gZmluZEVkZ2UodGhpcywgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIGNhbGxiYWNrID0gdGFyZ2V0O1xuXG4gICAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAodHlwZW9mIG5vZGVEYXRhID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzXG4gICAgICAvLyBUT0RPOiBtYXliZSBhdHRhY2ggdGhlIHN1YiBtZXRob2QgdG8gdGhlIGluc3RhbmNlIGR5bmFtaWNhbGx5P1xuICAgICAgcmV0dXJuIGZpbmRFZGdlRm9yTm9kZShcbiAgICAgICAgdGhpcy5tdWx0aSxcbiAgICAgICAgdHlwZSA9PT0gJ21peGVkJyA/IHRoaXMudHlwZSA6IHR5cGUsXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgbm9kZURhdGEsXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghc291cmNlRGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLl9ub2Rlcy5oYXModGFyZ2V0KSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0XG4gICAgICByZXR1cm4gZmluZEVkZ2VGb3JQYXRoKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLm11bHRpLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIHNvdXJjZURhdGEsXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgY2FsbGJhY2tcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7ZmluZEVkZ2VOYW1lfTogdG9vIG1hbnkgYXJndW1lbnRzIChleHBlY3RpbmcgMSwgMiBvciAzIGFuZCBnb3QgJHthcmd1bWVudHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIGFzc2VydFxuICAgKiB3aGV0aGVyIGFueSBvbmUgb2YgdGhlbSBtYXRjaGVzIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDI6IEl0ZXJhdGUgb3ZlciBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDM6IEl0ZXJhdGUgb3ZlciB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBzb21lTmFtZSA9ICdzb21lJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSwgLTEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtzb21lTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuXG4gICAgYXJncy5wdXNoKChlLCBlYSwgcywgdCwgc2EsIHRhLCB1KSA9PiB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3VuZCA9IHRoaXNbZmluZEVkZ2VOYW1lXS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIGFzc2VydFxuICAgKiB3aGV0aGVyIGFsbCBvZiB0aGVtIG1hdGNoZSB0aGUgcHJvdmlkZWQgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAxOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgYWxsIG9mIGEgbm9kZSdzIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAzOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHNvdXJjZSAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZXZlcnlOYW1lID0gJ2V2ZXJ5JyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSwgLTEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtldmVyeU5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgcmV0dXJuICFjYWxsYmFjayhlLCBlYSwgcywgdCwgc2EsIHRhLCB1KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZvdW5kID0gdGhpc1tmaW5kRWRnZU5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYW4gZWRnZSBpdGVyYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlSXRlcmF0b3JDcmVhdG9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZTogb3JpZ2luYWxOYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgbmFtZSA9IG9yaWdpbmFsTmFtZS5zbGljZSgwLCAtMSkgKyAnRW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBncmFwaCdzIGVkZ2VzLlxuICAgKlxuICAgKiBBcml0eSAwOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICpcbiAgICogQXJpdHkgMTogSXRlcmF0ZSBvdmVyIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgIG5vZGUgICAtIFRhcmdldCBub2RlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgIHNvdXJjZSAtIFNvdXJjZSBub2RlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgdGFyZ2V0IC0gVGFyZ2V0IG5vZGUuXG4gICAqXG4gICAqIEByZXR1cm4ge2FycmF5fG51bWJlcn0gLSBUaGUgZWRnZXMgb3IgdGhlIG51bWJlciBvZiBlZGdlcy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiB0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgcmV0dXJuIEl0ZXJhdG9yLmVtcHR5KCk7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjcmVhdGVFZGdlSXRlcmF0b3IodGhpcywgdHlwZSk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG5cbiAgICAgIGNvbnN0IHNvdXJjZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzXG4gICAgICByZXR1cm4gY3JlYXRlRWRnZUl0ZXJhdG9yRm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIHNvdXJjZURhdGEpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghc291cmNlRGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtuYW1lfTogIGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7c291cmNlfVwiIHNvdXJjZSBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIGlmICghdGhpcy5fbm9kZXMuaGFzKHRhcmdldCkpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3RhcmdldH1cIiB0YXJnZXQgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXRcbiAgICAgIHJldHVybiBjcmVhdGVFZGdlSXRlcmF0b3JGb3JQYXRoKHR5cGUsIGRpcmVjdGlvbiwgc291cmNlRGF0YSwgdGFyZ2V0KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogdG9vIG1hbnkgYXJndW1lbnRzIChleHBlY3RpbmcgMCwgMSBvciAyIGFuZCBnb3QgJHthcmd1bWVudHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGV2ZXJ5IGVkZ2UgaXRlcmF0aW9uIG1ldGhvZCB0byB0aGUgR3JhcGggY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gR3JhcGggLSBHcmFwaCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoRWRnZUl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpIHtcbiAgRURHRVNfSVRFUkFUSU9OLmZvckVhY2goZGVzY3JpcHRpb24gPT4ge1xuICAgIGF0dGFjaEVkZ2VBcnJheUNyZWF0b3IoR3JhcGgsIGRlc2NyaXB0aW9uKTtcbiAgICBhdHRhY2hGb3JFYWNoRWRnZShHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZpbmRFZGdlKEdyYXBoLCBkZXNjcmlwdGlvbik7XG4gICAgYXR0YWNoRWRnZUl0ZXJhdG9yQ3JlYXRvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgTmVpZ2hib3IgSXRlcmF0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBBdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSBHcmFwaCBjbGFzcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb3ZlclxuICogbmVpZ2hib3JzLlxuICovXG5pbXBvcnQgSXRlcmF0b3IgZnJvbSAnb2JsaXRlcmF0b3IvaXRlcmF0b3InO1xuaW1wb3J0IGNoYWluIGZyb20gJ29ibGl0ZXJhdG9yL2NoYWluJztcbmltcG9ydCB0YWtlIGZyb20gJ29ibGl0ZXJhdG9yL3Rha2UnO1xuXG5pbXBvcnQge05vdEZvdW5kR3JhcGhFcnJvciwgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogRGVmaW5pdGlvbnMuXG4gKi9cbmNvbnN0IE5FSUdIQk9SU19JVEVSQVRJT04gPSBbXG4gIHtcbiAgICBuYW1lOiAnbmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnaW5OZWlnaGJvcnMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnaW4nXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnb3V0TmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdpbmJvdW5kTmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ2luJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ291dGJvdW5kTmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdkaXJlY3RlZE5laWdoYm9ycycsXG4gICAgdHlwZTogJ2RpcmVjdGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ3VuZGlyZWN0ZWROZWlnaGJvcnMnLFxuICAgIHR5cGU6ICd1bmRpcmVjdGVkJ1xuICB9XG5dO1xuXG4vKipcbiAqIEZ1bmN0aW9uIG1lcmdpbmcgbmVpZ2hib3JzIGludG8gdGhlIGdpdmVuIHNldCBpdGVyYXRpbmcgb3ZlciB0aGUgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QmFzaWNTZXR9IG5laWdoYm9ycyAtIE5laWdoYm9ycyBzZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAgLSBUYXJnZXQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBtZXJnZShuZWlnaGJvcnMsIG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IG5laWdoYm9yIGluIG9iamVjdCkgbmVpZ2hib3JzLmFkZChuZWlnaGJvcik7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgcmVsZXZhbnQgbmVpZ2hib3JzIGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICBkaXJlY3Rpb24gLSBEaXJlY3Rpb24uXG4gKiBAcGFyYW0gIHthbnl9ICAgICAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICAgICAgICAgIC0gVGhlIGxpc3Qgb2YgbmVpZ2hib3JzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVOZWlnaGJvckFycmF5Rm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIC8vIElmIHdlIHdhbnQgb25seSB1bmRpcmVjdGVkIG9yIGluIG9yIG91dCwgd2UgY2FuIHJvbGwgc29tZSBvcHRpbWl6YXRpb25zXG4gIGlmICh0eXBlICE9PSAnbWl4ZWQnKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIE9iamVjdC5rZXlzKG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gT2JqZWN0LmtleXMobm9kZURhdGFbZGlyZWN0aW9uXSk7XG4gIH1cblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IG5laWdoYm9ycyA9IG5ldyBTZXQoKTtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIG1lcmdlKG5laWdoYm9ycywgbm9kZURhdGEuaW4pO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nKSB7XG4gICAgICBtZXJnZShuZWlnaGJvcnMsIG5vZGVEYXRhLm91dCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBtZXJnZShuZWlnaGJvcnMsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIHRha2UobmVpZ2hib3JzLnZhbHVlcygpLCBuZWlnaGJvcnMuc2l6ZSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgdGhlIGdpdmVuIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnMgdXNpbmcgYVxuICogY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIERpcmVjdGlvbi5cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoSW5PYmplY3Qobm9kZURhdGEsIG9iamVjdCwgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkgZWRnZURhdGEgPSBlZGdlRGF0YS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlLFxuICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgIGNvbnN0IG5laWdoYm9yRGF0YSA9IHNvdXJjZURhdGEgPT09IG5vZGVEYXRhID8gdGFyZ2V0RGF0YSA6IHNvdXJjZURhdGE7XG5cbiAgICBjYWxsYmFjayhuZWlnaGJvckRhdGEua2V5LCBuZWlnaGJvckRhdGEuYXR0cmlidXRlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgb2JqZWN0LCBjYWxsYmFjaykge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSB7XG4gICAgbGV0IGVkZ2VEYXRhID0gb2JqZWN0W2tdO1xuXG4gICAgaWYgKGVkZ2VEYXRhIGluc3RhbmNlb2YgU2V0KSBlZGdlRGF0YSA9IGVkZ2VEYXRhLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2UsXG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIGlmICh2aXNpdGVkLmhhcyhuZWlnaGJvckRhdGEua2V5KSkgY29udGludWU7XG5cbiAgICB2aXNpdGVkLmFkZChuZWlnaGJvckRhdGEua2V5KTtcblxuICAgIGNhbGxiYWNrKG5laWdoYm9yRGF0YS5rZXksIG5laWdoYm9yRGF0YS5hdHRyaWJ1dGVzKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBnaXZlbiBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzIHRvIG1hdGNoXG4gKiBvbmUgb2YgdGhlbSB1c2luZyBhIHByZWRpY2F0ZWQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIERpcmVjdGlvbi5cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmaW5kSW5PYmplY3Qobm9kZURhdGEsIG9iamVjdCwgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkgZWRnZURhdGEgPSBlZGdlRGF0YS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlO1xuICAgIGNvbnN0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICBjb25zdCBuZWlnaGJvckRhdGEgPSBzb3VyY2VEYXRhID09PSBub2RlRGF0YSA/IHRhcmdldERhdGEgOiBzb3VyY2VEYXRhO1xuXG4gICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhuZWlnaGJvckRhdGEua2V5LCBuZWlnaGJvckRhdGEuYXR0cmlidXRlcyk7XG5cbiAgICBpZiAoc2hvdWxkQnJlYWspIHJldHVybiBuZWlnaGJvckRhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBvYmplY3QsIGNhbGxiYWNrKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmplY3QpIHtcbiAgICBsZXQgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICBpZiAoZWRnZURhdGEgaW5zdGFuY2VvZiBTZXQpIGVkZ2VEYXRhID0gZWRnZURhdGEudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IGVkZ2VEYXRhLnNvdXJjZTtcbiAgICBjb25zdCB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIGlmICh2aXNpdGVkLmhhcyhuZWlnaGJvckRhdGEua2V5KSkgY29udGludWU7XG5cbiAgICB2aXNpdGVkLmFkZChuZWlnaGJvckRhdGEua2V5KTtcblxuICAgIGNvbnN0IHNob3VsZEJyZWFrID0gY2FsbGJhY2sobmVpZ2hib3JEYXRhLmtleSwgbmVpZ2hib3JEYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKHNob3VsZEJyZWFrKSByZXR1cm4gbmVpZ2hib3JEYXRhLmtleTtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaE5laWdoYm9yRm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhLCBjYWxsYmFjaykge1xuICAvLyBJZiB3ZSB3YW50IG9ubHkgdW5kaXJlY3RlZCBvciBpbiBvciBvdXQsIHdlIGNhbiByb2xsIHNvbWUgb3B0aW1pemF0aW9uc1xuICBpZiAodHlwZSAhPT0gJ21peGVkJykge1xuICAgIGlmICh0eXBlID09PSAndW5kaXJlY3RlZCcpXG4gICAgICByZXR1cm4gZm9yRWFjaEluT2JqZWN0KG5vZGVEYXRhLCBub2RlRGF0YS51bmRpcmVjdGVkLCBjYWxsYmFjayk7XG5cbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gZm9yRWFjaEluT2JqZWN0KG5vZGVEYXRhLCBub2RlRGF0YVtkaXJlY3Rpb25dLCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBmb3JFYWNoSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5pbiwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nKSB7XG4gICAgICBmb3JFYWNoSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5vdXQsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGZvckVhY2hJbk9iamVjdE9uY2UodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLnVuZGlyZWN0ZWQsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTmVpZ2hib3IodHlwZSwgZGlyZWN0aW9uLCBub2RlRGF0YSwgY2FsbGJhY2spIHtcbiAgLy8gSWYgd2Ugd2FudCBvbmx5IHVuZGlyZWN0ZWQgb3IgaW4gb3Igb3V0LCB3ZSBjYW4gcm9sbCBzb21lIG9wdGltaXphdGlvbnNcbiAgaWYgKHR5cGUgIT09ICdtaXhlZCcpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKVxuICAgICAgcmV0dXJuIGZpbmRJbk9iamVjdChub2RlRGF0YSwgbm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIGZpbmRJbk9iamVjdChub2RlRGF0YSwgbm9kZURhdGFbZGlyZWN0aW9uXSwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gRWxzZSB3ZSBuZWVkIHRvIGtlZXAgYSBzZXQgb2YgbmVpZ2hib3JzIG5vdCB0byByZXR1cm4gZHVwbGljYXRlc1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldCgpO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIGZvdW5kID0gZmluZEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgbm9kZURhdGEuaW4sIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGZvdW5kID0gZmluZEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgbm9kZURhdGEub3V0LCBjYWxsYmFjayk7XG5cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm91bmQgPSBmaW5kSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS51bmRpcmVjdGVkLCBjYWxsYmFjayk7XG5cbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZ2l2ZW4gbm9kZSdzIHJlbGV2YW50IG5laWdoYm9ycy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgIC0gVHlwZSBvZiBuZWlnaGJvcnMuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uIC0gRGlyZWN0aW9uLlxuICogQHBhcmFtICB7YW55fSAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RJdGVyYXRvcihub2RlRGF0YSwgb2JqZWN0KSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLFxuICAgIGwgPSBrZXlzLmxlbmd0aDtcblxuICBsZXQgaSA9IDA7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGkgPj0gbCkgcmV0dXJuIHtkb25lOiB0cnVlfTtcblxuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrZXlzW2krK11dO1xuXG4gICAgaWYgKGVkZ2VEYXRhIGluc3RhbmNlb2YgU2V0KSBlZGdlRGF0YSA9IGVkZ2VEYXRhLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2UsXG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlOiB7bmVpZ2hib3I6IG5laWdoYm9yRGF0YS5rZXksIGF0dHJpYnV0ZXM6IG5laWdoYm9yRGF0YS5hdHRyaWJ1dGVzfVxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG9iamVjdCkge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KSxcbiAgICBsID0ga2V5cy5sZW5ndGg7XG5cbiAgbGV0IGkgPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgbGV0IGVkZ2VEYXRhID0gb2JqZWN0W2tleXNbaSsrXV07XG5cbiAgICBpZiAoZWRnZURhdGEgaW5zdGFuY2VvZiBTZXQpIGVkZ2VEYXRhID0gZWRnZURhdGEudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IGVkZ2VEYXRhLnNvdXJjZSxcbiAgICAgIHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICBjb25zdCBuZWlnaGJvckRhdGEgPSBzb3VyY2VEYXRhID09PSBub2RlRGF0YSA/IHRhcmdldERhdGEgOiBzb3VyY2VEYXRhO1xuXG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5laWdoYm9yRGF0YS5rZXkpKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgdmlzaXRlZC5hZGQobmVpZ2hib3JEYXRhLmtleSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZToge25laWdoYm9yOiBuZWlnaGJvckRhdGEua2V5LCBhdHRyaWJ1dGVzOiBuZWlnaGJvckRhdGEuYXR0cmlidXRlc31cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmVpZ2hib3JJdGVyYXRvcih0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIC8vIElmIHdlIHdhbnQgb25seSB1bmRpcmVjdGVkIG9yIGluIG9yIG91dCwgd2UgY2FuIHJvbGwgc29tZSBvcHRpbWl6YXRpb25zXG4gIGlmICh0eXBlICE9PSAnbWl4ZWQnKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJylcbiAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJdGVyYXRvcihub2RlRGF0YSwgbm9kZURhdGEudW5kaXJlY3RlZCk7XG5cbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gY3JlYXRlT2JqZWN0SXRlcmF0b3Iobm9kZURhdGEsIG5vZGVEYXRhW2RpcmVjdGlvbl0pO1xuICB9XG5cbiAgbGV0IGl0ZXJhdG9yID0gSXRlcmF0b3IuZW1wdHkoKTtcblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBpdGVyYXRvciA9IGNoYWluKFxuICAgICAgICBpdGVyYXRvcixcbiAgICAgICAgY3JlYXRlRGVkdXBlZE9iamVjdEl0ZXJhdG9yKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5pbilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGl0ZXJhdG9yID0gY2hhaW4oXG4gICAgICAgIGl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLm91dClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpdGVyYXRvciA9IGNoYWluKFxuICAgICAgaXRlcmF0b3IsXG4gICAgICBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvcjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgYXJyYXkgY3JlYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hOZWlnaGJvckFycmF5Q3JlYXRvcihDbGFzcywgZGVzY3JpcHRpb24pIHtcbiAgY29uc3Qge25hbWUsIHR5cGUsIGRpcmVjdGlvbn0gPSBkZXNjcmlwdGlvbjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGFycmF5IG9mIGNlcnRhaW4gbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgbm9kZSAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEByZXR1cm4ge2FycmF5fSAtIFRoZSBuZWlnaGJvcnMgb2YgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIG5vZGUgaXMgbm90IGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiB0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgcmV0dXJuIFtdO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtuYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBIZXJlLCB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBhIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnNcbiAgICByZXR1cm4gY3JlYXRlTmVpZ2hib3JBcnJheUZvck5vZGUoXG4gICAgICB0eXBlID09PSAnbWl4ZWQnID8gdGhpcy50eXBlIDogdHlwZSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIG5vZGVEYXRhXG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRm9yRWFjaE5laWdoYm9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIGNvbnN0IGZvckVhY2hOYW1lID0gJ2ZvckVhY2gnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxLCAtMSk7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHVzaW5nIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZvckVhY2hOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSkgcmV0dXJuO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgLy8gSGVyZSwgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIgYSBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzXG4gICAgZm9yRWFjaE5laWdoYm9yRm9yTm9kZShcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGEsXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIG1hcHBpbmcgdGhlIHJlbGV2YW50IG5laWdoYm9ycyB1c2luZyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBtYXBOYW1lID0gJ21hcCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVttYXBOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIFRPRE86IG9wdGltaXplIHdoZW4gc2l6ZSBpcyBrbm93biBiZWZvcmVoYW5kXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXShub2RlLCAobiwgYSkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2sobiwgYSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZmlsdGVyaW5nIHRoZSByZWxldmFudCBuZWlnaGJvcnMgdXNpbmcgYSBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZmlsdGVyTmFtZSA9ICdmaWx0ZXInICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcblxuICBDbGFzcy5wcm90b3R5cGVbZmlsdGVyTmFtZV0gPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdKG5vZGUsIChuLCBhKSA9PiB7XG4gICAgICBpZiAoY2FsbGJhY2sobiwgYSkpIHJlc3VsdC5wdXNoKG4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmVkdWNpbmcgdGhlIHJlbGV2YW50IG5laWdoYm9ycyB1c2luZyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCByZWR1Y2VOYW1lID0gJ3JlZHVjZScgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtyZWR1Y2VOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtyZWR1Y2VOYW1lfTogbWlzc2luZyBpbml0aWFsIHZhbHVlLiBZb3UgbXVzdCBwcm92aWRlIGl0IGJlY2F1c2UgdGhlIGNhbGxiYWNrIHRha2VzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgYW5kIHdlIGNhbm5vdCBpbmZlciB0aGUgaW5pdGlhbCB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBpdGVyYXRpb24sIGFzIHlvdSBjb3VsZCB3aXRoIGEgc2ltcGxlIGFycmF5LmBcbiAgICAgICk7XG5cbiAgICBsZXQgYWNjdW11bGF0b3IgPSBpbml0aWFsVmFsdWU7XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXShub2RlLCAobiwgYSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgbiwgYSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGEgYnJlYWthYmxlIG5laWdoYm9ycyBjYWxsYmFjayBpdGVyYXRvciBtZXRob2QgdG8gdGhlXG4gKiBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRmluZE5laWdoYm9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIGNvbnN0IGNhcGl0YWxpemVkU2luZ3VsYXIgPSBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEsIC0xKTtcblxuICBjb25zdCBmaW5kTmFtZSA9ICdmaW5kJyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHVzaW5nIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZpbmROYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSkgcmV0dXJuO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtmaW5kTmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgLy8gSGVyZSwgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIgYSBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzXG4gICAgcmV0dXJuIGZpbmROZWlnaGJvcihcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGEsXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHRvIGZpbmQgaWYgYW55IG9mIHRoZW1cbiAgICogbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBzb21lTmFtZSA9ICdzb21lJyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgQ2xhc3MucHJvdG90eXBlW3NvbWVOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpc1tmaW5kTmFtZV0obm9kZSwgY2FsbGJhY2spO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYWxsIHRoZSByZWxldmFudCBuZWlnaGJvcnMgdG8gZmluZCBpZiBhbGwgb2YgdGhlbVxuICAgKiBtYXRjaGUgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZXZlcnlOYW1lID0gJ2V2ZXJ5JyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgQ2xhc3MucHJvdG90eXBlW2V2ZXJ5TmFtZV0gPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXNbZmluZE5hbWVdKG5vZGUsIChuLCBhKSA9PiB7XG4gICAgICByZXR1cm4gIWNhbGxiYWNrKG4sIGEpO1xuICAgIH0pO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoTmVpZ2hib3JJdGVyYXRvckNyZWF0b3IoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgaXRlcmF0b3JOYW1lID0gbmFtZS5zbGljZSgwLCAtMSkgKyAnRW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHJldHVybiB7SXRlcmF0b3J9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtpdGVyYXRvck5hbWVdID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICByZXR1cm4gSXRlcmF0b3IuZW1wdHkoKTtcblxuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICh0eXBlb2Ygbm9kZURhdGEgPT09ICd1bmRlZmluZWQnKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7aXRlcmF0b3JOYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBIZXJlLCB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBhIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnNcbiAgICByZXR1cm4gY3JlYXRlTmVpZ2hib3JJdGVyYXRvcihcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGFcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGF0dGFjaGluZyBldmVyeSBuZWlnaGJvciBpdGVyYXRpb24gbWV0aG9kIHRvIHRoZSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIEdyYXBoIGNsYXNzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdHRhY2hOZWlnaGJvckl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpIHtcbiAgTkVJR0hCT1JTX0lURVJBVElPTi5mb3JFYWNoKGRlc2NyaXB0aW9uID0+IHtcbiAgICBhdHRhY2hOZWlnaGJvckFycmF5Q3JlYXRvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZvckVhY2hOZWlnaGJvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZpbmROZWlnaGJvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaE5laWdoYm9ySXRlcmF0b3JDcmVhdG9yKEdyYXBoLCBkZXNjcmlwdGlvbik7XG4gIH0pO1xufVxuIiwgIi8qKlxuICogR3JhcGhvbG9neSBBZGphY2VuY3kgSXRlcmF0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEF0dGFjaGluZyBzb21lIG1ldGhvZHMgdG8gdGhlIEdyYXBoIGNsYXNzIHRvIGJlIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGFcbiAqIGdyYXBoJ3MgYWRqYWNlbmN5LlxuICovXG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBzaW1wbGUgZ3JhcGgncyBhZGphY2VuY3kgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICBicmVha2FibGUgICAgICAgICAtIENhbiB3ZSBicmVhaz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gIGFzc3ltZXRyaWMgICAgICAgIC0gV2hldGhlciB0byBlbWl0IHVuZGlyZWN0ZWQgZWRnZXMgb25seSBvbmNlLlxuICogQHBhcmFtIHtib29sZWFufSAgZGlzY29ubmVjdGVkTm9kZXMgLSBXaGV0aGVyIHRvIGVtaXQgZGlzY29ubmVjdGVkIG5vZGVzLlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAgICAgICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBmdW5jdGlvbiAgICAgICAgICAtIEl0ZXJhdGlvbiBjYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoXG4gIGJyZWFrYWJsZSxcbiAgYXNzeW1ldHJpYyxcbiAgZGlzY29ubmVjdGVkTm9kZXMsXG4gIGdyYXBoLFxuICBjYWxsYmFja1xuKSB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gZ3JhcGguX25vZGVzLnZhbHVlcygpO1xuXG4gIGNvbnN0IHR5cGUgPSBncmFwaC50eXBlO1xuXG4gIGxldCBzdGVwLCBzb3VyY2VEYXRhLCBuZWlnaGJvciwgYWRqLCBlZGdlRGF0YSwgdGFyZ2V0RGF0YSwgc2hvdWxkQnJlYWs7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBsZXQgaGFzRWRnZXMgPSBmYWxzZTtcblxuICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGVkZ2VEYXRhID0gYWRqW25laWdoYm9yXTtcbiAgICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgICBoYXNFZGdlcyA9IHRydWU7XG4gICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHRhcmdldERhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICBlZGdlRGF0YS5rZXksXG4gICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgICBhZGogPSBzb3VyY2VEYXRhLnVuZGlyZWN0ZWQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGlmIChhc3N5bWV0cmljICYmIHNvdXJjZURhdGEua2V5ID4gbmVpZ2hib3IpIGNvbnRpbnVlO1xuXG4gICAgICAgIGVkZ2VEYXRhID0gYWRqW25laWdoYm9yXTtcbiAgICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgICBpZiAodGFyZ2V0RGF0YS5rZXkgIT09IG5laWdoYm9yKSB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4gICAgICAgIGhhc0VkZ2VzID0gdHJ1ZTtcbiAgICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICB0YXJnZXREYXRhLmtleSxcbiAgICAgICAgICBzb3VyY2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYnJlYWthYmxlICYmIHNob3VsZEJyZWFrKSByZXR1cm4gZWRnZURhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2Nvbm5lY3RlZE5vZGVzICYmICFoYXNFZGdlcykge1xuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcblxuICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGEgbXVsdGkgZ3JhcGgncyBhZGphY2VuY3kgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICBicmVha2FibGUgICAgICAgICAtIENhbiB3ZSBicmVhaz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gIGFzc3ltZXRyaWMgICAgICAgIC0gV2hldGhlciB0byBlbWl0IHVuZGlyZWN0ZWQgZWRnZXMgb25seSBvbmNlLlxuICogQHBhcmFtIHtib29sZWFufSAgZGlzY29ubmVjdGVkTm9kZXMgLSBXaGV0aGVyIHRvIGVtaXQgZGlzY29ubmVjdGVkIG5vZGVzLlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAgICAgICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBmdW5jdGlvbiAgICAgICAgICAtIEl0ZXJhdGlvbiBjYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hBZGphY2VuY3lNdWx0aShcbiAgYnJlYWthYmxlLFxuICBhc3N5bWV0cmljLFxuICBkaXNjb25uZWN0ZWROb2RlcyxcbiAgZ3JhcGgsXG4gIGNhbGxiYWNrXG4pIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbiAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbiAgbGV0IHN0ZXA7XG4gIGxldCBzb3VyY2VEYXRhO1xuICBsZXQgbmVpZ2hib3I7XG4gIGxldCBjb250YWluZXI7XG4gIGxldCBjb250YWluZXJTdGVwO1xuICBsZXQgYWRqO1xuICBsZXQgZWRnZURhdGE7XG4gIGxldCB0YXJnZXREYXRhO1xuICBsZXQgc2hvdWxkQnJlYWs7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBsZXQgaGFzRWRnZXMgPSBmYWxzZTtcblxuICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGNvbnRhaW5lciA9IGFkaltuZWlnaGJvcl0udmFsdWVzKCk7XG5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICgoY29udGFpbmVyU3RlcCA9IGNvbnRhaW5lci5uZXh0KCkpLCBjb250YWluZXJTdGVwLmRvbmUgIT09IHRydWUpXG4gICAgICAgICkge1xuICAgICAgICAgIGVkZ2VEYXRhID0gY29udGFpbmVyU3RlcC52YWx1ZTtcbiAgICAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgICAgICAgaGFzRWRnZXMgPSB0cnVlO1xuICAgICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGFkaiA9IHNvdXJjZURhdGEudW5kaXJlY3RlZDtcblxuICAgICAgZm9yIChuZWlnaGJvciBpbiBhZGopIHtcbiAgICAgICAgaWYgKGFzc3ltZXRyaWMgJiYgc291cmNlRGF0YS5rZXkgPiBuZWlnaGJvcikgY29udGludWU7XG5cbiAgICAgICAgY29udGFpbmVyID0gYWRqW25laWdoYm9yXS52YWx1ZXMoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgKChjb250YWluZXJTdGVwID0gY29udGFpbmVyLm5leHQoKSksIGNvbnRhaW5lclN0ZXAuZG9uZSAhPT0gdHJ1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZWRnZURhdGEgPSBjb250YWluZXJTdGVwLnZhbHVlO1xuICAgICAgICAgIHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0RGF0YS5rZXkgIT09IG5laWdoYm9yKSB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4gICAgICAgICAgaGFzRWRnZXMgPSB0cnVlO1xuICAgICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2Nvbm5lY3RlZE5vZGVzICYmICFoYXNFZGdlcykge1xuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcblxuICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vLyBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWRqYWNlbmN5SXRlcmF0b3JTaW1wbGUoZ3JhcGgpIHtcbi8vICAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbi8vICAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbi8vICAgbGV0IHN0YXRlID0gJ291dGVyJyxcbi8vICAgICBzb3VyY2VEYXRhLFxuLy8gICAgIG5laWdoYm9ycyxcbi8vICAgICBhZGosXG4vLyAgICAgb2Zmc2V0O1xuXG4vLyAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gbmV4dCgpIHtcbi8vICAgICBsZXQgc3RlcDtcblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ291dGVyJykge1xuLy8gICAgICAgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuLy8gICAgICAgaWYgKHN0ZXAuZG9uZSA9PT0gdHJ1ZSkgcmV0dXJuIHN0ZXA7XG5cbi8vICAgICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4vLyAgICAgICBzdGF0ZSA9ICdkaXJlY3RlZCc7XG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ2RpcmVjdGVkJykge1xuLy8gICAgICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJykge1xuLy8gICAgICAgICBzdGF0ZSA9ICd1bmRpcmVjdGVkJztcbi8vICAgICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG4vLyAgICAgICBuZWlnaGJvcnMgPSBPYmplY3Qua2V5cyhzb3VyY2VEYXRhLm91dCk7XG4vLyAgICAgICBvZmZzZXQgPSAwO1xuLy8gICAgICAgc3RhdGUgPSAnaW5uZXItZGlyZWN0ZWQnO1xuXG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ3VuZGlyZWN0ZWQnKSB7XG4vLyAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGVkJykge1xuLy8gICAgICAgICBzdGF0ZSA9ICdvdXRlcic7XG4vLyAgICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgICB9XG5cbi8vICAgICAgIGFkaiA9IHNvdXJjZURhdGEudW5kaXJlY3RlZDtcbi8vICAgICAgIG5laWdoYm9ycyA9IE9iamVjdC5rZXlzKHNvdXJjZURhdGEudW5kaXJlY3RlZCk7XG4vLyAgICAgICBvZmZzZXQgPSAwO1xuLy8gICAgICAgc3RhdGUgPSAnaW5uZXItdW5kaXJlY3RlZCc7XG4vLyAgICAgfVxuXG4vLyAgICAgLy8gSW5uZXJcbi8vICAgICBpZiAob2Zmc2V0ID49IG5laWdoYm9ycy5sZW5ndGgpIHtcbi8vICAgICAgIGlmIChzdGF0ZSA9PT0gJ2lubmVyLXVuZGlyZWN0ZWQnKSBzdGF0ZSA9ICdvdXRlcic7XG4vLyAgICAgICBlbHNlIHN0YXRlID0gJ3VuZGlyZWN0ZWQnO1xuXG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGNvbnN0IG5laWdoYm9yID0gbmVpZ2hib3JzW29mZnNldCsrXTtcbi8vICAgICBjb25zdCBlZGdlRGF0YSA9IGFkaltuZWlnaGJvcl07XG4vLyAgICAgbGV0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbi8vICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJyAmJiB0YXJnZXREYXRhLmtleSA9PT0gc291cmNlRGF0YS5rZXkpXG4vLyAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGRvbmU6IGZhbHNlLFxuLy8gICAgICAgdmFsdWU6IHtcbi8vICAgICAgICAgc291cmNlOiBzb3VyY2VEYXRhLmtleSxcbi8vICAgICAgICAgdGFyZ2V0OiB0YXJnZXREYXRhLmtleSxcbi8vICAgICAgICAgc291cmNlQXR0cmlidXRlczogc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuLy8gICAgICAgICB0YXJnZXRBdHRyaWJ1dGVzOiB0YXJnZXREYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIGVkZ2VLZXk6IGVkZ2VEYXRhLmtleSxcbi8vICAgICAgICAgZWRnZUF0dHJpYnV0ZXM6IGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIHVuZGlyZWN0ZWQ6IGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbi8vICAgICAgIH1cbi8vICAgICB9O1xuLy8gICB9KTtcbi8vIH1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkamFjZW5jeUl0ZXJhdG9yTXVsdGkoZ3JhcGgpIHtcbi8vICAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbi8vICAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbi8vICAgbGV0IHN0YXRlID0gJ291dGVyJyxcbi8vICAgICBzb3VyY2VEYXRhLFxuLy8gICAgIG5laWdoYm9ycyxcbi8vICAgICBjb250YWluZXIgPSBudWxsLFxuLy8gICAgIGFkaixcbi8vICAgICBvZmZzZXQ7XG5cbi8vICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiBuZXh0KCkge1xuLy8gICAgIGxldCBzdGVwO1xuXG4vLyAgICAgaWYgKHN0YXRlID09PSAnb3V0ZXInKSB7XG4vLyAgICAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4vLyAgICAgICBpZiAoc3RlcC5kb25lID09PSB0cnVlKSByZXR1cm4gc3RlcDtcblxuLy8gICAgICAgc291cmNlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbi8vICAgICAgIHN0YXRlID0gJ2RpcmVjdGVkJztcbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgaWYgKHN0YXRlID09PSAnZGlyZWN0ZWQnKSB7XG4vLyAgICAgICBpZiAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSB7XG4vLyAgICAgICAgIHN0YXRlID0gJ3VuZGlyZWN0ZWQnO1xuLy8gICAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICBhZGogPSBzb3VyY2VEYXRhLm91dDtcbi8vICAgICAgIG5laWdoYm9ycyA9IE9iamVjdC5rZXlzKHNvdXJjZURhdGEub3V0KTtcbi8vICAgICAgIG9mZnNldCA9IDA7XG4vLyAgICAgICBzdGF0ZSA9ICdpbm5lci1kaXJlY3RlZCc7XG5cbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgaWYgKHN0YXRlID09PSAndW5kaXJlY3RlZCcpIHtcbi8vICAgICAgIGlmICh0eXBlID09PSAnZGlyZWN0ZWQnKSB7XG4vLyAgICAgICAgIHN0YXRlID0gJ291dGVyJztcbi8vICAgICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgYWRqID0gc291cmNlRGF0YS51bmRpcmVjdGVkO1xuLy8gICAgICAgbmVpZ2hib3JzID0gT2JqZWN0LmtleXMoc291cmNlRGF0YS51bmRpcmVjdGVkKTtcbi8vICAgICAgIG9mZnNldCA9IDA7XG4vLyAgICAgICBzdGF0ZSA9ICdpbm5lci11bmRpcmVjdGVkJztcbi8vICAgICB9XG5cbi8vICAgICAvLyBJbm5lclxuLy8gICAgIGlmICghY29udGFpbmVyICYmIG9mZnNldCA+PSBuZWlnaGJvcnMubGVuZ3RoKSB7XG4vLyAgICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJykgc3RhdGUgPSAnb3V0ZXInO1xuLy8gICAgICAgZWxzZSBzdGF0ZSA9ICd1bmRpcmVjdGVkJztcblxuLy8gICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICB9XG5cbi8vICAgICBpZiAoIWNvbnRhaW5lcikge1xuLy8gICAgICAgY29uc3QgbmVpZ2hib3IgPSBuZWlnaGJvcnNbb2Zmc2V0KytdO1xuLy8gICAgICAgY29udGFpbmVyID0gYWRqW25laWdoYm9yXS52YWx1ZXMoKTtcbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgc3RlcCA9IGNvbnRhaW5lci5uZXh0KCk7XG5cbi8vICAgICBpZiAoc3RlcC5kb25lKSB7XG4vLyAgICAgICBjb250YWluZXIgPSBudWxsO1xuLy8gICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICB9XG5cbi8vICAgICBjb25zdCBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG4vLyAgICAgbGV0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbi8vICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJyAmJiB0YXJnZXREYXRhLmtleSA9PT0gc291cmNlRGF0YS5rZXkpXG4vLyAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGRvbmU6IGZhbHNlLFxuLy8gICAgICAgdmFsdWU6IHtcbi8vICAgICAgICAgc291cmNlOiBzb3VyY2VEYXRhLmtleSxcbi8vICAgICAgICAgdGFyZ2V0OiB0YXJnZXREYXRhLmtleSxcbi8vICAgICAgICAgc291cmNlQXR0cmlidXRlczogc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuLy8gICAgICAgICB0YXJnZXRBdHRyaWJ1dGVzOiB0YXJnZXREYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIGVkZ2U6IGVkZ2VEYXRhLmtleSxcbi8vICAgICAgICAgZWRnZUF0dHJpYnV0ZXM6IGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIHVuZGlyZWN0ZWQ6IGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbi8vICAgICAgIH1cbi8vICAgICB9O1xuLy8gICB9KTtcbi8vIH1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgU2VyaWFsaXphdGlvbiBVdGlsaXRpZXNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQ29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgdXNlZCB0byB2YWxpZGF0ZSBpbXBvcnQtZXhwb3J0IGZvcm1hdHMgJiB0byBvdXB1dFxuICogdGhlbSBmcm9tIGludGVybmFsIGdyYXBoIGRhdGEuXG4gKlxuICogU2VyaWFsaXplZCBOb2RlOlxuICoge2tleSwgP2F0dHJpYnV0ZXN9XG4gKlxuICogU2VyaWFsaXplZCBFZGdlOlxuICoge2tleT8sIHNvdXJjZSwgdGFyZ2V0LCBhdHRyaWJ1dGVzPywgdW5kaXJlY3RlZD99XG4gKlxuICogU2VyaWFsaXplZCBHcmFwaDpcbiAqIHtub2Rlc1tdLCBlZGdlcz9bXX1cbiAqL1xuaW1wb3J0IHthc3NpZ24sIGlzUGxhaW5PYmplY3QsIGlzRW1wdHl9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEZvcm1hdHMgaW50ZXJuYWwgbm9kZSBkYXRhIGludG8gYSBzZXJpYWxpemVkIG5vZGUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBrZXkgIC0gVGhlIG5vZGUncyBrZXkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgLSBJbnRlcm5hbCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAtIFRoZSBzZXJpYWxpemVkIG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVOb2RlKGtleSwgZGF0YSkge1xuICBjb25zdCBzZXJpYWxpemVkID0ge2tleX07XG5cbiAgaWYgKCFpc0VtcHR5KGRhdGEuYXR0cmlidXRlcykpXG4gICAgc2VyaWFsaXplZC5hdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgaW50ZXJuYWwgZWRnZSBkYXRhIGludG8gYSBzZXJpYWxpemVkIGVkZ2UuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBrZXkgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgLSBJbnRlcm5hbCBlZGdlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAtIFRoZSBzZXJpYWxpemVkIGVkZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFZGdlKGtleSwgZGF0YSkge1xuICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgIGtleSxcbiAgICBzb3VyY2U6IGRhdGEuc291cmNlLmtleSxcbiAgICB0YXJnZXQ6IGRhdGEudGFyZ2V0LmtleVxuICB9O1xuXG4gIGlmICghaXNFbXB0eShkYXRhLmF0dHJpYnV0ZXMpKVxuICAgIHNlcmlhbGl6ZWQuYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGF0YS5hdHRyaWJ1dGVzKTtcblxuICBpZiAoZGF0YS51bmRpcmVjdGVkKSBzZXJpYWxpemVkLnVuZGlyZWN0ZWQgPSB0cnVlO1xuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHNlcmlhbGl6ZWQgbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHttaXhlZH0gdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VyaWFsaXplZE5vZGUodmFsdWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgcmV0dXJuICdub3Qtb2JqZWN0JztcblxuICBpZiAoISgna2V5JyBpbiB2YWx1ZSkpIHJldHVybiAnbm8ta2V5JztcblxuICBpZiAoXG4gICAgJ2F0dHJpYnV0ZXMnIGluIHZhbHVlICYmXG4gICAgKCFpc1BsYWluT2JqZWN0KHZhbHVlLmF0dHJpYnV0ZXMpIHx8IHZhbHVlLmF0dHJpYnV0ZXMgPT09IG51bGwpXG4gIClcbiAgICByZXR1cm4gJ2ludmFsaWQtYXR0cmlidXRlcyc7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgc2VyaWFsaXplZCBlZGdlLlxuICpcbiAqIEBwYXJhbSAge21peGVkfSB2YWx1ZSAtIFRhcmdldCB2YWx1ZS5cbiAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTZXJpYWxpemVkRWRnZSh2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSByZXR1cm4gJ25vdC1vYmplY3QnO1xuXG4gIGlmICghKCdzb3VyY2UnIGluIHZhbHVlKSkgcmV0dXJuICduby1zb3VyY2UnO1xuXG4gIGlmICghKCd0YXJnZXQnIGluIHZhbHVlKSkgcmV0dXJuICduby10YXJnZXQnO1xuXG4gIGlmIChcbiAgICAnYXR0cmlidXRlcycgaW4gdmFsdWUgJiZcbiAgICAoIWlzUGxhaW5PYmplY3QodmFsdWUuYXR0cmlidXRlcykgfHwgdmFsdWUuYXR0cmlidXRlcyA9PT0gbnVsbClcbiAgKVxuICAgIHJldHVybiAnaW52YWxpZC1hdHRyaWJ1dGVzJztcblxuICBpZiAoJ3VuZGlyZWN0ZWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS51bmRpcmVjdGVkICE9PSAnYm9vbGVhbicpXG4gICAgcmV0dXJuICdpbnZhbGlkLXVuZGlyZWN0ZWQnO1xuXG4gIHJldHVybiBudWxsO1xufVxuIiwgIi8qIGVzbGludCBuby1uZXN0ZWQtdGVybmFyeTogMCAqL1xuLyoqXG4gKiBHcmFwaG9sb2d5IFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBncmFwaG9sb2d5IHNwZWNzLlxuICovXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBJdGVyYXRvciBmcm9tICdvYmxpdGVyYXRvci9pdGVyYXRvcic7XG5pbXBvcnQgdGFrZSBmcm9tICdvYmxpdGVyYXRvci90YWtlJztcblxuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsXG4gIE5vdEZvdW5kR3JhcGhFcnJvcixcbiAgVXNhZ2VHcmFwaEVycm9yXG59IGZyb20gJy4vZXJyb3JzJztcblxuaW1wb3J0IHtcbiAgTWl4ZWROb2RlRGF0YSxcbiAgRGlyZWN0ZWROb2RlRGF0YSxcbiAgVW5kaXJlY3RlZE5vZGVEYXRhLFxuICBFZGdlRGF0YVxufSBmcm9tICcuL2RhdGEnO1xuXG5pbXBvcnQge1xuICB1cGRhdGVTdHJ1Y3R1cmVJbmRleCxcbiAgY2xlYXJFZGdlRnJvbVN0cnVjdHVyZUluZGV4LFxuICBjbGVhclN0cnVjdHVyZUluZGV4LFxuICB1cGdyYWRlU3RydWN0dXJlSW5kZXhUb011bHRpXG59IGZyb20gJy4vaW5kaWNlcyc7XG5cbmltcG9ydCBhdHRhY2hOb2RlQXR0cmlidXRlc01ldGhvZHMgZnJvbSAnLi9hdHRyaWJ1dGVzL25vZGVzJztcbmltcG9ydCBhdHRhY2hFZGdlQXR0cmlidXRlc01ldGhvZHMgZnJvbSAnLi9hdHRyaWJ1dGVzL2VkZ2VzJztcbmltcG9ydCBhdHRhY2hFZGdlSXRlcmF0aW9uTWV0aG9kcyBmcm9tICcuL2l0ZXJhdGlvbi9lZGdlcyc7XG5pbXBvcnQgYXR0YWNoTmVpZ2hib3JJdGVyYXRpb25NZXRob2RzIGZyb20gJy4vaXRlcmF0aW9uL25laWdoYm9ycyc7XG5pbXBvcnQge1xuICBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlLFxuICBmb3JFYWNoQWRqYWNlbmN5TXVsdGlcbn0gZnJvbSAnLi9pdGVyYXRpb24vYWRqYWNlbmN5JztcblxuaW1wb3J0IHtcbiAgc2VyaWFsaXplTm9kZSxcbiAgc2VyaWFsaXplRWRnZSxcbiAgdmFsaWRhdGVTZXJpYWxpemVkTm9kZSxcbiAgdmFsaWRhdGVTZXJpYWxpemVkRWRnZVxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG5pbXBvcnQge1xuICBhc3NpZ24sXG4gIGdldE1hdGNoaW5nRWRnZSxcbiAgaXNHcmFwaCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgcHJpdmF0ZVByb3BlcnR5LFxuICByZWFkT25seVByb3BlcnR5LFxuICBpbmNyZW1lbnRhbElkU3RhcnRpbmdGcm9tUmFuZG9tQnl0ZSxcbiAgdmFsaWRhdGVIaW50c1xufSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDb25zdGFudHMuXG4gKi9cbmNvbnN0IElOU1RBTkNFX0lEID0gaW5jcmVtZW50YWxJZFN0YXJ0aW5nRnJvbVJhbmRvbUJ5dGUoKTtcblxuLyoqXG4gKiBFbnVtcy5cbiAqL1xuY29uc3QgVFlQRVMgPSBuZXcgU2V0KFsnZGlyZWN0ZWQnLCAndW5kaXJlY3RlZCcsICdtaXhlZCddKTtcblxuY29uc3QgRU1JVFRFUl9QUk9QUyA9IG5ldyBTZXQoW1xuICAnZG9tYWluJyxcbiAgJ19ldmVudHMnLFxuICAnX2V2ZW50c0NvdW50JyxcbiAgJ19tYXhMaXN0ZW5lcnMnXG5dKTtcblxuY29uc3QgRURHRV9BRERfTUVUSE9EUyA9IFtcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1FZGdlYCxcbiAgICBnZW5lcmF0ZUtleTogdHJ1ZVxuICB9LFxuICB7XG4gICAgbmFtZTogdmVyYiA9PiBgJHt2ZXJifURpcmVjdGVkRWRnZWAsXG4gICAgZ2VuZXJhdGVLZXk6IHRydWUsXG4gICAgdHlwZTogJ2RpcmVjdGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogdmVyYiA9PiBgJHt2ZXJifVVuZGlyZWN0ZWRFZGdlYCxcbiAgICBnZW5lcmF0ZUtleTogdHJ1ZSxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfSxcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1FZGdlV2l0aEtleWBcbiAgfSxcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1EaXJlY3RlZEVkZ2VXaXRoS2V5YCxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiB2ZXJiID0+IGAke3ZlcmJ9VW5kaXJlY3RlZEVkZ2VXaXRoS2V5YCxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfVxuXTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRTID0ge1xuICBhbGxvd1NlbGZMb29wczogdHJ1ZSxcbiAgbXVsdGk6IGZhbHNlLFxuICB0eXBlOiAnbWl4ZWQnXG59O1xuXG4vKipcbiAqIEFic3RyYWN0IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBHcmFwaCBjbGFzcyBmb3IgdmFyaW91cyBtZXRob2RzLlxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gYWRkIGEgbm9kZSB0byB0aGUgZ2l2ZW4gZ3JhcGhcbiAqXG4gKiBAcGFyYW0gIHtHcmFwaH0gICBncmFwaCAgICAgICAgICAgLSBUYXJnZXQgZ3JhcGguXG4gKiBAcGFyYW0gIHthbnl9ICAgICBub2RlICAgICAgICAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSAge29iamVjdH0gIFthdHRyaWJ1dGVzXSAgICAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gKiBAcmV0dXJuIHtOb2RlRGF0YX0gICAgICAgICAgICAgICAgLSBDcmVhdGVkIG5vZGUgZGF0YS5cbiAqL1xuZnVuY3Rpb24gYWRkTm9kZShncmFwaCwgbm9kZSwgYXR0cmlidXRlcykge1xuICBpZiAoYXR0cmlidXRlcyAmJiAhaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguYWRkTm9kZTogaW52YWxpZCBhdHRyaWJ1dGVzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgXCIke2F0dHJpYnV0ZXN9XCJgXG4gICAgKTtcblxuICAvLyBTdHJpbmcgY29lcmNpb25cbiAgbm9kZSA9ICcnICsgbm9kZTtcbiAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKGdyYXBoLl9ub2Rlcy5oYXMobm9kZSkpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC5hZGROb2RlOiB0aGUgXCIke25vZGV9XCIgbm9kZSBhbHJlYWR5IGV4aXN0IGluIHRoZSBncmFwaC5gXG4gICAgKTtcblxuICBjb25zdCBkYXRhID0gbmV3IGdyYXBoLk5vZGVEYXRhQ2xhc3Mobm9kZSwgYXR0cmlidXRlcyk7XG5cbiAgLy8gQWRkaW5nIHRoZSBub2RlIHRvIGludGVybmFsIHJlZ2lzdGVyXG4gIGdyYXBoLl9ub2Rlcy5zZXQobm9kZSwgZGF0YSk7XG5cbiAgLy8gRW1pdHRpbmdcbiAgZ3JhcGguZW1pdCgnbm9kZUFkZGVkJywge1xuICAgIGtleTogbm9kZSxcbiAgICBhdHRyaWJ1dGVzXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgdGhlIGFib3ZlIGJ1dCB3aXRob3V0IHNhbml0eSBjaGVja3MgYmVjYXVzZSB3ZSBjYWxsIHRoaXMgaW4gY29udGV4dHNcbiAqIHdoZXJlIG5lY2Vzc2FyeSBjaGVja3Mgd2VyZSBhbHJlYWR5IGRvbmUuXG4gKi9cbmZ1bmN0aW9uIHVuc2FmZUFkZE5vZGUoZ3JhcGgsIG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3QgZGF0YSA9IG5ldyBncmFwaC5Ob2RlRGF0YUNsYXNzKG5vZGUsIGF0dHJpYnV0ZXMpO1xuXG4gIGdyYXBoLl9ub2Rlcy5zZXQobm9kZSwgZGF0YSk7XG5cbiAgZ3JhcGguZW1pdCgnbm9kZUFkZGVkJywge1xuICAgIGtleTogbm9kZSxcbiAgICBhdHRyaWJ1dGVzXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEludGVybmFsIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBhcmJpdHJhcnkgZWRnZSB0byB0aGUgZ2l2ZW4gZ3JhcGguXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgZ3JhcGggICAgICAgICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY2hpbGQgbWV0aG9kIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0gIHtib29sZWFufSBtdXN0R2VuZXJhdGVLZXkgLSBTaG91bGQgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgICAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAgICAgICAgICAgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgICAgICAgICAgLSBUaGUgc291cmNlIG5vZGUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgICAgICAgLSBUaGUgdGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbYXR0cmlidXRlc10gICAgLSBPcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHJldHVybiB7YW55fSAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGVkZ2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ3JhcGggaXMgb2YgdGhlIHdyb25nIHR5cGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYW4gb2JqZWN0LlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGFscmVhZHkgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIGFkZEVkZ2UoXG4gIGdyYXBoLFxuICBuYW1lLFxuICBtdXN0R2VuZXJhdGVLZXksXG4gIHVuZGlyZWN0ZWQsXG4gIGVkZ2UsXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBhdHRyaWJ1dGVzXG4pIHtcbiAgLy8gQ2hlY2tpbmcgdmFsaWRpdHkgb2Ygb3BlcmF0aW9uXG4gIGlmICghdW5kaXJlY3RlZCAmJiBncmFwaC50eXBlID09PSAndW5kaXJlY3RlZCcpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC4ke25hbWV9OiB5b3UgY2Fubm90IGFkZCBhIGRpcmVjdGVkIGVkZ2UgdG8gYW4gdW5kaXJlY3RlZCBncmFwaC4gVXNlIHRoZSAjLmFkZEVkZ2Ugb3IgIy5hZGRVbmRpcmVjdGVkRWRnZSBpbnN0ZWFkLmBcbiAgICApO1xuXG4gIGlmICh1bmRpcmVjdGVkICYmIGdyYXBoLnR5cGUgPT09ICdkaXJlY3RlZCcpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC4ke25hbWV9OiB5b3UgY2Fubm90IGFkZCBhbiB1bmRpcmVjdGVkIGVkZ2UgdG8gYSBkaXJlY3RlZCBncmFwaC4gVXNlIHRoZSAjLmFkZEVkZ2Ugb3IgIy5hZGREaXJlY3RlZEVkZ2UgaW5zdGVhZC5gXG4gICAgKTtcblxuICBpZiAoYXR0cmlidXRlcyAmJiAhaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogaW52YWxpZCBhdHRyaWJ1dGVzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgXCIke2F0dHJpYnV0ZXN9XCJgXG4gICAgKTtcblxuICAvLyBDb2VyY2lvbiBvZiBzb3VyY2UgJiB0YXJnZXQ6XG4gIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICB0YXJnZXQgPSAnJyArIHRhcmdldDtcbiAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKCFncmFwaC5hbGxvd1NlbGZMb29wcyAmJiBzb3VyY2UgPT09IHRhcmdldClcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHNvdXJjZSAmIHRhcmdldCBhcmUgdGhlIHNhbWUgKFwiJHtzb3VyY2V9XCIpLCB0aHVzIGNyZWF0aW5nIGEgbG9vcCBleHBsaWNpdGx5IGZvcmJpZGRlbiBieSB0aGlzIGdyYXBoICdhbGxvd1NlbGZMb29wcycgb3B0aW9uIHNldCB0byBmYWxzZS5gXG4gICAgKTtcblxuICBjb25zdCBzb3VyY2VEYXRhID0gZ3JhcGguX25vZGVzLmdldChzb3VyY2UpLFxuICAgIHRhcmdldERhdGEgPSBncmFwaC5fbm9kZXMuZ2V0KHRhcmdldCk7XG5cbiAgaWYgKCFzb3VyY2VEYXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogc291cmNlIG5vZGUgXCIke3NvdXJjZX1cIiBub3QgZm91bmQuYFxuICAgICk7XG5cbiAgaWYgKCF0YXJnZXREYXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogdGFyZ2V0IG5vZGUgXCIke3RhcmdldH1cIiBub3QgZm91bmQuYFxuICAgICk7XG5cbiAgLy8gTXVzdCB0aGUgZ3JhcGggZ2VuZXJhdGUgYW4gaWQgZm9yIHRoaXMgZWRnZT9cbiAgY29uc3QgZXZlbnREYXRhID0ge1xuICAgIGtleTogbnVsbCxcbiAgICB1bmRpcmVjdGVkLFxuICAgIHNvdXJjZSxcbiAgICB0YXJnZXQsXG4gICAgYXR0cmlidXRlc1xuICB9O1xuXG4gIGlmIChtdXN0R2VuZXJhdGVLZXkpIHtcbiAgICAvLyBOT1RFOiBpbiB0aGlzIGNhc2Ugd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeVxuICAgIC8vIGV4aXN0IGFuZCBpcyBhbHJlYWR5IGNvcnJlY3RseSBjYXN0ZWQgYXMgYSBzdHJpbmdcbiAgICBlZGdlID0gZ3JhcGguX2VkZ2VLZXlHZW5lcmF0b3IoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2lvbiBvZiBlZGdlIGtleVxuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICAvLyBIZXJlLCB3ZSBoYXZlIGEga2V5IGNvbGxpc2lvblxuICAgIGlmIChncmFwaC5fZWRnZXMuaGFzKGVkZ2UpKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bmFtZX06IHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuICB9XG5cbiAgLy8gSGVyZSwgd2UgbWlnaHQgaGF2ZSBhIHNvdXJjZSAvIHRhcmdldCBjb2xsaXNpb25cbiAgaWYgKFxuICAgICFncmFwaC5tdWx0aSAmJlxuICAgICh1bmRpcmVjdGVkXG4gICAgICA/IHR5cGVvZiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgIDogdHlwZW9mIHNvdXJjZURhdGEub3V0W3RhcmdldF0gIT09ICd1bmRlZmluZWQnKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IGFuIGVkZ2UgbGlua2luZyBcIiR7c291cmNlfVwiIHRvIFwiJHt0YXJnZXR9XCIgYWxyZWFkeSBleGlzdHMuIElmIHlvdSByZWFsbHkgd2FudCB0byBhZGQgbXVsdGlwbGUgZWRnZXMgbGlua2luZyB0aG9zZSBub2RlcywgeW91IHNob3VsZCBjcmVhdGUgYSBtdWx0aSBncmFwaCBieSB1c2luZyB0aGUgJ211bHRpJyBvcHRpb24uYFxuICAgICk7XG4gIH1cblxuICAvLyBTdG9yaW5nIHNvbWUgZGF0YVxuICBjb25zdCBlZGdlRGF0YSA9IG5ldyBFZGdlRGF0YShcbiAgICB1bmRpcmVjdGVkLFxuICAgIGVkZ2UsXG4gICAgc291cmNlRGF0YSxcbiAgICB0YXJnZXREYXRhLFxuICAgIGF0dHJpYnV0ZXNcbiAgKTtcblxuICAvLyBBZGRpbmcgdGhlIGVkZ2UgdG8gdGhlIGludGVybmFsIHJlZ2lzdGVyXG4gIGdyYXBoLl9lZGdlcy5zZXQoZWRnZSwgZWRnZURhdGEpO1xuXG4gIC8vIEluY3JlbWVudGluZyBub2RlIGRlZ3JlZSBjb3VudGVyc1xuICBpZiAoc291cmNlID09PSB0YXJnZXQpIHtcbiAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgc291cmNlRGF0YS51bmRpcmVjdGVkU2VsZkxvb3BzKys7XG4gICAgICBncmFwaC5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRGF0YS5kaXJlY3RlZFNlbGZMb29wcysrO1xuICAgICAgZ3JhcGguX2RpcmVjdGVkU2VsZkxvb3BDb3VudCsrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgc291cmNlRGF0YS51bmRpcmVjdGVkRGVncmVlKys7XG4gICAgICB0YXJnZXREYXRhLnVuZGlyZWN0ZWREZWdyZWUrKztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRGF0YS5vdXREZWdyZWUrKztcbiAgICAgIHRhcmdldERhdGEuaW5EZWdyZWUrKztcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGluZyByZWxldmFudCBpbmRleFxuICB1cGRhdGVTdHJ1Y3R1cmVJbmRleChcbiAgICBncmFwaCxcbiAgICB1bmRpcmVjdGVkLFxuICAgIGVkZ2VEYXRhLFxuICAgIHNvdXJjZSxcbiAgICB0YXJnZXQsXG4gICAgc291cmNlRGF0YSxcbiAgICB0YXJnZXREYXRhXG4gICk7XG5cbiAgaWYgKHVuZGlyZWN0ZWQpIGdyYXBoLl91bmRpcmVjdGVkU2l6ZSsrO1xuICBlbHNlIGdyYXBoLl9kaXJlY3RlZFNpemUrKztcblxuICAvLyBFbWl0dGluZ1xuICBldmVudERhdGEua2V5ID0gZWRnZTtcblxuICBncmFwaC5lbWl0KCdlZGdlQWRkZWQnLCBldmVudERhdGEpO1xuXG4gIHJldHVybiBlZGdlO1xufVxuXG4vKipcbiAqIEludGVybmFsIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBhcmJpdHJhcnkgZWRnZSB0byB0aGUgZ2l2ZW4gZ3JhcGguXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgZ3JhcGggICAgICAgICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY2hpbGQgbWV0aG9kIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0gIHtib29sZWFufSBtdXN0R2VuZXJhdGVLZXkgLSBTaG91bGQgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgICAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAgICAgICAgICAgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgICAgICAgICAgLSBUaGUgc291cmNlIG5vZGUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgICAgICAgLSBUaGUgdGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbYXR0cmlidXRlc10gICAgLSBPcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2FzVXBkYXRlcl0gICAgICAgLSBBcmUgd2UgdXBkYXRpbmcgb3IgbWVyZ2luZz9cbiAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgICAgICAtIFRoZSBlZGdlLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdyYXBoIGlzIG9mIHRoZSB3cm9uZyB0eXBlLlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmUgbm90IGFuIG9iamVjdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGV4aXN0LlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBtZXJnZUVkZ2UoXG4gIGdyYXBoLFxuICBuYW1lLFxuICBtdXN0R2VuZXJhdGVLZXksXG4gIHVuZGlyZWN0ZWQsXG4gIGVkZ2UsXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBhdHRyaWJ1dGVzLFxuICBhc1VwZGF0ZXJcbikge1xuICAvLyBDaGVja2luZyB2YWxpZGl0eSBvZiBvcGVyYXRpb25cbiAgaWYgKCF1bmRpcmVjdGVkICYmIGdyYXBoLnR5cGUgPT09ICd1bmRpcmVjdGVkJylcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHlvdSBjYW5ub3QgbWVyZ2UvdXBkYXRlIGEgZGlyZWN0ZWQgZWRnZSB0byBhbiB1bmRpcmVjdGVkIGdyYXBoLiBVc2UgdGhlICMubWVyZ2VFZGdlLyMudXBkYXRlRWRnZSBvciAjLmFkZFVuZGlyZWN0ZWRFZGdlIGluc3RlYWQuYFxuICAgICk7XG5cbiAgaWYgKHVuZGlyZWN0ZWQgJiYgZ3JhcGgudHlwZSA9PT0gJ2RpcmVjdGVkJylcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHlvdSBjYW5ub3QgbWVyZ2UvdXBkYXRlIGFuIHVuZGlyZWN0ZWQgZWRnZSB0byBhIGRpcmVjdGVkIGdyYXBoLiBVc2UgdGhlICMubWVyZ2VFZGdlLyMudXBkYXRlRWRnZSBvciAjLmFkZERpcmVjdGVkRWRnZSBpbnN0ZWFkLmBcbiAgICApO1xuXG4gIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKGFzVXBkYXRlcikge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGludmFsaWQgdXBkYXRlciBmdW5jdGlvbi4gRXhwZWN0aW5nIGEgZnVuY3Rpb24gYnV0IGdvdCBcIiR7YXR0cmlidXRlc31cImBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGludmFsaWQgYXR0cmlidXRlcy4gRXhwZWN0aW5nIGFuIG9iamVjdCBidXQgZ290IFwiJHthdHRyaWJ1dGVzfVwiYFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvZXJjaW9uIG9mIHNvdXJjZSAmIHRhcmdldDpcbiAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gIGxldCB1cGRhdGVyO1xuXG4gIGlmIChhc1VwZGF0ZXIpIHtcbiAgICB1cGRhdGVyID0gYXR0cmlidXRlcztcbiAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFncmFwaC5hbGxvd1NlbGZMb29wcyAmJiBzb3VyY2UgPT09IHRhcmdldClcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHNvdXJjZSAmIHRhcmdldCBhcmUgdGhlIHNhbWUgKFwiJHtzb3VyY2V9XCIpLCB0aHVzIGNyZWF0aW5nIGEgbG9vcCBleHBsaWNpdGx5IGZvcmJpZGRlbiBieSB0aGlzIGdyYXBoICdhbGxvd1NlbGZMb29wcycgb3B0aW9uIHNldCB0byBmYWxzZS5gXG4gICAgKTtcblxuICBsZXQgc291cmNlRGF0YSA9IGdyYXBoLl9ub2Rlcy5nZXQoc291cmNlKTtcbiAgbGV0IHRhcmdldERhdGEgPSBncmFwaC5fbm9kZXMuZ2V0KHRhcmdldCk7XG4gIGxldCBlZGdlRGF0YTtcblxuICAvLyBEbyB3ZSBuZWVkIHRvIGhhbmRsZSBkdXBsaWNhdGU/XG4gIGxldCBhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YTtcblxuICBpZiAoIW11c3RHZW5lcmF0ZUtleSkge1xuICAgIGVkZ2VEYXRhID0gZ3JhcGguX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmIChlZGdlRGF0YSkge1xuICAgICAgLy8gSGVyZSwgd2UgbmVlZCB0byBlbnN1cmUsIGlmIHRoZSB1c2VyIGdhdmUgYSBrZXksIHRoYXQgc291cmNlICYgdGFyZ2V0XG4gICAgICAvLyBhcmUgY29oZXJlbnRcbiAgICAgIGlmIChcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmtleSAhPT0gc291cmNlIHx8XG4gICAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXkgIT09IHRhcmdldCB8fFxuICAgICAgICAodW5kaXJlY3RlZCAmJlxuICAgICAgICAgIChlZGdlRGF0YS5zb3VyY2Uua2V5ICE9PSB0YXJnZXQgfHwgZWRnZURhdGEudGFyZ2V0LmtleSAhPT0gc291cmNlKSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiBpbmNvbnNpc3RlbmN5IGRldGVjdGVkIHdoZW4gYXR0ZW1wdGluZyB0byBtZXJnZSB0aGUgXCIke2VkZ2V9XCIgZWRnZSB3aXRoIFwiJHtzb3VyY2V9XCIgc291cmNlICYgXCIke3RhcmdldH1cIiB0YXJnZXQgdnMuIChcIiR7ZWRnZURhdGEuc291cmNlLmtleX1cIiwgXCIke2VkZ2VEYXRhLnRhcmdldC5rZXl9XCIpLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEgPSBlZGdlRGF0YTtcbiAgICB9XG4gIH1cblxuICAvLyBIZXJlLCB3ZSBtaWdodCBoYXZlIGEgc291cmNlIC8gdGFyZ2V0IGNvbGxpc2lvblxuICBpZiAoIWFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhICYmICFncmFwaC5tdWx0aSAmJiBzb3VyY2VEYXRhKSB7XG4gICAgYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEgPSB1bmRpcmVjdGVkXG4gICAgICA/IHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdXG4gICAgICA6IHNvdXJjZURhdGEub3V0W3RhcmdldF07XG4gIH1cblxuICAvLyBIYW5kbGluZyBkdXBsaWNhdGVzXG4gIGlmIChhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YSkge1xuICAgIGNvbnN0IGluZm8gPSBbYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEua2V5LCBmYWxzZSwgZmFsc2UsIGZhbHNlXTtcblxuICAgIC8vIFdlIGNhbiBza2lwIHRoZSBhdHRyaWJ1dGUgbWVyZ2luZyBwYXJ0IGlmIHRoZSB1c2VyIGRpZCBub3QgcHJvdmlkZSB0aGVtXG4gICAgaWYgKGFzVXBkYXRlciA/ICF1cGRhdGVyIDogIWF0dHJpYnV0ZXMpIHJldHVybiBpbmZvO1xuXG4gICAgLy8gVXBkYXRpbmcgdGhlIGF0dHJpYnV0ZXNcbiAgICBpZiAoYXNVcGRhdGVyKSB7XG4gICAgICBjb25zdCBvbGRBdHRyaWJ1dGVzID0gYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEuYXR0cmlidXRlcztcbiAgICAgIGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmF0dHJpYnV0ZXMgPSB1cGRhdGVyKG9sZEF0dHJpYnV0ZXMpO1xuXG4gICAgICBncmFwaC5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICAgIHR5cGU6ICdyZXBsYWNlJyxcbiAgICAgICAga2V5OiBhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YS5rZXksXG4gICAgICAgIGF0dHJpYnV0ZXM6IGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmF0dHJpYnV0ZXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1lcmdpbmcgdGhlIGF0dHJpYnV0ZXNcbiAgICBlbHNlIHtcbiAgICAgIGFzc2lnbihhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YS5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgZ3JhcGguZW1pdCgnZWRnZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgICBrZXk6IGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmtleSxcbiAgICAgICAgYXR0cmlidXRlczogYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgZGF0YTogYXR0cmlidXRlc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcyB8fCB7fTtcblxuICBpZiAoYXNVcGRhdGVyICYmIHVwZGF0ZXIpIGF0dHJpYnV0ZXMgPSB1cGRhdGVyKGF0dHJpYnV0ZXMpO1xuXG4gIC8vIE11c3QgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkIGZvciB0aGlzIGVkZ2U/XG4gIGNvbnN0IGV2ZW50RGF0YSA9IHtcbiAgICBrZXk6IG51bGwsXG4gICAgdW5kaXJlY3RlZCxcbiAgICBzb3VyY2UsXG4gICAgdGFyZ2V0LFxuICAgIGF0dHJpYnV0ZXNcbiAgfTtcblxuICBpZiAobXVzdEdlbmVyYXRlS2V5KSB7XG4gICAgLy8gTk9URTogaW4gdGhpcyBjYXNlIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUga2V5IGRvZXMgbm90IGFscmVhZHlcbiAgICAvLyBleGlzdCBhbmQgaXMgYWxyZWFkeSBjb3JyZWN0bHkgY2FzdGVkIGFzIGEgc3RyaW5nXG4gICAgZWRnZSA9IGdyYXBoLl9lZGdlS2V5R2VuZXJhdG9yKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29lcmNpb24gb2YgZWRnZSBrZXlcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgLy8gSGVyZSwgd2UgaGF2ZSBhIGtleSBjb2xsaXNpb25cbiAgICBpZiAoZ3JhcGguX2VkZ2VzLmhhcyhlZGdlKSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke25hbWV9OiB0aGUgXCIke2VkZ2V9XCIgZWRnZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcbiAgfVxuXG4gIGxldCBzb3VyY2VXYXNBZGRlZCA9IGZhbHNlO1xuICBsZXQgdGFyZ2V0V2FzQWRkZWQgPSBmYWxzZTtcblxuICBpZiAoIXNvdXJjZURhdGEpIHtcbiAgICBzb3VyY2VEYXRhID0gdW5zYWZlQWRkTm9kZShncmFwaCwgc291cmNlLCB7fSk7XG4gICAgc291cmNlV2FzQWRkZWQgPSB0cnVlO1xuXG4gICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0KSB7XG4gICAgICB0YXJnZXREYXRhID0gc291cmNlRGF0YTtcbiAgICAgIHRhcmdldFdhc0FkZGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0YXJnZXREYXRhKSB7XG4gICAgdGFyZ2V0RGF0YSA9IHVuc2FmZUFkZE5vZGUoZ3JhcGgsIHRhcmdldCwge30pO1xuICAgIHRhcmdldFdhc0FkZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIFN0b3Jpbmcgc29tZSBkYXRhXG4gIGVkZ2VEYXRhID0gbmV3IEVkZ2VEYXRhKHVuZGlyZWN0ZWQsIGVkZ2UsIHNvdXJjZURhdGEsIHRhcmdldERhdGEsIGF0dHJpYnV0ZXMpO1xuXG4gIC8vIEFkZGluZyB0aGUgZWRnZSB0byB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJcbiAgZ3JhcGguX2VkZ2VzLnNldChlZGdlLCBlZGdlRGF0YSk7XG5cbiAgLy8gSW5jcmVtZW50aW5nIG5vZGUgZGVncmVlIGNvdW50ZXJzXG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMrKztcbiAgICAgIGdyYXBoLl91bmRpcmVjdGVkU2VsZkxvb3BDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VEYXRhLmRpcmVjdGVkU2VsZkxvb3BzKys7XG4gICAgICBncmFwaC5fZGlyZWN0ZWRTZWxmTG9vcENvdW50Kys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWREZWdyZWUrKztcbiAgICAgIHRhcmdldERhdGEudW5kaXJlY3RlZERlZ3JlZSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VEYXRhLm91dERlZ3JlZSsrO1xuICAgICAgdGFyZ2V0RGF0YS5pbkRlZ3JlZSsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0aW5nIHJlbGV2YW50IGluZGV4XG4gIHVwZGF0ZVN0cnVjdHVyZUluZGV4KFxuICAgIGdyYXBoLFxuICAgIHVuZGlyZWN0ZWQsXG4gICAgZWRnZURhdGEsXG4gICAgc291cmNlLFxuICAgIHRhcmdldCxcbiAgICBzb3VyY2VEYXRhLFxuICAgIHRhcmdldERhdGFcbiAgKTtcblxuICBpZiAodW5kaXJlY3RlZCkgZ3JhcGguX3VuZGlyZWN0ZWRTaXplKys7XG4gIGVsc2UgZ3JhcGguX2RpcmVjdGVkU2l6ZSsrO1xuXG4gIC8vIEVtaXR0aW5nXG4gIGV2ZW50RGF0YS5rZXkgPSBlZGdlO1xuXG4gIGdyYXBoLmVtaXQoJ2VkZ2VBZGRlZCcsIGV2ZW50RGF0YSk7XG5cbiAgcmV0dXJuIFtlZGdlLCB0cnVlLCBzb3VyY2VXYXNBZGRlZCwgdGFyZ2V0V2FzQWRkZWRdO1xufVxuXG4vKipcbiAqIEdyYXBoIGNsYXNzXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbb3B0aW9uc10gLSBPcHRpb25zOlxuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbYWxsb3dTZWxmTG9vcHNdIC0gQWxsb3cgc2VsZiBsb29wcz9cbiAqIEBwYXJhbSAge3N0cmluZ30gICAgW3R5cGVdICAgICAgICAgICAtIFR5cGUgb2YgdGhlIGdyYXBoLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbbWFwXSAgICAgICAgICAgIC0gQWxsb3cgcmVmZXJlbmNlcyBhcyBrZXlzP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbbXVsdGldICAgICAgICAgIC0gQWxsb3cgcGFyYWxsZWwgZWRnZXM/XG4gKlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgYXJndW1lbnRzIGFyZSBub3QgdmFsaWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyYXBoIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLy0tIFNvbHZpbmcgb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBhc3NpZ24oe30sIERFRkFVTFRTLCBvcHRpb25zKTtcblxuICAgIC8vIEVuZm9yY2luZyBvcHRpb25zIHZhbGlkaXR5XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm11bHRpICE9PSAnYm9vbGVhbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5jb25zdHJ1Y3RvcjogaW52YWxpZCAnbXVsdGknIG9wdGlvbi4gRXhwZWN0aW5nIGEgYm9vbGVhbiBidXQgZ290IFwiJHtvcHRpb25zLm11bHRpfVwiLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIVRZUEVTLmhhcyhvcHRpb25zLnR5cGUpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguY29uc3RydWN0b3I6IGludmFsaWQgJ3R5cGUnIG9wdGlvbi4gU2hvdWxkIGJlIG9uZSBvZiBcIm1peGVkXCIsIFwiZGlyZWN0ZWRcIiBvciBcInVuZGlyZWN0ZWRcIiBidXQgZ290IFwiJHtvcHRpb25zLnR5cGV9XCIuYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbGxvd1NlbGZMb29wcyAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguY29uc3RydWN0b3I6IGludmFsaWQgJ2FsbG93U2VsZkxvb3BzJyBvcHRpb24uIEV4cGVjdGluZyBhIGJvb2xlYW4gYnV0IGdvdCBcIiR7b3B0aW9ucy5hbGxvd1NlbGZMb29wc31cIi5gXG4gICAgICApO1xuXG4gICAgLy8tLSBQcml2YXRlIHByb3BlcnRpZXNcblxuICAgIC8vIFV0aWxpdGllc1xuICAgIGNvbnN0IE5vZGVEYXRhQ2xhc3MgPVxuICAgICAgb3B0aW9ucy50eXBlID09PSAnbWl4ZWQnXG4gICAgICAgID8gTWl4ZWROb2RlRGF0YVxuICAgICAgICA6IG9wdGlvbnMudHlwZSA9PT0gJ2RpcmVjdGVkJ1xuICAgICAgICA/IERpcmVjdGVkTm9kZURhdGFcbiAgICAgICAgOiBVbmRpcmVjdGVkTm9kZURhdGE7XG5cbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ05vZGVEYXRhQ2xhc3MnLCBOb2RlRGF0YUNsYXNzKTtcblxuICAgIC8vIEludGVybmFsIGVkZ2Uga2V5IGdlbmVyYXRvclxuXG4gICAgLy8gTk9URTogdGhpcyBpbnRlcm5hbCBnZW5lcmF0b3IgcHJvZHVjZSBrZXlzIHRoYXQgYXJlIHN0cmluZ3NcbiAgICAvLyBjb21wb3NlZCBvZiBhIHdlaXJkIHByZWZpeCwgYW4gaW5jcmVtZW50YWwgaW5zdGFuY2UgaWQgc3RhcnRpbmcgZnJvbVxuICAgIC8vIGEgcmFuZG9tIGJ5dGUgYW5kIGZpbmFsbHkgYW4gaW50ZXJuYWwgaW5zdGFuY2UgaW5jcmVtZW50YWwgaWQuXG4gICAgLy8gQWxsIHRoaXMgdG8gYXZvaWQgaW50cmEtZnJhbWUgYW5kIGNyb3NzLWZyYW1lIGFkdmVyc2FyaWFsIGlucHV0c1xuICAgIC8vIHRoYXQgY2FuIGZvcmNlIGEgc2luZ2xlICMuYWRkRWRnZSBjYWxsIHRvIGRlZ2VuZXJhdGUgaW50byBhIE8obilcbiAgICAvLyBhdmFpbGFibGUga2V5IHNlYXJjaCBsb29wLlxuXG4gICAgLy8gSXQgYWxzbyBlbnN1cmVzIHRoYXQgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZWRnZSBrZXlzIGFyZSB1bmxpa2VseVxuICAgIC8vIHRvIHByb2R1Y2UgY29sbGlzaW9ucyB3aXRoIGFyYml0cmFyeSBrZXlzIGdpdmVuIGJ5IHVzZXJzLlxuICAgIGNvbnN0IGluc3RhbmNlSWQgPSBJTlNUQU5DRV9JRCgpO1xuICAgIGxldCBlZGdlSWQgPSAwO1xuXG4gICAgY29uc3QgZWRnZUtleUdlbmVyYXRvciA9ICgpID0+IHtcbiAgICAgIGxldCBhdmFpbGFibGVFZGdlS2V5O1xuXG4gICAgICBkbyB7XG4gICAgICAgIGF2YWlsYWJsZUVkZ2VLZXkgPSAnZ2VpZF8nICsgaW5zdGFuY2VJZCArICdfJyArIGVkZ2VJZCsrO1xuICAgICAgfSB3aGlsZSAodGhpcy5fZWRnZXMuaGFzKGF2YWlsYWJsZUVkZ2VLZXkpKTtcblxuICAgICAgcmV0dXJuIGF2YWlsYWJsZUVkZ2VLZXk7XG4gICAgfTtcblxuICAgIC8vIEluZGV4ZXNcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19hdHRyaWJ1dGVzJywge30pO1xuICAgIHByaXZhdGVQcm9wZXJ0eSh0aGlzLCAnX25vZGVzJywgbmV3IE1hcCgpKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19lZGdlcycsIG5ldyBNYXAoKSk7XG4gICAgcHJpdmF0ZVByb3BlcnR5KHRoaXMsICdfZGlyZWN0ZWRTaXplJywgMCk7XG4gICAgcHJpdmF0ZVByb3BlcnR5KHRoaXMsICdfdW5kaXJlY3RlZFNpemUnLCAwKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19kaXJlY3RlZFNlbGZMb29wQ291bnQnLCAwKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ191bmRpcmVjdGVkU2VsZkxvb3BDb3VudCcsIDApO1xuICAgIHByaXZhdGVQcm9wZXJ0eSh0aGlzLCAnX2VkZ2VLZXlHZW5lcmF0b3InLCBlZGdlS2V5R2VuZXJhdG9yKTtcblxuICAgIC8vIE9wdGlvbnNcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19vcHRpb25zJywgb3B0aW9ucyk7XG5cbiAgICAvLyBFbWl0dGVyIHByb3BlcnRpZXNcbiAgICBFTUlUVEVSX1BST1BTLmZvckVhY2gocHJvcCA9PiBwcml2YXRlUHJvcGVydHkodGhpcywgcHJvcCwgdGhpc1twcm9wXSkpO1xuXG4gICAgLy8tLSBQcm9wZXJ0aWVzIHJlYWRlcnNcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdvcmRlcicsICgpID0+IHRoaXMuX25vZGVzLnNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3NpemUnLCAoKSA9PiB0aGlzLl9lZGdlcy5zaXplKTtcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdkaXJlY3RlZFNpemUnLCAoKSA9PiB0aGlzLl9kaXJlY3RlZFNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3VuZGlyZWN0ZWRTaXplJywgKCkgPT4gdGhpcy5fdW5kaXJlY3RlZFNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ3NlbGZMb29wQ291bnQnLFxuICAgICAgKCkgPT4gdGhpcy5fZGlyZWN0ZWRTZWxmTG9vcENvdW50ICsgdGhpcy5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnRcbiAgICApO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ2RpcmVjdGVkU2VsZkxvb3BDb3VudCcsXG4gICAgICAoKSA9PiB0aGlzLl9kaXJlY3RlZFNlbGZMb29wQ291bnRcbiAgICApO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50JyxcbiAgICAgICgpID0+IHRoaXMuX3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50XG4gICAgKTtcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdtdWx0aScsIHRoaXMuX29wdGlvbnMubXVsdGkpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3R5cGUnLCB0aGlzLl9vcHRpb25zLnR5cGUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ2FsbG93U2VsZkxvb3BzJywgdGhpcy5fb3B0aW9ucy5hbGxvd1NlbGZMb29wcyk7XG4gICAgcmVhZE9ubHlQcm9wZXJ0eSh0aGlzLCAnaW1wbGVtZW50YXRpb24nLCAoKSA9PiAnZ3JhcGhvbG9neScpO1xuICB9XG5cbiAgX3Jlc2V0SW5zdGFuY2VDb3VudGVycygpIHtcbiAgICB0aGlzLl9kaXJlY3RlZFNpemUgPSAwO1xuICAgIHRoaXMuX3VuZGlyZWN0ZWRTaXplID0gMDtcbiAgICB0aGlzLl9kaXJlY3RlZFNlbGZMb29wQ291bnQgPSAwO1xuICAgIHRoaXMuX3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50ID0gMDtcbiAgfVxuXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBSZWFkXG4gICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAtIFRoZSBub2RlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVzLmhhcygnJyArIG5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZGlyZWN0ZWQgZWRnZSBpcyBmb3VuZCBpbiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIEFyaXR5IDE6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIGVkZ2UgLSBUaGUgZWRnZSdzIGtleS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gVGhlIGVkZ2UncyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBhcmd1bWVudHMgYXJlIGludmFsaWQuXG4gICAqL1xuICBoYXNEaXJlY3RlZEVkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSAnJyArIHNvdXJjZTtcblxuICAgICAgY29uc3QgZWRnZURhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICAgIHJldHVybiAhIWVkZ2VEYXRhICYmICFlZGdlRGF0YS51bmRpcmVjdGVkO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgLy8gSWYgdGhlIG5vZGUgc291cmNlIG9yIHRoZSB0YXJnZXQgaXMgbm90IGluIHRoZSBncmFwaCB3ZSBicmVha1xuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFub2RlRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBJcyB0aGVyZSBhIGRpcmVjdGVkIGVkZ2UgcG9pbnRpbmcgdG93YXJkIHRhcmdldD9cbiAgICAgIGNvbnN0IGVkZ2VzID0gbm9kZURhdGEub3V0W3RhcmdldF07XG5cbiAgICAgIGlmICghZWRnZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHRoaXMubXVsdGkgPyAhIWVkZ2VzLnNpemUgOiB0cnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC5oYXNEaXJlY3RlZEVkZ2U6IGludmFsaWQgYXJpdHkgKCR7YXJndW1lbnRzLmxlbmd0aH0sIGluc3RlYWQgb2YgMSBvciAyKS4gWW91IGNhbiBlaXRoZXIgYXNrIGZvciBhbiBlZGdlIGlkIG9yIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGVkZ2UgYmV0d2VlbiBhIHNvdXJjZSAmIGEgdGFyZ2V0LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gdW5kaXJlY3RlZCBlZGdlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQXJpdHkgMTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC5cbiAgICovXG4gIGhhc1VuZGlyZWN0ZWRFZGdlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodGhpcy50eXBlID09PSAnZGlyZWN0ZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9ICcnICsgc291cmNlO1xuXG4gICAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgICAgcmV0dXJuICEhZWRnZURhdGEgJiYgZWRnZURhdGEudW5kaXJlY3RlZDtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICAgIC8vIElmIHRoZSBub2RlIHNvdXJjZSBvciB0aGUgdGFyZ2V0IGlzIG5vdCBpbiB0aGUgZ3JhcGggd2UgYnJlYWtcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghbm9kZURhdGEpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSXMgdGhlcmUgYSBkaXJlY3RlZCBlZGdlIHBvaW50aW5nIHRvd2FyZCB0YXJnZXQ/XG4gICAgICBjb25zdCBlZGdlcyA9IG5vZGVEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XTtcblxuICAgICAgaWYgKCFlZGdlcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5tdWx0aSA/ICEhZWRnZXMuc2l6ZSA6IHRydWU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLmhhc0RpcmVjdGVkRWRnZTogaW52YWxpZCBhcml0eSAoJHthcmd1bWVudHMubGVuZ3RofSwgaW5zdGVhZCBvZiAxIG9yIDIpLiBZb3UgY2FuIGVpdGhlciBhc2sgZm9yIGFuIGVkZ2UgaWQgb3IgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZWRnZSBiZXR3ZWVuIGEgc291cmNlICYgYSB0YXJnZXQuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBlZGdlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQXJpdHkgMTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC5cbiAgICovXG4gIGhhc0VkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9ICcnICsgc291cmNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZWRnZXMuaGFzKGVkZ2UpO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgLy8gSWYgdGhlIG5vZGUgc291cmNlIG9yIHRoZSB0YXJnZXQgaXMgbm90IGluIHRoZSBncmFwaCB3ZSBicmVha1xuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFub2RlRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBJcyB0aGVyZSBhIGRpcmVjdGVkIGVkZ2UgcG9pbnRpbmcgdG93YXJkIHRhcmdldD9cbiAgICAgIGxldCBlZGdlcyA9IHR5cGVvZiBub2RlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIG5vZGVEYXRhLm91dFt0YXJnZXRdO1xuXG4gICAgICBpZiAoIWVkZ2VzKVxuICAgICAgICBlZGdlcyA9XG4gICAgICAgICAgdHlwZW9mIG5vZGVEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgbm9kZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdO1xuXG4gICAgICBpZiAoIWVkZ2VzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLm11bHRpID8gISFlZGdlcy5zaXplIDogdHJ1ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguaGFzRWRnZTogaW52YWxpZCBhcml0eSAoJHthcmd1bWVudHMubGVuZ3RofSwgaW5zdGVhZCBvZiAxIG9yIDIpLiBZb3UgY2FuIGVpdGhlciBhc2sgZm9yIGFuIGVkZ2UgaWQgb3IgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZWRnZSBiZXR3ZWVuIGEgc291cmNlICYgYSB0YXJnZXQuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZWRnZSBtYXRjaGluZyBzb3VyY2UgJiB0YXJnZXQgaW4gYSBkaXJlY3RlZCBmYXNoaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9IHNvdXJjZSAtIFRoZSBlZGdlJ3Mgc291cmNlLlxuICAgKiBAcGFyYW0gIHthbnl9IHRhcmdldCAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBncmFwaCBpcyBtdWx0aS5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3RlZEVkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybjtcblxuICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZGlyZWN0ZWRFZGdlOiB0aGlzIG1ldGhvZCBpcyBpcnJlbGV2YW50IHdpdGggbXVsdGlncmFwaHMgc2luY2UgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXQuIFNlZSAjLmRpcmVjdGVkRWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IChzb3VyY2VEYXRhLm91dCAmJiBzb3VyY2VEYXRhLm91dFt0YXJnZXRdKSB8fCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZWRnZURhdGEpIHJldHVybiBlZGdlRGF0YS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZWRnZSBtYXRjaGluZyBzb3VyY2UgJiB0YXJnZXQgaW4gYSB1bmRpcmVjdGVkIGZhc2hpb24uXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gc291cmNlIC0gVGhlIGVkZ2UncyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge2FueX0gdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdyYXBoIGlzIG11bHRpLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHNvdXJjZSBvciB0YXJnZXQgZG9lc24ndCBleGlzdC5cbiAgICovXG4gIHVuZGlyZWN0ZWRFZGdlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RpcmVjdGVkJykgcmV0dXJuO1xuXG4gICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51bmRpcmVjdGVkRWRnZTogdGhpcyBtZXRob2QgaXMgaXJyZWxldmFudCB3aXRoIG11bHRpZ3JhcGhzIHNpbmNlIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0LiBTZWUgIy51bmRpcmVjdGVkRWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLnVuZGlyZWN0ZWRFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBzb3VyY2Ugbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5fbm9kZXMuaGFzKHRhcmdldCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudW5kaXJlY3RlZEVkZ2U6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7dGFyZ2V0fVwiIHRhcmdldCBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPVxuICAgICAgKHNvdXJjZURhdGEudW5kaXJlY3RlZCAmJiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XSkgfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VEYXRhKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGVkZ2UgbWF0Y2hpbmcgc291cmNlICYgdGFyZ2V0IGluIGEgbWl4ZWQgZmFzaGlvbi5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUaGUgZWRnZSdzIHRhcmdldC5cbiAgICpcbiAgICogQHJldHVybiB7YW55fHVuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ3JhcGggaXMgbXVsdGkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgZWRnZShzb3VyY2UsIHRhcmdldCkge1xuICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmVkZ2U6IHRoaXMgbWV0aG9kIGlzIGlycmVsZXZhbnQgd2l0aCBtdWx0aWdyYXBocyBzaW5jZSB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZSBlZGdlcyBiZXR3ZWVuIHNvdXJjZSAmIHRhcmdldC4gU2VlICMuZWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmVkZ2U6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7dGFyZ2V0fVwiIHRhcmdldCBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPVxuICAgICAgKHNvdXJjZURhdGEub3V0ICYmIHNvdXJjZURhdGEub3V0W3RhcmdldF0pIHx8XG4gICAgICAoc291cmNlRGF0YS51bmRpcmVjdGVkICYmIHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdKSB8fFxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VEYXRhKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0d28gbm9kZXMgYXJlIGRpcmVjdGVkIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlRGlyZWN0ZWROZWlnaGJvcnMobm9kZSwgbmVpZ2hib3IpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIG5laWdoYm9yID0gJycgKyBuZWlnaGJvcjtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5hcmVEaXJlY3RlZE5laWdoYm9yczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZWlnaGJvciBpbiBub2RlRGF0YS5pbiB8fCBuZWlnaGJvciBpbiBub2RlRGF0YS5vdXQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgb3V0IG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlT3V0TmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlT3V0TmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIG5laWdoYm9yIGluIG5vZGVEYXRhLm91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBpbiBuZWlnaGJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5laWdoYm9yIC0gVGhlIG5laWdoYm9yJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGFyZUluTmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlSW5OZWlnaGJvcnM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbmVpZ2hib3IgaW4gbm9kZURhdGEuaW47XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgdW5kaXJlY3RlZCBuZWlnaGJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5laWdoYm9yIC0gVGhlIG5laWdoYm9yJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGFyZVVuZGlyZWN0ZWROZWlnaGJvcnMobm9kZSwgbmVpZ2hib3IpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIG5laWdoYm9yID0gJycgKyBuZWlnaGJvcjtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5hcmVVbmRpcmVjdGVkTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkaXJlY3RlZCcpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZWlnaGJvciBpbiBub2RlRGF0YS51bmRpcmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0d28gbm9kZXMgYXJlIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlTmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLmluIHx8IG5laWdoYm9yIGluIG5vZGVEYXRhLm91dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLnVuZGlyZWN0ZWQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBpbmJvdW5kIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlSW5ib3VuZE5laWdoYm9ycyhub2RlLCBuZWlnaGJvcikge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG4gICAgbmVpZ2hib3IgPSAnJyArIG5laWdoYm9yO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmFyZUluYm91bmROZWlnaGJvcnM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgICBpZiAobmVpZ2hib3IgaW4gbm9kZURhdGEuaW4pIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGlmIChuZWlnaGJvciBpbiBub2RlRGF0YS51bmRpcmVjdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgb3V0Ym91bmQgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlICAgICAtIFRoZSBub2RlJ3Mga2V5LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBuZWlnaGJvciAtIFRoZSBuZWlnaGJvcidzIGtleS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBhcmVPdXRib3VuZE5laWdoYm9ycyhub2RlLCBuZWlnaGJvcikge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG4gICAgbmVpZ2hib3IgPSAnJyArIG5laWdoYm9yO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmFyZU91dGJvdW5kTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLm91dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLnVuZGlyZWN0ZWQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgLSBUaGUgbm9kZSdzIGluIGRlZ3JlZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBpbkRlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pbkRlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIG91dCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIG91dERlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5vdXREZWdyZWU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBub2RlRGF0YS5vdXREZWdyZWUgKyBub2RlRGF0YS5kaXJlY3RlZFNlbGZMb29wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgZGlyZWN0ZWQgZGVncmVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgLSBUaGUgbm9kZSdzIGluIGRlZ3JlZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBkaXJlY3RlZERlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kaXJlY3RlZERlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgY29uc3QgbG9vcHMgPSBub2RlRGF0YS5kaXJlY3RlZFNlbGZMb29wcztcblxuICAgIGNvbnN0IGluRGVncmVlID0gbm9kZURhdGEuaW5EZWdyZWUgKyBsb29wcztcbiAgICBjb25zdCBvdXREZWdyZWUgPSBub2RlRGF0YS5vdXREZWdyZWUgKyBsb29wcztcblxuICAgIHJldHVybiBpbkRlZ3JlZSArIG91dERlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgdW5kaXJlY3RlZCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHVuZGlyZWN0ZWREZWdyZWUobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudW5kaXJlY3RlZERlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAnZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IGxvb3BzID0gbm9kZURhdGEudW5kaXJlY3RlZFNlbGZMb29wcztcblxuICAgIHJldHVybiBub2RlRGF0YS51bmRpcmVjdGVkRGVncmVlICsgbG9vcHMgKiAyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGdpdmVuIG5vZGUncyBkaXJlY3RlZCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGRlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kZWdyZWU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgbGV0IGRlZ3JlZSA9IDA7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgICBkZWdyZWUgKz0gbm9kZURhdGEudW5kaXJlY3RlZERlZ3JlZSArIG5vZGVEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMgKiAyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgZGVncmVlICs9XG4gICAgICAgIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlICsgbm9kZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHMgKiAyO1xuICAgIH1cblxuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIGluIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGluRGVncmVlV2l0aG91dFNlbGZMb29wcyhub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pbkRlZ3JlZVdpdGhvdXRTZWxmTG9vcHM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBub2RlRGF0YS5pbkRlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3Mgb3V0IGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIG91dERlZ3JlZVdpdGhvdXRTZWxmTG9vcHMobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgub3V0RGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLm91dERlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgZGlyZWN0ZWQgZGVncmVlIHdpdGhvdXQgY29uc2lkZXJpbmcgc2VsZiBsb29wcy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAtIFRoZSBub2RlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgIC0gVGhlIG5vZGUncyBpbiBkZWdyZWUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzKG5vZGUpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGdpdmVuIG5vZGUncyB1bmRpcmVjdGVkIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHVuZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzKG5vZGUpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLnVuZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLnVuZGlyZWN0ZWREZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIGRpcmVjdGVkIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGRlZ3JlZVdpdGhvdXRTZWxmTG9vcHMobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBsZXQgZGVncmVlID0gMDtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGRlZ3JlZSArPSBub2RlRGF0YS51bmRpcmVjdGVkRGVncmVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgZGVncmVlICs9IG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAtIFRoZSBlZGdlJ3Mgc291cmNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHNvdXJjZShlZGdlKSB7XG4gICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguc291cmNlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnNvdXJjZS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIHRhcmdldC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHRhcmdldChlZGdlKSB7XG4gICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudGFyZ2V0OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnRhcmdldC5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIGV4dHJlbWl0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHthcnJheX0gICAgICAtIFRoZSBlZGdlJ3MgZXh0cmVtaXRpZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgZXh0cmVtaXRpZXMoZWRnZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZWRnZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZXh0cmVtaXRpZXM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIFtlZGdlRGF0YS5zb3VyY2Uua2V5LCBlZGdlRGF0YS50YXJnZXQua2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIG5vZGUgJiBhbiBlZGdlLCByZXR1cm5zIHRoZSBvdGhlciBleHRyZW1pdHkgb2YgdGhlIGVkZ2UuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgIC0gVGhlIHJlbGF0ZWQgbm9kZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGggb3IgaWYgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgIGVkZ2UgJiBub2RlIGFyZSBub3QgcmVsYXRlZC5cbiAgICovXG4gIG9wcG9zaXRlKG5vZGUsIGVkZ2UpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVkZ2UpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLm9wcG9zaXRlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGNvbnN0IHNvdXJjZSA9IGRhdGEuc291cmNlLmtleTtcbiAgICBjb25zdCB0YXJnZXQgPSBkYXRhLnRhcmdldC5rZXk7XG5cbiAgICBpZiAobm9kZSA9PT0gc291cmNlKSByZXR1cm4gdGFyZ2V0O1xuICAgIGlmIChub2RlID09PSB0YXJnZXQpIHJldHVybiBzb3VyY2U7XG5cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLm9wcG9zaXRlOiB0aGUgXCIke25vZGV9XCIgbm9kZSBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIFwiJHtlZGdlfVwiIGVkZ2UgKCR7c291cmNlfSwgJHt0YXJnZXR9KS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVkZ2UgaGFzIHRoZSBnaXZlbiBub2RlIGFzIGV4dHJlbWl0eS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgLSBUaGUgcmVsYXRlZCBub2RlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGVpdGhlciB0aGUgbm9kZSBvciB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBoYXNFeHRyZW1pdHkoZWRnZSwgbm9kZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguaGFzRXh0cmVtaXR5OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnNvdXJjZS5rZXkgPT09IG5vZGUgfHwgZGF0YS50YXJnZXQua2V5ID09PSBub2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWRnZSBpcyB1bmRpcmVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgaXNVbmRpcmVjdGVkKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pc1VuZGlyZWN0ZWQ6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEudW5kaXJlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIGVkZ2UgaXMgZGlyZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIGVkZ2UgLSBUaGUgZWRnZSdzIGtleS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBpc0RpcmVjdGVkKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pc0RpcmVjdGVkOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiAhZGF0YS51bmRpcmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWRnZSBpcyBhIHNlbGYgbG9vcC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGlzU2VsZkxvb3AoZWRnZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVkZ2UpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmlzU2VsZkxvb3A6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuc291cmNlID09PSBkYXRhLnRhcmdldDtcbiAgfVxuXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBNdXRhdGlvblxuICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGFkZCBhIG5vZGUgdG8gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIG5vZGUgICAgICAgICAtIFRoZSBub2RlLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFthdHRyaWJ1dGVzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgIC0gVGhlIG5vZGUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdpdmVuIG5vZGUgYWxyZWFkeSBleGlzdC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmUgbm90IGFuIG9iamVjdC5cbiAgICovXG4gIGFkZE5vZGUobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gYWRkTm9kZSh0aGlzLCBub2RlLCBhdHRyaWJ1dGVzKTtcblxuICAgIHJldHVybiBub2RlRGF0YS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gbWVyZ2UgYSBub2RlIGludG8gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIG5vZGUgICAgICAgICAtIFRoZSBub2RlLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFthdHRyaWJ1dGVzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgIC0gVGhlIG5vZGUuXG4gICAqL1xuICBtZXJnZU5vZGUobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGlmIChhdHRyaWJ1dGVzICYmICFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgubWVyZ2VOb2RlOiBpbnZhbGlkIGF0dHJpYnV0ZXMuIEV4cGVjdGluZyBhbiBvYmplY3QgYnV0IGdvdCBcIiR7YXR0cmlidXRlc31cImBcbiAgICAgICk7XG5cbiAgICAvLyBTdHJpbmcgY29lcmNpb25cbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHt9O1xuXG4gICAgLy8gSWYgdGhlIG5vZGUgYWxyZWFkeSBleGlzdHMsIHdlIG1lcmdlIHRoZSBhdHRyaWJ1dGVzXG4gICAgbGV0IGRhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgYXNzaWduKGRhdGEuYXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICAgICAgdHlwZTogJ21lcmdlJyxcbiAgICAgICAgICBrZXk6IG5vZGUsXG4gICAgICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW25vZGUsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBkYXRhID0gbmV3IHRoaXMuTm9kZURhdGFDbGFzcyhub2RlLCBhdHRyaWJ1dGVzKTtcblxuICAgIC8vIEFkZGluZyB0aGUgbm9kZSB0byBpbnRlcm5hbCByZWdpc3RlclxuICAgIHRoaXMuX25vZGVzLnNldChub2RlLCBkYXRhKTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQWRkZWQnLCB7XG4gICAgICBrZXk6IG5vZGUsXG4gICAgICBhdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gW25vZGUsIHRydWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGFkZCBhIG5vZGUgaWYgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGdyYXBoIG9yIGVsc2UgdG9cbiAgICogdXBkYXRlIGl0cyBhdHRyaWJ1dGVzIHVzaW5nIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAgLSBUaGUgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IFt1cGRhdGVyXSAtIE9wdGlvbmFsIHVwZGF0ZXIgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgLSBUaGUgbm9kZS5cbiAgICovXG4gIHVwZGF0ZU5vZGUobm9kZSwgdXBkYXRlcikge1xuICAgIGlmICh1cGRhdGVyICYmIHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudXBkYXRlTm9kZTogaW52YWxpZCB1cGRhdGVyIGZ1bmN0aW9uLiBFeHBlY3RpbmcgYSBmdW5jdGlvbiBidXQgZ290IFwiJHt1cGRhdGVyfVwiYFxuICAgICAgKTtcblxuICAgIC8vIFN0cmluZyBjb2VyY2lvblxuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBhbHJlYWR5IGV4aXN0cywgd2UgdXBkYXRlIHRoZSBhdHRyaWJ1dGVzXG4gICAgbGV0IGRhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKHVwZGF0ZXIpIHtcbiAgICAgICAgY29uc3Qgb2xkQXR0cmlidXRlcyA9IGRhdGEuYXR0cmlidXRlcztcbiAgICAgICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihvbGRBdHRyaWJ1dGVzKTtcblxuICAgICAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICAgICAga2V5OiBub2RlLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbm9kZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB1cGRhdGVyID8gdXBkYXRlcih7fSkgOiB7fTtcblxuICAgIGRhdGEgPSBuZXcgdGhpcy5Ob2RlRGF0YUNsYXNzKG5vZGUsIGF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gQWRkaW5nIHRoZSBub2RlIHRvIGludGVybmFsIHJlZ2lzdGVyXG4gICAgdGhpcy5fbm9kZXMuc2V0KG5vZGUsIGRhdGEpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBZGRlZCcsIHtcbiAgICAgIGtleTogbm9kZSxcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiBbbm9kZSwgdHJ1ZV07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gZHJvcCBhIHNpbmdsZSBub2RlICYgYWxsIGl0cyBhdHRhY2hlZCBlZGdlcyBmcm9tIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICBub2RlIC0gVGhlIG5vZGUuXG4gICAqIEByZXR1cm4ge0dyYXBofVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBkcm9wTm9kZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kcm9wTm9kZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBSZW1vdmluZyBhdHRhY2hlZCBlZGdlc1xuICAgIC8vIFRPRE86IHdlIGNvdWxkIGRvIGZhc3RlclxuICAgIHRoaXMuZm9yRWFjaEVkZ2Uobm9kZSwgZWRnZSA9PiB7XG4gICAgICB0aGlzLmRyb3BFZGdlKGVkZ2UpO1xuICAgIH0pO1xuXG4gICAgLy8gRHJvcHBpbmcgdGhlIG5vZGUgZnJvbSB0aGUgcmVnaXN0ZXJcbiAgICB0aGlzLl9ub2Rlcy5kZWxldGUobm9kZSk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnbm9kZURyb3BwZWQnLCB7XG4gICAgICBrZXk6IG5vZGUsXG4gICAgICBhdHRyaWJ1dGVzOiBub2RlRGF0YS5hdHRyaWJ1dGVzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gZHJvcCBhIHNpbmdsZSBlZGdlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBBcml0eSAxOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVkZ2UgLSBUaGUgZWRnZS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICB0YXJnZXQgLSBUYXJnZXQgbm9kZS5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgZG9lc24ndCBleGlzdC5cbiAgICovXG4gIGRyb3BFZGdlKGVkZ2UpIHtcbiAgICBsZXQgZWRnZURhdGE7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgYXJndW1lbnRzWzBdLFxuICAgICAgICB0YXJnZXQgPSAnJyArIGFyZ3VtZW50c1sxXTtcblxuICAgICAgZWRnZURhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHRoaXMudHlwZSk7XG5cbiAgICAgIGlmICghZWRnZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLmRyb3BFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiAtPiBcIiR7dGFyZ2V0fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgICAgZWRnZURhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICAgIGlmICghZWRnZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLmRyb3BFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIERyb3BwaW5nIHRoZSBlZGdlIGZyb20gdGhlIHJlZ2lzdGVyXG4gICAgdGhpcy5fZWRnZXMuZGVsZXRlKGVkZ2VEYXRhLmtleSk7XG5cbiAgICAvLyBVcGRhdGluZyByZWxhdGVkIGRlZ3JlZXNcbiAgICBjb25zdCB7c291cmNlOiBzb3VyY2VEYXRhLCB0YXJnZXQ6IHRhcmdldERhdGEsIGF0dHJpYnV0ZXN9ID0gZWRnZURhdGE7XG5cbiAgICBjb25zdCB1bmRpcmVjdGVkID0gZWRnZURhdGEudW5kaXJlY3RlZDtcblxuICAgIGlmIChzb3VyY2VEYXRhID09PSB0YXJnZXREYXRhKSB7XG4gICAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMtLTtcbiAgICAgICAgdGhpcy5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnQtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHMtLTtcbiAgICAgICAgdGhpcy5fZGlyZWN0ZWRTZWxmTG9vcENvdW50LS07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICAgIHNvdXJjZURhdGEudW5kaXJlY3RlZERlZ3JlZS0tO1xuICAgICAgICB0YXJnZXREYXRhLnVuZGlyZWN0ZWREZWdyZWUtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZURhdGEub3V0RGVncmVlLS07XG4gICAgICAgIHRhcmdldERhdGEuaW5EZWdyZWUtLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhcmluZyBpbmRleFxuICAgIGNsZWFyRWRnZUZyb21TdHJ1Y3R1cmVJbmRleCh0aGlzLCB1bmRpcmVjdGVkLCBlZGdlRGF0YSk7XG5cbiAgICBpZiAodW5kaXJlY3RlZCkgdGhpcy5fdW5kaXJlY3RlZFNpemUtLTtcbiAgICBlbHNlIHRoaXMuX2RpcmVjdGVkU2l6ZS0tO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VEcm9wcGVkJywge1xuICAgICAga2V5OiBlZGdlLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIHNvdXJjZTogc291cmNlRGF0YS5rZXksXG4gICAgICB0YXJnZXQ6IHRhcmdldERhdGEua2V5LFxuICAgICAgdW5kaXJlY3RlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gcmVtb3ZlIGV2ZXJ5IGVkZ2UgJiBldmVyeSBub2RlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIC8vIENsZWFyaW5nIGVkZ2VzXG4gICAgdGhpcy5fZWRnZXMuY2xlYXIoKTtcblxuICAgIC8vIENsZWFyaW5nIG5vZGVzXG4gICAgdGhpcy5fbm9kZXMuY2xlYXIoKTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzXG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZUNvdW50ZXJzKCk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnY2xlYXJlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIHJlbW92ZSBldmVyeSBlZGdlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIGNsZWFyRWRnZXMoKSB7XG4gICAgY2xlYXJTdHJ1Y3R1cmVJbmRleCh0aGlzKTtcblxuICAgIC8vIENsZWFyaW5nIGVkZ2VzXG4gICAgdGhpcy5fZWRnZXMuY2xlYXIoKTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzXG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZUNvdW50ZXJzKCk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnZWRnZXNDbGVhcmVkJyk7XG4gIH1cblxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBkZXNpcmVkIGdyYXBoJ3MgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgLSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9hdHRyaWJ1dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ3JhcGggaGFzIHRoZSBkZXNpcmVkIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc0F0dHJpYnV0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHNldHRpbmcgYSB2YWx1ZSBmb3IgdGhlIGRlc2lyZWQgZ3JhcGgncyBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUgIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB2YWx1ZSAtIFZhbHVlIGZvciB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdhdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5fYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2luZyBhIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgZGVzaXJlZCBncmFwaCdzIGF0dHJpYnV0ZSdzIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IHVwZGF0ZXIgLSBGdW5jdGlvbiB1c2UgdG8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZS5cbiAgICogQHJldHVybiB7R3JhcGh9XG4gICAqL1xuICB1cGRhdGVBdHRyaWJ1dGUobmFtZSwgdXBkYXRlcikge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnVwZGF0ZUF0dHJpYnV0ZTogdXBkYXRlciBzaG91bGQgYmUgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlc1tuYW1lXSA9IHVwZGF0ZXIodmFsdWUpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2F0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzLFxuICAgICAgbmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJlbW92aW5nIHRoZSBkZXNpcmVkIGdyYXBoJ3MgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuX2F0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmVwbGFjaW5nIHRoZSBncmFwaCdzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdH0gYXR0cmlidXRlcyAtIE5ldyBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICByZXBsYWNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgucmVwbGFjZUF0dHJpYnV0ZXM6IHByb3ZpZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhIHBsYWluIG9iamVjdC4nXG4gICAgICApO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgbWVyZ2luZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIG1lcmdlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICBtZXJnZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLm1lcmdlQXR0cmlidXRlczogcHJvdmlkZWQgYXR0cmlidXRlcyBhcmUgbm90IGEgcGxhaW4gb2JqZWN0LidcbiAgICAgICk7XG5cbiAgICBhc3NpZ24odGhpcy5fYXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5fYXR0cmlidXRlcyxcbiAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGluZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gdXBkYXRlciAtIEZ1bmN0aW9uIHVzZWQgdG8gdXBkYXRlIHRoZSBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiB1cGRhdGVyIGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgKi9cbiAgdXBkYXRlQXR0cmlidXRlcyh1cGRhdGVyKSB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgudXBkYXRlQXR0cmlidXRlczogcHJvdmlkZWQgdXBkYXRlciBpcyBub3QgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IHVwZGF0ZXIodGhpcy5fYXR0cmlidXRlcyk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuX2F0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIHVwZGF0ZSBlYWNoIG5vZGUncyBhdHRyaWJ1dGVzIHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gIHVwZGF0ZXIgLSBVcGRhdGVyIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICogQHBhcmFtIHtvYmplY3R9ICAgIFtoaW50c10gLSBPcHRpb25hbCBoaW50cy5cbiAgICovXG4gIHVwZGF0ZUVhY2hOb2RlQXR0cmlidXRlcyh1cGRhdGVyLCBoaW50cykge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnVwZGF0ZUVhY2hOb2RlQXR0cmlidXRlczogZXhwZWN0aW5nIGFuIHVwZGF0ZXIgZnVuY3Rpb24uJ1xuICAgICAgKTtcblxuICAgIGlmIChoaW50cyAmJiAhdmFsaWRhdGVIaW50cyhoaW50cykpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51cGRhdGVFYWNoTm9kZUF0dHJpYnV0ZXM6IGludmFsaWQgaGludHMuIEV4cGVjdGluZyBhbiBvYmplY3QgaGF2aW5nIHRoZSBmb2xsb3dpbmcgc2hhcGU6IHthdHRyaWJ1dGVzPzogW3N0cmluZ119J1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgICAgbm9kZURhdGEuYXR0cmlidXRlcyA9IHVwZGF0ZXIobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoJ2VhY2hOb2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBoaW50czogaGludHMgPyBoaW50cyA6IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdXNlZCB0byB1cGRhdGUgZWFjaCBlZGdlJ3MgYXR0cmlidXRlcyB1c2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259ICB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbiB0byB1c2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSAgICBbaGludHNdIC0gT3B0aW9uYWwgaGludHMuXG4gICAqL1xuICB1cGRhdGVFYWNoRWRnZUF0dHJpYnV0ZXModXBkYXRlciwgaGludHMpIHtcbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51cGRhdGVFYWNoRWRnZUF0dHJpYnV0ZXM6IGV4cGVjdGluZyBhbiB1cGRhdGVyIGZ1bmN0aW9uLidcbiAgICAgICk7XG5cbiAgICBpZiAoaGludHMgJiYgIXZhbGlkYXRlSGludHMoaGludHMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgudXBkYXRlRWFjaEVkZ2VBdHRyaWJ1dGVzOiBpbnZhbGlkIGhpbnRzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGhhdmluZyB0aGUgZm9sbG93aW5nIHNoYXBlOiB7YXR0cmlidXRlcz86IFtzdHJpbmddfSdcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX2VkZ2VzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIGVkZ2VEYXRhLCBzb3VyY2VEYXRhLCB0YXJnZXREYXRhO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGVkZ2VEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdCgnZWFjaEVkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGhpbnRzOiBoaW50cyA/IGhpbnRzIDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEl0ZXJhdGlvbi1yZWxhdGVkIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3MgYWRqYWNlbmN5IHVzaW5nIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICovXG4gIGZvckVhY2hBZGphY2VuY3lFbnRyeShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5mb3JFYWNoQWRqYWNlbmN5RW50cnk6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5tdWx0aSkgZm9yRWFjaEFkamFjZW5jeU11bHRpKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRoaXMsIGNhbGxiYWNrKTtcbiAgICBlbHNlIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoZmFsc2UsIGZhbHNlLCBmYWxzZSwgdGhpcywgY2FsbGJhY2spO1xuICB9XG4gIGZvckVhY2hBZGphY2VuY3lFbnRyeVdpdGhPcnBoYW5zKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmZvckVhY2hBZGphY2VuY3lFbnRyeVdpdGhPcnBoYW5zOiBleHBlY3RpbmcgYSBjYWxsYmFjay4nXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMubXVsdGkpIGZvckVhY2hBZGphY2VuY3lNdWx0aShmYWxzZSwgZmFsc2UsIHRydWUsIHRoaXMsIGNhbGxiYWNrKTtcbiAgICBlbHNlIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoZmFsc2UsIGZhbHNlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIGFzc3ltZXRyaWMgYWRqYWNlbmN5IHVzaW5nIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICovXG4gIGZvckVhY2hBc3N5bWV0cmljQWRqYWNlbmN5RW50cnkoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZm9yRWFjaEFzc3ltZXRyaWNBZGphY2VuY3lFbnRyeTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGlmICh0aGlzLm11bHRpKSBmb3JFYWNoQWRqYWNlbmN5TXVsdGkoZmFsc2UsIHRydWUsIGZhbHNlLCB0aGlzLCBjYWxsYmFjayk7XG4gICAgZWxzZSBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlKGZhbHNlLCB0cnVlLCBmYWxzZSwgdGhpcywgY2FsbGJhY2spO1xuICB9XG4gIGZvckVhY2hBc3N5bWV0cmljQWRqYWNlbmN5RW50cnlXaXRoT3JwaGFucyhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5mb3JFYWNoQXNzeW1ldHJpY0FkamFjZW5jeUVudHJ5V2l0aE9ycGhhbnM6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5tdWx0aSkgZm9yRWFjaEFkamFjZW5jeU11bHRpKGZhbHNlLCB0cnVlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gICAgZWxzZSBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlKGZhbHNlLCB0cnVlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgbGlzdCBvZiB0aGUgZ3JhcGgncyBub2Rlcy5cbiAgICpcbiAgICogQHJldHVybiB7YXJyYXl9IC0gVGhlIG5vZGVzLlxuICAgKi9cbiAgbm9kZXMoKSB7XG4gICAgaWYgKHR5cGVvZiBBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9ub2Rlcy5rZXlzKCkpO1xuXG4gICAgcmV0dXJuIHRha2UodGhpcy5fbm9kZXMua2V5cygpLCB0aGlzLl9ub2Rlcy5zaXplKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3Mgbm9kZXMgdXNpbmcgdGhlIGdpdmVuIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcywgaW5kZXgpLlxuICAgKi9cbiAgZm9yRWFjaE5vZGUoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZm9yRWFjaE5vZGU6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIG5vZGVEYXRhO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIG5vZGVEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIGNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpdGVyYXRpbmcgYXR0ZW1wdGluZyB0byBmaW5kIGEgbm9kZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJlZGljYXRlXG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBmaW5kTm9kZShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5maW5kTm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoY2FsbGJhY2sobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKSkgcmV0dXJuIG5vZGVEYXRhLmtleTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIG1hcHBpbmcgbm9kZXMuXG4gICAqXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgY2FsbGJhY2sgLSBDYWxsYmFjayAoa2V5LCBhdHRyaWJ1dGVzKS5cbiAgICovXG4gIG1hcE5vZGVzKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLm1hcE5vZGU6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIG5vZGVEYXRhO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMub3JkZXIpO1xuICAgIGxldCBpID0gMDtcblxuICAgIHdoaWxlICgoKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLCBzdGVwLmRvbmUgIT09IHRydWUpKSB7XG4gICAgICBub2RlRGF0YSA9IHN0ZXAudmFsdWU7XG4gICAgICByZXN1bHRbaSsrXSA9IGNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgc29tZSBub2RlIHZlcmlmeSB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBzb21lTm9kZShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5zb21lTm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoY2FsbGJhY2sobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciBhbGwgbm9kZSB2ZXJpZnkgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIChrZXksIGF0dHJpYnV0ZXMpLlxuICAgKi9cbiAgZXZlcnlOb2RlKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmV2ZXJ5Tm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoIWNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcykpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgZmlsdGVyaW5nIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBmaWx0ZXJOb2RlcyhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5maWx0ZXJOb2RlczogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgoKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLCBzdGVwLmRvbmUgIT09IHRydWUpKSB7XG4gICAgICBub2RlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIGlmIChjYWxsYmFjayhub2RlRGF0YS5rZXksIG5vZGVEYXRhLmF0dHJpYnV0ZXMpKVxuICAgICAgICByZXN1bHQucHVzaChub2RlRGF0YS5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJlZHVjaW5nIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGFjY3VtdWxhdG9yLCBrZXksIGF0dHJpYnV0ZXMpLlxuICAgKi9cbiAgcmVkdWNlTm9kZXMoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5yZWR1Y2VOb2RlczogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMilcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnJlZHVjZU5vZGVzOiBtaXNzaW5nIGluaXRpYWwgdmFsdWUuIFlvdSBtdXN0IHByb3ZpZGUgaXQgYmVjYXVzZSB0aGUgY2FsbGJhY2sgdGFrZXMgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCBhbmQgd2UgY2Fubm90IGluZmVyIHRoZSBpbml0aWFsIHZhbHVlIGZyb20gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgYXMgeW91IGNvdWxkIHdpdGggYSBzaW1wbGUgYXJyYXkuJ1xuICAgICAgKTtcblxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgbm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBncmFwaCdzIG5vZGUgZW50cmllcy5cbiAgICpcbiAgICogQHJldHVybiB7SXRlcmF0b3J9XG4gICAqL1xuICBub2RlRW50cmllcygpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcigoKSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICBpZiAoc3RlcC5kb25lKSByZXR1cm4gc3RlcDtcblxuICAgICAgY29uc3QgZGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7bm9kZTogZGF0YS5rZXksIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc30sXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIFNlcmlhbGl6YXRpb25cbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgZXhwb3J0aW5nIHRoZSB0YXJnZXQgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgIG5vZGUgLSBUYXJnZXQgbm9kZS5cbiAgICogQHJldHVybiB7YXJyYXl9ICAgICAgLSBUaGUgc2VyaWFsaXplZCBub2RlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIGV4cG9ydE5vZGUobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmV4cG9ydE5vZGU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZU5vZGUobm9kZSwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGV4cG9ydGluZyB0aGUgdGFyZ2V0IGVkZ2UuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICBlZGdlIC0gVGFyZ2V0IGVkZ2UuXG4gICAqIEByZXR1cm4ge2FycmF5fSAgICAgIC0gVGhlIHNlcmlhbGl6ZWQgZWRnZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpcyBub3QgZm91bmQuXG4gICAqL1xuICBleHBvcnRFZGdlKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5leHBvcnRFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBzZXJpYWxpemVFZGdlKGVkZ2UsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGV4cG9ydCB0aGUgd2hvbGUgZ3JhcGguXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBUaGUgc2VyaWFsaXplZCBncmFwaC5cbiAgICovXG4gIGV4cG9ydCgpIHtcbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheSh0aGlzLl9ub2Rlcy5zaXplKTtcblxuICAgIGxldCBpID0gMDtcblxuICAgIHRoaXMuX25vZGVzLmZvckVhY2goKGRhdGEsIGtleSkgPT4ge1xuICAgICAgbm9kZXNbaSsrXSA9IHNlcmlhbGl6ZU5vZGUoa2V5LCBkYXRhKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGVkZ2VzID0gbmV3IEFycmF5KHRoaXMuX2VkZ2VzLnNpemUpO1xuXG4gICAgaSA9IDA7XG5cbiAgICB0aGlzLl9lZGdlcy5mb3JFYWNoKChkYXRhLCBrZXkpID0+IHtcbiAgICAgIGVkZ2VzW2krK10gPSBzZXJpYWxpemVFZGdlKGtleSwgZGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczogdGhpcy5nZXRBdHRyaWJ1dGVzKCksXG4gICAgICBub2RlcyxcbiAgICAgIGVkZ2VzLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIG11bHRpOiB0aGlzLm11bHRpLFxuICAgICAgICBhbGxvd1NlbGZMb29wczogdGhpcy5hbGxvd1NlbGZMb29wc1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gaW1wb3J0IGEgc2VyaWFsaXplZCBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgICAtIFRoZSBzZXJpYWxpemVkIG5vZGUuXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB0aGUgZ2l2ZW4gbm9kZS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBpbXBvcnROb2RlKGRhdGEsIG1lcmdlID0gZmFsc2UpIHtcbiAgICAvLyBWYWxpZGF0aW5nXG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVNlcmlhbGl6ZWROb2RlKGRhdGEpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgPT09ICdub3Qtb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnROb2RlOiBpbnZhbGlkIHNlcmlhbGl6ZWQgbm9kZS4gQSBzZXJpYWxpemVkIG5vZGUgc2hvdWxkIGJlIGEgcGxhaW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSBcImtleVwiIHByb3BlcnR5LidcbiAgICAgICAgKTtcbiAgICAgIGlmIChlcnJvciA9PT0gJ25vLWtleScpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0Tm9kZTogbm8ga2V5IHByb3ZpZGVkLidcbiAgICAgICAgKTtcbiAgICAgIGlmIChlcnJvciA9PT0gJ2ludmFsaWQtYXR0cmlidXRlcycpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0Tm9kZTogaW52YWxpZCBhdHRyaWJ1dGVzLiBBdHRyaWJ1dGVzIHNob3VsZCBiZSBhIHBsYWluIG9iamVjdCwgbnVsbCBvciBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgdGhlIG5vZGVcbiAgICBjb25zdCB7a2V5LCBhdHRyaWJ1dGVzID0ge319ID0gZGF0YTtcblxuICAgIGlmIChtZXJnZSkgdGhpcy5tZXJnZU5vZGUoa2V5LCBhdHRyaWJ1dGVzKTtcbiAgICBlbHNlIHRoaXMuYWRkTm9kZShrZXksIGF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gaW1wb3J0IGEgc2VyaWFsaXplZCBlZGdlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9ICBkYXRhICAtIFRoZSBzZXJpYWxpemVkIGVkZ2UuXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB0aGUgZ2l2ZW4gZWRnZS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBpbXBvcnRFZGdlKGRhdGEsIG1lcmdlID0gZmFsc2UpIHtcbiAgICAvLyBWYWxpZGF0aW5nXG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVNlcmlhbGl6ZWRFZGdlKGRhdGEpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgPT09ICdub3Qtb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnRFZGdlOiBpbnZhbGlkIHNlcmlhbGl6ZWQgZWRnZS4gQSBzZXJpYWxpemVkIGVkZ2Ugc2hvdWxkIGJlIGEgcGxhaW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSBcInNvdXJjZVwiICYgXCJ0YXJnZXRcIiBwcm9wZXJ0eS4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICduby1zb3VyY2UnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IG1pc3Npbmcgc291Y2UuJ1xuICAgICAgICApO1xuICAgICAgaWYgKGVycm9yID09PSAnbm8tdGFyZ2V0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnRFZGdlOiBtaXNzaW5nIHRhcmdldC4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICdpbnZhbGlkLWF0dHJpYnV0ZXMnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IGludmFsaWQgYXR0cmlidXRlcy4gQXR0cmlidXRlcyBzaG91bGQgYmUgYSBwbGFpbiBvYmplY3QsIG51bGwgb3Igb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICdpbnZhbGlkLXVuZGlyZWN0ZWQnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IGludmFsaWQgdW5kaXJlY3RlZC4gVW5kaXJlY3RlZCBzaG91bGQgYmUgYm9vbGVhbiBvciBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgdGhlIGVkZ2VcbiAgICBjb25zdCB7c291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMgPSB7fSwgdW5kaXJlY3RlZCA9IGZhbHNlfSA9IGRhdGE7XG5cbiAgICBsZXQgbWV0aG9kO1xuXG4gICAgaWYgKCdrZXknIGluIGRhdGEpIHtcbiAgICAgIG1ldGhvZCA9IG1lcmdlXG4gICAgICAgID8gdW5kaXJlY3RlZFxuICAgICAgICAgID8gdGhpcy5tZXJnZVVuZGlyZWN0ZWRFZGdlV2l0aEtleVxuICAgICAgICAgIDogdGhpcy5tZXJnZURpcmVjdGVkRWRnZVdpdGhLZXlcbiAgICAgICAgOiB1bmRpcmVjdGVkXG4gICAgICAgID8gdGhpcy5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXlcbiAgICAgICAgOiB0aGlzLmFkZERpcmVjdGVkRWRnZVdpdGhLZXk7XG5cbiAgICAgIG1ldGhvZC5jYWxsKHRoaXMsIGRhdGEua2V5LCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZCA9IG1lcmdlXG4gICAgICAgID8gdW5kaXJlY3RlZFxuICAgICAgICAgID8gdGhpcy5tZXJnZVVuZGlyZWN0ZWRFZGdlXG4gICAgICAgICAgOiB0aGlzLm1lcmdlRGlyZWN0ZWRFZGdlXG4gICAgICAgIDogdW5kaXJlY3RlZFxuICAgICAgICA/IHRoaXMuYWRkVW5kaXJlY3RlZEVkZ2VcbiAgICAgICAgOiB0aGlzLmFkZERpcmVjdGVkRWRnZTtcblxuICAgICAgbWV0aG9kLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGltcG9ydCBhIHNlcmlhbGl6ZWQgZ3JhcGguXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdHxHcmFwaH0gZGF0YSAgLSBUaGUgc2VyaWFsaXplZCBncmFwaC5cbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgICBtZXJnZSAtIFdoZXRoZXIgdG8gbWVyZ2UgZGF0YS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICovXG4gIGltcG9ydChkYXRhLCBtZXJnZSA9IGZhbHNlKSB7XG4gICAgLy8gSW1wb3J0aW5nIGEgR3JhcGggaW5zdGFuY2VcbiAgICBpZiAoaXNHcmFwaChkYXRhKSkge1xuICAgICAgdGhpcy5pbXBvcnQoZGF0YS5leHBvcnQoKSwgbWVyZ2UpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSW1wb3J0aW5nIGEgc2VyaWFsaXplZCBncmFwaFxuICAgIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmltcG9ydDogaW52YWxpZCBhcmd1bWVudC4gRXhwZWN0aW5nIGEgc2VyaWFsaXplZCBncmFwaCBvciwgYWx0ZXJuYXRpdmVseSwgYSBHcmFwaCBpbnN0YW5jZS4nXG4gICAgICApO1xuXG4gICAgaWYgKGRhdGEuYXR0cmlidXRlcykge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEuYXR0cmlidXRlcykpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIGF0dHJpYnV0ZXMuIEV4cGVjdGluZyBhIHBsYWluIG9iamVjdC4nXG4gICAgICAgICk7XG5cbiAgICAgIGlmIChtZXJnZSkgdGhpcy5tZXJnZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKTtcbiAgICAgIGVsc2UgdGhpcy5yZXBsYWNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIGxldCBpLCBsLCBsaXN0O1xuXG4gICAgaWYgKGRhdGEubm9kZXMpIHtcbiAgICAgIGxpc3QgPSBkYXRhLm5vZGVzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIG5vZGVzLiBFeHBlY3RpbmcgYW4gYXJyYXkuJ1xuICAgICAgICApO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW1wb3J0Tm9kZShsaXN0W2ldLCBtZXJnZSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuZWRnZXMpIHtcbiAgICAgIGxpc3QgPSBkYXRhLmVkZ2VzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIGVkZ2VzLiBFeHBlY3RpbmcgYW4gYXJyYXkuJ1xuICAgICAgICApO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW1wb3J0RWRnZShsaXN0W2ldLCBtZXJnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogVXRpbHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIGEgbnVsbCBjb3B5IG9mIHRoZSBncmFwaCwgaS5lLiBhIGdyYXBoIHdpdGhvdXQgbm9kZXNcbiAgICogJiBlZGdlcyBidXQgd2l0aCB0aGUgZXhhY3Qgc2FtZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHRvIG1lcmdlIHdpdGggdGhlIGN1cnJlbnQgb25lcy5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgIC0gVGhlIG51bGwgY29weS5cbiAgICovXG4gIG51bGxDb3B5KG9wdGlvbnMpIHtcbiAgICBjb25zdCBncmFwaCA9IG5ldyBHcmFwaChhc3NpZ24oe30sIHRoaXMuX29wdGlvbnMsIG9wdGlvbnMpKTtcbiAgICBncmFwaC5yZXBsYWNlQXR0cmlidXRlcyhhc3NpZ24oe30sIHRoaXMuZ2V0QXR0cmlidXRlcygpKSk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgYW4gZW1wdHkgY29weSBvZiB0aGUgZ3JhcGgsIGkuZS4gYSBncmFwaCB3aXRob3V0IGVkZ2VzIGJ1dFxuICAgKiB3aXRoIHRoZSBleGFjdCBzYW1lIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbWVyZ2Ugd2l0aCB0aGUgY3VycmVudCBvbmVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgLSBUaGUgZW1wdHkgY29weS5cbiAgICovXG4gIGVtcHR5Q29weShvcHRpb25zKSB7XG4gICAgY29uc3QgZ3JhcGggPSB0aGlzLm51bGxDb3B5KG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fbm9kZXMuZm9yRWFjaCgobm9kZURhdGEsIGtleSkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG5cbiAgICAgIC8vIE5PVEU6IG5vIG5lZWQgdG8gZW1pdCBldmVudHMgc2luY2UgdXNlciBjYW5ub3QgYWNjZXNzIHRoZSBpbnN0YW5jZSB5ZXRcbiAgICAgIG5vZGVEYXRhID0gbmV3IGdyYXBoLk5vZGVEYXRhQ2xhc3Moa2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIGdyYXBoLl9ub2Rlcy5zZXQoa2V5LCBub2RlRGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JhcGg7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBhbiBleGFjdCBjb3B5IG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9IC0gVGhlIGNvcHkuXG4gICAqL1xuICBjb3B5KCkge1xuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5lbXB0eUNvcHkoKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fZWRnZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgZWRnZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgZWRnZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICAvLyBOT1RFOiBubyBuZWVkIHRvIGVtaXQgZXZlbnRzIHNpbmNlIHVzZXIgY2Fubm90IGFjY2VzcyB0aGUgaW5zdGFuY2UgeWV0XG4gICAgICBhZGRFZGdlKFxuICAgICAgICBncmFwaCxcbiAgICAgICAgJ2NvcHknLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZWRnZURhdGEudW5kaXJlY3RlZCxcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5zb3VyY2Uua2V5LFxuICAgICAgICBlZGdlRGF0YS50YXJnZXQua2V5LFxuICAgICAgICBhc3NpZ24oe30sIGVkZ2VEYXRhLmF0dHJpYnV0ZXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBncmFwaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdXBncmFkaW5nIHRoZSBncmFwaCB0byBhIG1peGVkIG9uZS5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9IC0gVGhlIGNvcHkuXG4gICAqL1xuICB1cGdyYWRlVG9NaXhlZCgpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAnbWl4ZWQnKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFVwZ3JhZGluZyBub2RlIGRhdGE6XG4gICAgLy8gTk9URTogbWF5YmUgdGhpcyBjb3VsZCBsZWFkIHRvIHNvbWUgZGUtb3B0aW1pemF0aW9uIGJ5IHVzdWFsXG4gICAgLy8gSmF2YVNjcmlwdCBlbmdpbmVzIGJ1dCBJIGNhbm5vdCBiZSBzdXJlIG9mIGl0LiBBbm90aGVyIHNvbHV0aW9uXG4gICAgLy8gd291bGQgYmUgdG8gcmVpbnN0YW50aWF0ZSB0aGUgY2xhc3NlcyBidXQgdGhpcyBzdXJlbHkgaGFzIGEgcGVyZm9ybWFuY2VcbiAgICAvLyBhbmQgbWVtb3J5IGltcGFjdC5cbiAgICB0aGlzLl9ub2Rlcy5mb3JFYWNoKGRhdGEgPT4gZGF0YS51cGdyYWRlVG9NaXhlZCgpKTtcblxuICAgIC8vIE11dGF0aW5nIHRoZSBvcHRpb25zICYgdGhlIGluc3RhbmNlXG4gICAgdGhpcy5fb3B0aW9ucy50eXBlID0gJ21peGVkJztcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICd0eXBlJywgdGhpcy5fb3B0aW9ucy50eXBlKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ05vZGVEYXRhQ2xhc3MnLCBNaXhlZE5vZGVEYXRhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGdyYWRpbmcgdGhlIGdyYXBoIHRvIGEgbXVsdGkgb25lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gLSBUaGUgY29weS5cbiAgICovXG4gIHVwZ3JhZGVUb011bHRpKCkge1xuICAgIGlmICh0aGlzLm11bHRpKSByZXR1cm4gdGhpcztcblxuICAgIC8vIE11dGF0aW5nIHRoZSBvcHRpb25zICYgdGhlIGluc3RhbmNlXG4gICAgdGhpcy5fb3B0aW9ucy5tdWx0aSA9IHRydWU7XG4gICAgcmVhZE9ubHlQcm9wZXJ0eSh0aGlzLCAnbXVsdGknLCB0cnVlKTtcblxuICAgIC8vIFVwZ3JhZGluZyBpbmRpY2VzXG4gICAgdXBncmFkZVN0cnVjdHVyZUluZGV4VG9NdWx0aSh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEtub3duIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgdXNlZCBieSBKYXZhU2NyaXB0IHRvIHBlcmZvcm0gSlNPTiBzZXJpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IC0gVGhlIHNlcmlhbGl6ZWQgZ3JhcGguXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBbb2JqZWN0IEdyYXBoXS5cbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBHcmFwaF0nO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgYnkgbm9kZSdzIGNvbnNvbGUgdG8gZGlzcGxheSBhIGN1c3RvbSBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBGb3JtYXR0ZWQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFwaC5cbiAgICovXG4gIGluc3BlY3QoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSB7fTtcbiAgICB0aGlzLl9ub2Rlcy5mb3JFYWNoKChkYXRhLCBrZXkpID0+IHtcbiAgICAgIG5vZGVzW2tleV0gPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBlZGdlcyA9IHt9LFxuICAgICAgbXVsdGlJbmRleCA9IHt9O1xuXG4gICAgdGhpcy5fZWRnZXMuZm9yRWFjaCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBkYXRhLnVuZGlyZWN0ZWQgPyAnLS0nIDogJy0+JztcblxuICAgICAgbGV0IGxhYmVsID0gJyc7XG5cbiAgICAgIGxldCBzb3VyY2UgPSBkYXRhLnNvdXJjZS5rZXk7XG4gICAgICBsZXQgdGFyZ2V0ID0gZGF0YS50YXJnZXQua2V5O1xuICAgICAgbGV0IHRtcDtcblxuICAgICAgaWYgKGRhdGEudW5kaXJlY3RlZCAmJiBzb3VyY2UgPiB0YXJnZXQpIHtcbiAgICAgICAgdG1wID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSB0YXJnZXQ7XG4gICAgICAgIHRhcmdldCA9IHRtcDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzYyA9IGAoJHtzb3VyY2V9KSR7ZGlyZWN0aW9ufSgke3RhcmdldH0pYDtcblxuICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aCgnZ2VpZF8nKSkge1xuICAgICAgICBsYWJlbCArPSBgWyR7a2V5fV06IGA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubXVsdGkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtdWx0aUluZGV4W2Rlc2NdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIG11bHRpSW5kZXhbZGVzY10gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11bHRpSW5kZXhbZGVzY10rKztcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsICs9IGAke211bHRpSW5kZXhbZGVzY119LiBgO1xuICAgICAgfVxuXG4gICAgICBsYWJlbCArPSBkZXNjO1xuXG4gICAgICBlZGdlc1tsYWJlbF0gPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkdW1teSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIHRoaXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eShrKSAmJlxuICAgICAgICAhRU1JVFRFUl9QUk9QUy5oYXMoaykgJiZcbiAgICAgICAgdHlwZW9mIHRoaXNba10gIT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGsgIT09ICdzeW1ib2wnXG4gICAgICApXG4gICAgICAgIGR1bW15W2tdID0gdGhpc1trXTtcbiAgICB9XG5cbiAgICBkdW1teS5hdHRyaWJ1dGVzID0gdGhpcy5fYXR0cmlidXRlcztcbiAgICBkdW1teS5ub2RlcyA9IG5vZGVzO1xuICAgIGR1bW15LmVkZ2VzID0gZWRnZXM7XG5cbiAgICBwcml2YXRlUHJvcGVydHkoZHVtbXksICdjb25zdHJ1Y3RvcicsIHRoaXMuY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIGR1bW15O1xuICB9XG59XG5cbi8qKlxuICogQXR0YWNoaW5nIG1ldGhvZHMgdG8gdGhlIHByb3RvdHlwZS5cbiAqXG4gKiBIZXJlLCB3ZSBhcmUgYXR0YWNoaW5nIGEgd2lkZSB2YXJpZXR5IG9mIG1ldGhvZHMgdG8gdGhlIEdyYXBoIGNsYXNzJ1xuICogcHJvdG90eXBlIHdoZW4gdGhvc2UgYXJlIHZlcnkgbnVtZXJvdXMgYW5kIHdoZW4gdGhlaXIgY3JlYXRpb24gaXNcbiAqIGFic3RyYWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBBdHRhY2hpbmcgY3VzdG9tIGluc3BlY3QgbWV0aG9kIGZvciBub2RlID49IDEwLlxuICovXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpXG4gIEdyYXBoLnByb3RvdHlwZVtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSA9XG4gICAgR3JhcGgucHJvdG90eXBlLmluc3BlY3Q7XG5cbi8qKlxuICogUmVsYXRlZCB0byBlZGdlIGFkZGl0aW9uLlxuICovXG5FREdFX0FERF9NRVRIT0RTLmZvckVhY2gobWV0aG9kID0+IHtcbiAgWydhZGQnLCAnbWVyZ2UnLCAndXBkYXRlJ10uZm9yRWFjaCh2ZXJiID0+IHtcbiAgICBjb25zdCBuYW1lID0gbWV0aG9kLm5hbWUodmVyYik7XG4gICAgY29uc3QgZm4gPSB2ZXJiID09PSAnYWRkJyA/IGFkZEVkZ2UgOiBtZXJnZUVkZ2U7XG5cbiAgICBpZiAobWV0aG9kLmdlbmVyYXRlS2V5KSB7XG4gICAgICBHcmFwaC5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAoc291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIChtZXRob2QudHlwZSB8fCB0aGlzLnR5cGUpID09PSAndW5kaXJlY3RlZCcsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgdmVyYiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIEdyYXBoLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChlZGdlLCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gZm4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIChtZXRob2QudHlwZSB8fCB0aGlzLnR5cGUpID09PSAndW5kaXJlY3RlZCcsXG4gICAgICAgICAgZWRnZSxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgdmVyYiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn0pO1xuXG4vKipcbiAqIEF0dHJpYnV0ZXMtcmVsYXRlZC5cbiAqL1xuYXR0YWNoTm9kZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKTtcbmF0dGFjaEVkZ2VBdHRyaWJ1dGVzTWV0aG9kcyhHcmFwaCk7XG5cbi8qKlxuICogRWRnZSBpdGVyYXRpb24tcmVsYXRlZC5cbiAqL1xuYXR0YWNoRWRnZUl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpO1xuXG4vKipcbiAqIE5laWdoYm9yIGl0ZXJhdGlvbi1yZWxhdGVkLlxuICovXG5hdHRhY2hOZWlnaGJvckl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpO1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBIZWxwZXIgQ2xhc3Nlc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBCdWlsZGluZyBzb21lIGhpZ2hlci1vcmRlciBjbGFzc2VzIGluc3RhbnRpYXRpbmcgdGhlIGdyYXBoIHdpdGhcbiAqIHByZWRlZmluaXRlIG9wdGlvbnMuXG4gKi9cbmltcG9ydCB7YXNzaWdufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBHcmFwaCBmcm9tICcuL2dyYXBoJztcblxuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsXG4gIE5vdEZvdW5kR3JhcGhFcnJvcixcbiAgVXNhZ2VHcmFwaEVycm9yXG59IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvcnMuXG4gKi9cbmNsYXNzIERpcmVjdGVkR3JhcGggZXh0ZW5kcyBHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBhc3NpZ24oe3R5cGU6ICdkaXJlY3RlZCd9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IGZhbHNlKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgbXVsdGkgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgaWYgKGZpbmFsT3B0aW9ucy50eXBlICE9PSAnZGlyZWN0ZWQnKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgVW5kaXJlY3RlZEdyYXBoIGV4dGVuZHMgR3JhcGgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt0eXBlOiAndW5kaXJlY3RlZCd9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IGZhbHNlKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnVW5kaXJlY3RlZEdyYXBoLmZyb206IGluY29uc2lzdGVudCBpbmRpY2F0aW9uIHRoYXQgdGhlIGdyYXBoIHNob3VsZCBiZSBtdWx0aSBpbiBnaXZlbiBvcHRpb25zISdcbiAgICAgICk7XG5cbiAgICBpZiAoZmluYWxPcHRpb25zLnR5cGUgIT09ICd1bmRpcmVjdGVkJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ1VuZGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlHcmFwaCBleHRlbmRzIEdyYXBoIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGZpbmFsT3B0aW9ucyA9IGFzc2lnbih7bXVsdGk6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IHRydWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdNdWx0aUdyYXBoLmZyb206IGluY29uc2lzdGVudCBpbmRpY2F0aW9uIHRoYXQgdGhlIGdyYXBoIHNob3VsZCBiZSBzaW1wbGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlEaXJlY3RlZEdyYXBoIGV4dGVuZHMgR3JhcGgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt0eXBlOiAnZGlyZWN0ZWQnLCBtdWx0aTogdHJ1ZX0sIG9wdGlvbnMpO1xuXG4gICAgaWYgKCdtdWx0aScgaW4gZmluYWxPcHRpb25zICYmIGZpbmFsT3B0aW9ucy5tdWx0aSAhPT0gdHJ1ZSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ011bHRpRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgc2ltcGxlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIGlmIChmaW5hbE9wdGlvbnMudHlwZSAhPT0gJ2RpcmVjdGVkJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ011bHRpRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlVbmRpcmVjdGVkR3JhcGggZXh0ZW5kcyBHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBhc3NpZ24oe3R5cGU6ICd1bmRpcmVjdGVkJywgbXVsdGk6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IHRydWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdNdWx0aVVuZGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgc2ltcGxlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIGlmIChmaW5hbE9wdGlvbnMudHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnTXVsdGlVbmRpcmVjdGVkR3JhcGguZnJvbTogaW5jb25zaXN0ZW50IFwiJyArXG4gICAgICAgICAgZmluYWxPcHRpb25zLnR5cGUgK1xuICAgICAgICAgICdcIiB0eXBlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIHN1cGVyKGZpbmFsT3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2hpbmcgc3RhdGljICMuZnJvbSBtZXRob2QgdG8gZWFjaCBvZiB0aGUgY29uc3RydWN0b3JzLlxuICovXG5mdW5jdGlvbiBhdHRhY2hTdGF0aWNGcm9tTWV0aG9kKENsYXNzKSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBncmFwaCBmcm9tIHNlcmlhbGl6ZWQgZGF0YSBvciBhbm90aGVyIGdyYXBoJ3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtICB7R3JhcGh8U2VyaWFsaXplZEdyYXBofSBkYXRhICAgICAgLSBIeWRyYXRhdGlvbiBkYXRhLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9ICAgICAgICAgICAgICAgIFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gICAqIEByZXR1cm4ge0NsYXNzfVxuICAgKi9cbiAgQ2xhc3MuZnJvbSA9IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7XG4gICAgLy8gTWVyZ2luZyBnaXZlbiBvcHRpb25zIHdpdGggc2VyaWFsaXplZCBvbmVzXG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt9LCBkYXRhLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xhc3MoZmluYWxPcHRpb25zKTtcbiAgICBpbnN0YW5jZS5pbXBvcnQoZGF0YSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5cbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoR3JhcGgpO1xuYXR0YWNoU3RhdGljRnJvbU1ldGhvZChEaXJlY3RlZEdyYXBoKTtcbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoVW5kaXJlY3RlZEdyYXBoKTtcbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoTXVsdGlHcmFwaCk7XG5hdHRhY2hTdGF0aWNGcm9tTWV0aG9kKE11bHRpRGlyZWN0ZWRHcmFwaCk7XG5hdHRhY2hTdGF0aWNGcm9tTWV0aG9kKE11bHRpVW5kaXJlY3RlZEdyYXBoKTtcblxuR3JhcGguR3JhcGggPSBHcmFwaDtcbkdyYXBoLkRpcmVjdGVkR3JhcGggPSBEaXJlY3RlZEdyYXBoO1xuR3JhcGguVW5kaXJlY3RlZEdyYXBoID0gVW5kaXJlY3RlZEdyYXBoO1xuR3JhcGguTXVsdGlHcmFwaCA9IE11bHRpR3JhcGg7XG5HcmFwaC5NdWx0aURpcmVjdGVkR3JhcGggPSBNdWx0aURpcmVjdGVkR3JhcGg7XG5HcmFwaC5NdWx0aVVuZGlyZWN0ZWRHcmFwaCA9IE11bHRpVW5kaXJlY3RlZEdyYXBoO1xuXG5HcmFwaC5JbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvciA9IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yO1xuR3JhcGguTm90Rm91bmRHcmFwaEVycm9yID0gTm90Rm91bmRHcmFwaEVycm9yO1xuR3JhcGguVXNhZ2VHcmFwaEVycm9yID0gVXNhZ2VHcmFwaEVycm9yO1xuXG5leHBvcnQge1xuICBHcmFwaCxcbiAgRGlyZWN0ZWRHcmFwaCxcbiAgVW5kaXJlY3RlZEdyYXBoLFxuICBNdWx0aUdyYXBoLFxuICBNdWx0aURpcmVjdGVkR3JhcGgsXG4gIE11bHRpVW5kaXJlY3RlZEdyYXBoXG59O1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBpc0dyYXBoXG4gKiA9PT09PT09PT09PT09PT09PT09XG4gKlxuICogVmVyeSBzaW1wbGUgZnVuY3Rpb24gYWltaW5nIGF0IGVuc3VyaW5nIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhXG4gKiBncmFwaG9sb2d5IGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQ2hlY2tpbmcgdGhlIHZhbHVlIGlzIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9ICAgICB2YWx1ZSAtIFRhcmdldCB2YWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNHcmFwaCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB2YWx1ZS5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUuZHJvcE5vZGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUubXVsdGkgPT09ICdib29sZWFuJ1xuICApO1xufTtcbiIsICJleHBvcnRzLkFSUkFZX0JVRkZFUl9TVVBQT1JUID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJztcbmV4cG9ydHMuU1lNQk9MX1NVUFBPUlQgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIEZvckVhY2ggRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gZWFzaWx5IGl0ZXJhdGUgb3ZlciBtaXhlZCB2YWx1ZXMuXG4gKi9cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0LmpzJyk7XG5cbnZhciBBUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHN1cHBvcnQuQVJSQVlfQlVGRkVSX1NVUFBPUlQ7XG52YXIgU1lNQk9MX1NVUFBPUlQgPSBzdXBwb3J0LlNZTUJPTF9TVVBQT1JUO1xuXG4vKipcbiAqIEZ1bmN0aW9uIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGFsbW9zdCBhbnkgaXRlcmFibGUgSlMgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICAgIGl0ZXJhYmxlIC0gSXRlcmFibGUgdmFsdWUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JFYWNoKGl0ZXJhYmxlLCBjYWxsYmFjaykge1xuICB2YXIgaXRlcmF0b3IsIGssIGksIGwsIHM7XG5cbiAgaWYgKCFpdGVyYWJsZSkgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9mb3JFYWNoOiBpbnZhbGlkIGl0ZXJhYmxlLicpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9mb3JFYWNoOiBleHBlY3RpbmcgYSBjYWxsYmFjay4nKTtcblxuICAvLyBUaGUgdGFyZ2V0IGlzIGFuIGFycmF5IG9yIGEgc3RyaW5nIG9yIGZ1bmN0aW9uIGFyZ3VtZW50c1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShpdGVyYWJsZSkgfHxcbiAgICAoQVJSQVlfQlVGRkVSX1NVUFBPUlQgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGl0ZXJhYmxlKSkgfHxcbiAgICB0eXBlb2YgaXRlcmFibGUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXRlcmFibGUudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSdcbiAgKSB7XG4gICAgZm9yIChpID0gMCwgbCA9IGl0ZXJhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgY2FsbGJhY2soaXRlcmFibGVbaV0sIGkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgaGFzIGEgIy5mb3JFYWNoIG1ldGhvZFxuICBpZiAodHlwZW9mIGl0ZXJhYmxlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICBpdGVyYWJsZS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgdGFyZ2V0IGlzIGl0ZXJhYmxlXG4gIGlmIChcbiAgICBTWU1CT0xfU1VQUE9SVCAmJlxuICAgIFN5bWJvbC5pdGVyYXRvciBpbiBpdGVyYWJsZSAmJlxuICAgIHR5cGVvZiBpdGVyYWJsZS5uZXh0ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIGl0ZXJhYmxlID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBpcyBhbiBpdGVyYXRvclxuICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKCgocyA9IGl0ZXJhdG9yLm5leHQoKSksIHMuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGNhbGxiYWNrKHMudmFsdWUsIGkpO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgaXMgYSBwbGFpbiBvYmplY3RcbiAgZm9yIChrIGluIGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICBjYWxsYmFjayhpdGVyYWJsZVtrXSwgayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufTtcbiIsICIvKipcbiAqIE1uZW1vbmlzdCBUeXBlZCBBcnJheSBIZWxwZXJzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBNaXNjZWxsYW5lb3VzIGhlbHBlcnMgcmVsYXRlZCB0byB0eXBlZCBhcnJheXMuXG4gKi9cblxuLyoqXG4gKiBXaGVuIHVzaW5nIGFuIHVuc2lnbmVkIGludGVnZXIgYXJyYXkgdG8gc3RvcmUgcG9pbnRlcnMsIG9uZSBtaWdodCB3YW50IHRvXG4gKiBjaG9vc2UgdGhlIG9wdGltYWwgd29yZCBzaXplIGluIHJlZ2FyZHMgdG8gdGhlIGFjdHVhbCBudW1iZXJzIG9mIHBvaW50ZXJzXG4gKiB0byBzdG9yZS5cbiAqXG4gKiBUaGlzIGhlbHBlcnMgZG9lcyBqdXN0IHRoYXQuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSBzaXplIC0gRXhwZWN0ZWQgc2l6ZSBvZiB0aGUgYXJyYXkgdG8gbWFwLlxuICogQHJldHVybiB7VHlwZWRBcnJheX1cbiAqL1xudmFyIE1BWF84QklUX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA4KSAtIDEsXG4gICAgTUFYXzE2QklUX0lOVEVHRVIgPSBNYXRoLnBvdygyLCAxNikgLSAxLFxuICAgIE1BWF8zMkJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgMzIpIC0gMTtcblxudmFyIE1BWF9TSUdORURfOEJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgNykgLSAxLFxuICAgIE1BWF9TSUdORURfMTZCSVRfSU5URUdFUiA9IE1hdGgucG93KDIsIDE1KSAtIDEsXG4gICAgTUFYX1NJR05FRF8zMkJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgMzEpIC0gMTtcblxuZXhwb3J0cy5nZXRQb2ludGVyQXJyYXkgPSBmdW5jdGlvbihzaXplKSB7XG4gIHZhciBtYXhJbmRleCA9IHNpemUgLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfOEJJVF9JTlRFR0VSKVxuICAgIHJldHVybiBVaW50OEFycmF5O1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfMTZCSVRfSU5URUdFUilcbiAgICByZXR1cm4gVWludDE2QXJyYXk7XG5cbiAgaWYgKG1heEluZGV4IDw9IE1BWF8zMkJJVF9JTlRFR0VSKVxuICAgIHJldHVybiBVaW50MzJBcnJheTtcblxuICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdDogUG9pbnRlciBBcnJheSBvZiBzaXplID4gNDI5NDk2NzI5NSBpcyBub3Qgc3VwcG9ydGVkLicpO1xufTtcblxuZXhwb3J0cy5nZXRTaWduZWRQb2ludGVyQXJyYXkgPSBmdW5jdGlvbihzaXplKSB7XG4gIHZhciBtYXhJbmRleCA9IHNpemUgLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfU0lHTkVEXzhCSVRfSU5URUdFUilcbiAgICByZXR1cm4gSW50OEFycmF5O1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfU0lHTkVEXzE2QklUX0lOVEVHRVIpXG4gICAgcmV0dXJuIEludDE2QXJyYXk7XG5cbiAgaWYgKG1heEluZGV4IDw9IE1BWF9TSUdORURfMzJCSVRfSU5URUdFUilcbiAgICByZXR1cm4gSW50MzJBcnJheTtcblxuICByZXR1cm4gRmxvYXQ2NEFycmF5O1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIG1pbmltYWwgdHlwZSBhYmxlIHRvIHJlcHJlc2VudCB0aGUgZ2l2ZW4gbnVtYmVyLlxuICpcbiAqIEBwYXJhbSAge251bWJlcn0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7VHlwZWRBcnJheUNsYXNzfVxuICovXG5leHBvcnRzLmdldE51bWJlclR5cGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXG4gIC8vIDw9IDMyIGJpdHMgaXRudGVnZXI/XG4gIGlmICh2YWx1ZSA9PT0gKHZhbHVlIHwgMCkpIHtcblxuICAgIC8vIE5lZ2F0aXZlXG4gICAgaWYgKE1hdGguc2lnbih2YWx1ZSkgPT09IC0xKSB7XG4gICAgICBpZiAodmFsdWUgPD0gMTI3ICYmIHZhbHVlID49IC0xMjgpXG4gICAgICAgIHJldHVybiBJbnQ4QXJyYXk7XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAzMjc2NyAmJiB2YWx1ZSA+PSAtMzI3NjgpXG4gICAgICAgIHJldHVybiBJbnQxNkFycmF5O1xuXG4gICAgICByZXR1cm4gSW50MzJBcnJheTtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAyNTUpXG4gICAgICAgIHJldHVybiBVaW50OEFycmF5O1xuXG4gICAgICBpZiAodmFsdWUgPD0gNjU1MzUpXG4gICAgICAgIHJldHVybiBVaW50MTZBcnJheTtcblxuICAgICAgcmV0dXJuIFVpbnQzMkFycmF5O1xuICAgIH1cbiAgfVxuXG4gIC8vIDUzIGJpdHMgaW50ZWdlciAmIGZsb2F0c1xuICAvLyBOT1RFOiBpdCdzIGtpbmRhIGhhcmQgdG8gdGVsbCB3aGV0aGVyIHdlIGNvdWxkIHVzZSAzMmJpdHMgb3Igbm90Li4uXG4gIHJldHVybiBGbG9hdDY0QXJyYXk7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyB0aGUgbWluaW1hbCB0eXBlIGFibGUgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBhcnJheVxuICogb2YgSmF2YVNjcmlwdCBudW1iZXJzLlxuICpcbiAqIEBwYXJhbSAge2FycmF5fSAgICBhcnJheSAgLSBBcnJheSB0byByZXByZXNlbnQuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gZ2V0dGVyIC0gT3B0aW9uYWwgZ2V0dGVyLlxuICogQHJldHVybiB7VHlwZWRBcnJheUNsYXNzfVxuICovXG52YXIgVFlQRV9QUklPUklUWSA9IHtcbiAgVWludDhBcnJheTogMSxcbiAgSW50OEFycmF5OiAyLFxuICBVaW50MTZBcnJheTogMyxcbiAgSW50MTZBcnJheTogNCxcbiAgVWludDMyQXJyYXk6IDUsXG4gIEludDMyQXJyYXk6IDYsXG4gIEZsb2F0MzJBcnJheTogNyxcbiAgRmxvYXQ2NEFycmF5OiA4XG59O1xuXG4vLyBUT0RPOiBtYWtlIHRoaXMgYSBvbmUtc2hvdCBmb3Igb25lIHZhbHVlXG5leHBvcnRzLmdldE1pbmltYWxSZXByZXNlbnRhdGlvbiA9IGZ1bmN0aW9uKGFycmF5LCBnZXR0ZXIpIHtcbiAgdmFyIG1heFR5cGUgPSBudWxsLFxuICAgICAgbWF4UHJpb3JpdHkgPSAwLFxuICAgICAgcCxcbiAgICAgIHQsXG4gICAgICB2LFxuICAgICAgaSxcbiAgICAgIGw7XG5cbiAgZm9yIChpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHYgPSBnZXR0ZXIgPyBnZXR0ZXIoYXJyYXlbaV0pIDogYXJyYXlbaV07XG4gICAgdCA9IGV4cG9ydHMuZ2V0TnVtYmVyVHlwZSh2KTtcbiAgICBwID0gVFlQRV9QUklPUklUWVt0Lm5hbWVdO1xuXG4gICAgaWYgKHAgPiBtYXhQcmlvcml0eSkge1xuICAgICAgbWF4UHJpb3JpdHkgPSBwO1xuICAgICAgbWF4VHlwZSA9IHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heFR5cGU7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0cy5pc1R5cGVkQXJyYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGNvbmNhdCBieXRlIGFycmF5cy5cbiAqXG4gKiBAcGFyYW0gIHsuLi5CeXRlQXJyYXl9XG4gKiBAcmV0dXJuIHtCeXRlQXJyYXl9XG4gKi9cbmV4cG9ydHMuY29uY2F0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsZW5ndGggPSAwLFxuICAgICAgaSxcbiAgICAgIG8sXG4gICAgICBsO1xuXG4gIGZvciAoaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgIGxlbmd0aCArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuXG4gIHZhciBhcnJheSA9IG5ldyAoYXJndW1lbnRzWzBdLmNvbnN0cnVjdG9yKShsZW5ndGgpO1xuXG4gIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgYXJyYXkuc2V0KGFyZ3VtZW50c1tpXSwgbyk7XG4gICAgbyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgYSBieXRlIGFycmF5IG9mIGluZGljZXMuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSAgICBsZW5ndGggLSBMZW5ndGggb2YgdGFyZ2V0LlxuICogQHJldHVybiB7Qnl0ZUFycmF5fVxuICovXG5leHBvcnRzLmluZGljZXMgPSBmdW5jdGlvbihsZW5ndGgpIHtcbiAgdmFyIFBvaW50ZXJBcnJheSA9IGV4cG9ydHMuZ2V0UG9pbnRlckFycmF5KGxlbmd0aCk7XG5cbiAgdmFyIGFycmF5ID0gbmV3IFBvaW50ZXJBcnJheShsZW5ndGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAgYXJyYXlbaV0gPSBpO1xuXG4gIHJldHVybiBhcnJheTtcbn07XG4iLCAiLyoqXG4gKiBNbmVtb25pc3QgSXRlcmFibGUgRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBIYXJtb25pemVkIGl0ZXJhdGlvbiBoZWxwZXJzIG92ZXIgbWl4ZWQgaXRlcmFibGUgdGFyZ2V0cy5cbiAqL1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCdvYmxpdGVyYXRvci9mb3JlYWNoJyk7XG5cbnZhciB0eXBlZCA9IHJlcXVpcmUoJy4vdHlwZWQtYXJyYXlzLmpzJyk7XG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IHN1cHBvcnRzIGFycmF5LWxpa2VcbiAqIHJhbmRvbSBhY2Nlc3MuXG4gKlxuICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodGFyZ2V0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgfHwgdHlwZWQuaXNUeXBlZEFycmF5KHRhcmdldCk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCB0byBndWVzcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3R1cmUgb3ZlciB3aGljaCB3ZSBhcmUgZ29pbmdcbiAqIHRvIGl0ZXJhdGUuXG4gKlxuICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7bnVtYmVyfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ3Vlc3NMZW5ndGgodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgdGFyZ2V0Lmxlbmd0aCA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIHRhcmdldC5sZW5ndGg7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQuc2l6ZSA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIHRhcmdldC5zaXplO1xuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGNvbnZlcnQgYW4gaXRlcmFibGUgdG8gYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIEl0ZXJhdGlvbiB0YXJnZXQuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSh0YXJnZXQpIHtcbiAgdmFyIGwgPSBndWVzc0xlbmd0aCh0YXJnZXQpO1xuXG4gIHZhciBhcnJheSA9IHR5cGVvZiBsID09PSAnbnVtYmVyJyA/IG5ldyBBcnJheShsKSA6IFtdO1xuXG4gIHZhciBpID0gMDtcblxuICAvLyBUT0RPOiB3ZSBjb3VsZCBvcHRpbWl6ZSB3aGVuIGdpdmVuIHRhcmdldCBpcyBhcnJheSBsaWtlXG4gIGZvckVhY2godGFyZ2V0LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGFycmF5W2krK10gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFNhbWUgYXMgYWJvdmUgYnV0IHJldHVybnMgYSBzdXBwbGVtZW50YXJ5IGluZGljZXMgYXJyYXkuXG4gKlxuICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIEl0ZXJhdGlvbiB0YXJnZXQuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheVdpdGhJbmRpY2VzKHRhcmdldCkge1xuICB2YXIgbCA9IGd1ZXNzTGVuZ3RoKHRhcmdldCk7XG5cbiAgdmFyIEluZGV4QXJyYXkgPSB0eXBlb2YgbCA9PT0gJ251bWJlcicgP1xuICAgIHR5cGVkLmdldFBvaW50ZXJBcnJheShsKSA6XG4gICAgQXJyYXk7XG5cbiAgdmFyIGFycmF5ID0gdHlwZW9mIGwgPT09ICdudW1iZXInID8gbmV3IEFycmF5KGwpIDogW107XG4gIHZhciBpbmRpY2VzID0gdHlwZW9mIGwgPT09ICdudW1iZXInID8gbmV3IEluZGV4QXJyYXkobCkgOiBbXTtcblxuICB2YXIgaSA9IDA7XG5cbiAgLy8gVE9ETzogd2UgY291bGQgb3B0aW1pemUgd2hlbiBnaXZlbiB0YXJnZXQgaXMgYXJyYXkgbGlrZVxuICBmb3JFYWNoKHRhcmdldCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBhcnJheVtpXSA9IHZhbHVlO1xuICAgIGluZGljZXNbaV0gPSBpKys7XG4gIH0pO1xuXG4gIHJldHVybiBbYXJyYXksIGluZGljZXNdO1xufVxuXG4vKipcbiAqIEV4cG9ydGluZy5cbiAqL1xuZXhwb3J0cy5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuZXhwb3J0cy5ndWVzc0xlbmd0aCA9IGd1ZXNzTGVuZ3RoO1xuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcbmV4cG9ydHMudG9BcnJheVdpdGhJbmRpY2VzID0gdG9BcnJheVdpdGhJbmRpY2VzO1xuIiwgIi8qKlxuICogT2JsaXRlcmF0b3IgSXRlcmF0b3IgQ2xhc3NcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIFNpbXBsZSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkncyBpdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRvciBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG5leHQgLSBOZXh0IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBJdGVyYXRvcihuZXh0KSB7XG4gIGlmICh0eXBlb2YgbmV4dCAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29ibGl0ZXJhdG9yL2l0ZXJhdG9yOiBleHBlY3RpbmcgYSBmdW5jdGlvbiEnKTtcblxuICB0aGlzLm5leHQgPSBuZXh0O1xufVxuXG4vKipcbiAqIElmIHN5bWJvbHMgYXJlIHN1cHBvcnRlZCwgd2UgYWRkIGBuZXh0YCB0byBgU3ltYm9sLml0ZXJhdG9yYC5cbiAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKVxuICBJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gaXRlcmF0b3Igb2YgdGhlIGdpdmVuIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gIHthbnkuLi59IHZhbHVlcyAtIFZhbHVlcy5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5JdGVyYXRvci5vZiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgbCA9IGFyZ3MubGVuZ3RoLFxuICAgIGkgPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpID49IGwpIHJldHVybiB7ZG9uZTogdHJ1ZX07XG5cbiAgICByZXR1cm4ge2RvbmU6IGZhbHNlLCB2YWx1ZTogYXJnc1tpKytdfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybmluZyBhbiBlbXB0eSBpdGVyYXRvci5cbiAqXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuSXRlcmF0b3IuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpdGVyYXRvciA9IG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtkb25lOiB0cnVlfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZ2l2ZW4gaW5kZXhlZCBzZXF1ZW5jZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl9IHNlcXVlbmNlIC0gVGFyZ2V0IHNlcXVlbmNlLlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkl0ZXJhdG9yLmZyb21TZXF1ZW5jZSA9IGZ1bmN0aW9uIChzZXF1ZW5jZSkge1xuICB2YXIgaSA9IDAsXG4gICAgbCA9IHNlcXVlbmNlLmxlbmd0aDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IHNlcXVlbmNlW2krK119O1xuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGl0ZXJhdG9yLlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbkl0ZXJhdG9yLmlzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEl0ZXJhdG9yKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5uZXh0ID09PSAnZnVuY3Rpb24nXG4gICk7XG59O1xuXG4vKipcbiAqIEV4cG9ydGluZy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBJdGVyYXRvcjtcbiIsICIvKipcbiAqIE1uZW1vbmlzdCBGaXhlZERlcXVlXG4gKiA9PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBGaXhlZCBjYXBhY2l0eSBkb3VibGUtZW5kZWQgcXVldWUgaW1wbGVtZW50ZWQgYXMgcmluZyBkZXF1ZS5cbiAqL1xudmFyIGl0ZXJhYmxlcyA9IHJlcXVpcmUoJy4vdXRpbHMvaXRlcmFibGVzLmpzJyksXG4gICAgSXRlcmF0b3IgPSByZXF1aXJlKCdvYmxpdGVyYXRvci9pdGVyYXRvcicpO1xuXG4vKipcbiAqIEZpeGVkRGVxdWUuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEZpeGVkRGVxdWUoQXJyYXlDbGFzcywgY2FwYWNpdHkpIHtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdtbmVtb25pc3QvZml4ZWQtZGVxdWU6IGV4cGVjdGluZyBhbiBBcnJheSBjbGFzcyBhbmQgYSBjYXBhY2l0eS4nKTtcblxuICBpZiAodHlwZW9mIGNhcGFjaXR5ICE9PSAnbnVtYmVyJyB8fCBjYXBhY2l0eSA8PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignbW5lbW9uaXN0L2ZpeGVkLWRlcXVlOiBgY2FwYWNpdHlgIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlci4nKTtcblxuICB0aGlzLkFycmF5Q2xhc3MgPSBBcnJheUNsYXNzO1xuICB0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7XG4gIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXlDbGFzcyh0aGlzLmNhcGFjaXR5KTtcbiAgdGhpcy5jbGVhcigpO1xufVxuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGNsZWFyIHRoZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHJldHVybiB7dW5kZWZpbmVkfVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIFByb3BlcnRpZXNcbiAgdGhpcy5zdGFydCA9IDA7XG4gIHRoaXMuc2l6ZSA9IDA7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGFwcGVuZCBhIHZhbHVlIHRvIHRoZSBkZXF1ZS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9ICAgIGl0ZW0gLSBJdGVtIHRvIGFwcGVuZC5cbiAqIEByZXR1cm4ge251bWJlcn0gICAgICAtIFJldHVybnMgdGhlIG5ldyBzaXplIG9mIHRoZSBkZXF1ZS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgaWYgKHRoaXMuc2l6ZSA9PT0gdGhpcy5jYXBhY2l0eSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZS5wdXNoOiBkZXF1ZSBjYXBhY2l0eSAoJyArIHRoaXMuY2FwYWNpdHkgKyAnKSBleGNlZWRlZCEnKTtcblxuICB2YXIgaW5kZXggPSAodGhpcy5zdGFydCArIHRoaXMuc2l6ZSkgJSB0aGlzLmNhcGFjaXR5O1xuXG4gIHRoaXMuaXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICByZXR1cm4gKyt0aGlzLnNpemU7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIHByZXBlbmQgYSB2YWx1ZSB0byB0aGUgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBpdGVtIC0gSXRlbSB0byBwcmVwZW5kLlxuICogQHJldHVybiB7bnVtYmVyfSAgICAgIC0gUmV0dXJucyB0aGUgbmV3IHNpemUgb2YgdGhlIGRlcXVlLlxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oaXRlbSkge1xuICBpZiAodGhpcy5zaXplID09PSB0aGlzLmNhcGFjaXR5KVxuICAgIHRocm93IG5ldyBFcnJvcignbW5lbW9uaXN0L2ZpeGVkLWRlcXVlLnVuc2hpZnQ6IGRlcXVlIGNhcGFjaXR5ICgnICsgdGhpcy5jYXBhY2l0eSArICcpIGV4Y2VlZGVkIScpO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuc3RhcnQgLSAxO1xuXG4gIGlmICh0aGlzLnN0YXJ0ID09PSAwKVxuICAgIGluZGV4ID0gdGhpcy5jYXBhY2l0eSAtIDE7XG5cbiAgdGhpcy5pdGVtc1tpbmRleF0gPSBpdGVtO1xuICB0aGlzLnN0YXJ0ID0gaW5kZXg7XG5cbiAgcmV0dXJuICsrdGhpcy5zaXplO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBwb3AgdGhlIGRlcXVlLlxuICpcbiAqIEByZXR1cm4ge2FueX0gLSBSZXR1cm5zIHRoZSBwb3BwZWQgaXRlbS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IGluZGV4ID0gKHRoaXMuc3RhcnQgKyB0aGlzLnNpemUgLSAxKSAlIHRoaXMuY2FwYWNpdHk7XG5cbiAgdGhpcy5zaXplLS07XG5cbiAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBzaGlmdCB0aGUgZGVxdWUuXG4gKlxuICogQHJldHVybiB7YW55fSAtIFJldHVybnMgdGhlIHNoaWZ0ZWQgaXRlbS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuc2l6ZSA9PT0gMClcbiAgICByZXR1cm47XG5cbiAgdmFyIGluZGV4ID0gdGhpcy5zdGFydDtcblxuICB0aGlzLnNpemUtLTtcbiAgdGhpcy5zdGFydCsrO1xuXG4gIGlmICh0aGlzLnN0YXJ0ID09PSB0aGlzLmNhcGFjaXR5KVxuICAgIHRoaXMuc3RhcnQgPSAwO1xuXG4gIHJldHVybiB0aGlzLml0ZW1zW2luZGV4XTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHVzZWQgdG8gcGVlayB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGRlcXVlLlxuICpcbiAqIEByZXR1cm4ge2FueX1cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucGVla0ZpcnN0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiB0aGlzLml0ZW1zW3RoaXMuc3RhcnRdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBwZWVrIHRoZSBsYXN0IHZhbHVlIG9mIHRoZSBkZXF1ZS5cbiAqXG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLnBlZWtMYXN0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuc3RhcnQgKyB0aGlzLnNpemUgLSAxO1xuXG4gIGlmIChpbmRleCA+IHRoaXMuY2FwYWNpdHkpXG4gICAgaW5kZXggLT0gdGhpcy5jYXBhY2l0eTtcblxuICByZXR1cm4gdGhpcy5pdGVtc1tpbmRleF07XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZSBvZiB0aGUgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7YW55fVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCkge1xuICBpZiAodGhpcy5zaXplID09PSAwKVxuICAgIHJldHVybjtcblxuICBpbmRleCA9IHRoaXMuc3RhcnQgKyBpbmRleDtcblxuICBpZiAoaW5kZXggPiB0aGlzLmNhcGFjaXR5KVxuICAgIGluZGV4IC09IHRoaXMuY2FwYWNpdHk7XG5cbiAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGRlcXVlLlxuICpcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGl0ZW0uXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgIHNjb3BlICAgIC0gT3B0aW9uYWwgc2NvcGUuXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgc2NvcGUpIHtcbiAgc2NvcGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNjb3BlIDogdGhpcztcblxuICB2YXIgYyA9IHRoaXMuY2FwYWNpdHksXG4gICAgICBsID0gdGhpcy5zaXplLFxuICAgICAgaSA9IHRoaXMuc3RhcnQsXG4gICAgICBqID0gMDtcblxuICB3aGlsZSAoaiA8IGwpIHtcbiAgICBjYWxsYmFjay5jYWxsKHNjb3BlLCB0aGlzLml0ZW1zW2ldLCBqLCB0aGlzKTtcbiAgICBpKys7XG4gICAgaisrO1xuXG4gICAgaWYgKGkgPT09IGMpXG4gICAgICBpID0gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjb252ZXJ0IHRoZSBkZXF1ZSB0byBhIEphdmFTY3JpcHQgYXJyYXkuXG4gKlxuICogQHJldHVybiB7YXJyYXl9XG4gKi9cbi8vIFRPRE86IG9wdGlvbmFsIGFycmF5IGNsYXNzIGFzIGFyZ3VtZW50P1xuRml4ZWREZXF1ZS5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIE9wdGltaXphdGlvblxuICB2YXIgb2Zmc2V0ID0gdGhpcy5zdGFydCArIHRoaXMuc2l6ZTtcblxuICBpZiAob2Zmc2V0IDwgdGhpcy5jYXBhY2l0eSlcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zbGljZSh0aGlzLnN0YXJ0LCBvZmZzZXQpO1xuXG4gIHZhciBhcnJheSA9IG5ldyB0aGlzLkFycmF5Q2xhc3ModGhpcy5zaXplKSxcbiAgICAgIGMgPSB0aGlzLmNhcGFjaXR5LFxuICAgICAgbCA9IHRoaXMuc2l6ZSxcbiAgICAgIGkgPSB0aGlzLnN0YXJ0LFxuICAgICAgaiA9IDA7XG5cbiAgd2hpbGUgKGogPCBsKSB7XG4gICAgYXJyYXlbal0gPSB0aGlzLml0ZW1zW2ldO1xuICAgIGkrKztcbiAgICBqKys7XG5cbiAgICBpZiAoaSA9PT0gYylcbiAgICAgIGkgPSAwO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUncyB2YWx1ZXMuXG4gKlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zLFxuICAgICAgYyA9IHRoaXMuY2FwYWNpdHksXG4gICAgICBsID0gdGhpcy5zaXplLFxuICAgICAgaSA9IHRoaXMuc3RhcnQsXG4gICAgICBqID0gMDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgIGlmIChqID49IGwpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuXG4gICAgdmFyIHZhbHVlID0gaXRlbXNbaV07XG5cbiAgICBpKys7XG4gICAgaisrO1xuXG4gICAgaWYgKGkgPT09IGMpXG4gICAgICBpID0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUncyBlbnRyaWVzLlxuICpcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuaXRlbXMsXG4gICAgICBjID0gdGhpcy5jYXBhY2l0eSxcbiAgICAgIGwgPSB0aGlzLnNpemUsXG4gICAgICBpID0gdGhpcy5zdGFydCxcbiAgICAgIGogPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSB7XG4gICAgaWYgKGogPj0gbClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG5cbiAgICB2YXIgdmFsdWUgPSBpdGVtc1tpXTtcblxuICAgIGkrKztcblxuICAgIGlmIChpID09PSBjKVxuICAgICAgaSA9IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IFtqKyssIHZhbHVlXSxcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEF0dGFjaGluZyB0aGUgIy52YWx1ZXMgbWV0aG9kIHRvIFN5bWJvbC5pdGVyYXRvciBpZiBwb3NzaWJsZS5cbiAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKVxuICBGaXhlZERlcXVlLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gRml4ZWREZXF1ZS5wcm90b3R5cGUudmFsdWVzO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGtub3duIG1ldGhvZHMuXG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFycmF5ID0gdGhpcy50b0FycmF5KCk7XG5cbiAgYXJyYXkudHlwZSA9IHRoaXMuQXJyYXlDbGFzcy5uYW1lO1xuICBhcnJheS5jYXBhY2l0eSA9IHRoaXMuY2FwYWNpdHk7XG5cbiAgLy8gVHJpY2sgc28gdGhhdCBub2RlIGRpc3BsYXlzIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksICdjb25zdHJ1Y3RvcicsIHtcbiAgICB2YWx1ZTogRml4ZWREZXF1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gYXJyYXk7XG59O1xuXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpXG4gIEZpeGVkRGVxdWUucHJvdG90eXBlW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldID0gRml4ZWREZXF1ZS5wcm90b3R5cGUuaW5zcGVjdDtcblxuLyoqXG4gKiBTdGF0aWMgQC5mcm9tIGZ1bmN0aW9uIHRha2luZyBhbiBhcmJpdHJhcnkgaXRlcmFibGUgJiBjb252ZXJ0aW5nIGl0IGludG9cbiAqIGEgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7SXRlcmFibGV9IGl0ZXJhYmxlICAgLSBUYXJnZXQgaXRlcmFibGUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gQXJyYXlDbGFzcyAtIEFycmF5IGNsYXNzIHRvIHVzZS5cbiAqIEBwYXJhbSAge251bWJlcn0gICBjYXBhY2l0eSAgIC0gRGVzaXJlZCBjYXBhY2l0eS5cbiAqIEByZXR1cm4ge0Zpbml0ZVN0YWNrfVxuICovXG5GaXhlZERlcXVlLmZyb20gPSBmdW5jdGlvbihpdGVyYWJsZSwgQXJyYXlDbGFzcywgY2FwYWNpdHkpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgY2FwYWNpdHkgPSBpdGVyYWJsZXMuZ3Vlc3NMZW5ndGgoaXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBjYXBhY2l0eSAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZS5mcm9tOiBjb3VsZCBub3QgZ3Vlc3MgaXRlcmFibGUgbGVuZ3RoLiBQbGVhc2UgcHJvdmlkZSBkZXNpcmVkIGNhcGFjaXR5IGFzIGxhc3QgYXJndW1lbnQuJyk7XG4gIH1cblxuICB2YXIgZGVxdWUgPSBuZXcgRml4ZWREZXF1ZShBcnJheUNsYXNzLCBjYXBhY2l0eSk7XG5cbiAgaWYgKGl0ZXJhYmxlcy5pc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGZvciAoaSA9IDAsIGwgPSBpdGVyYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICBkZXF1ZS5pdGVtc1tpXSA9IGl0ZXJhYmxlW2ldO1xuXG4gICAgZGVxdWUuc2l6ZSA9IGw7XG5cbiAgICByZXR1cm4gZGVxdWU7XG4gIH1cblxuICBpdGVyYWJsZXMuZm9yRWFjaChpdGVyYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBkZXF1ZS5wdXNoKHZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRlcXVlO1xufTtcblxuLyoqXG4gKiBFeHBvcnRpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gRml4ZWREZXF1ZTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIFV0aWxzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBNaXNjZWxsYW5lb3VzIHV0aWxzIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeS5cbiAqL1xuXG5mdW5jdGlvbiBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgYXR0ciwgZGVwdGgpIHtcbiAgdGhpcy5ub2RlID0gbm9kZTtcbiAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cjtcbiAgdGhpcy5kZXB0aCA9IGRlcHRoO1xufVxuXG5leHBvcnRzLlRyYXZlcnNhbFJlY29yZCA9IFRyYXZlcnNhbFJlY29yZDtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIEJGU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEJyZWFkdGgtRmlyc3QgU2VhcmNoIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xudmFyIGlzR3JhcGggPSByZXF1aXJlKCdncmFwaG9sb2d5LXV0aWxzL2lzLWdyYXBoJyk7XG52YXIgRml4ZWREZXF1ZSA9IHJlcXVpcmUoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZScpO1xudmFyIFRyYXZlcnNhbFJlY29yZCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5UcmF2ZXJzYWxSZWNvcmQ7XG5cbi8qKlxuICogQkZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGggdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGJmcyhncmFwaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2JmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvYmZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBzZWVuID0gbmV3IFNldCgpO1xuICB2YXIgcXVldWUgPSBuZXcgRml4ZWREZXF1ZShBcnJheSwgZ3JhcGgub3JkZXIpO1xuICB2YXIgcmVjb3JkLCBkZXB0aDtcblxuICBmdW5jdGlvbiBuZWlnaGJvckNhbGxiYWNrKG5laWdoYm9yLCBhdHRyKSB7XG4gICAgaWYgKHNlZW4uaGFzKG5laWdoYm9yKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5laWdoYm9yKTtcbiAgICBxdWV1ZS5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobmVpZ2hib3IsIGF0dHIsIGRlcHRoICsgMSkpO1xuICB9XG5cbiAgZ3JhcGguZm9yRWFjaE5vZGUoZnVuY3Rpb24obm9kZSwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhub2RlKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5vZGUpO1xuICAgIHF1ZXVlLnB1c2gobmV3IFRyYXZlcnNhbFJlY29yZChub2RlLCBhdHRyLCAwKSk7XG5cbiAgICB3aGlsZSAocXVldWUuc2l6ZSAhPT0gMCkge1xuICAgICAgcmVjb3JkID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGRlcHRoID0gcmVjb3JkLmRlcHRoO1xuXG4gICAgICBjYWxsYmFjayhyZWNvcmQubm9kZSwgcmVjb3JkLmF0dHJpYnV0ZXMsIGRlcHRoKTtcblxuICAgICAgZ3JhcGguZm9yRWFjaE91dGJvdW5kTmVpZ2hib3IocmVjb3JkLm5vZGUsIG5laWdoYm9yQ2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQkZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGgsIHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIG5vZGUsIHVzaW5nIGFcbiAqIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbm9kZSAgICAgLSBTdGFydGluZyBub2RlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGJmc0Zyb21Ob2RlKGdyYXBoLCBub2RlLCBjYWxsYmFjaykge1xuICBpZiAoIWlzR3JhcGgoZ3JhcGgpKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBleHBlY3RpbmcgYSBncmFwaG9sb2d5IGluc3RhbmNlLicpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdncmFwaG9sb2d5LXRyYXZlcnNhbC9kZnM6IGdpdmVuIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uLicpO1xuXG4gIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gIGlmIChncmFwaC5vcmRlciA9PT0gMClcbiAgICByZXR1cm47XG5cbiAgbm9kZSA9ICcnICsgbm9kZTtcblxuICB2YXIgc2VlbiA9IG5ldyBTZXQoKTtcbiAgdmFyIHF1ZXVlID0gbmV3IEZpeGVkRGVxdWUoQXJyYXksIGdyYXBoLm9yZGVyKTtcbiAgdmFyIGRlcHRoLCByZWNvcmQ7XG5cbiAgZnVuY3Rpb24gbmVpZ2hib3JDYWxsYmFjayhuZWlnaGJvciwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhuZWlnaGJvcikpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChuZWlnaGJvcik7XG4gICAgcXVldWUucHVzaChuZXcgVHJhdmVyc2FsUmVjb3JkKG5laWdoYm9yLCBhdHRyLCBkZXB0aCArIDEpKTtcbiAgfVxuXG4gIHNlZW4uYWRkKG5vZGUpO1xuICBxdWV1ZS5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgZ3JhcGguZ2V0Tm9kZUF0dHJpYnV0ZXMobm9kZSksIDApKTtcblxuICB3aGlsZSAocXVldWUuc2l6ZSAhPT0gMCkge1xuICAgIHJlY29yZCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgZGVwdGggPSByZWNvcmQuZGVwdGg7XG5cbiAgICBjYWxsYmFjayhyZWNvcmQubm9kZSwgcmVjb3JkLmF0dHJpYnV0ZXMsIGRlcHRoKTtcblxuICAgIGdyYXBoLmZvckVhY2hPdXRib3VuZE5laWdoYm9yKHJlY29yZC5ub2RlLCBuZWlnaGJvckNhbGxiYWNrKTtcbiAgfVxufVxuXG5leHBvcnRzLmJmcyA9IGJmcztcbmV4cG9ydHMuYmZzRnJvbU5vZGUgPSBiZnNGcm9tTm9kZTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIERGU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIERlcHRoLUZpcnN0IFNlYXJjaCB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gKi9cbnZhciBpc0dyYXBoID0gcmVxdWlyZSgnZ3JhcGhvbG9neS11dGlscy9pcy1ncmFwaCcpO1xudmFyIFRyYXZlcnNhbFJlY29yZCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5UcmF2ZXJzYWxSZWNvcmQ7XG5cbi8qKlxuICogREZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGggdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGRmcyhncmFwaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2RmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBzZWVuID0gbmV3IFNldCgpO1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIGRlcHRoLCByZWNvcmQ7XG5cbiAgZnVuY3Rpb24gbmVpZ2hib3JDYWxsYmFjayhuZWlnaGJvciwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhuZWlnaGJvcikpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChuZWlnaGJvcik7XG4gICAgc3RhY2sucHVzaChuZXcgVHJhdmVyc2FsUmVjb3JkKG5laWdoYm9yLCBhdHRyLCBkZXB0aCArIDEpKTtcbiAgfVxuXG4gIGdyYXBoLmZvckVhY2hOb2RlKGZ1bmN0aW9uKG5vZGUsIGF0dHIpIHtcbiAgICBpZiAoc2Vlbi5oYXMobm9kZSkpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICBzdGFjay5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgYXR0ciwgMCkpO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmVjb3JkID0gc3RhY2sucG9wKCk7XG4gICAgICBkZXB0aCA9IHJlY29yZC5kZXB0aDtcblxuICAgICAgY2FsbGJhY2socmVjb3JkLm5vZGUsIHJlY29yZC5hdHRyaWJ1dGVzLCBkZXB0aCk7XG5cbiAgICAgIGdyYXBoLmZvckVhY2hPdXRib3VuZE5laWdoYm9yKHJlY29yZC5ub2RlLCBuZWlnaGJvckNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIERGUyB0cmF2ZXJzYWwgaW4gdGhlIGdpdmVuIGdyYXBoLCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlLCB1c2luZyBhXG4gKiBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSAgICBncmFwaCAgICAtIFRhcmdldCBncmFwaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG5vZGUgICAgIC0gU3RhcnRpbmcgbm9kZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gSXRlcmF0aW9uIGNhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBkZnNGcm9tTm9kZShncmFwaCwgbm9kZSwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2RmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgdmFyIHNlZW4gPSBuZXcgU2V0KCk7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgZGVwdGgsIHJlY29yZDtcblxuICBmdW5jdGlvbiBuZWlnaGJvckNhbGxiYWNrKG5laWdoYm9yLCBhdHRyKSB7XG4gICAgaWYgKHNlZW4uaGFzKG5laWdoYm9yKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5laWdoYm9yKTtcbiAgICBzdGFjay5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobmVpZ2hib3IsIGF0dHIsIGRlcHRoICsgMSkpO1xuICB9XG5cbiAgc2Vlbi5hZGQobm9kZSk7XG4gIHN0YWNrLnB1c2gobmV3IFRyYXZlcnNhbFJlY29yZChub2RlLCBncmFwaC5nZXROb2RlQXR0cmlidXRlcyhub2RlKSwgMCkpO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggIT09IDApIHtcbiAgICByZWNvcmQgPSBzdGFjay5wb3AoKTtcbiAgICBkZXB0aCA9IHJlY29yZC5kZXB0aDtcblxuICAgIGNhbGxiYWNrKHJlY29yZC5ub2RlLCByZWNvcmQuYXR0cmlidXRlcywgZGVwdGgpO1xuXG4gICAgZ3JhcGguZm9yRWFjaE91dGJvdW5kTmVpZ2hib3IocmVjb3JkLm5vZGUsIG5laWdoYm9yQ2FsbGJhY2spO1xuICB9XG59XG5cbmV4cG9ydHMuZGZzID0gZGZzO1xuZXhwb3J0cy5kZnNGcm9tTm9kZSA9IGRmc0Zyb21Ob2RlO1xuIiwgInZhciBiZnNNb2R1bGUgPSByZXF1aXJlKCcuL2Jmcy5qcycpO1xudmFyIGRmc01vZHVsZSA9IHJlcXVpcmUoJy4vZGZzLmpzJyk7XG5cbnZhciBrO1xuXG5mb3IgKGsgaW4gYmZzTW9kdWxlKVxuICBleHBvcnRzW2tdID0gYmZzTW9kdWxlW2tdO1xuXG5mb3IgKGsgaW4gZGZzTW9kdWxlKVxuICBleHBvcnRzW2tdID0gZGZzTW9kdWxlW2tdO1xuIiwgIi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTHV4b25FcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWREYXRlVGltZUVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbikge1xuICAgIHN1cGVyKGBJbnZhbGlkIERhdGVUaW1lOiAke3JlYXNvbi50b01lc3NhZ2UoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkSW50ZXJ2YWxFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBzdXBlcihgSW52YWxpZCBJbnRlcnZhbDogJHtyZWFzb24udG9NZXNzYWdlKCl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZER1cmF0aW9uRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhc29uKSB7XG4gICAgc3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7cmVhc29uLnRvTWVzc2FnZSgpfWApO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7fVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVW5pdEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHVuaXQpIHtcbiAgICBzdXBlcihgSW52YWxpZCB1bml0ICR7dW5pdH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige31cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgWm9uZUlzQWJzdHJhY3RFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIik7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY29uc3QgbiA9IFwibnVtZXJpY1wiLFxuICBzID0gXCJzaG9ydFwiLFxuICBsID0gXCJsb25nXCI7XG5cbmV4cG9ydCBjb25zdCBEQVRFX1NIT1JUID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgd2Vla2RheTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IHMsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfMjRfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIGhvdXJDeWNsZTogXCJoMjNcIixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIGhvdXJDeWNsZTogXCJoMjNcIixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICB0aW1lWm9uZU5hbWU6IHMsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICB0aW1lWm9uZU5hbWU6IGwsXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IHMsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG4iLCAiLypcbiAgVGhpcyBpcyBqdXN0IGEganVuayBkcmF3ZXIsIGNvbnRhaW5pbmcgYW55dGhpbmcgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgY2xhc3Nlcy5cbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcbiAgaXQgdXAgaW50bywgc2F5LCBwYXJzaW5nVXRpbC5qcyBhbmQgYmFzaWNVdGlsLmpzIGFuZCBzbyBvbi4gQnV0IHRoZXkgYXJlIGRpdmlkZWQgdXAgYnkgZmVhdHVyZSBhcmVhLlxuKi9cblxuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG4vLyBUWVBFU1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIiAmJiBvICUgMSA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG59XG5cbi8vIENBUEFCSUxJVElFU1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVsYXRpdmUoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBJbnRsICE9PSBcInVuZGVmaW5lZFwiICYmICEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLy8gT0JKRUNUUyBBTkQgQVJSQVlTXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXliZUFycmF5KHRoaW5nKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IHRoaW5nIDogW3RoaW5nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyLnJlZHVjZSgoYmVzdCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHBhaXIgPSBbYnkobmV4dCksIG5leHRdO1xuICAgIGlmICghYmVzdCkge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfSBlbHNlIGlmIChjb21wYXJlKGJlc3RbMF0sIHBhaXJbMF0pID09PSBiZXN0WzBdKSB7XG4gICAgICByZXR1cm4gYmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfVxuICB9LCBudWxsKVsxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpY2sob2JqLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZSgoYSwgaykgPT4ge1xuICAgIGFba10gPSBvYmpba107XG4gICAgcmV0dXJuIGE7XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbi8vIE5VTUJFUlMgQU5EIFNUUklOR1NcblxuZXhwb3J0IGZ1bmN0aW9uIGludGVnZXJCZXR3ZWVuKHRoaW5nLCBib3R0b20sIHRvcCkge1xuICByZXR1cm4gaXNJbnRlZ2VyKHRoaW5nKSAmJiB0aGluZyA+PSBib3R0b20gJiYgdGhpbmcgPD0gdG9wO1xufVxuXG4vLyB4ICUgbiBidXQgdGFrZXMgdGhlIHNpZ24gb2YgbiBpbnN0ZWFkIG9mIHhcbmV4cG9ydCBmdW5jdGlvbiBmbG9vck1vZCh4LCBuKSB7XG4gIHJldHVybiB4IC0gbiAqIE1hdGguZmxvb3IoeCAvIG4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkU3RhcnQoaW5wdXQsIG4gPSAyKSB7XG4gIGNvbnN0IGlzTmVnID0gaW5wdXQgPCAwO1xuICBsZXQgcGFkZGVkO1xuICBpZiAoaXNOZWcpIHtcbiAgICBwYWRkZWQgPSBcIi1cIiArIChcIlwiICsgLWlucHV0KS5wYWRTdGFydChuLCBcIjBcIik7XG4gIH0gZWxzZSB7XG4gICAgcGFkZGVkID0gKFwiXCIgKyBpbnB1dCkucGFkU3RhcnQobiwgXCIwXCIpO1xuICB9XG4gIHJldHVybiBwYWRkZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyaW5nKSB7XG4gIGlmIChpc1VuZGVmaW5lZChzdHJpbmcpIHx8IHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmcsIDEwKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGbG9hdGluZyhzdHJpbmcpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHN0cmluZykgfHwgc3RyaW5nID09PSBudWxsIHx8IHN0cmluZyA9PT0gXCJcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyaW5nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNaWxsaXMoZnJhY3Rpb24pIHtcbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCAoaW5zdGVhZCBvZiAwKSBpbiB0aGVzZSBjYXNlcywgd2hlcmUgZnJhY3Rpb24gaXMgbm90IHNldFxuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pIHx8IGZyYWN0aW9uID09PSBudWxsIHx8IGZyYWN0aW9uID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzLCB0b3dhcmRaZXJvID0gZmFsc2UpIHtcbiAgY29uc3QgZmFjdG9yID0gMTAgKiogZGlnaXRzLFxuICAgIHJvdW5kZXIgPSB0b3dhcmRaZXJvID8gTWF0aC50cnVuYyA6IE1hdGgucm91bmQ7XG4gIHJldHVybiByb3VuZGVyKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgY29uc3QgbW9kTW9udGggPSBmbG9vck1vZChtb250aCAtIDEsIDEyKSArIDEsXG4gICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuLy8gY292ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgbG9jYWwgdGltZXN0YW1wIChlcG9jaCwgYnV0IHdpdGggdGhlIG9mZnNldCBiYWtlZCBpbilcbmV4cG9ydCBmdW5jdGlvbiBvYmpUb0xvY2FsVFMob2JqKSB7XG4gIGxldCBkID0gRGF0ZS5VVEMoXG4gICAgb2JqLnllYXIsXG4gICAgb2JqLm1vbnRoIC0gMSxcbiAgICBvYmouZGF5LFxuICAgIG9iai5ob3VyLFxuICAgIG9iai5taW51dGUsXG4gICAgb2JqLnNlY29uZCxcbiAgICBvYmoubWlsbGlzZWNvbmRcbiAgKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIoZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCk7XG4gIH1cbiAgcmV0dXJuICtkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIGNvbnN0IHAxID1cbiAgICAgICh3ZWVrWWVhciArXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICtcbiAgICAgICAgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICVcbiAgICAgIDcsXG4gICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhcikge1xuICBpZiAoeWVhciA+IDk5KSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSByZXR1cm4geWVhciA+IDYwID8gMTkwMCArIHllYXIgOiAyMDAwICsgeWVhcjtcbn1cblxuLy8gUEFSU0lOR1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Vab25lSW5mbyh0cywgb2Zmc2V0Rm9ybWF0LCBsb2NhbGUsIHRpbWVab25lID0gbnVsbCkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgIGludGxPcHRzID0ge1xuICAgICAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVkID0geyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCwgLi4uaW50bE9wdHMgfTtcblxuICBjb25zdCBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKVxuICAgIC5mb3JtYXRUb1BhcnRzKGRhdGUpXG4gICAgLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiKTtcbiAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG59XG5cbi8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cikge1xuICBsZXQgb2ZmSG91ciA9IHBhcnNlSW50KG9mZkhvdXJTdHIsIDEwKTtcblxuICAvLyBkb24ndCB8fCB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSAtMFxuICBpZiAoTnVtYmVyLmlzTmFOKG9mZkhvdXIpKSB7XG4gICAgb2ZmSG91ciA9IDA7XG4gIH1cblxuICBjb25zdCBvZmZNaW4gPSBwYXJzZUludChvZmZNaW51dGVTdHIsIDEwKSB8fCAwLFxuICAgIG9mZk1pblNpZ25lZCA9IG9mZkhvdXIgPCAwIHx8IE9iamVjdC5pcyhvZmZIb3VyLCAtMCkgPyAtb2ZmTWluIDogb2ZmTWluO1xuICByZXR1cm4gb2ZmSG91ciAqIDYwICsgb2ZmTWluU2lnbmVkO1xufVxuXG4vLyBDT0VSQ0lPTlxuXG5leHBvcnQgZnVuY3Rpb24gYXNOdW1iZXIodmFsdWUpIHtcbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgPT09IFwiXCIgfHwgTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHVuaXQgdmFsdWUgJHt2YWx1ZX1gKTtcbiAgcmV0dXJuIG51bWVyaWNWYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBmb3IgKGNvbnN0IHUgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgdSkpIHtcbiAgICAgIGNvbnN0IHYgPSBvYmpbdV07XG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVyKHUpXSA9IGFzTnVtYmVyKHYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE9mZnNldChvZmZzZXQsIGZvcm1hdCkge1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoTWF0aC5hYnMob2Zmc2V0IC8gNjApKSxcbiAgICBtaW51dGVzID0gTWF0aC50cnVuYyhNYXRoLmFicyhvZmZzZXQgJSA2MCkpLFxuICAgIHNpZ24gPSBvZmZzZXQgPj0gMCA/IFwiK1wiIDogXCItXCI7XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBgJHtzaWdufSR7cGFkU3RhcnQoaG91cnMsIDIpfToke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIGAke3NpZ259JHtob3Vyc30ke21pbnV0ZXMgPiAwID8gYDoke21pbnV0ZXN9YCA6IFwiXCJ9YDtcbiAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICByZXR1cm4gYCR7c2lnbn0ke3BhZFN0YXJ0KGhvdXJzLCAyKX0ke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtmb3JtYXR9IGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlhbmFSZWdleCA9IC9bQS1aYS16XystXXsxLDI1Nn0oOj9cXC9bQS1aYS16MC05XystXXsxLDI1Nn0oXFwvW0EtWmEtejAtOV8rLV17MSwyNTZ9KT8pPy87XG4iLCAiaW1wb3J0ICogYXMgRm9ybWF0cyBmcm9tIFwiLi9mb3JtYXRzLmpzXCI7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjb25zdCBtb250aHNMb25nID0gW1xuICBcIkphbnVhcnlcIixcbiAgXCJGZWJydWFyeVwiLFxuICBcIk1hcmNoXCIsXG4gIFwiQXByaWxcIixcbiAgXCJNYXlcIixcbiAgXCJKdW5lXCIsXG4gIFwiSnVseVwiLFxuICBcIkF1Z3VzdFwiLFxuICBcIlNlcHRlbWJlclwiLFxuICBcIk9jdG9iZXJcIixcbiAgXCJOb3ZlbWJlclwiLFxuICBcIkRlY2VtYmVyXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzU2hvcnQgPSBbXG4gIFwiSmFuXCIsXG4gIFwiRmViXCIsXG4gIFwiTWFyXCIsXG4gIFwiQXByXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuXCIsXG4gIFwiSnVsXCIsXG4gIFwiQXVnXCIsXG4gIFwiU2VwXCIsXG4gIFwiT2N0XCIsXG4gIFwiTm92XCIsXG4gIFwiRGVjXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzTmFycm93ID0gW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzTmFycm93XTtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzU2hvcnRdO1xuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gWy4uLm1vbnRoc0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNMb25nID0gW1xuICBcIk1vbmRheVwiLFxuICBcIlR1ZXNkYXlcIixcbiAgXCJXZWRuZXNkYXlcIixcbiAgXCJUaHVyc2RheVwiLFxuICBcIkZyaWRheVwiLFxuICBcIlNhdHVyZGF5XCIsXG4gIFwiU3VuZGF5XCIsXG5dO1xuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcblxuZXhwb3J0IGNvbnN0IHdlZWtkYXlzTmFycm93ID0gW1wiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCIsIFwiU1wiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ud2Vla2RheXNOYXJyb3ddO1xuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c1Nob3J0XTtcbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1lcmlkaWVtcyA9IFtcIkFNXCIsIFwiUE1cIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTG9uZyA9IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXTtcblxuZXhwb3J0IGNvbnN0IGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTmFycm93ID0gW1wiQlwiLCBcIkFcIl07XG5cbmV4cG9ydCBmdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc05hcnJvd107XG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gWy4uLmVyYXNTaG9ydF07XG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc0xvbmddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyaWRpZW1Gb3JEYXRlVGltZShkdCkge1xuICByZXR1cm4gbWVyaWRpZW1zW2R0LmhvdXIgPCAxMiA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiB3ZWVrZGF5cyhsZW5ndGgpW2R0LndlZWtkYXkgLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGVyYXMobGVuZ3RoKVtkdC55ZWFyIDwgMCA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZSh1bml0LCBjb3VudCwgbnVtZXJpYyA9IFwiYWx3YXlzXCIsIG5hcnJvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IHVuaXRzID0ge1xuICAgIHllYXJzOiBbXCJ5ZWFyXCIsIFwieXIuXCJdLFxuICAgIHF1YXJ0ZXJzOiBbXCJxdWFydGVyXCIsIFwicXRyLlwiXSxcbiAgICBtb250aHM6IFtcIm1vbnRoXCIsIFwibW8uXCJdLFxuICAgIHdlZWtzOiBbXCJ3ZWVrXCIsIFwid2suXCJdLFxuICAgIGRheXM6IFtcImRheVwiLCBcImRheVwiLCBcImRheXNcIl0sXG4gICAgaG91cnM6IFtcImhvdXJcIiwgXCJoci5cIl0sXG4gICAgbWludXRlczogW1wibWludXRlXCIsIFwibWluLlwiXSxcbiAgICBzZWNvbmRzOiBbXCJzZWNvbmRcIiwgXCJzZWMuXCJdLFxuICB9O1xuXG4gIGNvbnN0IGxhc3RhYmxlID0gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXS5pbmRleE9mKHVuaXQpID09PSAtMTtcblxuICBpZiAobnVtZXJpYyA9PT0gXCJhdXRvXCIgJiYgbGFzdGFibGUpIHtcbiAgICBjb25zdCBpc0RheSA9IHVuaXQgPT09IFwiZGF5c1wiO1xuICAgIHN3aXRjaCAoY291bnQpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b21vcnJvd1wiIDogYG5leHQgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgY2FzZSAtMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ5ZXN0ZXJkYXlcIiA6IGBsYXN0ICR7dW5pdHNbdW5pdF1bMF19YDtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b2RheVwiIDogYHRoaXMgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgZGVmYXVsdDogLy8gZmFsbCB0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNJblBhc3QgPSBPYmplY3QuaXMoY291bnQsIC0wKSB8fCBjb3VudCA8IDAsXG4gICAgZm10VmFsdWUgPSBNYXRoLmFicyhjb3VudCksXG4gICAgc2luZ3VsYXIgPSBmbXRWYWx1ZSA9PT0gMSxcbiAgICBsaWxVbml0cyA9IHVuaXRzW3VuaXRdLFxuICAgIGZtdFVuaXQgPSBuYXJyb3dcbiAgICAgID8gc2luZ3VsYXJcbiAgICAgICAgPyBsaWxVbml0c1sxXVxuICAgICAgICA6IGxpbFVuaXRzWzJdIHx8IGxpbFVuaXRzWzFdXG4gICAgICA6IHNpbmd1bGFyXG4gICAgICA/IHVuaXRzW3VuaXRdWzBdXG4gICAgICA6IHVuaXQ7XG4gIHJldHVybiBpc0luUGFzdCA/IGAke2ZtdFZhbHVlfSAke2ZtdFVuaXR9IGFnb2AgOiBgaW4gJHtmbXRWYWx1ZX0gJHtmbXRVbml0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICBjb25zdCBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFtcbiAgICAgIFwid2Vla2RheVwiLFxuICAgICAgXCJlcmFcIixcbiAgICAgIFwieWVhclwiLFxuICAgICAgXCJtb250aFwiLFxuICAgICAgXCJkYXlcIixcbiAgICAgIFwiaG91clwiLFxuICAgICAgXCJtaW51dGVcIixcbiAgICAgIFwic2Vjb25kXCIsXG4gICAgICBcInRpbWVab25lTmFtZVwiLFxuICAgICAgXCJob3VyQ3ljbGVcIixcbiAgICBdKSxcbiAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgIGRhdGVUaW1lSHVnZSA9IFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXlcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5XCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9IVUdFKTpcbiAgICAgIHJldHVybiBcIkVFRUUsIExMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FXzI0X1NJTVBMRSk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiSEg6bW06c3NcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW0gYVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTEwpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0hVR0UpOlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBkIExMTCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2Zvcm1hdHMuanNcIjtcbmltcG9ydCB7IHBhZFN0YXJ0IH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIGxldCBzID0gXCJcIjtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiBzcGxpdHMpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxuY29uc3QgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyA9IHtcbiAgRDogRm9ybWF0cy5EQVRFX1NIT1JULFxuICBERDogRm9ybWF0cy5EQVRFX01FRCxcbiAgREREOiBGb3JtYXRzLkRBVEVfRlVMTCxcbiAgRERERDogRm9ybWF0cy5EQVRFX0hVR0UsXG4gIHQ6IEZvcm1hdHMuVElNRV9TSU1QTEUsXG4gIHR0OiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IEZvcm1hdHMuVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IEZvcm1hdHMuVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogRm9ybWF0cy5USU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IEZvcm1hdHMuREFURVRJTUVfU0hPUlQsXG4gIGZmOiBGb3JtYXRzLkRBVEVUSU1FX01FRCxcbiAgZmZmOiBGb3JtYXRzLkRBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IEZvcm1hdHMuREFURVRJTUVfSFVHRSxcbiAgRjogRm9ybWF0cy5EQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyxcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXR0ZXIge1xuICBzdGF0aWMgY3JlYXRlKGxvY2FsZSwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICBsZXQgY3VycmVudCA9IG51bGwsXG4gICAgICBjdXJyZW50RnVsbCA9IFwiXCIsXG4gICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzcGxpdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGZtdC5jaGFyQXQoaSk7XG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGJyYWNrZXRlZCwgdmFsOiBjdXJyZW50RnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH1cblxuICBzdGF0aWMgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbikge1xuICAgIHJldHVybiBtYWNyb1Rva2VuVG9Gb3JtYXRPcHRzW3Rva2VuXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG9wdHMpIHtcbiAgICBpZiAodGhpcy5zeXN0ZW1Mb2MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3lzdGVtTG9jID0gdGhpcy5sb2MucmVkZWZhdWx0VG9TeXN0ZW0oKTtcbiAgICB9XG4gICAgY29uc3QgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgeyAuLi50aGlzLm9wdHMsIC4uLm9wdHMgfSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVRpbWUoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfVxuXG4gIGZvcm1hdERhdGVUaW1lUGFydHMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXRUb1BhcnRzKCk7XG4gIH1cblxuICByZXNvbHZlZE9wdGlvbnMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfVxuXG4gIG51bShuLCBwID0gMCkge1xuICAgIC8vIHdlIGdldCBzb21lIHBlcmYgb3V0IG9mIGRvaW5nIHRoaXMgaGVyZSwgYW5ub3lpbmdseVxuICAgIGlmICh0aGlzLm9wdHMuZm9yY2VTaW1wbGUpIHtcbiAgICAgIHJldHVybiBwYWRTdGFydChuLCBwKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRzID0geyAuLi50aGlzLm9wdHMgfTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH1cblxuICBmb3JtYXREYXRlVGltZUZyb21TdHJpbmcoZHQsIGZtdCkge1xuICAgIGNvbnN0IGtub3duRW5nbGlzaCA9IHRoaXMubG9jLmxpc3RpbmdNb2RlKCkgPT09IFwiZW5cIixcbiAgICAgIHVzZURhdGVUaW1lRm9ybWF0dGVyID0gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgJiYgdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgIT09IFwiZ3JlZ29yeVwiLFxuICAgICAgc3RyaW5nID0gKG9wdHMsIGV4dHJhY3QpID0+IHRoaXMubG9jLmV4dHJhY3QoZHQsIG9wdHMsIGV4dHJhY3QpLFxuICAgICAgZm9ybWF0T2Zmc2V0ID0gKG9wdHMpID0+IHtcbiAgICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgICAgcmV0dXJuIFwiWlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR0LmlzVmFsaWQgPyBkdC56b25lLmZvcm1hdE9mZnNldChkdC50cywgb3B0cy5mb3JtYXQpIDogXCJcIjtcbiAgICAgIH0sXG4gICAgICBtZXJpZGllbSA9ICgpID0+XG4gICAgICAgIGtub3duRW5nbGlzaFxuICAgICAgICAgID8gRW5nbGlzaC5tZXJpZGllbUZvckRhdGVUaW1lKGR0KVxuICAgICAgICAgIDogc3RyaW5nKHsgaG91cjogXCJudW1lcmljXCIsIGhvdXJDeWNsZTogXCJoMTJcIiB9LCBcImRheXBlcmlvZFwiKSxcbiAgICAgIG1vbnRoID0gKGxlbmd0aCwgc3RhbmRhbG9uZSkgPT5cbiAgICAgICAga25vd25FbmdsaXNoXG4gICAgICAgICAgPyBFbmdsaXNoLm1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aClcbiAgICAgICAgICA6IHN0cmluZyhzdGFuZGFsb25lID8geyBtb250aDogbGVuZ3RoIH0gOiB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKSxcbiAgICAgIHdlZWtkYXkgPSAobGVuZ3RoLCBzdGFuZGFsb25lKSA9PlxuICAgICAgICBrbm93bkVuZ2xpc2hcbiAgICAgICAgICA/IEVuZ2xpc2gud2Vla2RheUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpXG4gICAgICAgICAgOiBzdHJpbmcoXG4gICAgICAgICAgICAgIHN0YW5kYWxvbmUgPyB7IHdlZWtkYXk6IGxlbmd0aCB9IDogeyB3ZWVrZGF5OiBsZW5ndGgsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9LFxuICAgICAgICAgICAgICBcIndlZWtkYXlcIlxuICAgICAgICAgICAgKSxcbiAgICAgIG1heWJlTWFjcm8gPSAodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0T3B0cyA9IEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHRva2VuKTtcbiAgICAgICAgaWYgKGZvcm1hdE9wdHMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgZm9ybWF0T3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJhID0gKGxlbmd0aCkgPT5cbiAgICAgICAga25vd25FbmdsaXNoID8gRW5nbGlzaC5lcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyh7IGVyYTogbGVuZ3RoIH0sIFwiZXJhXCIpLFxuICAgICAgdG9rZW5Ub1N0cmluZyA9ICh0b2tlbikgPT4ge1xuICAgICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lLTEvZGF0ZS10aW1lI1RPQy1TdGFuZGFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgICAgICAvLyBtc1xuICAgICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWlsbGlzZWNvbmQpO1xuICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taWxsaXNlY29uZCwgMyk7XG4gICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuc2Vjb25kKTtcbiAgICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5zZWNvbmQsIDIpO1xuICAgICAgICAgIC8vIGZyYWN0aW9uYWwgc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJ1dVwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZHQubWlsbGlzZWNvbmQgLyAxMCksIDIpO1xuICAgICAgICAgIGNhc2UgXCJ1dXVcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGR0Lm1pbGxpc2Vjb25kIC8gMTAwKSk7XG4gICAgICAgICAgLy8gbWludXRlc1xuICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWludXRlKTtcbiAgICAgICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taW51dGUsIDIpO1xuICAgICAgICAgIC8vIGhvdXJzXG4gICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5ob3VyICUgMTIgPT09IDAgPyAxMiA6IGR0LmhvdXIgJSAxMik7XG4gICAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91cik7XG4gICAgICAgICAgY2FzZSBcIkhIXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciwgMik7XG4gICAgICAgICAgLy8gb2Zmc2V0XG4gICAgICAgICAgY2FzZSBcIlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoeyBmb3JtYXQ6IFwibmFycm93XCIsIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgKzA2OjAwXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcInNob3J0XCIsIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlICswNjAwXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcInRlY2hpZVwiLCBhbGxvd1o6IHRoaXMub3B0cy5hbGxvd1ogfSk7XG4gICAgICAgICAgY2FzZSBcIlpaWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7IGZvcm1hdDogXCJzaG9ydFwiLCBsb2NhbGU6IHRoaXMubG9jLmxvY2FsZSB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpaWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgRWFzdGVybiBTdGFuZGFyZCBUaW1lXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7IGZvcm1hdDogXCJsb25nXCIsIGxvY2FsZTogdGhpcy5sb2MubG9jYWxlIH0pO1xuICAgICAgICAgIC8vIHpvbmVcbiAgICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZU5hbWU7XG4gICAgICAgICAgLy8gbWVyaWRpZW1zXG4gICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAgIC8vIGRhdGVzXG4gICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IGRheTogXCJudW1lcmljXCIgfSwgXCJkYXlcIikgOiB0aGlzLm51bShkdC5kYXkpO1xuICAgICAgICAgIGNhc2UgXCJkZFwiOlxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHsgZGF5OiBcIjItZGlnaXRcIiB9LCBcImRheVwiKSA6IHRoaXMubnVtKGR0LmRheSwgMik7XG4gICAgICAgICAgLy8gd2Vla2RheXMgLSBzdGFuZGFsb25lXG4gICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAgIC8vIHdlZWtkYXlzIC0gZm9ybWF0XG4gICAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAgIC8vIG1vbnRocyAtIHN0YW5kYWxvbmVcbiAgICAgICAgICBjYXNlIFwiTFwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCJudW1lcmljXCIsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDEsIGRvZXNuJ3Qgc2VlbSB0byB3b3JrXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCIyLWRpZ2l0XCIsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoLCAyKTtcbiAgICAgICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwic2hvcnRcIiwgdHJ1ZSk7XG4gICAgICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCB0cnVlKTtcbiAgICAgICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAgIC8vIG1vbnRocyAtIGZvcm1hdFxuICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IG1vbnRoOiBcIm51bWVyaWNcIiB9LCBcIm1vbnRoXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQubW9udGgpO1xuICAgICAgICAgIGNhc2UgXCJNTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgbW9udGg6IFwiMi1kaWdpdFwiIH0sIFwibW9udGhcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgICAvLyB5ZWFyc1xuICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAvLyBsaWtlIDIwMTRcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKSA6IHRoaXMubnVtKGR0LnllYXIpO1xuICAgICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxNFxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgeWVhcjogXCIyLWRpZ2l0XCIgfSwgXCJ5ZWFyXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQueWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDAxMlxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgeWVhcjogXCJudW1lcmljXCIgfSwgXCJ5ZWFyXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQueWVhciwgNCk7XG4gICAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAwMDAwMTJcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAgIC8vIGVyYXNcbiAgICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgICAgLy8gbGlrZSBBRFxuICAgICAgICAgICAgcmV0dXJuIGVyYShcInNob3J0XCIpO1xuICAgICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgICAgLy8gbGlrZSBBbm5vIERvbWluaVxuICAgICAgICAgICAgcmV0dXJuIGVyYShcImxvbmdcIik7XG4gICAgICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgICAgICByZXR1cm4gZXJhKFwibmFycm93XCIpO1xuICAgICAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtZZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcbiAgICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtZZWFyLCA0KTtcbiAgICAgICAgICBjYXNlIFwiV1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuICAgICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIsIDIpO1xuICAgICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQub3JkaW5hbCk7XG4gICAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuICAgICAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5xdWFydGVyKTtcbiAgICAgICAgICBjYXNlIFwicXFcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5xdWFydGVyLCAyKTtcbiAgICAgICAgICBjYXNlIFwiWFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZHQudHMgLyAxMDAwKSk7XG4gICAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC50cyk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtYXliZU1hY3JvKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksIHRva2VuVG9TdHJpbmcpO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGR1ciwgZm10KSB7XG4gICAgY29uc3QgdG9rZW5Ub0ZpZWxkID0gKHRva2VuKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodG9rZW5bMF0pIHtcbiAgICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcbiAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwic2Vjb25kXCI7XG4gICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgIHJldHVybiBcIm1pbnV0ZVwiO1xuICAgICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJob3VyXCI7XG4gICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImRheVwiO1xuICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJ5ZWFyXCI7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdG9rZW5Ub1N0cmluZyA9IChsaWxkdXIpID0+ICh0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGxpbGR1ci5nZXQobWFwcGVkKSwgdG9rZW4ubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSxcbiAgICAgIHJlYWxUb2tlbnMgPSB0b2tlbnMucmVkdWNlKFxuICAgICAgICAoZm91bmQsIHsgbGl0ZXJhbCwgdmFsIH0pID0+IChsaXRlcmFsID8gZm91bmQgOiBmb3VuZC5jb25jYXQodmFsKSksXG4gICAgICAgIFtdXG4gICAgICApLFxuICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8oLi4ucmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIoKHQpID0+IHQpKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWQge1xuICBjb25zdHJ1Y3RvcihyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgdGhpcy5leHBsYW5hdGlvbiA9IGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgdG9NZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmV4cGxhbmF0aW9uKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IFpvbmVJc0Fic3RyYWN0RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFpvbmUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyB6b25lLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBuYW1lKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyBjb21tb24gbmFtZSAoc3VjaCBhcyBFU1QpIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgdG8gYWZmZWN0IHRoZSBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLiBBY2NlcHRzICdsb25nJyBvciAnc2hvcnQnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBvZmZzZXROYW1lKHRzLCBvcHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyB2YWx1ZSBhcyBhIHN0cmluZ1xuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG9mZnNldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyAnbmFycm93JywgJ3Nob3J0Jywgb3IgJ3RlY2hpZScuIFJldHVybmluZyAnKzYnLCAnKzA2OjAwJywgb3IgJyswNjAwJyByZXNwZWN0aXZlbHlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIHRoaXMgem9uZSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgb2Zmc2V0XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIG9mZnNldCh0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIGVxdWFsIHRvIGFub3RoZXIgem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgdmFsaWQuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHBhcnNlWm9uZUluZm8gfSBmcm9tIFwiLi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgWm9uZSBmcm9tIFwiLi4vem9uZS5qc1wiO1xuXG5sZXQgc2luZ2xldG9uID0gbnVsbDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsb2NhbCB6b25lIGZvciB0aGlzIEphdmFTY3JpcHQgZW52aXJvbm1lbnQuXG4gKiBAaW1wbGVtZW50cyB7Wm9uZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogR2V0IGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBsb2NhbCB6b25lXG4gICAqIEByZXR1cm4ge1N5c3RlbVpvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGluc3RhbmNlKCkge1xuICAgIGlmIChzaW5nbGV0b24gPT09IG51bGwpIHtcbiAgICAgIHNpbmdsZXRvbiA9IG5ldyBTeXN0ZW1ab25lKCk7XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGV0b247XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJzeXN0ZW1cIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUodHMsIHsgZm9ybWF0LCBsb2NhbGUgfSkge1xuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5vZmZzZXQodHMpLCBmb3JtYXQpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwic3lzdGVtXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGZvcm1hdE9mZnNldCwgcGFyc2Vab25lSW5mbywgaXNVbmRlZmluZWQsIGlhbmFSZWdleCwgb2JqVG9Mb2NhbFRTIH0gZnJvbSBcIi4uL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxuY29uc3QgbWF0Y2hpbmdSZWdleCA9IFJlZ0V4cChgXiR7aWFuYVJlZ2V4LnNvdXJjZX0kYCk7XG5cbmxldCBkdGZDYWNoZSA9IHt9O1xuZnVuY3Rpb24gbWFrZURURih6b25lKSB7XG4gIGlmICghZHRmQ2FjaGVbem9uZV0pIHtcbiAgICBkdGZDYWNoZVt6b25lXSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tVVNcIiwge1xuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICAgIHRpbWVab25lOiB6b25lLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgc2Vjb25kOiBcIjItZGlnaXRcIixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHRmQ2FjaGVbem9uZV07XG59XG5cbmNvbnN0IHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDUsXG59O1xuXG5mdW5jdGlvbiBoYWNreU9mZnNldChkdGYsIGRhdGUpIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgIHBhcnNlZCA9IC8oXFxkKylcXC8oXFxkKylcXC8oXFxkKyksPyAoXFxkKyk6KFxcZCspOihcXGQrKS8uZXhlYyhmb3JtYXR0ZWQpLFxuICAgIFssIGZNb250aCwgZkRheSwgZlllYXIsIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXSA9IHBhcnNlZDtcbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICBmaWxsZWQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBmb3JtYXR0ZWRbaV0sXG4gICAgICBwb3MgPSB0eXBlVG9Qb3NbdHlwZV07XG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxubGV0IGlhbmFab25lQ2FjaGUgPSB7fTtcbi8qKlxuICogQSB6b25lIGlkZW50aWZpZWQgYnkgYW4gSUFOQSBpZGVudGlmaWVyLCBsaWtlIEFtZXJpY2EvTmV3X1lvcmtcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJQU5BWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBab25lIG5hbWVcbiAgICogQHJldHVybiB7SUFOQVpvbmV9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKG5hbWUpIHtcbiAgICBpZiAoIWlhbmFab25lQ2FjaGVbbmFtZV0pIHtcbiAgICAgIGlhbmFab25lQ2FjaGVbbmFtZV0gPSBuZXcgSUFOQVpvbmUobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBpYW5hWm9uZUNhY2hlW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGxvY2FsIGNhY2hlcy4gU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGluIHRlc3Rpbmcgc2NlbmFyaW9zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlc2V0Q2FjaGUoKSB7XG4gICAgaWFuYVpvbmVDYWNoZSA9IHt9O1xuICAgIGR0ZkNhY2hlID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBzdHJpbmcgaXMgYSB2YWxpZCBzcGVjaWZpZXIuIFRoaXMgb25seSBjaGVja3MgdGhlIHN0cmluZydzIGZvcm1hdCwgbm90IHRoYXQgdGhlIHNwZWNpZmllciBpZGVudGlmaWVzIGEga25vd24gem9uZTsgc2VlIGlzVmFsaWRab25lIGZvciB0aGF0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBzdHJpbmcgdG8gY2hlY2sgdmFsaWRpdHkgb25cbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcihcIkFtZXJpY2EvTmV3X1lvcmtcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJTcG9ydH5+YmxvcnBcIikgLy89PiBmYWxzZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiAhIShzICYmIHMubWF0Y2gobWF0Y2hpbmdSZWdleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgc3RyaW5nIGlkZW50aWZpZXMgYSByZWFsIHpvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHpvbmUgLSBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRab25lKFwiQW1lcmljYS9OZXdfWW9ya1wiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFpvbmUoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiBmYWxzZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShcIlNwb3J0fn5ibG9ycFwiKSAvLz0+IGZhbHNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIGlmICghem9uZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7IHRpbWVab25lOiB6b25lIH0pLmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAcHJpdmF0ZSAqKi9cbiAgICB0aGlzLnpvbmVOYW1lID0gbmFtZTtcbiAgICAvKiogQHByaXZhdGUgKiovXG4gICAgdGhpcy52YWxpZCA9IElBTkFab25lLmlzVmFsaWRab25lKG5hbWUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaWFuYVwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0TmFtZSh0cywgeyBmb3JtYXQsIGxvY2FsZSB9KSB7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMub2Zmc2V0KHRzKSwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCh0cykge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgICBpZiAoaXNOYU4oZGF0ZSkpIHJldHVybiBOYU47XG5cbiAgICBjb25zdCBkdGYgPSBtYWtlRFRGKHRoaXMubmFtZSksXG4gICAgICBbeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gZHRmLmZvcm1hdFRvUGFydHNcbiAgICAgICAgPyBwYXJ0c09mZnNldChkdGYsIGRhdGUpXG4gICAgICAgIDogaGFja3lPZmZzZXQoZHRmLCBkYXRlKTtcblxuICAgIC8vIGJlY2F1c2Ugd2UncmUgdXNpbmcgaG91cjEyIGFuZCBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDI1NTY0JmNhbj0yJnE9JTIyMjQlM0EwMCUyMiUyMGRhdGV0aW1lZm9ybWF0XG4gICAgY29uc3QgYWRqdXN0ZWRIb3VyID0gaG91ciA9PT0gMjQgPyAwIDogaG91cjtcblxuICAgIGNvbnN0IGFzVVRDID0gb2JqVG9Mb2NhbFRTKHtcbiAgICAgIHllYXIsXG4gICAgICBtb250aCxcbiAgICAgIGRheSxcbiAgICAgIGhvdXI6IGFkanVzdGVkSG91cixcbiAgICAgIG1pbnV0ZSxcbiAgICAgIHNlY29uZCxcbiAgICAgIG1pbGxpc2Vjb25kOiAwLFxuICAgIH0pO1xuXG4gICAgbGV0IGFzVFMgPSArZGF0ZTtcbiAgICBjb25zdCBvdmVyID0gYXNUUyAlIDEwMDA7XG4gICAgYXNUUyAtPSBvdmVyID49IDAgPyBvdmVyIDogMTAwMCArIG92ZXI7XG4gICAgcmV0dXJuIChhc1VUQyAtIGFzVFMpIC8gKDYwICogMTAwMCk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImlhbmFcIiAmJiBvdGhlclpvbmUubmFtZSA9PT0gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHNpZ25lZE9mZnNldCB9IGZyb20gXCIuLi9pbXBsL3V0aWwuanNcIjtcbmltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbmxldCBzaW5nbGV0b24gPSBudWxsO1xuXG4vKipcbiAqIEEgem9uZSB3aXRoIGEgZml4ZWQgb2Zmc2V0IChtZWFuaW5nIG5vIERTVClcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaXhlZE9mZnNldFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBVVENcbiAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCB1dGNJbnN0YW5jZSgpIHtcbiAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICBzaW5nbGV0b24gPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ2xldG9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWVkIG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldCBpbiBtaW51dGVzXG4gICAqIEByZXR1cm4ge0ZpeGVkT2Zmc2V0Wm9uZX1cbiAgICovXG4gIHN0YXRpYyBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiBGaXhlZE9mZnNldFpvbmUgZnJvbSBhIFVUQyBvZmZzZXQgc3RyaW5nLCBsaWtlIFwiVVRDKzZcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBvZmZzZXQgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQys2XCIpXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQyswNlwiKVxuICAgKiBAZXhhbXBsZSBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIoXCJVVEMtNjowMFwiKVxuICAgKiBAcmV0dXJuIHtGaXhlZE9mZnNldFpvbmV9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICBjb25zdCByID0gcy5tYXRjaCgvXnV0Yyg/OihbKy1dXFxkezEsMn0pKD86OihcXGR7Mn0pKT8pPyQvaSk7XG4gICAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkT2Zmc2V0Wm9uZShzaWduZWRPZmZzZXQoclsxXSwgclsyXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9mZnNldCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqIEBwcml2YXRlICoqL1xuICAgIHRoaXMuZml4ZWQgPSBvZmZzZXQ7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJmaXhlZFwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyBcIlVUQ1wiIDogYFVUQyR7Zm9ybWF0T2Zmc2V0KHRoaXMuZml4ZWQsIFwibmFycm93XCIpfWA7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5maXhlZCwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1VuaXZlcnNhbCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiZml4ZWRcIiAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwgImltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbi8qKlxuICogQSB6b25lIHRoYXQgZmFpbGVkIHRvIHBhcnNlLiBZb3Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcy5cbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih6b25lTmFtZSkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqICBAcHJpdmF0ZSAqL1xuICAgIHRoaXMuem9uZU5hbWUgPSB6b25lTmFtZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImludmFsaWRcIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBwcml2YXRlXG4gKi9cblxuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4uL3pvbmVzL2ZpeGVkT2Zmc2V0Wm9uZS5qc1wiO1xuaW1wb3J0IEludmFsaWRab25lIGZyb20gXCIuLi96b25lcy9pbnZhbGlkWm9uZS5qc1wiO1xuXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgaXNTdHJpbmcsIGlzTnVtYmVyIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplWm9uZShpbnB1dCwgZGVmYXVsdFpvbmUpIHtcbiAgbGV0IG9mZnNldDtcbiAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSB8fCBpbnB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBkZWZhdWx0Wm9uZTtcbiAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFpvbmUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgY29uc3QgbG93ZXJlZCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyZWQgPT09IFwibG9jYWxcIiB8fCBsb3dlcmVkID09PSBcInN5c3RlbVwiKSByZXR1cm4gZGVmYXVsdFpvbmU7XG4gICAgZWxzZSBpZiAobG93ZXJlZCA9PT0gXCJ1dGNcIiB8fCBsb3dlcmVkID09PSBcImdtdFwiKSByZXR1cm4gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlO1xuICAgIGVsc2UgaWYgKElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIobG93ZXJlZCkpIHJldHVybiBJQU5BWm9uZS5jcmVhdGUoaW5wdXQpO1xuICAgIGVsc2UgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihsb3dlcmVkKSB8fCBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoaW5wdXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBpbnB1dC5vZmZzZXQgJiYgdHlwZW9mIGlucHV0Lm9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIFRoaXMgaXMgZHVtYiwgYnV0IHRoZSBpbnN0YW5jZW9mIGNoZWNrIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byByZWFsbHkgd29ya1xuICAgIC8vIHNvIHdlJ3JlIGR1Y2sgY2hlY2tpbmcgaXRcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBJbnZhbGlkWm9uZShpbnB1dCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgU3lzdGVtWm9uZSBmcm9tIFwiLi96b25lcy9zeXN0ZW1ab25lLmpzXCI7XG5pbXBvcnQgSUFOQVpvbmUgZnJvbSBcIi4vem9uZXMvSUFOQVpvbmUuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcblxuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxubGV0IG5vdyA9ICgpID0+IERhdGUubm93KCksXG4gIGRlZmF1bHRab25lID0gXCJzeXN0ZW1cIixcbiAgZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudWxsLFxuICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBudWxsLFxuICB0aHJvd09uSW52YWxpZDtcblxuLyoqXG4gKiBTZXR0aW5ncyBjb250YWlucyBzdGF0aWMgZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IGNvbnRyb2wgTHV4b24ncyBvdmVyYWxsIGJlaGF2aW9yLiBMdXhvbiBpcyBhIHNpbXBsZSBsaWJyYXJ5IHdpdGggZmV3IG9wdGlvbnMsIGJ1dCB0aGUgb25lcyBpdCBkb2VzIGhhdmUgbGl2ZSBoZXJlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAqL1xuICBzdGF0aWMgZ2V0IG5vdygpIHtcbiAgICByZXR1cm4gbm93O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXG4gICAqIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgbnVtYmVyLCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIEVwb2NoIG1pbGxpc2Vjb25kIGNvdW50XG4gICAqIEB0eXBlIHtmdW5jdGlvbn1cbiAgICogQGV4YW1wbGUgU2V0dGluZ3Mubm93ID0gKCkgPT4gRGF0ZS5ub3coKSArIDMwMDAgLy8gcHJldGVuZCBpdCBpcyAzIHNlY29uZHMgaW4gdGhlIGZ1dHVyZVxuICAgKiBAZXhhbXBsZSBTZXR0aW5ncy5ub3cgPSAoKSA9PiAwIC8vIGFsd2F5cyBwcmV0ZW5kIGl0J3MgSmFuIDEsIDE5NzAgYXQgbWlkbmlnaHQgaW4gVVRDIHRpbWVcbiAgICovXG4gIHN0YXRpYyBzZXQgbm93KG4pIHtcbiAgICBub3cgPSBuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogVXNlIHRoZSB2YWx1ZSBcInN5c3RlbVwiIHRvIHJlc2V0IHRoaXMgdmFsdWUgdG8gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzZXQgZGVmYXVsdFpvbmUoem9uZSkge1xuICAgIGRlZmF1bHRab25lID0gem9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIG9iamVjdCBjdXJyZW50bHkgdXNlZCB0byBjcmVhdGUgRGF0ZVRpbWVzLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgc3lzdGVtJ3MgdGltZSB6b25lICh0aGUgb25lIHNldCBvbiB0aGUgbWFjaGluZSB0aGF0IHJ1bnMgdGhpcyBjb2RlKS5cbiAgICogQHR5cGUge1pvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHRab25lKCkge1xuICAgIHJldHVybiBub3JtYWxpemVab25lKGRlZmF1bHRab25lLCBTeXN0ZW1ab25lLmluc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdExvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzZXQgZGVmYXVsdExvY2FsZShsb2NhbGUpIHtcbiAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVmYXVsdCBudW1iZXJpbmcgc3lzdGVtIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdE51bWJlcmluZ1N5c3RlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0obnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZ1N5c3RlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE91dHB1dENhbGVuZGFyKCkge1xuICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHRPdXRwdXRDYWxlbmRhcihvdXRwdXRDYWxlbmRhcikge1xuICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKSB7XG4gICAgcmV0dXJuIHRocm93T25JbnZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBzZXQgdGhyb3dPbkludmFsaWQodCkge1xuICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBMdXhvbidzIGdsb2JhbCBjYWNoZXMuIFNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBpbiB0ZXN0aW5nIHNjZW5hcmlvcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICAgIElBTkFab25lLnJlc2V0Q2FjaGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHBhZFN0YXJ0LCByb3VuZFRvLCBoYXNSZWxhdGl2ZSB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCAqIGFzIEVuZ2xpc2ggZnJvbSBcIi4vZW5nbGlzaC5qc1wiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuLi9kYXRldGltZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuXG4vLyB0b2RvIC0gcmVtYXAgY2FjaGluZ1xuXG5sZXQgaW50bExGQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZExGKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGR0ZiA9IGludGxMRkNhY2hlW2tleV07XG4gIGlmICghZHRmKSB7XG4gICAgZHRmID0gbmV3IEludGwuTGlzdEZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxMRkNhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxEVENhY2hlID0ge307XG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICBsZXQgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcbiAgaWYgKCFkdGYpIHtcbiAgICBkdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxEVENhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxOdW1DYWNoZSA9IHt9O1xuZnVuY3Rpb24gZ2V0Q2FjaGVkSU5GKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxOdW1DYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBpbnRsUmVsQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZFJURihsb2NTdHJpbmcsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGJhc2UsIC4uLmNhY2hlS2V5T3B0cyB9ID0gb3B0czsgLy8gZXhjbHVkZSBgYmFzZWAgZnJvbSB0aGUgb3B0aW9uc1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBjYWNoZUtleU9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxSZWxDYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxSZWxDYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGVTdHIpIHtcbiAgLy8gSSByZWFsbHkgd2FudCB0byBhdm9pZCB3cml0aW5nIGEgQkNQIDQ3IHBhcnNlclxuICAvLyBzZWUsIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL3dvb29ybS9iY3AtNDdcbiAgLy8gSW5zdGVhZCwgd2UnbGwgZG8gdGhpczpcblxuICAvLyBhKSBpZiB0aGUgc3RyaW5nIGhhcyBubyAtdSBleHRlbnNpb25zLCBqdXN0IGxlYXZlIGl0IGFsb25lXG4gIC8vIGIpIGlmIGl0IGRvZXMsIHVzZSBJbnRsIHRvIHJlc29sdmUgZXZlcnl0aGluZ1xuICAvLyBjKSBpZiBJbnRsIGZhaWxzLCB0cnkgYWdhaW4gd2l0aG91dCB0aGUgLXVcblxuICBjb25zdCB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgY29uc3Qgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihsb2NhbGVTdHIpLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wdGlvbnMgPSBnZXRDYWNoZWREVEYoc21hbGxlcikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBvcHRpb25zO1xuICAgIC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICBpZiAob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGxvY2FsZVN0ciArPSBgLWNhLSR7b3V0cHV0Q2FsZW5kYXJ9YDtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICBsb2NhbGVTdHIgKz0gYC1udS0ke251bWJlcmluZ1N5c3RlbX1gO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlU3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsb2NhbGVTdHI7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgY29uc3QgbXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gbWFwV2Vla2RheXMoZikge1xuICBjb25zdCBtcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICBjb25zdCBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIGxpc3RTdHVmZihsb2MsIGxlbmd0aCwgZGVmYXVsdE9LLCBlbmdsaXNoRm4sIGludGxGbikge1xuICBjb25zdCBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8XG4gICAgICAhbG9jLmxvY2FsZSB8fFxuICAgICAgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvYy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgUG9seU51bWJlckZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGludGwsIGZvcmNlU2ltcGxlLCBvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcblxuICAgIGNvbnN0IHsgcGFkVG8sIGZsb29yLCAuLi5vdGhlck9wdHMgfSA9IG9wdHM7XG5cbiAgICBpZiAoIWZvcmNlU2ltcGxlIHx8IE9iamVjdC5rZXlzKG90aGVyT3B0cykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW50bE9wdHMgPSB7IHVzZUdyb3VwaW5nOiBmYWxzZSwgLi4ub3B0cyB9O1xuICAgICAgaWYgKG9wdHMucGFkVG8gPiAwKSBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgICB0aGlzLmluZiA9IGdldENhY2hlZElORihpbnRsLCBpbnRsT3B0cyk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0KGkpIHtcbiAgICBpZiAodGhpcy5pbmYpIHtcbiAgICAgIGNvbnN0IGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5mLmZvcm1hdChmaXhlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgICBjb25zdCBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogcm91bmRUbyhpLCAzKTtcbiAgICAgIHJldHVybiBwYWRTdGFydChmaXhlZCwgdGhpcy5wYWRUbyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jbGFzcyBQb2x5RGF0ZUZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcblxuICAgIGxldCB6O1xuICAgIGlmIChkdC56b25lLmlzVW5pdmVyc2FsKSB7XG4gICAgICAvLyBVVEMtOCBvciBFdGMvVVRDLTggYXJlIG5vdCBwYXJ0IG9mIHR6ZGF0YSwgb25seSBFdGMvR01UKzggYW5kIHRoZSBsaWtlLlxuICAgICAgLy8gVGhhdCBpcyB3aHkgZml4ZWQtb2Zmc2V0IFRaIGlzIHNldCB0byB0aGF0IHVubGVzcyBpdCBpczpcbiAgICAgIC8vIDEuIFJlcHJlc2VudGluZyBvZmZzZXQgMCB3aGVuIFVUQyBpcyB1c2VkIHRvIG1haW50YWluIHByZXZpb3VzIGJlaGF2aW9yIGFuZCBkb2VzIG5vdCBiZWNvbWUgR01ULlxuICAgICAgLy8gMi4gVW5zdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXI6XG4gICAgICAvLyAgICAtIHNvbWUgZG8gbm90IHN1cHBvcnQgRXRjL1xuICAgICAgLy8gICAgLSA8IEV0Yy9HTVQtMTQsID4gRXRjL0dNVCsxMiwgYW5kIDMwLW1pbnV0ZSBvciA0NS1taW51dGUgb2Zmc2V0cyBhcmUgbm90IHBhcnQgb2YgdHpkYXRhXG4gICAgICBjb25zdCBnbXRPZmZzZXQgPSAtMSAqIChkdC5vZmZzZXQgLyA2MCk7XG4gICAgICBjb25zdCBvZmZzZXRaID0gZ210T2Zmc2V0ID49IDAgPyBgRXRjL0dNVCske2dtdE9mZnNldH1gIDogYEV0Yy9HTVQke2dtdE9mZnNldH1gO1xuICAgICAgaWYgKGR0Lm9mZnNldCAhPT0gMCAmJiBJQU5BWm9uZS5jcmVhdGUob2Zmc2V0WikudmFsaWQpIHtcbiAgICAgICAgeiA9IG9mZnNldFo7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhbGwgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjLys0OjMwIGFyZSBwcmVzZW50IGluIHR6ZGF0YS5cbiAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAgIC8vIDEuIFRoZSBmb3JtYXQgb3B0aW9ucyB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFdlIGNhbid0IGRvIHRoYXQsIHNvIHRoZSBiZXN0XG4gICAgICAgIC8vIHdlIGNhbiBkbyBpcyBmb3JtYXQgdGhlIGRhdGUgaW4gVVRDLlxuICAgICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgICAvLyB0aGUgdGltZSBhbmQgdGVsbCB0aGUgZm9ybWF0dGVyIHRvIHNob3cgaXQgdG8gdXMgaW4gVVRDLCBzbyB0aGF0IHRoZSB0aW1lIGlzIHJpZ2h0XG4gICAgICAgIC8vIGFuZCB0aGUgYmFkIHpvbmUgZG9lc24ndCBzaG93IHVwLlxuICAgICAgICB6ID0gXCJVVENcIjtcbiAgICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgeiA9IGR0LnpvbmUubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRsT3B0cyA9IHsgLi4udGhpcy5vcHRzIH07XG4gICAgaWYgKHopIHtcbiAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICB9XG4gICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgZm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIGZvcm1hdFRvUGFydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdFRvUGFydHModGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIHJlc29sdmVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kdGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQb2x5UmVsRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoaW50bCwgaXNFbmdsaXNoLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0geyBzdHlsZTogXCJsb25nXCIsIC4uLm9wdHMgfTtcbiAgICBpZiAoIWlzRW5nbGlzaCAmJiBoYXNSZWxhdGl2ZSgpKSB7XG4gICAgICB0aGlzLnJ0ZiA9IGdldENhY2hlZFJURihpbnRsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXQoY291bnQsIHVuaXQpIHtcbiAgICBpZiAodGhpcy5ydGYpIHtcbiAgICAgIHJldHVybiB0aGlzLnJ0Zi5mb3JtYXQoY291bnQsIHVuaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRW5nbGlzaC5mb3JtYXRSZWxhdGl2ZVRpbWUodW5pdCwgY291bnQsIHRoaXMub3B0cy5udW1lcmljLCB0aGlzLm9wdHMuc3R5bGUgIT09IFwibG9uZ1wiKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUb1BhcnRzKGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsZSB7XG4gIHN0YXRpYyBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyLCBkZWZhdWx0VG9FTiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBjb25zdCBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/IFwiZW4tVVNcIiA6IHN5c3RlbUxvY2FsZSgpKTtcbiAgICBjb25zdCBudW1iZXJpbmdTeXN0ZW1SID0gbnVtYmVyaW5nU3lzdGVtIHx8IFNldHRpbmdzLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgY29uc3Qgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfVxuXG4gIHN0YXRpYyByZXNldENhY2hlKCkge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcbiAgICBpbnRsRFRDYWNoZSA9IHt9O1xuICAgIGludGxOdW1DYWNoZSA9IHt9O1xuICAgIGludGxSZWxDYWNoZSA9IHt9O1xuICB9XG5cbiAgc3RhdGljIGZyb21PYmplY3QoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgbnVtYmVyaW5nLCBvdXRwdXRDYWxlbmRhciwgc3BlY2lmaWVkTG9jYWxlKSB7XG4gICAgY29uc3QgW3BhcnNlZExvY2FsZSwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtLCBwYXJzZWRPdXRwdXRDYWxlbmRhcl0gPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuXG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubW9udGhzQ2FjaGUgPSB7IGZvcm1hdDoge30sIHN0YW5kYWxvbmU6IHt9IH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG5cbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIGdldCBmYXN0TnVtYmVycygpIHtcbiAgICBpZiAodGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0TnVtYmVyc0NhY2hlZDtcbiAgfVxuXG4gIGxpc3RpbmdNb2RlKCkge1xuICAgIGNvbnN0IGlzQWN0dWFsbHlFbiA9IHRoaXMuaXNFbmdsaXNoKCk7XG4gICAgY29uc3QgaGFzTm9XZWlyZG5lc3MgPVxuICAgICAgKHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBudWxsIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIikgJiZcbiAgICAgICh0aGlzLm91dHB1dENhbGVuZGFyID09PSBudWxsIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IFwiZ3JlZ29yeVwiKTtcbiAgICByZXR1cm4gaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzID8gXCJlblwiIDogXCJpbnRsXCI7XG4gIH1cblxuICBjbG9uZShhbHRzKSB7XG4gICAgaWYgKCFhbHRzIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFsdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKFxuICAgICAgICBhbHRzLmxvY2FsZSB8fCB0aGlzLnNwZWNpZmllZExvY2FsZSxcbiAgICAgICAgYWx0cy5udW1iZXJpbmdTeXN0ZW0gfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGFsdHMub3V0cHV0Q2FsZW5kYXIgfHwgdGhpcy5vdXRwdXRDYWxlbmRhcixcbiAgICAgICAgYWx0cy5kZWZhdWx0VG9FTiB8fCBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZWRlZmF1bHRUb0VOKGFsdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKHsgLi4uYWx0cywgZGVmYXVsdFRvRU46IHRydWUgfSk7XG4gIH1cblxuICByZWRlZmF1bHRUb1N5c3RlbShhbHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSh7IC4uLmFsdHMsIGRlZmF1bHRUb0VOOiBmYWxzZSB9KTtcbiAgfVxuXG4gIG1vbnRocyhsZW5ndGgsIGZvcm1hdCA9IGZhbHNlLCBkZWZhdWx0T0sgPSB0cnVlKSB7XG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgRW5nbGlzaC5tb250aHMsICgpID0+IHtcbiAgICAgIGNvbnN0IGludGwgPSBmb3JtYXQgPyB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSA6IHsgbW9udGg6IGxlbmd0aCB9LFxuICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG4gICAgICBpZiAoIXRoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwTW9udGhzKChkdCkgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcIm1vbnRoXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXTtcbiAgICB9KTtcbiAgfVxuXG4gIHdlZWtkYXlzKGxlbmd0aCwgZm9ybWF0ID0gZmFsc2UsIGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBFbmdsaXNoLndlZWtkYXlzLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnRsID0gZm9ybWF0XG4gICAgICAgICAgPyB7IHdlZWtkYXk6IGxlbmd0aCwgeWVhcjogXCJudW1lcmljXCIsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9XG4gICAgICAgICAgOiB7IHdlZWtkYXk6IGxlbmd0aCB9LFxuICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG4gICAgICBpZiAoIXRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcFdlZWtkYXlzKChkdCkgPT5cbiAgICAgICAgICB0aGlzLmV4dHJhY3QoZHQsIGludGwsIFwid2Vla2RheVwiKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICBtZXJpZGllbXMoZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYoXG4gICAgICB0aGlzLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdE9LLFxuICAgICAgKCkgPT4gRW5nbGlzaC5tZXJpZGllbXMsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBjb3VsZCBiZSBhcmliaXRyYXJ5IGRheSBwZXJpb2RzLiBXZSdyZSBnb25uYSBhc3N1bWUgdGhlcmUgYXJlIGV4YWN0bHkgdHdvXG4gICAgICAgIC8vIGZvciBBTSBhbmQgUE0uIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIG1ha2VzIHBhcnNpbmcgd2F5IGVhc2llci5cbiAgICAgICAgaWYgKCF0aGlzLm1lcmlkaWVtQ2FjaGUpIHtcbiAgICAgICAgICBjb25zdCBpbnRsID0geyBob3VyOiBcIm51bWVyaWNcIiwgaG91ckN5Y2xlOiBcImgxMlwiIH07XG4gICAgICAgICAgdGhpcy5tZXJpZGllbUNhY2hlID0gW0RhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDkpLCBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCAxOSldLm1hcChcbiAgICAgICAgICAgIChkdCkgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImRheXBlcmlvZFwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5tZXJpZGllbUNhY2hlO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBlcmFzKGxlbmd0aCwgZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIEVuZ2xpc2guZXJhcywgKCkgPT4ge1xuICAgICAgY29uc3QgaW50bCA9IHsgZXJhOiBsZW5ndGggfTtcblxuICAgICAgLy8gVGhpcyBpcyBwcm9ibGVtYXRpYy4gRGlmZmVyZW50IGNhbGVuZGFycyBhcmUgZ29pbmcgdG8gZGVmaW5lIGVyYXMgdG90YWxseSBkaWZmZXJlbnRseS4gV2hhdCBJIG5lZWQgaXMgdGhlIG1pbmltdW0gc2V0IG9mIGRhdGVzXG4gICAgICAvLyB0byBkZWZpbml0ZWx5IGVudW1lcmF0ZSB0aGVtLlxuICAgICAgaWYgKCF0aGlzLmVyYUNhY2hlW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy5lcmFDYWNoZVtsZW5ndGhdID0gW0RhdGVUaW1lLnV0YygtNDAsIDEsIDEpLCBEYXRlVGltZS51dGMoMjAxNywgMSwgMSldLm1hcCgoZHQpID0+XG4gICAgICAgICAgdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5lcmFDYWNoZVtsZW5ndGhdO1xuICAgIH0pO1xuICB9XG5cbiAgZXh0cmFjdChkdCwgaW50bE9wdHMsIGZpZWxkKSB7XG4gICAgY29uc3QgZGYgPSB0aGlzLmR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyksXG4gICAgICByZXN1bHRzID0gZGYuZm9ybWF0VG9QYXJ0cygpLFxuICAgICAgbWF0Y2hpbmcgPSByZXN1bHRzLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBmaWVsZCk7XG4gICAgcmV0dXJuIG1hdGNoaW5nID8gbWF0Y2hpbmcudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgbnVtYmVyRm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIC8vIHRoaXMgZm9yY2VzaW1wbGUgb3B0aW9uIGlzIG5ldmVyIHVzZWQgKHRoZSBvbmx5IGNhbGxlciBzaG9ydC1jaXJjdWl0cyBvbiBpdCwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGxlYXZlKVxuICAgIC8vIChpbiBjb250cmFzdCwgdGhlIHJlc3Qgb2YgdGhlIGNvbmRpdGlvbiBpcyB1c2VkIGhlYXZpbHkpXG4gICAgcmV0dXJuIG5ldyBQb2x5TnVtYmVyRm9ybWF0dGVyKHRoaXMuaW50bCwgb3B0cy5mb3JjZVNpbXBsZSB8fCB0aGlzLmZhc3ROdW1iZXJzLCBvcHRzKTtcbiAgfVxuXG4gIGR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2x5RGF0ZUZvcm1hdHRlcihkdCwgdGhpcy5pbnRsLCBpbnRsT3B0cyk7XG4gIH1cblxuICByZWxGb3JtYXR0ZXIob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2x5UmVsRm9ybWF0dGVyKHRoaXMuaW50bCwgdGhpcy5pc0VuZ2xpc2goKSwgb3B0cyk7XG4gIH1cblxuICBsaXN0Rm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBnZXRDYWNoZWRMRih0aGlzLmludGwsIG9wdHMpO1xuICB9XG5cbiAgaXNFbmdsaXNoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxvY2FsZSA9PT0gXCJlblwiIHx8XG4gICAgICB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKVxuICAgICk7XG4gIH1cblxuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sb2NhbGUgPT09IG90aGVyLmxvY2FsZSAmJlxuICAgICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJlxuICAgICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXJcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdW50cnVuY2F0ZVllYXIsXG4gIHNpZ25lZE9mZnNldCxcbiAgcGFyc2VJbnRlZ2VyLFxuICBwYXJzZU1pbGxpcyxcbiAgaWFuYVJlZ2V4LFxuICBpc1VuZGVmaW5lZCxcbiAgcGFyc2VGbG9hdGluZyxcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgRml4ZWRPZmZzZXRab25lIGZyb20gXCIuLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcblxuLypcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XG4gKiBUd28gdGhpbmdzIGdvIGludG8gcGFyc2luZzogYSByZWdleCB0byBtYXRjaCB3aXRoIGFuZCBhbiBleHRyYWN0b3IgdG8gdGFrZSBhcGFydCB0aGUgZ3JvdXBzIGluIHRoZSBtYXRjaC5cbiAqIEFuIGV4dHJhY3RvciBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHJlZ2V4IG1hdGNoIGFycmF5IGFuZCByZXR1cm5zIGEgeyB5ZWFyOiAuLi4sIG1vbnRoOiAuLi4gfSBvYmplY3RcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxuICogRXh0cmFjdG9ycyBjYW4gdGFrZSBhIFwiY3Vyc29yXCIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgaW4gdGhlIG1hdGNoIHRvIGxvb2sgYXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjb21iaW5lIGV4dHJhY3RvcnMuXG4gKiBjb21iaW5lRXh0cmFjdG9ycygpIGRvZXMgdGhlIHdvcmsgb2YgY29tYmluaW5nIHRoZW0sIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnNvciB0aHJvdWdoIG11bHRpcGxlIGV4dHJhY3Rpb25zLlxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJlZ2V4ZXMoLi4ucmVnZXhlcykge1xuICBjb25zdCBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoKGYsIHIpID0+IGYgKyByLnNvdXJjZSwgXCJcIik7XG4gIHJldHVybiBSZWdFeHAoYF4ke2Z1bGx9JGApO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycyguLi5leHRyYWN0b3JzKSB7XG4gIHJldHVybiAobSkgPT5cbiAgICBleHRyYWN0b3JzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoW21lcmdlZFZhbHMsIG1lcmdlZFpvbmUsIGN1cnNvcl0sIGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgW3ZhbCwgem9uZSwgbmV4dF0gPSBleChtLCBjdXJzb3IpO1xuICAgICAgICAgIHJldHVybiBbeyAuLi5tZXJnZWRWYWxzLCAuLi52YWwgfSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgICAgICAgfSxcbiAgICAgICAgW3t9LCBudWxsLCAxXVxuICAgICAgKVxuICAgICAgLnNsaWNlKDAsIDIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZShzLCAuLi5wYXR0ZXJucykge1xuICBpZiAocyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2V4LCBleHRyYWN0b3JdIG9mIHBhdHRlcm5zKSB7XG4gICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKC4uLmtleXMpIHtcbiAgcmV0dXJuIChtYXRjaCwgY3Vyc29yKSA9PiB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnRlZ2VyKG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXQsIG51bGwsIGN1cnNvciArIGldO1xuICB9O1xufVxuXG4vLyBJU08gYW5kIFNRTCBwYXJzaW5nXG5jb25zdCBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gIGlzb1RpbWVCYXNlUmVnZXggPSAvKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlsuLF0oXFxkezEsMzB9KSk/KT8pPy8sXG4gIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChgJHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0ke29mZnNldFJlZ2V4LnNvdXJjZX0/YCksXG4gIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChgKD86VCR7aXNvVGltZVJlZ2V4LnNvdXJjZX0pP2ApLFxuICBpc29ZbWRSZWdleCA9IC8oWystXVxcZHs2fXxcXGR7NH0pKD86LT8oXFxkXFxkKSg/Oi0/KFxcZFxcZCkpPyk/LyxcbiAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgZXh0cmFjdElTT1dlZWtEYXRhID0gc2ltcGxlUGFyc2UoXCJ3ZWVrWWVhclwiLCBcIndlZWtOdW1iZXJcIiwgXCJ3ZWVrRGF5XCIpLFxuICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sIC8vIGR1bWJlZC1kb3duIHZlcnNpb24gb2YgdGhlIElTTyBvbmVcbiAgc3FsVGltZVJlZ2V4ID0gUmVnRXhwKFxuICAgIGAke2lzb1RpbWVCYXNlUmVnZXguc291cmNlfSA/KD86JHtvZmZzZXRSZWdleC5zb3VyY2V9fCgke2lhbmFSZWdleC5zb3VyY2V9KSk/YFxuICApLFxuICBzcWxUaW1lRXh0ZW5zaW9uUmVnZXggPSBSZWdFeHAoYCg/OiAke3NxbFRpbWVSZWdleC5zb3VyY2V9KT9gKTtcblxuZnVuY3Rpb24gaW50KG1hdGNoLCBwb3MsIGZhbGxiYWNrKSB7XG4gIGNvbnN0IG0gPSBtYXRjaFtwb3NdO1xuICByZXR1cm4gaXNVbmRlZmluZWQobSkgPyBmYWxsYmFjayA6IHBhcnNlSW50ZWdlcihtKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgeWVhcjogaW50KG1hdGNoLCBjdXJzb3IpLFxuICAgIG1vbnRoOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDEpLFxuICAgIGRheTogaW50KG1hdGNoLCBjdXJzb3IgKyAyLCAxKSxcbiAgfTtcblxuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPVGltZShtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgaG91cnM6IGludChtYXRjaCwgY3Vyc29yLCAwKSxcbiAgICBtaW51dGVzOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDApLFxuICAgIHNlY29uZHM6IGludChtYXRjaCwgY3Vyc29yICsgMiwgMCksXG4gICAgbWlsbGlzZWNvbmRzOiBwYXJzZU1pbGxpcyhtYXRjaFtjdXJzb3IgKyAzXSksXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3Qgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBJQU5BWm9uZS5jcmVhdGUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIHRpbWUgcGFyc2luZ1xuXG5jb25zdCBpc29UaW1lT25seSA9IFJlZ0V4cChgXlQ/JHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0kYCk7XG5cbi8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cbmNvbnN0IGlzb0R1cmF0aW9uID1cbiAgL14tP1AoPzooPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pWSk/KD86KC0/XFxkezEsOX0oPzpcXC5cXGR7MSw5fSk/KU0pPyg/OigtP1xcZHsxLDl9KD86XFwuXFxkezEsOX0pPylXKT8oPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pRCk/KD86VCg/OigtP1xcZHsxLDl9KD86XFwuXFxkezEsOX0pPylIKT8oPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pTSk/KD86KC0/XFxkezEsMjB9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgY29uc3QgW3MsIHllYXJTdHIsIG1vbnRoU3RyLCB3ZWVrU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyLCBtaWxsaXNlY29uZHNTdHJdID1cbiAgICBtYXRjaDtcblxuICBjb25zdCBoYXNOZWdhdGl2ZVByZWZpeCA9IHNbMF0gPT09IFwiLVwiO1xuICBjb25zdCBuZWdhdGl2ZVNlY29uZHMgPSBzZWNvbmRTdHIgJiYgc2Vjb25kU3RyWzBdID09PSBcIi1cIjtcblxuICBjb25zdCBtYXliZU5lZ2F0ZSA9IChudW0sIGZvcmNlID0gZmFsc2UpID0+XG4gICAgbnVtICE9PSB1bmRlZmluZWQgJiYgKGZvcmNlIHx8IChudW0gJiYgaGFzTmVnYXRpdmVQcmVmaXgpKSA/IC1udW0gOiBudW07XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB5ZWFyczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyh5ZWFyU3RyKSksXG4gICAgICBtb250aHM6IG1heWJlTmVnYXRlKHBhcnNlRmxvYXRpbmcobW9udGhTdHIpKSxcbiAgICAgIHdlZWtzOiBtYXliZU5lZ2F0ZShwYXJzZUZsb2F0aW5nKHdlZWtTdHIpKSxcbiAgICAgIGRheXM6IG1heWJlTmVnYXRlKHBhcnNlRmxvYXRpbmcoZGF5U3RyKSksXG4gICAgICBob3VyczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyhob3VyU3RyKSksXG4gICAgICBtaW51dGVzOiBtYXliZU5lZ2F0ZShwYXJzZUZsb2F0aW5nKG1pbnV0ZVN0cikpLFxuICAgICAgc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyhzZWNvbmRTdHIpLCBzZWNvbmRTdHIgPT09IFwiLTBcIiksXG4gICAgICBtaWxsaXNlY29uZHM6IG1heWJlTmVnYXRlKHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0ciksIG5lZ2F0aXZlU2Vjb25kcyksXG4gICAgfSxcbiAgXTtcbn1cblxuLy8gVGhlc2UgYXJlIGEgbGl0dGxlIGJyYWluZGVhZC4gRURUICpzaG91bGQqIHRlbGwgdXMgdGhhdCB3ZSdyZSBpbiwgc2F5LCBBbWVyaWNhL05ld19Zb3JrXG4vLyBhbmQgbm90IGp1c3QgdGhhdCB3ZSdyZSBpbiAtMjQwICpyaWdodCBub3cqLiBCdXQgc2luY2UgSSBkb24ndCB0aGluayB0aGVzZSBhcmUgdXNlZCB0aGF0IG9mdGVuXG4vLyBJJ20ganVzdCBnb2luZyB0byBpZ25vcmUgdGhhdFxuY29uc3Qgb2JzT2Zmc2V0cyA9IHtcbiAgR01UOiAwLFxuICBFRFQ6IC00ICogNjAsXG4gIEVTVDogLTUgKiA2MCxcbiAgQ0RUOiAtNSAqIDYwLFxuICBDU1Q6IC02ICogNjAsXG4gIE1EVDogLTYgKiA2MCxcbiAgTVNUOiAtNyAqIDYwLFxuICBQRFQ6IC03ICogNjAsXG4gIFBTVDogLTggKiA2MCxcbn07XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICB5ZWFyOiB5ZWFyU3RyLmxlbmd0aCA9PT0gMiA/IHVudHJ1bmNhdGVZZWFyKHBhcnNlSW50ZWdlcih5ZWFyU3RyKSkgOiBwYXJzZUludGVnZXIoeWVhclN0ciksXG4gICAgbW9udGg6IEVuZ2xpc2gubW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0cikgKyAxLFxuICAgIGRheTogcGFyc2VJbnRlZ2VyKGRheVN0ciksXG4gICAgaG91cjogcGFyc2VJbnRlZ2VyKGhvdXJTdHIpLFxuICAgIG1pbnV0ZTogcGFyc2VJbnRlZ2VyKG1pbnV0ZVN0ciksXG4gIH07XG5cbiAgaWYgKHNlY29uZFN0cikgcmVzdWx0LnNlY29uZCA9IHBhcnNlSW50ZWdlcihzZWNvbmRTdHIpO1xuICBpZiAod2Vla2RheVN0cikge1xuICAgIHJlc3VsdC53ZWVrZGF5ID1cbiAgICAgIHdlZWtkYXlTdHIubGVuZ3RoID4gM1xuICAgICAgICA/IEVuZ2xpc2gud2Vla2RheXNMb25nLmluZGV4T2Yod2Vla2RheVN0cikgKyAxXG4gICAgICAgIDogRW5nbGlzaC53ZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0cikgKyAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gUkZDIDI4MjIvNTMyMlxuY29uc3QgcmZjMjgyMiA9XG4gIC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfCg/OihbKy1dXFxkXFxkKShcXGRcXGQpKSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzI4MjIobWF0Y2gpIHtcbiAgY29uc3QgW1xuICAgICAgLFxuICAgICAgd2Vla2RheVN0cixcbiAgICAgIGRheVN0cixcbiAgICAgIG1vbnRoU3RyLFxuICAgICAgeWVhclN0cixcbiAgICAgIGhvdXJTdHIsXG4gICAgICBtaW51dGVTdHIsXG4gICAgICBzZWNvbmRTdHIsXG4gICAgICBvYnNPZmZzZXQsXG4gICAgICBtaWxPZmZzZXQsXG4gICAgICBvZmZIb3VyU3RyLFxuICAgICAgb2ZmTWludXRlU3RyLFxuICAgIF0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG5cbiAgbGV0IG9mZnNldDtcbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCBcIiBcIilcbiAgICAudHJpbSgpO1xufVxuXG4vLyBodHRwIGRhdGVcblxuY29uc3QgcmZjMTEyMyA9XG4gICAgL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSwgKFxcZFxcZCkgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoXFxkezR9KSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgcmZjODUwID1cbiAgICAvXihNb25kYXl8VHVlc2RheXxXZWRzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXFxkXFxkKS0oSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpLShcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICBhc2NpaSA9XG4gICAgL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXFxkfFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgKFxcZHs0fSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzExMjNPcjg1MChtYXRjaCkge1xuICBjb25zdCBbLCB3ZWVrZGF5U3RyLCBkYXlTdHIsIG1vbnRoU3RyLCB5ZWFyU3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cl0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QVNDSUkobWF0Y2gpIHtcbiAgY29uc3QgWywgd2Vla2RheVN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIsIHllYXJTdHJdID0gbWF0Y2gsXG4gICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuY29uc3QgaXNvWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb1ltZFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpO1xuY29uc3QgaXNvV2Vla1dpdGhUaW1lRXh0ZW5zaW9uUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IGlzb1RpbWVDb21iaW5lZFJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KTtcblxuY29uc3QgZXh0cmFjdElTT1ltZFRpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1ltZCxcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXRcbik7XG5jb25zdCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1dlZWtEYXRhLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09PcmRpbmFsRGF0ZUFuZFRpbWUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT09yZGluYWxEYXRhLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lQW5kT2Zmc2V0ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShcbiAgICBzLFxuICAgIFtpc29ZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPWW1kVGltZUFuZE9mZnNldF0sXG4gICAgW2lzb1dlZWtXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXRdLFxuICAgIFtpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCwgZXh0cmFjdElTT09yZGluYWxEYXRlQW5kVGltZV0sXG4gICAgW2lzb1RpbWVDb21iaW5lZFJlZ2V4LCBleHRyYWN0SVNPVGltZUFuZE9mZnNldF1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUkZDMjgyMkRhdGUocykge1xuICByZXR1cm4gcGFyc2UocHJlcHJvY2Vzc1JGQzI4MjIocyksIFtyZmMyODIyLCBleHRyYWN0UkZDMjgyMl0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIVFRQRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShcbiAgICBzLFxuICAgIFtyZmMxMTIzLCBleHRyYWN0UkZDMTEyM09yODUwXSxcbiAgICBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSxcbiAgICBbYXNjaWksIGV4dHJhY3RBU0NJSV1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cblxuY29uc3QgZXh0cmFjdElTT1RpbWVPbmx5ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUpO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU09UaW1lT25seShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvVGltZU9ubHksIGV4dHJhY3RJU09UaW1lT25seV0pO1xufVxuXG5jb25zdCBzcWxZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoc3FsWW1kUmVnZXgsIHNxbFRpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBzcWxUaW1lQ29tYmluZWRSZWdleCA9IGNvbWJpbmVSZWdleGVzKHNxbFRpbWVSZWdleCk7XG5cbmNvbnN0IGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1ltZCxcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXQsXG4gIGV4dHJhY3RJQU5BWm9uZVxuKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lT2Zmc2V0QW5kSUFOQVpvbmUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXQsXG4gIGV4dHJhY3RJQU5BWm9uZVxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU1FMKHMpIHtcbiAgcmV0dXJuIHBhcnNlKFxuICAgIHMsXG4gICAgW3NxbFltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmVdLFxuICAgIFtzcWxUaW1lQ29tYmluZWRSZWdleCwgZXh0cmFjdElTT1RpbWVPZmZzZXRBbmRJQU5BWm9uZV1cbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgSW52YWxpZER1cmF0aW9uRXJyb3IsIEludmFsaWRVbml0RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCBGb3JtYXR0ZXIgZnJvbSBcIi4vaW1wbC9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBJbnZhbGlkIGZyb20gXCIuL2ltcGwvaW52YWxpZC5qc1wiO1xuaW1wb3J0IExvY2FsZSBmcm9tIFwiLi9pbXBsL2xvY2FsZS5qc1wiO1xuaW1wb3J0IHsgcGFyc2VJU09EdXJhdGlvbiwgcGFyc2VJU09UaW1lT25seSB9IGZyb20gXCIuL2ltcGwvcmVnZXhQYXJzZXIuanNcIjtcbmltcG9ydCB7XG4gIGFzTnVtYmVyLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaXNJbnRlZ2VyLFxuICBpc051bWJlcixcbiAgaXNVbmRlZmluZWQsXG4gIG5vcm1hbGl6ZU9iamVjdCxcbiAgcm91bmRUbyxcbn0gZnJvbSBcIi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEdXJhdGlvblwiO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG5leHBvcnQgY29uc3QgbG93T3JkZXJNYXRyaXggPSB7XG4gICAgd2Vla3M6IHtcbiAgICAgIGRheXM6IDcsXG4gICAgICBob3VyczogNyAqIDI0LFxuICAgICAgbWludXRlczogNyAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIGRheXM6IHtcbiAgICAgIGhvdXJzOiAyNCxcbiAgICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBob3VyczogeyBtaW51dGVzOiA2MCwgc2Vjb25kczogNjAgKiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMCB9LFxuICAgIG1pbnV0ZXM6IHsgc2Vjb25kczogNjAsIG1pbGxpc2Vjb25kczogNjAgKiAxMDAwIH0sXG4gICAgc2Vjb25kczogeyBtaWxsaXNlY29uZHM6IDEwMDAgfSxcbiAgfSxcbiAgY2FzdWFsTWF0cml4ID0ge1xuICAgIHllYXJzOiB7XG4gICAgICBxdWFydGVyczogNCxcbiAgICAgIG1vbnRoczogMTIsXG4gICAgICB3ZWVrczogNTIsXG4gICAgICBkYXlzOiAzNjUsXG4gICAgICBob3VyczogMzY1ICogMjQsXG4gICAgICBtaW51dGVzOiAzNjUgKiAyNCAqIDYwLFxuICAgICAgc2Vjb25kczogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgcXVhcnRlcnM6IHtcbiAgICAgIG1vbnRoczogMyxcbiAgICAgIHdlZWtzOiAxMyxcbiAgICAgIGRheXM6IDkxLFxuICAgICAgaG91cnM6IDkxICogMjQsXG4gICAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogOTEgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgbW9udGhzOiB7XG4gICAgICB3ZWVrczogNCxcbiAgICAgIGRheXM6IDMwLFxuICAgICAgaG91cnM6IDMwICogMjQsXG4gICAgICBtaW51dGVzOiAzMCAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAzMCAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG5cbiAgICAuLi5sb3dPcmRlck1hdHJpeCxcbiAgfSxcbiAgZGF5c0luWWVhckFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0MDAsXG4gIGRheXNJbk1vbnRoQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQ4MDAsXG4gIGFjY3VyYXRlTWF0cml4ID0ge1xuICAgIHllYXJzOiB7XG4gICAgICBxdWFydGVyczogNCxcbiAgICAgIG1vbnRoczogMTIsXG4gICAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICAgIGRheXM6IGRheXNJblllYXJBY2N1cmF0ZSxcbiAgICAgIGhvdXJzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBxdWFydGVyczoge1xuICAgICAgbW9udGhzOiAzLFxuICAgICAgd2Vla3M6IGRheXNJblllYXJBY2N1cmF0ZSAvIDI4LFxuICAgICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICAgIGhvdXJzOiAoZGF5c0luWWVhckFjY3VyYXRlICogMjQpIC8gNCxcbiAgICAgIG1pbnV0ZXM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwKSAvIDQsXG4gICAgICBzZWNvbmRzOiAoZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwKSAvIDQsXG4gICAgICBtaWxsaXNlY29uZHM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwKSAvIDQsXG4gICAgfSxcbiAgICBtb250aHM6IHtcbiAgICAgIHdlZWtzOiBkYXlzSW5Nb250aEFjY3VyYXRlIC8gNyxcbiAgICAgIGRheXM6IGRheXNJbk1vbnRoQWNjdXJhdGUsXG4gICAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgICAgbWludXRlczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIC4uLmxvd09yZGVyTWF0cml4LFxuICB9O1xuXG4vLyB1bml0cyBvcmRlcmVkIGJ5IHNpemVcbmNvbnN0IG9yZGVyZWRVbml0cyA9IFtcbiAgXCJ5ZWFyc1wiLFxuICBcInF1YXJ0ZXJzXCIsXG4gIFwibW9udGhzXCIsXG4gIFwid2Vla3NcIixcbiAgXCJkYXlzXCIsXG4gIFwiaG91cnNcIixcbiAgXCJtaW51dGVzXCIsXG4gIFwic2Vjb25kc1wiLFxuICBcIm1pbGxpc2Vjb25kc1wiLFxuXTtcblxuY29uc3QgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTtcblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cywgY2xlYXIgPSBmYWxzZSkge1xuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIGNvbnN0IGNvbmYgPSB7XG4gICAgdmFsdWVzOiBjbGVhciA/IGFsdHMudmFsdWVzIDogeyAuLi5kdXIudmFsdWVzLCAuLi4oYWx0cy52YWx1ZXMgfHwge30pIH0sXG4gICAgbG9jOiBkdXIubG9jLmNsb25lKGFsdHMubG9jKSxcbiAgICBjb252ZXJzaW9uQWNjdXJhY3k6IGFsdHMuY29udmVyc2lvbkFjY3VyYWN5IHx8IGR1ci5jb252ZXJzaW9uQWNjdXJhY3ksXG4gIH07XG4gIHJldHVybiBuZXcgRHVyYXRpb24oY29uZik7XG59XG5cbmZ1bmN0aW9uIGFudGlUcnVuYyhuKSB7XG4gIHJldHVybiBuIDwgMCA/IE1hdGguZmxvb3IobikgOiBNYXRoLmNlaWwobik7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIGNvbnZlcnQobWF0cml4LCBmcm9tTWFwLCBmcm9tVW5pdCwgdG9NYXAsIHRvVW5pdCkge1xuICBjb25zdCBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgIHJhdyA9IGZyb21NYXBbZnJvbVVuaXRdIC8gY29udixcbiAgICBzYW1lU2lnbiA9IE1hdGguc2lnbihyYXcpID09PSBNYXRoLnNpZ24odG9NYXBbdG9Vbml0XSksXG4gICAgLy8gb2ssIHNvIHRoaXMgaXMgd2lsZCwgYnV0IHNlZSB0aGUgbWF0cml4IGluIHRoZSB0ZXN0c1xuICAgIGFkZGVkID1cbiAgICAgICFzYW1lU2lnbiAmJiB0b01hcFt0b1VuaXRdICE9PSAwICYmIE1hdGguYWJzKHJhdykgPD0gMSA/IGFudGlUcnVuYyhyYXcpIDogTWF0aC50cnVuYyhyYXcpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlcyhtYXRyaXgsIHZhbHMpIHtcbiAgcmV2ZXJzZVVuaXRzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHNbY3VycmVudF0pKSB7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgY29udmVydChtYXRyaXgsIHZhbHMsIHByZXZpb3VzLCB2YWxzLCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cblxuLyoqXG4gKiBBIER1cmF0aW9uIG9iamVjdCByZXByZXNlbnRzIGEgcGVyaW9kIG9mIHRpbWUsIGxpa2UgXCIyIG1vbnRoc1wiIG9yIFwiMSBkYXksIDEgaG91clwiLiBDb25jZXB0dWFsbHksIGl0J3MganVzdCBhIG1hcCBvZiB1bml0cyB0byB0aGVpciBxdWFudGl0aWVzLCBhY2NvbXBhbmllZCBieSBzb21lIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBhbmQgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS4gVGhleSBjYW4gYmUgdXNlZCBvbiB0aGVpciBvd24gb3IgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBMdXhvbiB0eXBlczsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHtAbGluayBEYXRlVGltZSNwbHVzfSB0byBhZGQgYSBEdXJhdGlvbiBvYmplY3QgdG8gYSBEYXRlVGltZSwgcHJvZHVjaW5nIGFub3RoZXIgRGF0ZVRpbWUuXG4gKlxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBEdXJhdGlvbjpcbiAqXG4gKiAqICoqQ3JlYXRpb24qKiBUbyBjcmVhdGUgYSBEdXJhdGlvbiwgdXNlIHtAbGluayBEdXJhdGlvbiNmcm9tTWlsbGlzfSwge0BsaW5rIER1cmF0aW9uI2Zyb21PYmplY3R9LCBvciB7QGxpbmsgRHVyYXRpb24jZnJvbUlTT30uXG4gKiAqICoqVW5pdCB2YWx1ZXMqKiBTZWUgdGhlIHtAbGluayBEdXJhdGlvbiN5ZWFyc30sIHtAbGluayBEdXJhdGlvbi5tb250aHN9LCB7QGxpbmsgRHVyYXRpb24jd2Vla3N9LCB7QGxpbmsgRHVyYXRpb24jZGF5c30sIHtAbGluayBEdXJhdGlvbiNob3Vyc30sIHtAbGluayBEdXJhdGlvbiNtaW51dGVzfSwge0BsaW5rIER1cmF0aW9uI3NlY29uZHN9LCB7QGxpbmsgRHVyYXRpb24jbWlsbGlzZWNvbmRzfSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSAge0BsaW5rIER1cmF0aW9uI2xvY2FsZX0gYW5kIHtAbGluayBEdXJhdGlvbiNudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBuZXcgRHVyYXRpb25zIG91dCBvZiBvbGQgb25lcyB1c2Uge0BsaW5rIER1cmF0aW9uI3BsdXN9LCB7QGxpbmsgRHVyYXRpb24jbWludXN9LCB7QGxpbmsgRHVyYXRpb24jbm9ybWFsaXplfSwge0BsaW5rIER1cmF0aW9uI3NldH0sIHtAbGluayBEdXJhdGlvbiNyZWNvbmZpZ3VyZX0sIHtAbGluayBEdXJhdGlvbiNzaGlmdFRvfSwgYW5kIHtAbGluayBEdXJhdGlvbiNuZWdhdGV9LlxuICogKiAqKk91dHB1dCoqIFRvIGNvbnZlcnQgdGhlIER1cmF0aW9uIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIER1cmF0aW9uI2FzfSwge0BsaW5rIER1cmF0aW9uI3RvSVNPfSwge0BsaW5rIER1cmF0aW9uI3RvRm9ybWF0fSwgYW5kIHtAbGluayBEdXJhdGlvbiN0b0pTT059XG4gKlxuICogVGhlcmUncyBhcmUgbW9yZSBtZXRob2RzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCB2YWxpZGl0eSwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEdXJhdGlvbiB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgY29uc3QgYWNjdXJhdGUgPSBjb25maWcuY29udmVyc2lvbkFjY3VyYWN5ID09PSBcImxvbmd0ZXJtXCIgfHwgZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jb252ZXJzaW9uQWNjdXJhY3kgPSBhY2N1cmF0ZSA/IFwibG9uZ3Rlcm1cIiA6IFwiY2FzdWFsXCI7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm1hdHJpeCA9IGFjY3VyYXRlID8gYWNjdXJhdGVNYXRyaXggOiBjYXN1YWxNYXRyaXg7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uRHVyYXRpb24gPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBEdXJhdGlvbiBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IG9mIG1pbGxpc2Vjb25kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbU1pbGxpcyhjb3VudCwgb3B0cykge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWlsbGlzZWNvbmRzOiBjb3VudCB9LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzJy5cbiAgICogSWYgdGhpcyBvYmplY3QgaXMgZW1wdHkgdGhlbiBhIHplcm8gbWlsbGlzZWNvbmRzIGR1cmF0aW9uIGlzIHJldHVybmVkLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnF1YXJ0ZXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubW9udGhzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXlzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91cnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbGxpc2Vjb25kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9W11dIC0gb3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhpcyBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tT2JqZWN0KG9iaiwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7XG4gICAgICAgICAgb2JqID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2Ygb2JqXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRHVyYXRpb24oe1xuICAgICAgdmFsdWVzOiBub3JtYWxpemVPYmplY3Qob2JqLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0cyksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9wdHMuY29udmVyc2lvbkFjY3VyYWN5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gRHVyYXRpb25MaWtlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdCB8IG51bWJlciB8IER1cmF0aW9ufSBkdXJhdGlvbkxpa2VcbiAgICogT25lIG9mOlxuICAgKiAtIG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcnMnIGFuZCAnaG91cnMnLlxuICAgKiAtIG51bWJlciByZXByZXNlbnRpbmcgbWlsbGlzZWNvbmRzXG4gICAqIC0gRHVyYXRpb24gaW5zdGFuY2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbkxpa2UpIHtcbiAgICBpZiAoaXNOdW1iZXIoZHVyYXRpb25MaWtlKSkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMoZHVyYXRpb25MaWtlKTtcbiAgICB9IGVsc2UgaWYgKER1cmF0aW9uLmlzRHVyYXRpb24oZHVyYXRpb25MaWtlKSkge1xuICAgICAgcmV0dXJuIGR1cmF0aW9uTGlrZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbkxpa2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KGR1cmF0aW9uTGlrZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYFVua25vd24gZHVyYXRpb24gYXJndW1lbnQgJHtkdXJhdGlvbkxpa2V9IG9mIHR5cGUgJHt0eXBlb2YgZHVyYXRpb25MaWtlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1AzWTZNMVc0RFQxMkgzME01UycpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAzLCBtb250aHM6IDYsIHdlZWtzOiAxLCBkYXlzOiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUFQyM0gnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjMgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQNVkzTScpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiA1LCBtb250aHM6IDMgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcGFyc2VkXSA9IHBhcnNlSVNPRHVyYXRpb24odGV4dCk7XG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QocGFyc2VkLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIGB0aGUgaW5wdXQgXCIke3RleHR9XCIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPVGltZSgnMTE6MjI6MzMuNDQ0JykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAyMiwgc2Vjb25kczogMzMsIG1pbGxpc2Vjb25kczogNDQ0IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJzExOjAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTowMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCcxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUlTT1RpbWUodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IFtwYXJzZWRdID0gcGFyc2VJU09UaW1lT25seSh0ZXh0KTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChwYXJzZWQsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIGRhdGV0aW1lIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24gPSBudWxsKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZER1cmF0aW9uRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oeyBpbnZhbGlkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICB5ZWFyOiBcInllYXJzXCIsXG4gICAgICB5ZWFyczogXCJ5ZWFyc1wiLFxuICAgICAgcXVhcnRlcjogXCJxdWFydGVyc1wiLFxuICAgICAgcXVhcnRlcnM6IFwicXVhcnRlcnNcIixcbiAgICAgIG1vbnRoOiBcIm1vbnRoc1wiLFxuICAgICAgbW9udGhzOiBcIm1vbnRoc1wiLFxuICAgICAgd2VlazogXCJ3ZWVrc1wiLFxuICAgICAgd2Vla3M6IFwid2Vla3NcIixcbiAgICAgIGRheTogXCJkYXlzXCIsXG4gICAgICBkYXlzOiBcImRheXNcIixcbiAgICAgIGhvdXI6IFwiaG91cnNcIixcbiAgICAgIGhvdXJzOiBcImhvdXJzXCIsXG4gICAgICBtaW51dGU6IFwibWludXRlc1wiLFxuICAgICAgbWludXRlczogXCJtaW51dGVzXCIsXG4gICAgICBzZWNvbmQ6IFwic2Vjb25kc1wiLFxuICAgICAgc2Vjb25kczogXCJzZWNvbmRzXCIsXG4gICAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZHNcIixcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEdXJhdGlvbi4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzRHVyYXRpb24obykge1xuICAgIHJldHVybiAobyAmJiBvLmlzTHV4b25EdXJhdGlvbikgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICB0aGUgbG9jYWxlIG9mIGEgRHVyYXRpb24sIHN1Y2ggJ2VuLUdCJ1xuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuIFlvdSBtYXkgdXNlIHRoZXNlIHRva2VuczpcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xuICAgKiAqIGBzYCBmb3Igc2Vjb25kc1xuICAgKiAqIGBtYCBmb3IgbWludXRlc1xuICAgKiAqIGBoYCBmb3IgaG91cnNcbiAgICogKiBgZGAgZm9yIGRheXNcbiAgICogKiBgTWAgZm9yIG1vbnRoc1xuICAgKiAqIGB5YCBmb3IgeWVhcnNcbiAgICogTm90ZXM6XG4gICAqICogQWRkIHBhZGRpbmcgYnkgcmVwZWF0aW5nIHRoZSB0b2tlbiwgZS5nLiBcInl5XCIgcGFkcyB0aGUgeWVhcnMgdG8gdHdvIGRpZ2l0cywgXCJoaGhoXCIgcGFkcyB0aGUgaG91cnMgb3V0IHRvIGZvdXIgZGlnaXRzXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uI3NoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInkgZCBzXCIpIC8vPT4gXCIxIDYgMlwiXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInl5IGRkIHNzc1wiKSAvLz0+IFwiMDEgMDYgMDAyXCJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBmbXRPcHRzID0ge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYywgZm10T3B0cykuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsIGZtdClcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRHVyYXRpb24gd2l0aCBhbGwgdW5pdHMgaW5jbHVkZWRcbiAgICogVG8gbW9kaWZ5IGl0cyBiZWhhdmlvciB1c2UgdGhlIGBsaXN0U3R5bGVgIGFuZCBhbnkgSW50bC5OdW1iZXJGb3JtYXQgb3B0aW9uLCB0aG91Z2ggYHVuaXREaXNwbGF5YCBpcyBlc3BlY2lhbGx5IHJlbGV2YW50LiBTZWUge0BsaW5rIEludGwuTnVtYmVyRm9ybWF0fS5cbiAgICogQHBhcmFtIG9wdHMgLSBPbiBvcHRpb24gb2JqZWN0IHRvIG92ZXJyaWRlIHRoZSBmb3JtYXR0aW5nLiBBY2NlcHRzIHRoZSBzYW1lIGtleXMgYXMgdGhlIG9wdGlvbnMgcGFyYW1ldGVyIG9mIHRoZSBuYXRpdmUgYEludC5OdW1iZXJGb3JtYXRgIGNvbnN0cnVjdG9yLCBhcyB3ZWxsIGFzIGBsaXN0U3R5bGVgLlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqc1xuICAgKiB2YXIgZHVyID0gRHVyYXRpb24uZnJvbU9iamVjdCh7IGRheXM6IDEsIGhvdXJzOiA1LCBtaW51dGVzOiA2IH0pXG4gICAqIGR1ci50b0h1bWFuKCkgLy89PiAnMSBkYXksIDUgaG91cnMsIDYgbWludXRlcydcbiAgICogZHVyLnRvSHVtYW4oeyBsaXN0U3R5bGU6IFwibG9uZ1wiIH0pIC8vPT4gJzEgZGF5LCA1IGhvdXJzLCBhbmQgNiBtaW51dGVzJ1xuICAgKiBkdXIudG9IdW1hbih7IHVuaXREaXNwbGF5OiBcInNob3J0XCIgfSkgLy89PiAnMSBkYXksIDUgaHIsIDYgbWluJ1xuICAgKiBgYGBcbiAgICovXG4gIHRvSHVtYW4ob3B0cyA9IHt9KSB7XG4gICAgY29uc3QgbCA9IG9yZGVyZWRVbml0c1xuICAgICAgLm1hcCgodW5pdCkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnZhbHVlc1t1bml0XTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NcbiAgICAgICAgICAubnVtYmVyRm9ybWF0dGVyKHsgc3R5bGU6IFwidW5pdFwiLCB1bml0RGlzcGxheTogXCJsb25nXCIsIC4uLm9wdHMsIHVuaXQ6IHVuaXQuc2xpY2UoMCwgLTEpIH0pXG4gICAgICAgICAgLmZvcm1hdCh2YWwpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKG4pID0+IG4pO1xuXG4gICAgcmV0dXJuIHRoaXMubG9jXG4gICAgICAubGlzdEZvcm1hdHRlcih7IHR5cGU6IFwiY29uanVuY3Rpb25cIiwgc3R5bGU6IG9wdHMubGlzdFN0eWxlIHx8IFwibmFycm93XCIsIC4uLm9wdHMgfSlcbiAgICAgIC5mb3JtYXQobCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgdG9PYmplY3QoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICByZXR1cm4geyAuLi50aGlzLnZhbHVlcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI0R1cmF0aW9uc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDMsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDNZVDQ1UydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNCwgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQNE1UNDVTJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA1IH0pLnRvSVNPKCkgLy89PiAnUDVNJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWludXRlczogNSB9KS50b0lTTygpIC8vPT4gJ1BUNU0nXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IDYgfSkudG9JU08oKSAvLz0+ICdQVDAuMDA2UydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08oKSB7XG4gICAgLy8gd2UgY291bGQgdXNlIHRoZSBmb3JtYXR0ZXIsIGJ1dCB0aGlzIGlzIGFuIGVhc2llciB3YXkgdG8gZ2V0IHRoZSBtaW5pbXVtIHN0cmluZ1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy53ZWVrcyAhPT0gMCkgcyArPSB0aGlzLndlZWtzICsgXCJXXCI7XG4gICAgaWYgKHRoaXMuZGF5cyAhPT0gMCkgcyArPSB0aGlzLmRheXMgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKVxuICAgICAgcyArPSBcIlRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCkgcyArPSB0aGlzLmhvdXJzICsgXCJIXCI7XG4gICAgaWYgKHRoaXMubWludXRlcyAhPT0gMCkgcyArPSB0aGlzLm1pbnV0ZXMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKVxuICAgICAgLy8gdGhpcyB3aWxsIGhhbmRsZSBcImZsb2F0aW5nIHBvaW50IG1hZG5lc3NcIiBieSByZW1vdmluZyBleHRyYSBkZWNpbWFsIHBsYWNlc1xuICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTg4MDA0L2lzLWZsb2F0aW5nLXBvaW50LW1hdGgtYnJva2VuXG4gICAgICBzICs9IHJvdW5kVG8odGhpcy5zZWNvbmRzICsgdGhpcy5taWxsaXNlY29uZHMgLyAxMDAwLCAzKSArIFwiU1wiO1xuICAgIGlmIChzID09PSBcIlBcIikgcyArPSBcIlQwU1wiO1xuICAgIHJldHVybiBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLCBmb3JtYXR0ZWQgYXMgYSB0aW1lIG9mIGRheS5cbiAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgZHVyYXRpb24gaXMgaW52YWxpZCwgbmVnYXRpdmUsIG9yIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAyNCBob3Vycy5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVByZWZpeD1mYWxzZV0gLSBpbmNsdWRlIHRoZSBgVGAgcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSgpIC8vPT4gJzExOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc01pbGxpc2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcxMTowMDowMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc1NlY29uZHM6IHRydWUgfSkgLy89PiAnMTE6MDAnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMTE6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IGZvcm1hdDogJ2Jhc2ljJyB9KSAvLz0+ICcxMTAwMDAuMDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT1RpbWUob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbWlsbGlzID0gdGhpcy50b01pbGxpcygpO1xuICAgIGlmIChtaWxsaXMgPCAwIHx8IG1pbGxpcyA+PSA4NjQwMDAwMCkgcmV0dXJuIG51bGw7XG5cbiAgICBvcHRzID0ge1xuICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHM6IGZhbHNlLFxuICAgICAgc3VwcHJlc3NTZWNvbmRzOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVQcmVmaXg6IGZhbHNlLFxuICAgICAgZm9ybWF0OiBcImV4dGVuZGVkXCIsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2hpZnRUbyhcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIik7XG5cbiAgICBsZXQgZm10ID0gb3B0cy5mb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwiaGhtbVwiIDogXCJoaDptbVwiO1xuXG4gICAgaWYgKCFvcHRzLnN1cHByZXNzU2Vjb25kcyB8fCB2YWx1ZS5zZWNvbmRzICE9PSAwIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgZm10ICs9IG9wdHMuZm9ybWF0ID09PSBcImJhc2ljXCIgPyBcInNzXCIgOiBcIjpzc1wiO1xuICAgICAgaWYgKCFvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN0ciA9IHZhbHVlLnRvRm9ybWF0KGZtdCk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlUHJlZml4KSB7XG4gICAgICBzdHIgPSBcIlRcIiArIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGRlYnVnZ2luZy5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5hcyhcIm1pbGxpc2Vjb25kc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLiBBbGlhcyBvZiB7QGxpbmsgdG9NaWxsaXN9XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9NaWxsaXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tRHVyYXRpb25MaWtlKGR1cmF0aW9uKSxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5KGR1ci52YWx1ZXMsIGspIHx8IGhhc093blByb3BlcnR5KHRoaXMudmFsdWVzLCBrKSkge1xuICAgICAgICByZXN1bHRba10gPSBkdXIuZ2V0KGspICsgdGhpcy5nZXQoayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiByZXN1bHQgfSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSB0aGlzIER1cmF0aW9uIHNob3J0ZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnBsdXMoZHVyLm5lZ2F0ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZSB0aGlzIER1cmF0aW9uIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCB1bml0LiBBcml0eSBpcyAxIG9yIDI6IHRoZSB2YWx1ZSBvZiB0aGUgdW5pdCBhbmQsIG9wdGlvbmFsbHksIHRoZSB1bml0IG5hbWUuIE11c3QgcmV0dXJuIGEgbnVtYmVyLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXRzKHggPT4geCAqIDIpIC8vPT4geyBob3VyczogMiwgbWludXRlczogNjAgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXRzKCh4LCB1KSA9PiB1ID09PSBcImhvdXJcIiA/IHggKiAyIDogeCkgLy89PiB7IGhvdXJzOiAyLCBtaW51dGVzOiAzMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbWFwVW5pdHMoZm4pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgcmVzdWx0W2tdID0gYXNOdW1iZXIoZm4odGhpcy52YWx1ZXNba10sIGspKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiByZXN1bHQgfSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCd5ZWFycycpIC8vPT4gMlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLmdldCgnbW9udGhzJykgLy89PiAwXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCdkYXlzJykgLy89PiAzXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1bml0KV07XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCB1bml0cy4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcbiAgICogQGV4YW1wbGUgZHVyLnNldCh7IGhvdXJzOiA4LCBtaW51dGVzOiAzMCB9KVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHNldCh2YWx1ZXMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBtaXhlZCA9IHsgLi4udGhpcy52YWx1ZXMsIC4uLm5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpIH07XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBtaXhlZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUgYW5kL29yIG51bWJlcmluZ1N5c3RlbS4gIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgZHVyLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgcmVjb25maWd1cmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgY29udmVyc2lvbkFjY3VyYWN5IH0gPSB7fSkge1xuICAgIGNvbnN0IGxvYyA9IHRoaXMubG9jLmNsb25lKHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0gfSksXG4gICAgICBvcHRzID0geyBsb2MgfTtcblxuICAgIGlmIChjb252ZXJzaW9uQWNjdXJhY3kpIHtcbiAgICAgIG9wdHMuY29udmVyc2lvbkFjY3VyYWN5ID0gY29udmVyc2lvbkFjY3VyYWN5O1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGVzJyBvciAnZGF5cydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7aG91cnM6IDYwfSkuYXMoJ2RheXMnKSAvLz0+IDIuNVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBhcyh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc2hpZnRUbyh1bml0KS5nZXQodW5pdCkgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmVkdWNlIHRoaXMgRHVyYXRpb24gdG8gaXRzIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBpbiBpdHMgY3VycmVudCB1bml0cy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMiwgbWludXRlczogLTQ1IH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMTUgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogdmFscyB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHNoaWZ0VG8oLi4udW5pdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAodW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB1bml0cyA9IHVuaXRzLm1hcCgodSkgPT4gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1KSk7XG5cbiAgICBjb25zdCBidWlsdCA9IHt9LFxuICAgICAgYWNjdW11bGF0ZWQgPSB7fSxcbiAgICAgIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgbGV0IGxhc3RVbml0O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKHVuaXRzLmluZGV4T2YoaykgPj0gMCkge1xuICAgICAgICBsYXN0VW5pdCA9IGs7XG5cbiAgICAgICAgbGV0IG93biA9IDA7XG5cbiAgICAgICAgLy8gYW55dGhpbmcgd2UgaGF2ZW4ndCBib2lsZWQgZG93biB5ZXQgc2hvdWxkIGdldCBib2lsZWQgdG8gdGhpcyB1bml0XG4gICAgICAgIGZvciAoY29uc3QgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgIGFjY3VtdWxhdGVkW2FrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IGluIHRoaXMgdW5pdFxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSAob3duICogMTAwMCAtIGkgKiAxMDAwKSAvIDEwMDA7XG5cbiAgICAgICAgLy8gcGx1cyBhbnl0aGluZyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHRoYXQgc2hvdWxkIGJlIHJvbGxlZCB1cCBpbiB0byB0aGlzXG4gICAgICAgIGZvciAoY29uc3QgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG4gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gdmFsc1trXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgLy8gbGFzdFVuaXQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIHVuaXRzIGlzIG5vdCBlbXB0eVxuICAgIGZvciAoY29uc3Qga2V5IGluIGFjY3VtdWxhdGVkKSB7XG4gICAgICBpZiAoYWNjdW11bGF0ZWRba2V5XSAhPT0gMCkge1xuICAgICAgICBidWlsdFtsYXN0VW5pdF0gKz1cbiAgICAgICAgICBrZXkgPT09IGxhc3RVbml0ID8gYWNjdW11bGF0ZWRba2V5XSA6IGFjY3VtdWxhdGVkW2tleV0gLyB0aGlzLm1hdHJpeFtsYXN0VW5pdF1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IGJ1aWx0IH0sIHRydWUpLm5vcm1hbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmVnYXRpdmUgb2YgdGhpcyBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5uZWdhdGUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogLTEsIHNlY29uZHM6IC0zMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbmVnYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBuZWdhdGVkID0ge307XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgbmVnYXRlZFtrXSA9IC10aGlzLnZhbHVlc1trXTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBuZWdhdGVkIH0sIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgeWVhcnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgeWVhcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnllYXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBxdWFydGVycy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBxdWFydGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMucXVhcnRlcnMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vbnRocy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtb250aHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1vbnRocyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2Vla3NcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMud2Vla3MgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRheXMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuZGF5cyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaG91cnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgaG91cnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmhvdXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaW51dGVzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbnV0ZXMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY29uZHMuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5zZWNvbmRzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBtaWxsaXNlY29uZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbGxpc2Vjb25kcyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRHVyYXRpb24gaXMgaW52YWxpZC4gSW52YWxpZCBkdXJhdGlvbnMgYXJlIHJldHVybmVkIGJ5IGRpZmYgb3BlcmF0aW9uc1xuICAgKiBvbiBpbnZhbGlkIERhdGVUaW1lcyBvciBJbnRlcnZhbHMuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEdXJhdGlvbiBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRHVyYXRpb24gaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIER1cmF0aW9ucyBhcmUgZXF1YWwgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSB1bml0cyBhbmQgdGhlIHNhbWUgdmFsdWVzIGZvciBlYWNoIHVuaXQuXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcSh2MSwgdjIpIHtcbiAgICAgIC8vIENvbnNpZGVyIDAgYW5kIHVuZGVmaW5lZCBhcyBlcXVhbFxuICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQgfHwgdjEgPT09IDApIHJldHVybiB2MiA9PT0gdW5kZWZpbmVkIHx8IHYyID09PSAwO1xuICAgICAgcmV0dXJuIHYxID09PSB2MjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHUgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAoIWVxKHRoaXMudmFsdWVzW3VdLCBvdGhlci52YWx1ZXNbdV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgRGF0ZVRpbWUsIHsgZnJpZW5kbHlEYXRlVGltZSB9IGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIEludmFsaWRJbnRlcnZhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBJbnRlcnZhbFwiO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0XCIpO1xuICB9IGVsc2UgaWYgKCFlbmQgfHwgIWVuZC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgZW5kXCIpO1xuICB9IGVsc2UgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXG4gICAgICBcImVuZCBiZWZvcmUgc3RhcnRcIixcbiAgICAgIGBUaGUgZW5kIG9mIGFuIGludGVydmFsIG11c3QgYmUgYWZ0ZXIgaXRzIHN0YXJ0LCBidXQgeW91IGhhZCBzdGFydD0ke3N0YXJ0LnRvSVNPKCl9IGFuZCBlbmQ9JHtlbmQudG9JU08oKX1gXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIEludGVydmFsOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNmcm9tRGF0ZVRpbWVzfSwge0BsaW5rIEludGVydmFsI2FmdGVyfSwge0BsaW5rIEludGVydmFsI2JlZm9yZX0sIG9yIHtAbGluayBJbnRlcnZhbCNmcm9tSVNPfS5cbiAqICogKipBY2Nlc3NvcnMqKiBVc2Uge0BsaW5rIEludGVydmFsI3N0YXJ0fSBhbmQge0BsaW5rIEludGVydmFsI2VuZH0gdG8gZ2V0IHRoZSBzdGFydCBhbmQgZW5kLlxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNjb3VudH0sIHtAbGluayBJbnRlcnZhbCNsZW5ndGh9LCB7QGxpbmsgSW50ZXJ2YWwjaGFzU2FtZX0sIHtAbGluayBJbnRlcnZhbCNjb250YWluc30sIHtAbGluayBJbnRlcnZhbCNpc0FmdGVyfSwgb3Ige0BsaW5rIEludGVydmFsI2lzQmVmb3JlfS5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIEludGVydmFsI3NldH0sIHtAbGluayBJbnRlcnZhbCNzcGxpdEF0fSwge0BsaW5rIEludGVydmFsI3NwbGl0Qnl9LCB7QGxpbmsgSW50ZXJ2YWwjZGl2aWRlRXF1YWxseX0sIHtAbGluayBJbnRlcnZhbCNtZXJnZX0sIHtAbGluayBJbnRlcnZhbCN4b3J9LCB7QGxpbmsgSW50ZXJ2YWwjdW5pb259LCB7QGxpbmsgSW50ZXJ2YWwjaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIEludGVydmFsI2RpZmZlcmVuY2V9LlxuICogKiAqKkNvbXBhcmlzb24qKiBUbyBjb21wYXJlIHRoaXMgSW50ZXJ2YWwgdG8gYW5vdGhlciBvbmUsIHVzZSB7QGxpbmsgSW50ZXJ2YWwjZXF1YWxzfSwge0BsaW5rIEludGVydmFsI292ZXJsYXBzfSwge0BsaW5rIEludGVydmFsI2FidXRzU3RhcnR9LCB7QGxpbmsgSW50ZXJ2YWwjYWJ1dHNFbmR9LCB7QGxpbmsgSW50ZXJ2YWwjZW5ndWxmc31cbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBJbnRlcnZhbCBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBJbnRlcnZhbCN0b1N0cmluZ30sIHtAbGluayBJbnRlcnZhbCN0b0lTT30sIHtAbGluayBJbnRlcnZhbCN0b0lTT0RhdGV9LCB7QGxpbmsgSW50ZXJ2YWwjdG9JU09UaW1lfSwge0BsaW5rIEludGVydmFsI3RvRm9ybWF0fSwgYW5kIHtAbGluayBJbnRlcnZhbCN0b0R1cmF0aW9ufS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWwge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkIHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uSW50ZXJ2YWwgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBJbnRlcnZhbCBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGVydmFsKHsgaW52YWxpZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJ1aWx0U3RhcnQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KSxcbiAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuXG4gICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IHZhbGlkYXRlU3RhcnRFbmQoYnVpbHRTdGFydCwgYnVpbHRFbmQpO1xuXG4gICAgaWYgKHZhbGlkYXRlRXJyb3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIHN0YXJ0OiBidWlsdFN0YXJ0LFxuICAgICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhIHN0YXJ0IERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCB0by5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tRHVyYXRpb25MaWtlKGR1cmF0aW9uKSxcbiAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGJlZm9yZShlbmQsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgZHVyID0gRHVyYXRpb24uZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbiksXG4gICAgICBkdCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdC5taW51cyhkdXIpLCBkdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxuICAgKiBBY2NlcHRzIGA8c3RhcnQ+LzxlbmQ+YCwgYDxzdGFydD4vPGR1cmF0aW9uPmAsIGFuZCBgPGR1cmF0aW9uPi88ZW5kPmAgZm9ybWF0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZSNmcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24jZnJvbUlTT31cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcywgZV0gPSAodGV4dCB8fCBcIlwiKS5zcGxpdChcIi9cIiwgMik7XG4gICAgaWYgKHMgJiYgZSkge1xuICAgICAgbGV0IHN0YXJ0LCBzdGFydElzVmFsaWQ7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyk7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IHN0YXJ0LmlzVmFsaWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgZW5kLCBlbmRJc1ZhbGlkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcbiAgICAgICAgZW5kSXNWYWxpZCA9IGVuZC5pc1ZhbGlkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlbmRJc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydElzVmFsaWQgJiYgZW5kSXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCwgZW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0SXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYWZ0ZXIoc3RhcnQsIGR1cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW5kSXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKHMsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYmVmb3JlKGVuZCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0ludGVydmFsKG8pIHtcbiAgICByZXR1cm4gKG8gJiYgby5pc0x1eG9uSW50ZXJ2YWwpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgc3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMucyA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgbWVhbmluZyB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkUmVhc29uID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIEludGVydmFsIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIHJldHVybiB0aGUgbGVuZ3RoIGluLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBsZW5ndGgodW5pdCA9IFwibWlsbGlzZWNvbmRzXCIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0R1cmF0aW9uKC4uLlt1bml0XSkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxuICAgKiBVbmxpa2Uge0BsaW5rIEludGVydmFsI2xlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGNvdW50KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBOYU47XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICBlbmQgPSB0aGlzLmVuZC5zdGFydE9mKHVuaXQpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCkpICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGFuZCBlbmQgYXJlIGJvdGggaW4gdGhlIHNhbWUgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZSh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucywgdW5pdCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQmVmb3JlKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5lIDw9IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0c1wiIHRoZSBzdGFydCBhbmQvb3IgZW5kIGRhdGVzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gdmFsdWVzLmVuZCAtIHRoZSBlbmRpbmcgRGF0ZVRpbWVcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzZXQoeyBzdGFydCwgZW5kIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgYXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIERhdGVUaW1lc1xuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHNwbGl0QXQoLi4uZGF0ZVRpbWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICBjb25zdCBzb3J0ZWQgPSBkYXRlVGltZXNcbiAgICAgICAgLm1hcChmcmllbmRseURhdGVUaW1lKVxuICAgICAgICAuZmlsdGVyKChkKSA9PiB0aGlzLmNvbnRhaW5zKGQpKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpID0gMDtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gc21hbGxlciBJbnRlcnZhbHMsIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gICAqIExlZnQgb3ZlciB0aW1lIGlzIGdyb3VwZWQgaW50byBhIHNtYWxsZXIgaW50ZXJ2YWxcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3BsaXRCeShkdXJhdGlvbikge1xuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIWR1ci5pc1ZhbGlkIHx8IGR1ci5hcyhcIm1pbGxpc2Vjb25kc1wiKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpZHggPSAxLFxuICAgICAgbmV4dDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLnN0YXJ0LnBsdXMoZHVyLm1hcFVuaXRzKCh4KSA9PiB4ICogaWR4KSk7XG4gICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIGRpdmlkZUVxdWFsbHkobnVtYmVyT2ZQYXJ0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpIC8gbnVtYmVyT2ZQYXJ0cykuc2xpY2UoMCwgbnVtYmVyT2ZQYXJ0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIG92ZXJsYXBzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZSA+IG90aGVyLnMgJiYgdGhpcy5zIDwgb3RoZXIuZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBzdGFydC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzU3RhcnQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArdGhpcy5lID09PSArb3RoZXIucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLmVxdWFscyhvdGhlci5zKSAmJiB0aGlzLmUuZXF1YWxzKG90aGVyLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgbWVhbmluZywgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID49IGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBzID0gdGhpcy5zIDwgb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgYW4gYXJyYXkgb2YgSW50ZXJ2YWxzIGludG8gYSBlcXVpdmFsZW50IG1pbmltYWwgc2V0IG9mIEludGVydmFscy5cbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cbiAgICogQHBhcmFtIHtBcnJheX0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIG1lcmdlKGludGVydmFscykge1xuICAgIGNvbnN0IFtmb3VuZCwgZmluYWxdID0gaW50ZXJ2YWxzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5zIC0gYi5zKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKFtzb2ZhciwgY3VycmVudF0sIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGN1cnJlbnQudW5pb24oaXRlbSldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtbXSwgbnVsbF1cbiAgICAgICk7XG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBpbnRlcnZhbHNcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgeG9yKGludGVydmFscykge1xuICAgIGxldCBzdGFydCA9IG51bGwsXG4gICAgICBjdXJyZW50Q291bnQgPSAwO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXSxcbiAgICAgIGVuZHMgPSBpbnRlcnZhbHMubWFwKChpKSA9PiBbXG4gICAgICAgIHsgdGltZTogaS5zLCB0eXBlOiBcInNcIiB9LFxuICAgICAgICB7IHRpbWU6IGkuZSwgdHlwZTogXCJlXCIgfSxcbiAgICAgIF0pLFxuICAgICAgZmxhdHRlbmVkID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi5lbmRzKSxcbiAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGFycikge1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBzcGFuIG9mIHRpbWUgaW4gdGhpcyBJbnRlcnZhbCB0aGF0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgc3BlY2lmaWVkIEludGVydmFscy5cbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgZGlmZmVyZW5jZSguLi5pbnRlcnZhbHMpIHtcbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSlcbiAgICAgIC5tYXAoKGkpID0+IHRoaXMuaW50ZXJzZWN0aW9uKGkpKVxuICAgICAgLmZpbHRlcigoaSkgPT4gaSAmJiAhaS5pc0VtcHR5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnMudG9JU08oKX0gXHUyMDEzICR7dGhpcy5lLnRvSVNPKCl9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08ob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPKG9wdHMpfS8ke3RoaXMuZS50b0lTTyhvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkYXRlIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSB0aW1lIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09EYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSBkYXRlIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0lTT1RpbWUob3B0cyl9LyR7dGhpcy5lLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVGb3JtYXQgLSB0aGUgZm9ybWF0IHN0cmluZy4gVGhpcyBzdHJpbmcgZm9ybWF0cyB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lLiBTZWUge0BsaW5rIERhdGVUaW1lI3RvRm9ybWF0fSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyBcdTIwMTMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChkYXRlRm9ybWF0LCB7IHNlcGFyYXRvciA9IFwiIFx1MjAxMyBcIiB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KX0ke3NlcGFyYXRvcn0ke3RoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIER1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSBzcGFubmVkIGJ5IHRoaXMgaW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQuODIwOTUgfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gbWFwRm4gb24gdGhlIGludGVydmFsIHN0YXJ0IGFuZCBlbmQsIHJldHVybmluZyBhIG5ldyBJbnRlcnZhbCBmcm9tIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1hcEZuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS5tYXBFbmRwb2ludHMoZW5kcG9pbnQgPT4gZW5kcG9pbnQudG9VVEMoKSlcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikubWFwRW5kcG9pbnRzKGVuZHBvaW50ID0+IGVuZHBvaW50LnBsdXMoeyBob3VyczogMiB9KSlcbiAgICovXG4gIG1hcEVuZHBvaW50cyhtYXBGbikge1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKG1hcEZuKHRoaXMucyksIG1hcEZuKHRoaXMuZSkpO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxuaW1wb3J0IHsgaGFzUmVsYXRpdmUgfSBmcm9tIFwiLi9pbXBsL3V0aWwuanNcIjtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmZvIHtcbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGhhc0RTVCh6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmUpIHtcbiAgICBjb25zdCBwcm90byA9IERhdGVUaW1lLm5vdygpLnNldFpvbmUoem9uZSkuc2V0KHsgbW9udGg6IDEyIH0pO1xuXG4gICAgcmV0dXJuICF6b25lLmlzVW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHsgbW9udGg6IDYgfSkub2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBpbnB1dCBpbnRvIGEge0BsaW5rIFpvbmV9IGluc3RhbmNlLlxuICAgKlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYWxyZWFkeSBhIFpvbmUgaW5zdGFuY2UsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICogKiBJZiBgaW5wdXRgIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2YWxpZCB0aW1lIHpvbmUgbmFtZSwgYSBab25lIGluc3RhbmNlXG4gICAqICAgd2l0aCB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBhIHN0cmluZyB0aGF0IGRvZXNuJ3QgcmVmZXIgdG8gYSBrbm93biB0aW1lIHpvbmUsIGEgWm9uZVxuICAgKiAgIGluc3RhbmNlIHdpdGgge0BsaW5rIFpvbmUjaXNWYWxpZH0gPT0gZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0IGlzIGEgbnVtYmVyLCBhIFpvbmUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZpeGVkIG9mZnNldFxuICAgKiAgIGluIG1pbnV0ZXMgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBkZWZhdWx0IHpvbmUgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV8bnVtYmVyfSBbaW5wdXRdIC0gdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtab25lfVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVpvbmUoaW5wdXQpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplWm9uZShpbnB1dCwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoKVswXSAvLz0+ICdKYW51YXJ5J1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJylbMF0gLy89PiAnMSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSApWzBdIC8vPT4gJ2phbnYuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ1x1MDY2MSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiaVx1MDJCQiBJJ1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyBtb250aHMoXG4gICAgbGVuZ3RoID0gXCJsb25nXCIsXG4gICAgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsLCBvdXRwdXRDYWxlbmRhciA9IFwiZ3JlZ29yeVwiIH0gPSB7fVxuICApIHtcbiAgICByZXR1cm4gKGxvY09iaiB8fCBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikpLm1vbnRocyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgSW5mbyNtb250aHN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbW9udGhzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCwgb3V0cHV0Q2FsZW5kYXIgPSBcImdyZWdvcnlcIiB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSB3ZWVrZGF5IHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JylbMF0gLy89PiAnTW9uJ1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0pWzBdIC8vPT4gJ2x1bi4nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAnXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjJCXHUwNjQ2XHUwNjRBXHUwNjQ2J1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyB3ZWVrZGF5cyhsZW5ndGggPSBcImxvbmdcIiwgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiAobG9jT2JqIHx8IExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgd2VlayBuYW1lcy5cbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIEluZm8jd2Vla2RheXN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT1udWxsXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIHdlZWtkYXlzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIG1lcmlkaWVtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKCkgLy89PiBbICdBTScsICdQTScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcyh7IGxvY2FsZTogJ215JyB9KSAvLz0+IFsgJ1x1MTAxNFx1MTAzNlx1MTAxNFx1MTAwMFx1MTAzQScsICdcdTEwMEFcdTEwMTRcdTEwMzEnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbWVyaWRpZW1zKHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycpIC8vPT4gWyAnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IEpcdTAwRTlzdXMtQ2hyaXN0JywgJ2Fwclx1MDBFOHMgSlx1MDBFOXN1cy1DaHJpc3QnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgZXJhcyhsZW5ndGggPSBcInNob3J0XCIsIHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bGwsIFwiZ3JlZ29yeVwiKS5lcmFzKGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCByZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmcgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLiBVc2UgdGhpcyBmdW5jdGlvbiB0byBmaWd1cmUgb3V0IGlmIHRoYXQncyB0aGUgY2FzZS5cbiAgICogS2V5czpcbiAgICogKiBgcmVsYXRpdmVgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgcmVsYXRpdmUgdGltZSBmb3JtYXR0aW5nXG4gICAqIEBleGFtcGxlIEluZm8uZmVhdHVyZXMoKSAvLz0+IHsgcmVsYXRpdmU6IGZhbHNlIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGZlYXR1cmVzKCkge1xuICAgIHJldHVybiB7IHJlbGF0aXZlOiBoYXNSZWxhdGl2ZSgpIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4uL2R1cmF0aW9uLmpzXCI7XG5cbmZ1bmN0aW9uIGRheURpZmYoZWFybGllciwgbGF0ZXIpIHtcbiAgY29uc3QgdXRjRGF5U3RhcnQgPSAoZHQpID0+IGR0LnRvVVRDKDAsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KS5zdGFydE9mKFwiZGF5XCIpLnZhbHVlT2YoKSxcbiAgICBtcyA9IHV0Y0RheVN0YXJ0KGxhdGVyKSAtIHV0Y0RheVN0YXJ0KGVhcmxpZXIpO1xuICByZXR1cm4gTWF0aC5mbG9vcihEdXJhdGlvbi5mcm9tTWlsbGlzKG1zKS5hcyhcImRheXNcIikpO1xufVxuXG5mdW5jdGlvbiBoaWdoT3JkZXJEaWZmcyhjdXJzb3IsIGxhdGVyLCB1bml0cykge1xuICBjb25zdCBkaWZmZXJzID0gW1xuICAgIFtcInllYXJzXCIsIChhLCBiKSA9PiBiLnllYXIgLSBhLnllYXJdLFxuICAgIFtcInF1YXJ0ZXJzXCIsIChhLCBiKSA9PiBiLnF1YXJ0ZXIgLSBhLnF1YXJ0ZXJdLFxuICAgIFtcIm1vbnRoc1wiLCAoYSwgYikgPT4gYi5tb250aCAtIGEubW9udGggKyAoYi55ZWFyIC0gYS55ZWFyKSAqIDEyXSxcbiAgICBbXG4gICAgICBcIndlZWtzXCIsXG4gICAgICAoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICAgICAgcmV0dXJuIChkYXlzIC0gKGRheXMgJSA3KSkgLyA3O1xuICAgICAgfSxcbiAgICBdLFxuICAgIFtcImRheXNcIiwgZGF5RGlmZl0sXG4gIF07XG5cbiAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICBsZXQgbG93ZXN0T3JkZXIsIGhpZ2hXYXRlcjtcblxuICBmb3IgKGNvbnN0IFt1bml0LCBkaWZmZXJdIG9mIGRpZmZlcnMpIHtcbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG5cbiAgICAgIGxldCBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHsgW3VuaXRdOiBkZWx0YSB9KTtcblxuICAgICAgaWYgKGhpZ2hXYXRlciA+IGxhdGVyKSB7XG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5wbHVzKHsgW3VuaXRdOiBkZWx0YSAtIDEgfSk7XG4gICAgICAgIGRlbHRhIC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXI7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdHNbdW5pdF0gPSBkZWx0YTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2N1cnNvciwgcmVzdWx0cywgaGlnaFdhdGVyLCBsb3dlc3RPcmRlcl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpIHtcbiAgbGV0IFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdID0gaGlnaE9yZGVyRGlmZnMoZWFybGllciwgbGF0ZXIsIHVuaXRzKTtcblxuICBjb25zdCByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcblxuICBjb25zdCBsb3dlck9yZGVyVW5pdHMgPSB1bml0cy5maWx0ZXIoXG4gICAgKHUpID0+IFtcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIl0uaW5kZXhPZih1KSA+PSAwXG4gICk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHsgW2xvd2VzdE9yZGVyXTogMSB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZHVyYXRpb24gPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHJlc3VsdHMsIG9wdHMpO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tTWlsbGlzKHJlbWFpbmluZ01pbGxpcywgb3B0cylcbiAgICAgIC5zaGlmdFRvKC4uLmxvd2VyT3JkZXJVbml0cylcbiAgICAgIC5wbHVzKGR1cmF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH1cbn1cbiIsICJjb25zdCBudW1iZXJpbmdTeXN0ZW1zID0ge1xuICBhcmFiOiBcIltcXHUwNjYwLVxcdTA2NjldXCIsXG4gIGFyYWJleHQ6IFwiW1xcdTA2RjAtXFx1MDZGOV1cIixcbiAgYmFsaTogXCJbXFx1MUI1MC1cXHUxQjU5XVwiLFxuICBiZW5nOiBcIltcXHUwOUU2LVxcdTA5RUZdXCIsXG4gIGRldmE6IFwiW1xcdTA5NjYtXFx1MDk2Rl1cIixcbiAgZnVsbHdpZGU6IFwiW1xcdUZGMTAtXFx1RkYxOV1cIixcbiAgZ3VqcjogXCJbXFx1MEFFNi1cXHUwQUVGXVwiLFxuICBoYW5pZGVjOiBcIltcdTMwMDd8XHU0RTAwfFx1NEU4Q3xcdTRFMDl8XHU1NkRCfFx1NEU5NHxcdTUxNkR8XHU0RTAzfFx1NTE2QnxcdTRFNURdXCIsXG4gIGtobXI6IFwiW1xcdTE3RTAtXFx1MTdFOV1cIixcbiAga25kYTogXCJbXFx1MENFNi1cXHUwQ0VGXVwiLFxuICBsYW9vOiBcIltcXHUwRUQwLVxcdTBFRDldXCIsXG4gIGxpbWI6IFwiW1xcdTE5NDYtXFx1MTk0Rl1cIixcbiAgbWx5bTogXCJbXFx1MEQ2Ni1cXHUwRDZGXVwiLFxuICBtb25nOiBcIltcXHUxODEwLVxcdTE4MTldXCIsXG4gIG15bXI6IFwiW1xcdTEwNDAtXFx1MTA0OV1cIixcbiAgb3J5YTogXCJbXFx1MEI2Ni1cXHUwQjZGXVwiLFxuICB0YW1sZGVjOiBcIltcXHUwQkU2LVxcdTBCRUZdXCIsXG4gIHRlbHU6IFwiW1xcdTBDNjYtXFx1MEM2Rl1cIixcbiAgdGhhaTogXCJbXFx1MEU1MC1cXHUwRTU5XVwiLFxuICB0aWJ0OiBcIltcXHUwRjIwLVxcdTBGMjldXCIsXG4gIGxhdG46IFwiXFxcXGRcIixcbn07XG5cbmNvbnN0IG51bWJlcmluZ1N5c3RlbXNVVEYxNiA9IHtcbiAgYXJhYjogWzE2MzIsIDE2NDFdLFxuICBhcmFiZXh0OiBbMTc3NiwgMTc4NV0sXG4gIGJhbGk6IFs2OTkyLCA3MDAxXSxcbiAgYmVuZzogWzI1MzQsIDI1NDNdLFxuICBkZXZhOiBbMjQwNiwgMjQxNV0sXG4gIGZ1bGx3aWRlOiBbNjUyOTYsIDY1MzAzXSxcbiAgZ3VqcjogWzI3OTAsIDI3OTldLFxuICBraG1yOiBbNjExMiwgNjEyMV0sXG4gIGtuZGE6IFszMzAyLCAzMzExXSxcbiAgbGFvbzogWzM3OTIsIDM4MDFdLFxuICBsaW1iOiBbNjQ3MCwgNjQ3OV0sXG4gIG1seW06IFszNDMwLCAzNDM5XSxcbiAgbW9uZzogWzYxNjAsIDYxNjldLFxuICBteW1yOiBbNDE2MCwgNDE2OV0sXG4gIG9yeWE6IFsyOTE4LCAyOTI3XSxcbiAgdGFtbGRlYzogWzMwNDYsIDMwNTVdLFxuICB0ZWx1OiBbMzE3NCwgMzE4M10sXG4gIHRoYWk6IFszNjY0LCAzNjczXSxcbiAgdGlidDogWzM4NzIsIDM4ODFdLFxufTtcblxuY29uc3QgaGFuaWRlY0NoYXJzID0gbnVtYmVyaW5nU3lzdGVtcy5oYW5pZGVjLnJlcGxhY2UoL1tcXFt8XFxdXS9nLCBcIlwiKS5zcGxpdChcIlwiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGlnaXRzKHN0cikge1xuICBsZXQgdmFsdWUgPSBwYXJzZUludChzdHIsIDEwKTtcbiAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgIHZhbHVlID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICBpZiAoc3RyW2ldLnNlYXJjaChudW1iZXJpbmdTeXN0ZW1zLmhhbmlkZWMpICE9PSAtMSkge1xuICAgICAgICB2YWx1ZSArPSBoYW5pZGVjQ2hhcnMuaW5kZXhPZihzdHJbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbnVtYmVyaW5nU3lzdGVtc1VURjE2KSB7XG4gICAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IG51bWJlcmluZ1N5c3RlbXNVVEYxNltrZXldO1xuICAgICAgICAgIGlmIChjb2RlID49IG1pbiAmJiBjb2RlIDw9IG1heCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gY29kZSAtIG1pbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWdpdFJlZ2V4KHsgbnVtYmVyaW5nU3lzdGVtIH0sIGFwcGVuZCA9IFwiXCIpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYCR7bnVtYmVyaW5nU3lzdGVtc1tudW1iZXJpbmdTeXN0ZW0gfHwgXCJsYXRuXCJdfSR7YXBwZW5kfWApO1xufVxuIiwgImltcG9ydCB7IHBhcnNlTWlsbGlzLCBpc1VuZGVmaW5lZCwgdW50cnVuY2F0ZVllYXIsIHNpZ25lZE9mZnNldCwgaGFzT3duUHJvcGVydHkgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgRm9ybWF0dGVyIGZyb20gXCIuL2Zvcm1hdHRlci5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgSUFOQVpvbmUgZnJvbSBcIi4uL3pvbmVzL0lBTkFab25lLmpzXCI7XG5pbXBvcnQgRGF0ZVRpbWUgZnJvbSBcIi4uL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgeyBkaWdpdFJlZ2V4LCBwYXJzZURpZ2l0cyB9IGZyb20gXCIuL2RpZ2l0cy5qc1wiO1xuaW1wb3J0IHsgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbmNvbnN0IE1JU1NJTkdfRlRQID0gXCJtaXNzaW5nIEludGwuRGF0ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0cyBzdXBwb3J0XCI7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgsIHBvc3QgPSAoaSkgPT4gaSkge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbc10pID0+IHBvc3QocGFyc2VEaWdpdHMocykpIH07XG59XG5cbmNvbnN0IE5CU1AgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XG5jb25zdCBzcGFjZU9yTkJTUCA9IGAoIHwke05CU1B9KWA7XG5jb25zdCBzcGFjZU9yTkJTUFJlZ0V4cCA9IG5ldyBSZWdFeHAoc3BhY2VPck5CU1AsIFwiZ1wiKTtcblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIC8vIG1ha2Ugc3BhY2UgYW5kIG5vbiBicmVha2FibGUgc3BhY2UgY2hhcmFjdGVycyBpbnRlcmNoYW5nZWFibGVcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuL2csIFwiXFxcXC4/XCIpLnJlcGxhY2Uoc3BhY2VPck5CU1BSZWdFeHAsIHNwYWNlT3JOQlNQKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykge1xuICByZXR1cm4gc1xuICAgIC5yZXBsYWNlKC9cXC4vZywgXCJcIikgLy8gaWdub3JlIGRvdHMgdGhhdCB3ZXJlIG1hZGUgb3B0aW9uYWxcbiAgICAucmVwbGFjZShzcGFjZU9yTkJTUFJlZ0V4cCwgXCIgXCIpIC8vIGludGVyY2hhbmdlIHNwYWNlIGFuZCBuYnNwXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG9uZU9mKHN0cmluZ3MsIHN0YXJ0SW5kZXgpIHtcbiAgaWYgKHN0cmluZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IFJlZ0V4cChzdHJpbmdzLm1hcChmaXhMaXN0UmVnZXgpLmpvaW4oXCJ8XCIpKSxcbiAgICAgIGRlc2VyOiAoW3NdKSA9PlxuICAgICAgICBzdHJpbmdzLmZpbmRJbmRleCgoaSkgPT4gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykgPT09IHN0cmlwSW5zZW5zaXRpdml0aWVzKGkpKSArIHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXQocmVnZXgsIGdyb3Vwcykge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbLCBoLCBtXSkgPT4gc2lnbmVkT2Zmc2V0KGgsIG0pLCBncm91cHMgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7IHJlZ2V4LCBkZXNlcjogKFtzXSkgPT4gcyB9O1xufVxuXG5mdW5jdGlvbiBlc2NhcGVUb2tlbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW1xcLVxcW1xcXXt9KCkqKz8uLFxcXFxcXF4kfCNcXHNdL2csIFwiXFxcXCQmXCIpO1xufVxuXG5mdW5jdGlvbiB1bml0Rm9yVG9rZW4odG9rZW4sIGxvYykge1xuICBjb25zdCBvbmUgPSBkaWdpdFJlZ2V4KGxvYyksXG4gICAgdHdvID0gZGlnaXRSZWdleChsb2MsIFwiezJ9XCIpLFxuICAgIHRocmVlID0gZGlnaXRSZWdleChsb2MsIFwiezN9XCIpLFxuICAgIGZvdXIgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7NH1cIiksXG4gICAgc2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezZ9XCIpLFxuICAgIG9uZU9yVHdvID0gZGlnaXRSZWdleChsb2MsIFwiezEsMn1cIiksXG4gICAgb25lVG9UaHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDN9XCIpLFxuICAgIG9uZVRvU2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezEsNn1cIiksXG4gICAgb25lVG9OaW5lID0gZGlnaXRSZWdleChsb2MsIFwiezEsOX1cIiksXG4gICAgdHdvVG9Gb3VyID0gZGlnaXRSZWdleChsb2MsIFwiezIsNH1cIiksXG4gICAgZm91clRvU2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezQsNn1cIiksXG4gICAgbGl0ZXJhbCA9ICh0KSA9PiAoeyByZWdleDogUmVnRXhwKGVzY2FwZVRva2VuKHQudmFsKSksIGRlc2VyOiAoW3NdKSA9PiBzLCBsaXRlcmFsOiB0cnVlIH0pLFxuICAgIHVuaXRhdGUgPSAodCkgPT4ge1xuICAgICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHQudmFsKSB7XG4gICAgICAgIC8vIGVyYVxuICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcInNob3J0XCIsIGZhbHNlKSwgMCk7XG4gICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcImxvbmdcIiwgZmFsc2UpLCAwKTtcbiAgICAgICAgLy8geWVhcnNcbiAgICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1NpeCk7XG4gICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgICBjYXNlIFwieXl5eXlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyVG9TaXgpO1xuICAgICAgICBjYXNlIFwieXl5eXl5XCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQoc2l4KTtcbiAgICAgICAgLy8gbW9udGhzXG4gICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwibG9uZ1wiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICAvLyBkYXRlc1xuICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgLy8gb3JkaW5hbHNcbiAgICAgICAgY2FzZSBcIm9cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcbiAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcbiAgICAgICAgLy8gdGltZVxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiSFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgcmV0dXJuIHNpbXBsZShvbmVUb05pbmUpO1xuICAgICAgICBjYXNlIFwidXVcIjpcbiAgICAgICAgICByZXR1cm4gc2ltcGxlKG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInV1dVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZSk7XG4gICAgICAgIC8vIG1lcmlkaWVtXG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tZXJpZGllbXMoKSwgMCk7XG4gICAgICAgIC8vIHdlZWtZZWFyIChrKVxuICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcbiAgICAgICAgLy8gd2Vla051bWJlciAoVylcbiAgICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIC8vIHdlZWtkYXlzXG4gICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lKTtcbiAgICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAgIC8vIG9mZnNldC96b25lXG4gICAgICAgIGNhc2UgXCJaXCI6XG4gICAgICAgIGNhc2UgXCJaWlwiOlxuICAgICAgICAgIHJldHVybiBvZmZzZXQobmV3IFJlZ0V4cChgKFsrLV0ke29uZU9yVHdvLnNvdXJjZX0pKD86Oigke3R3by5zb3VyY2V9KSk/YCksIDIpO1xuICAgICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgICAgcmV0dXJuIG9mZnNldChuZXcgUmVnRXhwKGAoWystXSR7b25lT3JUd28uc291cmNlfSkoJHt0d28uc291cmNlfSk/YCksIDIpO1xuICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IFpaWlogKFBTVCkgb3IgWlpaWlogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSkgaW4gcGFyc2luZ1xuICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYW55IHdheSB0byBmaWd1cmUgb3V0IHdoYXQgdGhleSBhcmVcbiAgICAgICAgY2FzZSBcInpcIjpcbiAgICAgICAgICByZXR1cm4gc2ltcGxlKC9bYS16XystL117MSwyNTZ9Py9pKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbGl0ZXJhbCh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIGNvbnN0IHVuaXQgPSB1bml0YXRlKHRva2VuKSB8fCB7XG4gICAgaW52YWxpZFJlYXNvbjogTUlTU0lOR19GVFAsXG4gIH07XG5cbiAgdW5pdC50b2tlbiA9IHRva2VuO1xuXG4gIHJldHVybiB1bml0O1xufVxuXG5jb25zdCBwYXJ0VHlwZVN0eWxlVG9Ub2tlblZhbCA9IHtcbiAgeWVhcjoge1xuICAgIFwiMi1kaWdpdFwiOiBcInl5XCIsXG4gICAgbnVtZXJpYzogXCJ5eXl5eVwiLFxuICB9LFxuICBtb250aDoge1xuICAgIG51bWVyaWM6IFwiTVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIk1NXCIsXG4gICAgc2hvcnQ6IFwiTU1NXCIsXG4gICAgbG9uZzogXCJNTU1NXCIsXG4gIH0sXG4gIGRheToge1xuICAgIG51bWVyaWM6IFwiZFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImRkXCIsXG4gIH0sXG4gIHdlZWtkYXk6IHtcbiAgICBzaG9ydDogXCJFRUVcIixcbiAgICBsb25nOiBcIkVFRUVcIixcbiAgfSxcbiAgZGF5cGVyaW9kOiBcImFcIixcbiAgZGF5UGVyaW9kOiBcImFcIixcbiAgaG91cjoge1xuICAgIG51bWVyaWM6IFwiaFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImhoXCIsXG4gIH0sXG4gIG1pbnV0ZToge1xuICAgIG51bWVyaWM6IFwibVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIm1tXCIsXG4gIH0sXG4gIHNlY29uZDoge1xuICAgIG51bWVyaWM6IFwic1wiLFxuICAgIFwiMi1kaWdpdFwiOiBcInNzXCIsXG4gIH0sXG59O1xuXG5mdW5jdGlvbiB0b2tlbkZvclBhcnQocGFydCwgbG9jYWxlLCBmb3JtYXRPcHRzKSB7XG4gIGNvbnN0IHsgdHlwZSwgdmFsdWUgfSA9IHBhcnQ7XG5cbiAgaWYgKHR5cGUgPT09IFwibGl0ZXJhbFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IHRydWUsXG4gICAgICB2YWw6IHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBzdHlsZSA9IGZvcm1hdE9wdHNbdHlwZV07XG5cbiAgbGV0IHZhbCA9IHBhcnRUeXBlU3R5bGVUb1Rva2VuVmFsW3R5cGVdO1xuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikge1xuICAgIHZhbCA9IHZhbFtzdHlsZV07XG4gIH1cblxuICBpZiAodmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgdmFsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlZ2V4KHVuaXRzKSB7XG4gIGNvbnN0IHJlID0gdW5pdHMubWFwKCh1KSA9PiB1LnJlZ2V4KS5yZWR1Y2UoKGYsIHIpID0+IGAke2Z9KCR7ci5zb3VyY2V9KWAsIFwiXCIpO1xuICByZXR1cm4gW2BeJHtyZX0kYCwgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaChyZWdleCk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb25zdCBhbGwgPSB7fTtcbiAgICBsZXQgbWF0Y2hJbmRleCA9IDE7XG4gICAgZm9yIChjb25zdCBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkoaGFuZGxlcnMsIGkpKSB7XG4gICAgICAgIGNvbnN0IGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICBncm91cHMgPSBoLmdyb3VwcyA/IGguZ3JvdXBzICsgMSA6IDE7XG4gICAgICAgIGlmICghaC5saXRlcmFsICYmIGgudG9rZW4pIHtcbiAgICAgICAgICBhbGxbaC50b2tlbi52YWxbMF1dID0gaC5kZXNlcihtYXRjaGVzLnNsaWNlKG1hdGNoSW5kZXgsIG1hdGNoSW5kZXggKyBncm91cHMpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaEluZGV4ICs9IGdyb3VwcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFttYXRjaGVzLCBhbGxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbbWF0Y2hlcywge31dO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykge1xuICBjb25zdCB0b0ZpZWxkID0gKHRva2VuKSA9PiB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgcmV0dXJuIFwibWludXRlXCI7XG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gXCJvcmRpbmFsXCI7XG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuIFwibW9udGhcIjtcbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrZGF5XCI7XG4gICAgICBjYXNlIFwiV1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrTnVtYmVyXCI7XG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgcmV0dXJuIFwicXVhcnRlclwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGxldCB6b25lID0gbnVsbDtcbiAgbGV0IHNwZWNpZmljT2Zmc2V0O1xuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gSUFOQVpvbmUuY3JlYXRlKG1hdGNoZXMueik7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuWikpIHtcbiAgICBpZiAoIXpvbmUpIHtcbiAgICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gICAgfVxuICAgIHNwZWNpZmljT2Zmc2V0ID0gbWF0Y2hlcy5aO1xuICB9XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLnEpKSB7XG4gICAgbWF0Y2hlcy5NID0gKG1hdGNoZXMucSAtIDEpICogMyArIDE7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgY29uc3QgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZSgociwgaykgPT4ge1xuICAgIGNvbnN0IGYgPSB0b0ZpZWxkKGspO1xuICAgIGlmIChmKSB7XG4gICAgICByW2ZdID0gbWF0Y2hlc1trXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfSwge30pO1xuXG4gIHJldHVybiBbdmFscywgem9uZSwgc3BlY2lmaWNPZmZzZXRdO1xufVxuXG5sZXQgZHVtbXlEYXRlVGltZUNhY2hlID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0RHVtbXlEYXRlVGltZSgpIHtcbiAgaWYgKCFkdW1teURhdGVUaW1lQ2FjaGUpIHtcbiAgICBkdW1teURhdGVUaW1lQ2FjaGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKDE1NTU1NTU1NTU1NTUpO1xuICB9XG5cbiAgcmV0dXJuIGR1bW15RGF0ZVRpbWVDYWNoZTtcbn1cblxuZnVuY3Rpb24gbWF5YmVFeHBhbmRNYWNyb1Rva2VuKHRva2VuLCBsb2NhbGUpIHtcbiAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBjb25zdCBmb3JtYXRPcHRzID0gRm9ybWF0dGVyLm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHModG9rZW4udmFsKTtcblxuICBpZiAoIWZvcm1hdE9wdHMpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXIgPSBGb3JtYXR0ZXIuY3JlYXRlKGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdERhdGVUaW1lUGFydHMoZ2V0RHVtbXlEYXRlVGltZSgpKTtcblxuICBjb25zdCB0b2tlbnMgPSBwYXJ0cy5tYXAoKHApID0+IHRva2VuRm9yUGFydChwLCBsb2NhbGUsIGZvcm1hdE9wdHMpKTtcblxuICBpZiAodG9rZW5zLmluY2x1ZGVzKHVuZGVmaW5lZCkpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5mdW5jdGlvbiBleHBhbmRNYWNyb1Rva2Vucyh0b2tlbnMsIGxvY2FsZSkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50b2tlbnMubWFwKCh0KSA9PiBtYXliZUV4cGFuZE1hY3JvVG9rZW4odCwgbG9jYWxlKSkpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB0b2tlbnMgPSBleHBhbmRNYWNyb1Rva2VucyhGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm9ybWF0KSwgbG9jYWxlKSxcbiAgICB1bml0cyA9IHRva2Vucy5tYXAoKHQpID0+IHVuaXRGb3JUb2tlbih0LCBsb2NhbGUpKSxcbiAgICBkaXNxdWFsaWZ5aW5nVW5pdCA9IHVuaXRzLmZpbmQoKHQpID0+IHQuaW52YWxpZFJlYXNvbik7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHsgaW5wdXQsIHRva2VucywgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvbiB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtyZWdleFN0cmluZywgaGFuZGxlcnNdID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICByZWdleCA9IFJlZ0V4cChyZWdleFN0cmluZywgXCJpXCIpLFxuICAgICAgW3Jhd01hdGNoZXMsIG1hdGNoZXNdID0gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycyksXG4gICAgICBbcmVzdWx0LCB6b25lLCBzcGVjaWZpY09mZnNldF0gPSBtYXRjaGVzXG4gICAgICAgID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKVxuICAgICAgICA6IFtudWxsLCBudWxsLCB1bmRlZmluZWRdO1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShtYXRjaGVzLCBcImFcIikgJiYgaGFzT3duUHJvcGVydHkobWF0Y2hlcywgXCJIXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXRcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaW5wdXQsIHRva2VucywgcmVnZXgsIHJhd01hdGNoZXMsIG1hdGNoZXMsIHJlc3VsdCwgem9uZSwgc3BlY2lmaWNPZmZzZXQgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB7IHJlc3VsdCwgem9uZSwgc3BlY2lmaWNPZmZzZXQsIGludmFsaWRSZWFzb24gfSA9IGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCk7XG4gIHJldHVybiBbcmVzdWx0LCB6b25lLCBzcGVjaWZpY09mZnNldCwgaW52YWxpZFJlYXNvbl07XG59XG4iLCAiaW1wb3J0IHtcbiAgaW50ZWdlckJldHdlZW4sXG4gIGlzTGVhcFllYXIsXG4gIHRpbWVPYmplY3QsXG4gIGRheXNJblllYXIsXG4gIGRheXNJbk1vbnRoLFxuICB3ZWVrc0luV2Vla1llYXIsXG4gIGlzSW50ZWdlcixcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IEludmFsaWQgZnJvbSBcIi4vaW52YWxpZC5qc1wiO1xuXG5jb25zdCBub25MZWFwTGFkZGVyID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XSxcbiAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIHVuaXRPdXRPZlJhbmdlKHVuaXQsIHZhbHVlKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcbiAgICBcInVuaXQgb3V0IG9mIHJhbmdlXCIsXG4gICAgYHlvdSBzcGVjaWZpZWQgJHt2YWx1ZX0gKG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9KSBhcyBhICR7dW5pdH0sIHdoaWNoIGlzIGludmFsaWRgXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIGNvbnN0IGpzID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKS5nZXRVVENEYXkoKTtcbiAgcmV0dXJuIGpzID09PSAwID8gNyA6IGpzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHJldHVybiBkYXkgKyAoaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyKVttb250aCAtIDFdO1xufVxuXG5mdW5jdGlvbiB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpIHtcbiAgY29uc3QgdGFibGUgPSBpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIsXG4gICAgbW9udGgwID0gdGFibGUuZmluZEluZGV4KChpKSA9PiBpIDwgb3JkaW5hbCksXG4gICAgZGF5ID0gb3JkaW5hbCAtIHRhYmxlW21vbnRoMF07XG4gIHJldHVybiB7IG1vbnRoOiBtb250aDAgKyAxLCBkYXkgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGdyZWdPYmosXG4gICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgIHdlZWtkYXkgPSBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSk7XG5cbiAgbGV0IHdlZWtOdW1iZXIgPSBNYXRoLmZsb29yKChvcmRpbmFsIC0gd2Vla2RheSArIDEwKSAvIDcpLFxuICAgIHdlZWtZZWFyO1xuXG4gIGlmICh3ZWVrTnVtYmVyIDwgMSkge1xuICAgIHdlZWtZZWFyID0geWVhciAtIDE7XG4gICAgd2Vla051bWJlciA9IHdlZWtzSW5XZWVrWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAod2Vla051bWJlciA+IHdlZWtzSW5XZWVrWWVhcih5ZWFyKSkge1xuICAgIHdlZWtZZWFyID0geWVhciArIDE7XG4gICAgd2Vla051bWJlciA9IDE7XG4gIH0gZWxzZSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyO1xuICB9XG5cbiAgcmV0dXJuIHsgd2Vla1llYXIsIHdlZWtOdW1iZXIsIHdlZWtkYXksIC4uLnRpbWVPYmplY3QoZ3JlZ09iaikgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICBjb25zdCB7IHdlZWtZZWFyLCB3ZWVrTnVtYmVyLCB3ZWVrZGF5IH0gPSB3ZWVrRGF0YSxcbiAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICB5ZWFySW5EYXlzID0gZGF5c0luWWVhcih3ZWVrWWVhcik7XG5cbiAgbGV0IG9yZGluYWwgPSB3ZWVrTnVtYmVyICogNyArIHdlZWtkYXkgLSB3ZWVrZGF5T2ZKYW40IC0gMyxcbiAgICB5ZWFyO1xuXG4gIGlmIChvcmRpbmFsIDwgMSkge1xuICAgIHllYXIgPSB3ZWVrWWVhciAtIDE7XG4gICAgb3JkaW5hbCArPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2UgaWYgKG9yZGluYWwgPiB5ZWFySW5EYXlzKSB7XG4gICAgeWVhciA9IHdlZWtZZWFyICsgMTtcbiAgICBvcmRpbmFsIC09IGRheXNJblllYXIod2Vla1llYXIpO1xuICB9IGVsc2Uge1xuICAgIHllYXIgPSB3ZWVrWWVhcjtcbiAgfVxuXG4gIGNvbnN0IHsgbW9udGgsIGRheSB9ID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKTtcbiAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSwgLi4udGltZU9iamVjdCh3ZWVrRGF0YSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGdyZWdEYXRhO1xuICBjb25zdCBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSk7XG4gIHJldHVybiB7IHllYXIsIG9yZGluYWwsIC4uLnRpbWVPYmplY3QoZ3JlZ0RhdGEpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcmRpbmFsVG9HcmVnb3JpYW4ob3JkaW5hbERhdGEpIHtcbiAgY29uc3QgeyB5ZWFyLCBvcmRpbmFsIH0gPSBvcmRpbmFsRGF0YTtcbiAgY29uc3QgeyBtb250aCwgZGF5IH0gPSB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpO1xuICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5LCAuLi50aW1lT2JqZWN0KG9yZGluYWxEYXRhKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW52YWxpZFdlZWtEYXRhKG9iaikge1xuICBjb25zdCB2YWxpZFllYXIgPSBpc0ludGVnZXIob2JqLndlZWtZZWFyKSxcbiAgICB2YWxpZFdlZWsgPSBpbnRlZ2VyQmV0d2VlbihvYmoud2Vla051bWJlciwgMSwgd2Vla3NJbldlZWtZZWFyKG9iai53ZWVrWWVhcikpLFxuICAgIHZhbGlkV2Vla2RheSA9IGludGVnZXJCZXR3ZWVuKG9iai53ZWVrZGF5LCAxLCA3KTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtZZWFyXCIsIG9iai53ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtcIiwgb2JqLndlZWspO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrZGF5XCIsIG9iai53ZWVrZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRPcmRpbmFsRGF0YShvYmopIHtcbiAgY29uc3QgdmFsaWRZZWFyID0gaXNJbnRlZ2VyKG9iai55ZWFyKSxcbiAgICB2YWxpZE9yZGluYWwgPSBpbnRlZ2VyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm9yZGluYWxcIiwgb2JqLm9yZGluYWwpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB7XG4gIGNvbnN0IHZhbGlkWWVhciA9IGlzSW50ZWdlcihvYmoueWVhciksXG4gICAgdmFsaWRNb250aCA9IGludGVnZXJCZXR3ZWVuKG9iai5tb250aCwgMSwgMTIpLFxuICAgIHZhbGlkRGF5ID0gaW50ZWdlckJldHdlZW4ob2JqLmRheSwgMSwgZGF5c0luTW9udGgob2JqLnllYXIsIG9iai5tb250aCkpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTW9udGgpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtb250aFwiLCBvYmoubW9udGgpO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcImRheVwiLCBvYmouZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQgfSA9IG9iajtcbiAgY29uc3QgdmFsaWRIb3VyID1cbiAgICAgIGludGVnZXJCZXR3ZWVuKGhvdXIsIDAsIDIzKSB8fFxuICAgICAgKGhvdXIgPT09IDI0ICYmIG1pbnV0ZSA9PT0gMCAmJiBzZWNvbmQgPT09IDAgJiYgbWlsbGlzZWNvbmQgPT09IDApLFxuICAgIHZhbGlkTWludXRlID0gaW50ZWdlckJldHdlZW4obWludXRlLCAwLCA1OSksXG4gICAgdmFsaWRTZWNvbmQgPSBpbnRlZ2VyQmV0d2VlbihzZWNvbmQsIDAsIDU5KSxcbiAgICB2YWxpZE1pbGxpc2Vjb25kID0gaW50ZWdlckJldHdlZW4obWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJob3VyXCIsIGhvdXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbnV0ZSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1pbnV0ZVwiLCBtaW51dGUpO1xuICB9IGVsc2UgaWYgKCF2YWxpZFNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInNlY29uZFwiLCBzZWNvbmQpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibWlsbGlzZWNvbmRcIiwgbWlsbGlzZWNvbmQpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCBEdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IEludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBJbmZvIGZyb20gXCIuL2luZm8uanNcIjtcbmltcG9ydCBGb3JtYXR0ZXIgZnJvbSBcIi4vaW1wbC9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuL2ltcGwvbG9jYWxlLmpzXCI7XG5pbXBvcnQge1xuICBpc1VuZGVmaW5lZCxcbiAgbWF5YmVBcnJheSxcbiAgaXNEYXRlLFxuICBpc051bWJlcixcbiAgYmVzdEJ5LFxuICBkYXlzSW5Nb250aCxcbiAgZGF5c0luWWVhcixcbiAgaXNMZWFwWWVhcixcbiAgd2Vla3NJbldlZWtZZWFyLFxuICBub3JtYWxpemVPYmplY3QsXG4gIHJvdW5kVG8sXG4gIG9ialRvTG9jYWxUUyxcbiAgcGFkU3RhcnQsXG59IGZyb20gXCIuL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcbmltcG9ydCBkaWZmIGZyb20gXCIuL2ltcGwvZGlmZi5qc1wiO1xuaW1wb3J0IHsgcGFyc2VSRkMyODIyRGF0ZSwgcGFyc2VJU09EYXRlLCBwYXJzZUhUVFBEYXRlLCBwYXJzZVNRTCB9IGZyb20gXCIuL2ltcGwvcmVnZXhQYXJzZXIuanNcIjtcbmltcG9ydCB7IHBhcnNlRnJvbVRva2VucywgZXhwbGFpbkZyb21Ub2tlbnMgfSBmcm9tIFwiLi9pbXBsL3Rva2VuUGFyc2VyLmpzXCI7XG5pbXBvcnQge1xuICBncmVnb3JpYW5Ub1dlZWssXG4gIHdlZWtUb0dyZWdvcmlhbixcbiAgZ3JlZ29yaWFuVG9PcmRpbmFsLFxuICBvcmRpbmFsVG9HcmVnb3JpYW4sXG4gIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhLFxuICBoYXNJbnZhbGlkV2Vla0RhdGEsXG4gIGhhc0ludmFsaWRPcmRpbmFsRGF0YSxcbiAgaGFzSW52YWxpZFRpbWVEYXRhLFxufSBmcm9tIFwiLi9pbXBsL2NvbnZlcnNpb25zLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2ltcGwvZm9ybWF0cy5qc1wiO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yLFxuICBJbnZhbGlkVW5pdEVycm9yLFxuICBJbnZhbGlkRGF0ZVRpbWVFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEYXRlVGltZVwiO1xuY29uc3QgTUFYX0RBVEUgPSA4LjY0ZTE1O1xuXG5mdW5jdGlvbiB1bnN1cHBvcnRlZFpvbmUoem9uZSkge1xuICByZXR1cm4gbmV3IEludmFsaWQoXCJ1bnN1cHBvcnRlZCB6b25lXCIsIGB0aGUgem9uZSBcIiR7em9uZS5uYW1lfVwiIGlzIG5vdCBzdXBwb3J0ZWRgKTtcbn1cblxuLy8gd2UgY2FjaGUgd2VlayBkYXRhIG9uIHRoZSBEVCBvYmplY3QgYW5kIHRoaXMgaW50ZXJtZWRpYXRlcyB0aGUgY2FjaGVcbmZ1bmN0aW9uIHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEoZHQpIHtcbiAgaWYgKGR0LndlZWtEYXRhID09PSBudWxsKSB7XG4gICAgZHQud2Vla0RhdGEgPSBncmVnb3JpYW5Ub1dlZWsoZHQuYyk7XG4gIH1cbiAgcmV0dXJuIGR0LndlZWtEYXRhO1xufVxuXG4vLyBjbG9uZSByZWFsbHkgbWVhbnMsIFwibWFrZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGVzZSBtb2RpZmljYXRpb25zXCIuIGFsbCBcInNldHRlcnNcIiByZWFsbHkgdXNlIHRoaXNcbi8vIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2hpbGUgb25seSBjaGFuZ2luZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBjbG9uZShpbnN0LCBhbHRzKSB7XG4gIGNvbnN0IGN1cnJlbnQgPSB7XG4gICAgdHM6IGluc3QudHMsXG4gICAgem9uZTogaW5zdC56b25lLFxuICAgIGM6IGluc3QuYyxcbiAgICBvOiBpbnN0Lm8sXG4gICAgbG9jOiBpbnN0LmxvYyxcbiAgICBpbnZhbGlkOiBpbnN0LmludmFsaWQsXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoeyAuLi5jdXJyZW50LCAuLi5hbHRzLCBvbGQ6IGN1cnJlbnQgfSk7XG59XG5cbi8vIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCBhIGdpdmVuIGxvY2FsIHRpbWUuIFRoZSBvIGlucHV0IGlzIG91ciBndWVzcywgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaFxuLy8gb2Zmc2V0IHdlJ2xsIHBpY2sgaW4gYW1iaWd1b3VzIGNhc2VzIChlLmcuIHRoZXJlIGFyZSB0d28gMyBBTXMgYi9jIEZhbGxiYWNrIERTVClcbmZ1bmN0aW9uIGZpeE9mZnNldChsb2NhbFRTLCBvLCB0eikge1xuICAvLyBPdXIgVVRDIHRpbWUgaXMganVzdCBhIGd1ZXNzIGJlY2F1c2Ugb3VyIG9mZnNldCBpcyBqdXN0IGEgZ3Vlc3NcbiAgbGV0IHV0Y0d1ZXNzID0gbG9jYWxUUyAtIG8gKiA2MCAqIDEwMDA7XG5cbiAgLy8gVGVzdCB3aGV0aGVyIHRoZSB6b25lIG1hdGNoZXMgdGhlIG9mZnNldCBmb3IgdGhpcyB0c1xuICBjb25zdCBvMiA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7XG5cbiAgLy8gSWYgc28sIG9mZnNldCBkaWRuJ3QgY2hhbmdlIGFuZCB3ZSdyZSBkb25lXG4gIGlmIChvID09PSBvMikge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG9dO1xuICB9XG5cbiAgLy8gSWYgbm90LCBjaGFuZ2UgdGhlIHRzIGJ5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBvZmZzZXRcbiAgdXRjR3Vlc3MgLT0gKG8yIC0gbykgKiA2MCAqIDEwMDA7XG5cbiAgLy8gSWYgdGhhdCBnaXZlcyB1cyB0aGUgbG9jYWwgdGltZSB3ZSB3YW50LCB3ZSdyZSBkb25lXG4gIGNvbnN0IG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcbiAgaWYgKG8yID09PSBvMykge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG8yXTtcbiAgfVxuXG4gIC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59XG5cbi8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5mdW5jdGlvbiB0c1RvT2JqKHRzLCBvZmZzZXQpIHtcbiAgdHMgKz0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBkLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgbW9udGg6IGQuZ2V0VVRDTW9udGgoKSArIDEsXG4gICAgZGF5OiBkLmdldFVUQ0RhdGUoKSxcbiAgICBob3VyOiBkLmdldFVUQ0hvdXJzKCksXG4gICAgbWludXRlOiBkLmdldFVUQ01pbnV0ZXMoKSxcbiAgICBzZWNvbmQ6IGQuZ2V0VVRDU2Vjb25kcygpLFxuICAgIG1pbGxpc2Vjb25kOiBkLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICB9O1xufVxuXG4vLyBjb252ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgZXBvY2ggdGltZXN0YW1wXG5mdW5jdGlvbiBvYmpUb1RTKG9iaiwgb2Zmc2V0LCB6b25lKSB7XG4gIHJldHVybiBmaXhPZmZzZXQob2JqVG9Mb2NhbFRTKG9iaiksIG9mZnNldCwgem9uZSk7XG59XG5cbi8vIGNyZWF0ZSBhIG5ldyBEVCBpbnN0YW5jZSBieSBhZGRpbmcgYSBkdXJhdGlvbiwgYWRqdXN0aW5nIGZvciBEU1RzXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICBjb25zdCBvUHJlID0gaW5zdC5vLFxuICAgIHllYXIgPSBpbnN0LmMueWVhciArIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICBtb250aCA9IGluc3QuYy5tb250aCArIE1hdGgudHJ1bmMoZHVyLm1vbnRocykgKyBNYXRoLnRydW5jKGR1ci5xdWFydGVycykgKiAzLFxuICAgIGMgPSB7XG4gICAgICAuLi5pbnN0LmMsXG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXk6XG4gICAgICAgIE1hdGgubWluKGluc3QuYy5kYXksIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSkgK1xuICAgICAgICBNYXRoLnRydW5jKGR1ci5kYXlzKSArXG4gICAgICAgIE1hdGgudHJ1bmMoZHVyLndlZWtzKSAqIDcsXG4gICAgfSxcbiAgICBtaWxsaXNUb0FkZCA9IER1cmF0aW9uLmZyb21PYmplY3Qoe1xuICAgICAgeWVhcnM6IGR1ci55ZWFycyAtIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICAgIHF1YXJ0ZXJzOiBkdXIucXVhcnRlcnMgLSBNYXRoLnRydW5jKGR1ci5xdWFydGVycyksXG4gICAgICBtb250aHM6IGR1ci5tb250aHMgLSBNYXRoLnRydW5jKGR1ci5tb250aHMpLFxuICAgICAgd2Vla3M6IGR1ci53ZWVrcyAtIE1hdGgudHJ1bmMoZHVyLndlZWtzKSxcbiAgICAgIGRheXM6IGR1ci5kYXlzIC0gTWF0aC50cnVuYyhkdXIuZGF5cyksXG4gICAgICBob3VyczogZHVyLmhvdXJzLFxuICAgICAgbWludXRlczogZHVyLm1pbnV0ZXMsXG4gICAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICAgIG1pbGxpc2Vjb25kczogZHVyLm1pbGxpc2Vjb25kcyxcbiAgICB9KS5hcyhcIm1pbGxpc2Vjb25kc1wiKSxcbiAgICBsb2NhbFRTID0gb2JqVG9Mb2NhbFRTKGMpO1xuXG4gIGxldCBbdHMsIG9dID0gZml4T2Zmc2V0KGxvY2FsVFMsIG9QcmUsIGluc3Quem9uZSk7XG5cbiAgaWYgKG1pbGxpc1RvQWRkICE9PSAwKSB7XG4gICAgdHMgKz0gbWlsbGlzVG9BZGQ7XG4gICAgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuICAgIG8gPSBpbnN0LnpvbmUub2Zmc2V0KHRzKTtcbiAgfVxuXG4gIHJldHVybiB7IHRzLCBvIH07XG59XG5cbi8vIGhlbHBlciB1c2VmdWwgaW4gdHVybmluZyB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGludG8gcmVhbCBkYXRlc1xuLy8gYnkgaGFuZGxpbmcgdGhlIHpvbmUgb3B0aW9uc1xuZnVuY3Rpb24gcGFyc2VEYXRhVG9EYXRlVGltZShwYXJzZWQsIHBhcnNlZFpvbmUsIG9wdHMsIGZvcm1hdCwgdGV4dCwgc3BlY2lmaWNPZmZzZXQpIHtcbiAgY29uc3QgeyBzZXRab25lLCB6b25lIH0gPSBvcHRzO1xuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgY29uc3QgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QocGFyc2VkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZSxcbiAgICAgICAgc3BlY2lmaWNPZmZzZXQsXG4gICAgICB9KTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXG4gICAgICBuZXcgSW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgJHtmb3JtYXR9YClcbiAgICApO1xuICB9XG59XG5cbi8vIGlmIHlvdSB3YW50IHRvIG91dHB1dCBhIHRlY2huaWNhbCBmb3JtYXQgKGUuZy4gUkZDIDI4MjIpLCB0aGlzIGhlbHBlclxuLy8gaGVscHMgaGFuZGxlIHRoZSBkZXRhaWxzXG5mdW5jdGlvbiB0b1RlY2hGb3JtYXQoZHQsIGZvcm1hdCwgYWxsb3daID0gdHJ1ZSkge1xuICByZXR1cm4gZHQuaXNWYWxpZFxuICAgID8gRm9ybWF0dGVyLmNyZWF0ZShMb2NhbGUuY3JlYXRlKFwiZW4tVVNcIiksIHtcbiAgICAgICAgYWxsb3daLFxuICAgICAgICBmb3JjZVNpbXBsZTogdHJ1ZSxcbiAgICAgIH0pLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm9ybWF0KVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gdG9JU09EYXRlKG8sIGV4dGVuZGVkKSB7XG4gIGNvbnN0IGxvbmdGb3JtYXQgPSBvLmMueWVhciA+IDk5OTkgfHwgby5jLnllYXIgPCAwO1xuICBsZXQgYyA9IFwiXCI7XG4gIGlmIChsb25nRm9ybWF0ICYmIG8uYy55ZWFyID49IDApIGMgKz0gXCIrXCI7XG4gIGMgKz0gcGFkU3RhcnQoby5jLnllYXIsIGxvbmdGb3JtYXQgPyA2IDogNCk7XG5cbiAgaWYgKGV4dGVuZGVkKSB7XG4gICAgYyArPSBcIi1cIjtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5tb250aCk7XG4gICAgYyArPSBcIi1cIjtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5kYXkpO1xuICB9IGVsc2Uge1xuICAgIGMgKz0gcGFkU3RhcnQoby5jLm1vbnRoKTtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5kYXkpO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiB0b0lTT1RpbWUobywgZXh0ZW5kZWQsIHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHMsIGluY2x1ZGVPZmZzZXQpIHtcbiAgbGV0IGMgPSBwYWRTdGFydChvLmMuaG91cik7XG4gIGlmIChleHRlbmRlZCkge1xuICAgIGMgKz0gXCI6XCI7XG4gICAgYyArPSBwYWRTdGFydChvLmMubWludXRlKTtcbiAgICBpZiAoby5jLnNlY29uZCAhPT0gMCB8fCAhc3VwcHJlc3NTZWNvbmRzKSB7XG4gICAgICBjICs9IFwiOlwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5taW51dGUpO1xuICB9XG5cbiAgaWYgKG8uYy5zZWNvbmQgIT09IDAgfHwgIXN1cHByZXNzU2Vjb25kcykge1xuICAgIGMgKz0gcGFkU3RhcnQoby5jLnNlY29uZCk7XG5cbiAgICBpZiAoby5jLm1pbGxpc2Vjb25kICE9PSAwIHx8ICFzdXBwcmVzc01pbGxpc2Vjb25kcykge1xuICAgICAgYyArPSBcIi5cIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoby5jLm1pbGxpc2Vjb25kLCAzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGlmIChvLmlzT2Zmc2V0Rml4ZWQgJiYgby5vZmZzZXQgPT09IDApIHtcbiAgICAgIGMgKz0gXCJaXCI7XG4gICAgfSBlbHNlIGlmIChvLm8gPCAwKSB7XG4gICAgICBjICs9IFwiLVwiO1xuICAgICAgYyArPSBwYWRTdGFydChNYXRoLnRydW5jKC1vLm8gLyA2MCkpO1xuICAgICAgYyArPSBcIjpcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYygtby5vICUgNjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYyArPSBcIitcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYyhvLm8gLyA2MCkpO1xuICAgICAgYyArPSBcIjpcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYyhvLm8gJSA2MCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYztcbn1cblxuLy8gZGVmYXVsdHMgZm9yIHVuc3BlY2lmaWVkIHVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzXG5jb25zdCBkZWZhdWx0VW5pdFZhbHVlcyA9IHtcbiAgICBtb250aDogMSxcbiAgICBkYXk6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9LFxuICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gICAgd2Vla051bWJlcjogMSxcbiAgICB3ZWVrZGF5OiAxLFxuICAgIGhvdXI6IDAsXG4gICAgbWludXRlOiAwLFxuICAgIHNlY29uZDogMCxcbiAgICBtaWxsaXNlY29uZDogMCxcbiAgfSxcbiAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICAgIG9yZGluYWw6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9O1xuXG4vLyBVbml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFycywgc29ydGVkIGJ5IGJpZ25lc3NcbmNvbnN0IG9yZGVyZWRVbml0cyA9IFtcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgb3JkZXJlZFdlZWtVbml0cyA9IFtcbiAgICBcIndlZWtZZWFyXCIsXG4gICAgXCJ3ZWVrTnVtYmVyXCIsXG4gICAgXCJ3ZWVrZGF5XCIsXG4gICAgXCJob3VyXCIsXG4gICAgXCJtaW51dGVcIixcbiAgICBcInNlY29uZFwiLFxuICAgIFwibWlsbGlzZWNvbmRcIixcbiAgXSxcbiAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFtcInllYXJcIiwgXCJvcmRpbmFsXCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdO1xuXG4vLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBxdWFydGVyOiBcInF1YXJ0ZXJcIixcbiAgICBxdWFydGVyczogXCJxdWFydGVyXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWlsbGlzZWNvbmQ6IFwibWlsbGlzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZHM6IFwibWlsbGlzZWNvbmRcIixcbiAgICB3ZWVrZGF5OiBcIndlZWtkYXlcIixcbiAgICB3ZWVrZGF5czogXCJ3ZWVrZGF5XCIsXG4gICAgd2Vla251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla3NudW1iZXI6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWtudW1iZXJzOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVreWVhcjogXCJ3ZWVrWWVhclwiLFxuICAgIHdlZWt5ZWFyczogXCJ3ZWVrWWVhclwiLFxuICAgIG9yZGluYWw6IFwib3JkaW5hbFwiLFxuICB9W3VuaXQudG9Mb3dlckNhc2UoKV07XG5cbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gdGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgZnJvbU9iamVjdCgpIHRoYXQgcnVucyBhYm91dCA2MCUgZmFzdGVyXG4vLyBidXQgZG9lc24ndCBkbyBhbnkgdmFsaWRhdGlvbiwgbWFrZXMgYSBidW5jaCBvZiBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHVuaXRzXG4vLyBhcmUgcHJlc2VudCwgYW5kIHNvIG9uLlxuXG4vLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5mdW5jdGlvbiBxdWlja0RUKG9iaiwgb3B0cykge1xuICBjb25zdCB6b25lID0gbm9ybWFsaXplWm9uZShvcHRzLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvcHRzKSxcbiAgICB0c05vdyA9IFNldHRpbmdzLm5vdygpO1xuXG4gIGxldCB0cywgbztcblxuICAvLyBhc3N1bWUgd2UgaGF2ZSB0aGUgaGlnaGVyLW9yZGVyIHVuaXRzXG4gIGlmICghaXNVbmRlZmluZWQob2JqLnllYXIpKSB7XG4gICAgZm9yIChjb25zdCB1IG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKG9ialt1XSkpIHtcbiAgICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikgfHwgaGFzSW52YWxpZFRpbWVEYXRhKG9iaik7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KTtcbiAgICBbdHMsIG9dID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgdHMgPSB0c05vdztcbiAgfVxuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoeyB0cywgem9uZSwgbG9jLCBvIH0pO1xufVxuXG5mdW5jdGlvbiBkaWZmUmVsYXRpdmUoc3RhcnQsIGVuZCwgb3B0cykge1xuICBjb25zdCByb3VuZCA9IGlzVW5kZWZpbmVkKG9wdHMucm91bmQpID8gdHJ1ZSA6IG9wdHMucm91bmQsXG4gICAgZm9ybWF0ID0gKGMsIHVuaXQpID0+IHtcbiAgICAgIGMgPSByb3VuZFRvKGMsIHJvdW5kIHx8IG9wdHMuY2FsZW5kYXJ5ID8gMCA6IDIsIHRydWUpO1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZW5kLmxvYy5jbG9uZShvcHRzKS5yZWxGb3JtYXR0ZXIob3B0cyk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChjLCB1bml0KTtcbiAgICB9LFxuICAgIGRpZmZlciA9ICh1bml0KSA9PiB7XG4gICAgICBpZiAob3B0cy5jYWxlbmRhcnkpIHtcbiAgICAgICAgaWYgKCFlbmQuaGFzU2FtZShzdGFydCwgdW5pdCkpIHtcbiAgICAgICAgICByZXR1cm4gZW5kLnN0YXJ0T2YodW5pdCkuZGlmZihzdGFydC5zdGFydE9mKHVuaXQpLCB1bml0KS5nZXQodW5pdCk7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgaWYgKG9wdHMudW5pdCkge1xuICAgIHJldHVybiBmb3JtYXQoZGlmZmVyKG9wdHMudW5pdCksIG9wdHMudW5pdCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygb3B0cy51bml0cykge1xuICAgIGNvbnN0IGNvdW50ID0gZGlmZmVyKHVuaXQpO1xuICAgIGlmIChNYXRoLmFicyhjb3VudCkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZvcm1hdChjb3VudCwgdW5pdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtYXQoc3RhcnQgPiBlbmQgPyAtMCA6IDAsIG9wdHMudW5pdHNbb3B0cy51bml0cy5sZW5ndGggLSAxXSk7XG59XG5cbmZ1bmN0aW9uIGxhc3RPcHRzKGFyZ0xpc3QpIHtcbiAgbGV0IG9wdHMgPSB7fSxcbiAgICBhcmdzO1xuICBpZiAoYXJnTGlzdC5sZW5ndGggPiAwICYmIHR5cGVvZiBhcmdMaXN0W2FyZ0xpc3QubGVuZ3RoIC0gMV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICBvcHRzID0gYXJnTGlzdFthcmdMaXN0Lmxlbmd0aCAtIDFdO1xuICAgIGFyZ3MgPSBBcnJheS5mcm9tKGFyZ0xpc3QpLnNsaWNlKDAsIGFyZ0xpc3QubGVuZ3RoIC0gMSk7XG4gIH0gZWxzZSB7XG4gICAgYXJncyA9IEFycmF5LmZyb20oYXJnTGlzdCk7XG4gIH1cbiAgcmV0dXJuIFtvcHRzLCBhcmdzXTtcbn1cblxuLyoqXG4gKiBBIERhdGVUaW1lIGlzIGFuIGltbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBkYXRlIGFuZCB0aW1lIGFuZCBhY2NvbXBhbnlpbmcgbWV0aG9kcy4gSXQgY29udGFpbnMgY2xhc3MgYW5kIGluc3RhbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXG4gKlxuICogQSBEYXRlVGltZSBjb21wcmlzZXMgb2Y6XG4gKiAqIEEgdGltZXN0YW1wLiBFYWNoIERhdGVUaW1lIGluc3RhbmNlIHJlZmVycyB0byBhIHNwZWNpZmljIG1pbGxpc2Vjb25kIG9mIHRoZSBVbml4IGVwb2NoLlxuICogKiBBIHRpbWUgem9uZS4gRWFjaCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgc3BlY2lmaWMgem9uZSAoYnkgZGVmYXVsdCB0aGUgbG9jYWwgc3lzdGVtJ3Mgem9uZSkuXG4gKiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0aGF0IGVmZmVjdCBob3cgb3V0cHV0IHN0cmluZ3MgYXJlIGZvcm1hdHRlZCwgc3VjaCBhcyBgbG9jYWxlYCwgYG51bWJlcmluZ1N5c3RlbWAsIGFuZCBgb3V0cHV0Q2FsZW5kYXJgLlxuICpcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9uYWxpdHkgaXQgcHJvdmlkZXM6XG4gKlxuICogKiAqKkNyZWF0aW9uKio6IFRvIGNyZWF0ZSBhIERhdGVUaW1lIGZyb20gaXRzIGNvbXBvbmVudHMsIHVzZSBvbmUgb2YgaXRzIGZhY3RvcnkgY2xhc3MgbWV0aG9kczoge0BsaW5rIERhdGVUaW1lI2xvY2FsfSwge0BsaW5rIERhdGVUaW1lI3V0Y30sIGFuZCAobW9zdCBmbGV4aWJseSkge0BsaW5rIERhdGVUaW1lI2Zyb21PYmplY3R9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIERhdGVUaW1lI2Zyb21JU099LCB7QGxpbmsgRGF0ZVRpbWUjZnJvbUhUVFB9LCBhbmQge0BsaW5rIERhdGVUaW1lI2Zyb21SRkMyODIyfS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgRGF0ZVRpbWUjZnJvbUZvcm1hdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIG5hdGl2ZSBKUyBkYXRlLCB1c2Uge0BsaW5rIERhdGVUaW1lI2Zyb21KU0RhdGV9LlxuICogKiAqKkdyZWdvcmlhbiBjYWxlbmRhciBhbmQgdGltZSoqOiBUbyBleGFtaW5lIHRoZSBHcmVnb3JpYW4gcHJvcGVydGllcyBvZiBhIERhdGVUaW1lIGluZGl2aWR1YWxseSAoaS5lIGFzIG9wcG9zZWQgdG8gY29sbGVjdGl2ZWx5IHRocm91Z2gge0BsaW5rIERhdGVUaW1lI3RvT2JqZWN0fSksIHVzZSB0aGUge0BsaW5rIERhdGVUaW1lI3llYXJ9LCB7QGxpbmsgRGF0ZVRpbWUjbW9udGh9LFxuICoge0BsaW5rIERhdGVUaW1lI2RheX0sIHtAbGluayBEYXRlVGltZSNob3VyfSwge0BsaW5rIERhdGVUaW1lI21pbnV0ZX0sIHtAbGluayBEYXRlVGltZSNzZWNvbmR9LCB7QGxpbmsgRGF0ZVRpbWUjbWlsbGlzZWNvbmR9IGFjY2Vzc29ycy5cbiAqICogKipXZWVrIGNhbGVuZGFyKio6IEZvciBJU08gd2VlayBjYWxlbmRhciBhdHRyaWJ1dGVzLCBzZWUgdGhlIHtAbGluayBEYXRlVGltZSN3ZWVrWWVhcn0sIHtAbGluayBEYXRlVGltZSN3ZWVrTnVtYmVyfSwgYW5kIHtAbGluayBEYXRlVGltZSN3ZWVrZGF5fSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSB0aGUge0BsaW5rIERhdGVUaW1lI2xvY2FsZX0gYW5kIHtAbGluayBEYXRlVGltZSNudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqOiBUbyB0cmFuc2Zvcm0gdGhlIERhdGVUaW1lIGludG8gb3RoZXIgRGF0ZVRpbWVzLCB1c2Uge0BsaW5rIERhdGVUaW1lI3NldH0sIHtAbGluayBEYXRlVGltZSNyZWNvbmZpZ3VyZX0sIHtAbGluayBEYXRlVGltZSNzZXRab25lfSwge0BsaW5rIERhdGVUaW1lI3NldExvY2FsZX0sIHtAbGluayBEYXRlVGltZS5wbHVzfSwge0BsaW5rIERhdGVUaW1lI21pbnVzfSwge0BsaW5rIERhdGVUaW1lI2VuZE9mfSwge0BsaW5rIERhdGVUaW1lI3N0YXJ0T2Z9LCB7QGxpbmsgRGF0ZVRpbWUjdG9VVEN9LCBhbmQge0BsaW5rIERhdGVUaW1lI3RvTG9jYWx9LlxuICogKiAqKk91dHB1dCoqOiBUbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHVzZSB0aGUge0BsaW5rIERhdGVUaW1lI3RvUmVsYXRpdmV9LCB7QGxpbmsgRGF0ZVRpbWUjdG9SZWxhdGl2ZUNhbGVuZGFyfSwge0BsaW5rIERhdGVUaW1lI3RvSlNPTn0sIHtAbGluayBEYXRlVGltZSN0b0lTT30sIHtAbGluayBEYXRlVGltZSN0b0hUVFB9LCB7QGxpbmsgRGF0ZVRpbWUjdG9PYmplY3R9LCB7QGxpbmsgRGF0ZVRpbWUjdG9SRkMyODIyfSwge0BsaW5rIERhdGVUaW1lI3RvU3RyaW5nfSwge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSwge0BsaW5rIERhdGVUaW1lI3RvRm9ybWF0fSwge0BsaW5rIERhdGVUaW1lI3RvTWlsbGlzfSBhbmQge0BsaW5rIERhdGVUaW1lI3RvSlNEYXRlfS5cbiAqXG4gKiBUaGVyZSdzIHBsZW50eSBvdGhlcnMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24sIHRpbWUgem9uZXMsIGFsdGVybmF0aXZlIGNhbGVuZGFycywgdmFsaWRpdHksIGFuZCBzbyBvbiwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRlVGltZSB7XG4gIC8qKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIGNvbnN0IHpvbmUgPSBjb25maWcuem9uZSB8fCBTZXR0aW5ncy5kZWZhdWx0Wm9uZTtcblxuICAgIGxldCBpbnZhbGlkID1cbiAgICAgIGNvbmZpZy5pbnZhbGlkIHx8XG4gICAgICAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsKSB8fFxuICAgICAgKCF6b25lLmlzVmFsaWQgPyB1bnN1cHBvcnRlZFpvbmUoem9uZSkgOiBudWxsKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnRzID0gaXNVbmRlZmluZWQoY29uZmlnLnRzKSA/IFNldHRpbmdzLm5vdygpIDogY29uZmlnLnRzO1xuXG4gICAgbGV0IGMgPSBudWxsLFxuICAgICAgbyA9IG51bGw7XG4gICAgaWYgKCFpbnZhbGlkKSB7XG4gICAgICBjb25zdCB1bmNoYW5nZWQgPSBjb25maWcub2xkICYmIGNvbmZpZy5vbGQudHMgPT09IHRoaXMudHMgJiYgY29uZmlnLm9sZC56b25lLmVxdWFscyh6b25lKTtcblxuICAgICAgaWYgKHVuY2hhbmdlZCkge1xuICAgICAgICBbYywgb10gPSBbY29uZmlnLm9sZC5jLCBjb25maWcub2xkLm9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3QgPSB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICAgICAgYyA9IHRzVG9PYmoodGhpcy50cywgb3QpO1xuICAgICAgICBpbnZhbGlkID0gTnVtYmVyLmlzTmFOKGMueWVhcikgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsO1xuICAgICAgICBjID0gaW52YWxpZCA/IG51bGwgOiBjO1xuICAgICAgICBvID0gaW52YWxpZCA/IG51bGwgOiBvdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl96b25lID0gem9uZTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy53ZWVrRGF0YSA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jID0gYztcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm8gPSBvO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaXNMdXhvbkRhdGVUaW1lID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIENPTlNUUlVDVFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmb3IgdGhlIGN1cnJlbnQgaW5zdGFudCwgaW4gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICpcbiAgICogVXNlIFNldHRpbmdzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGlmIG5lZWRlZC5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvL34+IG5vdyBpbiB0aGUgSVNPIGZvcm1hdFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBub3coKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7fSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbG9jYWwgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5ZWFyXSAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgbG9jYWwoKWAgd2l0aCBubyBhcmd1bWVudHMpLCB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbnV0ZT0wXSAtIFRoZSBtaW51dGUgb2YgdGhlIGhvdXIsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKHsgem9uZTogXCJBbWVyaWNhL05ld19Zb3JrXCIgfSkgICAgICAvL34+IG5vdywgaW4gVVMgZWFzdCBjb2FzdCB0aW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCB7IGxvY2FsZTogXCJmclwiIH0pICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDAsIHdpdGggYSBGcmVuY2ggbG9jYWxlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCB7IHpvbmU6IFwidXRjXCIgfSkgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDAsIGluIFVUQ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwLCA3NjUpICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgbG9jYWwoKSB7XG4gICAgY29uc3QgW29wdHMsIGFyZ3NdID0gbGFzdE9wdHMoYXJndW1lbnRzKSxcbiAgICAgIFt5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmRdID0gYXJncztcbiAgICByZXR1cm4gcXVpY2tEVCh7IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCB9LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBpbiBVVENcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5ZWFyXSAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgdXRjKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF5PTFdIC0gVGhlIGRheSBvZiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kPTBdIC0gVGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub3V0cHV0Q2FsZW5kYXJdIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubnVtYmVyaW5nU3lzdGVtXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMS0wMVQwMDowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCB7IGxvY2FsZTogXCJmclwiIH0pICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFogd2l0aCBhIEZyZW5jaCBsb2NhbGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1LCB7IGxvY2FsZTogXCJmclwiIH0pIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVaIHdpdGggYSBGcmVuY2ggbG9jYWxlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIHV0YygpIHtcbiAgICBjb25zdCBbb3B0cywgYXJnc10gPSBsYXN0T3B0cyhhcmd1bWVudHMpLFxuICAgICAgW3llYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF0gPSBhcmdzO1xuXG4gICAgb3B0cy56b25lID0gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlO1xuICAgIHJldHVybiBxdWlja0RUKHsgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kIH0sIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIGEgSmF2YVNjcmlwdCBEYXRlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNEYXRlKGRhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHRzID0gaXNEYXRlKGRhdGUpID8gZGF0ZS52YWx1ZU9mKCkgOiBOYU47XG4gICAgaWYgKE51bWJlci5pc05hTih0cykpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0cyxcbiAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtZWFuaW5nIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFpc051bWJlcihtaWxsaXNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBmcm9tTWlsbGlzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0LCBidXQgcmVjZWl2ZWQgYSAke3R5cGVvZiBtaWxsaXNlY29uZHN9IHdpdGggdmFsdWUgJHttaWxsaXNlY29uZHN9YFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1pbGxpc2Vjb25kcyA8IC1NQVhfREFURSB8fCBtaWxsaXNlY29uZHMgPiBNQVhfREFURSkge1xuICAgICAgLy8gdGhpcyBpc24ndCBwZXJmZWN0IGJlY2F1c2UgYmVjYXVzZSB3ZSBjYW4gc3RpbGwgZW5kIHVwIG91dCBvZiByYW5nZSBiZWNhdXNlIG9mIGFkZGl0aW9uYWwgc2hpZnRpbmcsIGJ1dCBpdCdzIGEgc3RhcnRcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFwiVGltZXN0YW1wIG91dCBvZiByYW5nZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBtaWxsaXNlY29uZHMsXG4gICAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucyksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAobWVhbmluZyBzaW5jZSAxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tU2Vjb25kcyhzZWNvbmRzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWlzTnVtYmVyKHNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tU2Vjb25kcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBzZWNvbmRzICogMTAwMCxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXInIGFuZCAnaG91cicgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyIC0gYSB5ZWFyLCBzdWNoIGFzIDE5ODdcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aCAtIGEgbW9udGgsIDEtMTJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXkgLSBhIGRheSBvZiB0aGUgbW9udGgsIDEtMzEsIGRlcGVuZGluZyBvbiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5vcmRpbmFsIC0gZGF5IG9mIHRoZSB5ZWFyLCAxLTM2NSBvciAzNjZcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrWWVhciAtIGFuIElTTyB3ZWVrIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrTnVtYmVyIC0gYW4gSVNPIHdlZWsgbnVtYmVyLCBiZXR3ZWVuIDEgYW5kIDUyIG9yIDUzLCBkZXBlbmRpbmcgb24gdGhlIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrZGF5IC0gYW4gSVNPIHdlZWtkYXksIDEtNywgd2hlcmUgMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91ciAtIGhvdXIgb2YgdGhlIGRheSwgMC0yM1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZSAtIG1pbnV0ZSBvZiB0aGUgaG91ciwgMC01OVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZCAtIHNlY29uZCBvZiB0aGUgbWludXRlLCAwLTU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmQgLSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCAwLTk5OVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGludGVycHJldCB0aGUgbnVtYmVycyBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgem9uZS4gQ2FuIHRha2UgYW55IHZhbHVlIHRha2VuIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRab25lKClcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIsIG1vbnRoOiA1LCBkYXk6IDI1fSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIgfSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wMS0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSkgLy9+PiB0b2RheSBhdCAxMDoyNjowNlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICd1dGMnIH0pLFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICdsb2NhbCcgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSwgeyB6b25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHdlZWtZZWFyOiAyMDE2LCB3ZWVrTnVtYmVyOiAyLCB3ZWVrZGF5OiAzIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzIwMTYtMDEtMTMnXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21PYmplY3Qob2JqLCBvcHRzID0ge30pIHtcbiAgICBvYmogPSBvYmogfHwge307XG4gICAgY29uc3Qgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvcHRzLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcbiAgICBpZiAoIXpvbmVUb1VzZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZVRvVXNlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9ICFpc1VuZGVmaW5lZChvcHRzLnNwZWNpZmljT2Zmc2V0KVxuICAgICAgICA/IG9wdHMuc3BlY2lmaWNPZmZzZXRcbiAgICAgICAgOiB6b25lVG9Vc2Uub2Zmc2V0KHRzTm93KSxcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVVbml0KSxcbiAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXIsXG4gICAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvcHRzKTtcblxuICAgIC8vIGNhc2VzOlxuICAgIC8vIGp1c3QgYSB3ZWVrZGF5IC0+IHRoaXMgd2VlaydzIGluc3RhbmNlIG9mIHRoYXQgd2Vla2RheSwgbm8gd29ycmllc1xuICAgIC8vIChncmVnb3JpYW4gZGF0YSBvciBvcmRpbmFsKSArICh3ZWVrWWVhciBvciB3ZWVrTnVtYmVyKSAtPiBlcnJvclxuICAgIC8vIChncmVnb3JpYW4gbW9udGggb3IgZGF5KSArIG9yZGluYWwgLT4gZXJyb3JcbiAgICAvLyBvdGhlcndpc2UganVzdCB1c2Ugd2Vla3Mgb3Igb3JkaW5hbHMgb3IgZ3JlZ29yaWFuLCBkZXBlbmRpbmcgb24gd2hhdCdzIHNwZWNpZmllZFxuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZVdlZWtEYXRhID0gZGVmaW5pdGVXZWVrRGVmIHx8IChub3JtYWxpemVkLndlZWtkYXkgJiYgIWNvbnRhaW5zR3JlZ29yKTtcblxuICAgIC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG4gICAgbGV0IHVuaXRzLFxuICAgICAgZGVmYXVsdFZhbHVlcyxcbiAgICAgIG9iak5vdyA9IHRzVG9PYmoodHNOb3csIG9mZnNldFByb3Zpcyk7XG4gICAgaWYgKHVzZVdlZWtEYXRhKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRXZWVrVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFdlZWtVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9XZWVrKG9iak5vdyk7XG4gICAgfSBlbHNlIGlmIChjb250YWluc09yZGluYWwpIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZE9yZGluYWxVbml0cztcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXM7XG4gICAgICBvYmpOb3cgPSBncmVnb3JpYW5Ub09yZGluYWwob2JqTm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG4gICAgbGV0IGZvdW5kRmlyc3QgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdW5pdHMpIHtcbiAgICAgIGNvbnN0IHYgPSBub3JtYWxpemVkW3VdO1xuICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2KSkge1xuICAgICAgICBmb3VuZEZpcnN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdCkge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gZGVmYXVsdFZhbHVlc1t1XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBvYmpOb3dbdV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSB2YWx1ZXMgd2UgaGF2ZSBhcmUgaW4gcmFuZ2VcbiAgICBjb25zdCBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YVxuICAgICAgICA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKVxuICAgICAgICA6IGNvbnRhaW5zT3JkaW5hbFxuICAgICAgICA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKVxuICAgICAgICA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgaW52YWxpZCA9IGhpZ2hlck9yZGVySW52YWxpZCB8fCBoYXNJbnZhbGlkVGltZURhdGEobm9ybWFsaXplZCk7XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHRpbWVcbiAgICBjb25zdCBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YVxuICAgICAgICA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKVxuICAgICAgICA6IGNvbnRhaW5zT3JkaW5hbFxuICAgICAgICA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKVxuICAgICAgICA6IG5vcm1hbGl6ZWQsXG4gICAgICBbdHNGaW5hbCwgb2Zmc2V0RmluYWxdID0gb2JqVG9UUyhncmVnb3JpYW4sIG9mZnNldFByb3Zpcywgem9uZVRvVXNlKSxcbiAgICAgIGluc3QgPSBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogdHNGaW5hbCxcbiAgICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgICBvOiBvZmZzZXRGaW5hbCxcbiAgICAgICAgbG9jLFxuICAgICAgfSk7XG5cbiAgICAvLyBncmVnb3JpYW4gZGF0YSArIHdlZWtkYXkgc2VydmVzIG9ubHkgdG8gdmFsaWRhdGVcbiAgICBpZiAobm9ybWFsaXplZC53ZWVrZGF5ICYmIGNvbnRhaW5zR3JlZ29yICYmIG9iai53ZWVrZGF5ICE9PSBpbnN0LndlZWtkYXkpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFxuICAgICAgICBcIm1pc21hdGNoZWQgd2Vla2RheVwiLFxuICAgICAgICBgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtub3JtYWxpemVkLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtpbnN0LnRvSVNPKCl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIElTTyA4NjAxIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcl0gLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW1dIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJywge3NldFpvbmU6IHRydWV9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycsIHt6b25lOiAndXRjJ30pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtVzA1LTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IFt2YWxzLCBwYXJzZWRab25lXSA9IHBhcnNlSVNPRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIklTTyA4NjAxXCIsIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIFJGQyAyODIyIHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCdGcmksIDI1IE5vdiAyMDE2IDEzOjIzOjEyICswNjAwJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tUkZDMjgyMih0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVJGQzI4MjJEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiUkZDIDI4MjJcIiwgdGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIEhUVFAgaGVhZGVyIGRhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSBIVFRQIGRhdGVzIGFyZSBhbHdheXMgaW4gVVRDLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCB0aGUgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuIEZvciBIVFRQIGRhdGVzLCB0aGlzIGlzIGFsd2F5cyBVVEMsIHNvIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUgYHpvbmVgIG9wdGlvbiB0byAndXRjJywgYnV0IHRoaXMgb3B0aW9uIGlzIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbWlsYXIgbWV0aG9kcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1bmRheSwgMDYtTm92LTk0IDA4OjQ5OjM3IEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSFRUUCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZUhUVFBEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiSFRUUFwiLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZy5cbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlLiBGb3IgYSB0YWJsZSBvZiB0b2tlbnMgYW5kIHRoZWlyIGludGVycHJldGF0aW9ucywgc2VlIFtoZXJlXShodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vIy9wYXJzaW5nP2lkPXRhYmxlLW9mLXRva2VucykuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgdGhlIGxpbmsgYmVsb3cgZm9yIHRoZSBmb3JtYXRzKVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyB6b25lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgdG8gdGhpcyBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHRleHQpIHx8IGlzVW5kZWZpbmVkKGZtdCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxvY2FsZSA9IG51bGwsIG51bWJlcmluZ1N5c3RlbSA9IG51bGwgfSA9IG9wdHMsXG4gICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBkZWZhdWx0VG9FTjogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgW3ZhbHMsIHBhcnNlZFpvbmUsIHNwZWNpZmljT2Zmc2V0LCBpbnZhbGlkXSA9IHBhcnNlRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIGBmb3JtYXQgJHtmbXR9YCwgdGV4dCwgc3BlY2lmaWNPZmZzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZnJvbVN0cmluZyh0ZXh0LCBmbXQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIFNRTCBkYXRlLCB0aW1lLCBvciBkYXRldGltZVxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0JylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJywgeyBzZXRab25lOiB0cnVlIH0pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJywgeyB6b25lOiAnQW1lcmljYS9Mb3NfQW5nZWxlcycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMDk6MTI6MzQuMzQyJylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbVNRTCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVNRTCh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlNRTFwiLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4cGxhbmF0aW9uPW51bGxdIC0gbG9uZ2VyIGV4cGxhbmF0aW9uLCBtYXkgaW5jbHVkZSBwYXJhbWV0ZXJzIGFuZCBvdGhlciB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbiA9IG51bGwpIHtcbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZVRpbWVFcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7IGludmFsaWQgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIG9iamVjdCBpcyBhIERhdGVUaW1lLiBXb3JrcyBhY3Jvc3MgY29udGV4dCBib3VuZGFyaWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNEYXRlVGltZShvKSB7XG4gICAgcmV0dXJuIChvICYmIG8uaXNMdXhvbkRhdGVUaW1lKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8vIElORk9cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW3VuaXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XG4gICAqICogVGhlIERhdGVUaW1lIHdhcyBjcmVhdGVkIGZyb20gaW52YWxpZCBjYWxlbmRhciBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgMTN0aCBtb250aCBvciBGZWJydWFyeSAzMFxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIERhdGVUaW1lIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEYXRlVGltZSBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRGF0ZVRpbWUgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2NhbGUgb2YgYSBEYXRlVGltZSwgc3VjaCAnZW4tR0InLiBUaGUgbG9jYWxlIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG91dHB1dCBjYWxlbmRhciBvZiBhIERhdGVUaW1lLCBzdWNoICdpc2xhbWljJy4gVGhlIG91dHB1dCBjYWxlbmRhciBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvdXRwdXRDYWxlbmRhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZSB6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERhdGVUaW1lLlxuICAgKiBAdHlwZSB7Wm9uZX1cbiAgICovXG4gIGdldCB6b25lKCkge1xuICAgIHJldHVybiB0aGlzLl96b25lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgdGltZSB6b25lLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHpvbmVOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB5ZWFyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHllYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy55ZWFyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcXVhcnRlclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBxdWFydGVyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBNYXRoLmNlaWwodGhpcy5jLm1vbnRoIC8gMykgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb250aCAoMS0xMikuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5tb250aCAvLz0+IDVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtb250aCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1vbnRoIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCAoMS0zMGlzaCkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5kYXkgLy89PiAyNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGRheSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLmRheSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhvdXIgb2YgdGhlIGRheSAoMC0yMykuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5KS5ob3VyIC8vPT4gOVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGhvdXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWludXRlIG9mIHRoZSBob3VyICgwLTU5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwKS5taW51dGUgLy89PiAzMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbnV0ZSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1Mikuc2Vjb25kIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBzZWNvbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5zZWNvbmQgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kICgwLTk5OSkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIsIDY1NCkubWlsbGlzZWNvbmQgLy89PiA2NTRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtaWxsaXNlY29uZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2VlayB5ZWFyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMiwgMzEpLndlZWtZZWFyIC8vPT4gMjAxNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdlZWtZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtZZWFyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2VlayBudW1iZXIgb2YgdGhlIHdlZWsgeWVhciAoMS01MmlzaCkuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkud2Vla051bWJlciAvLz0+IDIxXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2Vla051bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrTnVtYmVyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLlxuICAgKiAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla2RheSAvLz0+IDRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrZGF5KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtkYXkgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcmRpbmFsIChtZWFuaW5nIHRoZSBkYXkgb2YgdGhlIHllYXIpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5vcmRpbmFsIC8vPT4gMTQ1XG4gICAqIEB0eXBlIHtudW1iZXJ8RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgb3JkaW5hbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYykub3JkaW5hbCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdCcuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoU2hvcnQgLy89PiBPY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBtb250aFNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcInNob3J0XCIsIHsgbG9jT2JqOiB0aGlzLmxvYyB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyBtb250aCBuYW1lLCBzdWNoIGFzICdPY3RvYmVyJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1vbnRoTG9uZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoXCJsb25nXCIsIHsgbG9jT2JqOiB0aGlzLmxvYyB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgd2Vla2RheSwgc3VjaCBhcyAnTW9uJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheVNob3J0IC8vPT4gTW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgd2Vla2RheVNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwic2hvcnRcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgd2Vla2RheSwgc3VjaCBhcyAnTW9uZGF5Jy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheUxvbmcgLy89PiBNb25kYXlcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB3ZWVrZGF5TG9uZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcImxvbmdcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgb2YgdGhpcyBEYXRlVGltZSBpbiBtaW51dGVzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm9mZnNldCAvLz0+IC0yNDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gK3RoaXMubyA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRVNUXCIgb3IgXCJFRFRcIi5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgb2Zmc2V0TmFtZVNob3J0KCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgIGZvcm1hdDogXCJzaG9ydFwiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmcgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcIiBvciBcIkVhc3Rlcm4gRGF5bGlnaHQgVGltZVwiLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvZmZzZXROYW1lTG9uZygpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICBmb3JtYXQ6IFwibG9uZ1wiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGlzIHpvbmUncyBvZmZzZXQgZXZlciBjaGFuZ2VzLCBhcyBpbiBhIERTVC5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNPZmZzZXRGaXhlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLmlzVW5pdmVyc2FsIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgaW4gYSBEU1QuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzSW5EU1QoKSB7XG4gICAgaWYgKHRoaXMuaXNPZmZzZXRGaXhlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHsgbW9udGg6IDEgfSkub2Zmc2V0IHx8IHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogNSB9KS5vZmZzZXRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuaXNJbkxlYXBZZWFyIC8vPT4gdHJ1ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5pc0luTGVhcFllYXIgLy89PiBmYWxzZVxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc0luTGVhcFllYXIoKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgbW9udGhcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAzKS5kYXlzSW5Nb250aCAvLz0+IDMxXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5c0luTW9udGgoKSB7XG4gICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhpcyBEYXRlVGltZSdzIHllYXJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuZGF5c0luWWVhciAvLz0+IDM2NlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5c0luWWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZGF5c0luWWVhcih0aGlzLnllYXIpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAwNCkud2Vla3NJbldlZWtZZWFyIC8vPT4gNTNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrc0luV2Vla1llYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHdlZWtzSW5XZWVrWWVhcih0aGlzLndlZWtZZWFyKSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBJbnRsIG9wdGlvbnMgZm9yIHRoaXMgRGF0ZVRpbWUuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGluIHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIG9mIGZvcm1hdHRpbmcgbWV0aG9kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIHRoZSBzYW1lIG9wdGlvbnMgYXMgdG9Mb2NhbGVTdHJpbmdcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgcmVzb2x2ZWRMb2NhbGVPcHRpb25zKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBGb3JtYXR0ZXIuY3JlYXRlKFxuICAgICAgdGhpcy5sb2MuY2xvbmUob3B0cyksXG4gICAgICBvcHRzXG4gICAgKS5yZXNvbHZlZE9wdGlvbnModGhpcyk7XG4gICAgcmV0dXJuIHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyOiBjYWxlbmRhciB9O1xuICB9XG5cbiAgLy8gVFJBTlNGT1JNXG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBVVEMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgRGF0ZVRpbWUjc2V0Wm9uZX0oJ3V0YycpXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gb3B0aW9uYWxseSwgYW4gb2Zmc2V0IGZyb20gVVRDIGluIG1pbnV0ZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIG9wdGlvbnMgdG8gcGFzcyB0byBgc2V0Wm9uZSgpYFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHRvVVRDKG9mZnNldCA9IDAsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byBgc2V0Wm9uZSgnbG9jYWwnKWBcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBzcGVjaWZpZWQgem9uZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2V0dGVyIGtlZXBzIHRoZSB1bmRlcmx5aW5nIHRpbWUgdGhlIHNhbWUgKGFzIGluLCB0aGUgc2FtZSB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBEYXRlVGltZSNwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbH0gYW5kIHtAbGluayBEYXRlVGltZSN0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFt6b25lPSdsb2NhbCddIC0gYSB6b25lIGlkZW50aWZpZXIuIEFzIGEgc3RyaW5nLCB0aGF0IGNhbiBiZSBhbnkgSUFOQSB6b25lIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBlbnZpcm9ubWVudCwgb3IgYSBmaXhlZC1vZmZzZXQgbmFtZSBvZiB0aGUgZm9ybSAnVVRDKzMnLCBvciB0aGUgc3RyaW5ncyAnbG9jYWwnIG9yICd1dGMnLiBZb3UgbWF5IGFsc28gc3VwcGx5IGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIERhdGVUaW1lI1pvbmV9IGNsYXNzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzZXRab25lKHpvbmUsIHsga2VlcExvY2FsVGltZSA9IGZhbHNlLCBrZWVwQ2FsZW5kYXJUaW1lID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgem9uZSA9IG5vcm1hbGl6ZVpvbmUoem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICh6b25lLmVxdWFscyh0aGlzLnpvbmUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKCF6b25lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXdUUyA9IHRoaXMudHM7XG4gICAgICBpZiAoa2VlcExvY2FsVGltZSB8fCBrZWVwQ2FsZW5kYXJUaW1lKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldEd1ZXNzID0gem9uZS5vZmZzZXQodGhpcy50cyk7XG4gICAgICAgIGNvbnN0IGFzT2JqID0gdGhpcy50b09iamVjdCgpO1xuICAgICAgICBbbmV3VFNdID0gb2JqVG9UUyhhc09iaiwgb2Zmc2V0R3Vlc3MsIHpvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdHM6IG5ld1RTLCB6b25lIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgLSB0aGUgcHJvcGVydGllcyB0byBzZXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgcmVjb25maWd1cmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgY29uc3QgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgbG9jIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKiBKdXN0IGEgY29udmVuaWVudCBhbGlhcyBmb3IgcmVjb25maWd1cmUoeyBsb2NhbGUgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqIFlvdSBjYW4gb25seSBzZXQgdW5pdHMgd2l0aCB0aGlzIG1ldGhvZDsgZm9yIFwic2V0dGluZ1wiIG1ldGFkYXRhLCBzZWUge0BsaW5rIERhdGVUaW1lI3JlY29uZmlndXJlfSBhbmQge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9LlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyBob3VyOiA4LCBtaW51dGU6IDMwIH0pXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHdlZWtkYXk6IDUgfSlcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3QodmFsdWVzLCBub3JtYWxpemVVbml0KSxcbiAgICAgIHNldHRpbmdXZWVrU3R1ZmYgPVxuICAgICAgICAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrWWVhcikgfHxcbiAgICAgICAgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla051bWJlcikgfHxcbiAgICAgICAgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla2RheSksXG4gICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyO1xuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGxldCBtaXhlZDtcbiAgICBpZiAoc2V0dGluZ1dlZWtTdHVmZikge1xuICAgICAgbWl4ZWQgPSB3ZWVrVG9HcmVnb3JpYW4oeyAuLi5ncmVnb3JpYW5Ub1dlZWsodGhpcy5jKSwgLi4ubm9ybWFsaXplZCB9KTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpKSB7XG4gICAgICBtaXhlZCA9IG9yZGluYWxUb0dyZWdvcmlhbih7IC4uLmdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLCAuLi5ub3JtYWxpemVkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IHsgLi4udGhpcy50b09iamVjdCgpLCAuLi5ub3JtYWxpemVkIH07XG5cbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBzZXQgdGhlIGRheSBidXQgd2UgZW5kZWQgdXAgb24gYW4gb3ZlcmZsb3cgZGF0ZSxcbiAgICAgIC8vIHVzZSB0aGUgbGFzdCBkYXkgb2YgdGhlIHJpZ2h0IG1vbnRoXG4gICAgICBpZiAoaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpKSB7XG4gICAgICAgIG1peGVkLmRheSA9IE1hdGgubWluKGRheXNJbk1vbnRoKG1peGVkLnllYXIsIG1peGVkLm1vbnRoKSwgbWl4ZWQuZGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBbdHMsIG9dID0gb2JqVG9UUyhtaXhlZCwgdGhpcy5vLCB0aGlzLnpvbmUpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHRzLCBvIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXG4gICAqXG4gICAqIEFkZGluZyBob3VycywgbWludXRlcywgc2Vjb25kcywgb3IgbWlsbGlzZWNvbmRzIGluY3JlYXNlcyB0aGUgdGltZXN0YW1wIGJ5IHRoZSByaWdodCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBBZGRpbmcgZGF5cywgbW9udGhzLCBvciB5ZWFycyBzaGlmdHMgdGhlIGNhbGVuZGFyLCBhY2NvdW50aW5nIGZvciBEU1RzIGFuZCBsZWFwIHllYXJzIGFsb25nIHRoZSB3YXkuIFRodXMsIGBkdC5wbHVzKHsgaG91cnM6IDI0IH0pYCBtYXkgcmVzdWx0IGluIGEgZGlmZmVyZW50IHRpbWUgdGhhbiBgZHQucGx1cyh7IGRheXM6IDEgfSlgIGlmIHRoZXJlJ3MgYSBEU1Qgc2hpZnQgaW4gYmV0d2Vlbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKDEyMykgLy9+PiBpbiAxMjMgbWlsbGlzZWNvbmRzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IC0xIH0pIC8vfj4gdGhpcyB0aW1lIHllc3RlcmRheVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMyBociwgMTMgbWluXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAzIGhyLCAxMyBtaW5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBwbHVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnRyYWN0IGEgcGVyaW9kIG9mIHRpbWUgdG8gdGhpcyBEYXRlVGltZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVcbiAgICogU2VlIHtAbGluayBEYXRlVGltZSNwbHVzfVxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgbWludXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgZHVyID0gRHVyYXRpb24uZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbikubmVnYXRlKCk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSB1bml0IG9mIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGJlZ2lubmluZyBvZi4gQ2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZignbW9udGgnKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMy0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZigneWVhcicpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAxLTAxJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCd3ZWVrJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDMnLCB3ZWVrcyBhbHdheXMgc3RhcnQgb24gTW9uZGF5c1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignZGF5JykudG9JU09UaW1lKCk7IC8vPT4gJzAwOjAwLjAwMC0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2hvdXInKS50b0lTT1RpbWUoKTsgLy89PiAnMDU6MDA6MDAuMDAwLTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXJ0T2YodW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBvID0ge30sXG4gICAgICBub3JtYWxpemVkVW5pdCA9IER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCk7XG4gICAgc3dpdGNoIChub3JtYWxpemVkVW5pdCkge1xuICAgICAgY2FzZSBcInllYXJzXCI6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBcInF1YXJ0ZXJzXCI6XG4gICAgICBjYXNlIFwibW9udGhzXCI6XG4gICAgICAgIG8uZGF5ID0gMTtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJ3ZWVrc1wiOlxuICAgICAgY2FzZSBcImRheXNcIjpcbiAgICAgICAgby5ob3VyID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJob3Vyc1wiOlxuICAgICAgICBvLm1pbnV0ZSA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwibWludXRlc1wiOlxuICAgICAgICBvLnNlY29uZCA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwic2Vjb25kc1wiOlxuICAgICAgICBvLm1pbGxpc2Vjb25kID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gbm8gZGVmYXVsdCwgaW52YWxpZCB1bml0cyB0aHJvdyBpbiBub3JtYWxpemVVbml0KClcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwid2Vla3NcIikge1xuICAgICAgby53ZWVrZGF5ID0gMTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwicXVhcnRlcnNcIikge1xuICAgICAgY29uc3QgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGVuZCAobWVhbmluZyB0aGUgbGFzdCBtaWxsaXNlY29uZCkgb2YgYSB1bml0IG9mIHRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgZW5kIG9mLiBDYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZignbW9udGgnKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3llYXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTEyLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3dlZWsnKS50b0lTTygpOyAvLyA9PiAnMjAxNC0wMy0wOVQyMzo1OTo1OS45OTktMDU6MDAnLCB3ZWVrcyBzdGFydCBvbiBNb25kYXlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignZGF5JykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignaG91cicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMDU6NTk6NTkuOTk5LTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIGVuZE9mKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkXG4gICAgICA/IHRoaXMucGx1cyh7IFt1bml0XTogMSB9KVxuICAgICAgICAgIC5zdGFydE9mKHVuaXQpXG4gICAgICAgICAgLm1pbnVzKDEpXG4gICAgICA6IHRoaXM7XG4gIH1cblxuICAvLyBPVVRQVVRcblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxuICAgKiAqKllvdSBtYXkgbm90IHdhbnQgdGhpcy4qKiBTZWUge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3IgYSBtb3JlIGZsZXhpYmxlIGZvcm1hdHRpbmcgdG9vbC4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uLyMvZm9ybWF0dGluZz9pZD10YWJsZS1vZi10b2tlbnMpLlxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgQXByIDIyJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoJ2ZyJykudG9Gb3JtYXQoJ3l5eXkgTExMIGRkJykgLy89PiAnMjAxNyBhdnIuIDIyJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnLCB7IGxvY2FsZTogXCJmclwiIH0pIC8vPT4gJzIwMTcgYXZyLiAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Gb3JtYXQoXCJISCAnaG91cnMgYW5kJyBtbSAnbWludXRlcydcIikgLy89PiAnMjAgaG91cnMgYW5kIDU1IG1pbnV0ZXMnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvRm9ybWF0KGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4ob3B0cykpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpXG4gICAgICA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0ZS4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIHRoZSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIGFuZCBhbnkgcHJlc2V0cyBkZWZpbmVkIGJ5IEx1eG9uLCBzdWNoIGFzIGBEYXRlVGltZS5EQVRFX0ZVTExgIG9yIGBEYXRlVGltZS5USU1FX1NJTVBMRWAuXG4gICAqIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBicm93c2VyLXNwZWNpZmljLCBidXQgaW4gZ2VuZXJhbCBpdCB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvblxuICAgKiBvZiB0aGUgRGF0ZVRpbWUgaW4gdGhlIGFzc2lnbmVkIGxvY2FsZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIGZvcm1hdE9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZSgnZW4tZ2InKS50b0xvY2FsZVN0cmluZygpOyAvLz0+ICcyMC8wNC8yMDE3J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IGxvY2FsZTogJ2VuLWdiJyB9KTsgLy89PiAnMjAvMDQvMjAxNydcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9GVUxMKTsgLy89PiAnQXByaWwgMjAsIDIwMTcnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfU0lNUExFKTsgLy89PiAnMTE6MzIgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVUSU1FX1NIT1JUKTsgLy89PiAnNC8yMC8yMDE3LCAxMTozMiBBTSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoeyB3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHVyc2RheSwgQXByaWwgMjAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdzaG9ydCcsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHUsIEFwciAyMCwgMTE6MjcgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JywgaG91ckN5Y2xlOiAnaDIzJyB9KTsgLy89PiAnMTE6MzInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvTG9jYWxlU3RyaW5nKGZvcm1hdE9wdHMgPSBGb3JtYXRzLkRBVEVfU0hPUlQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgZm9ybWF0T3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcylcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm1hdCBcInBhcnRzXCIsIG1lYW5pbmcgaW5kaXZpZHVhbCB0b2tlbnMgYWxvbmcgd2l0aCBtZXRhZGF0YS4gVGhpcyBpcyBhbGxvd3MgY2FsbGVycyB0byBwb3N0LXByb2Nlc3MgaW5kaXZpZHVhbCBzZWN0aW9ucyBvZiB0aGUgZm9ybWF0dGVkIG91dHB1dC5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXQvZm9ybWF0VG9QYXJ0c1xuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucywgc2FtZSBhcyBgdG9Mb2NhbGVTdHJpbmdgLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVBhcnRzKCk7IC8vPT4gW1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2RheScsIHZhbHVlOiAnMjUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdtb250aCcsIHZhbHVlOiAnMDUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICd5ZWFyJywgdmFsdWU6ICcxOTgyJyB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IF1cbiAgICovXG4gIHRvTG9jYWxlUGFydHMob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODMsIDUsIDI1KS50b0lTTygpIC8vPT4gJzE5ODItMDUtMjVUMDA6MDA6MDAuMDAwWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNS0wNDowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMjAxNzA0MjJUMjA0NzA1LjMzNS0wNDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTTyh7XG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiLFxuICAgIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gZmFsc2UsXG4gICAgaW5jbHVkZU9mZnNldCA9IHRydWUsXG4gIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBleHQgPSBmb3JtYXQgPT09IFwiZXh0ZW5kZWRcIjtcblxuICAgIGxldCBjID0gdG9JU09EYXRlKHRoaXMsIGV4dCk7XG4gICAgYyArPSBcIlRcIjtcbiAgICBjICs9IHRvSVNPVGltZSh0aGlzLCBleHQsIHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHMsIGluY2x1ZGVPZmZzZXQpO1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzE5ODIwNTI1J1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT0RhdGUoeyBmb3JtYXQgPSBcImV4dGVuZGVkXCIgfSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0b0lTT0RhdGUodGhpcywgZm9ybWF0ID09PSBcImV4dGVuZGVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3Mgd2VlayBkYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09XZWVrRGF0ZSgpIC8vPT4gJzE5ODItVzIxLTInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSVNPV2Vla0RhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcImtra2stJ1cnV1ctY1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHRpbWUgY29tcG9uZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVQcmVmaXg9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgYFRgIHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoKSAvLz0+ICcwNzozNDoxOS4zNjFaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0LCBzZWNvbmRzOiAwLCBtaWxsaXNlY29uZHM6IDAgfSkudG9JU09UaW1lKHsgc3VwcHJlc3NTZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzA3OjM0WidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMDczNDE5LjM2MVonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMDc6MzQ6MTkuMzYxWidcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKHtcbiAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IGZhbHNlLFxuICAgIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICAgIGluY2x1ZGVPZmZzZXQgPSB0cnVlLFxuICAgIGluY2x1ZGVQcmVmaXggPSBmYWxzZSxcbiAgICBmb3JtYXQgPSBcImV4dGVuZGVkXCIsXG4gIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgYyA9IGluY2x1ZGVQcmVmaXggPyBcIlRcIiA6IFwiXCI7XG4gICAgcmV0dXJuIChcbiAgICAgIGMgK1xuICAgICAgdG9JU09UaW1lKHRoaXMsIGZvcm1hdCA9PT0gXCJleHRlbmRlZFwiLCBzdXBwcmVzc1NlY29uZHMsIHN1cHByZXNzTWlsbGlzZWNvbmRzLCBpbmNsdWRlT2Zmc2V0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBSRkMgMjgyMi1jb21wYXRpYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCArMDAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgLTA0MDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvUkZDMjgyMigpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWlpcIiwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEhUVFAgaGVhZGVycy4gVGhlIG91dHB1dCBpcyBhbHdheXMgZXhwcmVzc2VkIGluIEdNVC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgc3RyaW5nIGNvbmZvcm1zIHRvIFJGQyAxMTIzLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgR01UJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMsIDE5KS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDE5OjAwOjAwIEdNVCdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTERhdGUoKSAvLz0+ICcyMDE0LTA3LTEzJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1NRTERhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdG9JU09EYXRlKHRoaXMsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoeyBpbmNsdWRlWm9uZTogZmFsc2UgfSkgLy89PiAnMDU6MTU6MTYuMzQ1IEFtZXJpY2EvTmV3X1lvcmsnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvU1FMVGltZSh7IGluY2x1ZGVPZmZzZXQgPSB0cnVlLCBpbmNsdWRlWm9uZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIGxldCBmbXQgPSBcIkhIOm1tOnNzLlNTU1wiO1xuXG4gICAgaWYgKGluY2x1ZGVab25lIHx8IGluY2x1ZGVPZmZzZXQpIHtcbiAgICAgIGZtdCArPSBcIiBcIjtcbiAgICAgIGlmIChpbmNsdWRlWm9uZSkge1xuICAgICAgICBmbXQgKz0gXCJ6XCI7XG4gICAgICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICAgICAgZm10ICs9IFwiWlpcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIGZtdCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IHRydWUgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgQW1lcmljYS9OZXdfWW9yaydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TUUwob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLnRvU1FMRGF0ZSgpfSAke3RoaXMudG9TUUxUaW1lKG9wdHMpfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudG9JU08oKSA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuIEFsaWFzIG9mIHtAbGluayBEYXRlVGltZSN0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIG1pbGxpc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHRvU2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyAvIDEwMDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7RGF0ZX1cbiAgICovXG4gIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRGF0ZVRpbWUncyB5ZWFyLCBtb250aCwgZGF5LCBhbmQgc28gb24uXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvT2JqZWN0KCkgLy89PiB7IHllYXI6IDIwMTcsIG1vbnRoOiA0LCBkYXk6IDIyLCBob3VyOiAyMCwgbWludXRlOiA0OSwgc2Vjb25kOiA0MiwgbWlsbGlzZWNvbmQ6IDI2OCB9XG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHRvT2JqZWN0KG9wdHMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4ge307XG5cbiAgICBjb25zdCBiYXNlID0geyAuLi50aGlzLmMgfTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2Uub3V0cHV0Q2FsZW5kYXIgPSB0aGlzLm91dHB1dENhbGVuZGFyO1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgRGF0ZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge0RhdGV9XG4gICAqL1xuICB0b0pTRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTik7XG4gIH1cblxuICAvLyBDT01QQVJFXG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIGFycmF5IG9mIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xuICAgKiBpMi5kaWZmKGkxKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDQzODA3NTAwMDAwIH1cbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XG4gICAqIGkyLmRpZmYoaTEsIFsnbW9udGhzJywgJ2RheXMnLCAnaG91cnMnXSkudG9PYmplY3QoKSAvLz0+IHsgbW9udGhzOiAxNiwgZGF5czogMTksIGhvdXJzOiAwLjc1IH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBkaWZmKG90aGVyRGF0ZVRpbWUsIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1ck9wdHMgPSB7IGxvY2FsZTogdGhpcy5sb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogdGhpcy5udW1iZXJpbmdTeXN0ZW0sIC4uLm9wdHMgfTtcblxuICAgIGNvbnN0IHVuaXRzID0gbWF5YmVBcnJheSh1bml0KS5tYXAoRHVyYXRpb24ubm9ybWFsaXplVW5pdCksXG4gICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgZWFybGllciA9IG90aGVySXNMYXRlciA/IHRoaXMgOiBvdGhlckRhdGVUaW1lLFxuICAgICAgbGF0ZXIgPSBvdGhlcklzTGF0ZXIgPyBvdGhlckRhdGVUaW1lIDogdGhpcyxcbiAgICAgIGRpZmZlZCA9IGRpZmYoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBkdXJPcHRzKTtcblxuICAgIHJldHVybiBvdGhlcklzTGF0ZXIgPyBkaWZmZWQubmVnYXRlKCkgOiBkaWZmZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgcmlnaHQgbm93LlxuICAgKiBTZWUge0BsaW5rIERhdGVUaW1lI2RpZmZ9XG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBkaWZmTm93KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLm5vdygpLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgc3Bhbm5pbmcgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCBhbm90aGVyIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgZW5kIHBvaW50IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHVudGlsKG90aGVyRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyh0aGlzLCBvdGhlckRhdGVUaW1lKSA6IHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBEYXRlVGltZSBpcyBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWUgYXMgYW5vdGhlciBEYXRlVGltZS5cbiAgICogSGlnaGVyLW9yZGVyIHVuaXRzIG11c3QgYWxzbyBiZSBpZGVudGljYWwgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGB0cnVlYC5cbiAgICogTm90ZSB0aGF0IHRpbWUgem9uZXMgYXJlICoqaWdub3JlZCoqIGluIHRoaXMgY29tcGFyaXNvbiwgd2hpY2ggY29tcGFyZXMgdGhlICoqbG9jYWwqKiBjYWxlbmRhciB0aW1lLiBVc2Uge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9IHRvIGNvbnZlcnQgb25lIG9mIHRoZSBkYXRlcyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNoZWNrIHNhbWVuZXNzIG9uXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLmhhc1NhbWUob3RoZXJEVCwgJ2RheScpOyAvL34+IHRydWUgaWYgb3RoZXJEVCBpcyBpbiB0aGUgc2FtZSBjdXJyZW50IGNhbGVuZGFyIGRheVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZShvdGhlckRhdGVUaW1lLCB1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGlucHV0TXMgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKTtcbiAgICBjb25zdCBhZGp1c3RlZFRvWm9uZSA9IHRoaXMuc2V0Wm9uZShvdGhlckRhdGVUaW1lLnpvbmUsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gYWRqdXN0ZWRUb1pvbmUuc3RhcnRPZih1bml0KSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gYWRqdXN0ZWRUb1pvbmUuZW5kT2YodW5pdCk7XG4gIH1cblxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBoYXZlIHRoZSBzYW1lIHpvbmUgYW5kIGxvY2F0aW9uLCBhbmQgYXJlIGJvdGggdmFsaWQuXG4gICAqIFRvIGNvbXBhcmUganVzdCB0aGUgbWlsbGlzZWNvbmQgdmFsdWVzLCB1c2UgYCtkdDEgPT09ICtkdDJgLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlciAtIHRoZSBvdGhlciBEYXRlVGltZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNWYWxpZCAmJlxuICAgICAgb3RoZXIuaXNWYWxpZCAmJlxuICAgICAgdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyLnZhbHVlT2YoKSAmJlxuICAgICAgdGhpcy56b25lLmVxdWFscyhvdGhlci56b25lKSAmJlxuICAgICAgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0aGlzIHRpbWUgcmVsYXRpdmUgdG8gbm93LCBzdWNoIGFzIFwiaW4gdHdvIGRheXNcIi4gQ2FuIG9ubHkgaW50ZXJuYXRpb25hbGl6ZSBpZiB5b3VyXG4gICAqIHBsYXRmb3JtIHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LiBSb3VuZHMgZG93biBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9XCJsb25nXCJdIC0gdGhlIHN0eWxlIG9mIHVuaXRzLCBtdXN0IGJlIFwibG9uZ1wiLCBcInNob3J0XCIsIG9yIFwibmFycm93XCJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHM7IGlmIG9taXR0ZWQsIG9yIGFuIGFycmF5LCB0aGUgbWV0aG9kIHdpbGwgcGljayB0aGUgYmVzdCB1bml0LiBVc2UgYW4gYXJyYXkgb3Igb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBvciBcInNlY29uZHNcIlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJvdW5kPXRydWVdIC0gd2hldGhlciB0byByb3VuZCB0aGUgbnVtYmVycyBpbiB0aGUgb3V0cHV0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFkZGluZz0wXSAtIHBhZGRpbmcgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIGFsbG93cyB5b3UgdG8gcm91bmQgdXAgdGhlIHJlc3VsdCBpZiBpdCBmaXRzIGluc2lkZSB0aGUgdGhyZXNob2xkLiBEb24ndCB1c2UgaW4gY29tYmluYXRpb24gd2l0aCB7cm91bmQ6IGZhbHNlfSBiZWNhdXNlIHRoZSBkZWNpbWFsIG91dHB1dCB3aWxsIGluY2x1ZGUgdGhlIHBhZGRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmxvY2FsZSAtIG92ZXJyaWRlIHRoZSBsb2NhbGUgb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSBvdmVycmlkZSB0aGUgbnVtYmVyaW5nU3lzdGVtIG9mIHRoaXMgRGF0ZVRpbWUuIFRoZSBJbnRsIHN5c3RlbSBtYXkgY2hvb3NlIG5vdCB0byBob25vciB0aGlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiaW4gMSBkYXlcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoXCJlc1wiKS50b1JlbGF0aXZlKHsgZGF5czogMSB9KSAvLz0+IFwiZGVudHJvIGRlIDEgZFx1MDBFRGFcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRhbnMgMjMgaGV1cmVzXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlKHsgdW5pdDogXCJob3Vyc1wiIH0pIC8vPT4gXCI0OCBob3VycyBhZ29cIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5taW51cyh7IGhvdXJzOiAzNiB9KS50b1JlbGF0aXZlKHsgcm91bmQ6IGZhbHNlIH0pIC8vPT4gXCIxLjUgZGF5cyBhZ29cIlxuICAgKi9cbiAgdG9SZWxhdGl2ZShvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYmFzZSA9IG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHt9LCB7IHpvbmU6IHRoaXMuem9uZSB9KSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcgPyAodGhpcyA8IGJhc2UgPyAtb3B0aW9ucy5wYWRkaW5nIDogb3B0aW9ucy5wYWRkaW5nKSA6IDA7XG4gICAgbGV0IHVuaXRzID0gW1wieWVhcnNcIiwgXCJtb250aHNcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXTtcbiAgICBsZXQgdW5pdCA9IG9wdGlvbnMudW5pdDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnVuaXQpKSB7XG4gICAgICB1bml0cyA9IG9wdGlvbnMudW5pdDtcbiAgICAgIHVuaXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkaWZmUmVsYXRpdmUoYmFzZSwgdGhpcy5wbHVzKHBhZGRpbmcpLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbnVtZXJpYzogXCJhbHdheXNcIixcbiAgICAgIHVuaXRzLFxuICAgICAgdW5pdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZGF0ZSByZWxhdGl2ZSB0byB0b2RheSwgc3VjaCBhcyBcInllc3RlcmRheVwiIG9yIFwibmV4dCBtb250aFwiLlxuICAgKiBPbmx5IGludGVybmF0aW9uYWxpemVzIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5sb2NhbGUgLSBvdmVycmlkZSB0aGUgbG9jYWxlIG9mIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQ7IGlmIG9taXR0ZWQsIHRoZSBtZXRob2Qgd2lsbCBwaWNrIHRoZSB1bml0LiBVc2Ugb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIG9yIFwiZGF5c1wiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIG92ZXJyaWRlIHRoZSBudW1iZXJpbmdTeXN0ZW0gb2YgdGhpcyBEYXRlVGltZS4gVGhlIEludGwgc3lzdGVtIG1heSBjaG9vc2Ugbm90IHRvIGhvbm9yIHRoaXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKCkgLy89PiBcInRvbW9ycm93XCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuc2V0TG9jYWxlKFwiZXNcIikucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCJcIm1hXHUwMEYxYW5hXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRlbWFpblwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqL1xuICB0b1JlbGF0aXZlQ2FsZW5kYXIob3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGRpZmZSZWxhdGl2ZShvcHRpb25zLmJhc2UgfHwgRGF0ZVRpbWUuZnJvbU9iamVjdCh7fSwgeyB6b25lOiB0aGlzLnpvbmUgfSksIHRoaXMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBudW1lcmljOiBcImF1dG9cIixcbiAgICAgIHVuaXRzOiBbXCJ5ZWFyc1wiLCBcIm1vbnRoc1wiLCBcImRheXNcIl0sXG4gICAgICBjYWxlbmRhcnk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtaW4gb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtaW4gRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgc3RhdGljIG1pbiguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWluIHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgKGkpID0+IGkudmFsdWVPZigpLCBNYXRoLm1pbik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtYXggb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1heGltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtYXggRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgc3RhdGljIG1heCguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgKGkpID0+IGkudmFsdWVPZigpLCBNYXRoLm1heCk7XG4gIH1cblxuICAvLyBNSVNDXG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gaG93IGEgc3RyaW5nIHdvdWxkIGJlIHBhcnNlZCBieSBmcm9tRm9ybWF0KClcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRha2VuIGJ5IGZyb21Gb3JtYXQoKVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxvY2FsZSA9IG51bGwsIG51bWJlcmluZ1N5c3RlbSA9IG51bGwgfSA9IG9wdGlvbnMsXG4gICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBkZWZhdWx0VG9FTjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIHJldHVybiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxuICAgKi9cbiAgc3RhdGljIGZyb21TdHJpbmdFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBGT1JNQVQgUFJFU0VUU1xuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlIDEwLzE0LzE5ODNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9TSE9SVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX1NIT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9NRUQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9NRUQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpLCBPY3QgMTQsIDE5ODMnXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9GVUxMKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVfRlVMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdUdWVzZGF5LCBPY3RvYmVyIDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX0hVR0UoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9IVUdFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfU0lNUExFKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfU0lNUExFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9MT05HX09GRlNFVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9TSU1QTEUoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9TSU1QTEU7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX1NIT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX01FRDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaSwgMTQgT2N0IDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfV0VFS0RBWSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9XRUVLREFZO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTEwoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfRlVMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0UoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfSFVHRTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyaWVuZGx5RGF0ZVRpbWUoZGF0ZVRpbWVpc2gpIHtcbiAgaWYgKERhdGVUaW1lLmlzRGF0ZVRpbWUoZGF0ZVRpbWVpc2gpKSB7XG4gICAgcmV0dXJuIGRhdGVUaW1laXNoO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoICYmIGRhdGVUaW1laXNoLnZhbHVlT2YgJiYgaXNOdW1iZXIoZGF0ZVRpbWVpc2gudmFsdWVPZigpKSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tSlNEYXRlKGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCAmJiB0eXBlb2YgZGF0ZVRpbWVpc2ggPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbU9iamVjdChkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYFVua25vd24gZGF0ZXRpbWUgYXJndW1lbnQ6ICR7ZGF0ZVRpbWVpc2h9LCBvZiB0eXBlICR7dHlwZW9mIGRhdGVUaW1laXNofWBcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBJbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IEluZm8gZnJvbSBcIi4vaW5mby5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4vem9uZS5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IEludmFsaWRab25lIGZyb20gXCIuL3pvbmVzL2ludmFsaWRab25lLmpzXCI7XG5pbXBvcnQgU3lzdGVtWm9uZSBmcm9tIFwiLi96b25lcy9zeXN0ZW1ab25lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgVkVSU0lPTiA9IFwiMi4zLjBcIjtcblxuZXhwb3J0IHtcbiAgVkVSU0lPTixcbiAgRGF0ZVRpbWUsXG4gIER1cmF0aW9uLFxuICBJbnRlcnZhbCxcbiAgSW5mbyxcbiAgWm9uZSxcbiAgRml4ZWRPZmZzZXRab25lLFxuICBJQU5BWm9uZSxcbiAgSW52YWxpZFpvbmUsXG4gIFN5c3RlbVpvbmUsXG4gIFNldHRpbmdzLFxufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjIxJztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbicsXG4gICAgICBJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUID0gJ0ludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgJztcblxuICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG4gIHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuICAvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG4gIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbiAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG4gIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG4gIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgdmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbiAgLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG4gIHZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgICAgREVGQVVMVF9UUlVOQ19PTUlTU0lPTiA9ICcuLi4nO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbiAgdmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICAgIEhPVF9TUEFOID0gMTY7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyLFxuICAgICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbiAgdmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgICBOQU4gPSAwIC8gMDtcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xuICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMSxcbiAgICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbiAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbiAgdmFyIHdyYXBGbGFncyA9IFtcbiAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLFxuICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLFxuICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSxcbiAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuICBdO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICAgIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBkb21FeGNUYWcgPSAnW29iamVjdCBET01FeGNlcHRpb25dJyxcbiAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nLFxuICAgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXScsXG4gICAgICB3ZWFrU2V0VGFnID0gJ1tvYmplY3QgV2Vha1NldF0nO1xuXG4gIHZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2csXG4gICAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxcbiAgICAgIHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGUgPSAvPCUtKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlRXZhbHVhdGUgPSAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXG4gICAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhciA9IFJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG4gIHZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG4gIHZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHZhbGlkYXRlIHRoZSBgdmFsaWRhdGVgIG9wdGlvbiBpbiBgXy50ZW1wbGF0ZWAgdmFyaWFibGUuXG4gICAqXG4gICAqIEZvcmJpZHMgY2hhcmFjdGVycyB3aGljaCBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IGRlZmluaXRpb246XG4gICAqIC0gXCIoKSxcIiAobW9kaWZpY2F0aW9uIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMpXG4gICAqIC0gXCI9XCIgKGRlZmF1bHQgdmFsdWUpXG4gICAqIC0gXCJbXXt9XCIgKGRlc3RydWN0dXJpbmcgb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIi9cIiAoYmVnaW5uaW5nIG9mIGEgY29tbWVudClcbiAgICogLSB3aGl0ZXNwYWNlXG4gICAqL1xuICB2YXIgcmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMgPSAvWygpPSx7fVxcW1xcXVxcL1xcc10vO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4gIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsXG4gICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JyxcbiAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLFxuICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJyxcbiAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAgICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAgICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAgICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAgICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAgICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAgICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgICAnXFx4ZGYnOiAnc3MnLFxuICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAgICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAgICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAgICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAgICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAgICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAgICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAgICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAgICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi9cbiAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICAgJyZhbXA7JzogJyYnLFxuICAgICcmbHQ7JzogJzwnLFxuICAgICcmZ3Q7JzogJz4nLFxuICAgICcmcXVvdDsnOiAnXCInLFxuICAgICcmIzM5Oyc6IFwiJ1wiXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciBzdHJpbmdFc2NhcGVzID0ge1xuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG4gIHZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQsXG4gICAgICBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbiAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4gIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xuICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICAgIGlmICh0eXBlcykge1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSgpKTtcblxuICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xuICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLFxuICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSxcbiAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLFxuICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsXG4gICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCxcbiAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gICAqL1xuICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgfVxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5Wy0tbGVuZ3RoXTtcbiAgICB9XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICB2YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5maW5kS2V5YCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZWFjaEZ1bmMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lYW5gIGFuZCBgXy5tZWFuQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gbGVuZ3RoID8gKGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSAvIGxlbmd0aCkgOiBOQU47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgKiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnN1bWAgYW5kIGBfLnN1bUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBjdXJyZW50IDogKHJlc3VsdCArIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1BhaXJzYCBhbmQgYF8udG9QYWlyc0luYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5XG4gICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZ1xuICAgICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICAgIDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gICAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7XG4gICAgICB9XG4gICAgICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgICAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgICAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICAgICAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc1RvYCB3aGljaCBhY2NlcHRzIGBwcm9wc2AgdG8gY2hlY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF0sXG4gICAgICAgICAgICBwcmVkaWNhdGUgPSBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHx8ICFwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5kZWxheWAgYW5kIGBfLmRlZmVyYCB3aGljaCBhY2NlcHRzIGBhcmdzYFxuICAgICAqIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgZXhjbHVkaW5nIG11bHRpcGxlIGFycmF5cyBvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoUmlnaHQgPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSAhIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICAgICAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbGxgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IGxlbmd0aCkgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbmQgPSBzdGFydCA+IGVuZCA/IDAgOiB0b0xlbmd0aChlbmQpO1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGFycmF5W3N0YXJ0KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICAgICAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VGb3JgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllc1xuICAgICAqIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvclJpZ2h0ID0gY3JlYXRlQmFzZUZvcih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25SaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZnVuY3Rpb25zYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mXG4gICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmlsdGVyLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QsIHByb3BzKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gICAgICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgICAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gbnVtYmVyID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiBudW1iZXIgPCBuYXRpdmVNYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmludGVyc2VjdGlvbmAsIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluY2x1ZGVzID0gY29tcGFyYXRvciA/IGFycmF5SW5jbHVkZXNXaXRoIDogYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGgsXG4gICAgICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgICAgICBtYXhMZW5ndGggPSBJbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW290aEluZGV4XTtcbiAgICAgICAgaWYgKG90aEluZGV4ICYmIGl0ZXJhdGVlKSB7XG4gICAgICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4TGVuZ3RoID0gbmF0aXZlTWluKGFycmF5Lmxlbmd0aCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgICAgICA/IG5ldyBTZXRDYWNoZShvdGhJbmRleCAmJiBhcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFycmF5ID0gYXJyYXlzWzBdO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoIShzZWVuXG4gICAgICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgICAgIGlmICghKGNhY2hlXG4gICAgICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZlcnRgIGFuZCBgXy5pbnZlcnRCeWAgd2hpY2ggaW52ZXJ0c1xuICAgICAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgaXRlcmF0ZWUodmFsdWUpLCBrZXksIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZva2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIG1ldGhvZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHZhciBmdW5jID0gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFwcGx5KGZ1bmMsIG9iamVjdCwgYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJyYXlCdWZmZXJgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJyYXlCdWZmZXJUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNEYXRlYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGRhdGVUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICAgICAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICAgICAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgICAgIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICAgICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgICAgIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgICAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgICAgIG9iaklzT2JqID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICAgICAgOiAhKGRhdGFbMF0gaW4gb2JqZWN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xuXG4gICAgICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrO1xuICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gcmVnZXhwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgICAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgICAgIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTHQodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICAgICAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJhc2VGb3Ioc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgaWYgKGl0ZXJhdGVlcy5sZW5ndGgpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQWxsQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgc2VlbiA9IGFycmF5O1xuXG4gICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKHNlZW4sIGNvbXB1dGVkLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpKSA+IC0xKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChzZWVuLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gaW5kZXhlcy5sZW5ndGggOiAwLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlciBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7XG4gICAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAqIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICAgICAgc3RhcnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKG4pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4pIHtcbiAgICAgIHZhciBhcnJheSA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gICAgICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAgICAgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZVxuICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgIHZhciB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgICAgIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgICAgIDogKHZhbHVlID09PSBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gICAgICpcbiAgICAgKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyB1c2VkIHRvIGludm9rZSBhIGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAqIGBfLnJlYXJnYCBtb2RpZnkgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlXG4gICAgICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgKiBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICAgICAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sXG4gICAgICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gICAgICB2YXIgaXNDb21ibyA9XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTtcblxuICAgICAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gICAgICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcgPyAwIDogV1JBUF9DVVJSWV9CT1VORF9GTEFHO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVszXTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgICAgICBkYXRhWzNdID0gcGFydGlhbHMgPyBjb21wb3NlQXJncyhwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs0XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbiAgICAgIHZhbHVlID0gc291cmNlWzVdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHBhcnRpYWxzID0gZGF0YVs1XTtcbiAgICAgICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgubGVuZ3RoIDwgMiA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eVxuICAgICAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BzZXRUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBzZXRUaW1lb3V0ID0gY3R4U2V0VGltZW91dCB8fCBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgICByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsIHdhaXQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICAgICAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gICAgICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHNpemUgPSBzaXplID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBzaXplO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbcmFuZF07XG5cbiAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICB2YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG4gICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgICAgIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9faW5kZXhfXyAgPSB3cmFwcGVyLl9faW5kZXhfXztcbiAgICAgIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAqIElmIGBhcnJheWAgY2FuJ3QgYmUgc3BsaXQgZXZlbmx5LCB0aGUgZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nXG4gICAgICogZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIHNpemUsIGd1YXJkKSA6IHNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFycmF5IGNvbmNhdGVuYXRpbmcgYGFycmF5YCB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5c1xuICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzFdO1xuICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgICAgICBhcnJheSA9IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgW3sgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgKiBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYScsICdhJ11cbiAgICAgKlxuICAgICAqIF8uZmlsbChBcnJheSgzKSwgMik7XG4gICAgICogLy8gPT4gWzIsIDIsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpbGwoWzQsIDYsIDgsIDEwXSwgJyonLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbNCwgJyonLCAnKicsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGZyb21JbmRleCA8IDBcbiAgICAgICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgICAgICA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbiBgYXJyYXlgIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksIGRlcHRoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W3BhaXJbMF1dID0gcGFpclsxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGZpcnN0XG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaGVhZChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaGVhZChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVhZChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjFdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScsJ10gVGhlIGVsZW1lbnQgc2VwYXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGpvaW5lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uam9pbihbJ2EnLCAnYicsICdjJ10sICd+Jyk7XG4gICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGpvaW4oYXJyYXksIHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIG9mIGBhcnJheWAuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlIG50aFxuICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgLTIpO1xuICAgICAqIC8vID0+ICdjJztcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGgoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VOdGgoYXJyYXksIHRvSW50ZWdlcihuKSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYFxuICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGwoYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAzIH0sIHsgJ3gnOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYGFycmF5YCBjb3JyZXNwb25kaW5nIHRvIGBpbmRleGVzYCBhbmQgcmV0dXJucyBhblxuICAgICAqIGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmF0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBbaW5kZXhlc10gVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqIHZhciBwdWxsZWQgPSBfLnB1bGxBdChhcnJheSwgWzEsIDNdKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAqIC8vID0+IFsnYicsICdkJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBiYXNlQXQoYXJyYXksIGluZGV4ZXMpO1xuXG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4O1xuICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleGVzID0gW10sXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnQgYmVjb21lcyB0aGUgc2Vjb25kIHRvIGxhc3QsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uXG4gICAgICogW2BBcnJheSNyZXZlcnNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvcmV2ZXJzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLnJldmVyc2UoYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZW5kICYmIHR5cGVvZiBlbmQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHN0YXJ0LCBlbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFszMCwgNTBdLCA0MCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAqIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxO1xuICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFpbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgKiB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgZmFsc2UsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzXG4gICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZmlyc3RcbiAgICAgKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tXG4gICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICogb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcUJ5KFsyLjEsIDEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWRcbiAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwXG4gICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSAwO1xuICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgcmVncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdKTtcbiAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwV2l0aCh6aXBwZWQsIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB1bnppcChhcnJheSk7XG4gICAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB1bmRlZmluZWQsIGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqL1xuICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyXG4gICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy53aXRob3V0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgeG9yID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgKiBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMiwgMy40XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqL1xuICAgIHZhciB6aXAgPSBiYXNlUmVzdCh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IGdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICBncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIGl0ZXJhdGVlID0gbGVuZ3RoID4gMSA/IGFycmF5c1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF9cbiAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgKiAgIC5zb3J0QnkoJ2FnZScpXG4gICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgYGludGVyY2VwdG9yYCBhbmQgcmV0dXJucyBgdmFsdWVgLiBUaGUgaW50ZXJjZXB0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuXG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInBhc3MgdGhydVwiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlXG4gICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oJyAgYWJjICAnKVxuICAgICAqICAuY2hhaW4oKVxuICAgICAqICAudHJpbSgpXG4gICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgICogIH0pXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLmF0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8ob2JqZWN0KS5hdChbJ2FbMF0uYi5jJywgJ2FbMV0nXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgd3JhcHBlckF0ID0gZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgIGludGVyY2VwdG9yID0gZnVuY3Rpb24ob2JqZWN0KSB7IHJldHVybiBiYXNlQXQob2JqZWN0LCBwYXRocyk7IH07XG5cbiAgICAgIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB8fCAhaXNJbmRleChzdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0LCArc3RhcnQgKyAobGVuZ3RoID8gMSA6IDApKTtcbiAgICAgIHZhbHVlLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICdhcmdzJzogW2ludGVyY2VwdG9yXSxcbiAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKS5oZWFkKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRoIGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpXG4gICAgICogICAuY2hhaW4oKVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbW1pdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICAgICAqXG4gICAgICogQG5hbWUgbmV4dFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyTmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB0b0FycmF5KHRoaXMudmFsdWUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBkb25lID8gdW5kZWZpbmVkIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO1xuXG4gICAgICByZXR1cm4geyAnZG9uZSc6IGRvbmUsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgd3JhcHBlciB0byBiZSBpdGVyYWJsZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBwbGFudFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTtcbiAgICAgKlxuICAgICAqIG90aGVyLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzksIDE2XVxuICAgICAqXG4gICAgICogd3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xuXG4gICAgICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB3cmFwcGVyQ2xvbmUocGFyZW50KTtcbiAgICAgICAgY2xvbmUuX19pbmRleF9fID0gMDtcbiAgICAgICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gY2xvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2xvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX3dyYXBwZWRfXztcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHtcbiAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTtcbiAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sXG4gICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWUoKSB7XG4gICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5jb3VudEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICovXG4gICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgICsrcmVzdWx0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICogW2V2ZXJ5dGhpbmcgaXMgdHJ1ZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFjdW91c190cnV0aCkgb2ZcbiAgICAgKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLnJlamVjdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICAgICAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgICAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gICAgICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzYWZlIGludGVnZXIuIEEgc2FmZSBpbnRlZ2VyIGNhbiBiZSBjb21wYXJlZCBhbmRcbiAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAtTUFYX1NBRkVfSU5URUdFUiwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gICAgICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1N0cmluZyhudWxsKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZygtMCk7XG4gICAgICogLy8gPT4gJy0wJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHBzOi8vbWRuLmlvL09iamVjdC9hc3NpZ24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgaWYgKGlzUHJvdG90eXBlKHNvdXJjZSkgfHwgaXNBcnJheUxpa2Uoc291cmNlKSkge1xuICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ25Jbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kV2l0aFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduSW5XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGBwYXRoc2Agb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8uYXQob2JqZWN0LCBbJ2FbMF0uYi5jJywgJ2FbMV0nXSk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIGF0ID0gZmxhdFJlc3QoYmFzZUF0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgYHByb3RvdHlwZWAgb2JqZWN0LiBJZiBhXG4gICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBnaXZlbiwgaXRzIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIGFzc2lnbmVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICogICB0aGlzLnggPSAwO1xuICAgICAqICAgdGhpcy55ID0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHtcbiAgICAgKiAgICdjb25zdHJ1Y3Rvcic6IENpcmNsZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNpcmNsZSA9IG5ldyBDaXJjbGU7XG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXMgPT0gbnVsbCA/IHJlc3VsdCA6IGJhc2VBc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gICAgICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICAgICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnNcbiAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHNEZWVwKHsgJ2EnOiB7ICdiJzogMiB9IH0sIHsgJ2EnOiB7ICdiJzogMSwgJ2MnOiAzIH0gfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzRGVlcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCh1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UpO1xuICAgICAgcmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5JyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBhIGNvbGxlY3Rpb24gaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gcmV0dXJucyAncGViYmxlcycgYXNzdW1pbmcgYF8uZmluZEtleWAgcmV0dXJucyAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd25SaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gICAgICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXRcbiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYW5kXG4gICAgICogaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvblxuICAgICAqIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd24obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYicgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICdhJyB0aGVuICdiJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgKiBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBhbmQgaW5oZXJpdGVkXG4gICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICAgICAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gICAgICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob3RoZXIsICdhJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqIElmIGBvYmplY3RgIGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZVxuICAgICAqIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnQgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3ZhbHVlXSA9IGtleTtcbiAgICB9LCBjb25zdGFudChpZGVudGl0eSkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICovXG4gICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgICAgfVxuICAgIH0sIGdldEl0ZXJhdGVlKTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiBbMSwgMiwgMywgNF0gfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5pbnZva2Uob2JqZWN0LCAnYVswXS5iLmMuc2xpY2UnLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlID0gYmFzZVJlc3QoYmFzZUludm9rZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gICAgICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy5rZXlzKCdoaScpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5c0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tYXBWYWx1ZXNgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgICAqIHNhbWUgdmFsdWVzIGFzIGBvYmplY3RgIGFuZCBrZXlzIGdlbmVyYXRlZCBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGVcbiAgICAgKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBWYWx1ZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXBLZXlzKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleSArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ExJzogMSwgJ2IyJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gICAgICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwS2V5c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlciA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lcmdlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBtZXJnaW5nIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICogbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHNpeCBhcmd1bWVudHM6XG4gICAgICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gb2JqVmFsdWUuY29uY2F0KHNyY1ZhbHVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFsxXSwgJ2InOiBbMl0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZVdpdGgob2JqZWN0LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZVdpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGVcbiAgICAgKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBzbG93ZXIgdGhhbiBgXy5waWNrYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICB2YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGlzRGVlcCA9IGZhbHNlO1xuICAgICAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgICAgaXNEZWVwIHx8IChpc0RlZXAgPSBwYXRoLmxlbmd0aCA+IDEpO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH0pO1xuICAgICAgY29weU9iamVjdChvYmplY3QsIGdldEFsbEtleXNJbihvYmplY3QpLCByZXN1bHQpO1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGJhc2VVbnNldChyZXN1bHQsIHBhdGhzW2xlbmd0aF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICAgICAqIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXRcbiAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d29cbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0Qnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBwaWNrQnkob2JqZWN0LCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgYG9iamVjdGAgcHJvcGVydGllcyBgcHJlZGljYXRlYCByZXR1cm5zXG4gICAgICogdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wcyA9IGFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLCBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHByb3BzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gcHJlZGljYXRlKHZhbHVlLCBwYXRoWzBdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZ2V0YCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYVxuICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgb2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwob2JqZWN0KSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAgICAgKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICAgICAqIGBwYXRoYCBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy5zZXRXaXRoKG9iamVjdCwgJ1swXVsxXScsICdhJywgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXaXRoKG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgXG4gICAgICogd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwIG9yIHNldCwgaXRzXG4gICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlycyA9IGNyZWF0ZVRvUGFpcnMoa2V5cyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzXG4gICAgICogZm9yIGBvYmplY3RgIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcFxuICAgICAqIG9yIHNldCwgaXRzIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNJblxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlyc0luID0gY3JlYXRlVG9QYWlycyhrZXlzSW4pO1xuXG4gICAgLyoqXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAgICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gICAgICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDldXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgICAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDcgfSB9XSB9O1xuICAgICAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHRydWUgOiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgYWNjZXB0cyBgdXBkYXRlcmAgdG8gcHJvZHVjZSB0aGVcbiAgICAgKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICdhWzBdLmIuYycsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiBuOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlcikge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51cGRhdGVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLnZhbHVlcygnaGknKTtcbiAgICAgKiAvLyA9PiBbJ2gnLCAnaSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eVxuICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiAtNVxuICAgICAqXG4gICAgICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IHRvTnVtYmVyKHVwcGVyKTtcbiAgICAgICAgdXBwZXIgPSB1cHBlciA9PT0gdXBwZXIgPyB1cHBlciA6IDA7XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IHRvTnVtYmVyKGxvd2VyKTtcbiAgICAgICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksIGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gICAgICogYGVuZGAgaXMgbm90IHNwZWNpZmllZCwgaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqIElmIGBzdGFydGAgaXMgZ3JlYXRlciB0aGFuIGBlbmRgIHRoZSBwYXJhbXMgYXJlIHN3YXBwZWQgdG8gc3VwcG9ydFxuICAgICAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjMuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5yYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgOCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMiwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoLTMsIC0yLCAtNik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgIH1cbiAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICByZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAgICogaXMgcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgYHRydWVgLCBvciBlaXRoZXIgYGxvd2VyYCBvciBgdXBwZXJgIGFyZVxuICAgICAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmddIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDAsIDUpO1xuICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1KTtcbiAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlb2YgZmxvYXRpbmcgIT0gJ2Jvb2xlYW4nICYmIGlzSXRlcmF0ZWVDYWxsKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpKSB7XG4gICAgICAgIHVwcGVyID0gZmxvYXRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHVwcGVyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gdXBwZXI7XG4gICAgICAgICAgdXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA9PT0gdW5kZWZpbmVkICYmIHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB1cHBlciA9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbG93ZXIgPSB0b0Zpbml0ZShsb3dlcik7XG4gICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBwZXIgPSB0b0Zpbml0ZSh1cHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA+IHVwcGVyKSB7XG4gICAgICAgIHZhciB0ZW1wID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdXBwZXI7XG4gICAgICAgIHVwcGVyID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyB8fCBsb3dlciAlIDEgfHwgdXBwZXIgJSAxKSB7XG4gICAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVNaW4obG93ZXIgKyAocmFuZCAqICh1cHBlciAtIGxvd2VyICsgZnJlZVBhcnNlRmxvYXQoJzFlLScgKyAoKHJhbmQgKyAnJykubGVuZ3RoIC0gMSkpKSksIHVwcGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqL1xuICAgIHZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gY2FwaXRhbGl6ZSh3b3JkKSA6IHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG4gICAgICogdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhcGl0YWxpemVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXBpdGFsaXplKCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gICAgICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gICAgICogYW5kIFtMYXRpbiBFeHRlbmRlZC1BXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbl9FeHRlbmRlZC1BKVxuICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAgICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVidXJyKCdkXHUwMEU5alx1MDBFMCB2dScpO1xuICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBlbmRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249c3RyaW5nLmxlbmd0aF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVuZ3RoXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIGxlbmd0aCk7XG5cbiAgICAgIHZhciBlbmQgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uIC09IHRhcmdldC5sZW5ndGg7XG4gICAgICByZXR1cm4gcG9zaXRpb24gPj0gMCAmJiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIGVuZCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIGFuZCBcIidcIiBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIGNoYXJhY3RlcnMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAqIFwiPlwiIGFuZCBcIi9cIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgKiAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIikgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAgICAgKiBbcXVvdGUgYXR0cmlidXRlIHZhbHVlc10oaHR0cDovL3dvbmtvLmNvbS9wb3N0L2h0bWwtZXNjYXBpbmcpIHRvIHJlZHVjZVxuICAgICAqIFhTUyB2ZWN0b3JzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgXCJeXCIsIFwiJFwiLCBcIlxcXCIsIFwiLlwiLCBcIipcIiwgXCIrXCIsXG4gICAgICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlUmVnRXhwKCdbbG9kYXNoXShodHRwczovL2xvZGFzaC5jb20vKScpO1xuICAgICAqIC8vID0+ICdcXFtsb2Rhc2hcXF1cXChodHRwczovL2xvZGFzaFxcLmNvbS9cXCknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBba2ViYWIgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3BlY2lhbF9jYXNlX3N0eWxlcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBrZWJhYiBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKi9cbiAgICB2YXIga2ViYWJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJy0nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGcmVkJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnZlJFRCdcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9Mb3dlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAqIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgY2FuJ3QgYmUgZXZlbmx5IGRpdmlkZWQgYnkgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgpO1xuICAgICAqIC8vID0+ICcgIGFiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1hYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc3RyTGVuZ3RoID49IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG1pZCA9IChsZW5ndGggLSBzdHJMZW5ndGgpIC8gMjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSwgY2hhcnMpICtcbiAgICAgICAgc3RyaW5nICtcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksIGNoYXJzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChzdHJpbmcgKyBjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJyAgIGFiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSArIHN0cmluZylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBJZiBgcmFkaXhgIGlzXG4gICAgICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAgICAgKiBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICAgICAqIFtFUzUgaW1wbGVtZW50YXRpb25dKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4yKSBvZiBgcGFyc2VJbnRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXg9MTBdIFRoZSByYWRpeCB0byBpbnRlcnByZXQgYHZhbHVlYCBieS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICcwOCcsICcxMCddLCBfLnBhcnNlSW50KTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCB8fCByYWRpeCA9PSBudWxsKSB7XG4gICAgICAgIHJhZGl4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocmFkaXgpIHtcbiAgICAgICAgcmFkaXggPSArcmFkaXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyksIHJhZGl4IHx8IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGVhdHMgdGhlIGdpdmVuIHN0cmluZyBgbmAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnKicsIDMpO1xuICAgICAqIC8vID0+ICcqKionXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMik7XG4gICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAwKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIG1hdGNoZXMgZm9yIGBwYXR0ZXJuYCBpbiBgc3RyaW5nYCB3aXRoIGByZXBsYWNlbWVudGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNyZXBsYWNlYF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3JlcGxhY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gcmVwbGFjZW1lbnQgVGhlIG1hdGNoIHJlcGxhY2VtZW50LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBsYWNlKCdIaSBGcmVkJywgJ0ZyZWQnLCAnQmFybmV5Jyk7XG4gICAgICogLy8gPT4gJ0hpIEJhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoYXJnc1swXSk7XG5cbiAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA8IDMgPyBzdHJpbmcgOiBzdHJpbmcucmVwbGFjZShhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNuYWtlIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCctLUZPTy1CQVItLScpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqL1xuICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNzcGxpdGBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9zcGxpdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHNwbGl0IGJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIFRoZSBsZW5ndGggdG8gdHJ1bmNhdGUgcmVzdWx0cyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHN0cmluZyBzZWdtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zcGxpdCgnYS1iLWMnLCAnLScsIDIpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcGxpdChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIGlmIChsaW1pdCAmJiB0eXBlb2YgbGltaXQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBsaW1pdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGxpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmICghbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKFxuICAgICAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHNlcGFyYXRvciAhPSBudWxsICYmICFpc1JlZ0V4cChzZXBhcmF0b3IpKVxuICAgICAgICAgICkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIGlmICghc2VwYXJhdG9yICYmIGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLCAwLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgdXBwZXJGaXJzdCh3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgPyAwXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIHN0cmluZy5sZW5ndGgpO1xuXG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAgICAgKiBpbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVycywgSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpblxuICAgICAqIFwiZXNjYXBlXCIgZGVsaW1pdGVycywgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy4gRGF0YVxuICAgICAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gICAgICogb2JqZWN0IGlzIGdpdmVuLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYF8udGVtcGxhdGVTZXR0aW5nc2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAgICAgKiBbc291cmNlVVJMc10oaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybClcbiAgICAgKiBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlXG4gICAgICogW2xvZGFzaCdzIGN1c3RvbSBidWlsZHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMpLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQ2hyb21lIGV4dGVuc2lvbiBzYW5kYm94ZXMgc2VlXG4gICAgICogW0Nocm9tZSdzIGV4dGVuc2lvbnMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHRlbXBsYXRlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXNjYXBlPV8udGVtcGxhdGVTZXR0aW5ncy5lc2NhcGVdXG4gICAgICogIFRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gICAgICogIFRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5pbXBvcnRzPV8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXVxuICAgICAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGVdXG4gICAgICogIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbbl0nXVxuICAgICAqICBUaGUgc291cmNlVVJMIG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudmFyaWFibGU9J29iaiddXG4gICAgICogIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyIHRvIGVzY2FwZSBkYXRhIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAqIC8vID0+ICc8Yj4mbHQ7c2NyaXB0Jmd0OzwvYj4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIF8uZm9yRWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEVTIHRlbXBsYXRlIGxpdGVyYWwgZGVsaW1pdGVyIGFzIGFuIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogLy8gRGlzYWJsZSBzdXBwb3J0IGJ5IHJlcGxhY2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0LlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSBcIlxcXFw8JS0gdmFsdWUgJVxcXFw+XCIgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnPCUtIHZhbHVlICU+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLlxuICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJywgeyAnc291cmNlVVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pO1xuICAgICAqIGNvbXBpbGVkKGRhdGEpO1xuICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiBcImdyZWV0aW5nLmpzdFwiIHVuZGVyIHRoZSBTb3VyY2VzIHRhYiBvciBSZXNvdXJjZXMgcGFuZWwgb2YgdGhlIHdlYiBpbnNwZWN0b3IuXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hpIDwlPSBkYXRhLnVzZXIgJT4hJywgeyAndmFyaWFibGUnOiAnZGF0YScgfSk7XG4gICAgICogY29tcGlsZWQuc291cmNlO1xuICAgICAqIC8vID0+IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAvLyAgIHZhciBfX3QsIF9fcCA9ICcnO1xuICAgICAqIC8vICAgX19wICs9ICdoaSAnICsgKChfX3QgPSAoIGRhdGEudXNlciApKSA9PSBudWxsID8gJycgOiBfX3QpICsgJyEnO1xuICAgICAqIC8vICAgcmV0dXJuIF9fcDtcbiAgICAgKiAvLyB9XG4gICAgICpcbiAgICAgKiAvLyBVc2UgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMuXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlID0gL3t7KFtcXHNcXFNdKz8pfX0vZztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyB7eyB1c2VyIH19IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcy5cbiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpIHtcbiAgICAgIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIChodHRwOi8vZWpvaG4ub3JnL2Jsb2cvamF2YXNjcmlwdC1taWNyby10ZW1wbGF0aW5nLylcbiAgICAgIC8vIGFuZCBMYXVyYSBEb2t0b3JvdmEncyBkb1QuanMgKGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1QpLlxuICAgICAgdmFyIHNldHRpbmdzID0gbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIG9wdGlvbnMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMsIHNldHRpbmdzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMuaW1wb3J0cywgc2V0dGluZ3MuaW1wb3J0cywgY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksXG4gICAgICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLFxuICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSBiYXNlVmFsdWVzKGltcG9ydHMsIGltcG9ydHNLZXlzKTtcblxuICAgICAgdmFyIGlzRXNjYXBpbmcsXG4gICAgICAgICAgaXNFdmFsdWF0aW5nLFxuICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IG9wdGlvbnMuaW50ZXJwb2xhdGUgfHwgcmVOb01hdGNoLFxuICAgICAgICAgIHNvdXJjZSA9IFwiX19wICs9ICdcIjtcblxuICAgICAgLy8gQ29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2ggZGVsaW1pdGVyLlxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgLy8gVXNlIGEgc291cmNlVVJMIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAgLy8gVGhlIHNvdXJjZVVSTCBnZXRzIGluamVjdGVkIGludG8gdGhlIHNvdXJjZSB0aGF0J3MgZXZhbC1lZCwgc28gYmUgY2FyZWZ1bFxuICAgICAgLy8gdG8gbm9ybWFsaXplIGFsbCBraW5kcyBvZiB3aGl0ZXNwYWNlLCBzbyBlLmcuIG5ld2xpbmVzIChhbmQgdW5pY29kZSB2ZXJzaW9ucyBvZiBpdCkgY2FuJ3Qgc25lYWsgaW5cbiAgICAgIC8vIGFuZCBlc2NhcGUgdGhlIGNvbW1lbnQsIHRodXMgaW5qZWN0aW5nIGNvZGUgdGhhdCBnZXRzIGV2YWxlZC5cbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICtcbiAgICAgICAgKGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3NvdXJjZVVSTCcpXG4gICAgICAgICAgPyAob3B0aW9ucy5zb3VyY2VVUkwgKyAnJykucmVwbGFjZSgvXFxzL2csICcgJylcbiAgICAgICAgICA6ICgnbG9kYXNoLnRlbXBsYXRlU291cmNlc1snICsgKCsrdGVtcGxhdGVDb3VudGVyKSArICddJylcbiAgICAgICAgKSArICdcXG4nO1xuXG4gICAgICBzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwgZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAgICAgIHNvdXJjZSArPSBzdHJpbmcuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHMuXG4gICAgICAgIGlmIChlc2NhcGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbl9fZShcIiArIGVzY2FwZVZhbHVlICsgXCIpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZVZhbHVlICsgXCI7XFxuX19wICs9ICdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJwb2xhdGVWYWx1ZSkge1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbigoX190ID0gKFwiICsgaW50ZXJwb2xhdGVWYWx1ZSArIFwiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpblxuICAgICAgICAvLyBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcblxuICAgICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgICAgLy8gSWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRlZFxuICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxuICAgICAgdmFyIHZhcmlhYmxlID0gaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAndmFyaWFibGUnKSAmJiBvcHRpb25zLnZhcmlhYmxlO1xuICAgICAgaWYgKCF2YXJpYWJsZSkge1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAob2JqKSB7XFxuJyArIHNvdXJjZSArICdcXG59XFxuJztcbiAgICAgIH1cbiAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGEgZm9yYmlkZGVuIGNoYXJhY3RlciB3YXMgZm91bmQgaW4gYHZhcmlhYmxlYCwgdG8gcHJldmVudFxuICAgICAgLy8gcG90ZW50aWFsIGNvbW1hbmQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAgICBlbHNlIGlmIChyZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycy50ZXN0KHZhcmlhYmxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9URU1QTF9WQVJfRVJST1JfVEVYVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFudXAgY29kZSBieSBzdHJpcHBpbmcgZW1wdHkgc3RyaW5ncy5cbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gRnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcXG4nICtcbiAgICAgICAgKHZhcmlhYmxlXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogJ29iaiB8fCAob2JqID0ge30pO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIFwidmFyIF9fdCwgX19wID0gJydcIiArXG4gICAgICAgIChpc0VzY2FwaW5nXG4gICAgICAgICAgID8gJywgX19lID0gXy5lc2NhcGUnXG4gICAgICAgICAgIDogJydcbiAgICAgICAgKSArXG4gICAgICAgIChpc0V2YWx1YXRpbmdcbiAgICAgICAgICA/ICcsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xcbicgK1xuICAgICAgICAgICAgXCJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cXG5cIlxuICAgICAgICAgIDogJztcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBzb3VyY2UgK1xuICAgICAgICAncmV0dXJuIF9fcFxcbn0nO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYXR0ZW1wdChmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLCBzb3VyY2VVUkwgKyAncmV0dXJuICcgKyBzb3VyY2UpXG4gICAgICAgICAgLmFwcGx5KHVuZGVmaW5lZCwgaW1wb3J0c1ZhbHVlcyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kIG9yXG4gICAgICAvLyB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3IgaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzLlxuICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChpc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gbG93ZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1mb28tYmFyLS0nXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29iYXInXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ19fZm9vX2Jhcl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTG93ZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gdXBwZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1GT08tQkFSLS0nXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT09CQVInXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ19fRk9PX0JBUl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy5tYXAoWycgIGZvbyAgJywgJyAgYmFyICAnXSwgXy50cmltKTtcbiAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW0oc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gYmFzZVRyaW0oc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgY2hyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoY2hhcnMpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0LCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICcgIGFiYydcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyk7XG4gICAgICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCA+PSBzdHJMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBlbmQgPSBsZW5ndGggLSBzdHJpbmdTaXplKG9taXNzaW9uKTtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICAgICAgOiBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcblxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSArICdnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKSkge1xuICAgICAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbmV3RW5kID09PSB1bmRlZmluZWQgPyBlbmQgOiBuZXdFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNi4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICAgICAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBpbnZva2UgYGZ1bmNgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSByZXN1bHQgb3IgdGhlIGNhdWdodCBlcnJvclxuICAgICAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGBmdW5jYCByZXN1bHQgb3IgZXJyb3Igb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCB0aHJvd2luZyBlcnJvcnMgZm9yIGludmFsaWQgc2VsZWN0b3JzLlxuICAgICAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAqIH0sICc+Xz4nKTtcbiAgICAgKlxuICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICogICBlbGVtZW50cyA9IFtdO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YXIgYXR0ZW1wdCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBtZXRob2RzIG9mIGFuIG9iamVjdCB0byB0aGUgb2JqZWN0IGl0c2VsZiwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spO1xuICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAqL1xuICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykge1xuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAga2V5ID0gdG9LZXkoa2V5KTtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYHBhaXJzYCBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIHByZWRpY2F0ZS1mdW5jdGlvbiBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gICAgICogICBbXy5jb25mb3Jtcyh7ICdiJzogXy5pc051bWJlciB9KSwgXy5jb25zdGFudCgnbWF0Y2hlcyBCJyldLFxuICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQSdcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgKiAvLyA9PiAnbm8gbWF0Y2gnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZChwYWlycykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHRvSXRlcmF0ZWUgPSBnZXRJdGVyYXRlZSgpO1xuXG4gICAgICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFpclsxXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdG9JdGVyYXRlZShwYWlyWzBdKSwgcGFpclsxXV07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBwcmVkaWNhdGUgcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8oMSwgMTApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnaXZlbiBmdW5jdGlvbnNcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvdyA9IGNyZWF0ZUZsb3coKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxvd2AgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXRcbiAgICAgKiBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoW3NxdWFyZSwgXy5hZGRdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICAgICAqIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuIElmIGBmdW5jYCBpcyBhbiBhcnJheSBvciBvYmplY3QsIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZSh7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqIF8uaXRlcmF0ZWUgPSBfLndyYXAoXy5pdGVyYXRlZSwgZnVuY3Rpb24oaXRlcmF0ZWUsIGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAgICAgKiAgIH07XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbJ2FiYycsICdkZWYnXSwgL2VmLyk7XG4gICAgICogLy8gPT4gWydkZWYnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJyA/IGZ1bmMgOiBiYXNlQ2xvbmUoZnVuYywgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgKiBvYmplY3QgYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmlzTWF0Y2hgIHdpdGggYHNvdXJjZWBcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgXy5tYXRjaGVzKHsgJ2EnOiA0IH0pXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdGhlXG4gICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICogb2JqZWN0IHZhbHVlIGlzIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAqIGBzcmNWYWx1ZWAgdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWVcbiAgICAgKiBgXy5pc0VxdWFsYCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAqIC8vID0+IHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDEpLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBiYXNlQ2xvbmUoc3JjVmFsdWUsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2VcbiAgICAgKiBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiwgdGhlbiBtZXRob2RzXG4gICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHZvd2VscyhzdHJpbmcpIHtcbiAgICAgKiAgIHJldHVybiBfLmZpbHRlcihzdHJpbmcsIGZ1bmN0aW9uKHYpIHtcbiAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0pO1xuICAgICAqIF8udm93ZWxzKCdmcmVkJyk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9LCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksXG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpO1xuXG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsICYmXG4gICAgICAgICAgIShpc09iamVjdChzb3VyY2UpICYmIChtZXRob2ROYW1lcy5sZW5ndGggfHwgIXByb3BzLmxlbmd0aCkpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFpbiA9ICEoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB8fCAhIW9wdGlvbnMuY2hhaW4sXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG4gICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIGlmIChpc0Z1bmMpIHtcbiAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLFxuICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goeyAnZnVuYyc6IGZ1bmMsICdhcmdzJzogYXJndW1lbnRzLCAndGhpc0FyZyc6IG9iamVjdCB9KTtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IGNoYWluQWxsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LCBhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG9cbiAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykge1xuICAgICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9vcCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXJndW1lbnQgYXQgaW5kZXggYG5gLiBJZiBgbmAgaXMgbmVnYXRpdmUsXG4gICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXNzLXRocnUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoMSk7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygtMik7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlc1xuICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzQsIDFdXG4gICAgICovXG4gICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFsbCoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgbWF0Y2hlc0Z1bmMgPSBfLm92ZXJTb21lKFt7ICdhJzogMSB9LCB7ICdhJzogMiB9XSlcbiAgICAgKiB2YXIgbWF0Y2hlc1Byb3BlcnR5RnVuYyA9IF8ub3ZlclNvbWUoW1snYScsIDFdLCBbJ2EnLCAyXV0pXG4gICAgICovXG4gICAgdmFyIG92ZXJTb21lID0gY3JlYXRlT3ZlcihhcnJheVNvbWUpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnByb3BlcnR5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKC00KTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDQpO1xuICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KC00KTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTtcbiAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlUmlnaHQgPSBjcmVhdGVSYW5nZSh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgKiAvLyA9PiBbW10sIFtdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uc3R1Yk9iamVjdCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbe30sIHt9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICogLy8gPT4gWycnLCAnJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgaXRlcmF0ZWUgYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICAgICAqXG4gICAgICogIF8udGltZXMoNCwgXy5jb25zdGFudCgwKSk7XG4gICAgICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO1xuICAgICAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIHZhciBhZGQgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB1cCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCB1cC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICogLy8gPT4gNi4wMVxuICAgICAqXG4gICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgKiAvLyA9PiA2MTAwXG4gICAgICovXG4gICAgdmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAqIC8vID0+IDEuNVxuICAgICAqL1xuICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCBkb3duIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAqIC8vID0+IDAuMDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQwMDBcbiAgICAgKi9cbiAgICB2YXIgZmxvb3IgPSBjcmVhdGVSb3VuZCgnZmxvb3InKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm11bHRpcGx5KDYsIDQpO1xuICAgICAqIC8vID0+IDI0XG4gICAgICovXG4gICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAgICAgKiAvLyA9PiA0LjAxXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MTAwXG4gICAgICovXG4gICAgdmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdWJ0cmFjdCg2LCA0KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gbWludWVuZCAtIHN1YnRyYWhlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBzdW1tZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoO1xuICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNodW5rID0gY2h1bms7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7XG4gICAgbG9kYXNoLmNvbmQgPSBjb25kO1xuICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zO1xuICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50O1xuICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTtcbiAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlO1xuICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5O1xuICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwO1xuICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyO1xuICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoO1xuICAgIGxvZGFzaC5kcm9wID0gZHJvcDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0O1xuICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlO1xuICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7XG4gICAgbG9kYXNoLmZpbGwgPSBmaWxsO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7XG4gICAgbG9kYXNoLmZsaXAgPSBmbGlwO1xuICAgIGxvZGFzaC5mbG93ID0gZmxvdztcbiAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjtcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7XG4gICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDtcbiAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTtcbiAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7XG4gICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgbG9kYXNoLm92ZXIgPSBvdmVyO1xuICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzO1xuICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7XG4gICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTtcbiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDtcbiAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5O1xuICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoO1xuICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7XG4gICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7XG4gICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0O1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlO1xuICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDtcbiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7XG4gICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7XG4gICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTtcbiAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDtcbiAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkO1xuICAgIGxvZGFzaC50YWlsID0gdGFpbDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoO1xuICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDtcbiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5O1xuICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uO1xuICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTtcbiAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoO1xuICAgIGxvZGFzaC51bmlxID0gdW5pcTtcbiAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5O1xuICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoO1xuICAgIGxvZGFzaC51bnNldCA9IHVuc2V0O1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7XG4gICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndvcmRzID0gd29yZHM7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7XG4gICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoO1xuICAgIGxvZGFzaC56aXAgPSB6aXA7XG4gICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVudHJpZXMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC5lbnRyaWVzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5leHRlbmRXaXRoID0gYXNzaWduSW5XaXRoO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xhbXAgPSBjbGFtcDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jbG9uZURlZXBXaXRoID0gY2xvbmVEZWVwV2l0aDtcbiAgICBsb2Rhc2guY2xvbmVXaXRoID0gY2xvbmVXaXRoO1xuICAgIGxvZGFzaC5jb25mb3Jtc1RvID0gY29uZm9ybXNUbztcbiAgICBsb2Rhc2guZGVidXJyID0gZGVidXJyO1xuICAgIGxvZGFzaC5kZWZhdWx0VG8gPSBkZWZhdWx0VG87XG4gICAgbG9kYXNoLmRpdmlkZSA9IGRpdmlkZTtcbiAgICBsb2Rhc2guZW5kc1dpdGggPSBlbmRzV2l0aDtcbiAgICBsb2Rhc2guZXEgPSBlcTtcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5lc2NhcGVSZWdFeHAgPSBlc2NhcGVSZWdFeHA7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7XG4gICAgbG9kYXNoLmZvck93biA9IGZvck93bjtcbiAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaGFzSW4gPSBoYXNJbjtcbiAgICBsb2Rhc2guaGVhZCA9IGhlYWQ7XG4gICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgbG9kYXNoLmluY2x1ZGVzID0gaW5jbHVkZXM7XG4gICAgbG9kYXNoLmluZGV4T2YgPSBpbmRleE9mO1xuICAgIGxvZGFzaC5pblJhbmdlID0gaW5SYW5nZTtcbiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gaXNBcnJheUxpa2VPYmplY3Q7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNFcXVhbFdpdGggPSBpc0VxdWFsV2l0aDtcbiAgICBsb2Rhc2guaXNFcnJvciA9IGlzRXJyb3I7XG4gICAgbG9kYXNoLmlzRmluaXRlID0gaXNGaW5pdGU7XG4gICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuICAgIGxvZGFzaC5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG4gICAgbG9kYXNoLmlzTGVuZ3RoID0gaXNMZW5ndGg7XG4gICAgbG9kYXNoLmlzTWFwID0gaXNNYXA7XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc01hdGNoV2l0aCA9IGlzTWF0Y2hXaXRoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc05pbCA9IGlzTmlsO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzT2JqZWN0TGlrZSA9IGlzT2JqZWN0TGlrZTtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU2FmZUludGVnZXIgPSBpc1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc1NldCA9IGlzU2V0O1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcbiAgICBsb2Rhc2guaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuICAgIGxvZGFzaC5qb2luID0gam9pbjtcbiAgICBsb2Rhc2gua2ViYWJDYXNlID0ga2ViYWJDYXNlO1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcbiAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2gubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuICAgIGxvZGFzaC5sb3dlckZpcnN0ID0gbG93ZXJGaXJzdDtcbiAgICBsb2Rhc2gubHQgPSBsdDtcbiAgICBsb2Rhc2gubHRlID0gbHRlO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1heEJ5ID0gbWF4Qnk7XG4gICAgbG9kYXNoLm1lYW4gPSBtZWFuO1xuICAgIGxvZGFzaC5tZWFuQnkgPSBtZWFuQnk7XG4gICAgbG9kYXNoLm1pbiA9IG1pbjtcbiAgICBsb2Rhc2gubWluQnkgPSBtaW5CeTtcbiAgICBsb2Rhc2guc3R1YkFycmF5ID0gc3R1YkFycmF5O1xuICAgIGxvZGFzaC5zdHViRmFsc2UgPSBzdHViRmFsc2U7XG4gICAgbG9kYXNoLnN0dWJPYmplY3QgPSBzdHViT2JqZWN0O1xuICAgIGxvZGFzaC5zdHViU3RyaW5nID0gc3R1YlN0cmluZztcbiAgICBsb2Rhc2guc3R1YlRydWUgPSBzdHViVHJ1ZTtcbiAgICBsb2Rhc2gubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICBsb2Rhc2gubnRoID0gbnRoO1xuICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7XG4gICAgbG9kYXNoLm5vdyA9IG5vdztcbiAgICBsb2Rhc2gucGFkID0gcGFkO1xuICAgIGxvZGFzaC5wYWRFbmQgPSBwYWRFbmQ7XG4gICAgbG9kYXNoLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG4gICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7XG4gICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRvbTtcbiAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlO1xuICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5yZXBlYXQgPSByZXBlYXQ7XG4gICAgbG9kYXNoLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlO1xuICAgIGxvZGFzaC5zaXplID0gc2l6ZTtcbiAgICBsb2Rhc2guc25ha2VDYXNlID0gc25ha2VDYXNlO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhCeSA9IHNvcnRlZEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4T2YgPSBzb3J0ZWRJbmRleE9mO1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXggPSBzb3J0ZWRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gc29ydGVkTGFzdEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleE9mID0gc29ydGVkTGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLnN0YXJ0Q2FzZSA9IHN0YXJ0Q2FzZTtcbiAgICBsb2Rhc2guc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGg7XG4gICAgbG9kYXNoLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgbG9kYXNoLnN1bSA9IHN1bTtcbiAgICBsb2Rhc2guc3VtQnkgPSBzdW1CeTtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9GaW5pdGUgPSB0b0Zpbml0ZTtcbiAgICBsb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xuICAgIGxvZGFzaC50b0xlbmd0aCA9IHRvTGVuZ3RoO1xuICAgIGxvZGFzaC50b0xvd2VyID0gdG9Mb3dlcjtcbiAgICBsb2Rhc2gudG9OdW1iZXIgPSB0b051bWJlcjtcbiAgICBsb2Rhc2gudG9TYWZlSW50ZWdlciA9IHRvU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgbG9kYXNoLnRvVXBwZXIgPSB0b1VwcGVyO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUVuZCA9IHRyaW1FbmQ7XG4gICAgbG9kYXNoLnRyaW1TdGFydCA9IHRyaW1TdGFydDtcbiAgICBsb2Rhc2gudHJ1bmNhdGUgPSB0cnVuY2F0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBsb2Rhc2gudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuICAgIGxvZGFzaC51cHBlckZpcnN0ID0gdXBwZXJGaXJzdDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5maXJzdCA9IGhlYWQ7XG5cbiAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICBuID0gbiA9PT0gdW5kZWZpbmVkID8gMSA6IG5hdGl2ZU1heCh0b0ludGVnZXIobiksIDApO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KVxuICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICAgICAgOiB0aGlzLmNsb25lKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHtcbiAgICAgICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAgICAgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG4gICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHtcbiAgICAgICAgICAnaXRlcmF0ZWUnOiBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksXG4gICAgICAgICAgJ3R5cGUnOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5oZWFkYCBhbmQgYF8ubGFzdGAuXG4gICAgYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdGFrZU5hbWUgPSAndGFrZScgKyAoaW5kZXggPyAnUmlnaHQnIDogJycpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuICAgIGFycmF5RWFjaChbJ2luaXRpYWwnLCAndGFpbCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIGRyb3BOYW1lID0gJ2Ryb3AnICsgKGluZGV4ID8gJycgOiAnUmlnaHQnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZmlsdGVyZWRfXyA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKSA6IHRoaXNbZHJvcE5hbWVdKDEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gdG9JbnRlZ2VyKGVuZCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgaXNUYWtlciA9IC9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgbG9kYXNoRnVuYyA9IGxvZGFzaFtpc1Rha2VyID8gKCd0YWtlJyArIChtZXRob2ROYW1lID09ICdsYXN0JyA/ICdSaWdodCcgOiAnJykpIDogbWV0aG9kTmFtZV0sXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGlmICghbG9kYXNoRnVuYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGlzTGF6eSA9IHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsXG4gICAgICAgICAgICBpdGVyYXRlZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZUxhenkgJiYgY2hlY2tJdGVyYXRlZSAmJiB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYXRlZS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxcbiAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCxcbiAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgICAgICBpZiAoIXJldFVud3JhcHBlZCAmJiB1c2VMYXp5KSB7XG4gICAgICAgICAgdmFsdWUgPSBvbmx5TGF6eSA/IHZhbHVlIDogbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICByZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW53cmFwcGVkICYmIG9ubHlMYXp5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgICAgcmV0dXJuIGlzVW53cmFwcGVkID8gKGlzVGFrZXIgPyByZXN1bHQudmFsdWUoKVswXSA6IHJlc3VsdC52YWx1ZSgpKSA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBsb2Rhc2hGdW5jID0gbG9kYXNoW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICAgICAgdmFyIGtleSA9IGxvZGFzaEZ1bmMubmFtZSArICcnO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCBrZXkpKSB7XG4gICAgICAgICAgcmVhbE5hbWVzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZWFsTmFtZXNba2V5XS5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCwgV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXSA9IFt7XG4gICAgICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgICAgICdmdW5jJzogdW5kZWZpbmVkXG4gICAgfV07XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbiBzZXF1ZW5jZSBtZXRob2RzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuYXQgPSB3cmFwcGVyQXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5uZXh0ID0gd3JhcHBlck5leHQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5wbGFudCA9IHdyYXBwZXJQbGFudDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSB3cmFwcGVyUmV2ZXJzZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvSlNPTiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWU7XG5cbiAgICAvLyBBZGQgbGF6eSBhbGlhc2VzLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbiAgICBpZiAoc3ltSXRlcmF0b3IpIHtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7XG4gICAgfVxuICAgIHJldHVybiBsb2Rhc2g7XG4gIH0pO1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIEV4cG9ydCBsb2Rhc2guXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMb2Rhc2ggb24gdGhlIGdsb2JhbCBvYmplY3QgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBMb2Rhc2ggaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy8gVXNlIGBfLm5vQ29uZmxpY3RgIHRvIHJlbW92ZSBMb2Rhc2ggZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgaXQuXG4gIGVsc2UgaWYgKGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIE5vZGUuanMuXG4gICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgc3VwcG9ydC5cbiAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBFeHBvcnQgdG8gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBnZXRQbHVnaW4gfSBmcm9tIFwianVnZ2wtYXBpXCI7XHJcbmltcG9ydCB7IGFkZEljb24sIEV2ZW50UmVmLCBNYXJrZG93blZpZXcsIFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIGFkZEZlYXRoZXJJY29uLFxyXG4gIG9wZW5WaWV3LFxyXG4gIHdhaXQsXHJcbn0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG5pbXBvcnQgeyBCQ0FQSSB9IGZyb20gXCIuL0FQSVwiO1xyXG5pbXBvcnQgeyBEZWJ1Z2dlciB9IGZyb20gXCJzcmMvRGVidWdnZXJcIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwgfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0hpZXJhcmNoeU5vdGVzL0hpZXJOb3RlTW9kYWxcIjtcclxuaW1wb3J0IHsgZ2V0Q29kZWJsb2NrQ0IgfSBmcm9tIFwiLi9Db2RlYmxvY2tzXCI7XHJcbmltcG9ydCB7IGNvcHlHbG9iYWxJbmRleCwgY29weUxvY2FsSW5kZXggfSBmcm9tIFwiLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG5pbXBvcnQgeyBqdW1wVG9GaXJzdERpciB9IGZyb20gXCIuL0NvbW1hbmRzL2p1bXBUb0ZpcnN0RGlyXCI7XHJcbmltcG9ydCB7IHRocmVhZCB9IGZyb20gXCIuL0NvbW1hbmRzL3RocmVhZGluZ1wiO1xyXG5pbXBvcnQgeyB3cml0ZUJDc1RvQWxsRmlsZXMsIHdyaXRlQkNUb0ZpbGUgfSBmcm9tIFwiLi9Db21tYW5kcy9Xcml0ZUJDc1wiO1xyXG5pbXBvcnQge1xyXG4gIERFRkFVTFRfU0VUVElOR1MsXHJcbiAgRFVDS19JQ09OLFxyXG4gIERVQ0tfSUNPTl9TVkcsXHJcbiAgRFVDS19WSUVXLFxyXG4gIE1BVFJJWF9WSUVXLFxyXG4gIFRSQUlMX0lDT04sXHJcbiAgVFJBSUxfSUNPTl9TVkcsXHJcbiAgVFJFRV9WSUVXLFxyXG4gIEFQSV9OQU1FLFxyXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBGaWVsZFN1Z2dlc3RvciB9IGZyb20gXCIuL0ZpZWxkU3VnZ2VzdG9yXCI7XHJcbmltcG9ydCB0eXBlIHtcclxuICBCQ0FQSUksXHJcbiAgQkNTZXR0aW5ncyxcclxuICBEaXJlY3Rpb25zLFxyXG4gIE15VmlldyxcclxuICBWaWV3SW5mbyxcclxufSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGJ1aWxkQ2xvc2VkRywgYnVpbGRNYWluRywgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IFJlbGF0aW9uU3VnZ2VzdG9yIH0gZnJvbSBcIi4vUmVsYXRpb25TdWdnZXN0b3JcIjtcclxuaW1wb3J0IHsgQkNTZXR0aW5nVGFiIH0gZnJvbSBcIi4vU2V0dGluZ3MvQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyB3YWl0Rm9yQ2FjaGUgfSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCBEdWNrc1ZpZXcgZnJvbSBcIi4vVmlld3MvRHVja3NWaWV3XCI7XHJcbmltcG9ydCBNYXRyaXhWaWV3IGZyb20gXCIuL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuaW1wb3J0IHsgZHJhd1RyYWlsIH0gZnJvbSBcIi4vVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCBUcmVlVmlldyBmcm9tIFwiLi9WaWV3cy9UcmVlVmlld1wiO1xyXG5pbXBvcnQgeyBCQ1N0b3JlIH0gZnJvbSBcIi4vVmlzdWFsaXNhdGlvbnMvSnVnZ2xcIjtcclxuaW1wb3J0IHsgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXN1YWxpc2F0aW9ucy9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzO1xyXG5cclxuICB2aXNpdGVkOiBbc3RyaW5nLCBIVE1MRGl2RWxlbWVudF1bXSA9IFtdO1xyXG5cclxuICBtYWluRzogTXVsdGlHcmFwaDtcclxuICBjbG9zZWRHOiBNdWx0aUdyYXBoO1xyXG5cclxuICBhY3RpdmVMZWFmQ2hhbmdlOiBFdmVudFJlZiA9IHVuZGVmaW5lZDtcclxuICBsYXlvdXRDaGFuZ2U6IEV2ZW50UmVmID0gdW5kZWZpbmVkO1xyXG5cclxuICBkYjogRGVidWdnZXI7XHJcblxyXG4gIFZJRVdTOiBWaWV3SW5mb1tdO1xyXG5cclxuICBhcGk6IEJDQVBJSTtcclxuICBwcml2YXRlIGJjU3RvcmU6IEJDU3RvcmU7XHJcblxyXG4gIHJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCkge1xyXG4gICAgdGhpcy5hY3RpdmVMZWFmQ2hhbmdlID0gYXBwLndvcmtzcGFjZS5vbihcclxuICAgICAgXCJmaWxlLW9wZW5cIixcclxuICAgICAgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJlZnJlc2hPbk5vdGVDaGFuZ2UpIGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSB0aGlzLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKTtcclxuICAgICAgICAgIGlmIChhY3RpdmVWaWV3KSBhd2FpdCBhY3RpdmVWaWV3LmRyYXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hY3RpdmVMZWFmQ2hhbmdlKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyTGF5b3V0Q2hhbmdlRXZlbnQoKSB7XHJcbiAgICB0aGlzLmxheW91dENoYW5nZSA9IGFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2hvd0JDcykgYXdhaXQgZHJhd1RyYWlsKHRoaXMpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5sYXlvdXRDaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nIGJyZWFkY3J1bWJzIHBsdWdpblwiKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBCQ1NldHRpbmdUYWIodGhpcykpO1xyXG5cclxuICAgIHRoaXMuZGIgPSBuZXcgRGVidWdnZXIodGhpcyk7XHJcblxyXG4gICAgY29uc3QgeyBzZXR0aW5ncyB9ID0gdGhpcztcclxuICAgIGNvbnN0IHtcclxuICAgICAgZmllbGRTdWdnZXN0b3IsXHJcbiAgICAgIGVuYWJsZVJlbGF0aW9uU3VnZ2VzdG9yLFxyXG4gICAgICBvcGVuTWF0cml4T25Mb2FkLFxyXG4gICAgICBvcGVuRHVja09uTG9hZCxcclxuICAgICAgb3BlbkRvd25PbkxvYWQsXHJcbiAgICAgIHNob3dCQ3MsXHJcbiAgICAgIHVzZXJIaWVycyxcclxuICAgIH0gPSBzZXR0aW5ncztcclxuXHJcbiAgICBpZiAoZmllbGRTdWdnZXN0b3IpIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBGaWVsZFN1Z2dlc3Rvcih0aGlzKSk7XHJcbiAgICBpZiAoZW5hYmxlUmVsYXRpb25TdWdnZXN0b3IpXHJcbiAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBSZWxhdGlvblN1Z2dlc3Rvcih0aGlzKSk7XHJcblxyXG5cclxuICAgIC8vIE92ZXJyaWRlIG9sZGVyIHZlcnNpb25zIG9mIHRoZXNlIHNldHRpbmdzXHJcbiAgICBpZiAoc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMubGVuZ3RoID09PSAwKSBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcyA9IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMpXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzLnNob3dBbGwgPT09ICdib29sZWFuJykgc2V0dGluZ3Muc2hvd0FsbCA9IHNldHRpbmdzLnNob3dBbGwgPyAnQWxsJyA6ICdTaG9ydGVzdCdcclxuXHJcbiAgICB0aGlzLlZJRVdTID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgcGxhaW46IFwiTWF0cml4XCIsXHJcbiAgICAgICAgdHlwZTogTUFUUklYX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IE1hdHJpeFZpZXcsXHJcbiAgICAgICAgb3Blbk9uTG9hZDogb3Blbk1hdHJpeE9uTG9hZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWluOiBcIkR1Y2tcIixcclxuICAgICAgICB0eXBlOiBEVUNLX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IER1Y2tzVmlldyxcclxuICAgICAgICBvcGVuT25Mb2FkOiBvcGVuRHVja09uTG9hZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWluOiBcIkRvd25cIixcclxuICAgICAgICB0eXBlOiBUUkVFX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IFRyZWVWaWV3LFxyXG4gICAgICAgIG9wZW5PbkxvYWQ6IG9wZW5Eb3duT25Mb2FkLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgY29uc3RydWN0b3IsIHR5cGUgfSBvZiB0aGlzLlZJRVdTKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KHR5cGUsIChsZWFmKSA9PiBuZXcgY29uc3RydWN0b3IobGVhZiwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEljb24oRFVDS19JQ09OLCBEVUNLX0lDT05fU1ZHKTtcclxuICAgIGFkZEljb24oVFJBSUxfSUNPTiwgVFJBSUxfSUNPTl9TVkcpO1xyXG5cclxuICAgIGF3YWl0IHdhaXRGb3JDYWNoZSh0aGlzKTtcclxuICAgIHRoaXMubWFpbkcgPSBhd2FpdCBidWlsZE1haW5HKHRoaXMpO1xyXG4gICAgdGhpcy5jbG9zZWRHID0gYnVpbGRDbG9zZWRHKHRoaXMpO1xyXG5cclxuICAgIGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vRmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmxlbmd0aDtcclxuICAgICAgaWYgKHRoaXMubWFpbkc/Lm5vZGVzKCkubGVuZ3RoIDwgbm9GaWxlcykge1xyXG4gICAgICAgIGF3YWl0IHdhaXQoMzAwMCk7XHJcbiAgICAgICAgdGhpcy5tYWluRyA9IGF3YWl0IGJ1aWxkTWFpbkcodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jbG9zZWRHID0gYnVpbGRDbG9zZWRHKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHsgb3Blbk9uTG9hZCwgdHlwZSwgY29uc3RydWN0b3IgfSBvZiB0aGlzLlZJRVdTKVxyXG4gICAgICAgIGlmIChvcGVuT25Mb2FkKSBhd2FpdCBvcGVuVmlldyh0eXBlLCBjb25zdHJ1Y3Rvcik7XHJcblxyXG4gICAgICBpZiAoc2hvd0JDcykgYXdhaXQgZHJhd1RyYWlsKHRoaXMpO1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCk7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJMYXlvdXRDaGFuZ2VFdmVudCgpO1xyXG5cclxuICAgICAgLy8gU291cmNlIGZvciBzYXZlIHNldHRpbmdcclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hpcHN0ZXJzbW9vdGhpZS9vYnNpZGlhbi1wbHVnaW4tcHJldHRpZXIvYmxvYi9tYWluL3NyYy9tYWluLnRzXHJcbiAgICAgIGNvbnN0IHNhdmVDb21tYW5kRGVmaW5pdGlvbiA9XHJcbiAgICAgICAgYXBwLmNvbW1hbmRzLmNvbW1hbmRzW1wiZWRpdG9yOnNhdmUtZmlsZVwiXTtcclxuICAgICAgY29uc3Qgc2F2ZSA9IHNhdmVDb21tYW5kRGVmaW5pdGlvbj8uY2FsbGJhY2s7XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHNhdmUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHNhdmVDb21tYW5kRGVmaW5pdGlvbi5jYWxsYmFjayA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGF3YWl0IHNhdmUoKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJlZnJlc2hPbk5vdGVTYXZlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IHRoaXMuZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlVmlldykgYXdhaXQgYWN0aXZlVmlldy5kcmF3KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XHJcbiAgICAgICAgaWYgKGxlYWYgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpXHJcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgIGxlYWYudmlldy5wcmV2aWV3TW9kZS5yZXJlbmRlcih0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgdHlwZSwgcGxhaW4sIGNvbnN0cnVjdG9yIH0gb2YgdGhpcy5WSUVXUykge1xyXG4gICAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICAgIGlkOiBgc2hvdy0ke3R5cGV9LXZpZXdgLFxyXG4gICAgICAgIG5hbWU6IGBPcGVuICR7cGxhaW59IFZpZXdgLFxyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGNoZWNrQ2FsbGJhY2s6IGFzeW5jIChjaGVja2luZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoZWNraW5nKSByZXR1cm4gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSkubGVuZ3RoID09PSAwO1xyXG4gICAgICAgICAgYXdhaXQgb3BlblZpZXcodHlwZSwgY29uc3RydWN0b3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcIm9wZW4tdmlzLW1vZGFsXCIsXHJcbiAgICAgIG5hbWU6IFwiT3BlbiBWaXN1YWxpc2F0aW9uIE1vZGFsXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgVmlzTW9kYWwodGhpcykub3BlbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwibWFuaXB1bGF0ZS1oaWVyYXJjaHktbm90ZXNcIixcclxuICAgICAgbmFtZTogXCJBZGp1c3QgSGllcmFyY2h5IE5vdGVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwodGhpcykub3BlbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwiUmVmcmVzaC1CcmVhZGNydW1icy1JbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIlJlZnJlc2ggQnJlYWRjcnVtYnMgSW5kZXhcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcIlRvZ2dsZS10cmFpbC1pbi1FZGl0JkxQXCIsXHJcbiAgICAgIG5hbWU6IFwiVG9nZ2xlOiBTaG93IFRyYWlsL0dyaWQgaW4gRWRpdCAmIExQIG1vZGVcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93QkNzSW5FZGl0TFBNb2RlID0gIXNldHRpbmdzLnNob3dCQ3NJbkVkaXRMUE1vZGU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwodGhpcyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJXcml0ZS1CcmVhZGNydW1icy10by1DdXJyZW50LUZpbGVcIixcclxuICAgICAgbmFtZTogXCJXcml0ZSBCcmVhZGNydW1icyB0byBDdXJyZW50IEZpbGVcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHdyaXRlQkNUb0ZpbGUodGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJXcml0ZS1CcmVhZGNydW1icy10by1BbGwtRmlsZXNcIixcclxuICAgICAgbmFtZTogXCJXcml0ZSBCcmVhZGNydW1icyB0byAqKkFMTCoqIEZpbGVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCB3cml0ZUJDc1RvQWxsRmlsZXModGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJsb2NhbC1pbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIkNvcHkgYSBMb2NhbCBJbmRleCB0byB0aGUgY2xpcGJvYXJkXCIsXHJcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCBjb3B5TG9jYWxJbmRleCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcImdsb2JhbC1pbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIkNvcHkgYSBHbG9iYWwgSW5kZXggdG8gdGhlIGNsaXBib2FyZFwiLFxyXG4gICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4gYXdhaXQgY29weUdsb2JhbEluZGV4KHRoaXMpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgW1widXBcIiwgXCJkb3duXCIsIFwibmV4dFwiLCBcInByZXZcIl0uZm9yRWFjaCgoZGlyOiBEaXJlY3Rpb25zKSA9PiB7XHJcbiAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgICAgaWQ6IGBqdW1wLXRvLWZpcnN0LSR7ZGlyfWAsXHJcbiAgICAgICAgbmFtZTogYEp1bXAgdG8gZmlyc3QgJyR7ZGlyfSdgLFxyXG4gICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCBqdW1wVG9GaXJzdERpcih0aGlzLCBkaXIpLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGdldEZpZWxkcyh1c2VySGllcnMpLmZvckVhY2goKGZpZWxkOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgICBpZDogYG5ldy1maWxlLXdpdGgtY3Vyci1hcy0ke2ZpZWxkfWAsXHJcbiAgICAgICAgbmFtZTogYENyZWF0ZSBhIG5ldyAnJHtmaWVsZH0nIGZyb20gdGhlIGN1cnJlbnQgbm90ZWAsXHJcbiAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHRocmVhZCh0aGlzLCBmaWVsZCksXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRSaWJib25JY29uKFxyXG4gICAgICBhZGRGZWF0aGVySWNvbihcInR2XCIpIGFzIHN0cmluZyxcclxuICAgICAgXCJCcmVhZGNydW1icyBWaXN1YWxpc2F0aW9uXCIsXHJcbiAgICAgICgpID0+IG5ldyBWaXNNb2RhbCh0aGlzKS5vcGVuKClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFxyXG4gICAgICBcImJyZWFkY3J1bWJzXCIsXHJcbiAgICAgIGdldENvZGVibG9ja0NCKHRoaXMpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGp1Z2dsUGx1Z2luID0gZ2V0UGx1Z2luKGFwcCk7XHJcbiAgICBpZiAoanVnZ2xQbHVnaW4pIHtcclxuICAgICAgdGhpcy5iY1N0b3JlID0gbmV3IEJDU3RvcmUodGhpcy5tYWluRywgYXBwLm1ldGFkYXRhQ2FjaGUpO1xyXG4gICAgICBqdWdnbFBsdWdpbi5yZWdpc3RlclN0b3JlKHRoaXMuYmNTdG9yZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGkgPSBuZXcgQkNBUEkodGhpcyk7XHJcbiAgICAvLyBSZWdpc3RlciBBUEkgdG8gZ2xvYmFsIHdpbmRvdyBvYmplY3QuXHJcbiAgICAod2luZG93W0FQSV9OQU1FXSA9IHRoaXMuYXBpKSAmJlxyXG4gICAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IGRlbGV0ZSB3aW5kb3dbQVBJX05BTUVdKTtcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZVRZUEVWaWV3KHR5cGU6IHN0cmluZyk6IE15VmlldyB8IG51bGwge1xyXG4gICAgY29uc3QgeyBjb25zdHJ1Y3RvciB9ID0gdGhpcy5WSUVXUy5maW5kKCh2aWV3KSA9PiB2aWV3LnR5cGUgPT09IHR5cGUpO1xyXG4gICAgY29uc3QgbGVhdmVzID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSk7XHJcbiAgICBpZiAobGVhdmVzICYmIGxlYXZlcy5sZW5ndGggPj0gMSkge1xyXG4gICAgICBjb25zdCB7IHZpZXcgfSA9IGxlYXZlc1swXTtcclxuICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcikgcmV0dXJuIHZpZXc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGxvYWRTZXR0aW5ncyA9IGFzeW5jICgpID0+XHJcbiAgKHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKFxyXG4gICAge30sXHJcbiAgICBERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGF0YSgpXHJcbiAgKSk7XHJcblxyXG4gIHNhdmVTZXR0aW5ncyA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblxyXG4gIG9udW5sb2FkKCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJ1bmxvYWRpbmdcIik7XHJcbiAgICB0aGlzLlZJRVdTLmZvckVhY2goYXN5bmMgKHZpZXcpID0+IHtcclxuICAgICAgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlldy50eXBlKS5mb3JFYWNoKChsZWFmKSA9PiB7XHJcbiAgICAgICAgbGVhZi5kZXRhY2goKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZpc2l0ZWQuZm9yRWFjaCgodmlzaXQpID0+IHZpc2l0WzFdLnJlbW92ZSgpKTtcclxuICAgIGlmICh0aGlzLmJjU3RvcmUpIHtcclxuICAgICAgY29uc3QganVnZ2xQbHVnaW4gPSBnZXRQbHVnaW4oYXBwKTtcclxuICAgICAgaWYgKGp1Z2dsUGx1Z2luKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGp1Z2dsUGx1Z2luLnJlbW92ZVN0b3JlKHRoaXMuYmNTdG9yZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXJUYWdzLCBwYXJzZUZyb250TWF0dGVyU3RyaW5nQXJyYXkgfSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IENBVF9EQU5HTElORyA9ICdkYW5nbGluZyc7XG5jb25zdCBDT1JFX1NUT1JFX0lEID0gJ2NvcmUnO1xuY2xhc3MgVml6SWQge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdG9yZUlkKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5zdG9yZUlkID0gc3RvcmVJZDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnN0b3JlSWR9OiR7dGhpcy5pZH1gO1xuICAgIH1cbiAgICB0b0lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUlkKGlkKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gaWQuc3BsaXQoJzonKTtcbiAgICAgICAgY29uc3Qgc3RvcmVJZCA9IHNwbGl0WzBdO1xuICAgICAgICBjb25zdCBfaWQgPSBzcGxpdC5zbGljZSgxKS5qb2luKCc6Jyk7XG4gICAgICAgIHJldHVybiBuZXcgVml6SWQoX2lkLCBzdG9yZUlkKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21Ob2RlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZpeklkLmZyb21JZChub2RlLmlkKCkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU5vZGVzKG5vZGVzKSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5tYXAoKG4pID0+IFZpeklkLmZyb21Ob2RlKG4pKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21GaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWaXpJZChmaWxlLm5hbWUsICdjb3JlJyk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0lkKGlkLCBzdG9yZUlkKSB7XG4gICAgICAgIHJldHVybiBuZXcgVml6SWQoaWQsIHN0b3JlSWQpLnRvSWQoKTtcbiAgICB9XG59XG5jb25zdCBfcGFyc2VUYWdzID0gZnVuY3Rpb24gKHRhZ3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLnRhZ3NcbiAgICAgICAgLm1hcCgodGFnKSA9PiB7XG4gICAgICAgIHRhZyA9IHRhZy5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgaFNwbGl0ID0gdGFnLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGhTcGxpdCkge1xuICAgICAgICAgICAgY29uc3QgaFRhZyA9IGhTcGxpdC5zbGljZSgwLCBwYXJzZUludChpKSArIDEpLmpvaW4oJy0nKTtcbiAgICAgICAgICAgIHRhZ3MucHVzaChgdGFnLSR7aFRhZ31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFncztcbiAgICB9KSk7XG59O1xuY29uc3QgZ2V0Q2xhc3NlcyA9IGZ1bmN0aW9uIChmaWxlLCBtZXRhZGF0YUNhY2hlKSB7XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuICAgICAgICBpZiAoWydwbmcnLCAnanBnJywgJ2pwZWcnLCAnZ2lmJywgJ2JtcCcsICdzdmcnLCAndGlmZiddLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpbWFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFsnbXAzJywgJ3dlYm0nLCAnd2F2JywgJ200YScsICdvZ2cnLCAnM2dwJywgJ2ZsYWMnXS5jb250YWlucyhmaWxlLmV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnYXVkaW8nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChbJ21wNCcsICd3ZWJtJywgJ29ndiddLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCd2aWRlbycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpbGUuZXh0ZW5zaW9uID09PSAncGRmJykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdwZGYnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIHJlcGxhY2VkIGJ5IHRoZSAncGF0aCcgZGF0YSBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGlmICghKGZpbGUucGFyZW50Lm5hbWUgPT09ICcvJyB8fCBmaWxlLnBhcmVudC5uYW1lID09PSAnJykpIHtcbiAgICAgICAgLy8gICBjbGFzc2VzLnB1c2goYGZvbGRlci0ke2ZpbGUucGFyZW50Lm5hbWVcbiAgICAgICAgLy8gICAgICAgLnJlcGxhY2UoJyAnLCAnXycpfWApO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIGNsYXNzZXMucHVzaCgncm9vdCcpO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChmaWxlLmV4dGVuc2lvbiA9PT0gJ21kJykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdub3RlJyk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlPy5mcm9udG1hdHRlcikge1xuICAgICAgICAgICAgICAgIGlmICgnaW1hZ2UnIGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaW1hZ2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCd0YWdzJyBpbiBjYWNoZS5mcm9udG1hdHRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gcGFyc2VGcm9udE1hdHRlclRhZ3MoY2FjaGUuZnJvbnRtYXR0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLl9wYXJzZVRhZ3ModGFncykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgnY3NzY2xhc3MnIGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXp6ZXMgPSBwYXJzZUZyb250TWF0dGVyU3RyaW5nQXJyYXkoY2FjaGUuZnJvbnRtYXR0ZXIsICdjc3NjbGFzcycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhenplcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLmNsYXp6ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhY2hlPy50YWdzKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLl9wYXJzZVRhZ3MoY2FjaGUudGFncy5tYXAoKHQpID0+IHQudGFnKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdmaWxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgfVxuICAgIHJldHVybiBbQ0FUX0RBTkdMSU5HXTtcbn07XG5jb25zdCBub2RlRnJvbUZpbGUgPSBhc3luYyBmdW5jdGlvbiAoZmlsZSwgcGx1Z2luLCBzZXR0aW5ncywgaWQpIHtcbiAgICBpZiAoIWlkKSB7XG4gICAgICAgIGlkID0gVml6SWQudG9JZChmaWxlLm5hbWUsIENPUkVfU1RPUkVfSUQpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IHBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGZpbGUuZXh0ZW5zaW9uID09PSAnbWQnID8gZmlsZS5iYXNlbmFtZSA6IGZpbGUubmFtZTtcbiAgICBjb25zdCBjbGFzc2VzID0gZ2V0Q2xhc3NlcyhmaWxlLCBwbHVnaW4uYXBwLm1ldGFkYXRhQ2FjaGUpLmpvaW4oJyAnKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF0aDogZmlsZS5wYXRoLFxuICAgIH07XG4gICAgaWYgKFsncG5nJywgJ2pwZycsICdqcGVnJywgJ2dpZicsICdibXAnLCAnc3ZnJywgJ3RpZmYnXS5jb250YWlucyhmaWxlLmV4dGVuc2lvbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRhdGFbJ3Jlc291cmNlX3VybCddID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwbHVnaW4uc2V0dGluZ3MuaW1nU2VydmVyUG9ydH0vJHtlbmNvZGVVUkkoZmlsZS5wYXRoKX1gO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHsgfVxuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucmVhZENvbnRlbnQgJiYgZmlsZS5leHRlbnNpb24gPT0gJ21kJykge1xuICAgICAgICBkYXRhWydjb250ZW50J10gPSBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgfVxuICAgIGNvbnN0IGZyb250bWF0dGVyID0gY2FjaGU/LmZyb250bWF0dGVyO1xuICAgIGlmIChmcm9udG1hdHRlcikge1xuICAgICAgICBPYmplY3Qua2V5cyhmcm9udG1hdHRlcikuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKCEoayA9PT0gJ3Bvc2l0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUZpZWxkID0gZnJvbnRtYXR0ZXJba107XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB1cmwuIHRocm93cyBlcnJvciBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW1hZ2VGaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gaW1hZ2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwbHVnaW4uc2V0dGluZ3MuaW1nU2VydmVyUG9ydH0vJHtlbmNvZGVVUkkoaW1hZ2VGaWVsZCl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gZnJvbnRtYXR0ZXJba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6ICdub2RlcycsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgfTtcbn07XG5jb25zdCBub2RlRGFuZ2xpbmcgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpZDogVml6SWQudG9JZChwYXRoLCBDT1JFX1NUT1JFX0lEKSxcbiAgICAgICAgICAgIG5hbWU6IHBhdGgsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzZXM6ICdkYW5nbGluZycsXG4gICAgfTtcbn07XG5jb25zdCB3aWtpbGlua1JlZ2V4ID0gJ1xcXFxbXFxcXFsoW15cXFxcXVxcXFxyXFxcXG5dKz8pXFxcXF1cXFxcXSc7XG5jb25zdCBuYW1lUmVnZXggPSAnW15cXFxcV1xcXFxkXVxcXFx3Kic7XG5jb25zdCByZWdleEVzY2FwZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xufTtcbmNvbnN0IHBhcnNlVHlwZWRMaW5rID0gZnVuY3Rpb24gKGxpbmssIGxpbmUsIHR5cGVkTGlua1ByZWZpeCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgc29tZXRoaW5nIHNwZWNpZmljIEkgdXNlLCBidXQgc2hvdWxkbid0IGtlZXAgYmVpbmcgaW4gdGhpcyByZXBvLlxuICAgIGNvbnN0IHJlZ2V4UHVibGlzaGVkSW4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleEVzY2FwZSh0eXBlZExpbmtQcmVmaXgpfSAocHVibGlzaGVkSW4pIChcXFxcZFxcXFxkXFxcXGRcXFxcZCkgKCR7d2lraWxpbmtSZWdleH0sPyAqKSskYCk7XG4gICAgY29uc3QgbWF0Y2hQSSA9IHJlZ2V4UHVibGlzaGVkSW4uZXhlYyhsaW5lKTtcbiAgICBpZiAoIShtYXRjaFBJID09PSBudWxsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3M6ICd0eXBlLXB1Ymxpc2hlZEluJyxcbiAgICAgICAgICAgIGlzSW5saW5lOiBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICB5ZWFyOiBtYXRjaFBJWzJdLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICcnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwdWJsaXNoZWRJbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBJbnR1aXRpb246IFN0YXJ0IHdpdGggdGhlIHR5cGVkIGxpbmsgcHJlZml4LiBUaGVuIGEgbmVvNGogbmFtZSAobmFtZVJlZ2V4KS5cbiAgICAvLyBUaGVuIG9uZSBvciBtb3JlIG9mIHRoZSB3aWtpbGluayBncm91cDogd2lraWxpbmsgcmVnZXggc2VwYXJhdGVkIGJ5IG9wdGlvbmFsIGNvbW1hIGFuZCBtdWx0aXBsZSBzcGFjZXNcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4RXNjYXBlKHR5cGVkTGlua1ByZWZpeCl9ICgke25hbWVSZWdleH0pICgke3dpa2lsaW5rUmVnZXh9LD8gKikrJGApO1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhsaW5lKTtcbiAgICBjb25zdCBzcGxpdExpbmsgPSBsaW5rLm9yaWdpbmFsLnNwbGl0KCd8Jyk7XG4gICAgbGV0IGFsaWFzID0gbnVsbDtcbiAgICBpZiAoc3BsaXRMaW5rLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgYWxpYXMgPSBzcGxpdExpbmsuc2xpY2UoMSkuam9pbigpLnNsaWNlKDAsIC0yKTtcbiAgICB9XG4gICAgaWYgKCEobWF0Y2ggPT09IG51bGwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbGFzczogYHR5cGUtJHttYXRjaFsxXX1gLFxuICAgICAgICAgICAgaXNJbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIGFsaWFzOiBhbGlhcyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbmNvbnN0IHBhcnNlUmVmQ2FjaGUgPSBmdW5jdGlvbiAocmVmLCBjb250ZW50LCBpZCwgc291cmNlLCB0YXJnZXQsIHR5cGVkTGlua1ByZWZpeCkge1xuICAgIGNvbnN0IGxpbmUgPSBjb250ZW50W3JlZi5wb3NpdGlvbi5zdGFydC5saW5lXTtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGNvbnRleHQ6IGxpbmUsXG4gICAgICAgIGVkZ2VDb3VudDogMSxcbiAgICB9O1xuICAgIGNvbnN0IHNwbGl0TGluayA9IHJlZi5vcmlnaW5hbC5zcGxpdCgnfCcpO1xuICAgIGlmIChzcGxpdExpbmsubGVuZ3RoID4gMSkge1xuICAgICAgICBkYXRhWydhbGlhcyddID0gc3BsaXRMaW5rLnNsaWNlKDEpLmpvaW4oKS5zbGljZSgwLCAtMik7XG4gICAgfVxuICAgIGxldCBjbGFzc2VzID0gJyc7XG4gICAgY29uc3QgdHlwZWRMaW5rID0gcGFyc2VUeXBlZExpbmsocmVmLCBsaW5lLCB0eXBlZExpbmtQcmVmaXgpO1xuICAgIGlmICh0eXBlZExpbmsgPT09IG51bGwpIHtcbiAgICAgICAgY2xhc3NlcyA9IGAke2NsYXNzZXN9IGlubGluZWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0geyAuLi50eXBlZExpbmsucHJvcGVydGllcywgLi4uZGF0YSB9O1xuICAgICAgICBjbGFzc2VzID0gYCR7Y2xhc3Nlc30gJHt0eXBlZExpbmsuY2xhc3N9YDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgfTtcbn07XG5cbmNvbnN0IGdldFBsdWdpbiA9IGZ1bmN0aW9uIChhcHApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCdqdWdnbCcgaW4gYXBwLnBsdWdpbnMucGx1Z2lucykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBhcHAucGx1Z2lucy5wbHVnaW5zWydqdWdnbCddO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCB7IFZpeklkLCBnZXRDbGFzc2VzLCBnZXRQbHVnaW4sIG5vZGVEYW5nbGluZywgbm9kZUZyb21GaWxlLCBwYXJzZVJlZkNhY2hlLCBwYXJzZVR5cGVkTGluayB9O1xuIiwgIi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBjb250YWlucyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGNvbW1vbmx5IHVzZWQgaW4gT2JzaWRpYW4gcGx1Z2lucy5cclxuICogQG1vZHVsZSBvYnNpZGlhbi1jb21tdW5pdHktbGliXHJcbiAqL1xyXG5pbXBvcnQgKiBhcyBmZWF0aGVyIGZyb20gXCJmZWF0aGVyLWljb25zXCI7XHJcbmltcG9ydCB7IGFkZEljb24sIE1hcmtkb3duUmVuZGVyZXIsIE1hcmtkb3duVmlldywgTW9kYWwsIG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgcmVxdWVzdCwgVEZpbGUsIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbi8qKlxyXG4gKiBZb3UgY2FuIGF3YWl0IHRoaXMgRnVuY3Rpb24gdG8gZGVsYXkgZXhlY3V0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSBkZWxheSBUaGUgZGVsYXkgaW4gbXNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0KGRlbGF5KSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcclxufVxyXG4vKipcclxuICogQWRkcyBhbGwgb2ZmaWNpYWwgRmVhdGhlciBJY29ucyB0byBPYnNpZGlhbi5cclxuICogaHR0cHM6Ly9mZWF0aGVyaWNvbnMuY29tL1xyXG4gKlxyXG4gKiBAcGFyYW0gYXR0ciBTVkcgQXR0cmlidXRlcyBmb3IgdGhlIEljb24uIFRoZSBkZWZhdWx0IHNob3VsZCB3b3JrIGZvciBtb3N0IHVzZWNhc2VzLlxyXG4gKlxyXG4gKiBAZGVwcmVjYXRlZCBBcyBvZiBPYnNpZGlhbiAwLjEzLjI3IHRoaXMgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYmVjYXVzZSBPYnNpZGlhbiBzaGlwcyB3aXRoIGBsdWNpZGVgLCBhIG1haW50YWluZWQgZm9yayBvZiBmZWF0aGVyLiAoaHR0cHM6Ly9sdWNpZGUuZGV2LylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxGZWF0aGVySWNvbnMoYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XHJcbiAgICBPYmplY3QudmFsdWVzKGZlYXRoZXIuaWNvbnMpLmZvckVhY2goKGkpID0+IHtcclxuICAgICAgICBjb25zdCBzdmcgPSBpLnRvU3ZnKGF0dHIpO1xyXG4gICAgICAgIGFkZEljb24oYGZlYXRoZXItJHtpLm5hbWV9YCwgc3ZnKTtcclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKiBBZGRzIGEgc3BlY2lmaWMgRmVhdGhlciBJY29uIHRvIE9ic2lkaWFuLlxyXG4gKlxyXG4gKiBAcGFyYW0gbmFtZSBvZmZpY2lhbCBOYW1lIG9mIHRoZSBJY29uIChodHRwczovL2ZlYXRoZXJpY29ucy5jb20vKVxyXG4gKiBAcGFyYW0gYXR0ciBTVkcgQXR0cmlidXRlcyBmb3IgdGhlIEljb24uIFRoZSBkZWZhdWx0IHNob3VsZCB3b3JrIGZvciBtb3N0IHVzZWNhc2VzLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBJY29uIG5hbWVcclxuICpcclxuICogQGRlcHJlY2F0ZWQgQXMgb2YgT2JzaWRpYW4gMC4xMy4yNyB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQsIGJlY2F1c2UgT2JzaWRpYW4gc2hpcHMgd2l0aCBgbHVjaWRlYCwgYSBtYWludGFpbmVkIGZvcmsgb2YgZmVhdGhlci4gKGh0dHBzOi8vbHVjaWRlLmRldi8pXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkRmVhdGhlckljb24obmFtZSwgYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XHJcbiAgICBpZiAoZmVhdGhlci5pY29uc1tuYW1lXSkge1xyXG4gICAgICAgIGNvbnN0IGljb25OYW1lID0gYGZlYXRoZXItJHtuYW1lfWA7XHJcbiAgICAgICAgYWRkSWNvbihpY29uTmFtZSwgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZyhhdHRyKSk7XHJcbiAgICAgICAgcmV0dXJuIGljb25OYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoYFRoaXMgSWNvbiAoJHtuYW1lfSkgZG9lc24ndCBleGlzdCBpbiB0aGUgRmVhdGhlciBMaWJyYXJ5LmApO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBDb252ZXJ0IGEgYmFzZTY0IFN0cmluZyB0byBhbiBBcnJheUJ1ZmZlci5cclxuICogWW91IGNhbiB0aGVuIHVzZSB0aGUgQXJyYXlCdWZmZXIgdG8gc2F2ZSB0aGUgYXNzZXQgdG8gZGlzay5cclxuICpcclxuICogQHBhcmFtIGJhc2U2NCBiYXNlNjQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cclxuICogQHJldHVybnMgQXJyYXlCdWZmZXJcclxuICogQGRlcHJlY2F0ZWQgT2JzaWRpYW4gb2ZmZXJzIGl0J3Mgb3duIG1ldGhvZCBhcyBvZiAwLjE0LjVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCkge1xyXG4gICAgY29uc3QgYmluYXJ5X3N0cmluZyA9IHdpbmRvdy5hdG9iKGJhc2U2NCk7XHJcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlfc3RyaW5nLmxlbmd0aDtcclxuICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlfc3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgYW4gdW5kb2N1bWVudGVkIEFQSSBvZiBPYnNpZGlhbi5cclxuICpcclxuICogQHBhcmFtIGZpbGVOYW1lIFRoZSBGaWxlbmFtZSBmb3IgeW91ciBBdHRhY2htZW50XHJcbiAqIEBwYXJhbSBmb3JtYXQgVGhlIEZpbGVmb3JtYXQgb2YgeW91ciBBdHRhY2htZW50XHJcbiAqIEBwYXJhbSBzb3VyY2VGaWxlIFRoZSBTb3VyY2VmaWxlIGZyb20gd2hlcmUgdGhlIEF0dGFjaG1lbnQgZ2V0cyBhZGRlZCwgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgQXR0YWNobWVudCBGb2xkZXIgbWlnaHQgYmUgZGlmZmVyZW50IGJhc2VkIG9uIHdoZXJlIGl0IGdldHMgaW5zZXJ0ZWQuXHJcbiAqIEByZXR1cm5zIFRoZSBBdHRhY2htZW50IFBhdGhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoZmlsZU5hbWUsIGZvcm1hdCwgc291cmNlRmlsZSkge1xyXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yXHJcbiAgICByZXR1cm4gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhmaWxlTmFtZSwgZm9ybWF0LCBzb3VyY2VGaWxlKTtcclxufVxyXG4vKipcclxuICogQ29weSBgY29udGVudGAgdG8gdGhlIHVzZXJzIGNsaXBib2FyZC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gYmUgY29waWVkIHRvIGNsaXBib2FyZC5cclxuICogQHBhcmFtIHsoKSA9PiBhbnl9IHN1Y2Nlc3MgVGhlIGNhbGxiYWNrIHRvIHJ1biB3aGVuIHRleHQgaXMgc3VjY2Vzc2Z1bGx5IGNvcGllZC4gRGVmYXVsdCB0aHJvd3MgYSBuZXcgYE5vdGljZWBcclxuICogQHBhcmFtIHsocmVhc29uPykgPT4gYW55fSBmYWlsdXJlIFRoZSBjYWxsYmFjayB0byBydW4gd2hlbiB0ZXh0IHdhcyBub3QgYWJsZSB0byBiZSBjb3BpZWQuIERlZmF1bHQgdGhyb3dzIGEgbmV3IGBOb3RpY2VgLCBhbmQgY29uc29sZSBsb2dzIHRoZSBlcnJvci5gXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weShjb250ZW50LCBzdWNjZXNzID0gKCkgPT4gbmV3IE5vdGljZShcIkNvcGllZCB0byBjbGlwYm9hcmRcIiksIGZhaWx1cmUgPSAocmVhc29uKSA9PiB7XHJcbiAgICBuZXcgTm90aWNlKFwiQ291bGQgbm90IGNvcHkgdG8gY2xpcGJvYXJkXCIpO1xyXG4gICAgY29uc29sZS5sb2coeyByZWFzb24gfSk7XHJcbn0pIHtcclxuICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnQpLnRoZW4oc3VjY2VzcywgZmFpbHVyZSk7XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIGFuIGVkaXRvciwgY2hlY2sgaWYgc29tZXRoaW5nIGlzIHNlbGVjdGVkIGFuZCByZXR1cm4gdGhhdCBzZWxlY3Rpb24sIG90aGVyd2lzZSByZXR1cm4gdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBlZGl0b3JcclxuICogQHBhcmFtICB7RWRpdG9yfSBlZGl0b3JcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25Gcm9tRWRpdG9yKGVkaXRvcikge1xyXG4gICAgaWYgKGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpKVxyXG4gICAgICAgIHJldHVybiBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGVkaXRvci5nZXRWYWx1ZSgpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVjayBpZiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSBhbmQgcmV0dXJuIHRoYXQgc2VsZWN0aW9uLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgY3VycmVudCBmaWxlLlxyXG4gKiBAcGFyYW0gIHtib29sZWFufSBbY2FjaGVkPXRydWVdIFVzZSBgY2FjaGVkUmVhZGAgb3IgYHJlYWRgLiBgY2FjaGVkUmVhZGAgYnkgZGVmYXVsdC5cclxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IGBudWxsYCBpZiBub3QgZm9jdXNzZWQgb24gYSBtYXJrZG93biBmaWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uRnJvbUN1cnJGaWxlKGNhY2hlZCA9IHRydWUpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IHRleHQgPSAoX2EgPSB3aW5kb3cgPT09IG51bGwgfHwgd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpO1xyXG4gICAgaWYgKHRleHQpXHJcbiAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldEFjdGl2ZUZpbGVDb250ZW50KGNhY2hlZCk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGBub3RlTmFtZWAgaXMgdGhlIG5hbWUgb2YgYSBub3RlIHRoYXQgZXhpc3RzIGluIHRoZSB2YXVsdC5cclxuICogQHBhcmFtICB7c3RyaW5nfSBub3RlTmFtZSBCYXNlbmFtZSBvZiB0aGUgbm90ZSB0byBzZWFyY2ggZm9yLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IFtzb3VyY2VQYXRoPVwiXCJdIE9wdGlvbmFsIGZpbGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS4gRGVmYXVsdCBpcyB0aGUgY3VycmVudCBmaWxlLlxyXG4gKiBAcmV0dXJucyBib29sZWFuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNJblZhdWx0ID0gKG5vdGVOYW1lLCBzb3VyY2VQYXRoID0gXCJcIikgPT4gISFhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlTmFtZSwgc291cmNlUGF0aCk7XHJcbi8qKlxyXG4gKiBXaGVuIGhvdmVyaW5nIGEgbGluayBnb2luZyB0byBgdG9gLCBzaG93IHRoZSBPYnNpZGlhbiBob3Zlci1wcmV2aWV3IG9mIHRoYXQgbm90ZS5cclxuICpcclxuICogWW91IHByb2JhYmx5IGhhdmUgdG8gaG9sZCBkb3duIGBDdHJsYCB3aGVuIGhvdmVyaW5nIHRoZSBsaW5rIGZvciB0aGUgcHJldmlldyB0byBhcHBlYXIhXHJcbiAqIEBwYXJhbSAge01vdXNlRXZlbnR9IGV2ZW50XHJcbiAqIEBwYXJhbSAge1lvdXJWaWV3fSB2aWV3IFRoZSB2aWV3IHdpdGggdGhlIGxpbmsgYmVpbmcgaG92ZXJlZFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRvIFRoZSBiYXNlbmFtZSBvZiB0aGUgbm90ZSB0byBwcmV2aWV3LlxyXG4gKiBAdGVtcGxhdGUgWW91clZpZXcgVGhlIFZpZXdUeXBlIG9mIHlvdXIgdmlld1xyXG4gKiBAcmV0dXJucyB2b2lkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaG92ZXJQcmV2aWV3KGV2ZW50LCB2aWV3LCB0bykge1xyXG4gICAgY29uc3QgdGFyZ2V0RWwgPSBldmVudC50YXJnZXQ7XHJcbiAgICBhcHAud29ya3NwYWNlLnRyaWdnZXIoXCJob3Zlci1saW5rXCIsIHtcclxuICAgICAgICBldmVudCxcclxuICAgICAgICBzb3VyY2U6IHZpZXcuZ2V0Vmlld1R5cGUoKSxcclxuICAgICAgICBob3ZlclBhcmVudDogdmlldyxcclxuICAgICAgICB0YXJnZXRFbCxcclxuICAgICAgICBsaW5rdGV4dDogdG8sXHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hcmtkb3duIG5vdGUgbmFtZWQgYG5ld05hbWVgIGluIHRoZSB1c2VyJ3MgcHJlZmZlcmVkIG5ldy1ub3RlLWZvbGRlci5cclxuICogQHBhcmFtICB7c3RyaW5nfSBuZXdOYW1lIE5hbWUgb2YgbmV3IG5vdGUgKHdpdGggb3Igd2l0aG91dCAnLm1kJylcclxuICogQHBhcmFtICB7c3RyaW5nfSBbY3VyckZpbGVQYXRoPVwiXCJdIEZpbGUgcGF0aCBvZiB0aGUgY3VycmVudCBub3RlLiBVc2UgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBmaWxlLlxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxURmlsZT59IG5ldyBURmlsZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld01ETm90ZShuZXdOYW1lLCBjdXJyRmlsZVBhdGggPSBcIlwiKSB7XHJcbiAgICBjb25zdCBuZXdGaWxlRm9sZGVyID0gYXBwLmZpbGVNYW5hZ2VyLmdldE5ld0ZpbGVQYXJlbnQoY3VyckZpbGVQYXRoKS5wYXRoO1xyXG4gICAgY29uc3QgbmV3RmlsZVBhdGggPSBub3JtYWxpemVQYXRoKGAke25ld0ZpbGVGb2xkZXJ9JHtuZXdGaWxlRm9sZGVyID09PSBcIi9cIiA/IFwiXCIgOiBcIi9cIn0ke2FkZE1EKG5ld05hbWUpfWApO1xyXG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUobmV3RmlsZVBhdGgsIFwiXCIpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGQgJy5tZCcgdG8gYG5vdGVOYW1lYCBpZiBpdCBpc24ndCBhbHJlYWR5IHRoZXJlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggb3Igd2l0aG91dCAnLm1kJyBvbiB0aGUgZW5kLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRoICcubWQnIG9uIHRoZSBlbmQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWRkTUQgPSAobm90ZU5hbWUpID0+IHtcclxuICAgIHJldHVybiBub3RlTmFtZS5tYXRjaCgvXFwuTUQkfFxcLm1kJC9tKSA/IG5vdGVOYW1lIDogbm90ZU5hbWUgKyBcIi5tZFwiO1xyXG59O1xyXG4vKipcclxuICogU3RyaXAgJy5tZCcgb2ZmIHRoZSBlbmQgb2YgYSBub3RlIG5hbWUgdG8gZ2V0IGl0cyBiYXNlbmFtZS5cclxuICpcclxuICogV29ya3Mgd2l0aCB0aGUgZWRnZWNhc2Ugd2hlcmUgYSBub3RlIGhhcyAnLm1kJyBpbiBpdHMgYmFzZW5hbWU6IGBPYnNpZGlhbi5tZC5tZGAsIGZvciBleGFtcGxlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggb3Igd2l0aG91dCAnLm1kJyBvbiB0aGUgZW5kLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRob3V0ICcubWQnXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RyaXBNRCA9IChub3RlTmFtZSkgPT4ge1xyXG4gICAgaWYgKG5vdGVOYW1lLm1hdGNoKC9cXC5NRCR8XFwubWQkL20pKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vdGVOYW1lLnNwbGl0KC9cXC5NRCR8XFwubWQkL20pLnNsaWNlKDAsIC0xKS5qb2luKFwiLm1kXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiBub3RlTmFtZTtcclxufTtcclxuLyoqXHJcbiAqIFdoZW4gY2xpY2tpbmcgYSBsaW5rLCBjaGVjayBpZiB0aGF0IG5vdGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgbGVhZiwgYW5kIHN3aXRjaCB0byB0aGF0IGxlYWYsIGlmIHNvLiBPdGhlcndpc2UsIG9wZW4gdGhlIG5vdGUgaW4gYSBuZXcgcGFuZS5cclxuICogQHBhcmFtICB7c3RyaW5nfSBkZXN0IE5hbWUgb2Ygbm90ZSB0byBvcGVuLiBJZiB5b3Ugd2FudCB0byBvcGVuIGEgbm9uLW1kIG5vdGUsIGJlIHN1cmUgdG8gYWRkIHRoZSBmaWxlIGV4dGVuc2lvbi5cclxuICogQHBhcmFtICB7TW91c2VFdmVudH0gZXZlbnRcclxuICogQHBhcmFtICB7e2NyZWF0ZU5ld0ZpbGU6Ym9vbGVhbn19IFtvcHRpb25zPXtjcmVhdGVOZXdGaWxlOnRydWV9XSBXaGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYGRlc3RgIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4gSWYgYGZhbHNlYCwgc2ltcGx5IHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbi5cclxuICogQHJldHVybnMgUHJvbWlzZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCwgb3B0aW9ucyA9IHsgY3JlYXRlTmV3RmlsZTogdHJ1ZSB9KSB7XHJcbiAgICBjb25zdCB7IHdvcmtzcGFjZSB9ID0gYXBwO1xyXG4gICAgbGV0IGRlc3RGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVzdCwgXCJcIik7XHJcbiAgICAvLyBJZiBkZXN0IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXRcclxuICAgIGlmICghZGVzdEZpbGUgJiYgb3B0aW9ucy5jcmVhdGVOZXdGaWxlKSB7XHJcbiAgICAgICAgZGVzdEZpbGUgPSBhd2FpdCBjcmVhdGVOZXdNRE5vdGUoZGVzdCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghZGVzdEZpbGUgJiYgIW9wdGlvbnMuY3JlYXRlTmV3RmlsZSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgb3BlblxyXG4gICAgY29uc3QgbGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlbiA9IFtdO1xyXG4gICAgLy8gRm9yIGFsbCBvcGVuIGxlYXZlcywgaWYgdGhlIGxlYXZlJ3MgYmFzZW5hbWUgaXMgZXF1YWwgdG8gdGhlIGxpbmsgZGVzdGluYXRpb24sIHJhdGhlciBhY3RpdmF0ZSB0aGF0IGxlYWYgaW5zdGVhZCBvZiBvcGVuaW5nIGl0IGluIHR3byBwYW5lc1xyXG4gICAgd29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykge1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gKF9hID0gbGVhZi52aWV3KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmlsZTtcclxuICAgICAgICAgICAgaWYgKGZpbGUgJiYgZmlsZS5iYXNlbmFtZSArIFwiLlwiICsgZmlsZS5leHRlbnNpb24gPT09IGRlc3QpIHtcclxuICAgICAgICAgICAgICAgIGxlYXZlc1dpdGhEZXN0QWxyZWFkeU9wZW4ucHVzaChsZWFmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gUmF0aGVyIHN3aXRjaCB0byBpdCBpZiBpdCBpcyBvcGVuXHJcbiAgICBpZiAobGVhdmVzV2l0aERlc3RBbHJlYWR5T3Blbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlblswXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3QgbW9kZSA9IGFwcC52YXVsdC5nZXRDb25maWcoXCJkZWZhdWx0Vmlld01vZGVcIik7XHJcbiAgICAgICAgY29uc3QgbGVhZiA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShcIk1ldGFcIilcclxuICAgICAgICAgICAgPyB3b3Jrc3BhY2Uuc3BsaXRBY3RpdmVMZWFmKClcclxuICAgICAgICAgICAgOiB3b3Jrc3BhY2UuZ2V0VW5waW5uZWRMZWFmKCk7XHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yXHJcbiAgICAgICAgYXdhaXQgbGVhZi5vcGVuRmlsZShkZXN0RmlsZSwgeyBhY3RpdmU6IHRydWUsIG1vZGUgfSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIGEgbGlzdCBvZiByZXNvbHZlZCBsaW5rcyBmcm9tIGFwcC5tZXRhZGF0YUNhY2hlLCBjaGVjayBpZiBgZnJvbWAgaGFzIGEgbGluayB0byBgdG9gXHJcbiAqIEBwYXJhbSAge1Jlc29sdmVkTGlua3N9IHJlc29sdmVkTGlua3NcclxuICogQHBhcmFtICB7c3RyaW5nfSBmcm9tIE5vdGUgbmFtZSB3aXRoIGxpbmsgbGVhdmluZyAoV2l0aCBvciB3aXRob3V0ICcubWQnKVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRvIE5vdGUgbmFtZSB3aXRoIGxpbmsgYXJyaXZpbmcgKFdpdGggb3Igd2l0aG91dCAnLm1kJylcclxuICogQHBhcmFtIHtib29sZWFufSBbZGlyZWN0ZWQ9dHJ1ZV0gT25seSBjaGVjayBpZiBgZnJvbWAgaGFzIGEgbGluayB0byBgdG9gLiBJZiBub3QgZGlyZWN0ZWQsIGNoZWNrIGluIGJvdGggZGlyZWN0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2VkKHJlc29sdmVkTGlua3MsIGZyb20sIHRvLCBkaXJlY3RlZCA9IHRydWUpIHtcclxuICAgIHZhciBfYSwgX2I7XHJcbiAgICBmcm9tID0gYWRkTUQoZnJvbSk7XHJcbiAgICB0byA9IGFkZE1EKHRvKTtcclxuICAgIGNvbnN0IGZyb21UbyA9IChfYSA9IHJlc29sdmVkTGlua3NbZnJvbV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYXNPd25Qcm9wZXJ0eSh0byk7XHJcbiAgICBpZiAoIWZyb21UbyAmJiAhZGlyZWN0ZWQpIHtcclxuICAgICAgICBjb25zdCB0b0Zyb20gPSAoX2IgPSByZXNvbHZlZExpbmtzW3RvXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhhc093blByb3BlcnR5KGZyb20pO1xyXG4gICAgICAgIHJldHVybiB0b0Zyb207XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZyb21UbztcclxufVxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhlIGxpbmsgYGZyb21gIFx1MjE5MiBgdG9gIGlzIHJlc29sdmVkIG9yIG5vdC5cclxuICogQHBhcmFtICB7c3RyaW5nfSB0b1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGZyb21cclxuICogQHJldHVybnMgYm9vbGVhblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb2x2ZWQodG8sIGZyb20pIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IHsgcmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XHJcbiAgICByZXR1cm4gKChfYSA9IHJlc29sdmVkTGlua3MgPT09IG51bGwgfHwgcmVzb2x2ZWRMaW5rcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzb2x2ZWRMaW5rc1thZGRNRChmcm9tKV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVthZGRNRCh0byldKSA+IDA7XHJcbn1cclxuLyoqXHJcbiAqIE9wZW4geW91ciB2aWV3IG9uIHRoZSBjaG9zZW4gYHNpZGVgIGlmIGl0IGlzbid0IGFscmVhZHkgb3BlblxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZpZXdUeXBlXHJcbiAqIEBwYXJhbSAge0NvbnN0cnVjdG9yPFlvdXJWaWV3Pn0gdmlld0NsYXNzIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvZiB5b3VyIHZpZXdcclxuICogQHBhcmFtICB7XCJsZWZ0XCJ8XCJyaWdodFwifSBbc2lkZT1cInJpZ2h0XCJdXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPFlvdXJWaWV3Pn0gVGhlIG9wZW5lZCB2aWV3XHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblZpZXcodmlld1R5cGUsIHZpZXdDbGFzcywgc2lkZSA9IFwicmlnaHRcIikge1xyXG4gICAgbGV0IGxlYWYgPSBudWxsO1xyXG4gICAgZm9yIChsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKHZpZXdUeXBlKSkge1xyXG4gICAgICAgIGlmIChsZWFmLnZpZXcgaW5zdGFuY2VvZiB2aWV3Q2xhc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxlYWYudmlldztcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoeyB0eXBlOiBcImVtcHR5XCIgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBsZWFmID1cclxuICAgICAgICAobGVhZiAhPT0gbnVsbCAmJiBsZWFmICE9PSB2b2lkIDAgPyBsZWFmIDogc2lkZSA9PT0gXCJyaWdodFwiKVxyXG4gICAgICAgICAgICA/IGFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKVxyXG4gICAgICAgICAgICA6IGFwcC53b3Jrc3BhY2UuZ2V0TGVmdExlYWYoZmFsc2UpO1xyXG4gICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoe1xyXG4gICAgICAgIHR5cGU6IHZpZXdUeXBlLFxyXG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGxlYWYudmlldztcclxufVxyXG4vKipcclxuICogQ2hlY2sgd2hpY2ggc2lkZSBvZiB0aGUgd29ya3NwYWNlIHlvdXIgYHZpZXdUeXBlYCBpcyBvbiwgYW5kIHNhdmUgaXQgaW50byBgcGx1Z2luLnNldHRpbmdzW3NldHRpbmdOYW1lXWAuXHJcbiAqXHJcbiAqICoqVGlwKio6IFJ1biB0aGlzIGZ1bmN0aW9uIG9uIGBwbHVnaW4udW5sb2FkYCB0byBzYXZlIHRoZSBsYXN0IHNpZGUgeW91ciB2aWV3IHdhcyBvbiB3aGVuIGNsb3NpbmcsIHRoZW4ge0BsaW5rIG9wZW5WaWV3fSBvbiB0aGUgc2FtZSBzaWRlIGl0IHdhcyBsYXN0LlxyXG4gKiBAcGFyYW0gIHtZb3VyUGx1Z2lufSBwbHVnaW5cclxuICogQHBhcmFtICB7c3RyaW5nfSB2aWV3VHlwZVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNldHRpbmdOYW1lXHJcbiAqIEByZXR1cm5zIHtcImxlZnRcIiB8IFwicmlnaHRcIn0gYHNpZGVgXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVZpZXdTaWRlKHBsdWdpbiwgdmlld1R5cGUsIHNldHRpbmdOYW1lKSB7XHJcbiAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlld1R5cGUpWzBdO1xyXG4gICAgaWYgKCFsZWFmKSB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKGBPYnNpZGlhbi1Db21tdW5pdHktTGliOiBObyBpbnN0YW5jZSBvZiAnJHt2aWV3VHlwZX0nIG9wZW4sIGNhbm5vdCBzYXZlIHNpZGVgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGNvbnN0IHNpZGUgPSBsZWFmLmdldFJvb3QoKS5zaWRlO1xyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBwbHVnaW4uc2V0dGluZ3Nbc2V0dGluZ05hbWVdID0gc2lkZTtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgcmV0dXJuIHNpZGU7XHJcbn1cclxuLyoqXHJcbiAqIEEgTW9kYWwgdXNlZCBpbiB7QGxpbmsgYWRkUmVuZGVyZWRNYXJrZG93bkJ1dHRvbn0gdG8gZGlzcGxheSByZW5kZXJlZCBtYXJrZG93biBmcm9tIGEgcmF3IHN0cmluZywgb3IgZmV0Y2hlZCBmcm9tIGEgcHJvdmlkZWQgdXJsLlxyXG4gKlxyXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9OTXdNNTBFLnBuZylcclxuICogQHBhcmFtICB7WW91clBsdWdpbn0gcGx1Z2luXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gc291cmNlIFJhdyBtYXJrZG93biBjb250ZW50IG9yIHVybCB0byBmaW5kIHJhdyBtYXJrZG93bi5cclxuICogQHBhcmFtICB7Ym9vbGVhbn0gZmV0Y2ggVHJ1ZSBcdTIxOTIgZmV0Y2ggbWFya2Rvd24gZnJvbSBgc291cmNlYCBhcyB1cmwuIEZhbHNlIFx1MjE5MiBgc291cmNlYCBpcyBhbHJlYWR5IGEgbWFya2Rvd24gc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlbmRlcmVkTWFya2Rvd25Nb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbiwgc291cmNlLCBmZXRjaCkge1xyXG4gICAgICAgIHN1cGVyKGFwcCk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICAgICAgdGhpcy5mZXRjaCA9IGZldGNoO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25PcGVuKCkge1xyXG4gICAgICAgIGxldCB7IGNvbnRlbnRFbCwgc291cmNlLCBwbHVnaW4sIGZldGNoIH0gPSB0aGlzO1xyXG4gICAgICAgIGxldCBjb250ZW50ID0gc291cmNlO1xyXG4gICAgICAgIGlmIChmZXRjaCkge1xyXG4gICAgICAgICAgICBjb250ZW50RWwuY3JlYXRlRGl2KHsgdGV4dDogYFdhaXRpbmcgZm9yIGNvbnRlbnQgZnJvbTogJyR7c291cmNlfSdgIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgcmVxdWVzdCh7IHVybDogc291cmNlIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbG9nRGl2ID0gY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogXCJPQ0wtUmVuZGVyZWRNYXJrZG93bk1vZGFsXCIgfSk7XHJcbiAgICAgICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihjb250ZW50LCBsb2dEaXYsIFwiXCIsIHBsdWdpbik7XHJcbiAgICB9XHJcbiAgICBvbkNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEFkZCBhIGJ1dHRvbiB0byBhbiBIVE1MRUxlbWVudCwgd2hpY2gsIHdoZW4gY2xpY2tlZCwgcG9wcyB1cCBhIHtAbGluayBSZW5kZXJlZE1hcmtkb3duTW9kYWx9IHNob3dpbmcgcmVuZGVyZWQgbWFya2Rvd24uXHJcbiAqXHJcbiAqIFVzZSBgZmV0Y2hgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG1hcmtkb3duIHN0cmluZyBuZWVkcyB0byBiZSBmZXRjaGVkLCBvciBpZiBpdCBoYXMgYmVlbiBwcm92aWRlZCBhcyBhIHN0cmluZyBhbHJlYWR5LlxyXG4gKlxyXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9IaTRneXl2LnBuZylcclxuICogQHBhcmFtICB7WW91clBsdWdpbn0gcGx1Z2luXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBjb250YWluZXJFbCBIVE1MRWxlbWVudCB0byBhZGQgdGhlIGJ1dHRvbiB0b1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNvdXJjZSBSYXcgbWFya2Rvd24gY29udGVudCBvciB1cmwgdG8gZmluZCByYXcgbWFya2Rvd24uXHJcbiAqIEBwYXJhbSAge2Jvb2xlYW59IGZldGNoIFRydWUgXHUyMTkyIGZldGNoIG1hcmtkb3duIGZyb20gYHNvdXJjZWAgYXMgdXJsLiBGYWxzZSBcdTIxOTIgYHNvdXJjZWAgaXMgYWxyZWFkeSBhIG1hcmtkb3duIHN0cmluZy5cclxuICogQHBhcmFtICB7c3RyaW5nfSBkaXNwbGF5VGV4dCBUZXh0IHRvIGRpc3BsYXkgaW4gdGhlIGJ1dHRvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZW5kZXJlZE1hcmtkb3duQnV0dG9uKHBsdWdpbiwgY29udGFpbmVyRWwsIHNvdXJjZSwgZmV0Y2gsIGRpc3BsYXlUZXh0KSB7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImJ1dHRvblwiLCB7IHRleHQ6IGRpc3BsYXlUZXh0IH0sIChidXQpID0+IGJ1dC5vbkNsaWNrRXZlbnQoKCkgPT4ge1xyXG4gICAgICAgIG5ldyBSZW5kZXJlZE1hcmtkb3duTW9kYWwocGx1Z2luLCBzb3VyY2UsIGZldGNoKS5vcGVuKCk7XHJcbiAgICB9KSk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGBhcHAubWV0YWRhdGFDYWNoZS5SZXNvbHZlZExpbmtzYCBoYXZlIGZ1bGx5IGluaXRhbGlzZWQuXHJcbiAqXHJcbiAqIFVzZWQgd2l0aCB7QGxpbmsgd2FpdEZvclJlc29sdmVkTGlua3N9LlxyXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG5vRmlsZXMgTnVtYmVyIG9mIGZpbGVzIGluIHlvdXIgdmF1bHQuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVkTGlua3NDb21wbGV0ZShub0ZpbGVzKSB7XHJcbiAgICBjb25zdCB7IHJlc29sdmVkTGlua3MgfSA9IGFwcC5tZXRhZGF0YUNhY2hlO1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc29sdmVkTGlua3MpLmxlbmd0aCA9PT0gbm9GaWxlcztcclxufVxyXG4vKipcclxuICogV2FpdCBmb3IgYGFwcC5tZXRhZGF0YUNhY2hlLlJlc29sdmVkTGlua3NgIHRvIGhhdmUgZnVsbHkgaW5pdGlhbGlzZWQuXHJcbiAqIEBwYXJhbSAge251bWJlcn0gW2RlbGF5PTEwMDBdIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4PTUwXSBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIGNoZWNrIGJlZm9yZSB0aHJvd2luZyBhbiBlcnJvciBhbmQgYnJlYWtpbmcgb3V0IG9mIHRoZSBsb29wLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JSZXNvbHZlZExpbmtzKGRlbGF5ID0gMTAwMCwgbWF4ID0gNTApIHtcclxuICAgIGNvbnN0IG5vRmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmxlbmd0aDtcclxuICAgIGxldCBpID0gMDtcclxuICAgIHdoaWxlICghcmVzb2x2ZWRMaW5rc0NvbXBsZXRlKG5vRmlsZXMpICYmIGkgPCBtYXgpIHtcclxuICAgICAgICBhd2FpdCB3YWl0KGRlbGF5KTtcclxuICAgICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBpZiAoaSA9PT0gbWF4KSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJPYnNpZGlhbi1Db21tdW5pdHktTGliOiBSZXNvbHZlZExpbmtzIGRpZCBub3QgZmluaXNoIGluaXRpYWxpc2luZy4gYG1heGAgaXRlcmF0aW9ucyB3YXMgcmVhY2hlZCBmaXJzdC5cIik7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSBjb250ZW50IG9mIGEgbm90ZSBoYXMgWUFNTC4gSWYgc28sIHJldHVybiBhbiBhcnJheSBvZiB0aGUgWUFNTCBhbmQgdGhlIHJlc3Qgb2YgdGhlIG5vdGUuIElmIG5vdCwgcmV0dXJuIGBbJycsIGNvbnRlbnRdYFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvbnRlbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0WWFtbChjb250ZW50KSB7XHJcbiAgICBpZiAoIS9eLS0tXFxuLy50ZXN0KGNvbnRlbnQpKVxyXG4gICAgICAgIHJldHVybiBbXCJcIiwgY29udGVudF07XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBzcGxpdHMgPSBjb250ZW50LnNwbGl0KFwiLS0tXCIpO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHNwbGl0cy5zbGljZSgwLCAyKS5qb2luKFwiLS0tXCIpICsgXCItLS1cIixcclxuICAgICAgICAgICAgc3BsaXRzLnNsaWNlKDIpLmpvaW4oXCItLS1cIiksXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICpcclxuICogQHBhcmFtIHtib29sZWFufSBjYWNoZWQgUmV0dXJuIGNhY2hlZCBmaWxlIGNvbnRlbnQgKipvcioqIHJldHVybiB3aGF0J3Mgb24gZGlzay5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY3RpdmVGaWxlQ29udGVudChjYWNoZWQgPSB0cnVlKSB7XHJcbiAgICBjb25zdCBjdXJyRmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG4gICAgaWYgKCEoY3VyckZpbGUgaW5zdGFuY2VvZiBURmlsZSkpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAoY2FjaGVkKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChjdXJyRmlsZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5yZWFkKGN1cnJGaWxlKTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUge1xyXG4gIEJDU2V0dGluZ3MsXHJcbiAgRGlyZWN0aW9ucyxcclxuICBSZWFsTkltcGxpZWQsXHJcbiAgVXNlckhpZXIsXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSB7IElKdWdnbFNldHRpbmdzIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1BVFJJWF9WSUVXID0gXCJCQy1tYXRyaXhcIjtcclxuLy8gZXhwb3J0IGNvbnN0IFNUQVRTX1ZJRVcgPSBcIkJDLXN0YXRzXCI7XHJcbmV4cG9ydCBjb25zdCBEVUNLX1ZJRVcgPSBcIkJDLWR1Y2tzXCI7XHJcbmV4cG9ydCBjb25zdCBUUkVFX1ZJRVcgPSBcIkJDLXRyZWVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBUUkFJTF9JQ09OID0gXCJCQy10cmFpbC1pY29uXCI7XHJcbmV4cG9ydCBjb25zdCBUUkFJTF9JQ09OX1NWRyA9XHJcbiAgJzxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ4LjgsNGMtNiwwLTEzLjUsMC41LTE5LjcsMy4zUzE3LjksMTUuOSwxNy45LDI1YzAsNSwyLjYsOS43LDYuMSwxMy45czguMSw4LjMsMTIuNiwxMi4zczksNy44LDEyLjIsMTEuNSBjMy4yLDMuNyw1LjEsNy4xLDUuMSwxMC4yYzAsMTQuNC0xMy40LDE5LjMtMTMuNCwxOS4zYy0wLjcsMC4yLTEuMiwwLjgtMS4zLDEuNXMwLjEsMS40LDAuNywxLjljMC42LDAuNSwxLjMsMC42LDIsMC4zIGMwLDAsMTYuMS02LjEsMTYuMS0yM2MwLTQuNi0yLjYtOC44LTYuMS0xMi44Yy0zLjUtNC04LjEtNy45LTEyLjYtMTEuOGMtNC41LTMuOS04LjktNy45LTEyLjItMTEuOGMtMy4yLTMuOS01LjItNy43LTUuMi0xMS40IGMwLTcuOCwzLjYtMTEuNiw4LjgtMTRTNDMsOCw0OC44LDhjNC42LDAsOS4zLDAsMTEsMGMwLjcsMCwxLjQtMC40LDEuNy0xYzAuMy0wLjYsMC4zLTEuNCwwLTJzLTEtMS0xLjctMUM1OC4zLDQsNTMuNCw0LDQ4LjgsNCBMNDguOCw0eiBNNzguMSw0Yy0wLjYsMC0xLjIsMC4yLTEuNiwwLjdsLTguOSw5LjljLTAuNSwwLjYtMC43LDEuNC0wLjMsMi4yYzAuMywwLjcsMSwxLjIsMS44LDEuMmgwLjFsLTIuOCwyLjYgYy0wLjYsMC42LTAuOCwxLjQtMC41LDIuMmMwLjMsMC44LDEsMS4zLDEuOSwxLjNoMS4zbC00LjUsNC42Yy0wLjYsMC42LTAuNywxLjQtMC40LDIuMmMwLjMsMC43LDEsMS4yLDEuOCwxLjJoMTB2NCBjMCwwLjcsMC40LDEuNCwxLDEuOGMwLjYsMC40LDEuNCwwLjQsMiwwYzAuNi0wLjQsMS0xLDEtMS44di00aDEwYzAuOCwwLDEuNS0wLjUsMS44LTEuMmMwLjMtMC43LDAuMS0xLjYtMC40LTIuMkw4Ni45LDI0aDEuMyBjMC44LDAsMS42LTAuNSwxLjktMS4zYzAuMy0wLjgsMC4xLTEuNi0wLjUtMi4ybC0yLjgtMi42aDAuMWMwLjgsMCwxLjUtMC41LDEuOC0xLjJjMC4zLTAuNywwLjItMS42LTAuMy0yLjJsLTguOS05LjkgQzc5LjEsNC4zLDc4LjYsNCw3OC4xLDRMNzguMSw0eiBNNzgsOWw0LjQsNC45aC0wLjdjLTAuOCwwLTEuNiwwLjUtMS45LDEuM2MtMC4zLDAuOC0wLjEsMS42LDAuNSwyLjJsMi44LDIuNmgtMS4xIGMtMC44LDAtMS41LDAuNS0xLjgsMS4yYy0wLjMsMC43LTAuMSwxLjYsMC40LDIuMmw0LjUsNC42SDcwLjhsNC41LTQuNmMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC0xLjEgbDIuOC0yLjZjMC42LTAuNiwwLjgtMS40LDAuNS0yLjJjLTAuMy0wLjgtMS0xLjMtMS45LTEuM2gtMC43TDc4LDl6IE01Mi40LDEyYy00LjEsMC03LjEsMC41LTkuNCwxLjVjLTIuMywxLTMuOCwyLjUtNC41LDQuMyBjLTAuNywxLjgtMC41LDMuNiwwLjEsNS4yYzAuNiwxLjUsMS41LDIuOSwyLjUsMy45YzUuNCw1LjQsMTguMSwxMi42LDI5LjYsMjFjNS44LDQuMiwxMS4yLDguNiwxNS4xLDEzYzMuOSw0LjQsNi4yLDguNyw2LjIsMTIuNCBjMCwxNC41LTEyLjksMTguNy0xMi45LDE4LjdjLTAuNywwLjItMS4yLDAuOC0xLjQsMS41czAuMSwxLjUsMC43LDEuOWMwLjYsMC41LDEuMywwLjYsMiwwLjNjMCwwLDE1LjYtNS42LDE1LjYtMjIuNSBjMC01LjMtMi45LTEwLjMtNy4yLTE1LjFDODQuNiw1My42LDc5LDQ5LDczLjEsNDQuN2MtMTEuOC04LjYtMjQuOC0xNi4zLTI5LjItMjAuNmMtMC42LTAuNi0xLjItMS41LTEuNi0yLjQgYy0wLjMtMC45LTAuNC0xLjctMC4xLTIuNGMwLjMtMC43LDAuOC0xLjQsMi4zLTJjMS41LTAuNyw0LjEtMS4yLDcuOC0xLjJjNC45LDAsOS40LDAuMSw5LjQsMC4xYzAuNywwLDEuNC0wLjMsMS44LTEgYzAuNC0wLjYsMC40LTEuNCwwLTIuMWMtMC40LTAuNi0xLjEtMS0xLjgtMUM2MS45LDEyLjEsNTcuMywxMiw1Mi40LDEyTDUyLjQsMTJ6IE0yNCw0NmMtMC41LDAtMS4xLDAuMi0xLjQsMC42TDkuMiw2MC41IGMtMC42LDAuNi0wLjcsMS40LTAuNCwyLjJjMC4zLDAuNywxLDEuMiwxLjgsMS4yaDNsLTYuNSw2LjhjLTAuNiwwLjYtMC43LDEuNC0wLjQsMi4yczEsMS4yLDEuOCwxLjJIMTNsLTguNSw4LjYgQzQsODMuMiwzLjgsODQsNC4yLDg0LjhDNC41LDg1LjUsNS4yLDg2LDYsODZoMTZ2NS40YzAsMC43LDAuNCwxLjQsMSwxLjhjMC42LDAuNCwxLjQsMC40LDIsMGMwLjYtMC40LDEtMSwxLTEuOFY4NmgxNiBjMC44LDAsMS41LTAuNSwxLjgtMS4yYzAuMy0wLjcsMC4xLTEuNi0wLjQtMi4yTDM1LDc0aDQuNGMwLjgsMCwxLjUtMC41LDEuOC0xLjJzMC4yLTEuNi0wLjQtMi4ybC02LjUtNi44aDMgYzAuOCwwLDEuNS0wLjUsMS44LTEuMmMwLjMtMC43LDAuMi0xLjYtMC40LTIuMkwyNS40LDQ2LjZDMjUuMSw0Ni4yLDI0LjUsNDYsMjQsNDZMMjQsNDZ6IE0yNCw1MC45bDguNyw5aC0zIGMtMC44LDAtMS41LDAuNS0xLjgsMS4ycy0wLjIsMS42LDAuNCwyLjJsNi41LDYuOGgtNC41Yy0wLjgsMC0xLjUsMC41LTEuOCwxLjJjLTAuMywwLjctMC4xLDEuNiwwLjQsMi4ybDguNSw4LjZIMTAuOGw4LjUtOC42IGMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC00LjVsNi41LTYuOGMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC0zTDI0LDUwLjl6XCIvPic7XHJcblxyXG5leHBvcnQgY29uc3QgRFVDS19JQ09OID0gXCJCQy1kdWNrLWljb25cIjtcclxuZXhwb3J0IGNvbnN0IERVQ0tfSUNPTl9TVkcgPVxyXG4gICc8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgZD1cIk03MiwzMWMwLTEuNS0xLjItMi44LTIuOC0yLjhjLTEuNSwwLTIuOCwxLjItMi44LDIuOHMxLjIsMi44LDIuOCwyLjhDNzAuOCwzMy44LDcyLDMyLjYsNzIsMzF6IE04MC40LDQ3LjdjMTAuNywwLDE5LjQtOC43LDE5LjQtMTkuNEg4OC40Yy0wLjEtMC42LTAuMS0xLjEtMC4yLTEuN2MtMS42LTcuMS03LjMtMTIuOC0xNC4zLTE0NGMtMS42LTAuNC0zLjEtMC41LTQuNi0wLjVjLTEwLjcsMC0xOS40LDguNy0xOS40LDE5LjR2MTMuOWgtOS40Yy02LjgsMC0xMy42LTIuNC0xOC4yLTcuM2MtMC43LTAuNy0xLjYtMS4xLTIuNC0xMWMtMS43LDAtMy4zLDEuMy0zLjMsMy4zYzAsMTYuNCwxMi41LDMxLDI4LjYsMzIuNmMxLjYsMC4yLDMuMS0xLjEsMy4xLTIuOHYtMi44YzAtMS40LTEtMi42LTIuNC0yLjdjLTcuOS0wOS0xNC44LTYuMi0xOC40LTEzLjVjNC4xLDEuNiw4LjUsMi41LDEzLjEsMi41bDE3LjcsMC4xVjMxYzAtNi4xLDUtMTEuMSwxMS4xLTExLjFjMC45LDAsMS44LDAuMSwyLjcsMC4zYzMuOSwwLjksNy4yLDQuMiw4LjEsOC4xQzgxNCwzNC40LDc4LDM5LjEsNzQsNDFsLTQuNywyLjN2MTIuNGwyLjEsMi40YzEuNSwxLjgsMy40LDQuNywzLjUsOC44YzAuMSwzLjQtMS4zLDYuNy0zLjksOS40Yy0zLDMtNyw0LjgtMTEuMiw0LjhINDMuOWMtMSwwLTIuMS0wMS0zLjItMC4yQzI1LjIsNzkuNSwxMi4zLDY4LjEsOC43LDUzLjJoNS4xYy0xLjItMi43LTItNS41LTIuNS04LjNINS40Yy0zLjMsMC02LDMtNS41LDYuM2MyLjksMjAuMywxOS40LDM2LjEsNDAsMzhjMS4zLDAuMSwyLjYsMDIsNCwwLjJoMTUuOGMxMi41LDAsMjMuNy0xMC4yLDIzLjQtMjIuN2MtMC4xLTUuNC0yLjItMTAuMy01LjYtMTQuMXYtNC45SDgwLjRMODAuNCw0Ny43elwiLz4nO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNwbGl0TGlua3NSZWdleCA9IG5ldyBSZWdFeHAoL1xcW1xcWyguKz8pXFxdXFxdL2cpO1xyXG5leHBvcnQgY29uc3QgZHJvcEhlYWRlck9yQWxpYXMgPSBuZXcgUmVnRXhwKC9cXFtcXFsoW14jfF0rKVxcXVxcXS8pO1xyXG5cclxuLyoqIEEgbWV0YS1yZWdleCB0aGF0IHRha2VzIGluIGEgc3RyaW5nIG9mIHRoZSBmb3JtIGAvcmVnZXgvZmxhZ3NgLCBhbmQgcmV0dXJucyAyIGdyb3VwcywgdGhlIGlubmVyIGByZWdleGAsIGFuZCB0aGUgYGZsYWdzYC4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZ05GbGFncyA9IG5ldyBSZWdFeHAoL14uKC4qPylcXFcoXFx3KikkLyk7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFRSQUlMX0xFTkdUSFMgPSBbXHJcbiAgJ1Nob3J0ZXN0JyxcclxuICAnTG9uZ2VzdCcsXHJcbiAgJ0FsbCdcclxuXVxyXG5cclxuZXhwb3J0IGNvbnN0IFZJU1RZUEVTID0gW1xyXG4gIFwiRm9yY2UgRGlyZWN0ZWQgR3JhcGhcIixcclxuICBcIlRpZHkgVHJlZVwiLFxyXG4gIFwiQ2lyY2xlIFBhY2tpbmdcIixcclxuICBcIkVkZ2UgQnVuZGxpbmdcIixcclxuICBcIkFyYyBEaWFncmFtXCIsXHJcbiAgXCJTdW5idXJzdFwiLFxyXG4gIFwiVHJlZSBNYXBcIixcclxuICBcIkljaWNsZVwiLFxyXG4gIFwiUmFkaWFsIFRyZWVcIixcclxuXSBhcyBjb25zdDtcclxuXHJcbi8qIEFsbCA1IHBvc3NpYmxlIGRpcmVjdGlvbnMuICovXHJcbmV4cG9ydCBjb25zdCBESVJFQ1RJT05TID0gW1widXBcIiwgXCJzYW1lXCIsIFwiZG93blwiLCBcIm5leHRcIiwgXCJwcmV2XCJdIGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIEFuIGFycm93IGZvciBlYWNoIHtAbGluayBESVJFQ1RJT05TfSB2YWx1ZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBBUlJPV19ESVJFQ1RJT05TOiB7IFtkaXIgaW4gRGlyZWN0aW9uc106IHN0cmluZyB9ID0ge1xyXG4gIHVwOiBcIlx1MjE5MVwiLFxyXG4gIHNhbWU6IFwiXHUyMTk0XCIsXHJcbiAgZG93bjogXCJcdTIxOTNcIixcclxuICBuZXh0OiBcIlx1MjE5MlwiLFxyXG4gIHByZXY6IFwiXHUyMTkwXCIsXHJcbn07XHJcbmV4cG9ydCBjb25zdCBSRUxBVElPTlMgPSBbXCJQYXJlbnRcIiwgXCJTaWJsaW5nXCIsIFwiQ2hpbGRcIl0gYXMgY29uc3Q7XHJcbmV4cG9ydCBjb25zdCBSRUFsQ0xPU0VEID0gW1wiUmVhbFwiLCBcIkNsb3NlZFwiXTtcclxuZXhwb3J0IGNvbnN0IEFMTFVOTElOS0VEID0gW1wiQWxsXCIsIFwiTm8gVW5saW5rZWRcIl07XHJcbmV4cG9ydCBjb25zdCBDT0RFQkxPQ0tfVFlQRVMgPSBbXCJ0cmVlXCIsIFwianVnZ2xcIl07XHJcbmV4cG9ydCBjb25zdCBDT0RFQkxPQ0tfRklFTERTID0gW1xyXG4gIFwidHlwZVwiLFxyXG4gIFwiZGlyXCIsXHJcbiAgXCJmaWVsZHNcIixcclxuICBcImRlcHRoXCIsXHJcbiAgXCJ0aXRsZVwiLFxyXG4gIFwiZmxhdFwiLFxyXG4gIFwiY29udGVudFwiLFxyXG4gIFwiZnJvbVwiLFxyXG4gIFwiaW1wbGllZFwiLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IEpVR0dMX0NCX0RFRkFVTFRTOiBJSnVnZ2xTZXR0aW5ncyA9IHtcclxuICAvLyBAdHMtaWdub3JlXHJcbiAgYW5pbWF0ZUxheW91dDogdHJ1ZSxcclxuICBhdXRvQWRkTm9kZXM6IGZhbHNlLFxyXG4gIGF1dG9FeHBhbmQ6IGZhbHNlLFxyXG4gIGF1dG9ab29tOiBmYWxzZSxcclxuICBjb3JlU3RvcmU6IFwiY29yZVwiLFxyXG4gIGV4cGFuZEluaXRpYWw6IGZhbHNlLFxyXG4gIGZkZ2RMYXlvdXQ6IFwiZDMtZm9yY2VcIixcclxuICBmaWx0ZXI6IFwiXCIsXHJcbiAgaGVpZ2h0OiBcIjc1MHB4XCIsXHJcbiAgaG92ZXJFZGdlczogZmFsc2UsXHJcbiAgbGF5b3V0OiBcImZvcmNlLWRpcmVjdGVkXCIsXHJcbiAgbGltaXQ6IDI1MCxcclxuICBtZXJnZUVkZ2VzOiB0cnVlLFxyXG4gIG1ldGFLZXlIb3ZlcjogdHJ1ZSxcclxuICBtb2RlOiBcIndvcmtzcGFjZVwiLFxyXG4gIG5hdmlnYXRvcjogdHJ1ZSxcclxuICBvcGVuV2l0aFNoaWZ0OiBmYWxzZSxcclxuICByZWFkQ29udGVudDogdHJ1ZSxcclxuICBzdHlsZUdyb3VwczogW10sXHJcbiAgdG9vbGJhcjogdHJ1ZSxcclxuICB3aWR0aDogXCIxMDAlXCIsXHJcbiAgem9vbVNwZWVkOiAxLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEpVR0dMX1RSQUlMX0RFRkFVTFRTOiBJSnVnZ2xTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXHJcbiAgSlVHR0xfQ0JfREVGQVVMVFMsXHJcbiAge1xyXG4gICAgYW5pbWF0ZUxheW91dDogdHJ1ZSxcclxuICAgIGF1dG9ab29tOiBmYWxzZSxcclxuICAgIGZkZ2RMYXlvdXQ6IFwiZDMtZm9yY2VcIixcclxuICAgIGhlaWdodDogXCIzMDBweFwiLFxyXG4gICAgcmVhZENvbnRlbnQ6IGZhbHNlLFxyXG4gICAgdG9vbGJhcjogZmFsc2UsXHJcbiAgICBuYXZpZ2F0b3I6IGZhbHNlLFxyXG4gIH1cclxuKTtcclxuQ09ERUJMT0NLX0ZJRUxEUy5wdXNoKC4uLk9iamVjdC5rZXlzKEpVR0dMX0NCX0RFRkFVTFRTKSk7XHJcblxyXG5leHBvcnQgY29uc3QgYmxhbmtVc2VySGllciA9ICgpOiBVc2VySGllciA9PiB7XHJcbiAgcmV0dXJuIHsgdXA6IFtdLCBzYW1lOiBbXSwgZG93bjogW10sIG5leHQ6IFtdLCBwcmV2OiBbXSB9O1xyXG59O1xyXG5leHBvcnQgY29uc3QgYmxhbmtEaXJPYmpzID0gKCk6IHsgW2RpciBpbiBEaXJlY3Rpb25zXToge30gfSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHVwOiB7fSxcclxuICAgIHNhbWU6IHt9LFxyXG4gICAgZG93bjoge30sXHJcbiAgICBuZXh0OiB7fSxcclxuICAgIHByZXY6IHt9LFxyXG4gIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgYmxhbmtSZWFsTkltcGxpZWQgPSAoKTogUmVhbE5JbXBsaWVkID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgdXA6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIGRvd246IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIHNhbWU6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIG5leHQ6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIHByZXY6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IFtcclxuICBCQ19JX0FVTlQsXHJcbiAgQkNfSV9DT1VTSU4sXHJcbiAgQkNfSV9TSUJMSU5HXzEsXHJcbiAgQkNfSV9TSUJMSU5HXzIsXHJcbiAgQkNfSV9SRUZMRVhJVkUsXHJcbiAgQkNfSV9QQVJFTlQsXHJcbl0gPSBbXHJcbiAgICBcIkJDLUF1bnRcIixcclxuICAgIFwiQkMtQ291c2luXCIsXHJcbiAgICBcIkJDLVNpYmxpbmctMVwiLFxyXG4gICAgXCJCQy1TaWJsaW5nLTJcIixcclxuICAgIFwiQkMtUmVmbGV4aXZlXCIsXHJcbiAgICBcIkJDLVBhcmVudFwiLFxyXG4gIF07XHJcblxyXG5leHBvcnQgY29uc3QgW1xyXG4gIEJDX0ZPTERFUl9OT1RFLFxyXG4gIEJDX0ZPTERFUl9OT1RFX1NVQkZPTERFUlMsXHJcbiAgQkNfRk9MREVSX05PVEVfUkVDVVJTSVZFLFxyXG4gIEJDX1RBR19OT1RFLFxyXG4gIEJDX1RBR19OT1RFX0ZJRUxELFxyXG4gIEJDX1RBR19OT1RFX0VYQUNULFxyXG4gIEJDX0xJTktfTk9URSxcclxuICBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gIEJDX1JFR0VYX05PVEUsXHJcbiAgQkNfUkVHRVhfTk9URV9GSUVMRCxcclxuICBCQ19EVl9OT1RFLFxyXG4gIEJDX0RWX05PVEVfRklFTEQsXHJcbiAgQkNfSUdOT1JFLFxyXG4gIEJDX0lHTk9SRV9ERU5EUk9OLFxyXG4gIEJDX0hJREVfVFJBSUwsXHJcbiAgQkNfT1JERVIsXHJcbl0gPSBbXHJcbiAgICBcIkJDLWZvbGRlci1ub3RlXCIsXHJcbiAgICBcIkJDLWZvbGRlci1ub3RlLXN1YmZvbGRlcnNcIixcclxuICAgIFwiQkMtZm9sZGVyLW5vdGUtcmVjdXJzaXZlXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlLWZpZWxkXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlLWV4YWN0XCIsXHJcbiAgICBcIkJDLWxpbmstbm90ZVwiLFxyXG4gICAgXCJCQy10cmF2ZXJzZS1ub3RlXCIsXHJcbiAgICBcIkJDLXJlZ2V4LW5vdGVcIixcclxuICAgIFwiQkMtcmVnZXgtbm90ZS1maWVsZFwiLFxyXG4gICAgXCJCQy1kYXRhdmlldy1ub3RlXCIsXHJcbiAgICBcIkJDLWRhdGF2aWV3LW5vdGUtZmllbGRcIixcclxuICAgIFwiQkMtaWdub3JlXCIsXHJcbiAgICBcIkJDLWlnbm9yZS1kZW5kcm9uXCIsXHJcbiAgICBcIkJDLWhpZGUtdHJhaWxcIixcclxuICAgIFwiQkMtb3JkZXJcIixcclxuICBdO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJDX0ZJRUxEU19JTkZPID0gW1xyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIGZvbGRlci1ub3RlLiBBbGwgb3RoZXIgbm90ZXMgaW4gdGhpcyBmb2xkZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgZ3JhcGggd2l0aCB0aGUgZmllbGQgbmFtZSBzcGVjaWZpZWQgaW4gdGhpcyBrZXkncyB2YWx1ZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URV9TVUJGT0xERVJTLFxyXG4gICAgZGVzYzogXCJMaW5rIHRvIG5vdGVzIGluIHN1YmZvbGRlcnMgd2l0aCB0aGUgZ2l2ZW4gZmllbGQuXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiBcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6IFwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URV9SRUNVUlNJVkUsXHJcbiAgICBkZXNjOiBcIlJlY3Vyc2l2ZWx5IGFkZCBub3RlcyBpbiBzdWJmb2xkZXJzIHRvIHRoZSBmb2xkZXJub3RlIG9mIF90aGF0XyBzdWJmb2xkZXIuXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiB0cnVlXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiB0cnVlXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX1RBR19OT1RFLFxyXG4gICAgZGVzYzogXCJTZXQgdGhpcyBub3RlIGFzIGEgQnJlYWRjcnVtYnMgdGFnLW5vdGUuIEFsbCBvdGhlciBub3RlcyB3aXRoIHRoaXMgdGFnIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdyYXBoIHVzaW5nIHRoZSBkZWZhdWx0IGZpZWxkTmFtZSBzcGVjaWZpZWQgaW4gYFNldHRpbmdzID4gQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXMgPiBUYWcgTm90ZXMgPiBEZWZhdWx0IEZpZWxkYCwgb3IgdXNpbmcgdGhlIGZpZWxkTmFtZSB5b3Ugc3BlY2lmeSB3aXRoIGBCQy10YWctbm90ZS1maWVsZDogZmllbGROYW1lYFwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogJyNcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6ICNcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19UQUdfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyB0YWctbm90ZSB0byB1c2VcIixcclxuICAgIGFmdGVyWWFtbDogXCI6IFwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX1RBR19OT1RFX0VYQUNULFxyXG4gICAgZGVzYzogXCJPbmx5IGxvb2sgZm9yIG5vdGVzIHdpdGggdGhlIGV4YWN0IHRhZy4gaS5lLiBgI0FgIHdvbid0IG1hdGNoIGAjQS9CYFwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogdHJ1ZVwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogdHJ1ZVwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19MSU5LX05PVEUsXHJcbiAgICBkZXNjOiBcIlNldCB0aGlzIG5vdGUgYXMgYSBCcmVhZGNydW1icyBsaW5rLW5vdGUuIEFsbCBsaW5rcyBsZWF2aW5nIHRoaXMgbm90ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBncmFwaCB3aXRoIHRoZSBmaWVsZCBuYW1lIHNwZWNpZmllZCBpbiB0aGlzIGtleSdzIHZhbHVlLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gICAgZGVzYzogXCJTZXQgdGhpcyBub3RlIGFzIGEgQnJlYWRjcnVtYnMgdHJhdmVyc2Utbm90ZS4gU3RhcnRpbmcgZnJvbSB0aGlzIG5vdGUsIHRoZSBPYnNpZGlhbiBncmFwaCB3aWxsIGJlIHRyYXZlcnNlZCBpbiBkZXB0aC1maXJzdCBvcmRlciwgYW5kIGFsbCBub3RlcyBhbG9uZyB0aGUgd2F5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEJDIGdyYXBoIHVzaW5nIHRoZSBmaWVsZE5hbWUgeW91IHNwZWNpZnlcIixcclxuICAgIGFmdGVyWWFtbDogXCI6IFwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfUkVHRVhfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIHJlZ2V4LW5vdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGEgcmVndWxhciBleHByZXNzaW9uIChvZiB0aGUgZm9ybSAnL3JlZ2V4L2ZsYWdzJykuIEFsbCBub3RlIG5hbWVzIHRoYXQgbWF0Y2ggdGhlIHJlZ2V4IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEJDIGdyYXBoIHVzaW5nIHRoZSBkZWZhdWx0IGZpZWxkTmFtZSBzcGVjaWZpZWQgaW4gYFNldHRpbmdzID4gQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXMgPiBSZWdleCBOb3RlcyA+IERlZmF1bHQgRmllbGRgLCBvciB1c2luZyB0aGUgZmllbGROYW1lIHlvdSBzcGVjaWZ5IGluICdCQy1yZWdleC1ub3RlLWZpZWxkJy5cIixcclxuICAgIGFmdGVyWWFtbDogXCI6ICcvXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiAvXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfUkVHRVhfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyByZWdleC1ub3RlIHRvIHVzZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfRFZfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIERhdGF2aWV3LW5vdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGEgRGF0YXZpZXcgYGZyb21gIHF1ZXJ5LiBBbGwgbm90ZXMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgd2lsbCBiZSBhZGRlZCB0byB0aGUgQkMgZ3JhcGggdXNpbmcgdGhlIGRlZmF1bHQgZmllbGROYW1lIHNwZWNpZmllZCBpbiBgU2V0dGluZ3MgPiBBbHRlcm5hdGl2ZSBIaWVyYXJjaGllcyA+IERhdGF2aWV3IE5vdGVzID4gRGVmYXVsdCBGaWVsZGAsIG9yIHVzaW5nIHRoZSBmaWVsZE5hbWUgeW91IHNwZWNpZnkgaW4gJ0JDLWRhdGF2aWV3LW5vdGUtZmllbGQnLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogJ1wiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfRFZfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyBEYXRhdmlldy1ub3RlIHRvIHVzZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfSUdOT1JFLFxyXG4gICAgZGVzYzogXCJUZWxscyBCcmVhZGNydW1icyB0byBpZ25vcmUgYSBub3RlIGZyb20gaXRzIGluZGV4IGVudGlyZWx5LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgQnJlYWRjcnVtYnMgdG8gaW5kZXggbm90ZXMsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBzaG93IHRoZW0gaW4gdGhlIGdyYXBoLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogdHJ1ZVwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogdHJ1ZVwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19JR05PUkVfREVORFJPTixcclxuICAgIGRlc2M6IFwiVGVsbHMgQnJlYWRjcnVtYnMgdG8gbm90IHRyZWF0IHRoaXMgbm90ZSBhcyBhIGRlbmRyb24gbm90ZSAob25seSB1c2VmdWwgaWYgdGhlIG5vdGUgbmFtZSBoYXMgeW91IGRlbmRyb24gc3BsaXR0ZXIgaW4gaXQsIHVzdWFsbHkgYSBwZXJpb2QgYC5gKS5cIixcclxuICAgIGFmdGVyWWFtbDogXCI6IHRydWVcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6IHRydWVcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfSElERV9UUkFJTCxcclxuICAgIGRlc2M6IFwiRG9uJ3Qgc2hvdyB0aGUgdHJhaWwgaW4gdGhpcyBub3RlXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiB0cnVlXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiB0cnVlXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX09SREVSLFxyXG4gICAgZGVzYzogXCJTZXQgdGhlIG9yZGVyIG9mIHRoaXMgbm90ZSBpbiB0aGUgTWF0cml4IHZpZXcuIEEgbG93ZXIgdmFsdWUgcGxhY2VzIHRoaXMgbm90ZSBoaWdoZXIgaW4gdGhlIG9yZGVyLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBCQ19BTFRTID0gQkNfRklFTERTX0lORk8uZmlsdGVyKChmKSA9PiBmLmFsdCkubWFwKChmKSA9PiBmLmZpZWxkKTtcclxuXHJcbmV4cG9ydCBjb25zdCBJTExFR0FMX0ZJTEVOQU1FX0NIQVJTID0gW1xyXG4gIFwiXFxcXFwiLFxyXG4gIFwiL1wiLFxyXG4gIFwiOlwiLFxyXG4gIFwiKlwiLFxyXG4gIFwiP1wiLFxyXG4gICdcIicsXHJcbiAgXCI8XCIsXHJcbiAgXCI+XCIsXHJcbiAgXCJ8XCIsXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgREFUQVZJRVdfTUlTU0lORyA9XHJcbiAgXCJUaGUgRGF0YXZpZXcgcGx1Z2luIG11c3QgYmUgaW5zdGFsbGVkIGZvciB0aGlzIHRvIHdvcmtcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBBUElfTkFNRSA9IFwiQkNBUElcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBCQ1NldHRpbmdzID0ge1xyXG4gIGFkZERlbmRyb25Ob3RlczogZmFsc2UsXHJcbiAgYWRkRGF0ZU5vdGVzOiBmYWxzZSxcclxuICBhbGlhc2VzSW5JbmRleDogZmFsc2UsXHJcbiAgYWxwaGFTb3J0QXNjOiB0cnVlLFxyXG4gIGFsdExpbmtGaWVsZHM6IFtdLFxyXG4gIENTVlBhdGhzOiBcIlwiLFxyXG4gIGNyZWF0ZUluZGV4SW5kZW50OiAnICAnLFxyXG4gIGRhdGVGb3JtYXQ6IFwiWVlZWS1NTS1ERFwiLFxyXG4gIGRhdGVOb3RlRm9ybWF0OiBcInl5eXktTU0tZGRcIixcclxuICBkYXRlTm90ZUZpZWxkOiBcIm5leHRcIixcclxuICBkYXRhdmlld05vdGVGaWVsZDogXCJ1cFwiLFxyXG4gIGRhdGVOb3RlQWRkTW9udGg6IFwiXCIsXHJcbiAgZGF0ZU5vdGVBZGRZZWFyOiBcIlwiLFxyXG4gIGRlYnVnTW9kZTogXCJXQVJOXCIsXHJcbiAgZGVuZHJvbk5vdGVEZWxpbWl0ZXI6IFwiLlwiLFxyXG4gIGRlbmRyb25Ob3RlRmllbGQ6IFwidXBcIixcclxuICBkdldhaXRUaW1lOiA1MDAwLFxyXG4gIGVuYWJsZUFscGhhU29ydDogdHJ1ZSxcclxuICBlbmFibGVSZWxhdGlvblN1Z2dlc3RvcjogZmFsc2UsXHJcbiAgZmllbGRTdWdnZXN0b3I6IHRydWUsXHJcbiAgZmlsdGVySW1wbGllZFNpYmxpbmdzT2ZEaWZmZXJlbnRUeXBlczogZmFsc2UsXHJcbiAganVnZ2xMYXlvdXQ6IFwiaGllcmFyY2h5XCIsXHJcbiAgbGltaXRXcml0ZUJDQ2hlY2tib3hlczogW10sXHJcbiAgQ0hFQ0tCT1hfU1RBVEVTX09WRVJXUklUVEVOOiBmYWxzZSxcclxuICBncmlkRGVmYXVsdERlcHRoOiAyNSxcclxuICBoaWVyYXJjaHlOb3RlczogW1wiXCJdLFxyXG4gIGhpZXJhcmNoeU5vdGVJc1BhcmVudDogZmFsc2UsXHJcbiAgSE5VcEZpZWxkOiBcIlwiLFxyXG4gIGluZGV4Tm90ZXM6IFtcIlwiXSxcclxuICBuYW1pbmdTeXN0ZW1GaWVsZDogXCJcIixcclxuICBuYW1pbmdTeXN0ZW1SZWdleDogXCJcIixcclxuICBuYW1pbmdTeXN0ZW1TcGxpdDogXCIuXCIsXHJcbiAgbmFtaW5nU3lzdGVtRW5kc1dpdGhEZWxpbWl0ZXI6IGZhbHNlLFxyXG4gIHJlZnJlc2hPbk5vdGVDaGFuZ2U6IGZhbHNlLFxyXG4gIHVzZUFsbE1ldGFkYXRhOiB0cnVlLFxyXG4gIG9wZW5NYXRyaXhPbkxvYWQ6IHRydWUsXHJcbiAgb3BlbkR1Y2tPbkxvYWQ6IGZhbHNlLFxyXG4gIG9wZW5Eb3duT25Mb2FkOiB0cnVlLFxyXG4gIHBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbDogZmFsc2UsXHJcbiAgc2hvd05hbWVPclR5cGU6IHRydWUsXHJcbiAgc2hvd1JlbGF0aW9uVHlwZTogdHJ1ZSxcclxuICByZWdleE5vdGVGaWVsZDogXCJcIixcclxuICByZWxTdWdnZXN0b3JUcmlnZ2VyOiBcIlxcXFxcIixcclxuICBybExlYWY6IHRydWUsXHJcbiAgc2hvd0FsbFBhdGhzSWZOb25lVG9JbmRleE5vdGU6IGZhbHNlLFxyXG4gIHNob3dBbGxBbGlhc2VzOiB0cnVlLFxyXG4gIHNob3dCQ3M6IHRydWUsXHJcbiAgc2hvd0JDc0luRWRpdExQTW9kZTogZmFsc2UsXHJcbiAgc2hvd1JlZnJlc2hOb3RpY2U6IHRydWUsXHJcbiAgc2hvd0ltcGxpZWRSZWxhdGlvbnM6IHRydWUsXHJcbiAgc2hvd1RyYWlsOiB0cnVlLFxyXG4gIHNob3dHcmlkOiB0cnVlLFxyXG4gIHNob3dKdWdnbDogZmFsc2UsXHJcbiAgc2hvd1ByZXZOZXh0OiB0cnVlLFxyXG4gIHNvcnRCeU5hbWVTaG93QWxpYXM6IGZhbHNlLFxyXG4gIHNxdWFyZURpcmVjdGlvbnNPcmRlcjogWzAsIDEsIDIsIDMsIDRdLFxyXG4gIGxpbWl0VHJhaWxDaGVja2JveGVzOiBbXSxcclxuICBsaW1pdEp1bXBUb0ZpcnN0RmllbGRzOiBbXSxcclxuICBzaG93QWxsOiAnQWxsJyxcclxuICBub1BhdGhNZXNzYWdlOiBgVGhpcyBub3RlIGhhcyBubyByZWFsIG9yIGltcGxpZWQgcGFyZW50c2AsXHJcbiAgdGFnTm90ZUZpZWxkOiBcIlwiLFxyXG4gIHRocmVhZEludG9OZXdQYW5lOiBmYWxzZSxcclxuICB0aHJlYWRpbmdUZW1wbGF0ZTogXCJ7e2ZpZWxkfX0gb2Yge3tjdXJyZW50fX1cIixcclxuICB0aHJlYWRpbmdEaXJUZW1wbGF0ZXM6IHsgdXA6IFwiXCIsIHNhbWU6IFwiXCIsIGRvd246IFwiXCIsIG5leHQ6IFwiXCIsIHByZXY6IFwiXCIgfSxcclxuICB0aHJlYWRVbmRlckN1cnNvcjogZmFsc2UsXHJcbiAgdHJhaWxTZXBlcmF0b3I6IFwiXHUyMTkyXCIsXHJcbiAgdHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmc6IGZhbHNlLFxyXG4gIHRyaW1EZW5kcm9uTm90ZXM6IGZhbHNlLFxyXG4gIHJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGg6IHRydWUsXHJcbiAgdXNlckhpZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHVwOiBbXCJ1cFwiXSxcclxuICAgICAgc2FtZTogW1wic2FtZVwiXSxcclxuICAgICAgZG93bjogW1wiZG93blwiXSxcclxuICAgICAgbmV4dDogW1wibmV4dFwiXSxcclxuICAgICAgcHJldjogW1wicHJldlwiXSxcclxuICAgIH0sXHJcbiAgXSxcclxuICB3cml0ZUJDc0lubGluZTogZmFsc2UsXHJcbiAgc2hvd1dyaXRlQWxsQkNzQ21kOiBmYWxzZSxcclxuICB2aXNHcmFwaDogXCJGb3JjZSBEaXJlY3RlZCBHcmFwaFwiLFxyXG4gIHZpc1JlbGF0aW9uOiBcIlBhcmVudFwiLFxyXG4gIHZpc0Nsb3NlZDogXCJSZWFsXCIsXHJcbiAgdmlzQWxsOiBcIkFsbFwiLFxyXG4gIHdpa2lsaW5rSW5kZXg6IHRydWUsXHJcbiAgaW1wbGllZFJlbGF0aW9uczoge1xyXG4gICAgc2libGluZ0lkZW50aXR5OiBmYWxzZSxcclxuICAgIHNhbWVQYXJlbnRJc1NpYmxpbmc6IHRydWUsXHJcbiAgICBzaWJsaW5nc1NpYmxpbmdJc1NpYmxpbmc6IGZhbHNlLFxyXG4gICAgc2libGluZ3NQYXJlbnRJc1BhcmVudDogZmFsc2UsXHJcbiAgICBwYXJlbnRzU2libGluZ3NJc1BhcmVudHM6IGZhbHNlLFxyXG4gICAgcGFyZW50c1BhcmVudHNJc1BhcmVudDogZmFsc2UsXHJcbiAgICBjb3VzaW5zSXNTaWJsaW5nOiBmYWxzZSxcclxuICB9LFxyXG4gIHJlZnJlc2hPbk5vdGVTYXZlOiBmYWxzZSxcclxuICBzaG93VXBJbkp1Z2dsOiBmYWxzZVxyXG59O1xyXG4iLCAiaW1wb3J0IHsgZXJyb3IsIGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgSXRlbVZpZXcsIFRGaWxlLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IERlYnVnZ2VyIH0gZnJvbSBcInNyYy9EZWJ1Z2dlclwiO1xyXG5pbXBvcnQgTWF0cml4IGZyb20gXCIuLi9Db21wb25lbnRzL01hdHJpeC5zdmVsdGVcIjtcclxuaW1wb3J0IHtcclxuICBBUlJPV19ESVJFQ1RJT05TLFxyXG4gIGJsYW5rUmVhbE5JbXBsaWVkLFxyXG4gIE1BVFJJWF9WSUVXLFxyXG4gIFRSQUlMX0lDT04sXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRGlyZWN0aW9ucyxcclxuICBFZGdlQXR0cixcclxuICBpbnRlcm5hbExpbmtPYmosXHJcbiAgU3F1YXJlSXRlbSxcclxuICBTcXVhcmVQcm9wcyxcclxuICBVc2VySGllcixcclxufSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzcGxpdEFuZFRyaW0gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldE9wcERpciwgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkFwaSwgZ2V0Q3VyckZpbGUsIGxpbmtDbGFzcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0cml4TmVpZ2hib3VycyhwbHVnaW46IEJDUGx1Z2luLCBjdXJyTm9kZTogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBjbG9zZWRHLCBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBuZWlnaGJvdXJzID0gYmxhbmtSZWFsTkltcGxpZWQoKTtcclxuICBpZiAoIWNsb3NlZEcpIHJldHVybiBuZWlnaGJvdXJzO1xyXG5cclxuICBjbG9zZWRHLmZvckVhY2hFZGdlKGN1cnJOb2RlLCAoaywgYSwgcywgdCkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWVsZCwgZGlyLCBpbXBsaWVkIH0gPSBhIGFzIEVkZ2VBdHRyO1xyXG5cclxuICAgIGlmIChzID09PSBjdXJyTm9kZSkge1xyXG4gICAgICBuZWlnaGJvdXJzW2Rpcl0ucmVhbHMucHVzaCh7IHRvOiB0LCBmaWVsZCwgaW1wbGllZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5laWdoYm91cnNbZ2V0T3BwRGlyKGRpcildLmltcGxpZWRzLnB1c2goe1xyXG4gICAgICAgIHRvOiBzLFxyXG4gICAgICAgIGZpZWxkOiBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXSxcclxuICAgICAgICBpbXBsaWVkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIG5laWdoYm91cnM7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0cml4VmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHByaXZhdGUgdmlldzogTWF0cml4O1xyXG4gIGRiOiBEZWJ1Z2dlcjtcclxuXHJcbiAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIobGVhZik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIHRoaXMuZGIgPSBuZXcgRGVidWdnZXIocGx1Z2luKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHN1cGVyLm9ubG9hZCgpO1xyXG4gICAgY29uc3QgeyBwbHVnaW4gfSA9IHRoaXM7XHJcblxyXG4gICAgYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcclxuICAgICAgc2V0VGltZW91dChcclxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyYXcoKSxcclxuICAgICAgICBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3XHJcbiAgICAgICAgICA/IGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXcuYXBpXHJcbiAgICAgICAgICAgID8gMVxyXG4gICAgICAgICAgICA6IHBsdWdpbi5zZXR0aW5ncy5kdldhaXRUaW1lXHJcbiAgICAgICAgICA6IDMwMDBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld1R5cGUoKSB7XHJcbiAgICByZXR1cm4gTUFUUklYX1ZJRVc7XHJcbiAgfVxyXG4gIGdldERpc3BsYXlUZXh0KCkge1xyXG4gICAgcmV0dXJuIFwiQnJlYWRjcnVtYnMgTWF0cml4XCI7XHJcbiAgfVxyXG4gIGljb24gPSBUUkFJTF9JQ09OO1xyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7IH1cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGdldEFsdChub2RlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHsgcGx1Z2luIH0gPSB0aGlzO1xyXG4gICAgY29uc3QgeyBhbHRMaW5rRmllbGRzLCBzaG93QWxsQWxpYXNlcyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gICAgaWYgKCFhbHRMaW5rRmllbGRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gZHYgRmlyc3RcclxuICAgIGNvbnN0IGR2ID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICAgIGlmIChkdikge1xyXG4gICAgICBjb25zdCBwYWdlID0gZHYucGFnZShub2RlKTtcclxuICAgICAgaWYgKCFwYWdlKSByZXR1cm4gbnVsbDtcclxuICAgICAgZm9yIChjb25zdCBhbHQgb2YgYWx0TGlua0ZpZWxkcykge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGFnZVthbHRdIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgY29uc3QgYXJyOiBzdHJpbmdbXSA9XHJcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBzcGxpdEFuZFRyaW0odmFsdWUpIDogdmFsdWU7XHJcbiAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm9kZSwgXCJcIik7XHJcbiAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgeyBmcm9udG1hdHRlciB9ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gICAgICAgIGZvciAoY29uc3QgYWx0RmllbGQgb2YgYWx0TGlua0ZpZWxkcykge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmcm9udG1hdHRlcj8uW2FsdEZpZWxkXTtcclxuXHJcbiAgICAgICAgICBjb25zdCBhcnI6IHN0cmluZ1tdID1cclxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gc3BsaXRBbmRUcmltKHZhbHVlKSA6IHZhbHVlO1xyXG4gICAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9JbnRlcm5hbExpbmtPYmogPSAoXHJcbiAgICB0bzogc3RyaW5nLFxyXG4gICAgcmVhbFEgPSB0cnVlLFxyXG4gICAgcGFyZW50OiBzdHJpbmcgfCBudWxsLFxyXG4gICAgaW1wbGllZD86IHN0cmluZ1xyXG4gICk6IGludGVybmFsTGlua09iaiA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0byxcclxuICAgICAgY2xzOiBsaW5rQ2xhc3ModG8sIHJlYWxRKSxcclxuICAgICAgYWx0OiB0aGlzLmdldEFsdCh0byksXHJcbiAgICAgIG9yZGVyOiB0aGlzLmdldE9yZGVyKHRvKSxcclxuICAgICAgcGFyZW50LFxyXG4gICAgICBpbXBsaWVkLFxyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICAvLyBBTkNIT1IgUmVtb3ZlIGR1cGxpY2F0ZSBpbXBsaWVkIGxpbmtzXHJcblxyXG4gIHJlbW92ZUR1cGxpY2F0ZUltcGxpZWQoXHJcbiAgICByZWFsczogaW50ZXJuYWxMaW5rT2JqW10sXHJcbiAgICBpbXBsaWVkczogaW50ZXJuYWxMaW5rT2JqW11cclxuICApOiBpbnRlcm5hbExpbmtPYmpbXSB7XHJcbiAgICBjb25zdCByZWFsVG9zID0gcmVhbHMubWFwKChyZWFsKSA9PiByZWFsLnRvKTtcclxuICAgIHJldHVybiBpbXBsaWVkcy5maWx0ZXIoKGltcGxpZWQpID0+ICFyZWFsVG9zLmluY2x1ZGVzKGltcGxpZWQudG8pKTtcclxuICB9XHJcblxyXG4gIGdldE9yZGVyID0gKG5vZGU6IHN0cmluZykgPT5cclxuICAgIE51bWJlci5wYXJzZUludCh0aGlzLnBsdWdpbi5tYWluRy5nZXROb2RlQXR0cmlidXRlKG5vZGUsIFwib3JkZXJcIikpO1xyXG5cclxuICBzb3J0SXRlbXNBbHBoYSA9IChhOiBpbnRlcm5hbExpbmtPYmosIGI6IGludGVybmFsTGlua09iaikgPT4ge1xyXG4gICAgY29uc3QgeyBzb3J0QnlOYW1lU2hvd0FsaWFzLCBhbHBoYVNvcnRBc2MgfSA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gICAgY29uc3QgYVRvU29ydCA9IChzb3J0QnlOYW1lU2hvd0FsaWFzID8gYS50byA6IGEuYWx0ID8/IGEudG8pLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBiVG9Tb3J0ID0gKHNvcnRCeU5hbWVTaG93QWxpYXMgPyBiLnRvIDogYi5hbHQgPz8gYi50bykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBsZXNzID0gYWxwaGFTb3J0QXNjID8gLTEgOiAxO1xyXG4gICAgY29uc3QgbW9yZSA9IGFscGhhU29ydEFzYyA/IDEgOiAtMTtcclxuXHJcbiAgICByZXR1cm4gYVRvU29ydCA8IGJUb1NvcnQgPyBsZXNzIDogbW9yZTtcclxuICB9O1xyXG5cclxuICBnZXRIaWVyU3F1YXJlcyh1c2VySGllcnM6IFVzZXJIaWVyW10sIGN1cnJGaWxlOiBURmlsZSk6IFNxdWFyZVByb3BzW11bXSB7XHJcbiAgICBjb25zdCB7IHBsdWdpbiB9ID0gdGhpcztcclxuICAgIGNvbnN0IHsgbWFpbkcsIHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7IGVuYWJsZUFscGhhU29ydCwgc3F1YXJlRGlyZWN0aW9uc09yZGVyIH0gPSBzZXR0aW5ncztcclxuICAgIGlmICghbWFpbkcpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBjdXJyRmlsZTtcclxuICAgIGlmICghbWFpbkcuaGFzTm9kZShiYXNlbmFtZSkpIHJldHVybiBbXTtcclxuICAgIGNvbnN0IHJlYWxzbkltcGxpZWRzID0gZ2V0TWF0cml4TmVpZ2hib3VycyhwbHVnaW4sIGJhc2VuYW1lKTtcclxuXHJcbiAgICByZXR1cm4gdXNlckhpZXJzLm1hcCgoaGllcikgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFJlYWxOSW1wbGllZCA9IGJsYW5rUmVhbE5JbXBsaWVkKCkgYXMgdW5rbm93biBhcyB7XHJcbiAgICAgICAgW2RpciBpbiBEaXJlY3Rpb25zXToge1xyXG4gICAgICAgICAgcmVhbHM6IGludGVybmFsTGlua09ialtdO1xyXG4gICAgICAgICAgaW1wbGllZHM6IGludGVybmFsTGlua09ialtdO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXN1bHRzRmlsdGVyID0gKFxyXG4gICAgICAgIGl0ZW06IFNxdWFyZUl0ZW0sXHJcbiAgICAgICAgZGlyOiBEaXJlY3Rpb25zLFxyXG4gICAgICAgIG9wcERpcjogRGlyZWN0aW9ucyxcclxuICAgICAgICBhcnJvdzogc3RyaW5nXHJcbiAgICAgICkgPT5cclxuICAgICAgICBoaWVyW2Rpcl0uaW5jbHVkZXMoaXRlbS5maWVsZCkgfHxcclxuICAgICAgICAoaXRlbS5maWVsZC5pbmNsdWRlcyhgPCR7YXJyb3d9PmApICYmXHJcbiAgICAgICAgICBoaWVyW29wcERpcl0uaW5jbHVkZXMoaXRlbS5maWVsZC5zcGxpdChcIiA8XCIpWzBdKSk7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGRpciBpbiByZWFsc25JbXBsaWVkcykge1xyXG4gICAgICAgIGNvbnN0IG9wcERpciA9IGdldE9wcERpcihkaXIgYXMgRGlyZWN0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgYXJyb3cgPSBBUlJPV19ESVJFQ1RJT05TW2Rpcl07XHJcbiAgICAgICAgY29uc3QgeyByZWFscywgaW1wbGllZHMgfSA9IHJlYWxzbkltcGxpZWRzW2Rpcl07XHJcblxyXG4gICAgICAgIGZpbHRlcmVkUmVhbE5JbXBsaWVkW2Rpcl0ucmVhbHMgPSByZWFsc1xyXG4gICAgICAgICAgLmZpbHRlcigocmVhbCkgPT5cclxuICAgICAgICAgICAgcmVzdWx0c0ZpbHRlcihyZWFsLCBkaXIgYXMgRGlyZWN0aW9ucywgb3BwRGlyLCBhcnJvdylcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+XHJcbiAgICAgICAgICAgIHRoaXMudG9JbnRlcm5hbExpbmtPYmooaXRlbS50bywgdHJ1ZSwgbnVsbCwgaXRlbS5pbXBsaWVkKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgZmlsdGVyZWRSZWFsTkltcGxpZWRbZGlyXS5pbXBsaWVkcyA9IGltcGxpZWRzXHJcbiAgICAgICAgICAuZmlsdGVyKChpbXBsaWVkKSA9PlxyXG4gICAgICAgICAgICByZXN1bHRzRmlsdGVyKGltcGxpZWQsIGRpciBhcyBEaXJlY3Rpb25zLCBvcHBEaXIsIGFycm93KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT5cclxuICAgICAgICAgICAgdGhpcy50b0ludGVybmFsTGlua09iaihpdGVtLnRvLCBmYWxzZSwgbnVsbCwgaXRlbS5pbXBsaWVkKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHtcclxuICAgICAgICB1cDogeyByZWFsczogcnUsIGltcGxpZWRzOiBpdSB9LFxyXG4gICAgICAgIHNhbWU6IHsgcmVhbHM6IHJzLCBpbXBsaWVkczogaXMgfSxcclxuICAgICAgICBkb3duOiB7IHJlYWxzOiByZCwgaW1wbGllZHM6IGlkIH0sXHJcbiAgICAgICAgbmV4dDogeyByZWFsczogcm4sIGltcGxpZWRzOiBpTiB9LFxyXG4gICAgICAgIHByZXY6IHsgcmVhbHM6IHJwLCBpbXBsaWVkczogaXAgfSxcclxuICAgICAgfSA9IGZpbHRlcmVkUmVhbE5JbXBsaWVkO1xyXG5cclxuICAgICAgLy8gIVNFQ1RJT05cclxuXHJcbiAgICAgIFtpdSwgaXMsIGlkLCBpTiwgaXBdID0gW1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChydSwgaXUpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChycywgaXMpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChyZCwgaWQpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChybiwgaU4pLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChycCwgaXApLFxyXG4gICAgICBdO1xyXG5cclxuICAgICAgY29uc3QgaVNhbWVOb0R1cDogaW50ZXJuYWxMaW5rT2JqW10gPSBbXTtcclxuICAgICAgaXMuZm9yRWFjaCgoaW1wU2liKSA9PiB7XHJcbiAgICAgICAgaWYgKGlTYW1lTm9EdXAuZXZlcnkoKG5vRHVwKSA9PiBub0R1cC50byAhPT0gaW1wU2liLnRvKSkge1xyXG4gICAgICAgICAgaVNhbWVOb0R1cC5wdXNoKGltcFNpYik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaXMgPSBpU2FtZU5vRHVwO1xyXG5cclxuICAgICAgY29uc3QgZ2V0RmllbGRJbkhpZXIgPSAoZGlyOiBEaXJlY3Rpb25zKSA9PlxyXG4gICAgICAgIGhpZXJbZGlyXVswXVxyXG4gICAgICAgICAgPyBoaWVyW2Rpcl0uam9pbihcIiwgXCIpXHJcbiAgICAgICAgICA6IGAke2hpZXJbZ2V0T3BwRGlyKGRpcildLmpvaW4oXCIsXCIpfSR7QVJST1dfRElSRUNUSU9OU1tkaXJdfWA7XHJcblxyXG4gICAgICBjb25zdCBzcXVhcmVzID0gW3J1LCBycywgcmQsIHJuLCBycCwgaXUsIGlzLCBpZCwgaU4sIGlwXTtcclxuXHJcbiAgICAgIGlmIChlbmFibGVBbHBoYVNvcnQpXHJcbiAgICAgICAgc3F1YXJlcy5mb3JFYWNoKChzcSkgPT4gc3Euc29ydCh0aGlzLnNvcnRJdGVtc0FscGhhKSk7XHJcblxyXG4gICAgICBzcXVhcmVzLmZvckVhY2goKHNxKSA9PiBzcS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikpO1xyXG5cclxuICAgICAgaW5mbyhbXHJcbiAgICAgICAgeyBydSB9LFxyXG4gICAgICAgIHsgcnMgfSxcclxuICAgICAgICB7IHJkIH0sXHJcbiAgICAgICAgeyBybiB9LFxyXG4gICAgICAgIHsgcnAgfSxcclxuICAgICAgICB7IGl1IH0sXHJcbiAgICAgICAgeyBpcyB9LFxyXG4gICAgICAgIHsgaWQgfSxcclxuICAgICAgICB7IGlOIH0sXHJcbiAgICAgICAgeyBpcCB9LFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGNvbnN0IHNxdWFyZSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJ1LFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpdSxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcInVwXCIpLFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHJlYWxJdGVtczogcnMsXHJcbiAgICAgICAgICBpbXBsaWVkSXRlbXM6IGlzLFxyXG4gICAgICAgICAgZmllbGQ6IGdldEZpZWxkSW5IaWVyKFwic2FtZVwiKSxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJkLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpZCxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcImRvd25cIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJuLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpTixcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcIm5leHRcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJwLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpcCxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcInByZXZcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgXTtcclxuXHJcbiAgICAgIHJldHVybiBzcXVhcmVEaXJlY3Rpb25zT3JkZXIubWFwKChvcmRlcikgPT4gc3F1YXJlW29yZGVyXSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB7IGNvbnRlbnRFbCwgZGIsIHBsdWdpbiB9ID0gdGhpcztcclxuICAgICAgZGIuc3RhcnQyRyhcIkRyYXcgTWF0cml4IFZpZXdcIik7XHJcbiAgICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgICAgY29uc3QgeyB1c2VySGllcnMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgICAgIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICAgICAgaWYgKCFjdXJyRmlsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgaGllclNxdWFyZXMgPSB0aGlzLmdldEhpZXJTcXVhcmVzKHVzZXJIaWVycywgY3VyckZpbGUpLmZpbHRlcihcclxuICAgICAgICAoc3F1YXJlQXJyKSA9PlxyXG4gICAgICAgICAgc3F1YXJlQXJyLnNvbWUoXHJcbiAgICAgICAgICAgIChzcSkgPT4gc3EucmVhbEl0ZW1zLmxlbmd0aCArIHNxLmltcGxpZWRJdGVtcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBuZXcgTWF0cml4KHtcclxuICAgICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcclxuICAgICAgICBwcm9wczogeyBoaWVyU3F1YXJlcywgbWF0cml4VmlldzogdGhpcywgY3VyckZpbGUgfSxcclxuICAgICAgfSlcclxuXHJcblxyXG4gICAgICBkYi5lbmQyRygpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGVycm9yKGVycik7XHJcbiAgICAgIHRoaXMuZGIuZW5kMkcoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IGRlYnVnLCBpbmZvLCBsZXZlbHMgfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRGVidWdnZXIge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBkZWJ1Z0xlc3NUaGFuID0gKGxldmVsOiBudW1iZXIpID0+XHJcbiAgICBsZXZlbHNbdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdNb2RlXSA8IGxldmVsO1xyXG5cclxuICBzdGFydDJHKGdyb3VwOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmRlYnVnTGVzc1RoYW4oMykpIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoZ3JvdXApO1xyXG4gIH1cclxuICBlbmQyRyguLi5tc2dzOiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMuZGVidWdMZXNzVGhhbigzKSkge1xyXG4gICAgICBpZiAobXNncy5sZW5ndGgpIGluZm8oLi4ubXNncyk7XHJcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhcnQxRyhncm91cDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Z0xlc3NUaGFuKDIpKSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKGdyb3VwKTtcclxuICB9XHJcbiAgZW5kMUcoLi4ubXNnczogYW55W10pIHtcclxuICAgIGlmICh0aGlzLmRlYnVnTGVzc1RoYW4oMikpIHtcclxuICAgICAgaWYgKG1zZ3MubGVuZ3RoKSBkZWJ1ZyguLi5tc2dzKTtcclxuICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRHcyguLi5ncm91cHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnN0YXJ0MkcoZ3JvdXBzWzBdKTtcclxuICAgIGlmIChncm91cHNbMV0pIHRoaXMuc3RhcnQxRyhncm91cHNbMV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5kIGEgZGVidWcgYW5kIGluZm8gZ3JvdXAsIGxvZ2dpbmcgYG1zZ3NgIGluIGBlbmREZWJ1Z0dyb3VwYFxyXG4gICAqIEBwYXJhbSAgezF8Mn0gY291bnQgVGhlIG51bWJlciBvZiBncm91cHMgdG8gZW5kLiBgMWAgZW5kcyBUcmFjZSwgMiBlbmRzIGJvdGhcclxuICAgKiBAcGFyYW0gIHthbnlbXX0gLi4ubXNnc1xyXG4gICAqL1xyXG4gIGVuZEdzKGNvdW50OiAxIHwgMiwgLi4ubXNnczogYW55W10pIHtcclxuICAgIGlmIChjb3VudCA9PT0gMSkgdGhpcy5lbmQyRyguLi5tc2dzKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZDFHKCk7XHJcbiAgICAgIHRoaXMuZW5kMkcoLi4ubXNncyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJmdW5jdGlvbiBub29wKCkgeyB9XG5jb25zdCBpZGVudGl0eSA9IHggPT4geDtcbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcbiAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG4gICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuICAgIH07XG59XG5mdW5jdGlvbiBydW4oZm4pIHtcbiAgICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbmZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7XG4gICAgZm5zLmZvckVhY2gocnVuKTtcbn1cbmZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5sZXQgc3JjX3VybF9lcXVhbF9hbmNob3I7XG5mdW5jdGlvbiBzcmNfdXJsX2VxdWFsKGVsZW1lbnRfc3JjLCB1cmwpIHtcbiAgICBpZiAoIXNyY191cmxfZXF1YWxfYW5jaG9yKSB7XG4gICAgICAgIHNyY191cmxfZXF1YWxfYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIH1cbiAgICBzcmNfdXJsX2VxdWFsX2FuY2hvci5ocmVmID0gdXJsO1xuICAgIHJldHVybiBlbGVtZW50X3NyYyA9PT0gc3JjX3VybF9lcXVhbF9hbmNob3IuaHJlZjtcbn1cbmZ1bmN0aW9uIG5vdF9lcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGI7XG59XG5mdW5jdGlvbiBpc19lbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9zdG9yZShzdG9yZSwgbmFtZSkge1xuICAgIGlmIChzdG9yZSAhPSBudWxsICYmIHR5cGVvZiBzdG9yZS5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgc3RvcmUgd2l0aCBhICdzdWJzY3JpYmUnIG1ldGhvZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZShzdG9yZSwgLi4uY2FsbGJhY2tzKSB7XG4gICAgaWYgKHN0b3JlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfVxuICAgIGNvbnN0IHVuc3ViID0gc3RvcmUuc3Vic2NyaWJlKC4uLmNhbGxiYWNrcyk7XG4gICAgcmV0dXJuIHVuc3ViLnVuc3Vic2NyaWJlID8gKCkgPT4gdW5zdWIudW5zdWJzY3JpYmUoKSA6IHVuc3ViO1xufVxuZnVuY3Rpb24gZ2V0X3N0b3JlX3ZhbHVlKHN0b3JlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIHN1YnNjcmliZShzdG9yZSwgXyA9PiB2YWx1ZSA9IF8pKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY29tcG9uZW50X3N1YnNjcmliZShjb21wb25lbnQsIHN0b3JlLCBjYWxsYmFjaykge1xuICAgIGNvbXBvbmVudC4kJC5vbl9kZXN0cm95LnB1c2goc3Vic2NyaWJlKHN0b3JlLCBjYWxsYmFjaykpO1xufVxuZnVuY3Rpb24gY3JlYXRlX3Nsb3QoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNsb3RfY3R4ID0gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKTtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25bMF0oc2xvdF9jdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIHJldHVybiBkZWZpbml0aW9uWzFdICYmIGZuXG4gICAgICAgID8gYXNzaWduKCQkc2NvcGUuY3R4LnNsaWNlKCksIGRlZmluaXRpb25bMV0oZm4oY3R4KSkpXG4gICAgICAgIDogJCRzY29wZS5jdHg7XG59XG5mdW5jdGlvbiBnZXRfc2xvdF9jaGFuZ2VzKGRlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uWzJdICYmIGZuKSB7XG4gICAgICAgIGNvbnN0IGxldHMgPSBkZWZpbml0aW9uWzJdKGZuKGRpcnR5KSk7XG4gICAgICAgIGlmICgkJHNjb3BlLmRpcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGV0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gTWF0aC5tYXgoJCRzY29wZS5kaXJ0eS5sZW5ndGgsIGxldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWRbaV0gPSAkJHNjb3BlLmRpcnR5W2ldIHwgbGV0c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQkc2NvcGUuZGlydHkgfCBsZXRzO1xuICAgIH1cbiAgICByZXR1cm4gJCRzY29wZS5kaXJ0eTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9zbG90X2Jhc2Uoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIHNsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dF9mbikge1xuICAgIGlmIChzbG90X2NoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jb250ZXh0ID0gZ2V0X3Nsb3RfY29udGV4dChzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG4gICAgICAgIHNsb3QucChzbG90X2NvbnRleHQsIHNsb3RfY2hhbmdlcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3Qoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7XG4gICAgY29uc3Qgc2xvdF9jaGFuZ2VzID0gZ2V0X3Nsb3RfY2hhbmdlcyhzbG90X2RlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuKTtcbiAgICB1cGRhdGVfc2xvdF9iYXNlKHNsb3QsIHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBzbG90X2NoYW5nZXMsIGdldF9zbG90X2NvbnRleHRfZm4pO1xufVxuZnVuY3Rpb24gZ2V0X2FsbF9kaXJ0eV9mcm9tX3Njb3BlKCQkc2NvcGUpIHtcbiAgICBpZiAoJCRzY29wZS5jdHgubGVuZ3RoID4gMzIpIHtcbiAgICAgICAgY29uc3QgZGlydHkgPSBbXTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gJCRzY29wZS5jdHgubGVuZ3RoIC8gMzI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRpcnR5W2ldID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBleGNsdWRlX2ludGVybmFsX3Byb3BzKHByb3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoa1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdWx0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVfcmVzdF9wcm9wcyhwcm9wcywga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSB7fTtcbiAgICBrZXlzID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmICgha2V5cy5oYXMoaykgJiYga1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdFtrXSA9IHByb3BzW2tdO1xuICAgIHJldHVybiByZXN0O1xufVxuZnVuY3Rpb24gY29tcHV0ZV9zbG90cyhzbG90cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgICBsZXQgcmFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChyYW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIGZuLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG51bGxfdG9fZW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzZXRfc3RvcmVfdmFsdWUoc3RvcmUsIHJldCwgdmFsdWUpIHtcbiAgICBzdG9yZS5zZXQodmFsdWUpO1xuICAgIHJldHVybiByZXQ7XG59XG5jb25zdCBoYXNfcHJvcCA9IChvYmosIHByb3ApID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xuZnVuY3Rpb24gYWN0aW9uX2Rlc3Ryb3llcihhY3Rpb25fcmVzdWx0KSB7XG4gICAgcmV0dXJuIGFjdGlvbl9yZXN1bHQgJiYgaXNfZnVuY3Rpb24oYWN0aW9uX3Jlc3VsdC5kZXN0cm95KSA/IGFjdGlvbl9yZXN1bHQuZGVzdHJveSA6IG5vb3A7XG59XG5cbmNvbnN0IGlzX2NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xubGV0IG5vdyA9IGlzX2NsaWVudFxuICAgID8gKCkgPT4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpXG4gICAgOiAoKSA9PiBEYXRlLm5vdygpO1xubGV0IHJhZiA9IGlzX2NsaWVudCA/IGNiID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShjYikgOiBub29wO1xuLy8gdXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nXG5mdW5jdGlvbiBzZXRfbm93KGZuKSB7XG4gICAgbm93ID0gZm47XG59XG5mdW5jdGlvbiBzZXRfcmFmKGZuKSB7XG4gICAgcmFmID0gZm47XG59XG5cbmNvbnN0IHRhc2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gcnVuX3Rhc2tzKG5vdykge1xuICAgIHRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgIGlmICghdGFzay5jKG5vdykpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgICAgIHRhc2suZigpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRhc2tzLnNpemUgIT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xufVxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5IVxuICovXG5mdW5jdGlvbiBjbGVhcl9sb29wcygpIHtcbiAgICB0YXNrcy5jbGVhcigpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRhc2sgdGhhdCBydW5zIG9uIGVhY2ggcmFmIGZyYW1lXG4gKiB1bnRpbCBpdCByZXR1cm5zIGEgZmFsc3kgdmFsdWUgb3IgaXMgYWJvcnRlZFxuICovXG5mdW5jdGlvbiBsb29wKGNhbGxiYWNrKSB7XG4gICAgbGV0IHRhc2s7XG4gICAgaWYgKHRhc2tzLnNpemUgPT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bGZpbGwgPT4ge1xuICAgICAgICAgICAgdGFza3MuYWRkKHRhc2sgPSB7IGM6IGNhbGxiYWNrLCBmOiBmdWxmaWxsIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgYWJvcnQoKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBUcmFjayB3aGljaCBub2RlcyBhcmUgY2xhaW1lZCBkdXJpbmcgaHlkcmF0aW9uLiBVbmNsYWltZWQgbm9kZXMgY2FuIHRoZW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBET01cbi8vIGF0IHRoZSBlbmQgb2YgaHlkcmF0aW9uIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHJlbWFpbmluZyBub2Rlcy5cbmxldCBpc19oeWRyYXRpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHN0YXJ0X2h5ZHJhdGluZygpIHtcbiAgICBpc19oeWRyYXRpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gZW5kX2h5ZHJhdGluZygpIHtcbiAgICBpc19oeWRyYXRpbmcgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwcGVyX2JvdW5kKGxvdywgaGlnaCwga2V5LCB2YWx1ZSkge1xuICAgIC8vIFJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZSBsYXJnZXIgdGhhbiBpbnB1dCB2YWx1ZSBpbiB0aGUgcmFuZ2UgW2xvdywgaGlnaClcbiAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpO1xuICAgICAgICBpZiAoa2V5KG1pZCkgPD0gdmFsdWUpIHtcbiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG59XG5mdW5jdGlvbiBpbml0X2h5ZHJhdGUodGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5oeWRyYXRlX2luaXQpXG4gICAgICAgIHJldHVybjtcbiAgICB0YXJnZXQuaHlkcmF0ZV9pbml0ID0gdHJ1ZTtcbiAgICAvLyBXZSBrbm93IHRoYXQgYWxsIGNoaWxkcmVuIGhhdmUgY2xhaW1fb3JkZXIgdmFsdWVzIHNpbmNlIHRoZSB1bmNsYWltZWQgaGF2ZSBiZWVuIGRldGFjaGVkIGlmIHRhcmdldCBpcyBub3QgPGhlYWQ+XG4gICAgbGV0IGNoaWxkcmVuID0gdGFyZ2V0LmNoaWxkTm9kZXM7XG4gICAgLy8gSWYgdGFyZ2V0IGlzIDxoZWFkPiwgdGhlcmUgbWF5IGJlIGNoaWxkcmVuIHdpdGhvdXQgY2xhaW1fb3JkZXJcbiAgICBpZiAodGFyZ2V0Lm5vZGVOYW1lID09PSAnSEVBRCcpIHtcbiAgICAgICAgY29uc3QgbXlDaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAobm9kZS5jbGFpbV9vcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbXlDaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuID0gbXlDaGlsZHJlbjtcbiAgICB9XG4gICAgLypcbiAgICAqIFJlb3JkZXIgY2xhaW1lZCBjaGlsZHJlbiBvcHRpbWFsbHkuXG4gICAgKiBXZSBjYW4gcmVvcmRlciBjbGFpbWVkIGNoaWxkcmVuIG9wdGltYWxseSBieSBmaW5kaW5nIHRoZSBsb25nZXN0IHN1YnNlcXVlbmNlIG9mXG4gICAgKiBub2RlcyB0aGF0IGFyZSBhbHJlYWR5IGNsYWltZWQgaW4gb3JkZXIgYW5kIG9ubHkgbW92aW5nIHRoZSByZXN0LiBUaGUgbG9uZ2VzdFxuICAgICogc3Vic2VxdWVuY2Ugc3Vic2VxdWVuY2Ugb2Ygbm9kZXMgdGhhdCBhcmUgY2xhaW1lZCBpbiBvcmRlciBjYW4gYmUgZm91bmQgYnlcbiAgICAqIGNvbXB1dGluZyB0aGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIC5jbGFpbV9vcmRlciB2YWx1ZXMuXG4gICAgKlxuICAgICogVGhpcyBhbGdvcml0aG0gaXMgb3B0aW1hbCBpbiBnZW5lcmF0aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgcmVvcmRlciBvcGVyYXRpb25zXG4gICAgKiBwb3NzaWJsZS5cbiAgICAqXG4gICAgKiBQcm9vZjpcbiAgICAqIFdlIGtub3cgdGhhdCwgZ2l2ZW4gYSBzZXQgb2YgcmVvcmRlcmluZyBvcGVyYXRpb25zLCB0aGUgbm9kZXMgdGhhdCBkbyBub3QgbW92ZVxuICAgICogYWx3YXlzIGZvcm0gYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSwgc2luY2UgdGhleSBkbyBub3QgbW92ZSBhbW9uZyBlYWNoIG90aGVyXG4gICAgKiBtZWFuaW5nIHRoYXQgdGhleSBtdXN0IGJlIGFscmVhZHkgb3JkZXJlZCBhbW9uZyBlYWNoIG90aGVyLiBUaHVzLCB0aGUgbWF4aW1hbFxuICAgICogc2V0IG9mIG5vZGVzIHRoYXQgZG8gbm90IG1vdmUgZm9ybSBhIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZS5cbiAgICAqL1xuICAgIC8vIENvbXB1dGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlXG4gICAgLy8gbTogc3Vic2VxdWVuY2UgbGVuZ3RoIGogPT4gaW5kZXggayBvZiBzbWFsbGVzdCB2YWx1ZSB0aGF0IGVuZHMgYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBsZW5ndGggalxuICAgIGNvbnN0IG0gPSBuZXcgSW50MzJBcnJheShjaGlsZHJlbi5sZW5ndGggKyAxKTtcbiAgICAvLyBQcmVkZWNlc3NvciBpbmRpY2VzICsgMVxuICAgIGNvbnN0IHAgPSBuZXcgSW50MzJBcnJheShjaGlsZHJlbi5sZW5ndGgpO1xuICAgIG1bMF0gPSAtMTtcbiAgICBsZXQgbG9uZ2VzdCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gY2hpbGRyZW5baV0uY2xhaW1fb3JkZXI7XG4gICAgICAgIC8vIEZpbmQgdGhlIGxhcmdlc3Qgc3Vic2VxdWVuY2UgbGVuZ3RoIHN1Y2ggdGhhdCBpdCBlbmRzIGluIGEgdmFsdWUgbGVzcyB0aGFuIG91ciBjdXJyZW50IHZhbHVlXG4gICAgICAgIC8vIHVwcGVyX2JvdW5kIHJldHVybnMgZmlyc3QgZ3JlYXRlciB2YWx1ZSwgc28gd2Ugc3VidHJhY3Qgb25lXG4gICAgICAgIC8vIHdpdGggZmFzdCBwYXRoIGZvciB3aGVuIHdlIGFyZSBvbiB0aGUgY3VycmVudCBsb25nZXN0IHN1YnNlcXVlbmNlXG4gICAgICAgIGNvbnN0IHNlcUxlbiA9ICgobG9uZ2VzdCA+IDAgJiYgY2hpbGRyZW5bbVtsb25nZXN0XV0uY2xhaW1fb3JkZXIgPD0gY3VycmVudCkgPyBsb25nZXN0ICsgMSA6IHVwcGVyX2JvdW5kKDEsIGxvbmdlc3QsIGlkeCA9PiBjaGlsZHJlblttW2lkeF1dLmNsYWltX29yZGVyLCBjdXJyZW50KSkgLSAxO1xuICAgICAgICBwW2ldID0gbVtzZXFMZW5dICsgMTtcbiAgICAgICAgY29uc3QgbmV3TGVuID0gc2VxTGVuICsgMTtcbiAgICAgICAgLy8gV2UgY2FuIGd1YXJhbnRlZSB0aGF0IGN1cnJlbnQgaXMgdGhlIHNtYWxsZXN0IHZhbHVlLiBPdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgZ2VuZXJhdGVkIGEgbG9uZ2VyIHNlcXVlbmNlLlxuICAgICAgICBtW25ld0xlbl0gPSBpO1xuICAgICAgICBsb25nZXN0ID0gTWF0aC5tYXgobmV3TGVuLCBsb25nZXN0KTtcbiAgICB9XG4gICAgLy8gVGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBub2RlcyAoaW5pdGlhbGx5IHJldmVyc2VkKVxuICAgIGNvbnN0IGxpcyA9IFtdO1xuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBub2Rlcywgbm9kZXMgdGhhdCB3aWxsIGJlIG1vdmVkXG4gICAgY29uc3QgdG9Nb3ZlID0gW107XG4gICAgbGV0IGxhc3QgPSBjaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgIGZvciAobGV0IGN1ciA9IG1bbG9uZ2VzdF0gKyAxOyBjdXIgIT0gMDsgY3VyID0gcFtjdXIgLSAxXSkge1xuICAgICAgICBsaXMucHVzaChjaGlsZHJlbltjdXIgLSAxXSk7XG4gICAgICAgIGZvciAoOyBsYXN0ID49IGN1cjsgbGFzdC0tKSB7XG4gICAgICAgICAgICB0b01vdmUucHVzaChjaGlsZHJlbltsYXN0XSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdC0tO1xuICAgIH1cbiAgICBmb3IgKDsgbGFzdCA+PSAwOyBsYXN0LS0pIHtcbiAgICAgICAgdG9Nb3ZlLnB1c2goY2hpbGRyZW5bbGFzdF0pO1xuICAgIH1cbiAgICBsaXMucmV2ZXJzZSgpO1xuICAgIC8vIFdlIHNvcnQgdGhlIG5vZGVzIGJlaW5nIG1vdmVkIHRvIGd1YXJhbnRlZSB0aGF0IHRoZWlyIGluc2VydGlvbiBvcmRlciBtYXRjaGVzIHRoZSBjbGFpbSBvcmRlclxuICAgIHRvTW92ZS5zb3J0KChhLCBiKSA9PiBhLmNsYWltX29yZGVyIC0gYi5jbGFpbV9vcmRlcik7XG4gICAgLy8gRmluYWxseSwgd2UgbW92ZSB0aGUgbm9kZXNcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB0b01vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgd2hpbGUgKGogPCBsaXMubGVuZ3RoICYmIHRvTW92ZVtpXS5jbGFpbV9vcmRlciA+PSBsaXNbal0uY2xhaW1fb3JkZXIpIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbmNob3IgPSBqIDwgbGlzLmxlbmd0aCA/IGxpc1tqXSA6IG51bGw7XG4gICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUodG9Nb3ZlW2ldLCBhbmNob3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGVuZCh0YXJnZXQsIG5vZGUpIHtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfc3R5bGVzKHRhcmdldCwgc3R5bGVfc2hlZXRfaWQsIHN0eWxlcykge1xuICAgIGNvbnN0IGFwcGVuZF9zdHlsZXNfdG8gPSBnZXRfcm9vdF9mb3Jfc3R5bGUodGFyZ2V0KTtcbiAgICBpZiAoIWFwcGVuZF9zdHlsZXNfdG8uZ2V0RWxlbWVudEJ5SWQoc3R5bGVfc2hlZXRfaWQpKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaWQgPSBzdHlsZV9zaGVldF9pZDtcbiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBzdHlsZXM7XG4gICAgICAgIGFwcGVuZF9zdHlsZXNoZWV0KGFwcGVuZF9zdHlsZXNfdG8sIHN0eWxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSkge1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIGNvbnN0IHJvb3QgPSBub2RlLmdldFJvb3ROb2RlID8gbm9kZS5nZXRSb290Tm9kZSgpIDogbm9kZS5vd25lckRvY3VtZW50O1xuICAgIGlmIChyb290ICYmIHJvb3QuaG9zdCkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9lbXB0eV9zdHlsZXNoZWV0KG5vZGUpIHtcbiAgICBjb25zdCBzdHlsZV9lbGVtZW50ID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICBhcHBlbmRfc3R5bGVzaGVldChnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSksIHN0eWxlX2VsZW1lbnQpO1xuICAgIHJldHVybiBzdHlsZV9lbGVtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kX3N0eWxlc2hlZXQobm9kZSwgc3R5bGUpIHtcbiAgICBhcHBlbmQobm9kZS5oZWFkIHx8IG5vZGUsIHN0eWxlKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKSB7XG4gICAgaWYgKGlzX2h5ZHJhdGluZykge1xuICAgICAgICBpbml0X2h5ZHJhdGUodGFyZ2V0KTtcbiAgICAgICAgaWYgKCh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9PT0gdW5kZWZpbmVkKSB8fCAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkICE9PSBudWxsKSAmJiAodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQucGFyZW50RWxlbWVudCAhPT0gdGFyZ2V0KSkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBub2RlcyBvZiB1bmRlZmluZWQgb3JkZXJpbmdcbiAgICAgICAgd2hpbGUgKCh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCAhPT0gbnVsbCkgJiYgKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkLmNsYWltX29yZGVyID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9IHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlICE9PSB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCkge1xuICAgICAgICAgICAgLy8gV2Ugb25seSBpbnNlcnQgaWYgdGhlIG9yZGVyaW5nIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUgbW9kaWZpZWQgb3IgdGhlIHBhcmVudCBub2RlIGlzIG5vdCB0YXJnZXRcbiAgICAgICAgICAgIGlmIChub2RlLmNsYWltX29yZGVyICE9PSB1bmRlZmluZWQgfHwgbm9kZS5wYXJlbnROb2RlICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnNlcnQodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9oeWRyYXRpb24odGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICBpZiAoaXNfaHlkcmF0aW5nICYmICFhbmNob3IpIHtcbiAgICAgICAgYXBwZW5kX2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9IGFuY2hvcikge1xuICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2gobm9kZSkge1xuICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfZWFjaChpdGVyYXRpb25zLCBkZXRhY2hpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnNbaV0pXG4gICAgICAgICAgICBpdGVyYXRpb25zW2ldLmQoZGV0YWNoaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRfaXMobmFtZSwgaXMpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lLCB7IGlzIH0pO1xufVxuZnVuY3Rpb24gb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcyhvYmosIGV4Y2x1ZGUpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChoYXNfcHJvcChvYmosIGspXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAmJiBleGNsdWRlLmluZGV4T2YoaykgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0YXJnZXRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHN2Z19lbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG5hbWUpO1xufVxuZnVuY3Rpb24gdGV4dChkYXRhKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpO1xufVxuZnVuY3Rpb24gc3BhY2UoKSB7XG4gICAgcmV0dXJuIHRleHQoJyAnKTtcbn1cbmZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0ZXh0KCcnKTtcbn1cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBwcmV2ZW50X2RlZmF1bHQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzdG9wX3Byb3BhZ2F0aW9uKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNlbGYoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiB0cnVzdGVkKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChldmVudC5pc1RydXN0ZWQpXG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSAhPT0gdmFsdWUpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG5vZGUuX19wcm90b19fKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdfX3ZhbHVlJykge1xuICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZXNjcmlwdG9yc1trZXldICYmIGRlc2NyaXB0b3JzW2tleV0uc2V0KSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YShub2RlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGlmIChwcm9wIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZVtwcm9wXSA9IHR5cGVvZiBub2RlW3Byb3BdID09PSAnYm9vbGVhbicgJiYgdmFsdWUgPT09ICcnID8gdHJ1ZSA6IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cihub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geGxpbmtfYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUoZ3JvdXAsIF9fdmFsdWUsIGNoZWNrZWQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChncm91cFtpXS5jaGVja2VkKVxuICAgICAgICAgICAgdmFsdWUuYWRkKGdyb3VwW2ldLl9fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgICAgdmFsdWUuZGVsZXRlKF9fdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gbnVsbCA6ICt2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRpbWVfcmFuZ2VzX3RvX2FycmF5KHJhbmdlcykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyYXkucHVzaCh7IHN0YXJ0OiByYW5nZXMuc3RhcnQoaSksIGVuZDogcmFuZ2VzLmVuZChpKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gY2hpbGRyZW4oZWxlbWVudCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG59XG5mdW5jdGlvbiBpbml0X2NsYWltX2luZm8obm9kZXMpIHtcbiAgICBpZiAobm9kZXMuY2xhaW1faW5mbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGVzLmNsYWltX2luZm8gPSB7IGxhc3RfaW5kZXg6IDAsIHRvdGFsX2NsYWltZWQ6IDAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGFpbV9ub2RlKG5vZGVzLCBwcmVkaWNhdGUsIHByb2Nlc3NOb2RlLCBjcmVhdGVOb2RlLCBkb250VXBkYXRlTGFzdEluZGV4ID0gZmFsc2UpIHtcbiAgICAvLyBUcnkgdG8gZmluZCBub2RlcyBpbiBhbiBvcmRlciBzdWNoIHRoYXQgd2UgbGVuZ3RoZW4gdGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgcmVzdWx0Tm9kZSA9ICgoKSA9PiB7XG4gICAgICAgIC8vIFdlIGZpcnN0IHRyeSB0byBmaW5kIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIHByZXZpb3VzIG9uZVxuICAgICAgICBmb3IgKGxldCBpID0gbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4OyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IHByb2Nlc3NOb2RlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzW2ldID0gcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZG9udFVwZGF0ZUxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHRyeSB0byBmaW5kIG9uZSBiZWZvcmVcbiAgICAgICAgLy8gV2UgaXRlcmF0ZSBpbiByZXZlcnNlIHNvIHRoYXQgd2UgZG9uJ3QgZ28gdG9vIGZhciBiYWNrXG4gICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcHJvY2Vzc05vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkb250VXBkYXRlTGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2Ugc3BsaWNlZCBiZWZvcmUgdGhlIGxhc3RfaW5kZXgsIHdlIGRlY3JlYXNlIGl0XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIGFueSBtYXRjaGluZyBub2RlLCB3ZSBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgIHJldHVybiBjcmVhdGVOb2RlKCk7XG4gICAgfSkoKTtcbiAgICByZXN1bHROb2RlLmNsYWltX29yZGVyID0gbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkO1xuICAgIG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZCArPSAxO1xuICAgIHJldHVybiByZXN1bHROb2RlO1xufVxuZnVuY3Rpb24gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBjcmVhdGVfZWxlbWVudCkge1xuICAgIHJldHVybiBjbGFpbV9ub2RlKG5vZGVzLCAobm9kZSkgPT4gbm9kZS5ub2RlTmFtZSA9PT0gbmFtZSwgKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlLnB1c2goYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbW92ZS5mb3JFYWNoKHYgPT4gbm9kZS5yZW1vdmVBdHRyaWJ1dGUodikpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sICgpID0+IGNyZWF0ZV9lbGVtZW50KG5hbWUpKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBlbGVtZW50KTtcbn1cbmZ1bmN0aW9uIGNsYWltX3N2Z19lbGVtZW50KG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX2VsZW1lbnRfYmFzZShub2RlcywgbmFtZSwgYXR0cmlidXRlcywgc3ZnX2VsZW1lbnQpO1xufVxuZnVuY3Rpb24gY2xhaW1fdGV4dChub2RlcywgZGF0YSkge1xuICAgIHJldHVybiBjbGFpbV9ub2RlKG5vZGVzLCAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMywgKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YVN0ciA9ICcnICsgZGF0YTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YS5zdGFydHNXaXRoKGRhdGFTdHIpKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5kYXRhLmxlbmd0aCAhPT0gZGF0YVN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zcGxpdFRleHQoZGF0YVN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gZGF0YVN0cjtcbiAgICAgICAgfVxuICAgIH0sICgpID0+IHRleHQoZGF0YSksIHRydWUgLy8gVGV4dCBub2RlcyBzaG91bGQgbm90IHVwZGF0ZSBsYXN0IGluZGV4IHNpbmNlIGl0IGlzIGxpa2VseSBub3Qgd29ydGggaXQgdG8gZWxpbWluYXRlIGFuIGluY3JlYXNpbmcgc3Vic2VxdWVuY2Ugb2YgYWN0dWFsIGVsZW1lbnRzXG4gICAgKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3NwYWNlKG5vZGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX3RleHQobm9kZXMsICcgJyk7XG59XG5mdW5jdGlvbiBmaW5kX2NvbW1lbnQobm9kZXMsIHRleHQsIHN0YXJ0KSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBjb21tZW50IG5vZGUgKi8gJiYgbm9kZS50ZXh0Q29udGVudC50cmltKCkgPT09IHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBjbGFpbV9odG1sX3RhZyhub2Rlcykge1xuICAgIC8vIGZpbmQgaHRtbCBvcGVuaW5nIHRhZ1xuICAgIGNvbnN0IHN0YXJ0X2luZGV4ID0gZmluZF9jb21tZW50KG5vZGVzLCAnSFRNTF9UQUdfU1RBUlQnLCAwKTtcbiAgICBjb25zdCBlbmRfaW5kZXggPSBmaW5kX2NvbW1lbnQobm9kZXMsICdIVE1MX1RBR19FTkQnLCBzdGFydF9pbmRleCk7XG4gICAgaWYgKHN0YXJ0X2luZGV4ID09PSBlbmRfaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKCk7XG4gICAgfVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgaHRtbF90YWdfbm9kZXMgPSBub2Rlcy5zcGxpY2Uoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCArIDEpO1xuICAgIGRldGFjaChodG1sX3RhZ19ub2Rlc1swXSk7XG4gICAgZGV0YWNoKGh0bWxfdGFnX25vZGVzW2h0bWxfdGFnX25vZGVzLmxlbmd0aCAtIDFdKTtcbiAgICBjb25zdCBjbGFpbWVkX25vZGVzID0gaHRtbF90YWdfbm9kZXMuc2xpY2UoMSwgaHRtbF90YWdfbm9kZXMubGVuZ3RoIC0gMSk7XG4gICAgZm9yIChjb25zdCBuIG9mIGNsYWltZWRfbm9kZXMpIHtcbiAgICAgICAgbi5jbGFpbV9vcmRlciA9IG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZDtcbiAgICAgICAgbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSHRtbFRhZ0h5ZHJhdGlvbihjbGFpbWVkX25vZGVzKTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhKHRleHQsIGRhdGEpIHtcbiAgICBkYXRhID0gJycgKyBkYXRhO1xuICAgIGlmICh0ZXh0Lndob2xlVGV4dCAhPT0gZGF0YSlcbiAgICAgICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF92YWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0X2lucHV0X3R5cGUoaW5wdXQsIHR5cGUpIHtcbiAgICB0cnkge1xuICAgICAgICBpbnB1dC50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdHlsZShub2RlLCBrZXksIHZhbHVlLCBpbXBvcnRhbnQpIHtcbiAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUsIGltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xufVxuZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IC0xOyAvLyBubyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkXG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxubGV0IGNyb3Nzb3JpZ2luO1xuZnVuY3Rpb24gaXNfY3Jvc3NvcmlnaW4oKSB7XG4gICAgaWYgKGNyb3Nzb3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3Jvc3NvcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdm9pZCB3aW5kb3cucGFyZW50LmRvY3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY3Jvc3NvcmlnaW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcm9zc29yaWdpbjtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIobm9kZSwgZm4pIHtcbiAgICBjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKGNvbXB1dGVkX3N0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3QgaWZyYW1lID0gZWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyAnICtcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICBjb25zdCBjcm9zc29yaWdpbiA9IGlzX2Nyb3Nzb3JpZ2luKCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlO1xuICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICBpZnJhbWUuc3JjID0gXCJkYXRhOnRleHQvaHRtbCw8c2NyaXB0Pm9ucmVzaXplPWZ1bmN0aW9uKCl7cGFyZW50LnBvc3RNZXNzYWdlKDAsJyonKX08L3NjcmlwdD5cIjtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4od2luZG93LCAnbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpXG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJztcbiAgICAgICAgaWZyYW1lLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gbGlzdGVuKGlmcmFtZS5jb250ZW50V2luZG93LCAncmVzaXplJywgZm4pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmQobm9kZSwgaWZyYW1lKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoY3Jvc3NvcmlnaW4pIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5zdWJzY3JpYmUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGV0YWNoKGlmcmFtZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cbmZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwsIGJ1YmJsZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBidWJibGVzLCBmYWxzZSwgZGV0YWlsKTtcbiAgICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5X3NlbGVjdG9yX2FsbChzZWxlY3RvciwgcGFyZW50ID0gZG9jdW1lbnQuYm9keSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG59XG5jbGFzcyBIdG1sVGFnIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lID0gdGhpcy5uID0gbnVsbDtcbiAgICB9XG4gICAgYyhodG1sKSB7XG4gICAgICAgIHRoaXMuaChodG1sKTtcbiAgICB9XG4gICAgbShodG1sLCB0YXJnZXQsIGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmUpIHtcbiAgICAgICAgICAgIHRoaXMuZSA9IGVsZW1lbnQodGFyZ2V0Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMudCA9IHRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuYyhodG1sKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmkoYW5jaG9yKTtcbiAgICB9XG4gICAgaChodG1sKSB7XG4gICAgICAgIHRoaXMuZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB0aGlzLm4gPSBBcnJheS5mcm9tKHRoaXMuZS5jaGlsZE5vZGVzKTtcbiAgICB9XG4gICAgaShhbmNob3IpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydCh0aGlzLnQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwKGh0bWwpIHtcbiAgICAgICAgdGhpcy5kKCk7XG4gICAgICAgIHRoaXMuaChodG1sKTtcbiAgICAgICAgdGhpcy5pKHRoaXMuYSk7XG4gICAgfVxuICAgIGQoKSB7XG4gICAgICAgIHRoaXMubi5mb3JFYWNoKGRldGFjaCk7XG4gICAgfVxufVxuY2xhc3MgSHRtbFRhZ0h5ZHJhdGlvbiBleHRlbmRzIEh0bWxUYWcge1xuICAgIGNvbnN0cnVjdG9yKGNsYWltZWRfbm9kZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lID0gdGhpcy5uID0gbnVsbDtcbiAgICAgICAgdGhpcy5sID0gY2xhaW1lZF9ub2RlcztcbiAgICB9XG4gICAgYyhodG1sKSB7XG4gICAgICAgIGlmICh0aGlzLmwpIHtcbiAgICAgICAgICAgIHRoaXMubiA9IHRoaXMubDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLmMoaHRtbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaShhbmNob3IpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydF9oeWRyYXRpb24odGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyaWJ1dGVfdG9fb2JqZWN0KGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJlc3VsdFthdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzKGVsZW1lbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBlbGVtZW50LmNoaWxkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICByZXN1bHRbbm9kZS5zbG90IHx8ICdkZWZhdWx0J10gPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IGFjdGl2ZV9kb2NzID0gbmV3IFNldCgpO1xubGV0IGFjdGl2ZSA9IDA7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcbiAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgbGV0IGkgPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSBeIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBoYXNoID4+PiAwO1xufVxuZnVuY3Rpb24gY3JlYXRlX3J1bGUobm9kZSwgYSwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNlLCBmbiwgdWlkID0gMCkge1xuICAgIGNvbnN0IHN0ZXAgPSAxNi42NjYgLyBkdXJhdGlvbjtcbiAgICBsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDw9IDE7IHAgKz0gc3RlcCkge1xuICAgICAgICBjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuICAgICAgICBrZXlmcmFtZXMgKz0gcCAqIDEwMCArIGAleyR7Zm4odCwgMSAtIHQpfX1cXG5gO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0ga2V5ZnJhbWVzICsgYDEwMCUgeyR7Zm4oYiwgMSAtIGIpfX1cXG59YDtcbiAgICBjb25zdCBuYW1lID0gYF9fc3ZlbHRlXyR7aGFzaChydWxlKX1fJHt1aWR9YDtcbiAgICBjb25zdCBkb2MgPSBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSk7XG4gICAgYWN0aXZlX2RvY3MuYWRkKGRvYyk7XG4gICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0IHx8IChkb2MuX19zdmVsdGVfc3R5bGVzaGVldCA9IGFwcGVuZF9lbXB0eV9zdHlsZXNoZWV0KG5vZGUpLnNoZWV0KTtcbiAgICBjb25zdCBjdXJyZW50X3J1bGVzID0gZG9jLl9fc3ZlbHRlX3J1bGVzIHx8IChkb2MuX19zdmVsdGVfcnVsZXMgPSB7fSk7XG4gICAgaWYgKCFjdXJyZW50X3J1bGVzW25hbWVdKSB7XG4gICAgICAgIGN1cnJlbnRfcnVsZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUoYEBrZXlmcmFtZXMgJHtuYW1lfSAke3J1bGV9YCwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb24gPSBub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJztcbiAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IGAke2FuaW1hdGlvbiA/IGAke2FuaW1hdGlvbn0sIGAgOiAnJ30ke25hbWV9ICR7ZHVyYXRpb259bXMgbGluZWFyICR7ZGVsYXl9bXMgMSBib3RoYDtcbiAgICBhY3RpdmUgKz0gMTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IChub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJykuc3BsaXQoJywgJyk7XG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLmZpbHRlcihuYW1lXG4gICAgICAgID8gYW5pbSA9PiBhbmltLmluZGV4T2YobmFtZSkgPCAwIC8vIHJlbW92ZSBzcGVjaWZpYyBhbmltYXRpb25cbiAgICAgICAgOiBhbmltID0+IGFuaW0uaW5kZXhPZignX19zdmVsdGUnKSA9PT0gLTEgLy8gcmVtb3ZlIGFsbCBTdmVsdGUgYW5pbWF0aW9uc1xuICAgICk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHByZXZpb3VzLmxlbmd0aCAtIG5leHQubGVuZ3RoO1xuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICAgIG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gbmV4dC5qb2luKCcsICcpO1xuICAgICAgICBhY3RpdmUgLT0gZGVsZXRlZDtcbiAgICAgICAgaWYgKCFhY3RpdmUpXG4gICAgICAgICAgICBjbGVhcl9ydWxlcygpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsZWFyX3J1bGVzKCkge1xuICAgIHJhZigoKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFjdGl2ZV9kb2NzLmZvckVhY2goZG9jID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2MuX19zdmVsdGVfc3R5bGVzaGVldDtcbiAgICAgICAgICAgIGxldCBpID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShpKTtcbiAgICAgICAgICAgIGRvYy5fX3N2ZWx0ZV9ydWxlcyA9IHt9O1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlX2RvY3MuY2xlYXIoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1t0eXBlXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgLy8gVE9ETyBhcmUgdGhlcmUgc2l0dWF0aW9ucyB3aGVyZSBldmVudHMgY291bGQgYmUgZGlzcGF0Y2hlZFxuICAgICAgICAgICAgLy8gaW4gYSBzZXJ2ZXIgKG5vbi1ET00pIGVudmlyb25tZW50P1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBzZXRDb250ZXh0KGtleSwgY29udGV4dCkge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuc2V0KGtleSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmdldChrZXkpO1xufVxuZnVuY3Rpb24gZ2V0QWxsQ29udGV4dHMoKSB7XG4gICAgcmV0dXJuIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQ7XG59XG5mdW5jdGlvbiBoYXNDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmhhcyhrZXkpO1xufVxuLy8gVE9ETyBmaWd1cmUgb3V0IGlmIHdlIHN0aWxsIHdhbnQgdG8gc3VwcG9ydFxuLy8gc2hvcnRoYW5kIGV2ZW50cywgb3IgaWYgd2Ugd2FudCB0byBpbXBsZW1lbnRcbi8vIGEgcmVhbCBidWJibGluZyBtZWNoYW5pc21cbmZ1bmN0aW9uIGJ1YmJsZShjb21wb25lbnQsIGV2ZW50KSB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1tldmVudC50eXBlXTtcbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY2FsbGJhY2tzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbi5jYWxsKHRoaXMsIGV2ZW50KSk7XG4gICAgfVxufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrKCkge1xuICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgIHJldHVybiByZXNvbHZlZF9wcm9taXNlO1xufVxuZnVuY3Rpb24gYWRkX3JlbmRlcl9jYWxsYmFjayhmbikge1xuICAgIHJlbmRlcl9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZGRfZmx1c2hfY2FsbGJhY2soZm4pIHtcbiAgICBmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5sZXQgZmx1c2hpbmcgPSBmYWxzZTtcbmNvbnN0IHNlZW5fY2FsbGJhY2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgaWYgKGZsdXNoaW5nKVxuICAgICAgICByZXR1cm47XG4gICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkaXJ0eV9jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoY29tcG9uZW50LiQkKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aClcbiAgICAgICAgICAgIGJpbmRpbmdfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgIC8vIHRoZW4sIG9uY2UgY29tcG9uZW50cyBhcmUgdXBkYXRlZCwgY2FsbFxuICAgICAgICAvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgdXBkYXRlcy4uLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVuZGVyX2NhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGlmICghc2Vlbl9jYWxsYmFja3MuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgIH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcbiAgICB3aGlsZSAoZmx1c2hfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcbiAgICB9XG4gICAgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgc2Vlbl9jYWxsYmFja3MuY2xlYXIoKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZSgkJCkge1xuICAgIGlmICgkJC5mcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAkJC51cGRhdGUoKTtcbiAgICAgICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAgICAgY29uc3QgZGlydHkgPSAkJC5kaXJ0eTtcbiAgICAgICAgJCQuZGlydHkgPSBbLTFdO1xuICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5wKCQkLmN0eCwgZGlydHkpO1xuICAgICAgICAkJC5hZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbiAgICB9XG59XG5cbmxldCBwcm9taXNlO1xuZnVuY3Rpb24gd2FpdCgpIHtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQoYCR7ZGlyZWN0aW9uID8gJ2ludHJvJyA6ICdvdXRybyd9JHtraW5kfWApKTtcbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcbmZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBsZXQgdGFzaztcbiAgICBsZXQgdWlkID0gMDtcbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzLCB1aWQrKyk7XG4gICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHRhc2spXG4gICAgICAgICAgICB0YXNrLmFib3J0KCk7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIHRydWUsICdzdGFydCcpKTtcbiAgICAgICAgdGFzayA9IGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCB0cnVlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbihnbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX291dF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IHRydWU7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGNvbnN0IGdyb3VwID0gb3V0cm9zO1xuICAgIGdyb3VwLnIgKz0gMTtcbiAgICBmdW5jdGlvbiBnbygpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMSwgMCwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBmYWxzZSwgJ3N0YXJ0JykpO1xuICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEtLWdyb3VwLnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXN1bHQgaW4gYGVuZCgpYCBiZWluZyBjYWxsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNsZWFuIHVwIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwoZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSAtIHQsIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICBnbygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdvKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVuZChyZXNldCkge1xuICAgICAgICAgICAgaWYgKHJlc2V0ICYmIGNvbmZpZy50aWNrKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnRpY2soMSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVfYmlkaXJlY3Rpb25hbF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMsIGludHJvKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHQgPSBpbnRybyA/IDAgOiAxO1xuICAgIGxldCBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBhbmltYXRpb25fbmFtZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gY2xlYXJfYW5pbWF0aW9uKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluaXQocHJvZ3JhbSwgZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgZCA9IChwcm9ncmFtLmIgLSB0KTtcbiAgICAgICAgZHVyYXRpb24gKj0gTWF0aC5hYnMoZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhOiB0LFxuICAgICAgICAgICAgYjogcHJvZ3JhbS5iLFxuICAgICAgICAgICAgZCxcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IHByb2dyYW0uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHByb2dyYW0uc3RhcnQgKyBkdXJhdGlvbixcbiAgICAgICAgICAgIGdyb3VwOiBwcm9ncmFtLmdyb3VwXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKGIpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBub3coKSArIGRlbGF5LFxuICAgICAgICAgICAgYlxuICAgICAgICB9O1xuICAgICAgICBpZiAoIWIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICBwcm9ncmFtLmdyb3VwID0gb3V0cm9zO1xuICAgICAgICAgICAgb3V0cm9zLnIgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaW50cm8sIGFuZCB0aGVyZSdzIGEgZGVsYXksIHdlIG5lZWQgdG8gZG9cbiAgICAgICAgICAgIC8vIGFuIGluaXRpYWwgdGljayBhbmQvb3IgYXBwbHkgQ1NTIGFuaW1hdGlvbiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYilcbiAgICAgICAgICAgICAgICB0aWNrKDAsIDEpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwcm9ncmFtLCBkdXJhdGlvbik7XG4gICAgICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIGIsICdzdGFydCcpKTtcbiAgICAgICAgICAgIGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZ19wcm9ncmFtICYmIG5vdyA+IHBlbmRpbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBpbml0KHBlbmRpbmdfcHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ3N0YXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCB0LCBydW5uaW5nX3Byb2dyYW0uYiwgcnVubmluZ19wcm9ncmFtLmR1cmF0aW9uLCAwLCBlYXNpbmcsIGNvbmZpZy5jc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQgPSBydW5uaW5nX3Byb2dyYW0uYiwgMSAtIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0uYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRybyBcdTIwMTQgd2UgY2FuIHRpZHkgdXAgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRybyBcdTIwMTQgbmVlZHMgdG8gYmUgY29vcmRpbmF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEtLXJ1bm5pbmdfcHJvZ3JhbS5ncm91cC5yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2FsbChydW5uaW5nX3Byb2dyYW0uZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gbm93IC0gcnVubmluZ19wcm9ncmFtLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHJ1bm5pbmdfcHJvZ3JhbS5hICsgcnVubmluZ19wcm9ncmFtLmQgKiBlYXNpbmcocCAvIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gISEocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBydW4oYikge1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVuZCgpIHtcbiAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZV9wcm9taXNlKHByb21pc2UsIGluZm8pIHtcbiAgICBjb25zdCB0b2tlbiA9IGluZm8udG9rZW4gPSB7fTtcbiAgICBmdW5jdGlvbiB1cGRhdGUodHlwZSwgaW5kZXgsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGluZm8udG9rZW4gIT09IHRva2VuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpbmZvLnJlc29sdmVkID0gdmFsdWU7XG4gICAgICAgIGxldCBjaGlsZF9jdHggPSBpbmZvLmN0eDtcbiAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjaGlsZF9jdHggPSBjaGlsZF9jdHguc2xpY2UoKTtcbiAgICAgICAgICAgIGNoaWxkX2N0eFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmxvY2sgPSB0eXBlICYmIChpbmZvLmN1cnJlbnQgPSB0eXBlKShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgbmVlZHNfZmx1c2ggPSBmYWxzZTtcbiAgICAgICAgaWYgKGluZm8uYmxvY2spIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzLmZvckVhY2goKGJsb2NrLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSBpbmRleCAmJiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrc1tpXSA9PT0gYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibG9ja3NbaV0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2suZCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICAgICAgYmxvY2subShpbmZvLm1vdW50KCksIGluZm8uYW5jaG9yKTtcbiAgICAgICAgICAgIG5lZWRzX2ZsdXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLmJsb2NrID0gYmxvY2s7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrcylcbiAgICAgICAgICAgIGluZm8uYmxvY2tzW2luZGV4XSA9IGJsb2NrO1xuICAgICAgICBpZiAobmVlZHNfZmx1c2gpIHtcbiAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzX3Byb21pc2UocHJvbWlzZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudF9jb21wb25lbnQgPSBnZXRfY3VycmVudF9jb21wb25lbnQoKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCB2YWx1ZSk7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5jYXRjaCwgMiwgaW5mby5lcnJvciwgZXJyb3IpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICAgICAgaWYgKCFpbmZvLmhhc0NhdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiB3ZSBwcmV2aW91c2x5IGhhZCBhIHRoZW4vY2F0Y2ggYmxvY2ssIGRlc3Ryb3kgaXRcbiAgICAgICAgaWYgKGluZm8uY3VycmVudCAhPT0gaW5mby5wZW5kaW5nKSB7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5wZW5kaW5nLCAwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnRoZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHByb21pc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IHByb21pc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX2F3YWl0X2Jsb2NrX2JyYW5jaChpbmZvLCBjdHgsIGRpcnR5KSB7XG4gICAgY29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG4gICAgY29uc3QgeyByZXNvbHZlZCB9ID0gaW5mbztcbiAgICBpZiAoaW5mby5jdXJyZW50ID09PSBpbmZvLnRoZW4pIHtcbiAgICAgICAgY2hpbGRfY3R4W2luZm8udmFsdWVdID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIGlmIChpbmZvLmN1cnJlbnQgPT09IGluZm8uY2F0Y2gpIHtcbiAgICAgICAgY2hpbGRfY3R4W2luZm8uZXJyb3JdID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIGluZm8uYmxvY2sucChjaGlsZF9jdHgsIGRpcnR5KTtcbn1cblxuY29uc3QgZ2xvYmFscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gd2luZG93XG4gICAgOiB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBnbG9iYWxUaGlzXG4gICAgICAgIDogZ2xvYmFsKTtcblxuZnVuY3Rpb24gZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZCgxKTtcbiAgICBsb29rdXAuZGVsZXRlKGJsb2NrLmtleSk7XG59XG5mdW5jdGlvbiBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZml4X2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmYoKTtcbiAgICBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9rZXllZF9lYWNoKG9sZF9ibG9ja3MsIGRpcnR5LCBnZXRfa2V5LCBkeW5hbWljLCBjdHgsIGxpc3QsIGxvb2t1cCwgbm9kZSwgZGVzdHJveSwgY3JlYXRlX2VhY2hfYmxvY2ssIG5leHQsIGdldF9jb250ZXh0KSB7XG4gICAgbGV0IG8gPSBvbGRfYmxvY2tzLmxlbmd0aDtcbiAgICBsZXQgbiA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpID0gbztcbiAgICBjb25zdCBvbGRfaW5kZXhlcyA9IHt9O1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIG9sZF9pbmRleGVzW29sZF9ibG9ja3NbaV0ua2V5XSA9IGk7XG4gICAgY29uc3QgbmV3X2Jsb2NrcyA9IFtdO1xuICAgIGNvbnN0IG5ld19sb29rdXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGVsdGFzID0gbmV3IE1hcCgpO1xuICAgIGkgPSBuO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY29uc3QgY2hpbGRfY3R4ID0gZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgYmxvY2sgPSBsb29rdXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gY3JlYXRlX2VhY2hfYmxvY2soa2V5LCBjaGlsZF9jdHgpO1xuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIGJsb2NrLnAoY2hpbGRfY3R4LCBkaXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3X2xvb2t1cC5zZXQoa2V5LCBuZXdfYmxvY2tzW2ldID0gYmxvY2spO1xuICAgICAgICBpZiAoa2V5IGluIG9sZF9pbmRleGVzKVxuICAgICAgICAgICAgZGVsdGFzLnNldChrZXksIE1hdGguYWJzKGkgLSBvbGRfaW5kZXhlc1trZXldKSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBkaWRfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBpbnNlcnQoYmxvY2spIHtcbiAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgIGJsb2NrLm0obm9kZSwgbmV4dCk7XG4gICAgICAgIGxvb2t1cC5zZXQoYmxvY2sua2V5LCBibG9jayk7XG4gICAgICAgIG5leHQgPSBibG9jay5maXJzdDtcbiAgICAgICAgbi0tO1xuICAgIH1cbiAgICB3aGlsZSAobyAmJiBuKSB7XG4gICAgICAgIGNvbnN0IG5ld19ibG9jayA9IG5ld19ibG9ja3NbbiAtIDFdO1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcbiAgICAgICAgY29uc3QgbmV3X2tleSA9IG5ld19ibG9jay5rZXk7XG4gICAgICAgIGNvbnN0IG9sZF9rZXkgPSBvbGRfYmxvY2sua2V5O1xuICAgICAgICBpZiAobmV3X2Jsb2NrID09PSBvbGRfYmxvY2spIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIG5leHQgPSBuZXdfYmxvY2suZmlyc3Q7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgICAgICBuLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkIGJsb2NrXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbG9va3VwLmhhcyhuZXdfa2V5KSB8fCB3aWxsX21vdmUuaGFzKG5ld19rZXkpKSB7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaWRfbW92ZS5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWx0YXMuZ2V0KG5ld19rZXkpID4gZGVsdGFzLmdldChvbGRfa2V5KSkge1xuICAgICAgICAgICAgZGlkX21vdmUuYWRkKG5ld19rZXkpO1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWxsX21vdmUuYWRkKG9sZF9rZXkpO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChvLS0pIHtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvXTtcbiAgICAgICAgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfYmxvY2sua2V5KSlcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgIH1cbiAgICB3aGlsZSAobilcbiAgICAgICAgaW5zZXJ0KG5ld19ibG9ja3NbbiAtIDFdKTtcbiAgICByZXR1cm4gbmV3X2Jsb2Nrcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfa2V5cyhjdHgsIGxpc3QsIGdldF9jb250ZXh0LCBnZXRfa2V5KSB7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShnZXRfY29udGV4dChjdHgsIGxpc3QsIGkpKTtcbiAgICAgICAgaWYgKGtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgZHVwbGljYXRlIGtleXMgaW4gYSBrZXllZCBlYWNoJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldF9zcHJlYWRfdXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuICAgIGNvbnN0IHRvX251bGxfb3V0ID0ge307XG4gICAgY29uc3QgYWNjb3VudGVkX2ZvciA9IHsgJCRzY29wZTogMSB9O1xuICAgIGxldCBpID0gbGV2ZWxzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IG8gPSBsZXZlbHNbaV07XG4gICAgICAgIGNvbnN0IG4gPSB1cGRhdGVzW2ldO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBuKSlcbiAgICAgICAgICAgICAgICAgICAgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50ZWRfZm9yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlW2tleV0gPSBuW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxzW2ldID0gbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRvX251bGxfb3V0KSB7XG4gICAgICAgIGlmICghKGtleSBpbiB1cGRhdGUpKVxuICAgICAgICAgICAgdXBkYXRlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBnZXRfc3ByZWFkX29iamVjdChzcHJlYWRfcHJvcHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNwcmVhZF9wcm9wcyA9PT0gJ29iamVjdCcgJiYgc3ByZWFkX3Byb3BzICE9PSBudWxsID8gc3ByZWFkX3Byb3BzIDoge307XG59XG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sXG5jb25zdCBib29sZWFuX2F0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgICAnYWxsb3dmdWxsc2NyZWVuJyxcbiAgICAnYWxsb3dwYXltZW50cmVxdWVzdCcsXG4gICAgJ2FzeW5jJyxcbiAgICAnYXV0b2ZvY3VzJyxcbiAgICAnYXV0b3BsYXknLFxuICAgICdjaGVja2VkJyxcbiAgICAnY29udHJvbHMnLFxuICAgICdkZWZhdWx0JyxcbiAgICAnZGVmZXInLFxuICAgICdkaXNhYmxlZCcsXG4gICAgJ2Zvcm1ub3ZhbGlkYXRlJyxcbiAgICAnaGlkZGVuJyxcbiAgICAnaXNtYXAnLFxuICAgICdsb29wJyxcbiAgICAnbXVsdGlwbGUnLFxuICAgICdtdXRlZCcsXG4gICAgJ25vbW9kdWxlJyxcbiAgICAnbm92YWxpZGF0ZScsXG4gICAgJ29wZW4nLFxuICAgICdwbGF5c2lubGluZScsXG4gICAgJ3JlYWRvbmx5JyxcbiAgICAncmVxdWlyZWQnLFxuICAgICdyZXZlcnNlZCcsXG4gICAgJ3NlbGVjdGVkJ1xuXSk7XG5cbmNvbnN0IGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyID0gL1tcXHMnXCI+Lz1cXHV7RkREMH0tXFx1e0ZERUZ9XFx1e0ZGRkV9XFx1e0ZGRkZ9XFx1ezFGRkZFfVxcdXsxRkZGRn1cXHV7MkZGRkV9XFx1ezJGRkZGfVxcdXszRkZGRX1cXHV7M0ZGRkZ9XFx1ezRGRkZFfVxcdXs0RkZGRn1cXHV7NUZGRkV9XFx1ezVGRkZGfVxcdXs2RkZGRX1cXHV7NkZGRkZ9XFx1ezdGRkZFfVxcdXs3RkZGRn1cXHV7OEZGRkV9XFx1ezhGRkZGfVxcdXs5RkZGRX1cXHV7OUZGRkZ9XFx1e0FGRkZFfVxcdXtBRkZGRn1cXHV7QkZGRkV9XFx1e0JGRkZGfVxcdXtDRkZGRX1cXHV7Q0ZGRkZ9XFx1e0RGRkZFfVxcdXtERkZGRn1cXHV7RUZGRkV9XFx1e0VGRkZGfVxcdXtGRkZGRX1cXHV7RkZGRkZ9XFx1ezEwRkZGRX1cXHV7MTBGRkZGfV0vdTtcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI25vbmNoYXJhY3RlclxuZnVuY3Rpb24gc3ByZWFkKGFyZ3MsIGNsYXNzZXNfdG9fYWRkKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpO1xuICAgIGlmIChjbGFzc2VzX3RvX2FkZCkge1xuICAgICAgICBpZiAoYXR0cmlidXRlcy5jbGFzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3Nlc190b19hZGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzICs9ICcgJyArIGNsYXNzZXNfdG9fYWRkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdHIgPSAnJztcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIudGVzdChuYW1lKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gJyAnICsgbmFtZTtcbiAgICAgICAgZWxzZSBpZiAoYm9vbGVhbl9hdHRyaWJ1dGVzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyICs9IGAgJHtuYW1lfT1cIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IGVzY2FwZWQgPSB7XG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OycsXG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnXG59O1xuZnVuY3Rpb24gZXNjYXBlKGh0bWwpIHtcbiAgICByZXR1cm4gU3RyaW5nKGh0bWwpLnJlcGxhY2UoL1tcIicmPD5dL2csIG1hdGNoID0+IGVzY2FwZWRbbWF0Y2hdKTtcbn1cbmZ1bmN0aW9uIGVzY2FwZV9hdHRyaWJ1dGVfdmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IGVzY2FwZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGVzY2FwZV9vYmplY3Qob2JqKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZShvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBlYWNoKGl0ZW1zLCBmbikge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBmbihpdGVtc1tpXSwgaSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5jb25zdCBtaXNzaW5nX2NvbXBvbmVudCA9IHtcbiAgICAkJHJlbmRlcjogKCkgPT4gJydcbn07XG5mdW5jdGlvbiB2YWxpZGF0ZV9jb21wb25lbnQoY29tcG9uZW50LCBuYW1lKSB7XG4gICAgaWYgKCFjb21wb25lbnQgfHwgIWNvbXBvbmVudC4kJHJlbmRlcikge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3N2ZWx0ZTpjb21wb25lbnQnKVxuICAgICAgICAgICAgbmFtZSArPSAnIHRoaXM9ey4uLn0nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYDwke25hbWV9PiBpcyBub3QgYSB2YWxpZCBTU1IgY29tcG9uZW50LiBZb3UgbWF5IG5lZWQgdG8gcmV2aWV3IHlvdXIgYnVpbGQgY29uZmlnIHRvIGVuc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQsIHJhdGhlciB0aGFuIGltcG9ydGVkIGFzIHByZS1jb21waWxlZCBtb2R1bGVzYCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiBkZWJ1ZyhmaWxlLCBsaW5lLCBjb2x1bW4sIHZhbHVlcykge1xuICAgIGNvbnNvbGUubG9nKGB7QGRlYnVnfSAke2ZpbGUgPyBmaWxlICsgJyAnIDogJyd9KCR7bGluZX06JHtjb2x1bW59KWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyh2YWx1ZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICByZXR1cm4gJyc7XG59XG5sZXQgb25fZGVzdHJveTtcbmZ1bmN0aW9uIGNyZWF0ZV9zc3JfY29tcG9uZW50KGZuKSB7XG4gICAgZnVuY3Rpb24gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICAgICAgY29uc3QgJCQgPSB7XG4gICAgICAgICAgICBvbl9kZXN0cm95LFxuICAgICAgICAgICAgY29udGV4dDogbmV3IE1hcChjb250ZXh0IHx8IChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pKSxcbiAgICAgICAgICAgIC8vIHRoZXNlIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzY2FyZGVkXG4gICAgICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpXG4gICAgICAgIH07XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudCh7ICQkIH0pO1xuICAgICAgICBjb25zdCBodG1sID0gZm4ocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzKTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVuZGVyOiAocHJvcHMgPSB7fSwgeyAkJHNsb3RzID0ge30sIGNvbnRleHQgPSBuZXcgTWFwKCkgfSA9IHt9KSA9PiB7XG4gICAgICAgICAgICBvbl9kZXN0cm95ID0gW107XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHRpdGxlOiAnJywgaGVhZDogJycsIGNzczogbmV3IFNldCgpIH07XG4gICAgICAgICAgICBjb25zdCBodG1sID0gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywge30sICQkc2xvdHMsIGNvbnRleHQpO1xuICAgICAgICAgICAgcnVuX2FsbChvbl9kZXN0cm95KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogQXJyYXkuZnJvbShyZXN1bHQuY3NzKS5tYXAoY3NzID0+IGNzcy5jb2RlKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBudWxsIC8vIFRPRE9cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWQ6IHJlc3VsdC50aXRsZSArIHJlc3VsdC5oZWFkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAkJHJlbmRlclxuICAgIH07XG59XG5mdW5jdGlvbiBhZGRfYXR0cmlidXRlKG5hbWUsIHZhbHVlLCBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgKGJvb2xlYW4gJiYgIXZhbHVlKSlcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHJldHVybiBgICR7bmFtZX0ke3ZhbHVlID09PSB0cnVlID8gJycgOiBgPSR7dHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04uc3RyaW5naWZ5KGVzY2FwZSh2YWx1ZSkpIDogYFwiJHt2YWx1ZX1cImB9YH1gO1xufVxuZnVuY3Rpb24gYWRkX2NsYXNzZXMoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzID8gYCBjbGFzcz1cIiR7Y2xhc3Nlc31cImAgOiAnJztcbn1cblxuZnVuY3Rpb24gYmluZChjb21wb25lbnQsIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnQuJCQucHJvcHNbbmFtZV07XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29tcG9uZW50LiQkLmJvdW5kW2luZGV4XSA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayhjb21wb25lbnQuJCQuY3R4W2luZGV4XSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlX2NvbXBvbmVudChibG9jaykge1xuICAgIGJsb2NrICYmIGJsb2NrLmMoKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2NvbXBvbmVudChibG9jaywgcGFyZW50X25vZGVzKSB7XG4gICAgYmxvY2sgJiYgYmxvY2subChwYXJlbnRfbm9kZXMpO1xufVxuZnVuY3Rpb24gbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgdGFyZ2V0LCBhbmNob3IsIGN1c3RvbUVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGZyYWdtZW50LCBvbl9tb3VudCwgb25fZGVzdHJveSwgYWZ0ZXJfdXBkYXRlIH0gPSBjb21wb25lbnQuJCQ7XG4gICAgZnJhZ21lbnQgJiYgZnJhZ21lbnQubSh0YXJnZXQsIGFuY2hvcik7XG4gICAgaWYgKCFjdXN0b21FbGVtZW50KSB7XG4gICAgICAgIC8vIG9uTW91bnQgaGFwcGVucyBiZWZvcmUgdGhlIGluaXRpYWwgYWZ0ZXJVcGRhdGVcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdfb25fZGVzdHJveSA9IG9uX21vdW50Lm1hcChydW4pLmZpbHRlcihpc19mdW5jdGlvbik7XG4gICAgICAgICAgICBpZiAob25fZGVzdHJveSkge1xuICAgICAgICAgICAgICAgIG9uX2Rlc3Ryb3kucHVzaCguLi5uZXdfb25fZGVzdHJveSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBFZGdlIGNhc2UgLSBjb21wb25lbnQgd2FzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSxcbiAgICAgICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBhIGJpbmRpbmcgaW5pdGlhbGlzaW5nXG4gICAgICAgICAgICAgICAgcnVuX2FsbChuZXdfb25fZGVzdHJveSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnQuJCQub25fbW91bnQgPSBbXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGVzdHJveV9jb21wb25lbnQoY29tcG9uZW50LCBkZXRhY2hpbmcpIHtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJDtcbiAgICBpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgcnVuX2FsbCgkJC5vbl9kZXN0cm95KTtcbiAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuZChkZXRhY2hpbmcpO1xuICAgICAgICAvLyBUT0RPIG51bGwgb3V0IG90aGVyIHJlZnMsIGluY2x1ZGluZyBjb21wb25lbnQuJCQgKGJ1dCBuZWVkIHRvXG4gICAgICAgIC8vIHByZXNlcnZlIGZpbmFsIHN0YXRlPylcbiAgICAgICAgJCQub25fZGVzdHJveSA9ICQkLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgJCQuY3R4ID0gW107XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLmRpcnR5WzBdID09PSAtMSkge1xuICAgICAgICBkaXJ0eV9jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgc2NoZWR1bGVfdXBkYXRlKCk7XG4gICAgICAgIGNvbXBvbmVudC4kJC5kaXJ0eS5maWxsKDApO1xuICAgIH1cbiAgICBjb21wb25lbnQuJCQuZGlydHlbKGkgLyAzMSkgfCAwXSB8PSAoMSA8PCAoaSAlIDMxKSk7XG59XG5mdW5jdGlvbiBpbml0KGNvbXBvbmVudCwgb3B0aW9ucywgaW5zdGFuY2UsIGNyZWF0ZV9mcmFnbWVudCwgbm90X2VxdWFsLCBwcm9wcywgYXBwZW5kX3N0eWxlcywgZGlydHkgPSBbLTFdKSB7XG4gICAgY29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpO1xuICAgIGNvbnN0ICQkID0gY29tcG9uZW50LiQkID0ge1xuICAgICAgICBmcmFnbWVudDogbnVsbCxcbiAgICAgICAgY3R4OiBudWxsLFxuICAgICAgICAvLyBzdGF0ZVxuICAgICAgICBwcm9wcyxcbiAgICAgICAgdXBkYXRlOiBub29wLFxuICAgICAgICBub3RfZXF1YWwsXG4gICAgICAgIGJvdW5kOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgLy8gbGlmZWN5Y2xlXG4gICAgICAgIG9uX21vdW50OiBbXSxcbiAgICAgICAgb25fZGVzdHJveTogW10sXG4gICAgICAgIG9uX2Rpc2Nvbm5lY3Q6IFtdLFxuICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgYWZ0ZXJfdXBkYXRlOiBbXSxcbiAgICAgICAgY29udGV4dDogbmV3IE1hcChvcHRpb25zLmNvbnRleHQgfHwgKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSkpLFxuICAgICAgICAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgZGlydHksXG4gICAgICAgIHNraXBfYm91bmQ6IGZhbHNlLFxuICAgICAgICByb290OiBvcHRpb25zLnRhcmdldCB8fCBwYXJlbnRfY29tcG9uZW50LiQkLnJvb3RcbiAgICB9O1xuICAgIGFwcGVuZF9zdHlsZXMgJiYgYXBwZW5kX3N0eWxlcygkJC5yb290KTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAkJC5jdHggPSBpbnN0YW5jZVxuICAgICAgICA/IGluc3RhbmNlKGNvbXBvbmVudCwgb3B0aW9ucy5wcm9wcyB8fCB7fSwgKGksIHJldCwgLi4ucmVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0Lmxlbmd0aCA/IHJlc3RbMF0gOiByZXQ7XG4gICAgICAgICAgICBpZiAoJCQuY3R4ICYmIG5vdF9lcXVhbCgkJC5jdHhbaV0sICQkLmN0eFtpXSA9IHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICghJCQuc2tpcF9ib3VuZCAmJiAkJC5ib3VuZFtpXSlcbiAgICAgICAgICAgICAgICAgICAgJCQuYm91bmRbaV0odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZWFkeSlcbiAgICAgICAgICAgICAgICAgICAgbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICAkJC51cGRhdGUoKTtcbiAgICByZWFkeSA9IHRydWU7XG4gICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAvLyBgZmFsc2VgIGFzIGEgc3BlY2lhbCBjYXNlIG9mIG5vIERPTSBjb21wb25lbnRcbiAgICAkJC5mcmFnbWVudCA9IGNyZWF0ZV9mcmFnbWVudCA/IGNyZWF0ZV9mcmFnbWVudCgkJC5jdHgpIDogZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIHN0YXJ0X2h5ZHJhdGluZygpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZHJlbihvcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQubChub2Rlcyk7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGRldGFjaCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuYygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmludHJvKVxuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihjb21wb25lbnQuJCQuZnJhZ21lbnQpO1xuICAgICAgICBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5hbmNob3IsIG9wdGlvbnMuY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIGVuZF9oeWRyYXRpbmcoKTtcbiAgICAgICAgZmx1c2goKTtcbiAgICB9XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xufVxubGV0IFN2ZWx0ZUVsZW1lbnQ7XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgU3ZlbHRlRWxlbWVudCA9IGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25fbW91bnQgfSA9IHRoaXMuJCQ7XG4gICAgICAgICAgICB0aGlzLiQkLm9uX2Rpc2Nvbm5lY3QgPSBvbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuJCQuc2xvdHRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLiQkLnNsb3R0ZWRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsIF9vbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbYXR0cl0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIHJ1bl9hbGwodGhpcy4kJC5vbl9kaXNjb25uZWN0KTtcbiAgICAgICAgfVxuICAgICAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB0aGlzIGRlbGVnYXRlIHRvIGFkZEV2ZW50TGlzdGVuZXI/XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMuIFVzZWQgd2hlbiBkZXY9ZmFsc2UuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICB9XG4gICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICBpZiAodGhpcy4kJHNldCAmJiAhaXNfZW1wdHkoJCRwcm9wcykpIHtcbiAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoX2Rldih0eXBlLCBkZXRhaWwpIHtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCBPYmplY3QuYXNzaWduKHsgdmVyc2lvbjogJzMuNDMuMCcgfSwgZGV0YWlsKSwgdHJ1ZSkpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZCh0YXJnZXQsIG5vZGUpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2h5ZHJhdGlvbl9kZXYodGFyZ2V0LCBub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSB9KTtcbiAgICBhcHBlbmRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBpbnNlcnRfZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5mdW5jdGlvbiBpbnNlcnRfaHlkcmF0aW9uX2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUsIGFuY2hvciB9KTtcbiAgICBpbnNlcnRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9kZXYobm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlJywgeyBub2RlIH0pO1xuICAgIGRldGFjaChub2RlKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9iZXR3ZWVuX2RldihiZWZvcmUsIGFmdGVyKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZyAmJiBiZWZvcmUubmV4dFNpYmxpbmcgIT09IGFmdGVyKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hfYmVmb3JlX2RldihhZnRlcikge1xuICAgIHdoaWxlIChhZnRlci5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgZGV0YWNoX2RldihhZnRlci5wcmV2aW91c1NpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9hZnRlcl9kZXYoYmVmb3JlKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdGVuX2Rldihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucywgaGFzX3ByZXZlbnRfZGVmYXVsdCwgaGFzX3N0b3BfcHJvcGFnYXRpb24pIHtcbiAgICBjb25zdCBtb2RpZmllcnMgPSBvcHRpb25zID09PSB0cnVlID8gWydjYXB0dXJlJ10gOiBvcHRpb25zID8gQXJyYXkuZnJvbShPYmplY3Qua2V5cyhvcHRpb25zKSkgOiBbXTtcbiAgICBpZiAoaGFzX3ByZXZlbnRfZGVmYXVsdClcbiAgICAgICAgbW9kaWZpZXJzLnB1c2goJ3ByZXZlbnREZWZhdWx0Jyk7XG4gICAgaWYgKGhhc19zdG9wX3Byb3BhZ2F0aW9uKVxuICAgICAgICBtb2RpZmllcnMucHVzaCgnc3RvcFByb3BhZ2F0aW9uJyk7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01BZGRFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgIGNvbnN0IGRpc3Bvc2UgPSBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICAgICAgZGlzcG9zZSgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyX2Rldihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSB9KTtcbiAgICBlbHNlXG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0QXR0cmlidXRlJywgeyBub2RlLCBhdHRyaWJ1dGUsIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gcHJvcF9kZXYobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgbm9kZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldFByb3BlcnR5JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBkYXRhc2V0X2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlLmRhdGFzZXRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhc2V0JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YV9kZXYodGV4dCwgZGF0YSkge1xuICAgIGRhdGEgPSAnJyArIGRhdGE7XG4gICAgaWYgKHRleHQud2hvbGVUZXh0ID09PSBkYXRhKVxuICAgICAgICByZXR1cm47XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhJywgeyBub2RlOiB0ZXh0LCBkYXRhIH0pO1xuICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyAmJiAhKGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBhcmcpKSB7XG4gICAgICAgIGxldCBtc2cgPSAneyNlYWNofSBvbmx5IGl0ZXJhdGVzIG92ZXIgYXJyYXktbGlrZSBvYmplY3RzLic7XG4gICAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIGFyZyAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gYXJnKSB7XG4gICAgICAgICAgICBtc2cgKz0gJyBZb3UgY2FuIHVzZSBhIHNwcmVhZCB0byBjb252ZXJ0IHRoaXMgaXRlcmFibGUgaW50byBhbiBhcnJheS4nO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3Nsb3RzKG5hbWUsIHNsb3QsIGtleXMpIHtcbiAgICBmb3IgKGNvbnN0IHNsb3Rfa2V5IG9mIE9iamVjdC5rZXlzKHNsb3QpKSB7XG4gICAgICAgIGlmICghfmtleXMuaW5kZXhPZihzbG90X2tleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgPCR7bmFtZX0+IHJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgc2xvdCBcIiR7c2xvdF9rZXl9XCIuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzIHdpdGggc29tZSBtaW5vciBkZXYtZW5oYW5jZW1lbnRzLiBVc2VkIHdoZW4gZGV2PXRydWUuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudERldiBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLnRhcmdldCAmJiAhb3B0aW9ucy4kJGlubGluZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIid0YXJnZXQnIGlzIGEgcmVxdWlyZWQgb3B0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgICRkZXN0cm95KCkge1xuICAgICAgICBzdXBlci4kZGVzdHJveSgpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnQgd2FzIGFscmVhZHkgZGVzdHJveWVkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9O1xuICAgIH1cbiAgICAkY2FwdHVyZV9zdGF0ZSgpIHsgfVxuICAgICRpbmplY3Rfc3RhdGUoKSB7IH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyB0byBjcmVhdGUgc3Ryb25nbHkgdHlwZWQgU3ZlbHRlIGNvbXBvbmVudHMuXG4gKiBUaGlzIG9ubHkgZXhpc3RzIGZvciB0eXBpbmcgcHVycG9zZXMgYW5kIHNob3VsZCBiZSB1c2VkIGluIGAuZC50c2AgZmlsZXMuXG4gKlxuICogIyMjIEV4YW1wbGU6XG4gKlxuICogWW91IGhhdmUgY29tcG9uZW50IGxpYnJhcnkgb24gbnBtIGNhbGxlZCBgY29tcG9uZW50LWxpYnJhcnlgLCBmcm9tIHdoaWNoXG4gKiB5b3UgZXhwb3J0IGEgY29tcG9uZW50IGNhbGxlZCBgTXlDb21wb25lbnRgLiBGb3IgU3ZlbHRlK1R5cGVTY3JpcHQgdXNlcnMsXG4gKiB5b3Ugd2FudCB0byBwcm92aWRlIHR5cGluZ3MuIFRoZXJlZm9yZSB5b3UgY3JlYXRlIGEgYGluZGV4LmQudHNgOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFN2ZWx0ZUNvbXBvbmVudFR5cGVkIH0gZnJvbSBcInN2ZWx0ZVwiO1xuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50VHlwZWQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGBgYFxuICogVHlwaW5nIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIElERXMgbGlrZSBWUyBDb2RlIHdpdGggdGhlIFN2ZWx0ZSBleHRlbnNpb25cbiAqIHRvIHByb3ZpZGUgaW50ZWxsaXNlbnNlIGFuZCB0byB1c2UgdGhlIGNvbXBvbmVudCBsaWtlIHRoaXMgaW4gYSBTdmVsdGUgZmlsZVxuICogd2l0aCBUeXBlU2NyaXB0OlxuICogYGBgc3ZlbHRlXG4gKiA8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuICogXHRpbXBvcnQgeyBNeUNvbXBvbmVudCB9IGZyb20gXCJjb21wb25lbnQtbGlicmFyeVwiO1xuICogPC9zY3JpcHQ+XG4gKiA8TXlDb21wb25lbnQgZm9vPXsnYmFyJ30gLz5cbiAqIGBgYFxuICpcbiAqICMjIyMgV2h5IG5vdCBtYWtlIHRoaXMgcGFydCBvZiBgU3ZlbHRlQ29tcG9uZW50KERldilgP1xuICogQmVjYXVzZVxuICogYGBgdHNcbiAqIGNsYXNzIEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50PHtmb286IHN0cmluZ30+IHt9XG4gKiBjb25zdCBjb21wb25lbnQ6IHR5cGVvZiBTdmVsdGVDb21wb25lbnQgPSBBU3ViY2xhc3NPZlN2ZWx0ZUNvbXBvbmVudDtcbiAqIGBgYFxuICogd2lsbCB0aHJvdyBhIHR5cGUgZXJyb3IsIHNvIHdlIG5lZWQgdG8gc2VwYXJhdGUgdGhlIG1vcmUgc3RyaWN0bHkgdHlwZWQgY2xhc3MuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudFR5cGVkIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxvb3BfZ3VhcmQodGltZW91dCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmZpbml0ZSBsb29wIGRldGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgeyBIdG1sVGFnLCBIdG1sVGFnSHlkcmF0aW9uLCBTdmVsdGVDb21wb25lbnQsIFN2ZWx0ZUNvbXBvbmVudERldiwgU3ZlbHRlQ29tcG9uZW50VHlwZWQsIFN2ZWx0ZUVsZW1lbnQsIGFjdGlvbl9kZXN0cm95ZXIsIGFkZF9hdHRyaWJ1dGUsIGFkZF9jbGFzc2VzLCBhZGRfZmx1c2hfY2FsbGJhY2ssIGFkZF9sb2NhdGlvbiwgYWRkX3JlbmRlcl9jYWxsYmFjaywgYWRkX3Jlc2l6ZV9saXN0ZW5lciwgYWRkX3RyYW5zZm9ybSwgYWZ0ZXJVcGRhdGUsIGFwcGVuZCwgYXBwZW5kX2RldiwgYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQsIGFwcGVuZF9oeWRyYXRpb24sIGFwcGVuZF9oeWRyYXRpb25fZGV2LCBhcHBlbmRfc3R5bGVzLCBhc3NpZ24sIGF0dHIsIGF0dHJfZGV2LCBhdHRyaWJ1dGVfdG9fb2JqZWN0LCBiZWZvcmVVcGRhdGUsIGJpbmQsIGJpbmRpbmdfY2FsbGJhY2tzLCBibGFua19vYmplY3QsIGJ1YmJsZSwgY2hlY2tfb3V0cm9zLCBjaGlsZHJlbiwgY2xhaW1fY29tcG9uZW50LCBjbGFpbV9lbGVtZW50LCBjbGFpbV9odG1sX3RhZywgY2xhaW1fc3BhY2UsIGNsYWltX3N2Z19lbGVtZW50LCBjbGFpbV90ZXh0LCBjbGVhcl9sb29wcywgY29tcG9uZW50X3N1YnNjcmliZSwgY29tcHV0ZV9yZXN0X3Byb3BzLCBjb21wdXRlX3Nsb3RzLCBjcmVhdGVFdmVudERpc3BhdGNoZXIsIGNyZWF0ZV9hbmltYXRpb24sIGNyZWF0ZV9iaWRpcmVjdGlvbmFsX3RyYW5zaXRpb24sIGNyZWF0ZV9jb21wb25lbnQsIGNyZWF0ZV9pbl90cmFuc2l0aW9uLCBjcmVhdGVfb3V0X3RyYW5zaXRpb24sIGNyZWF0ZV9zbG90LCBjcmVhdGVfc3NyX2NvbXBvbmVudCwgY3VycmVudF9jb21wb25lbnQsIGN1c3RvbV9ldmVudCwgZGF0YXNldF9kZXYsIGRlYnVnLCBkZXN0cm95X2Jsb2NrLCBkZXN0cm95X2NvbXBvbmVudCwgZGVzdHJveV9lYWNoLCBkZXRhY2gsIGRldGFjaF9hZnRlcl9kZXYsIGRldGFjaF9iZWZvcmVfZGV2LCBkZXRhY2hfYmV0d2Vlbl9kZXYsIGRldGFjaF9kZXYsIGRpcnR5X2NvbXBvbmVudHMsIGRpc3BhdGNoX2RldiwgZWFjaCwgZWxlbWVudCwgZWxlbWVudF9pcywgZW1wdHksIGVuZF9oeWRyYXRpbmcsIGVzY2FwZSwgZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZSwgZXNjYXBlX29iamVjdCwgZXNjYXBlZCwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcywgZml4X2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfcG9zaXRpb24sIGZsdXNoLCBnZXRBbGxDb250ZXh0cywgZ2V0Q29udGV4dCwgZ2V0X2FsbF9kaXJ0eV9mcm9tX3Njb3BlLCBnZXRfYmluZGluZ19ncm91cF92YWx1ZSwgZ2V0X2N1cnJlbnRfY29tcG9uZW50LCBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzLCBnZXRfcm9vdF9mb3Jfc3R5bGUsIGdldF9zbG90X2NoYW5nZXMsIGdldF9zcHJlYWRfb2JqZWN0LCBnZXRfc3ByZWFkX3VwZGF0ZSwgZ2V0X3N0b3JlX3ZhbHVlLCBnbG9iYWxzLCBncm91cF9vdXRyb3MsIGhhbmRsZV9wcm9taXNlLCBoYXNDb250ZXh0LCBoYXNfcHJvcCwgaWRlbnRpdHksIGluaXQsIGluc2VydCwgaW5zZXJ0X2RldiwgaW5zZXJ0X2h5ZHJhdGlvbiwgaW5zZXJ0X2h5ZHJhdGlvbl9kZXYsIGludHJvcywgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIsIGlzX2NsaWVudCwgaXNfY3Jvc3NvcmlnaW4sIGlzX2VtcHR5LCBpc19mdW5jdGlvbiwgaXNfcHJvbWlzZSwgbGlzdGVuLCBsaXN0ZW5fZGV2LCBsb29wLCBsb29wX2d1YXJkLCBtaXNzaW5nX2NvbXBvbmVudCwgbW91bnRfY29tcG9uZW50LCBub29wLCBub3RfZXF1YWwsIG5vdywgbnVsbF90b19lbXB0eSwgb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcywgb25EZXN0cm95LCBvbk1vdW50LCBvbmNlLCBvdXRyb19hbmRfZGVzdHJveV9ibG9jaywgcHJldmVudF9kZWZhdWx0LCBwcm9wX2RldiwgcXVlcnlfc2VsZWN0b3JfYWxsLCByYWYsIHJ1biwgcnVuX2FsbCwgc2FmZV9ub3RfZXF1YWwsIHNjaGVkdWxlX3VwZGF0ZSwgc2VsZWN0X211bHRpcGxlX3ZhbHVlLCBzZWxlY3Rfb3B0aW9uLCBzZWxlY3Rfb3B0aW9ucywgc2VsZWN0X3ZhbHVlLCBzZWxmLCBzZXRDb250ZXh0LCBzZXRfYXR0cmlidXRlcywgc2V0X2N1cnJlbnRfY29tcG9uZW50LCBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YSwgc2V0X2RhdGEsIHNldF9kYXRhX2Rldiwgc2V0X2lucHV0X3R5cGUsIHNldF9pbnB1dF92YWx1ZSwgc2V0X25vdywgc2V0X3JhZiwgc2V0X3N0b3JlX3ZhbHVlLCBzZXRfc3R5bGUsIHNldF9zdmdfYXR0cmlidXRlcywgc3BhY2UsIHNwcmVhZCwgc3JjX3VybF9lcXVhbCwgc3RhcnRfaHlkcmF0aW5nLCBzdG9wX3Byb3BhZ2F0aW9uLCBzdWJzY3JpYmUsIHN2Z19lbGVtZW50LCB0ZXh0LCB0aWNrLCB0aW1lX3Jhbmdlc190b19hcnJheSwgdG9fbnVtYmVyLCB0b2dnbGVfY2xhc3MsIHRyYW5zaXRpb25faW4sIHRyYW5zaXRpb25fb3V0LCB0cnVzdGVkLCB1cGRhdGVfYXdhaXRfYmxvY2tfYnJhbmNoLCB1cGRhdGVfa2V5ZWRfZWFjaCwgdXBkYXRlX3Nsb3QsIHVwZGF0ZV9zbG90X2Jhc2UsIHZhbGlkYXRlX2NvbXBvbmVudCwgdmFsaWRhdGVfZWFjaF9hcmd1bWVudCwgdmFsaWRhdGVfZWFjaF9rZXlzLCB2YWxpZGF0ZV9zbG90cywgdmFsaWRhdGVfc3RvcmUsIHhsaW5rX2F0dHIgfTtcbiIsICJpbXBvcnQgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgZGVidWcsIGVycm9yIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgUG9zLCBURmlsZSwgVEZvbGRlciB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBhZGRDU1ZDcnVtYnMsIGdldENTVlJvd3MgfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0NTVkNydW1ic1wiO1xyXG5pbXBvcnQgeyBhZGREYXRhdmlld05vdGVzVG9HcmFwaCB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvRGF0YXZpZXdOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGREYXRlTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EYXRlTm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkRGVuZHJvbk5vdGVzVG9HcmFwaCB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvRGVuZHJvbk5vdGVzXCI7XHJcbmltcG9ydCB7IGFkZEZvbGRlck5vdGVzVG9HcmFwaCB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvRm9sZGVyTm90ZXNcIjtcclxuaW1wb3J0IHtcclxuICBhZGRITnNUb0dyYXBoLFxyXG4gIGdldEhpZXJhcmNoeU5vdGVJdGVtc1xyXG59IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSGllcmFyY2h5Tm90ZXMvSGllcmFyY2h5Tm90ZXNcIjtcclxuaW1wb3J0IHtcclxuICBhZGRKdWdnbExpbmtzVG9HcmFwaCxcclxuICBnZXRKdWdnbExpbmtzXHJcbn0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9KdWdnbExpbmtzXCI7XHJcbmltcG9ydCB7IGFkZExpbmtOb3Rlc1RvR3JhcGggfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0xpbmtOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGRSZWdleE5vdGVzVG9HcmFwaCB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvUmVnZXhOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGRUYWdOb3Rlc1RvR3JhcGggfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1RhZ05vdGVzXCI7XHJcbmltcG9ydCB7IGFkZFRyYXZlcnNlTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9UcmF2ZXJzZU5vdGVzXCI7XHJcbmltcG9ydCB7XHJcbiAgQkNfQUxUUyxcclxuICBCQ19EVl9OT1RFLFxyXG4gIEJDX0ZPTERFUl9OT1RFLCBCQ19MSU5LX05PVEUsXHJcbiAgQkNfUkVHRVhfTk9URSxcclxuICBCQ19UQUdfTk9URSxcclxuICBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gIGRyb3BIZWFkZXJPckFsaWFzLFxyXG4gIHNwbGl0TGlua3NSZWdleFxyXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgZHZGcm9udG1hdHRlckNhY2hlLFxyXG4gIGR2TGluayxcclxuICBSYXdWYWx1ZVxyXG59IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5pbXBvcnQgeyBhZGRBdW50c1VuY2xlcywgYWRkQ291c2lucywgYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudCwgYWRkU2libGluZ3NQYXJlbnRJc1BhcmVudCwgYWRkU3RydWN0dXJhbEVxdWl2YWxlbmNlU2libGluZ3MgfSBmcm9tIFwiLi9SZWxhdGlvbnNcIjtcclxuaW1wb3J0IHtcclxuICBhZGROb2Rlc0lmTm90LFxyXG4gIGJ1aWxkT2JzR3JhcGgsXHJcbiAgZ2V0UmVmbGV4aXZlQ2xvc3VyZSxcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW5cclxufSBmcm9tIFwiLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGl0ZXJhdGVIaWVycyB9IGZyb20gXCIuL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldEJhc2VGcm9tTURQYXRoLFxyXG4gIGdldERWQXBpLFxyXG4gIGdldERWQmFzZW5hbWVcclxufSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB7IGRyYXdUcmFpbCB9IGZyb20gXCIuL1ZpZXdzL1RyYWlsVmlld1wiO1xyXG5cclxuZnVuY3Rpb24gZ2V0RFZNZXRhZGF0YUNhY2hlKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBjb25zdCB7IGRiIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgYXBpID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuXHJcbiAgZGIuc3RhcnQxRyhcImdldERWTWV0YWRhdGFDYWNoZVwiKTtcclxuICBjb25zdCBmcm9udG1zID0gYXBpLnBhZ2VzKCkudmFsdWVzXHJcbiAgZGIuZW5kMUcoeyBmcm9udG1zIH0pO1xyXG5cclxuICByZXR1cm4gZnJvbnRtcztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0T2JzTWV0YWRhdGFDYWNoZShwbHVnaW46IEJDUGx1Z2luLCBmaWxlczogVEZpbGVbXSkge1xyXG4gIGNvbnN0IHsgZGIgfSA9IHBsdWdpbjtcclxuICBkYi5zdGFydDFHKFwiZ2V0T2JzTWV0YWRhdGFDYWNoZVwiKTtcclxuXHJcbiAgY29uc3QgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10gPSBmaWxlcy5tYXAoKGZpbGUpID0+IHtcclxuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICAgIHJldHVybiBmcm9udG1hdHRlciA/IHsgZmlsZSwgLi4uZnJvbnRtYXR0ZXIgfSA6IHsgZmlsZSB9O1xyXG4gIH0pO1xyXG5cclxuICBkYi5lbmQxRyh7IGZyb250bXMgfSk7XHJcbiAgcmV0dXJuIGZyb250bXM7XHJcbn1cclxuXHJcbmNvbnN0IGlzRFZQcm94eSA9IChpdGVtOiBSYXdWYWx1ZSkgPT4gdHlwZW9mIGl0ZW0uZGVmYXVsdENvbXBhcmF0b3IgPT09IFwiZnVuY3Rpb25cIlxyXG5cclxuLyoqXHJcbiAqIEtlZXAgdW53cmFwcGluZyBhIHByb3hpZWQgaXRlbSB1bnRpbCBpdCBpc24ndCBvbmUgYW55bW9yZVxyXG4gKiBAcGFyYW0gIHtSYXdWYWx1ZX0gaXRlbVxyXG4gKi9cclxuZnVuY3Rpb24gdW5wcm94eShpdGVtOiBSYXdWYWx1ZSkge1xyXG4gIGNvbnN0IHVucHJveGllZCA9IFtdO1xyXG4gIGNvbnN0IHF1ZXVlID0gW2l0ZW1dO1xyXG5cclxuICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjdXJySXRlbSA9IHF1ZXVlLnNoaWZ0KCk7XHJcblxyXG4gICAgaWYgKGlzRFZQcm94eShjdXJySXRlbSkpIHF1ZXVlLnB1c2goLi4uY3Vyckl0ZW0udmFsdWVzKTtcclxuICAgIGVsc2UgdW5wcm94aWVkLnB1c2goY3Vyckl0ZW0pO1xyXG4gIH1cclxuICByZXR1cm4gdW5wcm94aWVkO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEdpdmVuIGEgYGR2Q2FjaGVbZmllbGRdYCB2YWx1ZSwgcGFyc2UgdGhlIGxpbmsocykgb3V0IG9mIGl0XHJcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBzdHJpbmdbXVtdIHwgZHZMaW5rIHwgZHZMaW5rW10gfCBQb3MgfCBURmlsZX0gdmFsdWVcclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlRmllbGRWYWx1ZShcclxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCBzdHJpbmdbXVtdIHwgZHZMaW5rIHwgZHZMaW5rW10gfCBQb3MgfCBURmlsZVxyXG4pIHtcclxuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XHJcblxyXG5cclxuICBjb25zdCBwYXJzZWQ6IHN0cmluZ1tdID0gW107XHJcbiAgdHJ5IHtcclxuXHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGNvbnN0IHNwbGl0cyA9IHZhbHVlLm1hdGNoKHNwbGl0TGlua3NSZWdleCk7XHJcblxyXG4gICAgICBpZiAoc3BsaXRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgbGlua05hbWVzID0gc3BsaXRzLm1hcCgobGluaykgPT4gZ2V0QmFzZUZyb21NRFBhdGgobGluay5tYXRjaChkcm9wSGVhZGVyT3JBbGlhcylbMV0pKTtcclxuICAgICAgICBwYXJzZWQucHVzaCguLi5saW5rTmFtZXMpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByYXdWYWx1ZXM6IFJhd1ZhbHVlW10gPSBbdmFsdWVdLmZsYXQoNCk7XHJcbiAgICAgIGRlYnVnKC4uLnJhd1ZhbHVlcyk7XHJcblxyXG4gICAgICByYXdWYWx1ZXMuZm9yRWFjaCgocmF3SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICghcmF3SXRlbSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCB1blByb3hpZWQgPSB1bnByb3h5KHJhd0l0ZW0pO1xyXG4gICAgICAgIHVuUHJveGllZC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgcmF3QXNTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb25zdCBzcGxpdHMgPSByYXdBc1N0cmluZy5tYXRjaChzcGxpdExpbmtzUmVnZXgpO1xyXG4gICAgICAgICAgICBpZiAoc3BsaXRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3RycyA9IHNwbGl0cy5tYXAoKGxpbmspID0+XHJcbiAgICAgICAgICAgICAgICBnZXRCYXNlRnJvbU1EUGF0aChsaW5rLm1hdGNoKGRyb3BIZWFkZXJPckFsaWFzKVsxXSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHBhcnNlZC5wdXNoKC4uLnN0cnMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gZ2V0QmFzZUZyb21NRFBhdGgocmF3QXNTdHJpbmcpO1xyXG4gICAgICAgICAgICAgIHBhcnNlZC5wdXNoKGJhc2VuYW1lLnNwbGl0KFwiI1wiKVswXS5zcGxpdChcInxcIilbMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IGdldEJhc2VGcm9tTURQYXRoKHZhbHVlLnBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoYmFzZW5hbWUgIT09IHVuZGVmaW5lZCkgcGFyc2VkLnB1c2goYmFzZW5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBlcnJvcihlcnIpO1xyXG4gICAgcmV0dXJuIHBhcnNlZDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1haW5HKHBsdWdpbjogQkNQbHVnaW4pOiBQcm9taXNlPE11bHRpR3JhcGg+IHtcclxuICBjb25zdCBtYWluRyA9IG5ldyBNdWx0aUdyYXBoKCk7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgc2V0dGluZ3MsIGRiIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7IHVzZXJIaWVycywgQ1NWUGF0aHMsIHBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbCwgaGllcmFyY2h5Tm90ZXMgfSA9XHJcbiAgICAgIHNldHRpbmdzO1xyXG4gICAgZGIuc3RhcnQyRyhcImluaXRHcmFwaHNcIik7XHJcblxyXG4gICAgaWYgKHVzZXJIaWVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgZGIuZW5kMkcoKTtcclxuICAgICAgbmV3IE5vdGljZShcIllvdSBkbyBub3QgaGF2ZSBhbnkgQnJlYWRjcnVtYnMgaGllcmFyY2hpZXMgc2V0IHVwLlwiKTtcclxuICAgICAgcmV0dXJuIG1haW5HO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbGVzID0gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuICAgIGNvbnN0IGR2USA9IGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhcImRhdGF2aWV3XCIpO1xyXG5cclxuICAgIGxldCBmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSA9IGR2UVxyXG4gICAgICA/IGdldERWTWV0YWRhdGFDYWNoZShwbHVnaW4pXHJcbiAgICAgIDogZ2V0T2JzTWV0YWRhdGFDYWNoZShwbHVnaW4sIGZpbGVzKTtcclxuXHJcbiAgICAvLyBpZiAoZnJvbnRtcy5zb21lKChmcm9udG0pID0+IGZyb250bSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgLy8gICBhd2FpdCB3YWl0KDIwMDApO1xyXG4gICAgLy8gICBmcm9udG1zID0gZHZRXHJcbiAgICAvLyAgICAgPyBnZXREVk1ldGFkYXRhQ2FjaGUocGx1Z2luKVxyXG4gICAgLy8gICAgIDogZ2V0T2JzTWV0YWRhdGFDYWNoZShwbHVnaW4sIGZpbGVzKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBjb25zdCBDU1ZSb3dzID0gQ1NWUGF0aHMgIT09IFwiXCIgPyBhd2FpdCBnZXRDU1ZSb3dzKHBsdWdpbikgOiBbXTtcclxuXHJcbiAgICBjb25zdCBlbGlnYWJsZUFsdHM6IHsgW2FsdEZpZWxkOiBzdHJpbmddOiBkdkZyb250bWF0dGVyQ2FjaGVbXSB9ID0ge307XHJcbiAgICBCQ19BTFRTLmZvckVhY2goKGFsdCkgPT4gKGVsaWdhYmxlQWx0c1thbHRdID0gW10pKTtcclxuXHJcbiAgICBkYi5zdGFydDJHKFwiYWRkRnJvbnRtYXR0ZXJUb0dyYXBoXCIpO1xyXG4gICAgZnJvbnRtcy5mb3JFYWNoKChwYWdlKSA9PiB7XHJcbiAgICAgIEJDX0FMVFMuZm9yRWFjaCgoYWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHBhZ2VbYWx0XSAhPT0gdW5kZWZpbmVkICYmIHBhZ2VbYWx0XSAhPT0gbnVsbClcclxuICAgICAgICAgIGVsaWdhYmxlQWx0c1thbHRdLnB1c2gocGFnZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKHBhZ2UuZmlsZSk7XHJcbiAgICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gZ2V0U291cmNlT3JkZXIocGFnZSk7XHJcblxyXG4gICAgICBpdGVyYXRlSGllcnModXNlckhpZXJzLCAoaGllciwgZGlyLCBmaWVsZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcnNlRmllbGRWYWx1ZShwYWdlW2ZpZWxkXSk7XHJcblxyXG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aChcIjwlXCIpIHx8IHRhcmdldC5zdGFydHNXaXRoKFwie3tcIikpIHJldHVybjtcclxuICAgICAgICAgIGNvbnN0IHRhcmdldE9yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgdGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgICBtYWluRyxcclxuICAgICAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgICB0YXJnZXRPcmRlclxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoQ1NWUm93cy5sZW5ndGgpIGFkZENTVkNydW1icyhtYWluRywgQ1NWUm93cywgZGlyLCBmaWVsZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGIuZW5kMkcoKTtcclxuXHJcbiAgICAvLyBTRUNUSU9OICBKdWdnbCBMaW5rc1xyXG4gICAgY29uc3QganVnZ2xMaW5rcyA9XHJcbiAgICAgIGFwcC5wbHVnaW5zLnBsdWdpbnMuanVnZ2wgfHwgcGFyc2VKdWdnbExpbmtzV2l0aG91dEp1Z2dsXHJcbiAgICAgICAgPyBhd2FpdCBnZXRKdWdnbExpbmtzKHBsdWdpbiwgZmlsZXMpXHJcbiAgICAgICAgOiBbXTtcclxuXHJcbiAgICBpZiAoanVnZ2xMaW5rcy5sZW5ndGgpXHJcbiAgICAgIGFkZEp1Z2dsTGlua3NUb0dyYXBoKHNldHRpbmdzLCBqdWdnbExpbmtzLCBmcm9udG1zLCBtYWluRyk7XHJcblxyXG4gICAgLy8gIVNFQ1RJT04gIEp1Z2dsIExpbmtzXHJcblxyXG4gICAgZGIuc3RhcnQyRyhcIkFsdGVybmF0aXZlIEhpZXJhcmNoaWVzXCIpO1xyXG4gICAgLy8gU0VDVElPTiAgSGllcmFyY2h5IE5vdGVzXHJcbiAgICBkYi5zdGFydDJHKFwiSGllcmFyY2h5IE5vdGVzXCIpO1xyXG5cclxuICAgIGlmIChoaWVyYXJjaHlOb3Rlcy5sZW5ndGgpIHtcclxuICAgICAgZm9yIChjb25zdCBub3RlT3JGb2xkZXIgb2YgaGllcmFyY2h5Tm90ZXMpIHtcclxuICAgICAgICBpZiAobm90ZU9yRm9sZGVyLmVuZHNXaXRoKFwiL1wiKSkge1xyXG4gICAgICAgICAgY29uc3QgZm9sZGVyID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChcclxuICAgICAgICAgICAgbm9ybWFsaXplUGF0aChub3RlT3JGb2xkZXIpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGlmICghKGZvbGRlciBpbnN0YW5jZW9mIFRGb2xkZXIpKSBjb250aW51ZTtcclxuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZm9sZGVyLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcbiAgICAgICAgICAgICAgYWRkSE5zVG9HcmFwaChcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zKGNoaWxkKSxcclxuICAgICAgICAgICAgICAgIG1haW5HXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm90ZU9yRm9sZGVyLCBcIlwiKTtcclxuICAgICAgICAgIGlmIChmaWxlKVxyXG4gICAgICAgICAgICBhZGRITnNUb0dyYXBoKFxyXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgICAgIGF3YWl0IGdldEhpZXJhcmNoeU5vdGVJdGVtcyhmaWxlKSxcclxuICAgICAgICAgICAgICBtYWluR1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICAvLyAhU0VDVElPTiAgSGllcmFyY2h5IE5vdGVzXHJcblxyXG4gICAgZGIuc3RhcnQyRyhcIkZvbGRlciBOb3Rlc1wiKTtcclxuICAgIGFkZEZvbGRlck5vdGVzVG9HcmFwaChwbHVnaW4sIGVsaWdhYmxlQWx0c1tCQ19GT0xERVJfTk9URV0sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiVGFnIE5vdGVzXCIpO1xyXG4gICAgYWRkVGFnTm90ZXNUb0dyYXBoKHBsdWdpbiwgZWxpZ2FibGVBbHRzW0JDX1RBR19OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJMaW5rIE5vdGVzXCIpO1xyXG4gICAgYWRkTGlua05vdGVzVG9HcmFwaChwbHVnaW4sIGVsaWdhYmxlQWx0c1tCQ19MSU5LX05PVEVdLCBmcm9udG1zLCBtYWluRyk7XHJcbiAgICBkYi5lbmQyRygpO1xyXG4gICAgZGIuc3RhcnQyRyhcIlJlZ2V4IE5vdGVzXCIpO1xyXG4gICAgYWRkUmVnZXhOb3Rlc1RvR3JhcGgocGx1Z2luLCBlbGlnYWJsZUFsdHNbQkNfUkVHRVhfTk9URV0sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICAvLyBwbHVnaW4uYWRkTmFtaW5nU3lzdGVtTm90ZXNUb0dyYXBoKGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJUcmF2ZXJzZSBOb3Rlc1wiKTtcclxuICAgIGFkZFRyYXZlcnNlTm90ZXNUb0dyYXBoKFxyXG4gICAgICBwbHVnaW4sXHJcbiAgICAgIGVsaWdhYmxlQWx0c1tCQ19UUkFWRVJTRV9OT1RFXSxcclxuICAgICAgbWFpbkcsXHJcbiAgICAgIGJ1aWxkT2JzR3JhcGgoKVxyXG4gICAgKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiRGVuZHJvbiBOb3Rlc1wiKTtcclxuICAgIGFkZERlbmRyb25Ob3Rlc1RvR3JhcGgocGx1Z2luLCBmcm9udG1zLCBtYWluRyk7XHJcbiAgICBkYi5lbmQyRygpO1xyXG4gICAgZGIuc3RhcnQyRyhcIkRhdGF2aWV3IE5vdGVzXCIpO1xyXG4gICAgYWRkRGF0YXZpZXdOb3Rlc1RvR3JhcGgocGx1Z2luLCBlbGlnYWJsZUFsdHNbQkNfRFZfTk9URV0sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiRGF0ZSBOb3Rlc1wiKTtcclxuICAgIGFkZERhdGVOb3Rlc1RvR3JhcGgocGx1Z2luLCBmcm9udG1zLCBtYWluRyk7XHJcbiAgICBkYi5lbmQyRygpO1xyXG5cclxuICAgIGRiLmVuZDJHKCk7XHJcblxyXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4gYWRkTm9kZXNJZk5vdChtYWluRywgW2ZpbGUuYmFzZW5hbWVdKSk7XHJcbiAgICBkYi5lbmQyRyhcImdyYXBocyBpbml0ZWRcIiwgeyBtYWluRyB9KTtcclxuICAgIHJldHVybiBtYWluRztcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGVycm9yKGVycik7XHJcbiAgICBwbHVnaW4uZGIuZW5kMkcoKTtcclxuICAgIHJldHVybiBtYWluRztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZENsb3NlZEcocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGNvbnN0IHsgbWFpbkcsIHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3Qge1xyXG4gICAgdXNlckhpZXJzLFxyXG4gICAgaW1wbGllZFJlbGF0aW9uczoge1xyXG4gICAgICBzYW1lUGFyZW50SXNTaWJsaW5nLFxyXG4gICAgICBwYXJlbnRzU2libGluZ3NJc1BhcmVudHMsXHJcbiAgICAgIGNvdXNpbnNJc1NpYmxpbmcsXHJcbiAgICAgIHNpYmxpbmdzU2libGluZ0lzU2libGluZyxcclxuICAgICAgc2libGluZ3NQYXJlbnRJc1BhcmVudCxcclxuICAgIH0sXHJcbiAgfSA9IHNldHRpbmdzO1xyXG4gIGxldCBjbG9zZWRHID0gZ2V0UmVmbGV4aXZlQ2xvc3VyZShtYWluRywgdXNlckhpZXJzKTtcclxuXHJcbiAgaWYgKHNhbWVQYXJlbnRJc1NpYmxpbmcpIGFkZFNpYmxpbmdzRnJvbVNhbWVQYXJlbnQoY2xvc2VkRywgc2V0dGluZ3MpO1xyXG4gIGlmIChzaWJsaW5nc1BhcmVudElzUGFyZW50KSBhZGRTaWJsaW5nc1BhcmVudElzUGFyZW50KGNsb3NlZEcpO1xyXG4gIGlmIChwYXJlbnRzU2libGluZ3NJc1BhcmVudHMpIGFkZEF1bnRzVW5jbGVzKGNsb3NlZEcpO1xyXG4gIGlmIChjb3VzaW5zSXNTaWJsaW5nKSBhZGRDb3VzaW5zKGNsb3NlZEcpO1xyXG4gIGlmIChzaWJsaW5nc1NpYmxpbmdJc1NpYmxpbmcpIGFkZFN0cnVjdHVyYWxFcXVpdmFsZW5jZVNpYmxpbmdzKGNsb3NlZEcpO1xyXG5cclxuICByZXR1cm4gY2xvc2VkRztcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hJbmRleChwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgaWYgKCFwbHVnaW4uYWN0aXZlTGVhZkNoYW5nZSkgcGx1Z2luLnJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCk7XHJcbiAgaWYgKCFwbHVnaW4ubGF5b3V0Q2hhbmdlKSBwbHVnaW4ucmVnaXN0ZXJMYXlvdXRDaGFuZ2VFdmVudCgpO1xyXG5cclxuICBwbHVnaW4ubWFpbkcgPSBhd2FpdCBidWlsZE1haW5HKHBsdWdpbik7XHJcbiAgcGx1Z2luLmNsb3NlZEcgPSBidWlsZENsb3NlZEcocGx1Z2luKTtcclxuXHJcbiAgZm9yIChjb25zdCB7IHR5cGUgfSBvZiBwbHVnaW4uVklFV1MpXHJcbiAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcodHlwZSk/LmRyYXcoKTtcclxuXHJcbiAgaWYgKHBsdWdpbi5zZXR0aW5ncy5zaG93QkNzKSBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICBpZiAocGx1Z2luLnNldHRpbmdzLnNob3dSZWZyZXNoTm90aWNlKSBuZXcgTm90aWNlKFwiQkMgSW5kZXggcmVmcmVzaGVkXCIpO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBub3JtYWxpemVQYXRoIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRyb3BXaWtpbGlua3MgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgdHlwZSB7IERpcmVjdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBhZGRFZGdlSWZOb3QsIGFkZE5vZGVzSWZOb3QgfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENTVlJvd3MocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGNvbnN0IHsgQ1NWUGF0aHMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuICBjb25zdCBDU1ZSb3dzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10gPSBbXTtcclxuICBpZiAoQ1NWUGF0aHMgPT09IFwiXCIpIHJldHVybiBDU1ZSb3dzO1xyXG5cclxuICBjb25zdCBmdWxsUGF0aCA9IG5vcm1hbGl6ZVBhdGgoQ1NWUGF0aHMpO1xyXG5cclxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChmdWxsUGF0aCk7XHJcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICBjb25zdCBoZWFkZXJzID0gbGluZXNbMF0uc3BsaXQoXCIsXCIpLm1hcCgoaGVhZCkgPT4gaGVhZC50cmltKCkpO1xyXG4gIGxpbmVzLnNsaWNlKDEpLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgY29uc3Qgcm93T2JqID0ge307XHJcbiAgICByb3dcclxuICAgICAgLnNwbGl0KFwiLFwiKVxyXG4gICAgICAubWFwKChoZWFkKSA9PiBkcm9wV2lraWxpbmtzKGhlYWQudHJpbSgpKSlcclxuICAgICAgLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICByb3dPYmpbaGVhZGVyc1tpXV0gPSBpdGVtO1xyXG4gICAgICB9KTtcclxuICAgIGRlYnVnKHsgcm93T2JqIH0pO1xyXG4gICAgQ1NWUm93cy5wdXNoKHJvd09iaik7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIENTVlJvd3M7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRDU1ZDcnVtYnMoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBDU1ZSb3dzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10sXHJcbiAgZGlyOiBEaXJlY3Rpb25zLFxyXG4gIGZpZWxkOiBzdHJpbmdcclxuKSB7XHJcbiAgQ1NWUm93cy5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgIGFkZE5vZGVzSWZOb3QoZywgW3Jvdy5maWxlXSk7XHJcbiAgICBpZiAoZmllbGQgPT09IFwiXCIgfHwgIXJvd1tmaWVsZF0pIHJldHVybjtcclxuXHJcbiAgICBhZGROb2Rlc0lmTm90KGcsIFtyb3dbZmllbGRdXSk7XHJcbiAgICBhZGRFZGdlSWZOb3QoZywgcm93LmZpbGUsIHJvd1tmaWVsZF0sIHsgZGlyLCBmaWVsZCB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQge1xyXG4gIEZyb250TWF0dGVyQ2FjaGUsXHJcbiAgcGFyc2VZYW1sLFxyXG4gIHN0cmluZ2lmeVlhbWwsXHJcbiAgVEZpbGUsXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7XHJcbiAgaXNJblZhdWx0LFxyXG4gIHdhaXQsXHJcbiAgd2FpdEZvclJlc29sdmVkTGlua3MsXHJcbn0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG5pbXBvcnQgdHlwZSB7IE1ldGFlZGl0QXBpIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4vZ2VuZXJhbFV0aWxzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0U2V0dGluZ3MgPSAoKSA9PiBhcHAucGx1Z2lucy5wbHVnaW5zLmJyZWFkY3J1bWJzLnNldHRpbmdzXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Q3VyckZpbGUgPSAoKTogVEZpbGUgfCBudWxsID0+IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpXHJcblxyXG4vKipcclxuICogR2V0IGJhc2VuYW1lIGZyb20gYSAqKk1hcmtkb3duKiogYHBhdGhgXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gcGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldEJhc2VGcm9tTURQYXRoID0gKHBhdGg6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHNwbGl0U2xhc2ggPSBwYXRoLnNwbGl0KFwiL1wiKS5sYXN0KCk7XHJcbiAgaWYgKHNwbGl0U2xhc2guZW5kc1dpdGgoXCIubWRcIikpIHtcclxuICAgIHJldHVybiBzcGxpdFNsYXNoLnNwbGl0KFwiLm1kXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiLlwiKTtcclxuICB9IGVsc2UgcmV0dXJuIHNwbGl0U2xhc2g7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RFZCYXNlbmFtZSA9IChmaWxlOiBURmlsZSkgPT4gZmlsZS5iYXNlbmFtZSB8fCBmaWxlLm5hbWU7XHJcbmV4cG9ydCBjb25zdCBnZXRGb2xkZXJOYW1lID0gKGZpbGU6IFRGaWxlKTogc3RyaW5nID0+XHJcbiAgLy9AdHMtaWdub3JlXHJcbiAgZmlsZT8ucGFyZW50Py5uYW1lIHx8IGZpbGUuZm9sZGVyO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VXaWtpKHN0cjogc3RyaW5nLCB3aWtpUSA9IHRydWUpIHtcclxuICBsZXQgY29weSA9IHN0ci5zbGljZSgpO1xyXG4gIGlmICh3aWtpUSkge1xyXG4gICAgY29weSA9IFwiW1tcIiArIGNvcHk7XHJcbiAgICBjb3B5ICs9IFwiXV1cIjtcclxuICB9XHJcbiAgcmV0dXJuIGNvcHk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkcm9wV2lraWxpbmtzKHN0cjogc3RyaW5nKSB7XHJcbiAgbGV0IGNvcHkgPSBzdHIuc2xpY2UoKTtcclxuICBpZiAoY29weS5zdGFydHNXaXRoKFwiW1tcIikgJiYgY29weS5lbmRzV2l0aChcIl1dXCIpKSBjb3B5ID0gY29weS5zbGljZSgyLCAtMik7XHJcbiAgcmV0dXJuIGNvcHk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGRzIG9yIHVwZGF0ZXMgdGhlIGdpdmVuIHlhbWwgYGtleWAgdG8gYHZhbHVlYCBpbiB0aGUgZ2l2ZW4gVEZpbGVcclxuICogQHBhcmFtICB7c3RyaW5nfSBrZXlcclxuICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZVxyXG4gKiBAcGFyYW0gIHtURmlsZX0gZmlsZVxyXG4gKiBAcGFyYW0gIHtGcm9udE1hdHRlckNhY2hlfHVuZGVmaW5lZH0gZnJvbnRtYXR0ZXJcclxuICogQHBhcmFtICB7TWV0YWVkaXRBcGl9IGFwaVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZU9yVXBkYXRlWWFtbCA9IGFzeW5jIChcclxuICBrZXk6IHN0cmluZyxcclxuICB2YWx1ZTogc3RyaW5nLFxyXG4gIGZpbGU6IFRGaWxlLFxyXG4gIGZyb250bWF0dGVyOiBGcm9udE1hdHRlckNhY2hlIHwgdW5kZWZpbmVkLFxyXG4gIGFwaTogTWV0YWVkaXRBcGlcclxuKSA9PiB7XHJcbiAgY29uc3QgdmFsdWVTdHIgPSB2YWx1ZS50b1N0cmluZygpO1xyXG5cclxuICBpZiAoIWZyb250bWF0dGVyIHx8IGZyb250bWF0dGVyW2tleV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgaW5mbyhgQ3JlYXRpbmc6ICR7a2V5fTogJHt2YWx1ZVN0cn1gKTtcclxuICAgIGF3YWl0IGFwaS5jcmVhdGVZYW1sUHJvcGVydHkoa2V5LCBgWycke3ZhbHVlU3RyfSddYCwgZmlsZSk7XHJcbiAgfSBlbHNlIGlmIChbLi4uW2Zyb250bWF0dGVyW2tleV1dXS5mbGF0KDMpLnNvbWUoKHZhbCkgPT4gdmFsID09IHZhbHVlU3RyKSkge1xyXG4gICAgaW5mbyhcIkFscmVhZHkgRXhpc3RzIVwiKTtcclxuICAgIHJldHVybjtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3Qgb2xkVmFsdWVGbGF0OiBzdHJpbmdbXSA9IFsuLi5bZnJvbnRtYXR0ZXJba2V5XV1dLmZsYXQoNCk7XHJcbiAgICBjb25zdCBuZXdWYWx1ZSA9IFsuLi5vbGRWYWx1ZUZsYXQsIGAnJHt2YWx1ZVN0cn0nYF07XHJcbiAgICBpbmZvKGBVcGRhdGluZzogJHtrZXl9OiAke25ld1ZhbHVlfWApO1xyXG4gICAgYXdhaXQgYXBpLnVwZGF0ZShrZXksIGBbJHtuZXdWYWx1ZS5qb2luKFwiLCBcIil9XWAsIGZpbGUpO1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VZYW1sKHlhbWw6IHN0cmluZywga2V5OiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBpZiAoeWFtbCA9PT0gXCJcIikge1xyXG4gICAgcmV0dXJuIGAke2tleX06IFsnJHtuZXdWYWx9J11gO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBwYXJzZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSBwYXJzZVlhbWwoeWFtbCk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlZFtrZXldO1xyXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcGFyc2VkW2tleV0gPSBuZXdWYWw7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSAhPT0gbmV3VmFsKSB7XHJcbiAgICAgIHBhcnNlZFtrZXldID0gW3ZhbHVlLCBuZXdWYWxdO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdHlwZW9mIHZhbHVlPy5bMF0gPT09IFwic3RyaW5nXCIgJiZcclxuICAgICAgdmFsdWUuaW5jbHVkZXMgJiZcclxuICAgICAgIXZhbHVlLmluY2x1ZGVzKG5ld1ZhbClcclxuICAgICkge1xyXG4gICAgICBwYXJzZWRba2V5XSA9IFsuLi52YWx1ZSwgbmV3VmFsXTtcclxuICAgIH1cclxuICAgIC8vIGVsc2UgaWYgKG90aGVyIHR5cGVzIG9mIHZhbHVlcy4uLilcclxuICAgIHJldHVybiBzdHJpbmdpZnlZYW1sKHBhcnNlZCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRBdFlhbWwoY29udGVudDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XHJcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoXCItLS1cXG5cIikpIHJldHVybiBbXCJcIiwgY29udGVudF07XHJcbiAgZWxzZSB7XHJcbiAgICBjb25zdCBzcGxpdHMgPSBjb250ZW50LnNwbGl0KFwiLS0tXCIpO1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgc3BsaXRzLnNsaWNlKDAsIDIpLmpvaW4oXCItLS1cIikgKyBcIi0tLVwiLFxyXG4gICAgICBzcGxpdHMuc2xpY2UoMikuam9pbihcIi0tLVwiKSxcclxuICAgIF07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZHJvcEhhc2ggPSAodGFnOiBzdHJpbmcpID0+XHJcbiAgdGFnLnN0YXJ0c1dpdGgoXCIjXCIpID8gdGFnLnNsaWNlKDEpIDogdGFnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGFkZEhhc2ggPSAodGFnOiBzdHJpbmcpID0+ICh0YWcuc3RhcnRzV2l0aChcIiNcIikgPyB0YWcgOiBgIyR7dGFnfWApO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsdChub2RlOiBzdHJpbmcsIHBsdWdpbjogQkNQbHVnaW4pOiBzdHJpbmcgfCBudWxsIHtcclxuICBjb25zdCB7IGFsdExpbmtGaWVsZHMsIHNob3dBbGxBbGlhc2VzIH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbiAgaWYgKGFsdExpbmtGaWVsZHMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm9kZSwgXCJcIik7XHJcbiAgICBpZiAoZmlsZSkge1xyXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICAgICAgZm9yIChjb25zdCBhbHRGaWVsZCBvZiBhbHRMaW5rRmllbGRzKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXRhZGF0YT8uZnJvbnRtYXR0ZXI/LlthbHRGaWVsZF07XHJcblxyXG4gICAgICAgIGNvbnN0IGFycjogc3RyaW5nW10gPVxyXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gc3BsaXRBbmRUcmltKHZhbHVlKSA6IHZhbHVlO1xyXG4gICAgICAgIGlmICh2YWx1ZSkgcmV0dXJuIHNob3dBbGxBbGlhc2VzID8gYXJyLmpvaW4oXCIsIFwiKSA6IGFyclswXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDYWNoZShwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgaWYgKGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhcImRhdGF2aWV3XCIpKSB7XHJcbiAgICBsZXQgYmFzZW5hbWU6IHN0cmluZztcclxuICAgIHdoaWxlICghYmFzZW5hbWUgfHwgIWFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXcuYXBpLnBhZ2UoYmFzZW5hbWUpKSB7XHJcbiAgICAgIGF3YWl0IHdhaXQoMTAwKTtcclxuICAgICAgYmFzZW5hbWUgPSBnZXRDdXJyRmlsZSgpPy5iYXNlbmFtZTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgYXdhaXQgd2FpdEZvclJlc29sdmVkTGlua3MoYXBwKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBsaW5rQ2xhc3MgPSAodG86IHN0cmluZywgcmVhbFEgPSB0cnVlKSA9PlxyXG4gIGBpbnRlcm5hbC1saW5rIEJDLUxpbmsgJHtpc0luVmF1bHQodG8pID8gXCJcIiA6IFwiaXMtdW5yZXNvbHZlZFwifSAke3JlYWxRID8gXCJcIiA6IFwiQkMtSW1wbGllZFwiXHJcbiAgfWA7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RFZBcGkgPSAocGx1Z2luOiBCQ1BsdWdpbikgPT5cclxuICBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3Py5hcGk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJbnNpZGVZYW1sKCk6IGJvb2xlYW4gfCBudWxsIHtcclxuICBjb25zdCB7IHdvcmtzcGFjZSwgbWV0YWRhdGFDYWNoZSB9ID0gYXBwO1xyXG4gIGNvbnN0IHsgYWN0aXZlTGVhZiB9ID0gd29ya3NwYWNlO1xyXG4gIGNvbnN0IHtcclxuICAgIHN0YXRlOiB7IG1vZGUgfSxcclxuICB9ID0gYWN0aXZlTGVhZi5nZXRWaWV3U3RhdGUoKTtcclxuXHJcbiAgaWYgKG1vZGUgIT09IFwic291cmNlXCIpIHJldHVybiBudWxsO1xyXG5cclxuICBjb25zdCB7IGVkaXRvciB9ID0gYWN0aXZlTGVhZi52aWV3O1xyXG5cclxuICBjb25zdCBmaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICBpZiAoIWZpbGUpIHJldHVybiBudWxsO1xyXG5cclxuICBjb25zdCB7IGZyb250bWF0dGVyIH0gPSBtZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gZnJvbnRtYXR0ZXIucG9zaXRpb247XHJcbiAgY29uc3QgY3Vyck9mZiA9IGVkaXRvci5wb3NUb09mZnNldChlZGl0b3IuZ2V0Q3Vyc29yKCkpO1xyXG4gIGlmIChjdXJyT2ZmID49IHN0YXJ0Lm9mZnNldCAmJiBjdXJyT2ZmIDw9IGVuZC5vZmZzZXQpIHJldHVybiB0cnVlO1xyXG4gIGVsc2UgcmV0dXJuIGZhbHNlO1xyXG59XHJcbiIsICJpbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IGRyb3BIZWFkZXJPckFsaWFzLCByZWdORmxhZ3MsIHNwbGl0TGlua3NSZWdleCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdW0oYXJyOiBudW1iZXJbXSk6IG51bWJlciB7XHJcbiAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZShhcnI6IG51bWJlcltdKTogbnVtYmVyW10ge1xyXG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KC4uLmFycik7XHJcbiAgcmV0dXJuIGFyci5tYXAoKGl0ZW0pID0+IGl0ZW0gLyBtYXgpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNTdWJzZXQgPSA8VD4oYXJyMTogVFtdLCBhcnIyOiBUW10pOiBib29sZWFuID0+XHJcbiAgYXJyMS5ldmVyeSgodmFsdWUpID0+IGFycjIuaW5jbHVkZXModmFsdWUpKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEFuZERyb3Aoc3RyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgcmV0dXJuIChcclxuICAgIHN0clxyXG4gICAgICA/Lm1hdGNoKHNwbGl0TGlua3NSZWdleClcclxuICAgICAgPy5tYXAoKGxpbmspID0+IGxpbmsubWF0Y2goZHJvcEhlYWRlck9yQWxpYXMpPy5bMV0pID8/IFtdXHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRyb3BQYXRoID0gKHBhdGg6IHN0cmluZykgPT4gcGF0aC5yZXBsYWNlKC9eLipcXC8vLCBcIlwiKTtcclxuZXhwb3J0IGNvbnN0IGRyb3BEZW5kcm9uID0gKHBhdGg6IHN0cmluZywgc2V0dGluZ3M6IEJDU2V0dGluZ3MpID0+XHJcbiAgc2V0dGluZ3MudHJpbURlbmRyb25Ob3Rlc1xyXG4gICAgPyBwYXRoLnNwbGl0KHNldHRpbmdzLmRlbmRyb25Ob3RlRGVsaW1pdGVyKS5sYXN0KClcclxuICAgIDogcGF0aDtcclxuXHJcbmV4cG9ydCBjb25zdCBkcm9wUGF0aE5EZW5kcm9uID0gKHBhdGg6IHN0cmluZywgc2V0dGluZ3M6IEJDU2V0dGluZ3MpID0+XHJcbiAgZHJvcERlbmRyb24oZHJvcFBhdGgocGF0aCksIHNldHRpbmdzKTtcclxuXHJcbmV4cG9ydCBjb25zdCBkcm9wRm9sZGVyID0gKHBhdGg6IHN0cmluZykgPT5cclxuICBwYXRoLnNwbGl0KFwiL1wiKS5sYXN0KCkuc3BsaXQoXCIuXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiLlwiKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzcGxpdEFuZFRyaW0gPSAoZmllbGRzOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XHJcbiAgaWYgKCFmaWVsZHMgfHwgZmllbGRzID09PSBcIlwiKSByZXR1cm4gW107XHJcbiAgZWxzZSByZXR1cm4gZmllbGRzLnNwbGl0KFwiLFwiKS5tYXAoKHN0cikgPT4gc3RyLnRyaW0oKSk7XHJcbn07XHJcblxyXG4vKipcclxuICogUGFkIGFuIGFycmF5IHdpdGggYSBmaWxsZXIgdmFsdWUgdG8gYSBzcGVjaWZpZWQgbGVuZ3RoLlxyXG4gKiBAcGFyYW0ge1RbXX0gYXJyIC0gVGhlIGFycmF5IHRvIHBhZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGZpbmFsTGVuZ3RoIC0gVGhlIGZpbmFsIGxlbmd0aCBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtzdHJpbmd9IFtmaWxsZXI9XCJcIl0gLSBUaGUgZmlsbGVyIHRvIHVzZSBpZiB0aGUgYXJyYXkgaXMgdG9vIHNob3J0LlxyXG4gKiBAcmV0dXJucyB7KFQgfCBzdHJpbmcpW119IFRoZSBhcnJheSB3aXRoIHRoZSBuZXcgdmFsdWVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhZEFycmF5PFQ+KFxyXG4gIGFycjogVFtdLFxyXG4gIGZpbmFsTGVuZ3RoOiBudW1iZXIsXHJcbiAgZmlsbGVyOiBzdHJpbmcgPSBcIlwiXHJcbik6IChUIHwgc3RyaW5nKVtdIHtcclxuICBjb25zdCBjb3B5OiAoVCB8IHN0cmluZylbXSA9IFsuLi5hcnJdO1xyXG4gIGNvbnN0IGN1cnJMZW5ndGggPSBjb3B5Lmxlbmd0aDtcclxuICBpZiAoY3Vyckxlbmd0aCA+IGZpbmFsTGVuZ3RoKVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ3VycmVudCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGZpbmFsIGxlbmd0aFwiKTtcclxuICBlbHNlIGlmIChjdXJyTGVuZ3RoID09PSBmaW5hbExlbmd0aCkgcmV0dXJuIGNvcHk7XHJcbiAgZWxzZSB7XHJcbiAgICBmb3IgKGxldCBpID0gY3Vyckxlbmd0aDsgaSA8IGZpbmFsTGVuZ3RoOyBpKyspIGNvcHkucHVzaChmaWxsZXIpO1xyXG4gICAgcmV0dXJuIGNvcHk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogdHJhbnNwb3NlKEEpIHJldHVybnMgdGhlIHRyYW5zcG9zZSBvZiBBLlxyXG4gKiBAcGFyYW0ge1RbXVtdfSBBIC0gVGhlIG1hdHJpeCB0byB0cmFuc3Bvc2UuXHJcbiAqIEByZXR1cm5zIHtUW11bXX0gQSAyRCBhcnJheSBvZiB0aGUgdHJhbnNwb3NlZCBtYXRyaXguXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlPFQ+KEE6IFRbXVtdKTogVFtdW10ge1xyXG4gIGNvbnN0IGNvbHMgPSBBWzBdLmxlbmd0aDtcclxuICBjb25zdCBBVDogVFtdW10gPSBbXTtcclxuXHJcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyspIEFULnB1c2goQS5tYXAoKHJvdykgPT4gcm93W2pdKSk7XHJcblxyXG4gIHJldHVybiBBVDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdpdmVuIGFuIGFycmF5IG9mIHN0cmluZ3MsIHJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHRoZSBydW5zIG9mIGNvbnNlY3V0aXZlIHN0cmluZ3NcclxuICogaW4gdGhlIGFycmF5LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJyXHJcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XHJcbiAqXHJcbiAqICAgYHZhbHVlYDogdGhlIHZhbHVlIG9mIHRoZSBydW5cclxuICpcclxuICogICBgZmlyc3RgOiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHJ1blxyXG4gKlxyXG4gKiAgIGBsYXN0YDogdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHJ1blxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJ1bnMoXHJcbiAgYXJyOiBzdHJpbmdbXVxyXG4pOiB7IHZhbHVlOiBzdHJpbmc7IGZpcnN0OiBudW1iZXI7IGxhc3Q6IG51bWJlciB9W10ge1xyXG4gIGNvbnN0IHJ1bnM6IHsgdmFsdWU6IHN0cmluZzsgZmlyc3Q6IG51bWJlcjsgbGFzdDogbnVtYmVyIH1bXSA9IFtdO1xyXG4gIGxldCBpID0gMDtcclxuICB3aGlsZSAoaSA8IGFyci5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGN1cnJWYWx1ZSA9IGFycltpXTtcclxuICAgIHJ1bnMucHVzaCh7IHZhbHVlOiBjdXJyVmFsdWUsIGZpcnN0OiBpLCBsYXN0OiB1bmRlZmluZWQgfSk7XHJcbiAgICB3aGlsZSAoY3VyclZhbHVlID09PSBhcnJbaV0pIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgcnVucy5sYXN0KCkubGFzdCA9IGkgLSAxO1xyXG4gIH1cclxuICByZXR1cm4gcnVucztcclxufVxyXG5cclxuLy8gU09VUkNFIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk5NjA5MDgvcGVybXV0YXRpb25zLWluLWphdmFzY3JpcHRcclxuLyoqXHJcbiAqIEdpdmVuIGEgcGVybXV0YXRpb24sIHJldHVybiBhbGwgcG9zc2libGUgcGVybXV0YXRpb25zIG9mIHRoYXQgcGVybXV0YXRpb24uXHJcbiAqIEBwYXJhbSBwZXJtdXRhdGlvbiAtIHRoZSBhcnJheSB0byBiZSBwZXJtdXRlZFxyXG4gKiBAcmV0dXJucyBgWyBbIDEsIDIsIDMgXSwgWyAxLCAzLCAyIF0sIFsgMiwgMSwgMyBdLCBbIDIsIDMsIDEgXSwgWyAzLCAxLCAyIF0sIFsgMywgMiwgMSBdIF1gXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGVybXV0ZShwZXJtdXRhdGlvbjogYW55W10pOiBhbnlbXVtdIHtcclxuICBjb25zdCBsZW5ndGggPSBwZXJtdXRhdGlvbi5sZW5ndGgsXHJcbiAgICByZXN1bHQgPSBbcGVybXV0YXRpb24uc2xpY2UoKV0sXHJcbiAgICBjID0gbmV3IEFycmF5KGxlbmd0aCkuZmlsbCgwKTtcclxuXHJcbiAgbGV0IGkgPSAxLFxyXG4gICAgazogbnVtYmVyLFxyXG4gICAgcDogbnVtYmVyO1xyXG5cclxuICB3aGlsZSAoaSA8IGxlbmd0aCkge1xyXG4gICAgaWYgKGNbaV0gPCBpKSB7XHJcbiAgICAgIGsgPSBpICUgMiAmJiBjW2ldO1xyXG4gICAgICBwID0gcGVybXV0YXRpb25baV07XHJcbiAgICAgIHBlcm11dGF0aW9uW2ldID0gcGVybXV0YXRpb25ba107XHJcbiAgICAgIHBlcm11dGF0aW9uW2tdID0gcDtcclxuICAgICAgKytjW2ldO1xyXG4gICAgICBpID0gMTtcclxuICAgICAgcmVzdWx0LnB1c2gocGVybXV0YXRpb24uc2xpY2UoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjW2ldID0gMDtcclxuICAgICAgKytpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgcmFuZ2UgPSAobjogbnVtYmVyKSA9PiBbLi4uQXJyYXkobikua2V5cygpXTtcclxuXHJcbi8qKlxyXG4gKiBcIkdpdmVuIHR3byBhcnJheXMsIHJldHVybiB0aGUgZWxlbWVudHMgaW4gdGhlIGZpcnN0IGFycmF5IHRoYXQgYXJlIG5vdCBpbiB0aGUgc2Vjb25kIGFycmF5LlwiXHJcbiAqIEBwYXJhbSB7VFtdfSBBIC0gdGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIGZpbHRlcmVkXHJcbiAqIEBwYXJhbSB7VFtdfSBCIC0gdGhlIGFycmF5IG9mIGl0ZW1zIHRoYXQgYXJlIG5vdCBpbiBBXHJcbiAqIEByZXR1cm5zIHtUW119IE5vbmVcclxuICovXHJcbmV4cG9ydCBjb25zdCBjb21wbGVtZW50ID0gPFQ+KEE6IFRbXSwgQjogVFtdKSA9PlxyXG4gIEEuZmlsdGVyKChhKSA9PiAhQi5pbmNsdWRlcyhhKSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3dhcEl0ZW1zPFQ+KGk6IG51bWJlciwgajogbnVtYmVyLCBhcnI6IFRbXSkge1xyXG4gIGNvbnN0IG1heCA9IGFyci5sZW5ndGggLSAxO1xyXG4gIGlmIChpIDwgMCB8fCBpID4gbWF4IHx8IGogPCAwIHx8IGogPiBtYXgpIHJldHVybiBhcnI7XHJcbiAgY29uc3QgdG1wID0gYXJyW2ldO1xyXG4gIGFycltpXSA9IGFycltqXTtcclxuICBhcnJbal0gPSB0bXA7XHJcbiAgcmV0dXJuIGFycjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSBkdXBsaWNhdGVzIGZyb20gYW4gYXJyYXkuXHJcbiAqIEBwYXJhbSB7VFtdfSBhcnIgLSBUaGUgYXJyYXkgdG8gYmUgZmlsdGVyZWQuXHJcbiAqIEByZXR1cm5zIHtUW119IFRoZSBhcnJheSB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC5cclxuICovXHJcbmV4cG9ydCBjb25zdCByZW1vdmVEdXBsaWNhdGVzID0gPFQ+KGFycjogVFtdKSA9PiBbLi4ubmV3IFNldChhcnIpXTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJUb1JlZ2V4KGlucHV0OiBzdHJpbmcpIHtcclxuICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKHJlZ05GbGFncyk7XHJcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XHJcbiAgY29uc3QgWywgaW5uZXJSZWdleCwgZmxhZ3NdID0gbWF0Y2g7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChpbm5lclJlZ2V4LCBmbGFncyk7XHJcbiAgICByZXR1cm4gcmVnZXg7XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgd2FybihlKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuLy8gU291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XHJcbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdleChzdHJpbmcpIHtcclxuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XHJcbn1cclxuIiwgImltcG9ydCBHcmFwaCwgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgZGZzRnJvbU5vZGUgfSBmcm9tIFwiZ3JhcGhvbG9neS10cmF2ZXJzYWxcIjtcclxuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVzIH0gZnJvbSBcImdyYXBob2xvZ3ktdHlwZXNcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0lfUkVGTEVYSVZFLFxyXG4gIEJDX09SREVSLFxyXG4gIGJsYW5rUmVhbE5JbXBsaWVkLFxyXG4gIERJUkVDVElPTlMsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgQkNTZXR0aW5ncyxcclxuICBEaXJlY3Rpb25zLFxyXG4gIGR2RnJvbnRtYXR0ZXJDYWNoZSxcclxuICBFZGdlQXR0cixcclxuICBOb2RlUGF0aCxcclxuICBSZWFsTkltcGxpZWQsXHJcbiAgVXNlckhpZXIsXHJcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRJbmZvLCBnZXRPcHBEaXIsIGdldE9wcEZpZWxkcyB9IGZyb20gXCIuL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRCYXNlRnJvbU1EUGF0aCB9IGZyb20gXCIuL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJlYWwgJiBpbXBsaWVkIGdyYXBocyBmb3IgYSBnaXZlbiByZWxhdGlvbiwgYW5kIHJldHVybnMgYSBuZXcgZ3JhcGhzIHdpdGggYm90aC5cclxuLy8gSXQgbWFrZXMgaW1wbGllZCByZWxhdGlvbnMgcmVhbFxyXG4vLyBUT0RPIHVzZSByZWZsZXhpdmVDbG9zdXJlIGluc3RlYWRcclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlSW1wbGllZExpbmtzKFxyXG4gIHJlYWw6IE11bHRpR3JhcGgsXHJcbiAgaW1wbGllZDogTXVsdGlHcmFwaFxyXG4pOiBNdWx0aUdyYXBoIHtcclxuICBjb25zdCBjbG9zZWRHID0gcmVhbC5jb3B5KCk7XHJcbiAgaW1wbGllZC5mb3JFYWNoRWRnZSgoa2V5LCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjbG9zZWRHLm1lcmdlRWRnZSh0LCBzLCBhKTtcclxuICB9KTtcclxuICByZXR1cm4gY2xvc2VkRztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5saW5rZWROb2RlcyhnOiBNdWx0aUdyYXBoKSB7XHJcbiAgY29uc3QgY29weSA9IGcuY29weSgpO1xyXG4gIGNvcHkuZm9yRWFjaE5vZGUoKG5vZGUpID0+IHtcclxuICAgIGlmICghY29weS5kZWdyZWUobm9kZSkpIGNvcHkuZHJvcE5vZGUobm9kZSk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGNvcHk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gYSBzdWJncmFwaCBvZiBhbGwgbm9kZXMgJiBlZGdlcyB3aXRoIGBkaXJzLmluY2x1ZGVzKGEuZGlyKWBcclxuICpcclxuICogRmlsdGVyIHRoZSBnaXZlbiBncmFwaCB0byBvbmx5IGluY2x1ZGUgZWRnZXMgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbnMuXHJcbiAqIEBwYXJhbSAge011bHRpR3JhcGh9IGdcclxuICogQHBhcmFtICB7RGlyZWN0aW9uc30gZGlyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViSW5EaXJzKGc6IE11bHRpR3JhcGgsIC4uLmRpcnM6IERpcmVjdGlvbnNbXSkge1xyXG4gIGNvbnN0IHN1YiA9IG5ldyBNdWx0aUdyYXBoKCk7XHJcbiAgZz8uZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGlmIChkaXJzLmluY2x1ZGVzKGEuZGlyKSkge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgYWRkTm9kZXNJZk5vdChzdWIsIFtzLCB0XSwgeyBvcmRlcjogYS5vcmRlciB9KTtcclxuICAgICAgc3ViLmFkZEVkZ2UocywgdCwgYSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHN1YjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhIHN1YmdyYXBoIG9mIGFsbCBub2RlcyAmIGVkZ2VzIHdpdGggYGZpZWxkcy5pbmNsdWRlcyhhLmZpZWxkKWAuXHJcbiAqXHJcbiAqIEZpbHRlciB0aGUgZ2l2ZW4gZ3JhcGggdG8gb25seSBpbmNsdWRlIGVkZ2VzIHdpdGggdGhlIGdpdmVuIGZpZWxkcy5cclxuICogQHBhcmFtICB7TXVsdGlHcmFwaH0gZ1xyXG4gKiBAcGFyYW0gIHtzdHJpbmdbXX0gZmllbGRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViRm9yRmllbGRzKGc6IE11bHRpR3JhcGgsIGZpZWxkczogc3RyaW5nW10pIHtcclxuICBjb25zdCBzdWIgPSBuZXcgTXVsdGlHcmFwaCgpO1xyXG4gIGcuZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGlmIChmaWVsZHMuaW5jbHVkZXMoYS5maWVsZCkpIHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGFkZE5vZGVzSWZOb3Qoc3ViLCBbcywgdF0sIHsgb3JkZXI6IGEub3JkZXIgfSk7XHJcbiAgICAgIHN1Yi5hZGRFZGdlKHMsIHQsIGEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBzdWI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb3IgZXZlcnkgZWRnZSBpbiBgZ2AsIGFkZCB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSB0byBhIGNvcHkgb2YgYGdgLlxyXG4gKlxyXG4gKiBJdCBhbHNvIHNldHMgdGhlIGF0dHJzIG9mIHRoZSByZXZlcnNlIGVkZ2VzIHRvIGBvcHBEaXJgIGFuZCBgb3BwRmllbGRzWzBdYFxyXG4gKiBAcGFyYW0gIHtNdWx0aUdyYXBofSBnXHJcbiAqIEBwYXJhbSAge1VzZXJIaWVyW119IHVzZXJIaWVyc1xyXG4gKiBAcGFyYW0gIHtib29sZWFufSBjbG9zZUFzT3Bwb3NpdGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWZsZXhpdmVDbG9zdXJlKFxyXG4gIGc6IE11bHRpR3JhcGgsXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdXHJcbik6IE11bHRpR3JhcGgge1xyXG4gIGNvbnN0IGNvcHkgPSBnLmNvcHkoKTtcclxuICBjb3B5LmZvckVhY2hFZGdlKChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGRpciwgZmllbGQgfSA9IGE7XHJcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9XHJcbiAgICAgIGRpciA9PT0gXCJzYW1lXCIgPyBmaWVsZCA6IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICAgIGFkZE5vZGVzSWZOb3QoY29weSwgW3MsIHRdLCB7IG9yZGVyOiA5OTk5IH0pO1xyXG4gICAgYWRkRWRnZUlmTm90KGNvcHksIHQsIHMsIHtcclxuICAgICAgZGlyOiBvcHBEaXIsXHJcbiAgICAgIGZpZWxkOiBvcHBGaWVsZCxcclxuICAgICAgaW1wbGllZDogQkNfSV9SRUZMRVhJVkUsXHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vZGVzSWZOb3QoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBub2Rlczogc3RyaW5nW10sXHJcbiAgYXR0ciA9IHsgb3JkZXI6IDk5OTkgfVxyXG4pIHtcclxuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgIGcudXBkYXRlTm9kZShub2RlLCAoZXhzdGFudEF0dHJzOiBBdHRyaWJ1dGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4dGFudE9yZGVyOiBudW1iZXIgfCB1bmRlZmluZWQgPSBleHN0YW50QXR0cnMub3JkZXI7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZXhzdGFudEF0dHJzLFxyXG4gICAgICAgIG9yZGVyOiBleHRhbnRPcmRlciAmJiBleHRhbnRPcmRlciA8IDk5OTkgPyBleHRhbnRPcmRlciA6IGF0dHIub3JkZXIsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRFZGdlSWZOb3QoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBzb3VyY2U6IHN0cmluZyxcclxuICB0YXJnZXQ6IHN0cmluZyxcclxuICBhdHRyPzogQXR0cmlidXRlc1xyXG4pIHtcclxuICBpZiAoIWcuaGFzRWRnZShzb3VyY2UsIHRhcmdldCkpIGcuYWRkRWRnZShzb3VyY2UsIHRhcmdldCwgYXR0cik7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTaW5rcyA9IChnOiBNdWx0aUdyYXBoKSA9PlxyXG4gIGcuZmlsdGVyTm9kZXMoKG5vZGUpID0+IGcuaGFzTm9kZShub2RlKSAmJiAhZy5vdXREZWdyZWUobm9kZSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZXMgPSAoZzogTXVsdGlHcmFwaCkgPT5cclxuICBnLmZpbHRlck5vZGVzKChub2RlKSA9PiBnLmhhc05vZGUobm9kZSkgJiYgIWcuaW5EZWdyZWUobm9kZSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldE91dE5laWdoYm91cnMgPSAoZzogTXVsdGlHcmFwaCwgbm9kZTogc3RyaW5nKSA9PlxyXG4gIGcuaGFzTm9kZShub2RlKSA/IGcub3V0TmVpZ2hib3JzKG5vZGUpIDogW107XHJcbmV4cG9ydCBjb25zdCBnZXRJbk5laWdoYm91cnMgPSAoZzogTXVsdGlHcmFwaCwgbm9kZTogc3RyaW5nKSA9PlxyXG4gIGcuaGFzTm9kZShub2RlKSA/IGcuaW5OZWlnaGJvcnMobm9kZSkgOiBbXTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kcyBhbGwgcGF0aHMgZnJvbSBhIHN0YXJ0aW5nIG5vZGUgdG8gYWxsIG90aGVyIHNpbmtzIGluIGEgZ3JhcGguXHJcbiAqXHJcbiAqXHJcbiAqIEBwYXJhbSB7TXVsdGlHcmFwaH0gZyAtIFRoZSBncmFwaCB0byBzZWFyY2hcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIG5vZGVcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXJyYXlzLiBFYWNoIGFycmF5IGlzIGEgcGF0aC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZnNBbGxQYXRocyhnOiBNdWx0aUdyYXBoLCBzdGFydDogc3RyaW5nKTogc3RyaW5nW11bXSB7XHJcbiAgY29uc3QgcXVldWU6IE5vZGVQYXRoW10gPSBbeyBub2RlOiBzdGFydCwgcGF0aDogW10gfV07XHJcbiAgY29uc3QgdmlzaXRlZDogeyBbbm90ZTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICBjb25zdCBhbGxQYXRoczogc3RyaW5nW11bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDAgJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuICAgIGNvbnN0IHsgbm9kZSwgcGF0aCB9ID0gcXVldWUuc2hpZnQoKTtcclxuXHJcbiAgICBjb25zdCBleHRQYXRoID0gW25vZGUsIC4uLnBhdGhdO1xyXG4gICAgY29uc3Qgc3VjY3NOb3RWaXNpdGVkID0gZy5oYXNOb2RlKG5vZGUpXHJcbiAgICAgID8gZy5maWx0ZXJPdXROZWlnaGJvcnMoXHJcbiAgICAgICAgbm9kZSxcclxuICAgICAgICAoc3VjYykgPT4gIXZpc2l0ZWRbc3VjY10gfHwgdmlzaXRlZFtzdWNjXSA8IDVcclxuICAgICAgKVxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBzdWNjc05vdFZpc2l0ZWQubWFwKChzdWNjKSA9PiB7XHJcbiAgICAgIHZpc2l0ZWRbc3VjY10gPSB2aXNpdGVkW3N1Y2NdID8gdmlzaXRlZFtzdWNjXSArIDEgOiAxO1xyXG4gICAgICByZXR1cm4geyBub2RlOiBzdWNjLCBwYXRoOiBleHRQYXRoIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICBxdWV1ZS51bnNoaWZ0KC4uLm5ld0l0ZW1zKTtcclxuXHJcbiAgICBpZiAoIWcuaGFzTm9kZShub2RlKSB8fCAhZy5vdXREZWdyZWUobm9kZSkpIGFsbFBhdGhzLnB1c2goZXh0UGF0aCk7XHJcbiAgfVxyXG4gIHJldHVybiBhbGxQYXRocztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJmc0FsbFBhdGhzKGc6IE11bHRpR3JhcGgsIHN0YXJ0OiBzdHJpbmcpOiBzdHJpbmdbXVtdIHtcclxuICBjb25zdCBwYXRoc0Fycjogc3RyaW5nW11bXSA9IFtdO1xyXG4gIGNvbnN0IHF1ZXVlOiBOb2RlUGF0aFtdID0gW3sgbm9kZTogc3RhcnQsIHBhdGg6IFtdIH1dO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG4gICAgY29uc3QgeyBub2RlLCBwYXRoIH0gPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgY29uc3QgZXh0UGF0aCA9IFtub2RlLCAuLi5wYXRoXTtcclxuXHJcbiAgICBjb25zdCBzdWNjcyA9IGcuaGFzTm9kZShub2RlKVxyXG4gICAgICA/IGcuZmlsdGVyT3V0TmVpZ2hib3JzKG5vZGUsIChuKSA9PiAhcGF0aC5pbmNsdWRlcyhuKSlcclxuICAgICAgOiBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBzdWNjcykge1xyXG4gICAgICBxdWV1ZS5wdXNoKHsgbm9kZSwgcGF0aDogZXh0UGF0aCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXJtaW5hbCBub2RlXHJcbiAgICBpZiAoIWcuaGFzTm9kZShub2RlKSB8fCBzdWNjcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcGF0aHNBcnIucHVzaChleHRQYXRoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gU3BsaWNlIG9mZiB0aGUgY3VycmVudCBub3RlIGZyb20gdGhlIHBhdGhcclxuICBwYXRoc0Fyci5mb3JFYWNoKChwYXRoKSA9PiB7XHJcbiAgICBpZiAocGF0aC5sZW5ndGgpIHBhdGguc3BsaWNlKHBhdGgubGVuZ3RoIC0gMSwgMSk7XHJcbiAgfSk7XHJcbiAgaW5mbyh7IHBhdGhzQXJyIH0pO1xyXG4gIHJldHVybiBwYXRoc0FycjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUN5Y2xlcyhnOiBHcmFwaCwgc3RhcnROb2RlOiBzdHJpbmcpIHtcclxuICBjb25zdCBjb3B5ID0gZy5jb3B5KCk7XHJcbiAgbGV0IHByZXZOb2RlID0gbnVsbDtcclxuICBkZnNGcm9tTm9kZShjb3B5LCBzdGFydE5vZGUsIChuKSA9PiB7XHJcbiAgICBjb3B5LmZvckVhY2hPdXROZWlnaGJvcihuLCAodCkgPT4ge1xyXG4gICAgICBpZiAodCA9PT0gcHJldk5vZGUgJiYgY29weS5oYXNFZGdlKHQsIHByZXZOb2RlKSkge1xyXG4gICAgICAgIHRyeSB7IGNvcHkuZHJvcEVkZ2UodCwgcHJldk5vZGUpIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcih0LCBwcmV2Tm9kZSwgZXJyb3IpIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHJldk5vZGUgPSBuO1xyXG4gIH0pO1xyXG4gIHJldHVybiBjb3B5O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViQ2xvc2VTdWIoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICB1c2VySGllcnM6IFVzZXJIaWVyW10sXHJcbiAgLi4uZGlyczogRGlyZWN0aW9uc1tdXHJcbikge1xyXG4gIGNvbnN0IHN1YiA9IGdldFN1YkluRGlycyhnLCAuLi5kaXJzKTtcclxuICBjb25zdCBjbG9zZWQgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKHN1YiwgdXNlckhpZXJzKTtcclxuICBjb25zdCBjbG9zZWRTdWIgPSBnZXRTdWJJbkRpcnMoY2xvc2VkLCBkaXJzWzBdKTtcclxuICByZXR1cm4gY2xvc2VkU3ViO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPYnNHcmFwaCgpOiBNdWx0aUdyYXBoIHtcclxuICBjb25zdCBPYnNHID0gbmV3IE11bHRpR3JhcGgoKTtcclxuICBjb25zdCB7IHJlc29sdmVkTGlua3MsIHVucmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XHJcblxyXG4gIGZvciAoY29uc3Qgc291cmNlIGluIHJlc29sdmVkTGlua3MpIHtcclxuICAgIGlmICghc291cmNlLmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcclxuICAgIGNvbnN0IHNvdXJjZUJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChzb3VyY2UpO1xyXG4gICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbc291cmNlQmFzZV0pO1xyXG5cclxuICAgIGZvciAoY29uc3QgZGVzdCBpbiByZXNvbHZlZExpbmtzW3NvdXJjZV0pIHtcclxuICAgICAgaWYgKCFkZXN0LmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgZGVzdEJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChkZXN0KTtcclxuICAgICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbZGVzdEJhc2VdKTtcclxuICAgICAgT2JzRy5hZGRFZGdlKHNvdXJjZUJhc2UsIGRlc3RCYXNlLCB7IHJlc29sdmVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9yIChjb25zdCBzb3VyY2UgaW4gdW5yZXNvbHZlZExpbmtzKSB7XHJcbiAgICBjb25zdCBzb3VyY2VCYXNlID0gZ2V0QmFzZUZyb21NRFBhdGgoc291cmNlKTtcclxuICAgIGFkZE5vZGVzSWZOb3QoT2JzRywgW3NvdXJjZUJhc2VdKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRlc3QgaW4gdW5yZXNvbHZlZExpbmtzW3NvdXJjZV0pIHtcclxuICAgICAgY29uc3QgZGVzdEJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChkZXN0KTtcclxuICAgICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbZGVzdEJhc2VdKTtcclxuICAgICAgaWYgKHNvdXJjZUJhc2UgPT09IGRlc3RCYXNlKSBjb250aW51ZTtcclxuICAgICAgT2JzRy5hZGRFZGdlKHNvdXJjZUJhc2UsIGRlc3RCYXNlLCB7IHJlc29sdmVkOiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluZm8oeyBPYnNHIH0pO1xyXG4gIHJldHVybiBPYnNHO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcG9wdWxhdGVNYWluKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoLFxyXG4gIHNvdXJjZTogc3RyaW5nLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgdGFyZ2V0OiBzdHJpbmcsXHJcbiAgc291cmNlT3JkZXI6IG51bWJlcixcclxuICB0YXJnZXRPcmRlcjogbnVtYmVyLFxyXG4gIGZpbGxPcHAgPSBmYWxzZVxyXG4pOiB2b2lkIHtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZGlyID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpLmZpZWxkRGlyO1xyXG5cclxuICBhZGROb2Rlc0lmTm90KG1haW5HLCBbc291cmNlXSwge1xyXG4gICAgb3JkZXI6IHNvdXJjZU9yZGVyLFxyXG4gIH0pO1xyXG5cclxuICBhZGROb2Rlc0lmTm90KG1haW5HLCBbdGFyZ2V0XSwge1xyXG4gICAgb3JkZXI6IHRhcmdldE9yZGVyLFxyXG4gIH0pO1xyXG5cclxuICBhZGRFZGdlSWZOb3QobWFpbkcsIHNvdXJjZSwgdGFyZ2V0LCB7XHJcbiAgICBkaXIsXHJcbiAgICBmaWVsZCxcclxuICB9KTtcclxuICBpZiAoZmlsbE9wcCkge1xyXG4gICAgYWRkRWRnZUlmTm90KG1haW5HLCB0YXJnZXQsIHNvdXJjZSwge1xyXG4gICAgICBkaXI6IGdldE9wcERpcihkaXIpLFxyXG4gICAgICBmaWVsZDogZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIGRpcilbMF0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRPcmRlciA9IChmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSwgdGFyZ2V0OiBzdHJpbmcpID0+XHJcbiAgcGFyc2VJbnQoXHJcbiAgICAoZnJvbnRtcy5maW5kKChmZikgPT4gZmY/LmZpbGU/LmJhc2VuYW1lID09PSB0YXJnZXQpPy5bXHJcbiAgICAgIEJDX09SREVSXHJcbiAgICBdIGFzIHN0cmluZykgPz8gXCI5OTk5XCJcclxuICApO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZU9yZGVyID0gKGZyb250bTogZHZGcm9udG1hdHRlckNhY2hlKSA9PlxyXG4gIHBhcnNlSW50KChmcm9udG1bQkNfT1JERVJdIGFzIHN0cmluZykgPz8gXCI5OTk5XCIpO1xyXG5cclxuLyoqIFJlbWVtYmVyIHRvIGZpbHRlciBieSBoaWVyYXJjaHkgaW4gTWF0cml4VmlldyEgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlYWxuSW1wbGllZChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGN1cnJOb2RlOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zID0gbnVsbFxyXG4pOiBSZWFsTkltcGxpZWQge1xyXG4gIGNvbnN0IHJlYWxzbkltcGxpZWRzOiBSZWFsTkltcGxpZWQgPSBibGFua1JlYWxOSW1wbGllZCgpO1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGlmICghY2xvc2VkRy5oYXNOb2RlKGN1cnJOb2RlKSkgcmV0dXJuIHJlYWxzbkltcGxpZWRzO1xyXG4gIGNsb3NlZEcuZm9yRWFjaEVkZ2UoY3Vyck5vZGUsIChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGZpZWxkLCBkaXI6IGVkZ2VEaXIsIGltcGxpZWQgfSA9IGEgYXMgRWRnZUF0dHI7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBlZGdlRGlyKVswXTtcclxuXHJcbiAgICAoZGlyID8gW2RpciwgZ2V0T3BwRGlyKGRpcildIDogRElSRUNUSU9OUykuZm9yRWFjaChcclxuICAgICAgKGN1cnJEaXI6IERpcmVjdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBvcHBEaXIgPSBnZXRPcHBEaXIoY3VyckRpcik7XHJcbiAgICAgICAgLy8gUmVhbHNcclxuICAgICAgICBpZiAocyA9PT0gY3Vyck5vZGUgJiYgKGVkZ2VEaXIgPT09IGN1cnJEaXIgfHwgZWRnZURpciA9PT0gb3BwRGlyKSkge1xyXG4gICAgICAgICAgY29uc3QgYXJyID0gcmVhbHNuSW1wbGllZHNbZWRnZURpcl0ucmVhbHM7XHJcbiAgICAgICAgICBpZiAoYXJyLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS50byA9PT0gdCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGFyci5wdXNoKHsgdG86IHQsIGZpZWxkLCBpbXBsaWVkIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJbXBsaWVkc1xyXG4gICAgICAgIC8vIElmIGBzICE9PSBjdXJyTm9kZWAgdGhlbiBgdGAgbXVzdCBiZVxyXG4gICAgICAgIGVsc2UgaWYgKGVkZ2VEaXIgPT09IGN1cnJEaXIgfHwgZWRnZURpciA9PT0gb3BwRGlyKSB7XHJcbiAgICAgICAgICBjb25zdCBhcnIgPSByZWFsc25JbXBsaWVkc1tnZXRPcHBEaXIoZWRnZURpcildLmltcGxpZWRzO1xyXG4gICAgICAgICAgaWYgKGFyci5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0udG8gPT09IHMpID09PSAtMSkge1xyXG4gICAgICAgICAgICBhcnIucHVzaCh7XHJcbiAgICAgICAgICAgICAgdG86IHMsXHJcbiAgICAgICAgICAgICAgZmllbGQ6IG9wcEZpZWxkLFxyXG4gICAgICAgICAgICAgIGltcGxpZWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9KTtcclxuICByZXR1cm4gcmVhbHNuSW1wbGllZHM7XHJcbn1cclxuIiwgImltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMsIERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucywgVXNlckhpZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuLyoqXHJcbiAqIEdldCBhbGwgdGhlIGZpZWxkcyBpbiBgZGlyYC5cclxuICogUmV0dXJucyBhbGwgZmllbGRzIGlmIGBkaXIgPT09ICdhbGwnYFxyXG4gKiBAcGFyYW0gIHtVc2VySGllcltdfSB1c2VySGllcnNcclxuICogQHBhcmFtICB7RGlyZWN0aW9uc3xcImFsbFwifSBkaXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZHMoXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdLFxyXG4gIGRpcjogRGlyZWN0aW9ucyB8IFwiYWxsXCIgPSBcImFsbFwiXHJcbikge1xyXG4gIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICB1c2VySGllcnMuZm9yRWFjaCgoaGllcikgPT4ge1xyXG4gICAgaWYgKGRpciA9PT0gXCJhbGxcIikge1xyXG4gICAgICBESVJFQ1RJT05TLmZvckVhY2goKGVhY2hEaXIpID0+IHtcclxuICAgICAgICBmaWVsZHMucHVzaCguLi5oaWVyW2VhY2hEaXJdKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWVsZHMucHVzaCguLi5oaWVyW2Rpcl0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBmaWVsZHM7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRPcHBEaXIgPSAoZGlyOiBEaXJlY3Rpb25zKTogRGlyZWN0aW9ucyA9PiB7XHJcbiAgc3dpdGNoIChkaXIpIHtcclxuICAgIGNhc2UgXCJ1cFwiOlxyXG4gICAgICByZXR1cm4gXCJkb3duXCI7XHJcbiAgICBjYXNlIFwiZG93blwiOlxyXG4gICAgICByZXR1cm4gXCJ1cFwiO1xyXG4gICAgY2FzZSBcInNhbWVcIjpcclxuICAgICAgcmV0dXJuIFwic2FtZVwiO1xyXG4gICAgY2FzZSBcIm5leHRcIjpcclxuICAgICAgcmV0dXJuIFwicHJldlwiO1xyXG4gICAgY2FzZSBcInByZXZcIjpcclxuICAgICAgcmV0dXJuIFwibmV4dFwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiAgR2V0IHRoZSBoaWVyYXJjaHkgYW5kIGRpcmVjdGlvbiB0aGF0IGBmaWVsZGAgaXMgaW5cclxuICogKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkSW5mbyh1c2VySGllcnM6IFVzZXJIaWVyW10sIGZpZWxkOiBzdHJpbmcpIHtcclxuICBsZXQgZmllbGREaXI6IERpcmVjdGlvbnM7XHJcbiAgbGV0IGZpZWxkSGllcjogVXNlckhpZXI7XHJcblxyXG4gIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyOiBEaXJlY3Rpb25zKSA9PiB7XHJcbiAgICB1c2VySGllcnMuZm9yRWFjaCgoaGllcikgPT4ge1xyXG4gICAgICBpZiAoaGllcltkaXJdLmluY2x1ZGVzKGZpZWxkKSkge1xyXG4gICAgICAgIGZpZWxkRGlyID0gZGlyO1xyXG4gICAgICAgIGZpZWxkSGllciA9IGhpZXI7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4geyBmaWVsZEhpZXIsIGZpZWxkRGlyIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRPcHBGaWVsZHMoXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zXHJcbikge1xyXG4gIC8vIElmIHRoZSBmaWVsZCBlbmRzIHdpdGggYD5gLCBpdCBpcyBhbHJlYWR5IHRoZSBvcHBvc2l0ZSBmaWVsZCB3ZSBuZWVkIChjb21pbmcgZnJvbSBgZ2V0T3BwRmFsbGJhY2tgKVxyXG4gIGlmIChmaWVsZC5lbmRzV2l0aChcIj5cIikpIHJldHVybiBbZmllbGQuc2xpY2UoMCwgLTQpXTtcclxuXHJcbiAgY29uc3Qgb3BwRmllbGRzID0gW2ZhbGxiYWNrT3BwRmllbGQoZmllbGQsIGRpcildO1xyXG4gIGNvbnN0IHsgZmllbGRIaWVyLCBmaWVsZERpciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpO1xyXG4gIGlmICghZmllbGRIaWVyIHx8ICFmaWVsZERpcikgcmV0dXJuIG9wcEZpZWxkcztcclxuXHJcbiAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGZpZWxkRGlyKTtcclxuICBvcHBGaWVsZHMudW5zaGlmdCguLi5maWVsZEhpZXJbb3BwRGlyXSk7XHJcbiAgcmV0dXJuIG9wcEZpZWxkcztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGhpZXJUb1N0ciA9IChoaWVyOiBVc2VySGllcikgPT5cclxuICBESVJFQ1RJT05TLm1hcChcclxuICAgIChkaXIpID0+IGAke0FSUk9XX0RJUkVDVElPTlNbZGlyXX06ICR7aGllcltkaXJdLmpvaW4oXCIsIFwiKX1gXHJcbiAgKS5qb2luKFwiXFxuXCIpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZhbGxiYWNrRmllbGQgPSAoZmllbGQ6IHN0cmluZywgZGlyOiBEaXJlY3Rpb25zKSA9PlxyXG4gIGAke2ZpZWxkfSA8JHtBUlJPV19ESVJFQ1RJT05TW2Rpcl19PmA7XHJcbmV4cG9ydCBjb25zdCBmYWxsYmFja09wcEZpZWxkID0gKGZpZWxkOiBzdHJpbmcsIGRpcjogRGlyZWN0aW9ucykgPT5cclxuICBgJHtmaWVsZH0gPCR7QVJST1dfRElSRUNUSU9OU1tnZXRPcHBEaXIoZGlyKV19PmA7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZUhpZXJzKFxyXG4gIHVzZXJIaWVyczogVXNlckhpZXJbXSxcclxuICBmbjogKGhpZXI6IFVzZXJIaWVyLCBkaXI6IERpcmVjdGlvbnMsIGZpZWxkOiBzdHJpbmcpID0+IHZvaWRcclxuKSB7XHJcbiAgdXNlckhpZXJzLmZvckVhY2goKGhpZXIpID0+IHtcclxuICAgIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyKSA9PiB7XHJcbiAgICAgIGhpZXJbZGlyXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGZuKGhpZXIsIGRpciwgZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBCQ19EVl9OT1RFLCBCQ19EVl9OT1RFX0ZJRUxELCBCQ19JR05PUkUsIERBVEFWSUVXX01JU1NJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW4sXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkFwaSwgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkRGF0YXZpZXdOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBlbGlnYWJsZUFsdHM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycywgZGF0YXZpZXdOb3RlRmllbGQgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGR2ID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICBpZiAoIWR2ICYmIGVsaWdhYmxlQWx0cy5sZW5ndGgpIHtcclxuICAgIG5ldyBOb3RpY2UoREFUQVZJRVdfTUlTU0lORyk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgZWxpZ2FibGVBbHRzLmZvckVhY2goKGFsdEZpbGUpID0+IHtcclxuICAgIGNvbnN0IGJhc2VuYW1lID0gZ2V0RFZCYXNlbmFtZShhbHRGaWxlLmZpbGUpO1xyXG5cclxuICAgIGxldCBxdWVyeSA9IGFsdEZpbGVbQkNfRFZfTk9URV0gYXMgKHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xyXG4gICAgaWYgKHF1ZXJ5Lmhhc093blByb3BlcnR5KCdwYXRoJykpIHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIHF1ZXJ5ID0gYFtbJHtxdWVyeS5wYXRofV1dYDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbGV0IGZpZWxkID1cclxuICAgICAgKGFsdEZpbGVbQkNfRFZfTk9URV9GSUVMRF0gYXMgc3RyaW5nKSA/PyAoZGF0YXZpZXdOb3RlRmllbGQgfHwgZmllbGRzWzBdKTtcclxuXHJcbiAgICBsZXQgdGFyZ2V0czogZHZGcm9udG1hdHRlckNhY2hlW10gPSBbXTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRhcmdldHMgPSBkdi5wYWdlcyg8c3RyaW5nPnF1ZXJ5KS52YWx1ZXM7XHJcbiAgICB9IGNhdGNoIChlcikge1xyXG4gICAgICBuZXcgTm90aWNlKGAke3F1ZXJ5fSBpcyBub3QgYSB2YWxpZCBEYXRhdmlldyBmcm9tLXF1ZXJ5YCk7XHJcbiAgICAgIHdhcm4oZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgaWYgKHRhcmdldFtCQ19JR05PUkVdKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgdGFyZ2V0Qk4gPSBnZXREVkJhc2VuYW1lKHRhcmdldC5maWxlKTtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YXJnZXRCTik7XHJcblxyXG4gICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgdGFyZ2V0Qk4sXHJcbiAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHBvcHVsYXRlTWFpbiB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldERWQmFzZW5hbWUgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgKiBhcyBsdXhvbiBmcm9tIFwibHV4b25cIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRlTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHtcclxuICAgIGFkZERhdGVOb3RlcyxcclxuICAgIGRhdGVOb3RlQWRkTW9udGgsXHJcbiAgICBkYXRlTm90ZUFkZFllYXIsXHJcbiAgICBkYXRlTm90ZUZvcm1hdCxcclxuICAgIGRhdGVOb3RlRmllbGQsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG4gIGlmICghYWRkRGF0ZU5vdGVzKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IHsgcmVnZXggfSA9IGx1eG9uLkRhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKFwiXCIsIGRhdGVOb3RlRm9ybWF0KTtcclxuICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgIGNvbnN0IHsgZmlsZSB9ID0gcGFnZTtcclxuICAgIGNvbnN0IHsgZGF5IH0gPSBmaWxlO1xyXG4gICAgaWYgKCFkYXkgfHwgIXJlZ2V4LnRlc3QoZ2V0RFZCYXNlbmFtZShmaWxlKSkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0b2RheSA9IGdldERWQmFzZW5hbWUoZmlsZSk7XHJcbiAgICBjb25zdCB0b21vcnJvdyA9IGRheS5wbHVzKHsgZGF5czogMSB9KTtcclxuICAgIGNvbnN0IHRvbVN0ciA9IHRvbW9ycm93LnRvRm9ybWF0KGRhdGVOb3RlRm9ybWF0KTtcclxuXHJcbiAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgIHNldHRpbmdzLFxyXG4gICAgICBtYWluRyxcclxuICAgICAgdG9kYXksXHJcbiAgICAgIGRhdGVOb3RlRmllbGQsXHJcbiAgICAgIHRvbVN0cixcclxuICAgICAgOTk5OSxcclxuICAgICAgOTk5OSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQkNfSUdOT1JFLCBCQ19JR05PUkVfREVORFJPTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBkdkZyb250bWF0dGVyQ2FjaGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IGdldERlbmRyb25QYXJlbnQgPSAoZGVuZHJvbjogc3RyaW5nLCBzcGxpdHRlcjogc3RyaW5nKSA9PlxyXG4gIGRlbmRyb24uc3BsaXQoc3BsaXR0ZXIpLnNsaWNlKDAsIC0xKS5qb2luKHNwbGl0dGVyKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZW5kcm9uTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgYWRkRGVuZHJvbk5vdGVzLCBkZW5kcm9uTm90ZURlbGltaXRlciwgZGVuZHJvbk5vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgaWYgKCFhZGREZW5kcm9uTm90ZXMpIHJldHVybjtcclxuXHJcbiAgZm9yIChjb25zdCBmcm9udG0gb2YgZnJvbnRtcykge1xyXG4gICAgaWYgKGZyb250bVtCQ19JR05PUkVfREVORFJPTl0gfHwgZnJvbnRtW0JDX0lHTk9SRV0pIGNvbnRpbnVlO1xyXG5cclxuICAgIGxldCBjdXJyID0gZ2V0RFZCYXNlbmFtZShmcm9udG0uZmlsZSk7XHJcbiAgICBsZXQgcGFyZW50ID0gZ2V0RGVuZHJvblBhcmVudChjdXJyLCBkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcblxyXG4gICAgd2hpbGUgKHBhcmVudCAhPT0gXCJcIikge1xyXG4gICAgICBjb25zdCBwYXJlbnRGaWxlID0gZnJvbnRtcy5maW5kKFxyXG4gICAgICAgIChmbSkgPT4gZ2V0RFZCYXNlbmFtZShmbS5maWxlKSA9PT0gcGFyZW50XHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyAhcGFyZW50RmlsZSBpbXBsaWVzIGEgXCJzdHViXCJcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBpZiAoIXBhcmVudEZpbGUgfHwgcGFyZW50RmlsZVtCQ19JR05PUkVfREVORFJPTl0gIT09IHRydWUpIHtcclxuICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgY3VycixcclxuICAgICAgICAgIGRlbmRyb25Ob3RlRmllbGQsXHJcbiAgICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgOTk5OSxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnIgPSBwYXJlbnQ7XHJcbiAgICAgIHBhcmVudCA9IGdldERlbmRyb25QYXJlbnQocGFyZW50LCBkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBleHBvcnQgZnVuY3Rpb24gYWRkRGVuZHJvbk5vdGVzVG9HcmFwaChcclxuLy8gICBwbHVnaW46IEJDUGx1Z2luLFxyXG4vLyAgIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4vLyAgIG1haW5HOiBNdWx0aUdyYXBoXHJcbi8vICkge1xyXG4vLyAgIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuLy8gICBjb25zdCB7IGFkZERlbmRyb25Ob3RlcywgZGVuZHJvbk5vdGVEZWxpbWl0ZXIsIGRlbmRyb25Ob3RlRmllbGQgfSA9IHNldHRpbmdzO1xyXG4vLyAgIGlmICghYWRkRGVuZHJvbk5vdGVzKSByZXR1cm47XHJcblxyXG4vLyAgIGZvciAoY29uc3QgZnJvbnRtIG9mIGZyb250bXMpIHtcclxuLy8gICAgIGlmIChmcm9udG1bQkNfSUdOT1JFX0RFTkRST05dKSBjb250aW51ZTtcclxuXHJcbi8vICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoZnJvbnRtLmZpbGUpO1xyXG5cclxuLy8gICAgIGNvbnN0IHNwbGl0cyA9IGJhc2VuYW1lLnNwbGl0KGRlbmRyb25Ob3RlRGVsaW1pdGVyKTtcclxuLy8gICAgIGlmIChzcGxpdHMubGVuZ3RoIDw9IDEpIGNvbnRpbnVlO1xyXG5cclxuLy8gICAgIGNvbnN0IG5leHRTbGljZSA9IHNwbGl0cy5zbGljZSgwLCAtMSkuam9pbihkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcbi8vICAgICBpZiAoIW5leHRTbGljZSkgY29udGludWU7XHJcbi8vICAgICBjb25zdCBuZXh0U2xpY2VGaWxlID0gZnJvbnRtcy5maW5kKFxyXG4vLyAgICAgICAoZm0pID0+IGdldERWQmFzZW5hbWUoZm0uZmlsZSkgPT09IG5leHRTbGljZVxyXG4vLyAgICAgKTtcclxuXHJcbi8vICAgICBpZiAoIW5leHRTbGljZUZpbGUgfHwgbmV4dFNsaWNlRmlsZVtCQ19JR05PUkVfREVORFJPTl0pIGNvbnRpbnVlO1xyXG5cclxuLy8gICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gZ2V0U291cmNlT3JkZXIoZnJvbnRtKTtcclxuLy8gICAgIGNvbnN0IHRhcmdldE9yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgbmV4dFNsaWNlKTtcclxuXHJcbi8vICAgICBwb3B1bGF0ZU1haW4oXHJcbi8vICAgICAgIHNldHRpbmdzLFxyXG4vLyAgICAgICBtYWluRyxcclxuLy8gICAgICAgYmFzZW5hbWUsXHJcbi8vICAgICAgIGRlbmRyb25Ob3RlRmllbGQsXHJcbi8vICAgICAgIG5leHRTbGljZSxcclxuLy8gICAgICAgc291cmNlT3JkZXIsXHJcbi8vICAgICAgIHRhcmdldE9yZGVyLFxyXG4vLyAgICAgICB0cnVlXHJcbi8vICAgICApO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgVEZpbGUsIFRGb2xkZXIgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtcclxuICBCQ19GT0xERVJfTk9URSxcclxuICBCQ19GT0xERVJfTk9URV9SRUNVUlNJVkUsXHJcbiAgQkNfRk9MREVSX05PVEVfU1VCRk9MREVSUyxcclxuICBCQ19JR05PUkUsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0U291cmNlT3JkZXIsXHJcbiAgZ2V0VGFyZ2V0T3JkZXIsXHJcbiAgcG9wdWxhdGVNYWluLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSwgZ2V0Rm9sZGVyTmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5jb25zdCBnZXRTdWJzRnJvbUZvbGRlciA9IChmb2xkZXI6IFRGb2xkZXIpID0+IHtcclxuICBjb25zdCBvdGhlck5vdGVzOiBURmlsZVtdID0gW10sXHJcbiAgICBzdWJGb2xkZXJzOiBURm9sZGVyW10gPSBbXTtcclxuICBmb2xkZXIuY2hpbGRyZW4uZm9yRWFjaCgodEFic3RyYWN0KSA9PiB7XHJcbiAgICBpZiAodEFic3RyYWN0IGluc3RhbmNlb2YgVEZpbGUpIG90aGVyTm90ZXMucHVzaCh0QWJzdHJhY3QpO1xyXG4gICAgZWxzZSBzdWJGb2xkZXJzLnB1c2godEFic3RyYWN0IGFzIFRGb2xkZXIpO1xyXG4gIH0pO1xyXG4gIHJldHVybiB7IG90aGVyTm90ZXMsIHN1YkZvbGRlcnMgfTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRGb2xkZXJOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBmb2xkZXJOb3RlczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgZm9sZGVyTm90ZXMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhbHRGaWxlO1xyXG4gICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKGZpbGUpO1xyXG4gICAgY29uc3QgdG9wRm9sZGVyTmFtZSA9IGdldEZvbGRlck5hbWUoZmlsZSk7XHJcbiAgICBjb25zdCB0b3BGb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRvcEZvbGRlck5hbWUpIGFzIFRGb2xkZXI7XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0cyA9IGZyb250bXNcclxuICAgICAgLm1hcCgoZmYpID0+IGZmLmZpbGUpXHJcbiAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgKG90aGVyKSA9PlxyXG4gICAgICAgICAgZ2V0Rm9sZGVyTmFtZShvdGhlcikgPT09IHRvcEZvbGRlck5hbWUgJiYgb3RoZXIucGF0aCAhPT0gZmlsZS5wYXRoICYmICFvdGhlcltCQ19JR05PUkVdXHJcbiAgICAgIClcclxuICAgICAgLm1hcChnZXREVkJhc2VuYW1lKTtcclxuXHJcbiAgICBjb25zdCBmaWVsZCA9IGFsdEZpbGVbQkNfRk9MREVSX05PVEVdIGFzIHN0cmluZztcclxuICAgIGlmICh0eXBlb2YgZmllbGQgIT09IFwic3RyaW5nXCIgfHwgIWZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpIHJldHVybjtcclxuXHJcbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4ge1xyXG4gICAgICAvLyBUaGlzIGlzIGdldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmb2xkZXIgbm90ZSwgbm90IHRoZSBzb3VyY2UgcG9pbnRpbmcgdXAgdG8gaXRcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcbiAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICBtYWluRyxcclxuICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICBmaWVsZCxcclxuICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGFsdEZpbGVbQkNfRk9MREVSX05PVEVfU1VCRk9MREVSU10pIHtcclxuICAgICAgY29uc3Qgc3ViZm9sZGVyRmllbGQgPSBhbHRGaWxlW0JDX0ZPTERFUl9OT1RFX1NVQkZPTERFUlNdIGFzIHN0cmluZztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiBzdWJmb2xkZXJGaWVsZCAhPT0gXCJzdHJpbmdcIiB8fFxyXG4gICAgICAgICFmaWVsZHMuaW5jbHVkZXMoc3ViZm9sZGVyRmllbGQpXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCB7IHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKHRvcEZvbGRlcik7XHJcblxyXG4gICAgICBzdWJGb2xkZXJzLmZvckVhY2goKHN1YkZvbGRlcikgPT4ge1xyXG4gICAgICAgIHN1YkZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoY2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgICAgIGJhc2VuYW1lLFxyXG4gICAgICAgICAgICAgIHN1YmZvbGRlckZpZWxkLFxyXG4gICAgICAgICAgICAgIGNoaWxkQmFzZW5hbWUsXHJcbiAgICAgICAgICAgICAgOTk5OSxcclxuICAgICAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFsdEZpbGVbQkNfRk9MREVSX05PVEVfUkVDVVJTSVZFXSkge1xyXG4gICAgICBjb25zdCB7IHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKHRvcEZvbGRlcik7XHJcbiAgICAgIGNvbnN0IGZvbGRlclF1ZXVlOiBURm9sZGVyW10gPSBbLi4uc3ViRm9sZGVyc107XHJcblxyXG4gICAgICBsZXQgY3VyckZvbGRlciA9IGZvbGRlclF1ZXVlLnNoaWZ0KCk7XHJcbiAgICAgIHdoaWxlIChjdXJyRm9sZGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCB7IG90aGVyTm90ZXMsIHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKGN1cnJGb2xkZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb2xkZXJOb3RlID0gY3VyckZvbGRlci5uYW1lO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBvdGhlck5vdGVzLm1hcChnZXREVkJhc2VuYW1lKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKCFpc0luVmF1bHQoIGZvbGRlck5vdGUsIGZvbGRlck5vdGUpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSA5OTk5OyAvLyBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IDk5OTk7IC8vICBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudEZvbGRlck5vdGUgPSBjdXJyRm9sZGVyLnBhcmVudC5uYW1lO1xyXG5cclxuICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgcGFyZW50Rm9sZGVyTm90ZSxcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgZm9sZGVyTm90ZSxcclxuICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgICAgIGlmICh0YXJnZXQgPT09IGZvbGRlck5vdGUpIHJldHVybjtcclxuICAgICAgICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gOTk5OTsgLy8gZ2V0U291cmNlT3JkZXIoYWx0RmlsZSk7XHJcbiAgICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IDk5OTk7IC8vICBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICAgIGZvbGRlck5vdGUsXHJcbiAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9sZGVyUXVldWUucHVzaCguLi5zdWJGb2xkZXJzKTtcclxuICAgICAgICBjdXJyRm9sZGVyID0gZm9sZGVyUXVldWUuc2hpZnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZpcnN0IGFkZCBvdGhlck5vdGVzIHRvIGdyYXBoXHJcblxyXG4gICAgLy8gVGhlbiBpdGVyYXRlIHN1YkZvbGRlcnMgZG9pbmcgdGhlIHNhbWVcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lLCBnZXRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncywgSGllcmFyY2h5Tm90ZUl0ZW0gfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBhZGRFZGdlSWZOb3QsIGFkZE5vZGVzSWZOb3QgfSBmcm9tIFwiLi4vLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZEluZm8sIGdldEZpZWxkcywgZ2V0T3BwRGlyLCBnZXRPcHBGaWVsZHMgfSBmcm9tIFwiLi4vLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zKGZpbGU6IFRGaWxlKSB7XHJcbiAgY29uc3QgeyBsaXN0SXRlbXMgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICBpZiAoIWxpc3RJdGVtcykgcmV0dXJuIFtdO1xyXG5cclxuICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoZmlsZSlcclxuICBjb25zdCB7IGhpZXJhcmNoeU5vdGVJc1BhcmVudCB9ID0gZ2V0U2V0dGluZ3MoKTtcclxuXHJcbiAgY29uc3QgbGluZXMgPSAoYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkpLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHlOb3RlSXRlbXM6IEhpZXJhcmNoeU5vdGVJdGVtW10gPSBbXTtcclxuXHJcbiAgY29uc3QgYWZ0ZXJCdWxsZXRSZWcgPSBuZXcgUmVnRXhwKC9cXHMqWysqLV1cXHMoLiokKS8pO1xyXG4gIGNvbnN0IGRyb3BXaWtpTGlua3NSZWcgPSBuZXcgUmVnRXhwKC9cXFtcXFsoLio/KVxcXVxcXS8pO1xyXG4gIGNvbnN0IGZpZWxkUmVnID0gbmV3IFJlZ0V4cCgvKC4qPylcXFtcXFsuKj9cXF1cXF0vKTtcclxuXHJcbiAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3RJdGVtcykge1xyXG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2l0ZW0ucG9zaXRpb24uc3RhcnQubGluZV07XHJcblxyXG4gICAgY29uc3QgYWZ0ZXJCdWxsZXRDdXJyID0gYWZ0ZXJCdWxsZXRSZWcuZXhlYyhsaW5lKVsxXTtcclxuICAgIGNvbnN0IG5vdGUgPSBkcm9wV2lraUxpbmtzUmVnLmV4ZWMoYWZ0ZXJCdWxsZXRDdXJyKVsxXTtcclxuICAgIGxldCBmaWVsZCA9IGZpZWxkUmVnLmV4ZWMoYWZ0ZXJCdWxsZXRDdXJyKVsxXS50cmltKCkgfHwgbnVsbDtcclxuXHJcbiAgICBjb25zdCB7IHBhcmVudCB9ID0gaXRlbTtcclxuICAgIGlmIChwYXJlbnQgPj0gMCkge1xyXG4gICAgICBjb25zdCBwYXJlbnROb3RlID0gbGluZXNbcGFyZW50XTtcclxuICAgICAgY29uc3QgYWZ0ZXJCdWxsZXRQYXJlbnQgPSBhZnRlckJ1bGxldFJlZy5leGVjKHBhcmVudE5vdGUpWzFdO1xyXG4gICAgICBjb25zdCBkcm9wV2lraVBhcmVudCA9IGRyb3BXaWtpTGlua3NSZWcuZXhlYyhhZnRlckJ1bGxldFBhcmVudClbMV07XHJcblxyXG4gICAgICBoaWVyYXJjaHlOb3RlSXRlbXMucHVzaCh7XHJcbiAgICAgICAgbm90ZSxcclxuICAgICAgICBwYXJlbnQ6IGRyb3BXaWtpUGFyZW50LFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGhpZXJhcmNoeU5vdGVJdGVtcy5wdXNoKHtcclxuICAgICAgICBub3RlLFxyXG4gICAgICAgIHBhcmVudDogaGllcmFyY2h5Tm90ZUlzUGFyZW50ID8gYmFzZW5hbWUgOiBudWxsLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGhpZXJhcmNoeU5vdGVJdGVtcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhOc1RvR3JhcGgoXHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3MsXHJcbiAgaG5BcnI6IEhpZXJhcmNoeU5vdGVJdGVtW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBITlVwRmllbGQsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgdXBGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzLCBcInVwXCIpO1xyXG5cclxuICBobkFyci5mb3JFYWNoKChobkl0ZW0sIGkpID0+IHtcclxuICAgIGNvbnN0IHsgbm90ZSwgZmllbGQsIHBhcmVudCB9ID0gaG5JdGVtO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldEZpZWxkID0gZmllbGQgPz8gKEhOVXBGaWVsZCB8fCB1cEZpZWxkc1swXSk7XHJcbiAgICBjb25zdCBkaXIgPSBnZXRGaWVsZEluZm8odXNlckhpZXJzLCB0YXJnZXRGaWVsZCk/LmZpZWxkRGlyO1xyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIHRhcmdldEZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgY29uc3QgcyA9IG5vdGU7XHJcbiAgICAgIGNvbnN0IHQgPSBobkFycltpICsgMV0/Lm5vdGU7XHJcblxyXG4gICAgICBhZGROb2Rlc0lmTm90KG1haW5HLCBbcywgdF0pO1xyXG4gICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIHMsIHQsIHsgZGlyOiBvcHBEaXIsIGZpZWxkOiBvcHBGaWVsZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFkZE5vZGVzSWZOb3QobWFpbkcsIFtub3RlLCBwYXJlbnRdKTtcclxuICAgICAgaWYgKHNldHRpbmdzLnNob3dVcEluSnVnZ2wpIHtcclxuICAgICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIG5vdGUsIHBhcmVudCwge1xyXG4gICAgICAgICAgZGlyLFxyXG4gICAgICAgICAgZmllbGQ6IHRhcmdldEZpZWxkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIHBhcmVudCwgbm90ZSwge1xyXG4gICAgICAgIGRpcjogb3BwRGlyLFxyXG4gICAgICAgIGZpZWxkOiBvcHBGaWVsZCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IHBhcnNlVHlwZWRMaW5rIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHNwbGl0TGlua3NSZWdleCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzLCBkdkZyb250bWF0dGVyQ2FjaGUsIEp1Z2dsTGluayB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldFRhcmdldE9yZGVyLCBwb3B1bGF0ZU1haW4gfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZEluZm8sIGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuXHJcbi8vIFRPRE8gSSB0aGluayBpdCdkIGJlIGJldHRlciB0byBkbyB0aGlzIHdob2xlIHRoaW5nIGFzIGFuIG9iaiBpbnN0ZWFkIG9mIEp1Z2dsTGlua1tdXHJcbi8vID0+IHtbbm90ZTogc3RyaW5nXToge3R5cGU6IHN0cmluZywgbGlua3NJbkxpbmU6IHN0cmluZ1tdfVtdfVxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SnVnZ2xMaW5rcyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGZpbGVzOiBURmlsZVtdXHJcbik6IFByb21pc2U8SnVnZ2xMaW5rW10+IHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBkYiB9ID0gcGx1Z2luO1xyXG4gIGRiLnN0YXJ0MkcoXCJnZXRKdWdnbExpbmtzXCIpO1xyXG5cclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIC8vIEFkZCBKdWdnbCBsaW5rc1xyXG4gIGNvbnN0IHR5cGVkTGlua3NBcnI6IEp1Z2dsTGlua1tdID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcclxuICAgICAgY29uc3QganVnZ2xMaW5rOiBKdWdnbExpbmsgPSB7IGZpbGUsIGxpbmtzOiBbXSB9O1xyXG5cclxuICAgICAgLy8gVXNlIE9icyBtZXRhZGF0YWNhY2hlIHRvIGdldCB0aGUgbGlua3MgaW4gdGhlIGN1cnJlbnQgZmlsZVxyXG4gICAgICBjb25zdCBsaW5rcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKT8ubGlua3MgPz8gW107XHJcblxyXG4gICAgICBjb25zdCBjb250ZW50ID0gbGlua3MubGVuZ3RoID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiBcIlwiO1xyXG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGluZU5vID0gbGluay5wb3NpdGlvbi5zdGFydC5saW5lO1xyXG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tsaW5lTm9dO1xyXG5cclxuICAgICAgICAvLyBDaGVjayB0aGUgbGluZSBmb3Igd2lraWxpbmtzLCBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGxpbmsuaW5uZXJUZXh0XHJcbiAgICAgICAgY29uc3QgbGlua3NJbkxpbmUgPVxyXG4gICAgICAgICAgbGluZVxyXG4gICAgICAgICAgICAubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KVxyXG4gICAgICAgICAgICA/Lm1hcCgobGluaykgPT4gbGluay5zbGljZSgyLCBsaW5rLmxlbmd0aCAtIDIpKVxyXG4gICAgICAgICAgICA/Lm1hcCgoaW5uZXJUZXh0KSA9PiBpbm5lclRleHQuc3BsaXQoXCJ8XCIpWzBdKSA/PyBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZWRMaW5rUHJlZml4ID1cclxuICAgICAgICAgIGFwcC5wbHVnaW5zLnBsdWdpbnMuanVnZ2w/LnNldHRpbmdzLnR5cGVkTGlua1ByZWZpeCA/PyBcIi1cIjtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyc2VkTGlua3MgPSBwYXJzZVR5cGVkTGluayhsaW5rLCBsaW5lLCB0eXBlZExpbmtQcmVmaXgpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHBhcnNlZExpbmtzPy5wcm9wZXJ0aWVzPy50eXBlID8/IFwiXCI7XHJcbiAgICAgICAgaWYgKGZpZWxkID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgeyBmaWVsZERpciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpIHx8IHt9O1xyXG4gICAgICAgIGlmICghZmllbGREaXIpIHJldHVybjtcclxuXHJcbiAgICAgICAganVnZ2xMaW5rLmxpbmtzLnB1c2goe1xyXG4gICAgICAgICAgZGlyOiBmaWVsZERpcixcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgbGlua3NJbkxpbmUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4ganVnZ2xMaW5rO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBjb25zdCBhbGxGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgY29uc3QgZmlsdGVyZWRMaW5rcyA9IHR5cGVkTGlua3NBcnIubWFwKChqdWdnbExpbmspID0+IHtcclxuICAgIC8vIEZpbHRlciBvdXQgbGlua3Mgd2hvc2UgdHlwZSBpcyBub3QgaW4gYWxsRmllbGRzXHJcbiAgICBqdWdnbExpbmsubGlua3MgPSBqdWdnbExpbmsubGlua3MuZmlsdGVyKChsaW5rKSA9PlxyXG4gICAgICBhbGxGaWVsZHMuaW5jbHVkZXMobGluay5maWVsZClcclxuICAgICk7XHJcbiAgICByZXR1cm4ganVnZ2xMaW5rO1xyXG4gIH0pO1xyXG4gIGRiLmVuZDJHKHsgZmlsdGVyZWRMaW5rcyB9KTtcclxuICByZXR1cm4gZmlsdGVyZWRMaW5rcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEp1Z2dsTGlua3NUb0dyYXBoKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIGp1Z2dsTGlua3M6IEp1Z2dsTGlua1tdLFxyXG4gIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGp1Z2dsTGlua3MuZm9yRWFjaCgoanVnZ2xMaW5rKSA9PiB7XHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBqdWdnbExpbmsuZmlsZTtcclxuICAgIGp1Z2dsTGluay5saW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgZGlyLCBmaWVsZCwgbGlua3NJbkxpbmUgfSA9IGxpbms7XHJcbiAgICAgIGlmIChkaXIgPT09IFwiXCIpIHJldHVybjtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcbiAgICAgIGxpbmtzSW5MaW5lLmZvckVhY2goKGxpbmtJbkxpbmUpID0+IHtcclxuICAgICAgICAvLyBJcyB0aGlzIGEgYnVnPyBXaHkgbm90IGBnZXRTb3VyY2VPcmRlcmA/XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0c09yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgbGlua0luTGluZSk7XHJcblxyXG4gICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgbGlua0luTGluZSxcclxuICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgdGFyZ2V0c09yZGVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQkNfTElOS19OT1RFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0U291cmNlT3JkZXIsXHJcbiAgZ2V0VGFyZ2V0T3JkZXIsXHJcbiAgcG9wdWxhdGVNYWluLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkTGlua05vdGVzVG9HcmFwaChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGVsaWdhYmxlQWx0czogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBlbGlnYWJsZUFsdHMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgbGlua05vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG4gICAgY29uc3QgbGlua05vdGVCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUobGlua05vdGVGaWxlKTtcclxuXHJcbiAgICBsZXQgZmllbGQgPSBhbHRGaWxlW0JDX0xJTktfTk9URV0gYXMgc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiB8fCAhZmllbGRzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGxpbmtzID0gYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgICAgLmdldEZpbGVDYWNoZShsaW5rTm90ZUZpbGUpXHJcbiAgICAgID8ubGlua3M/Lm1hcCgobCkgPT4gbC5saW5rLm1hdGNoKC9bXiN8XSsvKVswXSk7XHJcblxyXG4gICAgY29uc3QgZW1iZWRzID0gYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgICAgLmdldEZpbGVDYWNoZShsaW5rTm90ZUZpbGUpXHJcbiAgICAgID8uZW1iZWRzPy5tYXAoKGwpID0+IGwubGluay5tYXRjaCgvW14jfF0rLylbMF0pO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldHMgPSBbLi4uKGxpbmtzID8/IFtdKSwgLi4uKGVtYmVkcyA/PyBbXSldO1xyXG5cclxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBsaW5rTm90ZUJhc2VuYW1lKTtcclxuICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgIG1haW5HLFxyXG4gICAgICAgIGxpbmtOb3RlQmFzZW5hbWUsXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgdGFyZ2V0LFxyXG4gICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgIHRhcmdldE9yZGVyLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBCQ19JR05PUkUsIEJDX1JFR0VYX05PVEUsIEJDX1JFR0VYX05PVEVfRklFTEQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3RyVG9SZWdleCB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW4sXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWdleE5vdGVzVG9HcmFwaChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGVsaWdhYmxlQWx0czogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzLCByZWdleE5vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIGVsaWdhYmxlQWx0cy5mb3JFYWNoKChhbHRGaWxlKSA9PiB7XHJcbiAgICBjb25zdCByZWdleE5vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG4gICAgY29uc3QgcmVnZXhOb3RlQmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKHJlZ2V4Tm90ZUZpbGUpO1xyXG5cclxuICAgIGNvbnN0IHJlZ2V4ID0gc3RyVG9SZWdleChhbHRGaWxlW0JDX1JFR0VYX05PVEVdIGFzIHN0cmluZyk7XHJcbiAgICBpbmZvKHsgcmVnZXggfSk7XHJcblxyXG4gICAgbGV0IGZpZWxkID0gYWx0RmlsZVtCQ19SRUdFWF9OT1RFX0ZJRUxEXSBhcyBzdHJpbmc7XHJcbiAgICBpZiAodHlwZW9mIGZpZWxkICE9PSBcInN0cmluZ1wiIHx8ICFmaWVsZHMuaW5jbHVkZXMoZmllbGQpKVxyXG4gICAgICBmaWVsZCA9IHJlZ2V4Tm90ZUZpZWxkIHx8IGZpZWxkc1swXTtcclxuXHJcbiAgICBjb25zdCB0YXJnZXRzID0gW107XHJcbiAgICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgaWYgKHBhZ2VbQkNfSUdOT1JFXSkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUocGFnZS5maWxlKTtcclxuICAgICAgaWYgKGJhc2VuYW1lICE9PSByZWdleE5vdGVCYXNlbmFtZSAmJiByZWdleC50ZXN0KGJhc2VuYW1lKSlcclxuICAgICAgICB0YXJnZXRzLnB1c2goYmFzZW5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xyXG4gICAgICBjb25zdCBzb3VyY2VPcmRlciA9IGdldFNvdXJjZU9yZGVyKGFsdEZpbGUpO1xyXG4gICAgICBjb25zdCB0YXJnZXRPcmRlciA9IGdldFRhcmdldE9yZGVyKGZyb250bXMsIHJlZ2V4Tm90ZUJhc2VuYW1lKTtcclxuICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgIG1haW5HLFxyXG4gICAgICAgIHJlZ2V4Tm90ZUJhc2VuYW1lLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBzb3VyY2VPcmRlcixcclxuICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0lHTk9SRSxcclxuICBCQ19UQUdfTk9URSxcclxuICBCQ19UQUdfTk9URV9FWEFDVCxcclxuICBCQ19UQUdfTk9URV9GSUVMRCxcclxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGFkZEhhc2gsIGRyb3BIYXNoLCBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IGdldEFsbFRhZ3MgPSAoZmlsZTogVEZpbGUsIHdpdGhIYXNoID0gdHJ1ZSk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCB7IHRhZ3MsIGZyb250bWF0dGVyIH0gPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XHJcbiAgY29uc3QgYWxsVGFnczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgdGFncz8uZm9yRWFjaCgodCkgPT4gYWxsVGFncy5wdXNoKGRyb3BIYXNoKHQudGFnKSkpO1xyXG5cclxuICBbZnJvbnRtYXR0ZXI/LnRhZ3MgPz8gW11dLmZsYXQoKS5mb3JFYWNoKCh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNwbGl0QW5kVHJpbSh0KS5mb3JFYWNoKChpbm5lclQpID0+IGFsbFRhZ3MucHVzaChkcm9wSGFzaChpbm5lclQpKSk7XHJcbiAgfSk7XHJcbiAgW2Zyb250bWF0dGVyPy50YWcgPz8gW11dLmZsYXQoKS5mb3JFYWNoKCh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNwbGl0QW5kVHJpbSh0KS5mb3JFYWNoKChpbm5lclQpID0+IGFsbFRhZ3MucHVzaChkcm9wSGFzaChpbm5lclQpKSk7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBhbGxUYWdzLm1hcCgodCkgPT4gKHdpdGhIYXNoID8gXCIjXCIgOiBcIlwiKSArIHQudG9Mb3dlckNhc2UoKSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFnTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZWxpZ2FibGVBbHRzOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBtYWluRzogTXVsdGlHcmFwaFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMsIHRhZ05vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcbiAgZWxpZ2FibGVBbHRzLmZvckVhY2goKGFsdEZpbGUpID0+IHtcclxuICAgIGNvbnN0IHRhZ05vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG5cclxuICAgIGNvbnN0IHRhZ05vdGVCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUodGFnTm90ZUZpbGUpO1xyXG4gICAgY29uc3QgdGFnID0gYWRkSGFzaCgoYWx0RmlsZVtCQ19UQUdfTk9URV0gYXMgc3RyaW5nKS50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICBpbmZvKHsgdGFnIH0pO1xyXG5cclxuICAgIGNvbnN0IGhhc1RoaXNUYWcgPSAoZmlsZTogVEZpbGUpID0+IHtcclxuICAgICAgY29uc3QgYWxsVGFncyA9IGdldEFsbFRhZ3MoZmlsZSk7XHJcbiAgICAgIHJldHVybiBhbHRGaWxlW0JDX1RBR19OT1RFX0VYQUNUXSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyBhbGxUYWdzLmluY2x1ZGVzKHRhZylcclxuICAgICAgICA6IGFsbFRhZ3Muc29tZSgodCkgPT4gdC5pbmNsdWRlcyh0YWcpKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0cyA9IGZyb250bXNcclxuICAgICAgLm1hcCgoZmYpID0+IGZmLmZpbGUpXHJcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUucGF0aCAhPT0gdGFnTm90ZUZpbGUucGF0aCAmJiBoYXNUaGlzVGFnKGZpbGUpICYmICFmaWxlW0JDX0lHTk9SRV0pXHJcbiAgICAgIC5tYXAoZ2V0RFZCYXNlbmFtZSk7XHJcbiAgICBpbmZvKHsgdGFyZ2V0cyB9KTtcclxuXHJcbiAgICBsZXQgZmllbGQgPVxyXG4gICAgICAoYWx0RmlsZVtCQ19UQUdfTk9URV9GSUVMRF0gYXMgc3RyaW5nKSA/PyAodGFnTm90ZUZpZWxkIHx8IGZpZWxkc1swXSk7XHJcblxyXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YWdOb3RlQmFzZW5hbWUpO1xyXG4gICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgdGFnTm90ZUJhc2VuYW1lLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBzb3VyY2VPcmRlcixcclxuICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBCQ19UUkFWRVJTRV9OT1RFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGRmc0FsbFBhdGhzLCBwb3B1bGF0ZU1haW4sIHJlbW92ZUN5Y2xlcyB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVHJhdmVyc2VOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICB0cmF2ZXJzZU5vdGVzOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBtYWluRzogTXVsdGlHcmFwaCxcclxuICBvYnNHOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIHRyYXZlcnNlTm90ZXMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhbHRGaWxlO1xyXG4gICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKGZpbGUpO1xyXG4gICAgY29uc3Qgbm9DeWNsZXMgPSByZW1vdmVDeWNsZXMob2JzRywgYmFzZW5hbWUpO1xyXG5cclxuICAgIGxldCBmaWVsZCA9IGFsdEZpbGVbQkNfVFJBVkVSU0VfTk9URV0gYXMgc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiB8fCAhZmllbGRzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFsbFBhdGhzID0gZGZzQWxsUGF0aHMobm9DeWNsZXMsIGJhc2VuYW1lKTtcclxuICAgIGluZm8oYWxsUGF0aHMpO1xyXG4gICAgY29uc3QgcmV2ZXJzZWQgPSBbLi4uYWxsUGF0aHNdLm1hcCgocGF0aCkgPT4gcGF0aC5yZXZlcnNlKCkpO1xyXG4gICAgcmV2ZXJzZWQuZm9yRWFjaCgocGF0aCkgPT4ge1xyXG4gICAgICBwYXRoLmZvckVhY2goKG5vZGUsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gcGF0aFtpICsgMV07XHJcbiAgICAgICAgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICBub2RlLFxyXG4gICAgICAgICAgZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgbmV4dCxcclxuICAgICAgICAgIDk5OTksXHJcbiAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGFkZEVkZ2VJZk5vdCB9IGZyb20gXCIuL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgQkNfSV9BVU5ULCBCQ19JX0NPVVNJTiwgQkNfSV9QQVJFTlQsIEJDX0lfU0lCTElOR18xLCBCQ19JX1NJQkxJTkdfMiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGZhbGxiYWNrRmllbGQsIGdldEZpZWxkSW5mbyB9IGZyb20gXCIuL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNpYmxpbmdzRnJvbVNhbWVQYXJlbnQoZzogTXVsdGlHcmFwaCwgc2V0dGluZ3M6IEJDU2V0dGluZ3MpIHtcclxuICAgIGNvbnN0IHsgdXNlckhpZXJzLCB0cmVhdEN1cnJOb2RlQXNJbXBsaWVkU2libGluZyB9ID0gc2V0dGluZ3M7XHJcbiAgICBnLmZvckVhY2hOb2RlKChjdXJyTiwgYSkgPT4ge1xyXG4gICAgICAgIC8vIEZpbmQgcGFyZW50cyBvZiBjdXJyZW50IG5vZGVcclxuICAgICAgICBnLmZvckVhY2hPdXRFZGdlKGN1cnJOLCAoaywgY3Vyck5BdHRyLCBzLCBwYXJlbnROb2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyTkF0dHIuZGlyICE9PSBcInVwXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgZmllbGREaXIsIGZpZWxkSGllciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgY3Vyck5BdHRyLmZpZWxkKTtcclxuICAgICAgICAgICAgY29uc3QgZmllbGQgPVxyXG4gICAgICAgICAgICAgICAgZmllbGRIaWVyLnNhbWVbMF0gPz8gZmFsbGJhY2tGaWVsZChjdXJyTkF0dHIuZmllbGQsIGZpZWxkRGlyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNoaWxkcmVuIG9mIHRob3NlIHBhcmVudHNcclxuICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShwYXJlbnROb2RlLCAoaywgYSwgcywgaW1wbGllZFNpYmxpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGN1cnJlbnQgbm9kZSBpZiB0aGUgc2V0dGluZ3Mgc2F5IHRvXHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgYS5kaXIgIT09IFwiZG93blwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKCF0cmVhdEN1cnJOb2RlQXNJbXBsaWVkU2libGluZyAmJiBpbXBsaWVkU2libGluZyA9PT0gY3Vyck4pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgIGFkZEVkZ2VJZk5vdChnLCBjdXJyTiwgaW1wbGllZFNpYmxpbmcsIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXI6IFwic2FtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgIGltcGxpZWQ6IEJDX0lfU0lCTElOR18xLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRTaWJsaW5nc1BhcmVudElzUGFyZW50KGc6IE11bHRpR3JhcGgpIHtcclxuICAgIGcuZm9yRWFjaE5vZGUoKGN1cnJOLCBhKSA9PiB7XHJcbiAgICAgICAgLy8gRmluZCBzaWJsaW5ncyBvZiBjdXJyZW50IG5vZGVcclxuICAgICAgICBnLmZvckVhY2hPdXRFZGdlKGN1cnJOLCAoaywgY3Vyck5BdHRyLCBzLCBzaWJsaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyTkF0dHIuZGlyICE9PSBcInNhbWVcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBwYXJlbnRzIG9mIHRob3NlIHNpYmxpbmdzXHJcbiAgICAgICAgICAgIGcuZm9yRWFjaE91dEVkZ2Uoc2libGluZywgKGssIGEsIHMsIHBhcmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBkaXIsIGZpZWxkIH0gPSBhO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpciAhPT0gXCJ1cFwiKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgYWRkRWRnZUlmTm90KGcsIGN1cnJOLCBwYXJlbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXI6IFwidXBcIixcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZCxcclxuICAgICAgICAgICAgICAgICAgICBpbXBsaWVkOiBCQ19JX1BBUkVOVCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vLyBUcmFuc2l0aXZlIGNsb3N1cmUgb2Ygc2libGluZ3NcclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNpYmxpbmdzRnJvbVNpYmxpbmdzKGc6IE11bHRpR3JhcGgpIHsgfVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEF1bnRzVW5jbGVzKGc6IE11bHRpR3JhcGgpIHtcclxuICAgIGcuZm9yRWFjaE5vZGUoKGN1cnJOLCBhKSA9PiB7XHJcbiAgICAgICAgLy8gRmluZCBwYXJlbnRzIG9mIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgIGcuZm9yRWFjaE91dEVkZ2UoY3Vyck4sIChrLCBjdXJyRUF0dHIsIHMsIHBhcmVudE5vZGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGN1cnJFQXR0ci5kaXIgIT09IFwidXBcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBzaWJsaW5ncyBvZiB0aG9zZSBwYXJlbnRzXHJcbiAgICAgICAgICAgIGcuZm9yRWFjaE91dEVkZ2UocGFyZW50Tm9kZSwgKGssIGEsIHMsIHVuY2xlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYS5kaXIgIT09IFwic2FtZVwiKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgYWRkRWRnZUlmTm90KGcsIGN1cnJOLCB1bmNsZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcjogXCJ1cFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc3RhcnRpbmcgbm9kZSdzIHBhcmVudCBmaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjdXJyRUF0dHIuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wbGllZDogQkNfSV9BVU5ULFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENvdXNpbnMoZzogTXVsdGlHcmFwaCkge1xyXG4gICAgZy5mb3JFYWNoTm9kZSgoY3Vyck4sIGEpID0+IHtcclxuICAgICAgICAvLyBGaW5kIHBhcmVudHMgb2YgY3VycmVudCBub2RlXHJcbiAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShjdXJyTiwgKGssIGN1cnJFQXR0ciwgcywgcGFyZW50Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY3VyckVBdHRyLmRpciAhPT0gXCJ1cFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHNpYmxpbmdzIG9mIHRob3NlIHBhcmVudHNcclxuICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShwYXJlbnROb2RlLCAoaywgcGFyZW50U2libGluZ0F0dHIsIHMsIHVuY2xlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50U2libGluZ0F0dHIuZGlyICE9PSBcInNhbWVcIikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgIGcuZm9yRWFjaE91dEVkZ2UodW5jbGUsIChrLCBhLCBzLCBjb3VzaW4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYS5kaXIgIT09IFwiZG93blwiIHx8IGN1cnJOID09PSBjb3VzaW4pIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYWRkRWRnZUlmTm90KGcsIGN1cnJOLCBjb3VzaW4sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiBcInNhbWVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHBhcmVudFNpYmxpbmdBdHRyLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWVkOiBCQ19JX0NPVVNJTixcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vLyBTaXMgLS0+IE1lIDwtLSBCcm9cclxuLy8gSW1wbGllczogU2lzIDwtLT4gQnJvXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRTdHJ1Y3R1cmFsRXF1aXZhbGVuY2VTaWJsaW5ncyhnOiBNdWx0aUdyYXBoKSB7XHJcbiAgICBnLmZvckVhY2hOb2RlKChjdXJyTiwgYSkgPT4ge1xyXG4gICAgICAgIGcuZm9yRWFjaEluRWRnZShjdXJyTiwgKGssIGFTaXMsIHNpcywgXykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYVNpcy5kaXIgIT09IFwic2FtZVwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGcuZm9yRWFjaEluRWRnZShjdXJyTiwgKGssIGFCcm8sIGJybywgXykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFCcm8uZGlyICE9PSBcInNhbWVcIiB8fCBzaXMgPT09IGJybykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFCcm8uZmllbGQgPT09IGFTaXMuZmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgc2lzLCBicm8sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiBcInNhbWVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGFCcm8uZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpZWQ6IEJDX0lfU0lCTElOR18yLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBlcnJvciwgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBNYXJrZG93blZpZXcsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCBOZXh0UHJldiBmcm9tIFwiLi4vQ29tcG9uZW50cy9OZXh0UHJldi5zdmVsdGVcIjtcclxuaW1wb3J0IFRyYWlsR3JpZCBmcm9tIFwiLi4vQ29tcG9uZW50cy9UcmFpbEdyaWQuc3ZlbHRlXCI7XHJcbmltcG9ydCBUcmFpbFBhdGggZnJvbSBcIi4uL0NvbXBvbmVudHMvVHJhaWxQYXRoLnN2ZWx0ZVwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0hJREVfVFJBSUwsXHJcbiAgYmxhbmtSZWFsTkltcGxpZWQsXHJcbiAgSlVHR0xfVFJBSUxfREVGQVVMVFMsXHJcbiAgVFJBSUxfTEVOR1RIUyxcclxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncywgRWRnZUF0dHIsIFJlYWxOSW1wbGllZCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgYmZzQWxsUGF0aHMsXHJcbiAgZ2V0UmVmbGV4aXZlQ2xvc3VyZSxcclxuICBnZXRTdWJGb3JGaWVsZHMsXHJcbiAgZ2V0U3ViSW5EaXJzLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcywgZ2V0T3BwRGlyLCBnZXRPcHBGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGNyZWF0ZUp1Z2dsVHJhaWwgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvSnVnZ2xcIjtcclxuXHJcbmZ1bmN0aW9uIGdldExpbWl0ZWRUcmFpbFN1YihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncywgbWFpbkcsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IGxpbWl0VHJhaWxDaGVja2JveGVzLCB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG5cclxuICBpZiAoXHJcbiAgICBnZXRGaWVsZHModXNlckhpZXJzKS5ldmVyeSgoZmllbGQpID0+IGxpbWl0VHJhaWxDaGVja2JveGVzLmluY2x1ZGVzKGZpZWxkKSlcclxuICApIHtcclxuICAgIHJldHVybiBnZXRTdWJJbkRpcnMoY2xvc2VkRywgXCJ1cFwiKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3Qgb3BwRmllbGRzID0gbGltaXRUcmFpbENoZWNrYm94ZXNcclxuICAgICAgLm1hcCgoZmllbGQpID0+IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBcInVwXCIpPy5bMF0pXHJcbiAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiBmaWVsZCAhPT0gdW5kZWZpbmVkKTtcclxuICAgIGNvbnN0IHN1YkdyYXBoID0gZ2V0U3ViRm9yRmllbGRzKG1haW5HLCBbXHJcbiAgICAgIC4uLmxpbWl0VHJhaWxDaGVja2JveGVzLFxyXG4gICAgICAuLi5vcHBGaWVsZHMsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGNsb3NlZCA9IGdldFJlZmxleGl2ZUNsb3N1cmUoc3ViR3JhcGgsIHVzZXJIaWVycyk7XHJcbiAgICByZXR1cm4gZ2V0U3ViSW5EaXJzKGNsb3NlZCwgXCJ1cFwiKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEJyZWFkY3J1bWJzKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIGc6IE11bHRpR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlXHJcbik6IHN0cmluZ1tdW10gfCBudWxsIHtcclxuICBjb25zdCB7IGJhc2VuYW1lLCBleHRlbnNpb24gfSA9IGN1cnJGaWxlO1xyXG4gIGlmIChleHRlbnNpb24gIT09IFwibWRcIikgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvbnN0IGFsbFRyYWlscyA9IGJmc0FsbFBhdGhzKGcsIGJhc2VuYW1lKTtcclxuICBsZXQgZmlsdGVyZWRUcmFpbHMgPSBbLi4uYWxsVHJhaWxzXTtcclxuXHJcbiAgY29uc3QgeyBpbmRleE5vdGVzLCBzaG93QWxsUGF0aHNJZk5vbmVUb0luZGV4Tm90ZSB9ID0gc2V0dGluZ3M7XHJcbiAgLy8gRmlsdGVyIGZvciBpbmRleCBub3Rlc1xyXG4gIGlmIChcclxuICAgIC8vIFdvcmtzIGZvciBgdW5kZWZpbmVkYCBhbmQgYFwiXCJgXHJcbiAgICBpbmRleE5vdGVzWzBdICYmXHJcbiAgICBmaWx0ZXJlZFRyYWlscy5sZW5ndGhcclxuICApIHtcclxuICAgIGZpbHRlcmVkVHJhaWxzID0gZmlsdGVyZWRUcmFpbHMuZmlsdGVyKCh0cmFpbCkgPT5cclxuICAgICAgaW5kZXhOb3Rlcy5pbmNsdWRlcyh0cmFpbFswXSlcclxuICAgICk7XHJcbiAgICBpZiAoZmlsdGVyZWRUcmFpbHMubGVuZ3RoID09PSAwICYmIHNob3dBbGxQYXRoc0lmTm9uZVRvSW5kZXhOb3RlKVxyXG4gICAgICBmaWx0ZXJlZFRyYWlscyA9IFsuLi5hbGxUcmFpbHNdO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc29ydGVkVHJhaWxzID0gZmlsdGVyZWRUcmFpbHNcclxuICAgIC5maWx0ZXIoKHRyYWlsKSA9PiB0cmFpbC5sZW5ndGggPiAwKVxyXG4gICAgLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoIC0gYi5sZW5ndGgpO1xyXG5cclxuICByZXR1cm4gc29ydGVkVHJhaWxzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXROZXh0TlByZXYocGx1Z2luOiBCQ1BsdWdpbiwgY3Vyck5vZGU6IHN0cmluZykge1xyXG4gIGNvbnN0IHsgbWFpbkcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gIGlmICghbWFpbkcpIHJldHVybiBudWxsO1xyXG4gIGNvbnN0IG5leHROUHJldjogUmVhbE5JbXBsaWVkID0gYmxhbmtSZWFsTkltcGxpZWQoKTtcclxuXHJcbiAgbWFpbkcuZm9yRWFjaEVkZ2UoY3Vyck5vZGUsIChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGRpciwgZmllbGQsIGltcGxpZWQgfSA9IGEgYXMgRWRnZUF0dHI7XHJcbiAgICBpZiAoZGlyICE9PSBcIm5leHRcIiAmJiBkaXIgIT09IFwicHJldlwiKSByZXR1cm47XHJcbiAgICBpZiAocyA9PT0gY3Vyck5vZGUpIHtcclxuICAgICAgbmV4dE5QcmV2W2Rpcl0ucmVhbHMucHVzaCh7IGZpZWxkLCB0bzogdCwgaW1wbGllZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IG9wcEZpZWxkID0gZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIGRpcilbMF07XHJcbiAgICAgIG5leHROUHJldltnZXRPcHBEaXIoZGlyKV0uaW1wbGllZHMucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6IG9wcEZpZWxkLFxyXG4gICAgICAgIHRvOiBzLFxyXG4gICAgICAgIGltcGxpZWQsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBuZXh0TlByZXY7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFpbExlbmd0aChjdXJyOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyID0gMSkge1xyXG4gIGNvbnN0IGluZGV4ID1cclxuICAgIChUUkFJTF9MRU5HVEhTLmluZGV4T2YoY3VycikgKyBvZmZzZXQpICUgVFJBSUxfTEVOR1RIUy5sZW5ndGg7XHJcbiAgcmV0dXJuIFRSQUlMX0xFTkdUSFNbaW5kZXggPCAwID8gVFJBSUxfTEVOR1RIUy5sZW5ndGggKyBpbmRleCA6IGluZGV4XTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRyYXdUcmFpbChwbHVnaW46IEJDUGx1Z2luKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgc2V0dGluZ3MsIGRiLCBtYWluRyB9ID0gcGx1Z2luO1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBzaG93QkNzLFxyXG4gICAgICBub1BhdGhNZXNzYWdlLFxyXG4gICAgICByZXNwZWN0UmVhZGFibGVMaW5lTGVuZ3RoLFxyXG4gICAgICBzaG93VHJhaWwsXHJcbiAgICAgIHNob3dHcmlkLFxyXG4gICAgICBzaG93SnVnZ2wsXHJcbiAgICAgIHNob3dQcmV2TmV4dCxcclxuICAgICAgc2hvd0JDc0luRWRpdExQTW9kZSxcclxuICAgIH0gPSBzZXR0aW5ncztcclxuXHJcbiAgICBkYi5zdGFydDJHKFwiZHJhd1RyYWlsXCIpO1xyXG5cclxuICAgIGNvbnN0IGFjdGl2ZU1EVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG4gICAgY29uc3QgbW9kZSA9IGFjdGl2ZU1EVmlldz8uZ2V0TW9kZSgpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgIXNob3dCQ3MgfHxcclxuICAgICAgIWFjdGl2ZU1EVmlldyB8fFxyXG4gICAgICAobW9kZSAhPT0gXCJwcmV2aWV3XCIgJiYgIXNob3dCQ3NJbkVkaXRMUE1vZGUpXHJcbiAgICApIHtcclxuICAgICAgYWN0aXZlTURWaWV3Py5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKFwiLkJDLXRyYWlsXCIpPy5yZW1vdmUoKTtcclxuICAgICAgcmV0dXJuIGRiLmVuZDJHKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhY3RpdmVNRFZpZXc7XHJcbiAgICBjb25zdCB7IGZyb250bWF0dGVyIH0gPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSkgPz8ge307XHJcblxyXG5cclxuICAgIGlmIChmcm9udG1hdHRlcj8uW0JDX0hJREVfVFJBSUxdIHx8IGZyb250bWF0dGVyPy5bXCJrYW5iYW4tcGx1Z2luXCJdKSByZXR1cm4gZGIuZW5kMkcoKTtcclxuXHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBmaWxlO1xyXG4gICAgaWYgKCFtYWluRy5oYXNOb2RlKGJhc2VuYW1lKSkgcmV0dXJuIGRiLmVuZDJHKCk7XHJcblxyXG4gICAgY29uc3QgdmlldyA9XHJcbiAgICAgIG1vZGUgPT09IFwicHJldmlld1wiXHJcbiAgICAgICAgPyBhY3RpdmVNRFZpZXcucHJldmlld01vZGUuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgIFwiZGl2Lm1hcmtkb3duLXByZXZpZXctdmlld1wiXHJcbiAgICAgICAgKVxyXG4gICAgICAgIDogYWN0aXZlTURWaWV3LmNvbnRlbnRFbC5xdWVyeVNlbGVjdG9yKFwiZGl2Lm1hcmtkb3duLXNvdXJjZS12aWV3XCIpO1xyXG5cclxuICAgIGFjdGl2ZU1EVmlldy5jb250YWluZXJFbFxyXG4gICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5CQy10cmFpbFwiKVxyXG4gICAgICA/LmZvckVhY2goKHRyYWlsKSA9PiB0cmFpbC5yZW1vdmUoKSk7XHJcblxyXG4gICAgY29uc3QgY2xvc2VkVXAgPSBnZXRMaW1pdGVkVHJhaWxTdWIocGx1Z2luKTtcclxuICAgIGNvbnN0IHNvcnRlZFRyYWlscyA9IGdldEJyZWFkY3J1bWJzKHNldHRpbmdzLCBjbG9zZWRVcCwgZmlsZSk7XHJcbiAgICBpbmZvKHsgc29ydGVkVHJhaWxzIH0pO1xyXG5cclxuICAgIGNvbnN0IHtcclxuICAgICAgbmV4dDogeyByZWFsczogck5leHQsIGltcGxpZWRzOiBpTmV4dCB9LFxyXG4gICAgICBwcmV2OiB7IHJlYWxzOiByUHJldiwgaW1wbGllZHM6IGlQcmV2IH0sXHJcbiAgICB9ID0gZ2V0TmV4dE5QcmV2KHBsdWdpbiwgYmFzZW5hbWUpO1xyXG5cclxuICAgIC8vIFJlbW92ZSBkdXBsaWNhdGUgaW1wbGllZFxyXG4gICAgY29uc3QgbmV4dCA9IFsuLi5yTmV4dF07XHJcbiAgICBpTmV4dC5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGlmIChuZXh0LmZpbmRJbmRleCgobikgPT4gbi50byA9PT0gaS50bykgPT09IC0xKVxyXG4gICAgICAgIG5leHQucHVzaChpKVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBwcmV2ID0gWy4uLnJQcmV2XTtcclxuICAgIGlQcmV2LmZvckVhY2goKGkpID0+IHtcclxuICAgICAgaWYgKHByZXYuZmluZEluZGV4KChuKSA9PiBuLnRvID09PSBpLnRvKSA9PT0gLTEpXHJcbiAgICAgICAgcHJldi5wdXNoKGkpXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBub0l0ZW1zID0gIXNvcnRlZFRyYWlscy5sZW5ndGggJiYgIW5leHQubGVuZ3RoICYmICFwcmV2Lmxlbmd0aDtcclxuXHJcbiAgICBpZiAobm9JdGVtcyAmJiBub1BhdGhNZXNzYWdlID09PSBcIlwiKSByZXR1cm4gZGIuZW5kMkcoKTtcclxuXHJcbiAgICBjb25zdCBzZWxlY3RvckZvck1heFdpZHRoID1cclxuICAgICAgbW9kZSA9PT0gXCJwcmV2aWV3XCJcclxuICAgICAgICA/IFwiLm1hcmtkb3duLXByZXZpZXctdmlldy5pcy1yZWFkYWJsZS1saW5lLXdpZHRoIC5tYXJrZG93bi1wcmV2aWV3LXNpemVyXCJcclxuICAgICAgICA6IFwiXCI7XHJcblxyXG4gICAgY29uc3QgZWxGb3JNYXhXaWR0aCA9XHJcbiAgICAgIHNlbGVjdG9yRm9yTWF4V2lkdGggIT09IFwiXCJcclxuICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3JGb3JNYXhXaWR0aClcclxuICAgICAgICA6IG51bGw7XHJcbiAgICBjb25zdCBtYXhfd2lkdGggPSBlbEZvck1heFdpZHRoXHJcbiAgICAgID8gZ2V0Q29tcHV0ZWRTdHlsZShlbEZvck1heFdpZHRoKS5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4LXdpZHRoXCIpXHJcbiAgICAgIDogXCIxMDAlXCI7XHJcblxyXG4gICAgY29uc3QgdHJhaWxEaXYgPSBjcmVhdGVEaXYoe1xyXG4gICAgICBjbHM6IGBCQy10cmFpbCAke3Jlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGhcclxuICAgICAgICA/IFwiaXMtcmVhZGFibGUtbGluZS13aWR0aCBtYXJrZG93bi1wcmV2aWV3LXNpemVyIG1hcmtkb3duLXByZXZpZXctc2VjdGlvblwiXHJcbiAgICAgICAgOiBcIlwiXHJcbiAgICAgICAgfWAsXHJcbiAgICAgIGF0dHI6IHtcclxuICAgICAgICBzdHlsZTpcclxuICAgICAgICAgIChtb2RlICE9PSBcInByZXZpZXdcIiA/IGBtYXgtd2lkdGg6ICR7bWF4X3dpZHRofTtgIDogXCJcIikgK1xyXG4gICAgICAgICAgXCJtYXJnaW46IDAgYXV0bztcIiArXHJcbiAgICAgICAgICBgJHtyZXNwZWN0UmVhZGFibGVMaW5lTGVuZ3RoXHJcbiAgICAgICAgICAgID8gJ3dpZHRoOiB2YXIoLS1maWxlLWxpbmUtd2lkdGgpOydcclxuICAgICAgICAgICAgOiAnd2lkdGg6IDEwMCUnfWAsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBwbHVnaW4udmlzaXRlZC5wdXNoKFtmaWxlLnBhdGgsIHRyYWlsRGl2XSk7XHJcblxyXG4gICAgaWYgKG1vZGUgPT09IFwicHJldmlld1wiKSB7XHJcbiAgICAgIHZpZXcucXVlcnlTZWxlY3RvcihcImRpdi5tYXJrZG93bi1wcmV2aWV3LXNpemVyXCIpLmJlZm9yZSh0cmFpbERpdik7XHJcblxyXG4gICAgICAvLyBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2JzaWRpYW4tYmFubmVyLXdyYXBwZXInKVxyXG4gICAgICAvLyBpZiAoYmFubmVyKSB7XHJcbiAgICAgIC8vICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgLy8gICAgIGNvbnN0IGJhbm5lck1hcmdpbiA9IGdldENvbXB1dGVkU3R5bGUoYmFubmVyKS5tYXJnaW5Ub3BcclxuICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGJhbm5lck1hcmdpbilcclxuICAgICAgLy8gICAgIHRyYWlsRGl2LnN0eWxlLm1hcmdpblRvcCA9IGJhbm5lck1hcmdpbjtcclxuICAgICAgLy8gICAgIGJhbm5lci5zdHlsZS5tYXJnaW5Ub3AgPSAnMHB4J1xyXG4gICAgICAvLyAgIH0pXHJcbiAgICAgIC8vIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGNtR3V0dGVyID0gdmlldy5xdWVyeVNlbGVjdG9yKFwiZGl2LmNtLWd1dHRlcnNcIik7XHJcbiAgICAgIGlmIChjbUd1dHRlcikge1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBndXR0ZXJIZWlnaHQgPSB0cmFpbERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XHJcbiAgICAgICAgICAvLyBzZXQgcGFkZGluZyB0b3Agb2YgZ3V0dGVyIHRvIG1hdGNoIGhlaWdodCBvZiB0cmFpbERpdlxyXG4gICAgICAgICAgY21HdXR0ZXIuc3R5bGUucGFkZGluZ1RvcCA9IGAke2d1dHRlckhlaWdodCArIDR9cHhgO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2JzaWRpYW4tYmFubmVyLXNwYWNlcicpXHJcbiAgICAgIC8vIGlmIChiYW5uZXIpIHtcclxuICAgICAgLy8gICBjb25zb2xlLmxvZyh7IGJhbm5lciB9KVxyXG4gICAgICAvLyAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgIC8vICAgICBjb25zdCBiYW5uZXJNYXJnaW4gPSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGJhbm5lcikuaGVpZ2h0KVxyXG4gICAgICAvLyAgICAgY29uc29sZS5sb2coYmFubmVyTWFyZ2luKVxyXG4gICAgICAvLyAgICAgdHJhaWxEaXYuc3R5bGUubWFyZ2luVG9wID0gYCR7YmFubmVyTWFyZ2luICsgMTB9cHhgO1xyXG4gICAgICAvLyAgICAgYmFubmVyLnN0eWxlLmhlaWdodCA9ICcwcHgnXHJcbiAgICAgIC8vICAgfSlcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgdmlldy5xdWVyeVNlbGVjdG9yKFwiZGl2LmNtLWNvbnRlbnRDb250YWluZXJcIik/LmJlZm9yZSh0cmFpbERpdilcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRyYWlsRGl2LmVtcHR5KCk7XHJcbiAgICBpZiAoc2V0dGluZ3MuaW5kZXhOb3Rlcy5pbmNsdWRlcyhiYXNlbmFtZSkpIHtcclxuICAgICAgdHJhaWxEaXYuaW5uZXJUZXh0ID0gXCJJbmRleCBOb3RlXCI7XHJcbiAgICAgIHJldHVybiBkYi5lbmQyRygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChub0l0ZW1zKSB7XHJcbiAgICAgIHRyYWlsRGl2LmlubmVyVGV4dCA9IG5vUGF0aE1lc3NhZ2U7XHJcbiAgICAgIHJldHVybiBkYi5lbmQyRygpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhcmdldFByb3BzID0ge1xyXG4gICAgICB0YXJnZXQ6IHRyYWlsRGl2LFxyXG4gICAgICBwcm9wczogeyBzb3J0ZWRUcmFpbHMsIHBsdWdpbiB9LFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoc2hvd1RyYWlsICYmIHNvcnRlZFRyYWlscy5sZW5ndGgpIG5ldyBUcmFpbFBhdGgodGFyZ2V0UHJvcHMpO1xyXG4gICAgaWYgKHNob3dHcmlkICYmIHNvcnRlZFRyYWlscy5sZW5ndGgpIG5ldyBUcmFpbEdyaWQodGFyZ2V0UHJvcHMpO1xyXG4gICAgaWYgKHNob3dQcmV2TmV4dCAmJiAobmV4dC5sZW5ndGggfHwgcHJldi5sZW5ndGgpKSB7XHJcbiAgICAgIG5ldyBOZXh0UHJldih7XHJcbiAgICAgICAgdGFyZ2V0OiB0cmFpbERpdixcclxuICAgICAgICBwcm9wczogeyBwbHVnaW4sIG5leHQsIHByZXYgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2hvd0p1Z2dsICYmIHNvcnRlZFRyYWlscy5sZW5ndGgpIHtcclxuICAgICAgY3JlYXRlSnVnZ2xUcmFpbChcclxuICAgICAgICBwbHVnaW4sXHJcbiAgICAgICAgdHJhaWxEaXYsXHJcbiAgICAgICAgc29ydGVkVHJhaWxzLFxyXG4gICAgICAgIGJhc2VuYW1lLFxyXG4gICAgICAgIEpVR0dMX1RSQUlMX0RFRkFVTFRTXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBkYi5lbmQyRygpO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgZXJyb3IoZXJyKTtcclxuICAgIHBsdWdpbi5kYi5lbmQyRygpO1xyXG4gIH1cclxufVxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgeyBvcGVuT3JTd2l0Y2gsIGhvdmVyUHJldmlldyB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBTcXVhcmVJdGVtIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IGxpbmtDbGFzcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBleHBvcnQgbGV0IG5leHQ6IFNxdWFyZUl0ZW1bXTtcclxuICBleHBvcnQgbGV0IHByZXY6IFNxdWFyZUl0ZW1bXTtcclxuXHJcbiAgY29uc3QgYWN0aXZlTGVhZlZpZXcgPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldztcclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2IGNsYXNzPVwiQkMtTmV4dFByZXYtQ29udGFpbmVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cIkJDLXByZXZzXCI+XHJcbiAgICA8c3Bhbj5cclxuICAgICAgeyNlYWNoIHByZXYgYXMgeyBmaWVsZCwgcmVhbCwgdG8gfX1cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cIntsaW5rQ2xhc3ModG8sIHJlYWwpfSBCQy1wcmV2XCJcclxuICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKHRvLCBlKX1cclxuICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBhY3RpdmVMZWFmVmlldywgdG8pfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzdHJvbmc+e2ZpZWxkfTwvc3Ryb25nPlxyXG4gICAgICAgICAge3RvfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB7L2VhY2h9XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cIkJDLW5leHRzXCI+XHJcbiAgICA8c3Bhbj5cclxuICAgICAgeyNlYWNoIG5leHQgYXMgeyBmaWVsZCwgcmVhbCwgdG8gfX1cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cIntsaW5rQ2xhc3ModG8sIHJlYWwpfSBCQy1uZXh0XCJcclxuICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKHRvLCBlKX1cclxuICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBhY3RpdmVMZWFmVmlldywgdG8pfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt0b30gPHN0cm9uZz57ZmllbGR9PC9zdHJvbmc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHsvZWFjaH1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcbiAgLkJDLW5leHRzIGRpdiB7XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICB9XHJcblxyXG4gIC5CQy1uZXh0cyB7XHJcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICB9XHJcbiAgLkJDLXByZXZzIHtcclxuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICB9XHJcblxyXG4gIC5CQy1OZXh0UHJldi1Db250YWluZXIge1xyXG4gICAgZGlzcGxheTogZ3JpZDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7XHJcbiAgICBob3ZlclByZXZpZXcsXHJcbiAgICBvcGVuT3JTd2l0Y2gsXHJcbiAgfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzXCI7XHJcbiAgaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuICBpbXBvcnQge1xyXG4gICAgZHJvcERlbmRyb24sXHJcbiAgICBwYWRBcnJheSxcclxuICAgIHJ1bnMsXHJcbiAgICB0cmFuc3Bvc2UsXHJcbiAgfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbiAgaW1wb3J0IHsgZ2V0QWx0LCBsaW5rQ2xhc3MgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuICBleHBvcnQgbGV0IHNvcnRlZFRyYWlsczogc3RyaW5nW11bXTtcclxuICBleHBvcnQgbGV0IHBsdWdpbjogQkNQbHVnaW47XHJcblxyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IGdyaWREZWZhdWx0RGVwdGggfSA9IHNldHRpbmdzO1xyXG5cclxuICBjb25zdCBhY3RpdmVMZWFmVmlldyA9IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3O1xyXG4gIGNvbnN0IG1heExlbmd0aCA9IHNvcnRlZFRyYWlscy5sYXN0KCkubGVuZ3RoO1xyXG5cclxuICAvLyBVc2UgdGhlIHVzZXIgc2V0dGluZyB0byBsaW1pdCB0aGUgaW5pdGlhbCBkZXB0aFxyXG4gIGxldCBkZXB0aCA9IE1hdGgubWluKG1heExlbmd0aCwgZ3JpZERlZmF1bHREZXB0aCk7XHJcblxyXG4gIGxldCBzbGljZWRUcmFpbHMgPSBzb3J0ZWRUcmFpbHM7XHJcbiAgJDoge1xyXG4gICAgc2xpY2VkVHJhaWxzID0gW107XHJcbiAgICBzb3J0ZWRUcmFpbHMuZm9yRWFjaCgodHJhaWwpID0+IHtcclxuICAgICAgY29uc3Qgc2xpY2UgPSB0cmFpbC5zbGljZShtYXhMZW5ndGggLSBkZXB0aCk7XHJcbiAgICAgIGlmIChzbGljZS5sZW5ndGgpIHNsaWNlZFRyYWlscy5wdXNoKHNsaWNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgJDogcGFkZGVkVHJhaWxzID0gc2xpY2VkVHJhaWxzLm1hcCgodHJhaWwpID0+IHBhZEFycmF5KHRyYWlsLCBkZXB0aCkpO1xyXG5cclxuICAkOiB0cmFuc3Bvc2VkVHJhaWxzID0gdHJhbnNwb3NlKHBhZGRlZFRyYWlscyk7XHJcbiAgJDogYWxsUnVucyA9IHRyYW5zcG9zZWRUcmFpbHMubWFwKHJ1bnMpO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1ncmlkLXdyYXBwZXJcIj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cIkJDLXRyYWlsLWdyaWRcIlxyXG4gICAgc3R5bGU9XCJcclxuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB7JzFmciAnLnJlcGVhdCh0cmFuc3Bvc2VkVHJhaWxzLmxlbmd0aCl9O1xyXG4gICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHsnMWZyICcucmVwZWF0KHNsaWNlZFRyYWlscy5sZW5ndGgpfTtcIlxyXG4gID5cclxuICAgIHsjZWFjaCB0cmFuc3Bvc2VkVHJhaWxzIGFzIGNvbCwgaX1cclxuICAgICAgeyNlYWNoIGFsbFJ1bnNbaV0gYXMgeyB2YWx1ZSwgZmlyc3QsIGxhc3QgfX1cclxuICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiQkMtdHJhaWwtZ3JpZC1pdGVtIHt2YWx1ZSA9PT0gJycgPyAnQkMtZmlsbGVyJyA6ICcnfVwiXHJcbiAgICAgICAgICBzdHlsZT1cIlxyXG4gICAgICAgICAgICAgIGdyaWQtYXJlYToge2ZpcnN0ICsgMX0gLyB7aSArIDF9IC9cclxuICAgICAgICAgICAgICAgICAge2xhc3QgKyAyfSAvIHtpICsgMn07XCJcclxuICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKHZhbHVlLCBlKX1cclxuICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBhY3RpdmVMZWFmVmlldywgdmFsdWUpfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9e2xpbmtDbGFzcyh2YWx1ZSl9PlxyXG4gICAgICAgICAgICB7Z2V0QWx0KHZhbHVlLCBwbHVnaW4pID8/IGRyb3BEZW5kcm9uKHZhbHVlLCBzZXR0aW5ncyl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgey9lYWNofVxyXG4gICAgey9lYWNofVxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiQkMtZ3JpZC1vcHRpb25zXCI+XHJcbiAgICA8c3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJCQy1ncmlkLW9wdGlvbnMtaWNvblwiPlx1MjY5OVx1RkUwRjwvc3Bhbj5cclxuXHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiQkMtZ3JpZC1vcHRpb25zLW9wdGlvbnNcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cIkJDLWRlcHRoLWJ1dHRvblwiXHJcbiAgICAgICAgICBkaXNhYmxlZD17ZGVwdGggPT09IDF9XHJcbiAgICAgICAgICBvbjpjbGljaz17KCkgPT4gKGRlcHRoIC09IDEpfT4tPC9idXR0b25cclxuICAgICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cmVlLWl0ZW0tZmxhaXJcIj57ZGVwdGh9PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiQkMtZGVwdGgtYnV0dG9uXCJcclxuICAgICAgICAgIGRpc2FibGVkPXtkZXB0aCA9PT0gbWF4TGVuZ3RofVxyXG4gICAgICAgICAgb246Y2xpY2s9eygpID0+IChkZXB0aCArPSAxKX0+KzwvYnV0dG9uXHJcbiAgICAgICAgPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIGRpdi5CQy1ncmlkLXdyYXBwZXIge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIH1cclxuXHJcbiAgZGl2LkJDLXRyYWlsLWdyaWQge1xyXG4gICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gICAgZGlzcGxheTogZ3JpZDtcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgd2lkdGg6IGF1dG87XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgfVxyXG5cclxuICAuQkMtZ3JpZC1vcHRpb25zIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMHB4O1xyXG4gICAgcmlnaHQ6IDBweDtcclxuICAgIGhlaWdodDogMzVweDtcclxuICAgIHdpZHRoOiAzMnB4O1xyXG5cclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XHJcblxyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG5cclxuICAgIHRyYW5zaXRpb246IHdpZHRoIDAuM3M7XHJcbiAgICBvdmVyZmxvdy13cmFwOiBub3JtYWw7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuICBkaXYuQkMtZ3JpZC1vcHRpb25zOmhvdmVyIHtcclxuICAgIHBhZGRpbmc6IDVweDtcclxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcclxuICB9XHJcbiAgZGl2LkJDLWdyaWQtb3B0aW9uczpob3ZlciAuQkMtZ3JpZC1vcHRpb25zLWljb24ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcblxyXG4gIC5CQy1ncmlkLW9wdGlvbnMtb3B0aW9ucyB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxuICBkaXYuQkMtZ3JpZC1vcHRpb25zOmhvdmVyIC5CQy1ncmlkLW9wdGlvbnMtb3B0aW9ucyB7XHJcbiAgICBkaXNwbGF5OiB1bnNldDtcclxuICB9XHJcblxyXG4gIC5CQy1kZXB0aC1idXR0b24ge1xyXG4gICAgcGFkZGluZzogM3B4IDVweDtcclxuICB9XHJcblxyXG4gIGRpdi5CQy10cmFpbC1ncmlkLWl0ZW0ge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICBwYWRkaW5nOiAycHg7XHJcbiAgICBmb250LXNpemU6IHNtYWxsZXI7XHJcbiAgfVxyXG5cclxuICBkaXYuQkMtdHJhaWwtZ3JpZC1pdGVtLkJDLWZpbGxlciB7XHJcbiAgICBvcGFjaXR5OiAwLjc7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQge1xyXG4gICAgaG92ZXJQcmV2aWV3LFxyXG4gICAgb3Blbk9yU3dpdGNoLFxyXG4gIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG4gIGltcG9ydCB7IGdldFRyYWlsTGVuZ3RoIH0gZnJvbSBcIi4uL1ZpZXdzL1RyYWlsVmlld1wiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgZHJvcERlbmRyb24gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbiAgaW1wb3J0IHsgZ2V0QWx0IH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBzb3J0ZWRUcmFpbHM6IHN0cmluZ1tdW107XHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB2aWV3IH0gPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWY7XHJcbiAgbGV0IHsgc2hvd0FsbCwgbm9QYXRoTWVzc2FnZSwgdHJhaWxTZXBlcmF0b3IgfSA9IHNldHRpbmdzO1xyXG5cclxuICBsZXQgdHJhaWxfbGVuZ3RoID0gc2hvd0FsbDtcclxuXHJcbiAgJDogdHJhaWxzVG9TaG93ID1cclxuICAgIHRyYWlsX2xlbmd0aCA9PSBcIkFsbFwiXHJcbiAgICAgID8gc29ydGVkVHJhaWxzXHJcbiAgICAgIDogdHJhaWxfbGVuZ3RoID09IFwiU2hvcnRlc3RcIlxyXG4gICAgICA/IFtzb3J0ZWRUcmFpbHNbMF1dXHJcbiAgICAgIDogW3NvcnRlZFRyYWlscy5sYXN0KCldO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzcGFuIGNsYXNzPVwiQkMtdHJhaWwtcGF0aC1jb250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwidHJhaWxzLWRpdlwiPlxyXG4gICAgeyNlYWNoIHRyYWlsc1RvU2hvdyBhcyB0cmFpbH1cclxuICAgICAgPGRpdj5cclxuICAgICAgICB7I2lmICF0cmFpbC5sZW5ndGh9XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIkJDLWVtcHR5LXRyYWlsXCI+e25vUGF0aE1lc3NhZ2V9PC9zcGFuPlxyXG4gICAgICAgIHs6ZWxzZX1cclxuICAgICAgICAgIHsjZWFjaCB0cmFpbCBhcyBjcnVtYiwgaX1cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmsgQkMtTGlua1wiXHJcbiAgICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2goY3J1bWIsIGUpfVxyXG4gICAgICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCB2aWV3LCBjcnVtYil9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7Z2V0QWx0KGNydW1iLCBwbHVnaW4pID8/IGRyb3BEZW5kcm9uKGNydW1iLCBzZXR0aW5ncyl9XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgeyNpZiBpIDwgdHJhaWwubGVuZ3RoIC0gMX1cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIkJDLXRyYWlsLXNlcFwiPntcIiBcIiArIHRyYWlsU2VwZXJhdG9yICsgXCIgXCJ9PC9zcGFuPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgey9lYWNofVxyXG4gICAgICAgIHsvaWZ9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgey9lYWNofVxyXG4gIDwvZGl2PlxyXG5cclxuICB7I2lmIHNvcnRlZFRyYWlscy5sZW5ndGggPiAxfVxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnV0dG9uLWRpdlwiXHJcbiAgICAgICAgb246Y2xpY2s9eygpID0+ICh0cmFpbF9sZW5ndGggPSBnZXRUcmFpbExlbmd0aCh0cmFpbF9sZW5ndGgpKX1cclxuICAgICAgICBvbjpjb250ZXh0bWVudT17KGUpID0+IHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRyYWlsX2xlbmd0aCA9IGdldFRyYWlsTGVuZ3RoKHRyYWlsX2xlbmd0aCwgLTEpO1xyXG4gICAgICAgIH19XHJcbiAgICAgID5cclxuICAgICAgICB7dHJhaWxfbGVuZ3RofVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIHsvaWZ9XHJcbjwvc3Bhbj5cclxuXHJcbjxzdHlsZT5cclxuICBzcGFuLkJDLXRyYWlsLXBhdGgtY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHR5cGUgeyBFZGdlRGVmaW5pdGlvbiwgTm9kZVNpbmd1bGFyIH0gZnJvbSBcImN5dG9zY2FwZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQge1xyXG4gIERhdGFTdG9yZUV2ZW50cyxcclxuICBnZXRQbHVnaW4sXHJcbiAgSUNvcmVEYXRhU3RvcmUsXHJcbiAgSUp1Z2dsLFxyXG4gIElKdWdnbFNldHRpbmdzLFxyXG4gIElKdWdnbFN0b3JlcyxcclxuICBub2RlRGFuZ2xpbmcsXHJcbiAgbm9kZUZyb21GaWxlLFxyXG4gIFZpeklkLFxyXG59IGZyb20gXCJqdWdnbC1hcGlcIjtcclxuaW1wb3J0IHsgaW5mbywgd2FybiB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50cywgTWV0YWRhdGFDYWNoZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgY3JlYXRlSW5kZXggfSBmcm9tIFwiLi4vQ29tbWFuZHMvQ3JlYXRlSW5kZXhcIjtcclxuaW1wb3J0IEp1Z2dsQnV0dG9uIGZyb20gXCIuLi9Db21wb25lbnRzL0p1Z2dsQnV0dG9uLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgSnVnZ2xEZXB0aCBmcm9tIFwiLi4vQ29tcG9uZW50cy9KdWdnbERlcHRoLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgeyBKVUdHTF9DQl9ERUZBVUxUUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBkZnNBbGxQYXRocyxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFN1YkluRGlycyxcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5jb25zdCBTVE9SRV9JRCA9IFwiY29yZVwiO1xyXG5cclxuY2xhc3MgQkNTdG9yZUV2ZW50cyBleHRlbmRzIEV2ZW50cyBpbXBsZW1lbnRzIERhdGFTdG9yZUV2ZW50cyB7IH1cclxuXHJcbmV4cG9ydCBjbGFzcyBCQ1N0b3JlIGV4dGVuZHMgQ29tcG9uZW50IGltcGxlbWVudHMgSUNvcmVEYXRhU3RvcmUge1xyXG4gIGdyYXBoOiBNdWx0aUdyYXBoO1xyXG4gIGNhY2hlOiBNZXRhZGF0YUNhY2hlO1xyXG4gIGRlcHRoTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBncmFwaDogTXVsdGlHcmFwaCxcclxuICAgIG1ldGFkYXRhOiBNZXRhZGF0YUNhY2hlLFxyXG4gICAgZGVwdGhNYXA/OiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH1cclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmdyYXBoID0gZ3JhcGg7XHJcbiAgICB0aGlzLmNhY2hlID0gbWV0YWRhdGE7XHJcbiAgICB0aGlzLmRlcHRoTWFwID0gZGVwdGhNYXA7XHJcbiAgfVxyXG5cclxuICBhc1N0cmluZyhub2RlOiBOb2RlU2luZ3VsYXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWQgPSBWaXpJZC5mcm9tTm9kZShub2RlKTtcclxuICAgIHJldHVybiBpZC5pZC5zbGljZSgwLCAtMyk7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlKG5vZGVJZDogVml6SWQpOiBURmlsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub2RlSWQuaWQsIFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29ubmVjdE5vZGVzKFxyXG4gICAgYWxsTm9kZXM6IGN5dG9zY2FwZS5Ob2RlQ29sbGVjdGlvbixcclxuICAgIG5ld05vZGVzOiBjeXRvc2NhcGUuTm9kZUNvbGxlY3Rpb24sXHJcbiAgICBncmFwaDogSUp1Z2dsXHJcbiAgKTogUHJvbWlzZTxjeXRvc2NhcGUuRWRnZURlZmluaXRpb25bXT4ge1xyXG4gICAgY29uc3QgZWRnZXM6IEVkZ2VEZWZpbml0aW9uW10gPSBbXTtcclxuICAgIGNvbnN0IG5vZGVzTGlzdFMgPSBuZXcgU2V0KFxyXG4gICAgICBhbGxOb2Rlcy5tYXAoKG5vZGUpID0+IHRoaXMuYXNTdHJpbmcobm9kZSkpLmZpbHRlcigocykgPT4gcylcclxuICAgICk7XHJcbiAgICBuZXdOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmFzU3RyaW5nKG5vZGUpO1xyXG4gICAgICBpZiAoIXRoaXMuZ3JhcGguaGFzTm9kZShuYW1lKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdyYXBoLmZvckVhY2hPdXRFZGdlKFxyXG4gICAgICAgIHRoaXMuYXNTdHJpbmcobm9kZSksXHJcbiAgICAgICAgKGtleSwgYXR0ciwgc291cmNlLCB0YXJnZXQpID0+IHtcclxuICAgICAgICAgIGlmIChub2Rlc0xpc3RTLmhhcyh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIGVkZ2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIGlkOiBgQkM6JHtzb3VyY2V9LT4ke3RhcmdldH1gLFxyXG4gICAgICAgICAgICAgICAgc291cmNlOiBWaXpJZC50b0lkKHNvdXJjZSwgU1RPUkVfSUQpICsgXCIubWRcIixcclxuICAgICAgICAgICAgICAgIHRhcmdldDogVml6SWQudG9JZCh0YXJnZXQsIFNUT1JFX0lEKSArIFwiLm1kXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhdHRyLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgZGlyOiBhdHRyLmRpcixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNsYXNzZXM6IGB0eXBlLSR7YXR0ci5maWVsZH0gZGlyLSR7YXR0ci5kaXJ9IGJyZWFkY3J1bWJzJGAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlZGdlcyk7XHJcbiAgfVxyXG5cclxuICBnZXRFdmVudHModmlldzogSUp1Z2dsKTogRGF0YVN0b3JlRXZlbnRzIHtcclxuICAgIHJldHVybiBuZXcgQkNTdG9yZUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0TmVpZ2hib3VyaG9vZChcclxuICAgIG5vZGVJZHM6IFZpeklkW10sXHJcbiAgICB2aWV3OiBJSnVnZ2xcclxuICApOiBQcm9taXNlPGN5dG9zY2FwZS5Ob2RlRGVmaW5pdGlvbltdPiB7XHJcbiAgICBjb25zdCBuZXdfbm9kZXMgPSBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZUlkIG9mIG5vZGVJZHMpIHtcclxuICAgICAgY29uc3QgbmFtZSA9IG5vZGVJZC5pZC5zbGljZSgwLCAtMyk7XHJcbiAgICAgIGlmICghdGhpcy5ncmFwaC5oYXNOb2RlKG5hbWUpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBuZXdfbm9kZSBvZiB0aGlzLmdyYXBoLm5laWdoYm9ycyhuYW1lKSkge1xyXG4gICAgICAgIG5ld19ub2Rlcy5wdXNoKFxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXQobmV3IFZpeklkKG5ld19ub2RlICsgXCIubWRcIiwgU1RPUkVfSUQpLCB2aWV3KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXdfbm9kZXM7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoTm9kZShpZDogVml6SWQsIHZpZXc6IElKdWdnbCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHN0b3JlSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTVE9SRV9JRDtcclxuICB9XHJcblxyXG4gIGdldChub2RlSWQ6IFZpeklkLCB2aWV3OiBJSnVnZ2wpOiBQcm9taXNlPGN5dG9zY2FwZS5Ob2RlRGVmaW5pdGlvbj4ge1xyXG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZ2V0RmlsZShub2RlSWQpO1xyXG4gICAgbGV0IGRlcHRoID0gMDtcclxuICAgIGlmICh0aGlzLmRlcHRoTWFwICYmIG5vZGVJZC5pZCBpbiB0aGlzLmRlcHRoTWFwKSB7XHJcbiAgICAgIGRlcHRoID0gdGhpcy5kZXB0aE1hcFtub2RlSWQuaWRdO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgICAgY29uc3QgZGFuZ2xpbmcgPSBub2RlRGFuZ2xpbmcobm9kZUlkLmlkKTtcclxuICAgICAgZGFuZ2xpbmcuZGF0YS5kZXB0aCA9IGRlcHRoO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhbmdsaW5nKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XHJcbiAgICBpZiAoY2FjaGUgPT09IG51bGwpIHtcclxuICAgICAgaW5mbyhcInJldHVybmluZyBlbXB0eSBjYWNoZVwiLCBub2RlSWQpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGVEYW5nbGluZyhub2RlSWQuaWQpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9kZUZyb21GaWxlKGZpbGUsIHZpZXcucGx1Z2luLCB2aWV3LnNldHRpbmdzLCBub2RlSWQudG9JZCgpKS50aGVuKFxyXG4gICAgICAobm9kZSkgPT4ge1xyXG4gICAgICAgIG5vZGUuZGF0YS5kZXB0aCA9IGRlcHRoO1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUp1Z2dsKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudCxcclxuICBpbml0aWFsTm9kZXM6IHN0cmluZ1tdLFxyXG4gIGFyZ3M6IElKdWdnbFNldHRpbmdzLFxyXG4gIGRlcHRoTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH0gPSBudWxsXHJcbik6IElKdWdnbCB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGp1Z2dsUGx1Z2luID0gZ2V0UGx1Z2luKGFwcCk7XHJcbiAgICBpZiAoIWp1Z2dsUGx1Z2luKSB7XHJcbiAgICAgIC8vIFRPRE86IEVycm9yIGhhbmRsaW5nXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGtleSBpbiBKVUdHTF9DQl9ERUZBVUxUUykge1xyXG4gICAgICBpZiAoa2V5IGluIGFyZ3MgJiYgYXJnc1trZXldID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgYXJnc1trZXldID0gSlVHR0xfQ0JfREVGQVVMVFNba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiY1N0b3JlID0gbmV3IEJDU3RvcmUoXHJcbiAgICAgIHBsdWdpbi5tYWluRyxcclxuICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUsXHJcbiAgICAgIGRlcHRoTWFwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc3RvcmVzOiBJSnVnZ2xTdG9yZXMgPSB7XHJcbiAgICAgIGNvcmVTdG9yZTogYmNTdG9yZSxcclxuICAgICAgZGF0YVN0b3JlczogW2JjU3RvcmVdLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBqdWdnbCA9IGp1Z2dsUGx1Z2luLmNyZWF0ZUp1Z2dsKHRhcmdldCwgYXJncywgc3RvcmVzLCBpbml0aWFsTm9kZXMpO1xyXG4gICAgcGx1Z2luLmFkZENoaWxkKGp1Z2dsKTtcclxuICAgIGluZm8oeyBqdWdnbCB9KTtcclxuICAgIHJldHVybiBqdWdnbDtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgd2Fybih7IGVycm9yIH0pO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tVG9Tb3VyY2UoanVnZ2w6IElKdWdnbCwgc291cmNlOiBzdHJpbmcpIHtcclxuICBpZiAoIWp1Z2dsKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGp1Z2dsLm9uKFwidml6UmVhZHlcIiwgKHZpeikgPT4ge1xyXG4gICAgLy8gQWZ0ZXIgbGF5b3V0IGlzIGRvbmUsIGNlbnRlciBvbiBzb3VyY2Ugbm9kZVxyXG4gICAgdml6Lm9uZShcImxheW91dHN0b3BcIiwgKGUpID0+IHtcclxuICAgICAgY29uc3Qgdml6ID0gZS5jeTtcclxuICAgICAgY29uc3Qgbm9kZSA9IHZpei4kaWQoVml6SWQudG9JZChzb3VyY2UgKyBcIi5tZFwiLCBTVE9SRV9JRCkpO1xyXG4gICAgICB2aXouYW5pbWF0ZSh7XHJcbiAgICAgICAgY2VudGVyOiB7XHJcbiAgICAgICAgICBlbGVzOiBub2RlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZHVyYXRpb246IDI1MCxcclxuICAgICAgICBxdWV1ZTogZmFsc2UsXHJcbiAgICAgICAgem9vbTogMS43LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tVG9HcmFwaChqdWdnbDogSUp1Z2dsKSB7XHJcbiAganVnZ2wub24oXCJ2aXpSZWFkeVwiLCAodml6KSA9PiB7XHJcbiAgICB2aXouZml0KHZpei5ub2RlcygpKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRGVwdGhNYXAoXHJcbiAgcGF0aHM6IHN0cmluZ1tdW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgb2Zmc2V0ID0gMFxyXG4pOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfSB7XHJcbiAgLy8gVE9ETzogSXMgdGhlcmUgYSBCQyBmdW5jdGlvbiBmb3IgdGhpcyBhbHJlYWR5P1xyXG4gIGxldCBkZXB0aE1hcDogeyBbdmFsdWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgZGVwdGhNYXBbc291cmNlICsgXCIubWRcIl0gPSAwO1xyXG4gIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBuYW1lID0gcGF0aFtpXSArIFwiLm1kXCI7XHJcbiAgICAgIGNvbnN0IGRlcHRoID0gcGF0aC5sZW5ndGggLSBpIC0gMSArIG9mZnNldDtcclxuICAgICAgaWYgKG5hbWUgaW4gZGVwdGhNYXApIHtcclxuICAgICAgICBkZXB0aE1hcFtuYW1lXSA9IE1hdGgubWluKGRlcHRoTWFwW25hbWVdLCBkZXB0aCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVwdGhNYXBbbmFtZV0gPSBkZXB0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBkZXB0aE1hcDtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlRGVwdGgoanVnZ2w6IElKdWdnbCwgZGVwdGg6IG51bWJlcikge1xyXG4gIGp1Z2dsLnZpei4kKGBbZGVwdGg+JHtkZXB0aH1dYCkuYWRkQ2xhc3MoXCJmaWx0ZXJlZFwiKTtcclxuICBqdWdnbC52aXouJChgW2RlcHRoPD0ke2RlcHRofV1gKS5yZW1vdmVDbGFzcyhcImZpbHRlcmVkXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnVnZ2xUcmFpbChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHRhcmdldDogSFRNTEVsZW1lbnQsXHJcbiAgcGF0aHM6IHN0cmluZ1tdW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgYXJnczogSUp1Z2dsU2V0dGluZ3NcclxuKSB7XHJcbiAgY29uc3QgdG9vbGJhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgdG9vbGJhckRpdi5hZGRDbGFzcyhcImN5LXRvb2xiYXJcIik7XHJcbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHRvb2xiYXJEaXYpO1xyXG5cclxuICBjb25zdCBzZWN0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBzZWN0RGl2LmFkZENsYXNzKFwiY3ktdG9vbGJhci1zZWN0aW9uXCIpO1xyXG4gIHRvb2xiYXJEaXYuYXBwZW5kQ2hpbGQoc2VjdERpdik7XHJcblxyXG4gIGNvbnN0IGFtdENoaWxkcmVuID0gdGFyZ2V0LmNoaWxkcmVuLmxlbmd0aDtcclxuXHJcbiAgbGV0IGp1Z2dsVXA6IElKdWdnbCA9IG51bGw7XHJcbiAgbGV0IGp1Z2dsRG93bjogSUp1Z2dsID0gbnVsbDtcclxuXHJcbiAgbmV3IEp1Z2dsQnV0dG9uKHtcclxuICAgIHRhcmdldDogc2VjdERpdixcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIGljb246IFwiXHUyMTkxXCIsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICBpZiAoanVnZ2xVcCkge1xyXG4gICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuW2FtdENoaWxkcmVuXS5jbGFzc0xpc3QucmVtb3ZlKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgIGRlcHRoVXAuJHNldCh7IHZpc2libGU6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChqdWdnbERvd24pIHtcclxuICAgICAgICAgIHRhcmdldC5jaGlsZHJlblthbXRDaGlsZHJlbiArIDFdLmNsYXNzTGlzdC5hZGQoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgZGVwdGhEb3duLiRzZXQoeyB2aXNpYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgdGl0bGU6IFwiU2hvdyB1cCBncmFwaFwiLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgbmV3IEp1Z2dsQnV0dG9uKHtcclxuICAgIHRhcmdldDogc2VjdERpdixcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIGljb246IFwiXHUyMTkzXCIsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICBpZiAoanVnZ2xEb3duKSB7XHJcbiAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bYW10Q2hpbGRyZW4gKyAxXS5jbGFzc0xpc3QucmVtb3ZlKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgIGRlcHRoVXAuJHNldCh7IHZpc2libGU6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgaWYgKGp1Z2dsVXApIHtcclxuICAgICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuW2FtdENoaWxkcmVuXS5jbGFzc0xpc3QuYWRkKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgICAgZGVwdGhEb3duLiRzZXQoeyB2aXNpYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdWIgPSBnZXRTdWJJbkRpcnMocGx1Z2luLm1haW5HLCBcImRvd25cIiwgXCJ1cFwiKTtcclxuICAgICAgICBjb25zdCBjbG9zZWQgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKHN1YiwgcGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycyk7XHJcbiAgICAgICAgY29uc3Qgc3ViQ2xvc2VkID0gZ2V0U3ViSW5EaXJzKGNsb3NlZCwgXCJkb3duXCIpO1xyXG5cclxuXHJcbiAgICAgICAgY29uc3QgeyBjcmVhdGVJbmRleEluZGVudCB9ID0gcGx1Z2luLnNldHRpbmdzXHJcbiAgICAgICAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhzdWJDbG9zZWQsIHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBjcmVhdGVJbmRleChhbGxQYXRocywgZmFsc2UsIGNyZWF0ZUluZGV4SW5kZW50KTtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IGluZGV4XHJcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcclxuICAgICAgICAgIC5tYXAoKGxpbmUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50LmpvaW4oXCItIFwiKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZmlsdGVyKChwYWlyKSA9PiBwYWlyKTtcclxuICAgICAgICBsZXQgZGVwdGhNYXBEb3duID0gY3JlYXRlRGVwdGhNYXAoYWxsUGF0aHMsIHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgbWF4RGVwdGhEb3duID0gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhkZXB0aE1hcERvd24pKTtcclxuXHJcbiAgICAgICAgZGVwdGhEb3duID0gbmV3IEp1Z2dsRGVwdGgoe1xyXG4gICAgICAgICAgdGFyZ2V0OiB0b29sYmFyRGl2LFxyXG4gICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgbWF4RGVwdGg6IG1heERlcHRoRG93bixcclxuICAgICAgICAgICAgb25VcGRhdGVEZXB0aDogKGQpID0+IHtcclxuICAgICAgICAgICAgICB1cGRhdGVEZXB0aChqdWdnbERvd24sIGQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgbm9kZXNTID0gbmV3IFNldChsaW5lcyk7XHJcbiAgICAgICAgbm9kZXNTLmFkZChzb3VyY2UpO1xyXG4gICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShub2Rlc1MpLm1hcCgocykgPT4gcyArIFwiLm1kXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBhcmdzRG93biA9IE9iamVjdC5hc3NpZ24oe30sIGFyZ3MpO1xyXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHBsdWdpbi5zZXR0aW5ncy5qdWdnbExheW91dDtcclxuICAgICAgICBpZiAobGF5b3V0ID09PSBcImhpZXJhcmNoeVwiKSB7XHJcbiAgICAgICAgICBhcmdzRG93bi5sYXlvdXQgPSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgbmFtZTogXCJkYWdyZVwiLFxyXG4gICAgICAgICAgICBhbmltYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmFua2VyOiAoZ3JhcGgpID0+IHtcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhncmFwaC5fbm9kZXMpLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gVml6SWQuZnJvbUlkKGlkKS5pZDtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIGRlcHRoTWFwRG93bikge1xyXG4gICAgICAgICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBkZXB0aE1hcERvd25bbmFtZV0gKyAxO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZ3JhcGguX25vZGVzW2lkXS5yYW5rID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFyZ3NEb3duLmxheW91dCA9IGxheW91dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXNGZGdkID0gbGF5b3V0ID09PSBcImNvbGFcIiB8fCBsYXlvdXQgPT09IFwiZDMtZm9yY2VcIjtcclxuICAgICAgICBpZiAoaXNGZGdkKSB7XHJcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICBhcmdzRG93bi5mZGdkTGF5b3V0ID0gbGF5b3V0O1xyXG4gICAgICAgICAgYXJnc0Rvd24ubGF5b3V0ID0gXCJmb3JjZS1kaXJlY3RlZFwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhcmdzRG93bi5hdXRvWm9vbSA9IHRydWU7XHJcbiAgICAgICAgICBhcmdzRG93bi5hbmltYXRlTGF5b3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBqdWdnbERvd24gPSBjcmVhdGVKdWdnbChwbHVnaW4sIHRhcmdldCwgbm9kZXMsIGFyZ3NEb3duLCBkZXB0aE1hcERvd24pO1xyXG5cclxuICAgICAgICBpZiAoaXNGZGdkKSB7XHJcbiAgICAgICAgICB6b29tVG9Tb3VyY2UoanVnZ2xEb3duLCBzb3VyY2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB6b29tVG9HcmFwaChqdWdnbERvd24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGp1Z2dsVXApIHtcclxuICAgICAgICAgIHRhcmdldC5jaGlsZHJlblthbXRDaGlsZHJlbl0uYWRkQ2xhc3MoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgZGVwdGhVcC4kc2V0KHsgdmlzaWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgIHRpdGxlOiBcIlNob3cgZG93biBncmFwaFwiLFxyXG4gICAgfSxcclxuICB9KTtcclxuICBjb25zdCBkZXB0aE1hcFVwID0gY3JlYXRlRGVwdGhNYXAocGF0aHMsIHNvdXJjZSwgMSk7XHJcbiAgY29uc3QgbWF4RGVwdGhVcCA9IE1hdGgubWF4KC4uLk9iamVjdC52YWx1ZXMoZGVwdGhNYXBVcCkpO1xyXG5cclxuICBsZXQgZGVwdGhEb3duOiBKdWdnbERlcHRoO1xyXG4gIGNvbnN0IGRlcHRoVXAgPSBuZXcgSnVnZ2xEZXB0aCh7XHJcbiAgICB0YXJnZXQ6IHRvb2xiYXJEaXYsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICBtYXhEZXB0aDogbWF4RGVwdGhVcCxcclxuICAgICAgb25VcGRhdGVEZXB0aDogKGQpID0+IHtcclxuICAgICAgICB1cGRhdGVEZXB0aChqdWdnbFVwLCBkKTtcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgfSk7XHJcblxyXG4gIC8vIG5ldyBKdWdnbEJ1dHRvbih7XHJcbiAgLy8gICAgIHRhcmdldDogc2VjdERpdixcclxuICAvLyAgICAgcHJvcHM6IHtcclxuICAvLyAgICAgICAgIGljb246IFwiXHUyNkY2XCIsXHJcbiAgLy8gICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZXJlXCIpXHJcbiAgLy8gICAgICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuWzFdLmFkZENsYXNzKFwianVnZ2wtZnVsbC1zY3JlZW5cIilcclxuICAvLyAgICAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bMV0uc2V0QXR0cihcInN0eWxlXCIsIFwiXCIpO1xyXG4gIC8vICAgICAgICAgfSxcclxuICAvLyAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAvLyAgICAgICAgIHRpdGxlOiBcIkZ1bGwgaGVpZ2h0XCJcclxuICAvLyAgICAgfVxyXG4gIC8vIH0pO1xyXG4gIGxldCBub2RlcyA9IEFycmF5LmZyb20oXHJcbiAgICBuZXcgU2V0KHBhdGhzLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldi5jb25jYXQoY3VyciksIFtdKSlcclxuICApO1xyXG5cclxuICBub2Rlcy5wdXNoKHNvdXJjZSk7XHJcbiAgbm9kZXMgPSBub2Rlcy5tYXAoKHMpID0+IHMgKyBcIi5tZFwiKTtcclxuXHJcbiAgY29uc3QgYXJnc1VwOiBJSnVnZ2xTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGFyZ3MpO1xyXG5cclxuICBjb25zdCBsYXlvdXQgPSBwbHVnaW4uc2V0dGluZ3MuanVnZ2xMYXlvdXQ7XHJcbiAgaWYgKGxheW91dCA9PT0gXCJoaWVyYXJjaHlcIikge1xyXG4gICAgYXJnc1VwLmxheW91dCA9IHtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBuYW1lOiBcImRhZ3JlXCIsXHJcbiAgICAgIGFuaW1hdGU6IGZhbHNlLFxyXG4gICAgICByYW5rZXI6IChncmFwaCkgPT4ge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGdyYXBoLl9ub2RlcykuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBWaXpJZC5mcm9tSWQoaWQpLmlkO1xyXG4gICAgICAgICAgaWYgKG5hbWUgaW4gZGVwdGhNYXBVcCkge1xyXG4gICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBtYXhEZXB0aFVwIC0gZGVwdGhNYXBVcFtuYW1lXSArIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBtYXhEZXB0aFVwICsgMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGFyZ3NVcC5sYXlvdXQgPSBsYXlvdXQ7XHJcbiAgfVxyXG4gIGNvbnN0IGlzRmRnZCA9IGxheW91dCA9PT0gXCJjb2xhXCIgfHwgbGF5b3V0ID09PSBcImQzLWZvcmNlXCI7XHJcbiAgaWYgKGlzRmRnZCkge1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgYXJnc1VwLmZkZ2RMYXlvdXQgPSBsYXlvdXQ7XHJcbiAgICBhcmdzVXAubGF5b3V0ID0gXCJmb3JjZS1kaXJlY3RlZFwiO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBhcmdzVXAuYXV0b1pvb20gPSB0cnVlO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgYXJnc1VwLmFuaW1hdGVMYXlvdXQgPSBmYWxzZTtcclxuICB9XHJcbiAganVnZ2xVcCA9IGNyZWF0ZUp1Z2dsKHBsdWdpbiwgdGFyZ2V0LCBub2RlcywgYXJnc1VwLCBkZXB0aE1hcFVwKTtcclxuICBpZiAoaXNGZGdkKSB7XHJcbiAgICB6b29tVG9Tb3VyY2UoanVnZ2xVcCwgc291cmNlKTtcclxuICB9IGVsc2Uge1xyXG4gICAgem9vbVRvR3JhcGgoanVnZ2xVcCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgY29weSB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZGZzQWxsUGF0aHMsIGdldFNpbmtzLCBnZXRTdWJJbkRpcnMgfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRDdXJyRmlsZSwgbWFrZVdpa2kgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBjb3B5IG9mIGBpbmRleGAsIGRvZXNuJ3QgbXV0YXRlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGluZGV4XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkQWxpYXNlc1RvSW5kZXgocGx1Z2luOiBCQ1BsdWdpbiwgaW5kZXg6IHN0cmluZykge1xyXG4gIGNvbnN0IHsgYWxpYXNlc0luSW5kZXggfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgY29uc3QgbGluZXMgPSBpbmRleC5zbGljZSgpLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICBpZiAoYWxpYXNlc0luSW5kZXgpIHtcclxuICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSBjb250ZW50LmpvaW4oXCItIFwiKTtcclxuICAgICAgaWYgKCFub3RlKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IGN1cnJGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm90ZSwgXCJcIik7XHJcblxyXG4gICAgICBpZiAoY3VyckZpbGUgIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShjdXJyRmlsZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsaWFzOiBzdHJpbmdbXSA9IGNhY2hlPy5mcm9udG1hdHRlcj8uYWxpYXMgPz8gW107XHJcbiAgICAgICAgY29uc3QgYWxpYXNlczogc3RyaW5nW10gPSBjYWNoZT8uZnJvbnRtYXR0ZXI/LmFsaWFzZXMgPz8gW107XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbEFsaWFzZXM6IHN0cmluZ1tdID0gWy4uLlthbGlhc10uZmxhdCgzKSwgLi4uW2FsaWFzZXNdLmZsYXQoMyldO1xyXG4gICAgICAgIGlmIChhbGxBbGlhc2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGluZSArPSBgICgke2FsbEFsaWFzZXMuam9pbihcIiwgXCIpfSlgO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBpbmRleCBvZiBhbGwgdGhlIHBhdGhzIGluIHRoZSBncmFwaC5cclxuICogQHBhcmFtIGFsbFBhdGhzIC0gQSBsaXN0IG9mIGFsbCBwYXRocyBmcm9tIHRoZSByb290IHRvIHRoZSBsZWF2ZXMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXNXaWtpbGlua3MgLSBXaGV0aGVyIHRvIHVzZSB3aWtpbGlua3MgaW5zdGVhZCBvZiBwbGFpbiB0ZXh0LlxyXG4gKiBAcmV0dXJucyBBIHN0cmluZy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmRleChcclxuICBhbGxQYXRoczogc3RyaW5nW11bXSxcclxuICBhc1dpa2lsaW5rczogYm9vbGVhbixcclxuICBpbmRlbnQgPSBcIiAgXCJcclxuKTogc3RyaW5nIHtcclxuICBsZXQgaW5kZXggPSBcIlwiO1xyXG4gIGNvbnN0IGNvcHkgPSBjbG9uZURlZXAoYWxsUGF0aHMpO1xyXG4gIGNvbnN0IHJldmVyc2VkID0gY29weS5tYXAoKHBhdGgpID0+IHBhdGgucmV2ZXJzZSgpKTtcclxuICByZXZlcnNlZC5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnNoaWZ0KCkpO1xyXG5cclxuICBjb25zdCByZWFsSW5kZW50ID0gaW5kZW50ID09PSAnXFxcXHQnID8gJ1xcdCcgOiBpbmRlbnQ7XHJcblxyXG4gIGNvbnN0IHZpc2l0ZWQ6IHtcclxuICAgIFtub2RlOiBzdHJpbmddOiAvKiogVGhlIGRlcHRocyBhdCB3aGljaCBgbm9kZWAgd2FzIHZpc2l0ZWQgKi8gbnVtYmVyW107XHJcbiAgfSA9IHt9O1xyXG5cclxuICByZXZlcnNlZC5mb3JFYWNoKChwYXRoKSA9PiB7XHJcbiAgICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgcGF0aC5sZW5ndGg7IGRlcHRoKyspIHtcclxuICAgICAgY29uc3QgY3Vyck5vZGUgPSBwYXRoW2RlcHRoXTtcclxuXHJcbiAgICAgIC8vIElmIHRoYXQgbm9kZSBoYXMgYmVlbiB2aXNpdGVkIGJlZm9yZSBhdCB0aGUgY3VycmVudCBkZXB0aFxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdmlzaXRlZC5oYXNPd25Qcm9wZXJ0eShjdXJyTm9kZSkgJiZcclxuICAgICAgICB2aXNpdGVkW2N1cnJOb2RlXS5pbmNsdWRlcyhkZXB0aClcclxuICAgICAgKSBjb250aW51ZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpbmRleCArPSBgJHtyZWFsSW5kZW50LnJlcGVhdChkZXB0aCl9LSAke2FzV2lraWxpbmtzID8gbWFrZVdpa2koY3Vyck5vZGUpIDogY3Vyck5vZGVcclxuICAgICAgICAgIH1cXG5gO1xyXG5cclxuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzT3duUHJvcGVydHkoY3Vyck5vZGUpKSB2aXNpdGVkW2N1cnJOb2RlXSA9IFtdO1xyXG4gICAgICAgIHZpc2l0ZWRbY3Vyck5vZGVdLnB1c2goZGVwdGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGluZGV4O1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weUxvY2FsSW5kZXgocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50IH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7IGJhc2VuYW1lIH0gPSBnZXRDdXJyRmlsZSgpXHJcblxyXG4gIGNvbnN0IG9ubHlEb3ducyA9IGdldFN1YkluRGlycyhjbG9zZWRHLCBcImRvd25cIik7XHJcbiAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhvbmx5RG93bnMsIGJhc2VuYW1lKTtcclxuICBjb25zdCBpbmRleCA9IGFkZEFsaWFzZXNUb0luZGV4KHBsdWdpbiwgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50KSk7XHJcblxyXG4gIGluZm8oeyBpbmRleCB9KTtcclxuICBhd2FpdCBjb3B5KGluZGV4KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlHbG9iYWxJbmRleChwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncywgY2xvc2VkRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgd2lraWxpbmtJbmRleCwgY3JlYXRlSW5kZXhJbmRlbnQgfSA9IHNldHRpbmdzO1xyXG5cclxuICBjb25zdCBvbmx5RG93bnMgPSBnZXRTdWJJbkRpcnMoY2xvc2VkRywgXCJkb3duXCIpO1xyXG4gIGNvbnN0IG9ubHlVcHMgPSBnZXRTdWJJbkRpcnMoY2xvc2VkRywgXCJ1cFwiKTtcclxuXHJcbiAgY29uc3Qgc2lua3MgPSBnZXRTaW5rcyhvbmx5VXBzKTtcclxuXHJcbiAgbGV0IGdsb2JhbEluZGV4ID0gXCJcIjtcclxuICBzaW5rcy5mb3JFYWNoKCh0ZXJtaW5hbCkgPT4ge1xyXG4gICAgZ2xvYmFsSW5kZXggKz0gdGVybWluYWwgKyBcIlxcblwiO1xyXG4gICAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhvbmx5RG93bnMsIHRlcm1pbmFsKTtcclxuICAgIGdsb2JhbEluZGV4ICs9XHJcbiAgICAgIGFkZEFsaWFzZXNUb0luZGV4KHBsdWdpbiwgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50KSkgKyBcIlxcblwiO1xyXG4gIH0pO1xyXG5cclxuICBpbmZvKHsgZ2xvYmFsSW5kZXggfSk7XHJcbiAgYXdhaXQgY29weShnbG9iYWxJbmRleCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpbmRleFRvTGluZVBhaXJzID0gKFxyXG4gIGluZGV4OiBzdHJpbmcsXHJcbiAgZmxhdCA9IGZhbHNlXHJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PlxyXG4gIGluZGV4XHJcbiAgICAuc3BsaXQoXCJcXG5cIilcclxuICAgIC5tYXAoKGxpbmUpID0+IHtcclxuICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgIHJldHVybiBbZmxhdCA/IFwiXCIgOiBpbmRlbnQsIGNvbnRlbnQuam9pbihcIi0gXCIpXSBhcyBbXHJcbiAgICAgICAgc3RyaW5nLFxyXG4gICAgICAgIHN0cmluZ1xyXG4gICAgICBdO1xyXG4gICAgfSlcclxuICAgIC5maWx0ZXIoKHBhaXIpID0+IHBhaXJbMV0gIT09IFwiXCIpO1xyXG4iLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBleHBvcnQgbGV0IGljb247XHJcbiAgZXhwb3J0IGxldCBvbkNsaWNrOiAoKSA9PiB2b2lkO1xyXG4gIGV4cG9ydCBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBleHBvcnQgbGV0IHRpdGxlID0gXCJcIjtcclxuXHJcbiAgJDogcmVuZGVyZWRJY29uID0gaWNvbjtcclxuPC9zY3JpcHQ+XHJcblxyXG48YnV0dG9uXHJcbiAgdHlwZT1cImJ1dHRvblwiXHJcbiAgY2xhc3M9XCJqdWdnbC1idXR0b25cIlxyXG4gIG9uOmNsaWNrPXtvbkNsaWNrfVxyXG4gIGFyaWEtbGFiZWw9e3RpdGxlfVxyXG4gIHtkaXNhYmxlZH1cclxuPlxyXG4gIHtyZW5kZXJlZEljb259XHJcbjwvYnV0dG9uPlxyXG4iLCBudWxsLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgSnVnZ2xCdXR0b24gZnJvbSBcIi4vSnVnZ2xCdXR0b24uc3ZlbHRlXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgdmlzaWJsZSA9IHRydWU7XHJcbiAgZXhwb3J0IGxldCBtYXhEZXB0aDogbnVtYmVyO1xyXG4gIGV4cG9ydCBsZXQgb25VcGRhdGVEZXB0aDogKGRlcHRoOiBudW1iZXIpID0+IHZvaWQ7XHJcblxyXG4gIGxldCBkZXB0aCA9IG1heERlcHRoO1xyXG48L3NjcmlwdD5cclxuXHJcbnsjaWYgdmlzaWJsZX1cclxuICA8ZGl2IGNsYXNzPVwiY3ktdG9vbGJhci1zZWN0aW9uXCI+XHJcbiAgICA8SnVnZ2xCdXR0b25cclxuICAgICAgaWNvbj1cIi1cIlxyXG4gICAgICBkaXNhYmxlZD17ZGVwdGggPD0gMH1cclxuICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgIGRlcHRoIC09IDE7XHJcbiAgICAgICAgb25VcGRhdGVEZXB0aChkZXB0aCk7XHJcbiAgICAgIH19XHJcbiAgICAvPlxyXG5cclxuICAgIDxKdWdnbEJ1dHRvbiBpY29uPXtkZXB0aH0gZGlzYWJsZWQ9e3RydWV9IG9uQ2xpY2s9e251bGx9IC8+XHJcblxyXG4gICAgPEp1Z2dsQnV0dG9uXHJcbiAgICAgIGljb249XCIrXCJcclxuICAgICAgZGlzYWJsZWQ9e2RlcHRoID49IG1heERlcHRofVxyXG4gICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgZGVwdGggKz0gMTtcclxuICAgICAgICBvblVwZGF0ZURlcHRoKGRlcHRoKTtcclxuICAgICAgfX1cclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbnsvaWZ9XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuICBpbXBvcnQgdHlwZSBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgbWF0cml4VmlldzogTWF0cml4VmlldztcclxuXHJcbiAgY29uc3QgeyBwbHVnaW4gfSA9IG1hdHJpeFZpZXc7XHJcbiAgY29uc3QgeyBhbHBoYVNvcnRBc2MsIGVuYWJsZUFscGhhU29ydCB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG48L3NjcmlwdD5cclxuXHJcbjxidXR0b25cclxuICBjbGFzcz1cIkJDLXJlZnJlc2gtYnV0dG9uXCJcclxuICBhcmlhLWxhYmVsPVwiUmVmcmVzaCBJbmRleFwiXHJcbiAgb246Y2xpY2s9e2FzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pfVxyXG4+XHJcbiAgXHUyMUJCXHJcbjwvYnV0dG9uPlxyXG5cclxueyNpZiBlbmFibGVBbHBoYVNvcnR9XHJcbiAgPGJ1dHRvblxyXG4gICAgY2xhc3M9XCJCQy1zb3J0LWJ1dHRvblwiXHJcbiAgICBhcmlhLWxhYmVsPVwiQWxwaGFiZXRpY2FsIFNvcnRpbmcgT3JkZXJcIlxyXG4gICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgcGx1Z2luLnNldHRpbmdzLmFscGhhU29ydEFzYyA9ICFhbHBoYVNvcnRBc2M7XHJcbiAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgYXdhaXQgbWF0cml4Vmlldy5kcmF3KCk7XHJcbiAgICB9fVxyXG4gID5cclxuICAgIHthbHBoYVNvcnRBc2MgPyBcIlx1MjE5N1wiIDogXCJcdTIxOThcIn1cclxuICA8L2J1dHRvbj5cclxuey9pZn1cclxuXHJcbjxzdHlsZT5cclxuICBidXR0b24ge1xyXG4gICAgcGFkZGluZzogMXB4IDZweCAycHggNnB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA2cHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbiAgaW1wb3J0IHsgaG92ZXJQcmV2aWV3LCBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG4gIGltcG9ydCBNYXRyaXhCdXR0b25zIGZyb20gXCIuL01hdHJpeEJ1dHRvbnMuc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBTcXVhcmVQcm9wcyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbiAgaW1wb3J0IHsgZHJvcFBhdGhORGVuZHJvbiB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgaGllclNxdWFyZXM6IFNxdWFyZVByb3BzW11bXTtcclxuICBleHBvcnQgbGV0IGN1cnJGaWxlOiBURmlsZTtcclxuICBleHBvcnQgbGV0IG1hdHJpeFZpZXc6IE1hdHJpeFZpZXc7XHJcblxyXG4gIGNvbnN0IHsgcGx1Z2luIH0gPSBtYXRyaXhWaWV3O1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuXHJcbiAgY29uc3Qge1xyXG4gICAgc2hvd0ltcGxpZWRSZWxhdGlvbnMsXHJcbiAgICBybExlYWYsXHJcbiAgICB0cmVhdEN1cnJOb2RlQXNJbXBsaWVkU2libGluZyxcclxuICAgIHNob3dSZWxhdGlvblR5cGUsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1tYXRyaXgtYnV0dG9uc1wiPlxyXG4gIDxNYXRyaXhCdXR0b25zIHttYXRyaXhWaWV3fSAvPlxyXG48L2Rpdj5cclxuXHJcbjxkaXZcclxuICBjbGFzcz1cIkJDLU1hdHJpeCAgbWFya2Rvd24tcHJldmlldy12aWV3IHtoaWVyU3F1YXJlcy5sZW5ndGhcclxuICAgID8gJydcclxuICAgIDogJ0JDLWVtcHR5LXZpZXcnfVwiXHJcbj5cclxuICB7I2VhY2ggaGllclNxdWFyZXMgYXMgc3F1YXJlc31cclxuICAgIDxkaXYgY2xhc3M9XCJCQy1tYXRyaXgtaGllclwiPlxyXG4gICAgICB7I2VhY2ggc3F1YXJlcyBhcyB7IGZpZWxkLCBpbXBsaWVkSXRlbXMsIHJlYWxJdGVtcyB9fVxyXG4gICAgICAgIHsjaWYgcmVhbEl0ZW1zLmxlbmd0aCB8fCAoc2hvd0ltcGxpZWRSZWxhdGlvbnMgJiYgaW1wbGllZEl0ZW1zLmxlbmd0aCl9XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiQkMtTWF0cml4LXNxdWFyZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiQkMtTWF0cml4LWhlYWRlcnNcIj5cclxuICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyXCI+e2ZpZWxkfTwvaDQ+XHJcblxyXG4gICAgICAgICAgICAgIHsjaWYgc2hvd1JlbGF0aW9uVHlwZX1cclxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cIkJDLU1hdHJpeC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAge3JlYWxJdGVtcy5sZW5ndGggPyBcIlJlYWxcIiA6IFwiSW1wbGllZFwifVxyXG4gICAgICAgICAgICAgICAgPC9oNj5cclxuICAgICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgeyNpZiByZWFsSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgIDxvbD5cclxuICAgICAgICAgICAgICAgIHsjZWFjaCByZWFsSXRlbXMgYXMgeyBhbHQsIGNscywgaW1wbGllZCwgdG8gfX1cclxuICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LXVua25vd24tYXJpYS1hdHRyaWJ1dGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbW91c2UtZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIntjbHN9IHtpbXBsaWVkID8/ICcnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaCh0bywgZSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbjptb3VzZW92ZXI9eyhldmVudCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJQcmV2aWV3KGV2ZW50LCBtYXRyaXhWaWV3LCB0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXthbHQgPyB0byA6IFwiXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsLXBvc2l0aW9uPXtybExlYWYgPyBcImxlZnRcIiA6IFwicmlnaHRcIn1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7YWx0ID8/IGRyb3BQYXRoTkRlbmRyb24odG8sIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIHsvZWFjaH1cclxuICAgICAgICAgICAgICA8L29sPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG5cclxuICAgICAgICAgICAgeyNpZiBzaG93SW1wbGllZFJlbGF0aW9ucyAmJiBpbXBsaWVkSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwiQkMtTWF0cml4LWhlYWRlclwiPntcIiBcIn08L2g0PlxyXG4gICAgICAgICAgICAgICAgeyNpZiBpbXBsaWVkSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgICAgICB7I2lmIHNob3dSZWxhdGlvblR5cGUgJiYgcmVhbEl0ZW1zLmxlbmd0aH1cclxuICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyXCI+SW1wbGllZDwvaDY+XHJcbiAgICAgICAgICAgICAgICAgIHsvaWZ9XHJcbiAgICAgICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxvbCBzdGFydD17cmVhbEl0ZW1zLmxlbmd0aCArIDF9PlxyXG4gICAgICAgICAgICAgICAgeyNlYWNoIGltcGxpZWRJdGVtcyBhcyB7IGFsdCwgY2xzLCBpbXBsaWVkLCB0bywgcGFyZW50IH19XHJcbiAgICAgICAgICAgICAgICAgIDxsaVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiQkMtSW1wbGllZCB7dHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcgJiZcclxuICAgICAgICAgICAgICAgICAgICB0byA9PT0gY3VyckZpbGUuYmFzZW5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgID8gJ0JDLWFjdGl2ZS1ub3RlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgOiAnJ31cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktdW5rbm93bi1hcmlhLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie2Nsc30ge2ltcGxpZWQgPz8gJyd9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKHRvLCBlKX1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBtYXRyaXhWaWV3LCB0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXsoYWx0ID8gYCR7dG99XFxuYCA6IFwiXCIpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudCA/IFwiXHUyMTkxIFwiICsgcGFyZW50IDogXCJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsLXBvc2l0aW9uPXtybExlYWYgPyBcImxlZnRcIiA6IFwicmlnaHRcIn1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7YWx0ID8/IGRyb3BQYXRoTkRlbmRyb24odG8sIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIHsvZWFjaH1cclxuICAgICAgICAgICAgICA8L29sPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgey9pZn1cclxuICAgICAgey9lYWNofVxyXG4gICAgPC9kaXY+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtTWF0cml4IHtcclxuICAgIHBhZGRpbmc6IDVweDtcclxuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XHJcbiAgICBsaW5lLWhlaWdodDogMS41O1xyXG4gIH1cclxuICAuQkMtTWF0cml4ID4gZGl2IHtcclxuICAgIGJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgIC8qIHRleHQtYWxpZ246IGNlbnRlcjsgKi9cclxuICAgIG1hcmdpbjogM3B4O1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxuICB9XHJcblxyXG4gIC8qIC5CQy1tYXRyaXggZGl2IHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgfSAqL1xyXG5cclxuICAuQkMtTWF0cml4LXNxdWFyZSB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XHJcbiAgfVxyXG5cclxuICAuQkMtTWF0cml4LWhlYWRlcnMge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgfVxyXG4gIC5CQy1NYXRyaXgtaGVhZGVyIHtcclxuICAgIG1hcmdpbjogMnB4O1xyXG4gICAgcGFkZGluZzogMHB4IDEwcHg7XHJcbiAgfVxyXG4gIGg0LkJDLU1hdHJpeC1oZWFkZXI6Zmlyc3QtbGV0dGVyIHtcclxuICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xyXG4gIH1cclxuXHJcbiAgb2wge1xyXG4gICAgbWFyZ2luOiAzcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDMwcHg7XHJcbiAgfVxyXG5cclxuICAuQkMtTWF0cml4IGxpIHtcclxuICAgIG1hcmdpbjogMC4xZW07XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQVJST1dfRElSRUNUSU9OUywgRElSRUNUSU9OUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJDQVBJSSwgRGlyZWN0aW9ucywgVXNlckhpZXIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0TWF0cml4TmVpZ2hib3VycyB9IGZyb20gXCIuL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuaW1wb3J0IHtcclxuICBidWlsZE9ic0dyYXBoLFxyXG4gIGRmc0FsbFBhdGhzLFxyXG4gIGdldFN1YkZvckZpZWxkcyxcclxuICBnZXRTdWJJbkRpcnMsXHJcbn0gZnJvbSBcIi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldEZpZWxkSW5mbyxcclxuICBnZXRGaWVsZHMsXHJcbiAgZ2V0T3BwRGlyLFxyXG4gIGdldE9wcEZpZWxkcyxcclxuICBpdGVyYXRlSGllcnMsXHJcbn0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGNyZWF0ZUluZGV4IH0gZnJvbSBcIi4vQ29tbWFuZHMvQ3JlYXRlSW5kZXhcIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IGdldEN1cnJGaWxlIH0gZnJvbSBcIi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJDQVBJIGltcGxlbWVudHMgQkNBUElJIHtcclxuXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBtYWluRzogTXVsdGlHcmFwaDtcclxuICBjbG9zZWRHOiBNdWx0aUdyYXBoO1xyXG5cclxuICBwdWJsaWMgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG5cclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5tYWluRyA9IHRoaXMucGx1Z2luLm1haW5HO1xyXG4gICAgdGhpcy5jbG9zZWRHID0gdGhpcy5wbHVnaW4uY2xvc2VkRztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBESVJFQ1RJT05TID0gRElSRUNUSU9OUztcclxuICBwdWJsaWMgQVJST1dfRElSRUNUSU9OUyA9IEFSUk9XX0RJUkVDVElPTlM7XHJcblxyXG4gIHB1YmxpYyBidWlsZE9ic0dyYXBoID0gYnVpbGRPYnNHcmFwaDtcclxuXHJcbiAgcHVibGljIHJlZnJlc2hJbmRleCA9IGFzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzLnBsdWdpbilcclxuXHJcbiAgcHVibGljIGdldFN1YkluRGlycyA9IChkaXJzOiBEaXJlY3Rpb25zW10sIGcgPSB0aGlzLm1haW5HKSA9PlxyXG4gICAgZ2V0U3ViSW5EaXJzKGcsIC4uLmRpcnMpO1xyXG5cclxuICBwdWJsaWMgZ2V0U3ViRm9yRmllbGRzID0gKGZpZWxkczogc3RyaW5nW10sIGcgPSB0aGlzLm1haW5HKSA9PlxyXG4gICAgZ2V0U3ViRm9yRmllbGRzKGcsIGZpZWxkcyk7XHJcblxyXG4gIHB1YmxpYyBkZnNBbGxQYXRocyA9IChcclxuICAgIGZyb21Ob2RlID0gZ2V0Q3VyckZpbGUoKT8uYmFzZW5hbWUsXHJcbiAgICBnID0gdGhpcy5tYWluR1xyXG4gICkgPT4gZGZzQWxsUGF0aHMoZywgZnJvbU5vZGUpO1xyXG5cclxuICBwdWJsaWMgY3JlYXRlSW5kZXggPSAoYWxsUGF0aHM6IHN0cmluZ1tdW10sIHdpa2lsaW5rcyA9IGZhbHNlLCBpbmRlbnQgPSAnICAnKSA9PlxyXG4gICAgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rcywgaW5kZW50KTtcclxuXHJcbiAgcHVibGljIGdldE1hdHJpeE5laWdoYm91cnMgPSAoXHJcbiAgICBmcm9tTm9kZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lXHJcbiAgKSA9PiBnZXRNYXRyaXhOZWlnaGJvdXJzKHRoaXMucGx1Z2luLCBmcm9tTm9kZSk7XHJcblxyXG4gIHB1YmxpYyBnZXRPcHBEaXIgPSAoZGlyOiBEaXJlY3Rpb25zKSA9PiBnZXRPcHBEaXIoZGlyKTtcclxuXHJcbiAgcHVibGljIGdldE9wcEZpZWxkcyA9IChmaWVsZDogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCB7IGZpZWxkRGlyIH0gPSBnZXRGaWVsZEluZm8odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBmaWVsZCk7XHJcbiAgICByZXR1cm4gZ2V0T3BwRmllbGRzKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycywgZmllbGQsIGZpZWxkRGlyKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgZ2V0RmllbGRJbmZvID0gKGZpZWxkOiBzdHJpbmcpID0+XHJcbiAgICBnZXRGaWVsZEluZm8odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBmaWVsZCk7XHJcbiAgcHVibGljIGdldEZpZWxkcyA9IChkaXI/OiBEaXJlY3Rpb25zKSA9PlxyXG4gICAgZ2V0RmllbGRzKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycywgZGlyID8/IFwiYWxsXCIpO1xyXG5cclxuICBwdWJsaWMgaXRlcmF0ZUhpZXJzKFxyXG4gICAgY2I6IChoaWVyOiBVc2VySGllciwgZGlyOiBEaXJlY3Rpb25zLCBmaWVsZDogc3RyaW5nKSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBpdGVyYXRlSGllcnModGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBjYik7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBGdXp6eU1hdGNoLCBGdXp6eVN1Z2dlc3RNb2RhbCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvciB9IGZyb20gXCIuL0hpZXJhcmNoeU5vdGVNYW5pcHVsYXRvclwiO1xyXG5pbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoeU5vdGVTZWxlY3Rvck1vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8c3RyaW5nPiB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBzZXR0aW5nczogQkNTZXR0aW5ncztcclxuXHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRQbGFjZWhvbGRlcihcIkhOIENob29zZXJcIik7XHJcbiAgICBjb25zdCB7IGhpZXJhcmNoeU5vdGVzIH0gPSB0aGlzLnNldHRpbmdzO1xyXG4gICAgaWYgKGhpZXJhcmNoeU5vdGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgIG5ldyBOb3RpY2UoXCJObyBoaWVyYXJjaHkgbm90ZXMgZm91bmRcIik7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBoaWVyYXJjaHlOb3Rlcy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgIWhpZXJhcmNoeU5vdGVzWzBdLmVuZHNXaXRoKFwiL1wiKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgbmV3IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvcihcclxuICAgICAgICB0aGlzLnBsdWdpbixcclxuICAgICAgICBoaWVyYXJjaHlOb3Rlc1swXVxyXG4gICAgICApLm9wZW4oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN1cGVyLm9uT3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgeyBoaWVyYXJjaHlOb3RlcyB9ID0gdGhpcy5zZXR0aW5ncztcclxuICAgIGlmIChoaWVyYXJjaHlOb3Rlcy5sZW5ndGggPT0gMSAmJiBoaWVyYXJjaHlOb3Rlc1swXS5lbmRzV2l0aChcIi9cIikpIHtcclxuICAgICAgLy8gdGhpcyBpcyBhIGZvbGRlclxyXG4gICAgICBsZXQgZm9sZGVyID0gaGllcmFyY2h5Tm90ZXNbMF0uc2xpY2UoMCwgLTEpO1xyXG4gICAgICBpZiAoYXBwLnBsdWdpbnMucGx1Z2lucy5kYXRhdmlldyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBsZXQgcGFnZXMgPSBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3LmFwaS5wYWdlcyhcclxuICAgICAgICAgIGBcIiR7Zm9sZGVyfVwiYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VzLnZhbHVlcy5tYXAoKHBhZ2UpID0+IHBhZ2UuZmlsZS5wYXRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXcgTm90aWNlKFwibWFrZSBzdXJlIHlvdSBoYXZlIGRhdGF2aWV3IGVuYWJsZWRcIik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSByZXR1cm4gaGllcmFyY2h5Tm90ZXM7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtVGV4dChpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke2l0ZW19YDtcclxuICB9XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oaXRlbTogRnV6enlNYXRjaDxzdHJpbmc+LCBlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHN1cGVyLnJlbmRlclN1Z2dlc3Rpb24oaXRlbSwgZWwpO1xyXG4gIH1cclxuXHJcbiAgb25DaG9vc2VJdGVtKGl0ZW06IHN0cmluZywgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgbmV3IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvcih0aGlzLnBsdWdpbiwgaXRlbSkub3BlbigpO1xyXG4gICAgdGhpcy5jbG9zZSgpO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgZXJyb3IsIGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHtcclxuICBGdXp6eU1hdGNoLFxyXG4gIEZ1enp5U3VnZ2VzdE1vZGFsLFxyXG4gIExpc3RJdGVtQ2FjaGUsXHJcbiAgTWFya2Rvd25WaWV3LFxyXG4gIE5vdGljZSxcclxuICBURmlsZSxcclxufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uLy4uL21haW5cIjtcclxuaW1wb3J0IHsgZHJvcFdpa2lsaW5rcyB9IGZyb20gXCIuLi8uLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB7IE1vZGlmeUhpZXJJdGVtTW9kYWwgfSBmcm9tIFwiLi9Nb2RpZnlIaWVySXRlbU1vZGFsXCI7XHJcblxyXG5pbnRlcmZhY2UgSE5JdGVtIHtcclxuICBkZXB0aDogbnVtYmVyO1xyXG4gIGxpbmU6IHN0cmluZztcclxuICBsaW5lTm86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvciBleHRlbmRzIEZ1enp5U3VnZ2VzdE1vZGFsPEhOSXRlbT4ge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3M7XHJcbiAgaGllck5vdGVOYW1lOiBzdHJpbmc7XHJcbiAgbGluZXM6IHN0cmluZ1tdO1xyXG4gIGxpc3RJdGVtczogTGlzdEl0ZW1DYWNoZVtdO1xyXG4gIGZpbGU6IFRGaWxlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luLCBoaWVyTm90ZU5hbWU6IHN0cmluZykge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gICAgdGhpcy5oaWVyTm90ZU5hbWUgPSBoaWVyTm90ZU5hbWU7XHJcblxyXG4gICAgY29uc3QgY2hvb3NlT3ZlcnJpZGUgPSAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgdGhpcy5jaG9vc2VyLnVzZVNlbGVjdGVkSXRlbShldnQpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXSwgXCJEZWxldGVcIiwgY2hvb3NlT3ZlcnJpZGUpO1xyXG4gICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXCJTaGlmdFwiXSwgXCJBcnJvd1VwXCIsIGNob29zZU92ZXJyaWRlKTtcclxuICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiU2hpZnRcIl0sIFwiQXJyb3dSaWdodFwiLCBjaG9vc2VPdmVycmlkZSk7XHJcbiAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIlNoaWZ0XCJdLCBcIkFycm93RG93blwiLCBjaG9vc2VPdmVycmlkZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFwiSE4gTWFuaXB1bGF0b3JcIik7XHJcbiAgICB0aGlzLnNldEluc3RydWN0aW9ucyhbXHJcbiAgICAgIHsgY29tbWFuZDogXCJTaGlmdCArIEVudGVyXCIsIHB1cnBvc2U6IFwiSnVtcCB0byBpdGVtXCIgfSxcclxuICAgICAgeyBjb21tYW5kOiBcIlNoaWZ0ICsgXHUyMTkxXCIsIHB1cnBvc2U6IFwiQWRkIHBhcmVudFwiIH0sXHJcbiAgICAgIHsgY29tbWFuZDogXCJTaGlmdCArIFx1MjE5MlwiLCBwdXJwb3NlOiBcIkFkZCBzaWJsaW5nXCIgfSxcclxuICAgICAgeyBjb21tYW5kOiBcIlNoaWZ0ICsgXHUyMTkzIC8gRW50ZXIgLyBDbGlja1wiLCBwdXJwb3NlOiBcIkFkZCBjaGlsZFwiIH0sXHJcbiAgICAgIHsgY29tbWFuZDogXCJEZWxldGVcIiwgcHVycG9zZTogXCJEZWxldGUgaXRlbVwiIH0sXHJcbiAgICBdKTtcclxuXHJcbiAgICB0aGlzLmZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0aGlzLmhpZXJOb3RlTmFtZSwgXCJcIik7XHJcbiAgICBpZiAoIXRoaXMuZmlsZSkgdGhpcy5saW5lcyA9IFtdO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMpO1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKHRoaXMuZmlsZSk7XHJcbiAgICB0aGlzLmxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuXHJcbiAgICB0aGlzLmxpc3RJdGVtcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh0aGlzLmZpbGUpLmxpc3RJdGVtcztcclxuXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzKTtcclxuICAgIHN1cGVyLm9uT3BlbigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKTogSE5JdGVtW10ge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmxpc3RJdGVtc1xyXG4gICAgICAubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaSA9IGl0ZW0ucG9zaXRpb24uc3RhcnQubGluZTtcclxuICAgICAgICByZXR1cm4geyBpLCBsaW5lOiB0aGlzLmxpbmVzW2ldIH07XHJcbiAgICAgIH0pXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBzcGxpdHMgPSBpdGVtLmxpbmUuc3BsaXQoXCItIFwiKTtcclxuICAgICAgICBjb25zdCBkZXB0aCA9IHNwbGl0c1swXS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgbGluZSA9IHNwbGl0cy5zbGljZSgxKS5qb2luKFwiLSBcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGRlcHRoLCBsaW5lLCBsaW5lTm86IGl0ZW0uaSB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBpbmZvKGl0ZW1zKTtcclxuICAgIHJldHVybiBpdGVtcztcclxuICB9XHJcblxyXG4gIGdldEl0ZW1UZXh0KGl0ZW06IEhOSXRlbSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7XCIgXCIucmVwZWF0KGl0ZW0uZGVwdGgpfS0gJHtkcm9wV2lraWxpbmtzKGl0ZW0ubGluZSl9YDtcclxuICB9XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oaXRlbTogRnV6enlNYXRjaDxITkl0ZW0+LCBlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHN1cGVyLnJlbmRlclN1Z2dlc3Rpb24oaXRlbSwgZWwpO1xyXG4gICAgZWwuaW5uZXJUZXh0ID0gYCR7XCIgXCIucmVwZWF0KGl0ZW0uaXRlbS5kZXB0aCl9LSAke2Ryb3BXaWtpbGlua3MoXHJcbiAgICAgIGl0ZW0uaXRlbS5saW5lXHJcbiAgICApfWA7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGVJdGVtKGl0ZW06IEhOSXRlbSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5saW5lcy5zcGxpY2UoaXRlbS5saW5lTm8sIDEpO1xyXG4gICAgICB0aGlzLmxpc3RJdGVtcy5zcGxpY2UoaXRlbS5saW5lTm8sIDEpO1xyXG4gICAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KHRoaXMuZmlsZSwgdGhpcy5saW5lcy5qb2luKFwiXFxuXCIpKTtcclxuICAgICAgbmV3IE5vdGljZShcIkl0ZW0gZGVsZXRlZCBTdWNjZXNmdWxseVwiKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBlcnJvcihlcnIpO1xyXG4gICAgICBuZXcgTm90aWNlKFwiQW4gZXJyb3Igb2NjdXJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DaG9vc2VJdGVtKGl0ZW06IEhOSXRlbSwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgJiYgZXZ0LmtleSA9PT0gXCJEZWxldGVcIikge1xyXG4gICAgICB0aGlzLmRlbGV0ZUl0ZW0oaXRlbSk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBldnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmXHJcbiAgICAgIGV2dC5rZXkgPT0gXCJFbnRlclwiICYmXHJcbiAgICAgIGV2dC5zaGlmdEtleVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuICAgICAgY29uc3QgeyBlZGl0b3IgfSA9IHZpZXcgPz8ge307XHJcbiAgICAgIGlmICghZWRpdG9yKSByZXR1cm47XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICB2aWV3LmxlYWYub3BlbkZpbGUodGhpcy5maWxlLCB7IGFjdGl2ZTogdHJ1ZSwgbW9kZTogXCJzb3VyY2VcIiB9KTtcclxuICAgICAgZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGl0ZW0ubGluZU5vLCBjaDogaXRlbS5kZXB0aCArIDIgfSk7XHJcbiAgICB9IGVsc2UgaWYgKGV2dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgfHwgZXZ0IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xyXG4gICAgICBsZXQgcmVsOiBcInVwXCIgfCBcImRvd25cIiB8IFwic2FtZVwiO1xyXG4gICAgICBpZiAoZXZ0IGluc3RhbmNlb2YgTW91c2VFdmVudCAmJiBldnQudHlwZSA9PSBcImNsaWNrXCIpIHJlbCA9IFwiZG93blwiO1xyXG4gICAgICBpZiAoZXZ0IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCkgaWYgKGV2dC5rZXkgPT09IFwiRW50ZXJcIikgcmVsID0gXCJkb3duXCI7XHJcbiAgICAgIGlmIChldnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGV2dC5zaGlmdEtleSkge1xyXG4gICAgICAgIGlmIChldnQua2V5ID09PSBcIkFycm93VXBcIikgcmVsID0gXCJ1cFwiO1xyXG4gICAgICAgIGlmIChldnQua2V5ID09PSBcIkFycm93RG93blwiKSByZWwgPSBcImRvd25cIjtcclxuICAgICAgICBpZiAoZXZ0LmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHJlbCA9IFwic2FtZVwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZXcgTW9kaWZ5SGllckl0ZW1Nb2RhbChcclxuICAgICAgICB0aGlzLnBsdWdpbixcclxuICAgICAgICBpdGVtLFxyXG4gICAgICAgIHRoaXMuZmlsZSxcclxuICAgICAgICByZWxcclxuICAgICAgKS5vcGVuKCk7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IE1vZGFsLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgTW9kaWZ5SE5JdGVtQ29tcCBmcm9tIFwiLi4vLi4vQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5cclxuaW50ZXJmYWNlIEhOSXRlbSB7XHJcbiAgZGVwdGg6IG51bWJlcjtcclxuICBsaW5lOiBzdHJpbmc7XHJcbiAgbGluZU5vOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNb2RpZnlIaWVySXRlbU1vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG4gIG1vdW50OiBNb2RpZnlITkl0ZW1Db21wO1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgbW9kYWw6IE1vZGlmeUhpZXJJdGVtTW9kYWw7XHJcbiAgaG5JdGVtOiBITkl0ZW07XHJcbiAgZmlsZTogVEZpbGU7XHJcbiAgcmVsOiBcInVwXCIgfCBcInNhbWVcIiB8IFwiZG93blwiO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgICBobkl0ZW06IEhOSXRlbSxcclxuICAgIGZpbGU6IFRGaWxlLFxyXG4gICAgcmVsOiBcInVwXCIgfCBcInNhbWVcIiB8IFwiZG93blwiXHJcbiAgKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB0aGlzLm1vZGFsID0gdGhpcztcclxuICAgIHRoaXMuaG5JdGVtID0gaG5JdGVtO1xyXG4gICAgdGhpcy5maWxlID0gZmlsZTtcclxuICAgIHRoaXMucmVsID0gcmVsO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCkge1xyXG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcbiAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuXHJcbiAgICB0aGlzLm1vdW50ID0gbmV3IE1vZGlmeUhOSXRlbUNvbXAoe1xyXG4gICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcclxuICAgICAgcHJvcHM6IHtcclxuICAgICAgICBtb2RhbDogdGhpcyxcclxuICAgICAgICBzZXR0aW5nczogdGhpcy5wbHVnaW4uc2V0dGluZ3MsXHJcbiAgICAgICAgaG5JdGVtOiB0aGlzLmhuSXRlbSxcclxuICAgICAgICBmaWxlOiB0aGlzLmZpbGUsXHJcbiAgICAgICAgcmVsOiB0aGlzLnJlbCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbG9zZSgpIHtcclxuICAgIHRoaXMubW91bnQuJGRlc3Ryb3koKTtcclxuICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcbiAgfVxyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IGVycm9yIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuICBpbXBvcnQgeyBOb3RpY2UsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBNb2RpZnlIaWVySXRlbU1vZGFsIH0gZnJvbSBcIi4uL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSGllcmFyY2h5Tm90ZXMvTW9kaWZ5SGllckl0ZW1Nb2RhbFwiO1xyXG4gIGltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgeyBkcm9wV2lraWxpbmtzLCBtYWtlV2lraSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgbW9kYWw6IE1vZGlmeUhpZXJJdGVtTW9kYWw7XHJcbiAgZXhwb3J0IGxldCBzZXR0aW5nczogQkNTZXR0aW5ncztcclxuICBleHBvcnQgbGV0IGhuSXRlbTogSE5JdGVtO1xyXG4gIGV4cG9ydCBsZXQgZmlsZTogVEZpbGU7XHJcbiAgZXhwb3J0IGxldCByZWw6IFwidXBcIiB8IFwic2FtZVwiIHwgXCJkb3duXCI7XHJcblxyXG4gIGludGVyZmFjZSBITkl0ZW0ge1xyXG4gICAgZGVwdGg6IG51bWJlcjtcclxuICAgIGxpbmU6IHN0cmluZztcclxuICAgIGxpbmVObzogbnVtYmVyO1xyXG4gIH1cclxuICBsZXQgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgLy9AdHMtaWdub3JlXHJcbiAgbGV0IG5ld0l0ZW0gPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldy5maWxlLmJhc2VuYW1lO1xyXG5cclxuICBjb25zdCBidWlsZE5ld0l0ZW0gPSAoXHJcbiAgICBuZXdJdGVtOiBzdHJpbmcsXHJcbiAgICBkZXB0aCA9IGhuSXRlbS5kZXB0aCxcclxuICAgIHByZXZpZXcgPSBmYWxzZVxyXG4gICkgPT5cclxuICAgIGAke1wiIFwiLnJlcGVhdChNYXRoLnJvdW5kKGRlcHRoIC8gKHByZXZpZXcgPyAyIDogMSkpKX0tICR7XHJcbiAgICAgIHByZXZpZXcgPyBuZXdJdGVtIHx8IFwiPEVtcHR5PlwiIDogbWFrZVdpa2kobmV3SXRlbSlcclxuICAgIH1gO1xyXG5cclxuICAvLyBvbk1vdW50KGlucHV0RWwuZm9jdXMpO1xyXG48L3NjcmlwdD5cclxuXHJcbjxoNT5BZGQgYW4ge0FSUk9XX0RJUkVDVElPTlNbcmVsXX0gdG8ge2Ryb3BXaWtpbGlua3MoaG5JdGVtLmxpbmUpfTwvaDU+XHJcbjxkaXY+XHJcbiAgeyNpZiByZWwgPT09IFwidXBcIn1cclxuICAgIHsjaWYgaG5JdGVtLmRlcHRoID09PSAwfVxyXG4gICAgICA8ZGl2PkNhbid0IGFkZCBwYXJlbnQgdG8gdG9wIGxldmVsIGl0ZW0sIGNob29zZSBhbm90aGVyIGRpcmVjdGlvbjwvZGl2PlxyXG4gICAgezplbHNlfVxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxwcmU+XHJcbiAgICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCAtIDQsIHRydWUpfVxyXG4gICAgICAgIDwvcHJlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIHsvaWZ9XHJcbiAgey9pZn1cclxuICA8ZGl2PlxyXG4gICAgPHByZT5cclxuICAgICAgICA8c3Ryb25nXHJcbiAgICAgICAgPntidWlsZE5ld0l0ZW0oZHJvcFdpa2lsaW5rcyhobkl0ZW0ubGluZSksIGhuSXRlbS5kZXB0aCwgdHJ1ZSl9PC9zdHJvbmdcclxuICAgICAgPlxyXG4gICAgPC9wcmU+XHJcbiAgPC9kaXY+XHJcbiAgeyNpZiByZWwgPT09IFwic2FtZVwifVxyXG4gICAgPGRpdj5cclxuICAgICAgPHByZT5cclxuICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCwgdHJ1ZSl9XHJcbiAgICA8L3ByZT5cclxuICAgIDwvZGl2PlxyXG4gIHs6ZWxzZSBpZiByZWwgPT09IFwiZG93blwifVxyXG4gICAgPGRpdj5cclxuICAgICAgPHByZT5cclxuICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCArIDQsIHRydWUpfVxyXG4gICAgPC9wcmU+XHJcbiAgICA8L2Rpdj5cclxuICB7L2lmfVxyXG5cclxuICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1uby1vbmNoYW5nZSAtLT5cclxuICA8c2VsZWN0IGNsYXNzPVwiZHJvcGRvd25cIiB3aWR0aD1cIjFcIiBiaW5kOnZhbHVlPXtyZWx9PlxyXG4gICAgPG9wdGlvbiB2YWx1ZT1cInVwXCI+dXA8L29wdGlvbj5cclxuICAgIDxvcHRpb24gdmFsdWU9XCJzYW1lXCI+c2FtZTwvb3B0aW9uPlxyXG4gICAgPG9wdGlvbiB2YWx1ZT1cImRvd25cIj5kb3duPC9vcHRpb24+XHJcbiAgPC9zZWxlY3Q+XHJcblxyXG4gIDxpbnB1dFxyXG4gICAgdHlwZT1cInRleHRcIlxyXG4gICAgcGxhY2Vob2xkZXI9XCJOZXcgaXRlbVwiXHJcbiAgICBiaW5kOnRoaXM9e2lucHV0RWx9XHJcbiAgICBiaW5kOnZhbHVlPXtuZXdJdGVtfVxyXG4gIC8+XHJcblxyXG4gIDxidXR0b25cclxuICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4ge1xyXG4gICAgICBpZiAocmVsID09PSBcInVwXCIgJiYgaG5JdGVtLmRlcHRoID09PSAwKSB7XHJcbiAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgIFwiQ2FuJ3QgYWRkIHBhcmVudCB0byB0b3AgbGV2ZWwgaXRlbSwgY2hvb3NlIGFub3RoZXIgZGlyZWN0aW9uXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xyXG4gICAgICAgICAgY29uc3QgbGluZU5vID0gcmVsID09PSBcInVwXCIgPyBobkl0ZW0ubGluZU5vIDogaG5JdGVtLmxpbmVObyArIDE7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGVwdGggPVxyXG4gICAgICAgICAgICByZWwgPT09IFwidXBcIlxyXG4gICAgICAgICAgICAgID8gaG5JdGVtLmRlcHRoIC0gNFxyXG4gICAgICAgICAgICAgIDogcmVsID09PSBcImRvd25cIlxyXG4gICAgICAgICAgICAgID8gaG5JdGVtLmRlcHRoICsgNFxyXG4gICAgICAgICAgICAgIDogaG5JdGVtLmRlcHRoO1xyXG5cclxuICAgICAgICAgIGxpbmVzLnNwbGljZShsaW5lTm8sIDAsIGJ1aWxkTmV3SXRlbShuZXdJdGVtLCBkZXB0aCkpO1xyXG4gICAgICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBsaW5lcy5qb2luKFwiXFxuXCIpKTtcclxuICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBlcnJvcihlcnIpO1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcIkFuIGVycm9yIG9jY3VyZWQsIHBsZWFzZSBjaGVjayB0aGUgY29uc29sZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH19PkFkZDwvYnV0dG9uXHJcbiAgPlxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBwcmUge1xyXG4gICAgZGlzcGxheTogaW5saW5lO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgImltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGdldERWQXBpIH0gZnJvbSBcIi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGVJbmRleCwgaW5kZXhUb0xpbmVQYWlycyB9IGZyb20gXCIuL0NvbW1hbmRzL0NyZWF0ZUluZGV4XCI7XHJcbmltcG9ydCBDQlRyZWUgZnJvbSBcIi4vQ29tcG9uZW50cy9DQlRyZWUuc3ZlbHRlXCI7XHJcbmltcG9ydCB7IENPREVCTE9DS19GSUVMRFMsIENPREVCTE9DS19UWVBFUywgRElSRUNUSU9OUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IENvZGVibG9ja0ZpZWxkcywgUGFyc2VkQ29kZWJsb2NrIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XHJcbmltcG9ydCB7IGRyb3BGb2xkZXIsIHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGRmc0FsbFBhdGhzLFxyXG4gIGdldFJlZmxleGl2ZUNsb3N1cmUsXHJcbiAgZ2V0U3ViRm9yRmllbGRzLFxyXG4gIGdldFN1YkluRGlycyxcclxufSBmcm9tIFwiLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkSW5mbywgZ2V0RmllbGRzLCBnZXRPcHBEaXIgfSBmcm9tIFwiLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgY3JlYXRlSnVnZ2wgfSBmcm9tIFwiLi9WaXN1YWxpc2F0aW9ucy9KdWdnbFwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvZGVibG9ja0NCKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBkYiB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzLCBjcmVhdGVJbmRleEluZGVudCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICBzb3VyY2U6IHN0cmluZyxcclxuICAgIGVsOiBIVE1MRWxlbWVudCxcclxuICAgIGN0eDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dFxyXG4gICkgPT4ge1xyXG4gICAgZGIuc3RhcnQyRyhcIkNvZGVibG9ja1wiKTtcclxuICAgIGNvbnN0IHBhcnNlZFNvdXJjZSA9IHBhcnNlQ29kZUJsb2NrU291cmNlKHNvdXJjZSk7XHJcbiAgICBjb25zdCBlcnIgPSBjb2RlYmxvY2tFcnJvcihwbHVnaW4sIHBhcnNlZFNvdXJjZSk7XHJcblxyXG4gICAgaWYgKGVyciAhPT0gXCJcIikge1xyXG4gICAgICBlbC5pbm5lckhUTUwgPSBlcnI7XHJcbiAgICAgIGRiLmVuZDJHKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWluID0gMCxcclxuICAgICAgbWF4ID0gSW5maW5pdHk7XHJcbiAgICBsZXQgeyBkZXB0aCwgZGlyLCBmaWVsZHMsIGZyb20sIGltcGxpZWQsIGZsYXQgfSA9IHBhcnNlZFNvdXJjZTtcclxuICAgIGlmIChkZXB0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IG1pbk51bSA9IHBhcnNlSW50KGRlcHRoWzBdKTtcclxuICAgICAgaWYgKCFpc05hTihtaW5OdW0pKSBtaW4gPSBtaW5OdW07XHJcbiAgICAgIGNvbnN0IG1heE51bSA9IHBhcnNlSW50KGRlcHRoWzFdKTtcclxuICAgICAgaWYgKCFpc05hTihtYXhOdW0pKSBtYXggPSBtYXhOdW07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGN1cnJGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoXHJcbiAgICAgIGN0eC5zb3VyY2VQYXRoLFxyXG4gICAgICBcIlwiXHJcbiAgICApO1xyXG4gICAgY29uc3QgeyBiYXNlbmFtZSB9ID0gY3VyckZpbGU7XHJcblxyXG4gICAgbGV0IGZyb21zID0gdW5kZWZpbmVkO1xyXG4gICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGFwaSA9IGdldERWQXBpKHBsdWdpbik7XHJcbiAgICAgICAgaWYgKGFwaSkge1xyXG4gICAgICAgICAgY29uc3QgcGFnZXMgPSBhcGkucGFnZVBhdGhzKGZyb20pPy52YWx1ZXM7XHJcbiAgICAgICAgICBmcm9tcyA9IHBhZ2VzLm1hcChkcm9wRm9sZGVyKTtcclxuICAgICAgICB9IGVsc2UgbmV3IE5vdGljZShcIkRhdGF2aWV3IG11c3QgYmUgZW5hYmxlZCBmb3IgYGZyb21gIHRvIHdvcmsuXCIpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbmV3IE5vdGljZShgVGhlIHF1ZXJ5IFwiJHtmcm9tfVwiIGZhaWxlZC5gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wcERpciA9IGdldE9wcERpcihkaXIpO1xyXG4gICAgY29uc3Qgc3ViID1cclxuICAgICAgaW1wbGllZCA9PT0gZmFsc2VcclxuICAgICAgICA/IGdldFN1YkluRGlycyhwbHVnaW4ubWFpbkcsIGRpcilcclxuICAgICAgICA6IGdldFN1YkluRGlycyhwbHVnaW4ubWFpbkcsIGRpciwgb3BwRGlyKTtcclxuICAgIGNvbnN0IGNsb3NlZCA9IGdldFJlZmxleGl2ZUNsb3N1cmUoc3ViLCB1c2VySGllcnMpO1xyXG5cclxuICAgIGNvbnN0IHN1YkZpZWxkcyA9IGZpZWxkcyA/PyBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICAgIGNvbnN0IHN1YkNsb3NlZCA9IGdldFN1YkZvckZpZWxkcyhnZXRTdWJJbkRpcnMoY2xvc2VkLCBkaXIpLCBzdWJGaWVsZHMpO1xyXG5cclxuXHJcbiAgICBjb25zdCBhbGxQYXRocyA9IGRmc0FsbFBhdGhzKHN1YkNsb3NlZCwgYmFzZW5hbWUpO1xyXG4gICAgY29uc3QgaW5kZXggPSBjcmVhdGVJbmRleChhbGxQYXRocywgZmFsc2UsIGNyZWF0ZUluZGV4SW5kZW50KTtcclxuICAgIGluZm8oeyBhbGxQYXRocywgaW5kZXggfSk7XHJcblxyXG4gICAgY29uc3QgbGluZXMgPSBpbmRleFRvTGluZVBhaXJzKGluZGV4LCBmbGF0KTtcclxuXHJcbiAgICBzd2l0Y2ggKHBhcnNlZFNvdXJjZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJ0cmVlXCI6XHJcbiAgICAgICAgbmV3IENCVHJlZSh7XHJcbiAgICAgICAgICB0YXJnZXQ6IGVsLFxyXG4gICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgcGx1Z2luLFxyXG4gICAgICAgICAgICBlbCxcclxuICAgICAgICAgICAgbWluLFxyXG4gICAgICAgICAgICBtYXgsXHJcbiAgICAgICAgICAgIGxpbmVzLFxyXG4gICAgICAgICAgICBmcm9tcyxcclxuICAgICAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgICAgIHBhcnNlZFNvdXJjZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJqdWdnbFwiOlxyXG4gICAgICAgIGNyZWF0ZWRKdWdnbENCKFxyXG4gICAgICAgICAgcGx1Z2luLFxyXG4gICAgICAgICAgZWwsXHJcbiAgICAgICAgICBwYXJzZWRTb3VyY2UsXHJcbiAgICAgICAgICBsaW5lcyxcclxuICAgICAgICAgIGZyb21zLFxyXG4gICAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgICBtaW4sXHJcbiAgICAgICAgICBtYXhcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBhcnNlIGEgc3RyaW5nIGFzIGEgYm9vbGVhbiB2YWx1ZS4gSWYgbm90IFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiwgcmV0dXJuIGB2YWx1ZWAuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgYm9vbGVhbn1cclxuICovXHJcbmNvbnN0IHBhcnNlQXNCb29sID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBib29sZWFuID0+XHJcbiAgdmFsdWUgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IHZhbHVlID09PSBcImZhbHNlXCIgPyBmYWxzZSA6IHZhbHVlO1xyXG5cclxuZnVuY3Rpb24gcGFyc2VDb2RlQmxvY2tTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBQYXJzZWRDb2RlYmxvY2sge1xyXG4gIGNvbnN0IGxpbmVzID0gc291cmNlLnNwbGl0KFwiXFxuXCIpO1xyXG4gIGNvbnN0IGdldFZhbHVlID0gKHR5cGU6IHN0cmluZykgPT5cclxuICAgIGxpbmVzXHJcbiAgICAgIC5maW5kKChsKSA9PiBsLnN0YXJ0c1dpdGgoYCR7dHlwZX06YCkpXHJcbiAgICAgID8uc3BsaXQoXCI6XCIpPy5bMV1cclxuICAgICAgPy50cmltKCk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdHM6IHsgW2ZpZWxkIGluIENvZGVibG9ja0ZpZWxkc106IHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXSB9ID1cclxuICAgIHt9O1xyXG5cclxuICBDT0RFQkxPQ0tfRklFTERTLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGdldFZhbHVlKGZpZWxkKTtcclxuICAgIHJlc3VsdHNbZmllbGRdID0gcGFyc2VBc0Jvb2wodmFsdWUpO1xyXG4gIH0pO1xyXG5cclxuICByZXN1bHRzLmZpZWxkcyA9IHJlc3VsdHMuZmllbGRzXHJcbiAgICA/IHNwbGl0QW5kVHJpbShyZXN1bHRzLmZpZWxkcyBhcyBzdHJpbmcpXHJcbiAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgaWYgKHJlc3VsdHMuZGVwdGgpIHtcclxuICAgIGNvbnN0IG1hdGNoID0gKHJlc3VsdHMuZGVwdGggYXMgc3RyaW5nKS5tYXRjaCgvKFxcZCopLT8oXFxkKikvKTtcclxuICAgIHJlc3VsdHMuZGVwdGggPSBbbWF0Y2hbMV0sIG1hdGNoWzJdXTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUGFyc2VkQ29kZWJsb2NrO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb2RlYmxvY2tFcnJvcihwbHVnaW46IEJDUGx1Z2luLCBwYXJzZWRTb3VyY2U6IFBhcnNlZENvZGVibG9jaykge1xyXG4gIGNvbnN0IHsgZGlyLCBmaWVsZHMsIHR5cGUsIHRpdGxlLCBkZXB0aCwgZmxhdCwgY29udGVudCwgZnJvbSwgaW1wbGllZCB9ID1cclxuICAgIHBhcnNlZFNvdXJjZTtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gIGxldCBlcnIgPSBcIlwiO1xyXG5cclxuICBpZiAoIUNPREVCTE9DS19UWVBFUy5pbmNsdWRlcyh0eXBlKSlcclxuICAgIGVyciArPSBgPGNvZGU+dHlwZTogJHt0eXBlfTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdHlwZS4gSXQgbXVzdCBiZSBvbmUgb2Y6ICR7Q09ERUJMT0NLX1RZUEVTLm1hcChcclxuICAgICAgKHR5cGUpID0+IGA8Y29kZT4ke3R5cGV9PC9jb2RlPmBcclxuICAgICkuam9pbihcIiwgXCIpfS48L2JyPmA7XHJcblxyXG4gIGNvbnN0IHZhbGlkRGlyID0gRElSRUNUSU9OUy5pbmNsdWRlcyhkaXIpO1xyXG4gIGlmICghdmFsaWREaXIpXHJcbiAgICBlcnIgKz0gYDxjb2RlPmRpcjogJHtkaXJ9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCBkaXJlY3Rpb24uPC9icj5gO1xyXG5cclxuICBjb25zdCBhbGxGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBbZmllbGRzXS5mbGF0KCk/LmZvckVhY2goKGYpID0+IHtcclxuICAgIGlmIChmICE9PSB1bmRlZmluZWQgJiYgIWFsbEZpZWxkcy5pbmNsdWRlcyhmKSlcclxuICAgICAgZXJyICs9IGA8Y29kZT5maWVsZHM6ICR7Zn08L2NvZGU+IGlzIG5vdCBhIGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMuPC9icj5gO1xyXG4gIH0pO1xyXG5cclxuICBpZiAodGl0bGUgIT09IHVuZGVmaW5lZCAmJiB0aXRsZSAhPT0gZmFsc2UpXHJcbiAgICBlcnIgKz0gYDxjb2RlPnRpdGxlOiAke3RpdGxlfTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIGxlYXZlIHRoZSBlbnRpcmUgbGluZSBvdXQuPC9icj5gO1xyXG5cclxuICBpZiAoZGVwdGggIT09IHVuZGVmaW5lZCAmJiBkZXB0aC5ldmVyeSgobnVtKSA9PiBpc05hTihwYXJzZUludChudW0pKSkpXHJcbiAgICBlcnIgKz0gYDxjb2RlPmRlcHRoOiAke2RlcHRofTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSBhIG51bWJlci48L2JyPmA7XHJcblxyXG4gIGlmIChmbGF0ICE9PSB1bmRlZmluZWQgJiYgZmxhdCAhPT0gdHJ1ZSlcclxuICAgIGVyciArPSBgPGNvZGU+ZmxhdDogJHtmbGF0fTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT50cnVlPC9jb2RlPiwgb3IgbGVhdmUgdGhlIGVudGlyZSBsaW5lIG91dC48L2JyPmA7XHJcblxyXG4gIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQgJiYgY29udGVudCAhPT0gXCJvcGVuXCIgJiYgY29udGVudCAhPT0gXCJjbG9zZWRcIilcclxuICAgIGVyciArPSBgPGNvZGU+Y29udGVudDogJHtjb250ZW50fTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT5vcGVuPC9jb2RlPiBvciA8Y29kZT5jbG9zZWQ8L2NvZGU+LCBvciBsZWF2ZSB0aGUgZW50aXJlIGxpbmUgb3V0LjwvYnI+YDtcclxuXHJcbiAgaWYgKFxyXG4gICAgZnJvbSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAhYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKFwiZGF0YXZpZXdcIilcclxuICApIHtcclxuICAgIGVyciArPSBgRGF0YXZpZXcgbXVzdCBiZSBlbmFibGVkIHRvIHVzZSA8Y29kZT5mcm9tPC9jb2RlPi48L2JyPmA7XHJcbiAgfVxyXG5cclxuICBpZiAoaW1wbGllZCAhPT0gdW5kZWZpbmVkICYmIGltcGxpZWQgIT09IGZhbHNlKVxyXG4gICAgZXJyICs9IGA8Y29kZT5pbXBsaWVkOiAke2ltcGxpZWR9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCB2YWx1ZS4gSXQgaGFzIHRvIGJlIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3IgbGVhdmUgdGhlIGVudGlyZSBsaW5lIG91dC48L2JyPmA7XHJcblxyXG4gIHJldHVybiBlcnIgPT09IFwiXCJcclxuICAgID8gXCJcIlxyXG4gICAgOiBgJHtlcnJ9PC9icj5cclxuICAgIEEgdmFsaWQgZXhhbXBsZSB3b3VsZCBiZTpcclxuICAgIDxwcmU+PGNvZGU+XHJcbiAgICAgIHR5cGU6IHRyZWVcclxuICAgICAgZGlyOiAke3ZhbGlkRGlyID8gZGlyIDogXCJkb3duXCJ9XHJcbiAgICAgIGZpZWxkczogJHthbGxGaWVsZHNcclxuICAgICAgLm1hcCgoZikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7IGYsIGRpcjogZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZikuZmllbGREaXIgfTtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcigoaW5mbykgPT4gaW5mby5kaXIgPT09IGRpcilcclxuICAgICAgLm1hcCgoaW5mbykgPT4gaW5mby5mKVxyXG4gICAgICAuam9pbihcIiwgXCIpIHx8IFwiY2hpbGRcIlxyXG4gICAgfVxyXG4gICAgICBkZXB0aDogM1xyXG4gICAgICA8L2NvZGU+PC9wcmU+YDtcclxufVxyXG5cclxuY29uc3QgaW5kZW50VG9EZXB0aCA9IChpbmRlbnQ6IHN0cmluZykgPT4gaW5kZW50Lmxlbmd0aCAvIDIgKyAxO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lZXRzQ29uZGl0aW9ucyhcclxuICBpbmRlbnQ6IHN0cmluZyxcclxuICBub2RlOiBzdHJpbmcsXHJcbiAgZnJvbXM6IHN0cmluZ1tdLFxyXG4gIG1pbjogbnVtYmVyLFxyXG4gIG1heDogbnVtYmVyXHJcbikge1xyXG4gIGNvbnN0IGRlcHRoID0gaW5kZW50VG9EZXB0aChpbmRlbnQpO1xyXG4gIHJldHVybiAoXHJcbiAgICBkZXB0aCA+PSBtaW4gJiZcclxuICAgIGRlcHRoIDw9IG1heCAmJlxyXG4gICAgKGZyb21zID09PSB1bmRlZmluZWQgfHwgZnJvbXMuaW5jbHVkZXMobm9kZSkpXHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRKdWdnbENCKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudCxcclxuICBhcmdzOiBQYXJzZWRDb2RlYmxvY2ssXHJcbiAgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXSxcclxuICBmcm9tczogc3RyaW5nW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgbWluOiBudW1iZXIsXHJcbiAgbWF4OiBudW1iZXJcclxuKSB7XHJcbiAgY29uc3Qgbm9kZXMgPSBsaW5lc1xyXG4gICAgLmZpbHRlcigoW2luZGVudCwgbm9kZV0pID0+IG1lZXRzQ29uZGl0aW9ucyhpbmRlbnQsIG5vZGUsIGZyb21zLCBtaW4sIG1heCkpXHJcbiAgICAubWFwKChbXywgbm9kZV0pID0+IG5vZGUgKyBcIi5tZFwiKTtcclxuICBpZiAobWluIDw9IDApIG5vZGVzLnB1c2goc291cmNlICsgXCIubWRcIik7XHJcblxyXG4gIGNyZWF0ZUp1Z2dsKHBsdWdpbiwgdGFyZ2V0LCBub2RlcywgYXJncyk7XHJcbn1cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgTWFya2Rvd25SZW5kZXJlciB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG4gIGltcG9ydCB7IG9uTW91bnQgfSBmcm9tIFwic3ZlbHRlXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGF0aDogc3RyaW5nO1xyXG5cclxuICBhc3luYyBmdW5jdGlvbiBnZXRDb250ZW50KG5vdGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KG5vdGUsIFwiXCIpO1xyXG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgbGV0IGVsOiBIVE1MRWxlbWVudDtcclxuICBvbk1vdW50KGFzeW5jICgpID0+IHtcclxuICAgIE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24oYXdhaXQgZ2V0Q29udGVudChwYXRoKSwgZWwsIHBhdGgsIG51bGwpO1xyXG4gIH0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1ub3RlLWNvbnRlbnRcIiBiaW5kOnRoaXM9e2VsfSAvPlxyXG5cclxuPHN0eWxlPlxyXG4gIGRpdi5CQy1ub3RlLWNvbnRlbnQge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHtcclxuICAgIGlzSW5WYXVsdCxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICAgIGhvdmVyUHJldmlldyxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuICBpbXBvcnQgeyBtZWV0c0NvbmRpdGlvbnMgfSBmcm9tIFwiLi4vQ29kZWJsb2Nrc1wiO1xyXG4gIGltcG9ydCB0eXBlIHsgUGFyc2VkQ29kZWJsb2NrIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IGRyb3BEZW5kcm9uIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG4gIGltcG9ydCBSZW5kZXJNYXJrZG93biBmcm9tIFwiLi9SZW5kZXJNYXJrZG93bi5zdmVsdGVcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgZWw6IEhUTUxFbGVtZW50O1xyXG4gIGV4cG9ydCBsZXQgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICBleHBvcnQgbGV0IGZyb21zOiBzdHJpbmdbXTtcclxuICBleHBvcnQgbGV0IG1pbjogbnVtYmVyO1xyXG4gIGV4cG9ydCBsZXQgbWF4OiBudW1iZXI7XHJcbiAgZXhwb3J0IGxldCBiYXNlbmFtZTogc3RyaW5nO1xyXG4gIGV4cG9ydCBsZXQgcGFyc2VkU291cmNlOiBQYXJzZWRDb2RlYmxvY2s7XHJcblxyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHRpdGxlLCBjb250ZW50LCBkaXIgfSA9IHBhcnNlZFNvdXJjZTtcclxuXHJcbiAgY29uc3QgYWN0aXZlTGVhZlZpZXcgPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldztcclxuPC9zY3JpcHQ+XHJcblxyXG57I2lmIHRpdGxlICE9PSBmYWxzZX1cclxuICA8aDM+e2Rpcn0gb2Yge2Jhc2VuYW1lfTwvaDM+XHJcbnsvaWZ9XHJcbjxkaXYgY2xhc3M9XCJCQy10cmVlXCI+XHJcbiAgeyNlYWNoIGxpbmVzIGFzIFtpbmRlbnQsIGxpbmtdfVxyXG4gICAgeyNpZiBtZWV0c0NvbmRpdGlvbnMoaW5kZW50LCBsaW5rLCBmcm9tcywgbWluLCBtYXgpfVxyXG4gICAgICB7I2lmIGNvbnRlbnQgPT09IFwib3BlblwiIHx8IGNvbnRlbnQgPT09IFwiY2xvc2VkXCJ9XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxwcmUgY2xhc3M9XCJpbmRlbnRcIj57aW5kZW50fTwvcHJlPlxyXG4gICAgICAgICAgPGRldGFpbHMgb3Blbj17Y29udGVudCA9PT0gXCJvcGVuXCJ9PlxyXG4gICAgICAgICAgICA8c3VtbWFyeT5cclxuICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2gobGluaywgZSl9XHJcbiAgICAgICAgICAgICAgICBvbjptb3VzZW92ZXI9eyhlKSA9PiBob3ZlclByZXZpZXcoZSwgYWN0aXZlTGVhZlZpZXcsIGxpbmspfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1pc3NpbmctYXR0cmlidXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnRlcm5hbC1saW5rIHtpc0luVmF1bHQobGluaykgPyAnJyA6ICdpcy11bnJlc29sdmVkJ31cIlxyXG4gICAgICAgICAgICAgICAgICA+e2Ryb3BEZW5kcm9uKGxpbmssIHNldHRpbmdzKX08L2FcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3VtbWFyeT5cclxuICAgICAgICAgICAgPFJlbmRlck1hcmtkb3duIHBhdGg9e2xpbmt9IC8+XHJcbiAgICAgICAgICA8L2RldGFpbHM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHs6ZWxzZX1cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHByZSBjbGFzcz1cImluZGVudFwiPntpbmRlbnQgKyBcIi1cIn08L3ByZT5cclxuICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1vdXNlLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmtcIlxyXG4gICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaChsaW5rLCBlKX1cclxuICAgICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCBsaW5rKX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbWlzc2luZy1hdHRyaWJ1dGUgLS0+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiaW50ZXJuYWwtbGluayB7aXNJblZhdWx0KGxpbmspID8gJycgOiAnaXMtdW5yZXNvbHZlZCd9XCI+XHJcbiAgICAgICAgICAgICAge2Ryb3BEZW5kcm9uKGxpbmssIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB7L2lmfVxyXG4gICAgey9pZn1cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIC5CQy10cmVlIHtcclxuICAgIHBhZGRpbmctbGVmdDogNXB4O1xyXG4gIH1cclxuICAvKiAuQkMtdHJlZSA+IGRpdiB7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIH0gKi9cclxuICBwcmUuaW5kZW50IHtcclxuICAgIGRpc3BsYXk6IGlubGluZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG4gICAgcG9zaXRpb246IHRvcDtcclxuICB9XHJcbiAgZGV0YWlscyB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgfVxyXG5cclxuICAuaXMtdW5yZXNvbHZlZCB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHsgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldFJlYWxuSW1wbGllZCB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7Z2V0Q3VyckZpbGV9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ganVtcFRvRmlyc3REaXIocGx1Z2luOiBCQ1BsdWdpbiwgZGlyOiBEaXJlY3Rpb25zKSB7XHJcbiAgY29uc3QgeyBsaW1pdEp1bXBUb0ZpcnN0RmllbGRzIH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbiAgY29uc3QgZmlsZSA9IGdldEN1cnJGaWxlKCk7XHJcbiAgaWYgKCFmaWxlKSB7XHJcbiAgICBuZXcgTm90aWNlKFwiWW91IG5lZWQgdG8gYmUgZm9jdXNzZWQgb24gYSBNYXJrZG93biBmaWxlXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBjb25zdCB7IGJhc2VuYW1lIH0gPSBmaWxlO1xyXG5cclxuICBjb25zdCByZWFsc05JbXBsaWVkcyA9IGdldFJlYWxuSW1wbGllZChwbHVnaW4sIGJhc2VuYW1lLCBkaXIpW2Rpcl07XHJcbiAgY29uc3QgYWxsQkNzID0gWy4uLnJlYWxzTkltcGxpZWRzLnJlYWxzLCAuLi5yZWFsc05JbXBsaWVkcy5pbXBsaWVkc107XHJcbiAgaWYgKGFsbEJDcy5sZW5ndGggPT09IDApIHtcclxuICAgIG5ldyBOb3RpY2UoYE5vICR7ZGlyfSBmb3VuZGApO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdG9Ob2RlID0gYWxsQkNzLmZpbmQoKGJjKSA9PlxyXG4gICAgbGltaXRKdW1wVG9GaXJzdEZpZWxkcy5pbmNsdWRlcyhiYy5maWVsZClcclxuICApPy50bztcclxuXHJcbiAgaWYgKCF0b05vZGUpIHtcclxuICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgIGBObyBub3RlIHdhcyBmb3VuZCBpbiAke2Rpcn0gZ2l2ZW4gdGhlIGxpbWl0ZWQgZmllbGRzIGFsbG93ZWQ6ICR7bGltaXRKdW1wVG9GaXJzdEZpZWxkcy5qb2luKFxyXG4gICAgICAgIFwiLCBcIlxyXG4gICAgICApfWBcclxuICAgICk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCB0b0ZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0b05vZGUsIFwiXCIpO1xyXG4gIGF3YWl0IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi5vcGVuRmlsZSh0b0ZpbGUpO1xyXG59XHJcbiIsICJpbXBvcnQgeyBub3JtYWxpemVQYXRoLCBOb3RpY2UsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkSW5mbywgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGVPclVwZGF0ZVlhbWwsIGdldEN1cnJGaWxlLCBzcGxpdEF0WWFtbCB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5jb25zdCByZXNvbHZlVGhyZWFkaW5nTmFtZVRlbXBsYXRlID0gKFxyXG4gIHRlbXBsYXRlOiBzdHJpbmcsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zLFxyXG4gIGRhdGVGb3JtYXQ6IHN0cmluZ1xyXG4pID0+XHJcbiAgdGVtcGxhdGVcclxuICAgID8gdGVtcGxhdGVcclxuICAgICAgLnJlcGxhY2UoXCJ7e2N1cnJlbnR9fVwiLCBjdXJyRmlsZS5iYXNlbmFtZSlcclxuICAgICAgLnJlcGxhY2UoXCJ7e2ZpZWxkfX1cIiwgZmllbGQpXHJcbiAgICAgIC5yZXBsYWNlKFwie3tkaXJ9fVwiLCBkaXIpXHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIG1vbWVudCgpLmZvcm1hdChkYXRlRm9ybWF0KSlcclxuICAgIDogXCJVbnRpdGxlZFwiO1xyXG5cclxuZnVuY3Rpb24gbWFrZUZpbGVuYW1lVW5pcXVlKGZpbGVuYW1lOiBzdHJpbmcpIHtcclxuICBsZXQgaSA9IDEsXHJcbiAgICBuZXdOYW1lID0gZmlsZW5hbWU7XHJcbiAgd2hpbGUgKGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KG5ld05hbWUsIFwiXCIpKSB7XHJcbiAgICBpZiAoaSA9PT0gMSkgbmV3TmFtZSArPSBgICR7aX1gO1xyXG4gICAgZWxzZSBuZXdOYW1lID0gbmV3TmFtZS5zbGljZSgwLCAtMikgKyBgICR7aX1gO1xyXG4gICAgaSsrO1xyXG4gIH1cclxuICByZXR1cm4gbmV3TmFtZTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRocmVhZGluZ0NvbnRlbnRUZW1wbGF0ZShcclxuICB3cml0ZUJDc0lubGluZTogYm9vbGVhbixcclxuICB0ZW1wbGF0ZVBhdGg6IHN0cmluZyxcclxuICBvcHBGaWVsZDogc3RyaW5nLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBjcnVtYjogc3RyaW5nXHJcbikge1xyXG4gIGxldCBuZXdDb250ZW50ID0gY3J1bWI7XHJcblxyXG4gIGlmICh0ZW1wbGF0ZVBhdGgpIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlRmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KFxyXG4gICAgICB0ZW1wbGF0ZVBhdGgsXHJcbiAgICAgIFwiXCJcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZCh0ZW1wbGF0ZUZpbGUpO1xyXG4gICAgbmV3Q29udGVudCA9IHRlbXBsYXRlLnJlcGxhY2UoXHJcbiAgICAgIC9cXHtcXHtCQy10aHJlYWQtY3J1bWJcXH1cXH0vaSxcclxuICAgICAgd3JpdGVCQ3NJbmxpbmVcclxuICAgICAgICA/IGAke29wcEZpZWxkfTo6IFtbJHtjdXJyRmlsZS5iYXNlbmFtZX1dXWBcclxuICAgICAgICA6IGAke29wcEZpZWxkfTogWycke2N1cnJGaWxlLmJhc2VuYW1lfSddYFxyXG4gICAgKTtcclxuICB9XHJcbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aHJlYWQocGx1Z2luOiBCQ1BsdWdpbiwgZmllbGQ6IHN0cmluZykge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7XHJcbiAgICB1c2VySGllcnMsXHJcbiAgICB0aHJlYWRpbmdUZW1wbGF0ZSxcclxuICAgIGRhdGVGb3JtYXQsXHJcbiAgICB0aHJlYWRJbnRvTmV3UGFuZSxcclxuICAgIHRocmVhZGluZ0RpclRlbXBsYXRlcyxcclxuICAgIHRocmVhZFVuZGVyQ3Vyc29yLFxyXG4gICAgd3JpdGVCQ3NJbmxpbmUsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG5cclxuICBjb25zdCBjdXJyRmlsZSA9IGdldEN1cnJGaWxlKCk7XHJcbiAgaWYgKCFjdXJyRmlsZSkgcmV0dXJuO1xyXG5cclxuICBjb25zdCBuZXdGaWxlUGFyZW50ID0gYXBwLmZpbGVNYW5hZ2VyLmdldE5ld0ZpbGVQYXJlbnQoY3VyckZpbGUucGF0aCk7XHJcblxyXG4gIGNvbnN0IGRpciA9IGdldEZpZWxkSW5mbyh1c2VySGllcnMsIGZpZWxkKS5maWVsZERpcjtcclxuICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICBsZXQgbmV3QmFzZW5hbWUgPSByZXNvbHZlVGhyZWFkaW5nTmFtZVRlbXBsYXRlKFxyXG4gICAgdGhyZWFkaW5nVGVtcGxhdGUsXHJcbiAgICBjdXJyRmlsZSxcclxuICAgIGZpZWxkLFxyXG4gICAgZGlyLFxyXG4gICAgZGF0ZUZvcm1hdFxyXG4gICk7XHJcbiAgbmV3QmFzZW5hbWUgPSBtYWtlRmlsZW5hbWVVbmlxdWUobmV3QmFzZW5hbWUpO1xyXG5cclxuICBjb25zdCBvcHBDcnVtYiA9IHdyaXRlQkNzSW5saW5lXHJcbiAgICA/IGAke29wcEZpZWxkfTo6IFtbJHtjdXJyRmlsZS5iYXNlbmFtZX1dXWBcclxuICAgIDogYC0tLVxcbiR7b3BwRmllbGR9OiBbJyR7Y3VyckZpbGUuYmFzZW5hbWV9J11cXG4tLS1gO1xyXG5cclxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSB0aHJlYWRpbmdEaXJUZW1wbGF0ZXNbZGlyXTtcclxuICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgcmVzb2x2ZVRocmVhZGluZ0NvbnRlbnRUZW1wbGF0ZShcclxuICAgIHdyaXRlQkNzSW5saW5lLFxyXG4gICAgdGVtcGxhdGVQYXRoLFxyXG4gICAgb3BwRmllbGQsXHJcbiAgICBjdXJyRmlsZSxcclxuICAgIG9wcENydW1iXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgbmV3RmlsZSA9IGF3YWl0IGFwcC52YXVsdC5jcmVhdGUoXHJcbiAgICBub3JtYWxpemVQYXRoKGAke25ld0ZpbGVQYXJlbnQucGF0aH0vJHtuZXdCYXNlbmFtZX0ubWRgKSxcclxuICAgIG5ld0NvbnRlbnRcclxuICApO1xyXG5cclxuICBpZiAoIXdyaXRlQkNzSW5saW5lKSB7XHJcbiAgICBjb25zdCB7IGFwaSB9ID0gYXBwLnBsdWdpbnMucGx1Z2lucy5tZXRhZWRpdCA/PyB7fTtcclxuICAgIGlmICghYXBpKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgXCJNZXRhZWRpdCBtdXN0IGJlIGVuYWJsZWQgdG8gd3JpdGUgdG8geWFtbC4gQWx0ZXJuYXRpdmVseSwgdG9nZ2xlIHRoZSBzZXR0aW5nIGBXcml0ZSBCcmVhZGNydW1icyBJbmxpbmVgIHRvIHVzZSBEYXRhdmlldyBpbmxpbmUgZmllbGRzIGluc3RlYWQuXCJcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgY3JlYXRlT3JVcGRhdGVZYW1sKFxyXG4gICAgICBmaWVsZCxcclxuICAgICAgbmV3RmlsZS5iYXNlbmFtZSxcclxuICAgICAgY3VyckZpbGUsXHJcbiAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShjdXJyRmlsZSkuZnJvbnRtYXR0ZXIsXHJcbiAgICAgIGFwaVxyXG4gICAgKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgY3J1bWIgPSBgJHtmaWVsZH06OiBbWyR7bmV3RmlsZS5iYXNlbmFtZX1dXWA7XHJcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXc7XHJcbiAgICBpZiAodGhyZWFkVW5kZXJDdXJzb3IgfHwgIWVkaXRvcikge1xyXG4gICAgICBlZGl0b3IucmVwbGFjZVJhbmdlKGNydW1iLCBlZGl0b3IuZ2V0Q3Vyc29yKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETyBDaGVjayBpZiB0aGlzIG5vdGUgYWxyZWFkeSBoYXMgdGhpcyBmaWVsZFxyXG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGN1cnJGaWxlKTtcclxuICAgICAgY29uc3Qgc3BsaXRzID0gc3BsaXRBdFlhbWwoY29udGVudCk7XHJcbiAgICAgIGNvbnRlbnQgPVxyXG4gICAgICAgIHNwbGl0c1swXSArXHJcbiAgICAgICAgKHNwbGl0c1swXS5sZW5ndGggPyBcIlxcblwiIDogXCJcIikgK1xyXG4gICAgICAgIGNydW1iICtcclxuICAgICAgICAoc3BsaXRzWzFdLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgc3BsaXRzWzFdO1xyXG5cclxuICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShjdXJyRmlsZSwgY29udGVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBsZWFmID0gdGhyZWFkSW50b05ld1BhbmVcclxuICAgID8gYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpXHJcbiAgICA6IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcclxuXHJcbiAgYXdhaXQgbGVhZi5vcGVuRmlsZShuZXdGaWxlLCB7IGFjdGl2ZTogdHJ1ZSwgbW9kZTogXCJzb3VyY2VcIiB9KTtcclxuXHJcbiAgaWYgKHRlbXBsYXRlUGF0aCkge1xyXG4gICAgaWYgKGFwcC5wbHVnaW5zLnBsdWdpbnNbXCJ0ZW1wbGF0ZXItb2JzaWRpYW5cIl0pIHtcclxuICAgICAgYXBwLmNvbW1hbmRzLmV4ZWN1dGVDb21tYW5kQnlJZChcclxuICAgICAgICBcInRlbXBsYXRlci1vYnNpZGlhbjpyZXBsYWNlLWluLWZpbGUtdGVtcGxhdGVyXCJcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgXCJUaGUgVGVtcGxhdGVyIHBsdWdpbiBtdXN0IGJlIGVuYWJsZWQgdG8gcmVzb2x2ZSB0aGUgdGVtcGxhdGVzIGluIHRoZSBuZXcgbm90ZVwiXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAodGhyZWFkaW5nVGVtcGxhdGUpIHtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIGNvbnN0IGVkaXRvciA9IGxlYWYudmlldy5lZGl0b3IgYXMgRWRpdG9yO1xyXG4gICAgZWRpdG9yLnNldEN1cnNvcihlZGl0b3IuZ2V0VmFsdWUoKS5sZW5ndGgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBub3RlTmFtZUlucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJ2aWV3LWhlYWRlci10aXRsZVwiKTtcclxuXHJcbiAgICBjb25zdCBuZXdOb3RlSW5wdXRFbCA9IEFycmF5LmZyb20obm90ZU5hbWVJbnB1dHMpLmZpbmQoXHJcbiAgICAgIChpbnB1dDogSFRNTElucHV0RWxlbWVudCkgPT4gaW5wdXQuaW5uZXJUZXh0ID09PSBuZXdCYXNlbmFtZVxyXG4gICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgbmV3Tm90ZUlucHV0RWwuaW5uZXJUZXh0ID0gXCJcIjtcclxuICAgIG5ld05vdGVJbnB1dEVsLmZvY3VzKCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE5vdGljZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBjaGFuZ2VZYW1sLCBnZXRDdXJyRmlsZSwgc3BsaXRBdFlhbWwgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlQkNUb0ZpbGUocGx1Z2luOiBCQ1BsdWdpbiwgY3VyckZpbGU/OiBURmlsZSkge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIG1haW5HIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgZmlsZSA9IGN1cnJGaWxlID8/IGdldEN1cnJGaWxlKCk7XHJcblxyXG4gIGNvbnN0IHsgbGltaXRXcml0ZUJDQ2hlY2tib3hlcywgd3JpdGVCQ3NJbmxpbmUsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IHN1Y2NJbmZvID0gbWFpbkcubWFwSW5FZGdlcyhmaWxlLmJhc2VuYW1lLCAoaywgYSwgcywgdCkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWVsZCwgZGlyIH0gPSBhO1xyXG4gICAgY29uc3Qgb3BwRmllbGQgPSBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXTtcclxuICAgIHJldHVybiB7IHN1Y2M6IHMsIGZpZWxkOiBvcHBGaWVsZCB9O1xyXG4gIH0pO1xyXG5cclxuICBmb3IgKGNvbnN0IHsgc3VjYywgZmllbGQgfSBvZiBzdWNjSW5mbykge1xyXG4gICAgaWYgKCFsaW1pdFdyaXRlQkNDaGVja2JveGVzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuICAgIGNvbnN0IFt5YW1sLCBhZnRlcllhbWxdID0gc3BsaXRBdFlhbWwoY29udGVudCk7XHJcblxyXG4gICAgaWYgKCF3cml0ZUJDc0lubGluZSkge1xyXG4gICAgICBjb25zdCBpbm5lciA9IHlhbWwgPT09IFwiXCIgPyB5YW1sIDogeWFtbC5zbGljZSg0LCAtNCk7XHJcbiAgICAgIGNvbnN0IG5ld1lhbWwgPSBjaGFuZ2VZYW1sKGlubmVyLCBmaWVsZCwgc3VjYyk7XHJcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgLS0tXFxuJHtuZXdZYW1sfVxcbi0tLSR7YWZ0ZXJZYW1sfWA7XHJcbiAgICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgbmV3Q29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUT0RPIENoZWNrIGlmIHRoaXMgbm90ZSBhbHJlYWR5IGhhcyB0aGlzIGZpZWxkXHJcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPVxyXG4gICAgICAgIHlhbWwgK1xyXG4gICAgICAgICh5YW1sLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgYCR7ZmllbGR9OjogW1ske3N1Y2N9XV1gICtcclxuICAgICAgICAoYWZ0ZXJZYW1sLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgYWZ0ZXJZYW1sO1xyXG5cclxuICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUJDc1RvQWxsRmlsZXMocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGlmICghcGx1Z2luLnNldHRpbmdzLnNob3dXcml0ZUFsbEJDc0NtZCkge1xyXG4gICAgbmV3IE5vdGljZShcclxuICAgICAgXCJZb3UgZmlyc3QgbmVlZCB0byBlbmFibGUgdGhpcyBjb21tYW5kIGluIEJyZWFkY3J1bWJzJyBzZXR0aW5ncy5cIlxyXG4gICAgKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgaWYgKFxyXG4gICAgd2luZG93LmNvbmZpcm0oXHJcbiAgICAgIFwiVGhpcyBhY3Rpb24gd2lsbCB3cml0ZSB0aGUgaW1wbGllZCBCcmVhZGNydW1icyBvZiBlYWNoIGZpbGUgdG8gdGhhdCBmaWxlLlxcbkl0IHVzZXMgdGhlIE1ldGFFZGl0IHBsdWdpbnMgQVBJIHRvIHVwZGF0ZSB0aGUgWUFNTCwgc28gaXQgc2hvdWxkIG9ubHkgYWZmZWN0IHRoYXQgZnJvbnRtYXR0ZXIgb2YgeW91ciBub3RlLlxcbkkgY2FuJ3QgcHJvbWlzZSB0aGF0IG5vdGhpbmcgYmFkIHdpbGwgaGFwcGVuLiAqKlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUqKi5cIlxyXG4gICAgKVxyXG4gICkge1xyXG4gICAgaWYgKFxyXG4gICAgICB3aW5kb3cuY29uZmlybShcclxuICAgICAgICBcIkFyZSB5b3Ugc3VyZT8gWW91IGhhdmUgYmVlbiB3YXJuZWQgdGhhdCB0aGlzIG9wZXJhdGlvbiB3aWxsIGF0dGVtcHQgdG8gdXBkYXRlIGFsbCBmaWxlcyB3aXRoIGltcGxpZWQgYnJlYWRjcnVtYnMuXCJcclxuICAgICAgKVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh3aW5kb3cuY29uZmlybShcIkZvciByZWFsLCBwbGVhc2UgbWFrZSBhIGJhY2sgdXAgYmVmb3JlLlwiKSkge1xyXG4gICAgICAgIGNvbnN0IG5vdGljZSA9IG5ldyBOb3RpY2UoXCJPcGVyYXRpb24gU3RhcnRlZFwiKTtcclxuICAgICAgICBjb25zdCBwcm9ibGVtRmlsZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKSkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgd3JpdGVCQ1RvRmlsZShwbHVnaW4sIGZpbGUpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBwcm9ibGVtRmlsZXMucHVzaChmaWxlLnBhdGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBub3RpY2Uuc2V0TWVzc2FnZShcIk9wZXJhdGlvbiBDb21wbGV0ZVwiKTtcclxuICAgICAgICBpZiAocHJvYmxlbUZpbGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgICAgXCJTb21lIGZpbGVzIHdlcmUgbm90IHVwZGF0ZWQgZHVlIHRvIGVycm9ycy4gQ2hlY2sgdGhlIGNvbnNvbGUgdG8gc2VlIHdoaWNoIG9uZXMuXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB3YXJuKHsgcHJvYmxlbUZpbGVzIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHtcclxuICBFZGl0b3IsXHJcbiAgRWRpdG9yUG9zaXRpb24sXHJcbiAgRWRpdG9yU3VnZ2VzdCxcclxuICBFZGl0b3JTdWdnZXN0Q29udGV4dCxcclxuICBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8sXHJcbiAgVEZpbGUsXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGlzSW5zaWRlWWFtbCB9IGZyb20gXCIuL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuaW1wb3J0IHsgQkNfRklFTERTX0lORk8gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpZWxkU3VnZ2VzdG9yIGV4dGVuZHMgRWRpdG9yU3VnZ2VzdDxzdHJpbmc+IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBvblRyaWdnZXIoXHJcbiAgICBjdXJzb3I6IEVkaXRvclBvc2l0aW9uLFxyXG4gICAgZWRpdG9yOiBFZGl0b3IsXHJcbiAgICBfOiBURmlsZVxyXG4gICk6IEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyB8IG51bGwge1xyXG4gICAgY29uc3Qgc3ViID0gZWRpdG9yLmdldExpbmUoY3Vyc29yLmxpbmUpLnN1YnN0cmluZygwLCBjdXJzb3IuY2gpO1xyXG4gICAgY29uc3QgbWF0Y2ggPSBzdWIubWF0Y2goL15CQy0oLiopJC8pPy5bMV07XHJcbiAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGVuZDogY3Vyc29yLFxyXG4gICAgICAgIHN0YXJ0OiB7XHJcbiAgICAgICAgICBjaDogc3ViLmxhc3RJbmRleE9mKG1hdGNoKSxcclxuICAgICAgICAgIGxpbmU6IGN1cnNvci5saW5lLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcXVlcnk6IG1hdGNoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VnZ2VzdGlvbnMgPSAoY29udGV4dDogRWRpdG9yU3VnZ2VzdENvbnRleHQpID0+IHtcclxuICAgIGNvbnN0IHsgcXVlcnkgfSA9IGNvbnRleHQ7XHJcbiAgICByZXR1cm4gQkNfRklFTERTX0lORk8ubWFwKChzdWcpID0+IHN1Zy5maWVsZCkuZmlsdGVyKChzdWcpID0+XHJcbiAgICAgIHN1Zy5pbmNsdWRlcyhxdWVyeSlcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgcmVuZGVyU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBzdHJpbmcsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgZWwuY3JlYXRlRGl2KHtcclxuICAgICAgdGV4dDogc3VnZ2VzdGlvbi5yZXBsYWNlKFwiQkMtXCIsIFwiXCIpLFxyXG4gICAgICBjbHM6IFwiQkMtc3VnZ2VzdGVyLWNvbnRhaW5lclwiLFxyXG4gICAgICBhdHRyOiB7XHJcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IEJDX0ZJRUxEU19JTkZPLmZpbmQoKGYpID0+IGYuZmllbGQgPT09IHN1Z2dlc3Rpb24pPy5kZXNjLFxyXG4gICAgICAgIFwiYXJpYS1sYWJlbC1wb3NpdGlvblwiOiBcInJpZ2h0XCIsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGNvbnRleHQsIHBsdWdpbiB9ID0gdGhpcztcclxuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGZpZWxkID0gQkNfRklFTERTX0lORk8uZmluZCgoZikgPT4gZi5maWVsZCA9PT0gc3VnZ2VzdGlvbik7XHJcbiAgICBjb25zdCByZXBsYWNlbWVudCA9IGAke3N1Z2dlc3Rpb259JHtmaWVsZD8uW2lzSW5zaWRlWWFtbChhcHApID8gXCJhZnRlcllhbWxcIiA6IFwiYWZ0ZXJJbmxpbmVcIl1cclxuICAgICAgfWA7XHJcblxyXG4gICAgY29udGV4dC5lZGl0b3IucmVwbGFjZVJhbmdlKFxyXG4gICAgICByZXBsYWNlbWVudCxcclxuICAgICAgeyBjaDogMCwgbGluZTogY29udGV4dC5zdGFydC5saW5lIH0sXHJcbiAgICAgIGNvbnRleHQuZW5kXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHtcclxuICBFZGl0b3IsXHJcbiAgRWRpdG9yUG9zaXRpb24sXHJcbiAgRWRpdG9yU3VnZ2VzdCxcclxuICBFZGl0b3JTdWdnZXN0Q29udGV4dCxcclxuICBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8sXHJcbiAgVEZpbGUsXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGlzSW5zaWRlWWFtbCB9IGZyb20gXCIuL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5pbXBvcnQgeyBlc2NhcGVSZWdleCB9IGZyb20gXCIuL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSZWxhdGlvblN1Z2dlc3RvciBleHRlbmRzIEVkaXRvclN1Z2dlc3Q8c3RyaW5nPiB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuXHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgb25UcmlnZ2VyKFxyXG4gICAgY3Vyc29yOiBFZGl0b3JQb3NpdGlvbixcclxuICAgIGVkaXRvcjogRWRpdG9yLFxyXG4gICAgXzogVEZpbGVcclxuICApOiBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8gfCBudWxsIHtcclxuICAgIGNvbnN0IHRyaWcgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZWxTdWdnZXN0b3JUcmlnZ2VyO1xyXG4gICAgY29uc3Qgc3ViID0gZWRpdG9yLmdldExpbmUoY3Vyc29yLmxpbmUpLnN1YnN0cmluZygwLCBjdXJzb3IuY2gpO1xyXG5cclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgLio/JHtlc2NhcGVSZWdleCh0cmlnKX0oLiopJGApO1xyXG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHN1Yik/LlsxXTtcclxuXHJcbiAgICBpZiAobWF0Y2ggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdGFydDoge1xyXG4gICAgICAgIGNoOiBzdWIubGFzdEluZGV4T2YodHJpZyksXHJcbiAgICAgICAgbGluZTogY3Vyc29yLmxpbmUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGVuZDogY3Vyc29yLFxyXG4gICAgICBxdWVyeTogbWF0Y2gsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VnZ2VzdGlvbnMgPSAoY29udGV4dDogRWRpdG9yU3VnZ2VzdENvbnRleHQpID0+IHtcclxuICAgIGNvbnN0IHsgcXVlcnkgfSA9IGNvbnRleHQ7XHJcbiAgICBjb25zdCB7IHVzZXJIaWVycyB9ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcbiAgICByZXR1cm4gZ2V0RmllbGRzKHVzZXJIaWVycykuZmlsdGVyKChzdWcpID0+IHN1Zy5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gIH07XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGVsLmNyZWF0ZURpdih7XHJcbiAgICAgIHRleHQ6IHN1Z2dlc3Rpb24sXHJcbiAgICAgIGNsczogXCJjb2RlYmxvY2stc3VnZ2VzdGlvblwiLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBjb250ZXh0LCBwbHVnaW4gfSA9IHRoaXM7XHJcbiAgICBpZiAoIWNvbnRleHQpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHRyaWcgPSBwbHVnaW4uc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlcjtcclxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCwgZWRpdG9yIH0gPSBjb250ZXh0O1xyXG5cclxuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gc3VnZ2VzdGlvbiArIChpc0luc2lkZVlhbWwoYXBwKSA/IFwiOiBcIiA6IFwiOjogXCIpICsgJ1tbJztcclxuICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcbiAgICAgIHJlcGxhY2VtZW50LFxyXG4gICAgICB7IGNoOiBzdGFydC5jaCArIDEgLSB0cmlnLmxlbmd0aCwgbGluZTogc3RhcnQubGluZSB9LFxyXG4gICAgICBlbmRcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRyYXdUcmFpbCB9IGZyb20gXCJzcmMvVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCBLb0ZpIGZyb20gXCIuLi9Db21wb25lbnRzL0tvRmkuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGFkZENyZWF0ZUluZGV4U2V0dGluZ3MgfSBmcm9tIFwiLi9DcmVhdGVJbmRleFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZENTVlNldHRpbmdzIH0gZnJvbSBcIi4vQ1NWU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkRGF0YXZpZXdTZXR0aW5ncyB9IGZyb20gXCIuL0RhdGF2aWV3Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERhdGVOb3RlU2V0dGluZ3MgfSBmcm9tIFwiLi9EYXRlTm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERlYnVnZ2luZ3NTZXR0aW5ncyB9IGZyb20gXCIuL0RlYnVnZ2luZ1NldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERlbmRyb25TZXR0aW5ncyB9IGZyb20gXCIuL0RlbmRyb25TZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRHZW5lcmFsU2V0dGluZ3MgfSBmcm9tIFwiLi9HZW5lcmFsU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkSGllcmFyY2h5Tm90ZVNldHRpbmdzIH0gZnJvbSBcIi4vSGllcmFyY2h5Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZEhpZXJhcmNoeVNldHRpbmdzIH0gZnJvbSBcIi4vSGllcmFyY2h5U2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkSnVtcFRvTmV4dFNldHRpbmdzIH0gZnJvbSBcIi4vSnVtcFRvTmV4dFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZE1hdHJpeFZpZXdTZXR0aW5ncyB9IGZyb20gXCIuL01hdHJpeFZpZXdTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGROb1N5c3RlbVNldHRpbmdzIH0gZnJvbSBcIi4vTm9TeXN0ZW1TZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRSZWdleE5vdGVTZXR0aW5ncyB9IGZyb20gXCIuL1JlZ2V4Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFJlbGF0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9SZWxhdGlvblNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFRhZ05vdGVTZXR0aW5ncyB9IGZyb20gXCIuL1RhZ05vdGVTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRUaHJlYWRpbmdTZXR0aW5ncyB9IGZyb20gXCIuL1RocmVhZGluZ1NldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFRyYWlsVmlld1NldHRpbmdzIH0gZnJvbSBcIi4vVHJhaWxTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRWaXNNb2RhbFNldHRpbmdzIH0gZnJvbSBcIi4vVmlzTW9kYWxTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRXcml0ZUJDc1NldHRpbmdzIH0gZnJvbSBcIi4vV3JpdGVCQ3NTZXR0aW5nc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdXaXRoSFRNTCA9IChodG1sOiBzdHJpbmcpID0+XHJcbiAgY3JlYXRlRnJhZ21lbnQoKGZyYWcpID0+IChmcmFnLmNyZWF0ZURpdigpLmlubmVySFRNTCA9IGh0bWwpKTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZXRhaWxzID0gKHRleHQ6IHN0cmluZywgcGFyZW50OiBIVE1MRWxlbWVudCkgPT5cclxuICBwYXJlbnQuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHt9LCAoZCkgPT4gZC5jcmVhdGVFbChcInN1bW1hcnlcIiwgeyB0ZXh0IH0pKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdWJEZXRhaWxzID0gKHRleHQ6IHN0cmluZywgcGFyZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQpID0+XHJcbiAgcGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICBhdHRyOiB7IHN0eWxlOiBcInBhZGRpbmctbGVmdDogMTBweDtcIiB9LFxyXG4gIH0pXHJcbiAgICAuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHt9LCAoZCkgPT4gZC5jcmVhdGVFbChcInN1bW1hcnlcIiwgeyB0ZXh0IH0pKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBCQ1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHAsIHBsdWdpbik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB7IHBsdWdpbiwgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcbiAgICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW5cclxuXHJcbiAgICBjb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiQnJlYWRjcnVtYnMgU2V0dGluZ3NcIiB9KTtcclxuICAgIGNvbnRhaW5lckVsLmFkZENsYXNzKFwiQkMtc2V0dGluZ3MtdGFiXCIpO1xyXG5cclxuICAgIGFkZEhpZXJhcmNoeVNldHRpbmdzKHBsdWdpbiwgY29udGFpbmVyRWwpO1xyXG4gICAgYWRkUmVsYXRpb25TZXR0aW5ncyhwbHVnaW4sIGNvbnRhaW5lckVsKTtcclxuICAgIGFkZEdlbmVyYWxTZXR0aW5ncyhwbHVnaW4sIGNvbnRhaW5lckVsKTtcclxuXHJcbiAgICBjb25zdCB2aWV3RGV0YWlscyA9IGRldGFpbHMoXCJWaWV3c1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcodmlld0RldGFpbHMpXHJcbiAgICAgIC5zZXROYW1lKFwiT3BlbiBWaWV3cyBieSBEZWZhdWx0XCIpXHJcbiAgICAgIC5zZXREZXNjKGZyYWdXaXRoSFRNTChcIkNob29zZSB3aGljaCBvZiB0aGUgdmlld3MgdG8gb3BlbiBvbmxvYWQ8YnIvPk9yZGVyIGlzOiBUcmFpbC9HcmlkL0p1Z2dsLCBNYXRyaXgsIER1Y2tzLCBUcmVlXCIpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlXHJcbiAgICAgICAgICAuc2V0VG9vbHRpcChcIlRyYWlsL0dyaWQvSnVnZ2xcIilcclxuICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QkNzKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5zaG93QkNzID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJNYXRyaXggVmlld1wiKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLm9wZW5NYXRyaXhPbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5NYXRyaXhPbkxvYWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJEdWNrcyBWaWV3XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Mub3BlbkR1Y2tPbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5EdWNrT25Mb2FkID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcclxuICAgICAgICB0b2dnbGVcclxuICAgICAgICAgIC5zZXRUb29sdGlwKFwiVHJlZSBWaWV3XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Mub3BlbkRvd25PbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5Eb3duT25Mb2FkID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB2aWV3RGV0YWlscy5jcmVhdGVFbCgnaHInKVxyXG5cclxuICAgIGFkZE1hdHJpeFZpZXdTZXR0aW5ncyhwbHVnaW4sIHZpZXdEZXRhaWxzKTtcclxuICAgIGFkZFRyYWlsVmlld1NldHRpbmdzKHBsdWdpbiwgdmlld0RldGFpbHMpO1xyXG4gICAgYWRkVmlzTW9kYWxTZXR0aW5ncyhwbHVnaW4sIHZpZXdEZXRhaWxzKTtcclxuICAgIC8vIGFkZFRyZWVWaWV3U2V0dGluZ3MocGx1Z2luLCB2aWV3RGV0YWlscyk7XHJcblxyXG4gICAgY29uc3QgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzID0gZGV0YWlscyhcclxuICAgICAgXCJBbHRlcm5hdGl2ZSBIaWVyYXJjaGllc1wiLFxyXG4gICAgICBjb250YWluZXJFbFxyXG4gICAgKTtcclxuXHJcbiAgICBhZGRUYWdOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkUmVnZXhOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkTm9TeXN0ZW1TZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcbiAgICBhZGRIaWVyYXJjaHlOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkQ1NWU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkRGVuZHJvblNldHRpbmdzKHBsdWdpbiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuICAgIGFkZERhdGF2aWV3U2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkRGF0ZU5vdGVTZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcblxyXG4gICAgY29uc3QgY21kc0RldGFpbHMgPSBkZXRhaWxzKFwiQ29tbWFuZHNcIiwgY29udGFpbmVyRWwpO1xyXG4gICAgYWRkV3JpdGVCQ3NTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuICAgIGFkZENyZWF0ZUluZGV4U2V0dGluZ3MocGx1Z2luLCBjbWRzRGV0YWlscyk7XHJcbiAgICBhZGRUaHJlYWRpbmdTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuICAgIGFkZEp1bXBUb05leHRTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgICBhZGREZWJ1Z2dpbmdzU2V0dGluZ3MocGx1Z2luLCBjb250YWluZXJFbCk7XHJcblxyXG4gICAgbmV3IEtvRmkoeyB0YXJnZXQ6IGNvbnRhaW5lckVsIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiPCEtLSBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9IRW1pbGUvanVnZ2wvYmxvYi9tYWluL2p1Z2dsL3VpL0tvRmkuc3ZlbHRlIC0tPlxyXG48c2NyaXB0PlxyXG4gIGxldCBidXR0b247XHJcbiAgY29uc3QgaW5pdGlhbGl6ZUtvZmkgPSAoKSA9PiB7XHJcbiAgICBrb2Zpd2lkZ2V0Mi5pbml0KFxyXG4gICAgICBcIlN1cHBvcnQgQnJlYWRjcnVtYnMgZGV2ZWxvcG1lbnQhXCIsXHJcbiAgICAgIFwiIzI5YWJlMFwiLFxyXG4gICAgICBcIkcyRzQ1NFRaRlwiXHJcbiAgICApO1xyXG4gICAgYnV0dG9uLmlubmVySFRNTCA9IGtvZml3aWRnZXQyLmdldEhUTUwoKTtcclxuICB9O1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdmVsdGU6aGVhZD5cclxuICA8c2NyaXB0XHJcbiAgICB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCJcclxuICAgIHNyYz1cImh0dHBzOi8va28tZmkuY29tL3dpZGdldHMvd2lkZ2V0XzIuanNcIlxyXG4gICAgb246bG9hZD17aW5pdGlhbGl6ZUtvZml9PlxyXG4gIDwvc2NyaXB0PlxyXG48L3N2ZWx0ZTpoZWFkPlxyXG48ZGl2IGNsYXNzPVwiQkMtS29maS1idXR0b25cIiBiaW5kOnRoaXM9e2J1dHRvbn0gLz5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtS29maS1idXR0b24ge1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsICJpbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENyZWF0ZUluZGV4U2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBjbWRzRGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBjcmVhdGVJbmRleERldGFpbHMgPSBzdWJEZXRhaWxzKFwiQ3JlYXRlIEluZGV4XCIsIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoY3JlYXRlSW5kZXhEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBZGQgd2lrbGluayBicmFja2V0c1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIldoZW4gY3JlYXRpbmcgYW4gaW5kZXgsIHNob3VsZCBpdCB3cmFwIHRoZSBub3RlIG5hbWUgaW4gd2lraWxpbmtzIDxjb2RlPltbXV08L2NvZGU+IG9yIG5vdC5cXG5cdTI3MDUgPSB5ZXMsIFx1Mjc0QyA9IG5vLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLndpa2lsaW5rSW5kZXgpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3Mud2lraWxpbmtJbmRleCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhjcmVhdGVJbmRleERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkluZGVudCBDaGFyYWN0ZXJcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgJ1RoZSBjaGFyYWN0ZXIocykgdXNlZCB0byBpbmRlbnQgdGhlIGluZGV4LiBUaGVzZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCB3aWxsIHVzdWFsbHkgYmUgZWl0aGVyIHNwYWNlcyBvciB0YWJzLiBFbnRlciA8Y29kZT5cXFxcdDwvY29kZT4gdG8gdXNlIHRhYnMuJ1xyXG4gICAgICApKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5jcmVhdGVJbmRleEluZGVudClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5jcmVhdGVJbmRleEluZGVudCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9KVxyXG5cclxuICBuZXcgU2V0dGluZyhjcmVhdGVJbmRleERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgYWxpYXNlcyBvZiBub3RlcyBpbiBpbmRleFwiKVxyXG4gICAgLnNldERlc2MoXCJTaG93IHRoZSBhbGlhc2VzIG9mIGVhY2ggbm90ZSBpbiBicmFja2V0cy5cXG5cdTI3MDUgPSB5ZXMsIFx1Mjc0QyA9IG5vLlwiKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuYWxpYXNlc0luSW5kZXgpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuYWxpYXNlc0luSW5kZXggPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxufVxyXG4iLCAiaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQ1NWU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgY3N2RGV0YWlscyA9IHN1YkRldGFpbHMoXCJDU1YgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoY3N2RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiQ1NWIEJyZWFkY3J1bWIgUGF0aHNcIilcclxuICAgIC5zZXREZXNjKFwiVGhlIGZpbGUgcGF0aCBvZiBhIGNzdiBmaWxlcyB3aXRoIGJyZWFkY3J1bWJzIGluZm9ybWF0aW9uLlwiKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5DU1ZQYXRocyk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuQ1NWUGF0aHMgPSB0ZXh0LmlucHV0RWwudmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRhdmlld1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBjb25zdCBkdkRldGFpbHMgPSBzdWJEZXRhaWxzKFwiRGF0YXZpZXcgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZHZEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IERhdGF2aWV3IE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJCeSBkZWZhdWx0LCBEYXRhdmlldyBub3RlcyB1c2UgdGhlIGZpcnN0IGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMgKHVzdWFsbHkgYW4gPGNvZGU+XHUyMTkxPC9jb2RlPiBmaWVsZCkuIENob29zZSBhIGRpZmZlcmVudCBvbmUgdG8gdXNlIGJ5IGRlZmF1bHQsIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgPGNvZGU+QkMtZGF0YXZpZXctbm90ZS1maWVsZDoge2ZpZWxkfTwvY29kZT4uPC9icj5JZiB5b3UgZG9uJ3Qgd2FudCB0byBjaG9vc2UgYSBkZWZhdWx0LCBzZWxlY3QgdGhlIGJsYW5rIG9wdGlvbiBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gZGQuYWRkT3B0aW9uKGZpZWxkLCBmaWVsZCkpO1xyXG4gICAgICBkZC5hZGRPcHRpb24oXCJcIiwgXCJcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZGF0YXZpZXdOb3RlRmllbGQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuZGF0YXZpZXdOb3RlRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRlTm90ZVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBjb25zdCBmaWVsZE9wdGlvbnMgPSB7IFwiXCI6IFwiXCIgfTtcclxuICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IChmaWVsZE9wdGlvbnNbZmllbGRdID0gZmllbGQpKTtcclxuXHJcbiAgY29uc3QgZGF0ZU5vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcIkRhdGUgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGF0ZU5vdGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBZGQgRGF0ZSBOb3RlcyB0byBHcmFwaFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiQnJlYWRjcnVtYnMgd2lsbCB0cnkgdG8gbGluayBlYWNoIGRhaWx5IG5vdGUgdG8gdGhlIG5leHQgb25lIHVzaW5nIHRoZSBkYXRlIGZvcm1hdCB5b3UgcHJvdmlkZSBpbiB0aGUgc2V0dGluZ3MgYmVsb3cuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuYWRkRGF0ZU5vdGVzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5hZGREYXRlTm90ZXMgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRhdGVOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGFpbHkgTm90ZSBGb3JtYXRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgYFRoZSBMdXhvbiBkYXRlIGZvcm1hdCBvZiB5b3VyIGRhaWx5IG5vdGVzLjwvYnI+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBMdXhvbiB1c2VzIGRpZmZlcmVudCBmb3JtYXRzIHRvIE1vbWVudCwgc28geW91ciBmb3JtYXQgZm9yIHRoZSBEYWlseSBOb3RlcyBwbHVnaW4gbWF5IG5vdCB3b3JrIGhlcmUuIEJlIHN1cmUgdG8gY2hlY2sgb3V0IDxhIGhyZWY9XCJodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vIy9mb3JtYXR0aW5nP2lkPXRhYmxlLW9mLXRva2Vuc1wiPnRoZSBkb2NzPC9hPiB0byBmaW5kIHRoZSByaWdodCBmb3JtYXQuPGJyPllvdSBjYW4gZXNjYXBlIGNoYXJhY3RlcnMgYnkgd3JhcHBpbmcgdGhlbSBpbiBzaW5nbGUgcXVvdGVzIChlLmcuIDxjb2RlPnl5eXktTU0tZGQgJ0RhaWx5IE5vdGUnPC9jb2RlPilgXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcbiAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MuZGF0ZU5vdGVGb3JtYXQpO1xyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmRhdGVOb3RlRm9ybWF0ID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhkYXRlTm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRhdGUgTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlNlbGVjdCBhIGZpZWxkIHRvIHBvaW50IHRvIHRvbW9ycm93J3Mgbm90ZSBmcm9tIHRoZSBjdXJyZW50IG5vdGUuIFRoZSBvcHBvc2l0ZSBmaWVsZCB3aWxsIGJlIHVzZWQgdG8gcG9pbnQgdG8geWVzdGVyZGF5J3Mgbm90ZS5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBkZC5hZGRPcHRpb25zKGZpZWxkT3B0aW9ucylcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZGF0ZU5vdGVGaWVsZClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5kYXRlTm90ZUZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAvLyBuZXcgU2V0dGluZyhkYXRlTm90ZURldGFpbHMpXHJcbiAgLy8gICAuc2V0TmFtZShcIlBvaW50IHVwIHRvIE1vbnRoXCIpXHJcbiAgLy8gICAuc2V0RGVzYyhcclxuICAvLyAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gIC8vICAgICAgIFwiU2VsZWN0IGEgZmllbGQgdG8gcG9pbnQgdXB3YXJkcyB0byB0aGUgY29ycmVzcG9uZGluZyBtb250aCAoVGhpcyB3aWxsIHN0aWxsIHdvcmsgaWYgYSBub3RlIGRvZXNuJ3QgZXhpc3QgZm9yIHRoYXQgbW9udGgpLjxicj5MZWF2ZSB0aGUgZHJvcGRvd24gYmxhbmsgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuXCJcclxuICAvLyAgICAgKVxyXG4gIC8vICAgKVxyXG4gIC8vICAgLmFkZERyb3Bkb3duKChkZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAvLyAgICAgZGQuYWRkT3B0aW9ucyhmaWVsZE9wdGlvbnMpO1xyXG4gIC8vICAgICBkZC5vbkNoYW5nZShhc3luYyAoZmllbGQpID0+IHtcclxuICAvLyAgICAgICBzZXR0aW5ncy5kYXRlTm90ZUFkZE1vbnRoID0gZmllbGQ7XHJcbiAgLy8gICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gIC8vICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH0pO1xyXG4gIC8vIG5ldyBTZXR0aW5nKGRhdGVOb3RlRGV0YWlscylcclxuICAvLyAgIC5zZXROYW1lKFwiUG9pbnQgdXAgdG8gWWVhclwiKVxyXG4gIC8vICAgLnNldERlc2MoXHJcbiAgLy8gICAgIGZyYWdXaXRoSFRNTChcclxuICAvLyAgICAgICBcIlNlbGVjdCBhIGZpZWxkIHRvIHBvaW50IHVwd2FyZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgeWVhciAoVGhpcyB3aWxsIHN0aWxsIHdvcmsgaWYgYSBub3RlIGRvZXNuJ3QgZXhpc3QgZm9yIHRoYXQgeWVhcikuPGJyPkxlYXZlIHRoZSBkcm9wZG93biBibGFuayB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cIlxyXG4gIC8vICAgICApXHJcbiAgLy8gICApXHJcbiAgLy8gICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gIC8vICAgICBkZC5hZGRPcHRpb25zKGZpZWxkT3B0aW9ucyk7XHJcbiAgLy8gICAgIGRkLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gIC8vICAgICAgIHNldHRpbmdzLmRhdGVOb3RlQWRkWWVhciA9IGZpZWxkO1xyXG4gIC8vICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAvLyAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IGxvZyBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IERlYnVnTGV2ZWwgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBkZXRhaWxzLCBmcmFnV2l0aEhUTUwgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZWJ1Z2dpbmdzU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBjb250YWluZXJFbDogSFRNTEVsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGRlYnVnRGV0YWlscyA9IGRldGFpbHMoXCJEZWJ1Z2dpbmdcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBuZXcgU2V0dGluZyhkZWJ1Z0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlYnVnIE1vZGVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTZXQgdGhlIG1pbmltdW0gbGV2ZWwgb2YgZGVidWcgbWVzc2FnZXMgdG8gY29uc29sZSBsb2cuIElmIHlvdSBjaG9vc2UgPGNvZGU+VFJBQ0U8L2NvZGU+LCB0aGVuIGV2ZXJ5dGhpbmcgd2lsbCBiZSBsb2dnZWQuIElmIHlvdSBjaG9vc2UgPGNvZGU+RVJST1I8L2NvZGU+LCB0aGVuIG9ubHkgdGhlIG1vc3QgbmVjZXNzYXJ5IGlzc3VlcyB3aWxsIGJlIGxvZ2dlZC4gPGNvZGU+U0lMRU5UPC9jb2RlPiB3aWxsIHR1cm4gb2ZmIGFsbCBsb2dzLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQpID0+IHtcclxuICAgICAgT2JqZWN0LmtleXMobG9nLmxldmVscykuZm9yRWFjaCgoa2V5KSA9PiBkZC5hZGRPcHRpb24oa2V5LCBrZXkpKTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MuZGVidWdNb2RlKS5vbkNoYW5nZShhc3luYyAodmFsdWU6IERlYnVnTGV2ZWwpID0+IHtcclxuICAgICAgICBsb2cuc2V0TGV2ZWwodmFsdWUpO1xyXG4gICAgICAgIHNldHRpbmdzLmRlYnVnTW9kZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgZGVidWdEZXRhaWxzLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHsgdGV4dDogXCJDb25zb2xlIGxvZyBzZXR0aW5nc1wiIH0sIChlbCkgPT4ge1xyXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGNvbnNvbGUubG9nKHNldHRpbmdzKSk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBOb3RpY2UsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX1NFVFRJTkdTLCBNQVRSSVhfVklFVyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZW5kcm9uU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG4gIGNvbnN0IGRlbmRyb25EZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiRGVuZHJvbiBOb3Rlc1wiLFxyXG4gICAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzXHJcbiAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGVuZHJvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkFkZCBEZW5kcm9uIG5vdGVzIHRvIGdyYXBoXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiRGVuZHJvbiBub3RlcyBjcmVhdGUgYSBoaWVyYXJjaHkgdXNpbmcgbm90ZSBuYW1lcy48L2JyPjxjb2RlPm5tYXRoLmFsZ2VicmE8L2NvZGU+IGlzIGEgbm90ZSBhYm91dCBhbGdlYnJhLCB3aG9zZSBwYXJlbnQgaXMgPGNvZGU+bWF0aDwvY29kZT4uPC9icj48Y29kZT5ubWF0aC5jYWxjdWx1cy5saW1pdHM8L2NvZGU+IGlzIGEgbm90ZSBhYm91dCBsaW1pdHMgd2hvc2UgcGFyZW50IGlzIHRoZSBub3RlIDxjb2RlPm1hdGguY2FsY3VsdXM8L2NvZGU+LCB0aGUgcGFyZW50IG9mIHdoaWNoIGlzIDxjb2RlPm1hdGg8L2NvZGU+LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmFkZERlbmRyb25Ob3Rlcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWRkRGVuZHJvbk5vdGVzID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICBuZXcgU2V0dGluZyhkZW5kcm9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVsaW1pdGVyXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiV2hpY2ggZGVsaW1pdGVyIHNob3VsZCBCcmVhZGNydW1icyBsb29rIGZvcj8gVGhlIGRlZmF1bHQgaXMgPGNvZGU+LjwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRlbGltaXRlclwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5kZW5kcm9uTm90ZURlbGltaXRlcik7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmICh2YWx1ZSkgc2V0dGluZ3MuZGVuZHJvbk5vdGVEZWxpbWl0ZXIgPSB2YWx1ZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoYFRoZSBkZWxpbWl0ZXIgY2FuJ3QgYmUgYmxhbmtgKTtcclxuICAgICAgICAgIHNldHRpbmdzLmRlbmRyb25Ob3RlRGVsaW1pdGVyID0gREVGQVVMVF9TRVRUSU5HUy5kZW5kcm9uTm90ZURlbGltaXRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRlbmRyb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJUcmltIERlbmRyb24gTm90ZSBOYW1lc1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIldoZW4gZGlzcGxheWluZyBhIGRlbmRyb24gbm90ZSBuYW1lLCBzaG91bGQgaXQgYmUgdHJpbW1lZCB0byBvbmx5IHNob3cgdGhlIGxhc3QgaXRlbSBpbiB0aGUgY2hhaW4/PC9icj5lLmcuIDxjb2RlPkEuQi5DPC9jb2RlPiBcdTIxOTIgPGNvZGU+QzwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MudHJpbURlbmRyb25Ob3Rlcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MudHJpbURlbmRyb25Ob3RlcyA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRlbmRyb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZW5kcm9uIE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFwiV2hpY2ggZmllbGQgc2hvdWxkIEJyZWFkY3J1bWJzIHVzZSBmb3IgRGVuZHJvbiBub3Rlcz9cIilcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gZGQuYWRkT3B0aW9uKGZpZWxkLCBmaWVsZCkpO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy5kZW5kcm9uTm90ZUZpZWxkKTtcclxuXHJcbiAgICAgIGRkLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmRlbmRyb25Ob3RlRmllbGQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHsgZGV0YWlscywgZnJhZ1dpdGhIVE1MIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkR2VuZXJhbFNldHRpbmdzKHBsdWdpbjogQkNQbHVnaW4sIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBnZW5lcmFsRGV0YWlscyA9IGRldGFpbHMoXCJHZW5lcmFsIE9wdGlvbnNcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiUmVmcmVzaCBJbmRleCBvbiBOb3RlIENoYW5nZVwiKVxyXG4gICAgLnNldERlc2MoZnJhZ1dpdGhIVE1MKFxyXG4gICAgICBcIlJlZnJlc2ggdGhlIEJyZWFkY3J1bWJzIGluZGV4IGRhdGEgZXZlcnl0aW1lIHlvdSBjaGFuZ2Ugbm90ZXMuPC9icj48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgY2FuIGJlIHZlcnkgc2xvdyBvbiBsYXJnZSB2YXVsdHMuXCIpXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5yZWZyZXNoT25Ob3RlQ2hhbmdlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5yZWZyZXNoT25Ob3RlQ2hhbmdlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlJlZnJlc2ggSW5kZXggT24gTm90ZSBTYXZlXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5yZWZyZXNoT25Ob3RlU2F2ZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MucmVmcmVzaE9uTm90ZVNhdmUgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2hvdyBSZWZyZXNoIEluZGV4IE5vdGljZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiV2hlbiBSZWZyZXNoaW5nIEluZGV4LCBzaG91bGQgaXQgc2hvdyBhIG5vdGljZSBvbmNlIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGU/XCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dSZWZyZXNoTm90aWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93UmVmcmVzaE5vdGljZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBbGlhcyBGaWVsZHNcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpZWxkcyB1c2VkIHRvIHNwZWNpZnkgYWxpYXNlcy4gVGhlc2UgZmllbGRzIHdpbGwgYmUgY2hlY2tlZCwgaW4gb3JkZXIsIHRvIGRpc3BsYXkgYW4gYWx0ZXJuYXRlIG5vdGUgdGl0bGUgaW4gZGlmZmVyZW50IHZpZXdzLjwvYnI+VGhpcyBmaWVsZCB3aWxsIHByb2JhYmx5IGJlIDxjb2RlPmFsaWFzPC9jb2RlPiBvciA8Y29kZT5hbGlhc2VzPC9jb2RlPiwgYnV0IGl0IGNhbiBiZSBhbnl0aGluZywgbGlrZSA8Y29kZT50aXRsZTwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5hbHRMaW5rRmllbGRzLmpvaW4oXCIsIFwiKSk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWx0TGlua0ZpZWxkcyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiT25seSBzaG93IGZpcnN0IGFsaWFzXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJJZiBhIG5vdGUgaGFzIGFuIGFsaWFzICh1c2luZyB0aGUgZmllbGRzIGluIHRoZSBzZXR0aW5nIGFib3ZlKSwgc2hvdWxkIG9ubHkgdGhlIGZpcnN0IG9uZSBiZSBzaG93bj9cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoIXNldHRpbmdzLnNob3dBbGxBbGlhc2VzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93QWxsQWxpYXNlcyA9ICF2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiVXNlIHlhbWwgb3IgaW5saW5lIGZpZWxkcyBmb3IgaGllcmFyY2h5IGRhdGFcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIklmIGVuYWJsZWQsIEJyZWFkY3J1bWJzIHdpbGwgbWFrZSBpdCdzIGhpZXJhcmNoeSB1c2luZyB5YW1sIGZpZWxkcywgYW5kIGlubGluZSBEYXRhdmlldyBmaWVsZHMuXFxuSWYgdGhpcyBpcyBkaXNhYmxlZCwgaXQgd2lsbCBvbmx5IHVzZSBKdWdnbCBsaW5rcyAoU2VlIGJlbG93KS5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MudXNlQWxsTWV0YWRhdGEpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnVzZUFsbE1ldGFkYXRhID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlVzZSBKdWdnbCBsaW5rIHN5bnRheCB3aXRob3V0IGhhdmluZyBKdWdnbCBpbnN0YWxsZWQuXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgICdTaG91bGQgQnJlYWRjcnVtYnMgbG9vayBmb3IgPGEgaHJlZj1cImh0dHBzOi8vanVnZ2wuaW8vTGluaytUeXBlc1wiIGFyaWEtbGFiZWw9XCJodHRwczovL2p1Z2dsLmlvL0xpbmsrVHlwZXNcIj5KdWdnbCBsaW5rczwvYT4gZXZlbiBpZiB5b3UgZG9uXFwndCBoYXZlIEp1Z2dsIGluc3RhbGxlZD8gSWYgeW91IGRvIGhhdmUgSnVnZ2wgaW5zdGFsbGVkLCBpdCB3aWxsIGFsd2F5cyBsb29rIGZvciBKdWdnbCBsaW5rcy4nXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5wYXJzZUp1Z2dsTGlua3NXaXRob3V0SnVnZ2wgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJFbmFibGUgRmllbGQgU3VnZ2VzdG9yXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgICdBbG90IG9mIEJyZWFkY3J1bWJzIGZlYXR1cmVzIHJlcXVpcmUgYSBtZXRhZGF0YSAob3IgaW5saW5lIERhdGF2aWV3KSBmaWVsZCB0byB3b3JrLiBGb3IgZXhhbXBsZSwgYEJDLWZvbGRlci1ub3RlYC48L2JyPlRoZSBGaWVsZCBTdWdnZXN0b3Igd2lsbCBzaG93IGFuIGF1dG9jb21wbGV0ZSBtZW51IHdpdGggYWxsIGF2YWlsYWJsZSBCcmVhZGNydW1icyBmaWVsZCBvcHRpb25zIHdoZW4geW91IHR5cGUgPGNvZGU+QkMtPC9jb2RlPiBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLidcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuZmllbGRTdWdnZXN0b3IpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmZpZWxkU3VnZ2VzdG9yID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRW5hYmxlIFJlbGF0aW9uIFN1Z2dlc3RvclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkVuYWJsZSBhbiBlZGl0b3Igc3VnZ2VzdG9yIHdoaWNoIGdldHMgdHJpZ2dlcmVkIGJ5IGEgY3VzdG9tIHN0cmluZyB0byBzaG93IGEgbGlzdCBvZiByZWxhdGlvbnMgZnJvbSB5b3VyIGhpZXJhcmNoaWVzIHRvIGluc2VydC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5lbmFibGVSZWxhdGlvblN1Z2dlc3RvcilcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5lbmFibGVSZWxhdGlvblN1Z2dlc3RvciA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJSZWxhdGlvbiBTdWdnZXN0b3IgVHJpZ2dlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlRoZSBzdHJpbmcgdXNlZCB0byB0cmlnZ2VyIHRoZSByZWxhdGlvbiBzdWdnZXN0b3IuIERlZmF1bHQgaXMgPGNvZGU+XFxcXDwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlcikub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlciA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIGlmIChhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3ICE9PSB1bmRlZmluZWQpIHtcclxuICAgIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgICAuc2V0TmFtZShcIkRhdGF2aWV3IFdhaXQgVGltZVwiKVxyXG4gICAgICAuc2V0RGVzYyhcclxuICAgICAgICAnRW50ZXIgYW4gaW50ZWdlciBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgRGF0YXZpZXcgSW5kZXggdG8gbG9hZC4gVGhlIGxhcmdlciB5b3VyIHZhdWx0LCB0aGUgbG9uZ2VyIGl0IHdpbGwgdGFrZS4gVGhlIGRlZmF1bHQgaXMgNSBzZWNvbmRzLidcclxuICAgICAgKVxyXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJTZWNvbmRzXCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoKHNldHRpbmdzLmR2V2FpdFRpbWUgLyAxMDAwKS50b1N0cmluZygpKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG51bSA+IDApIHtcclxuICAgICAgICAgICAgICBzZXR0aW5ncy5kdldhaXRUaW1lID0gbnVtICogMTAwMDtcclxuICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbmV3IE5vdGljZShcIlRoZSBpbnRlcnZhbCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlclwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhpZXJhcmNoeU5vdGVTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBoaWVyYXJjaHlOb3RlRGV0YWlscyA9IHN1YkRldGFpbHMoXHJcbiAgICBcIkhpZXJhcmNoeSBOb3Rlc1wiLFxyXG4gICAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzXHJcbiAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkhpZXJhcmNoeSBOb3RlKHMpXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBub3RlcyB1c2VkIHRvIGNyZWF0ZSBleHRlcm5hbCBCcmVhZGNydW1iIHN0cnVjdHVyZXMuPGJyPllvdSBjYW4gYWxzbyBwb2ludCB0byBhIDxlbT5mb2xkZXI8L2VtPiBvZiBoaWVyYXJjaHkgbm90ZXMgYnkgZW50ZXJpbmcgPGNvZGU+Zm9sZGVyTmFtZS88L2NvZGU+IChlbmRpbmcgd2l0aCBhIDxjb2RlPi88L2NvZGU+KS48YnI+SGllcmFyY2h5IG5vdGUgbmFtZXMgYW5kIGZvbGRlcnMgb2YgaGllcmFyY2h5IG5vdGVzIGNhbiBib3RoIGJlIGVudGVyZWQgaW4gdGhlIHNhbWUgY29tbWEtc2VwYXJhdGVkIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkhpZXJhcmNoeSBOb3RlKHMpXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmhpZXJhcmNoeU5vdGVzLmpvaW4oXCIsIFwiKSk7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG5cclxuICAgICAgICBzZXR0aW5ncy5oaWVyYXJjaHlOb3RlcyA9IHNwbGl0cztcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZSgnSGllcmFyY2h5IG5vdGUgaXMgcGFyZW50IG9mIHRvcC1sZXZlbCBpdGVtcycpXHJcbiAgICAuc2V0RGVzYygnU2hvdWxkIHRoZSBhY3R1YWwgaGllcmFyY2h5IG5vdGUgYmUgdHJlYXRlZCBhcyB0aGUgcGFyZW50IG9mIGFsbCB0aGUgdG9wLWxldmVsIGl0ZW1zIGluIHRoZSBsaXN0PyBcdTI3MDUgPSBZZXMsIFx1Mjc0QyA9IE5vJylcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuaGllcmFyY2h5Tm90ZUlzUGFyZW50KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmhpZXJhcmNoeU5vdGVJc1BhcmVudCA9IHZhbHVlXHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgSGllcmFyY2h5IE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJCeSBkZWZhdWx0LCBoaWVyYXJjaHkgbm90ZXMgdXNlIHRoZSBmaXJzdCA8Y29kZT51cDwvY29kZT4gZmllbGQgaW4geW91ciBoaWVyYXJjaGllcy4gQ2hvb3NlIGEgZGlmZmVyZW50IG9uZSB0byB1c2UgYnkgZGVmYXVsdC4gSWYgeW91IGRvbid0IHdhbnQgdG8gY2hvb3NlIGEgZGVmYXVsdCwgc2VsZWN0IHRoZSBibGFuayBvcHRpb24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBjb25zdCB1cEZpZWxkcyA9IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMsIFwidXBcIik7XHJcblxyXG4gICAgICBjb25zdCBvcHRpb25zID0ge307XHJcbiAgICAgIHVwRmllbGRzLmZvckVhY2goXHJcbiAgICAgICAgKGZpZWxkKSA9PiAob3B0aW9uc1tmaWVsZF0gPSBmaWVsZClcclxuICAgICAgKTtcclxuICAgICAgZGQuYWRkT3B0aW9ucyhvcHRpb25zKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5ITlVwRmllbGQgfHwgdXBGaWVsZHNbMF0pXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuSE5VcEZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG4gIGltcG9ydCBGYUxpc3RVbCBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhTGlzdFVsLnN2ZWx0ZVwiO1xyXG4gIGltcG9ydCBGYVBsdXMgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVBsdXMuc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IEZhUmVnVHJhc2hBbHQgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVJlZ1RyYXNoQWx0LnN2ZWx0ZVwiO1xyXG4gIGltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMsIGJsYW5rVXNlckhpZXIsIERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBVc2VySGllciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbiAgaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuICBpbXBvcnQgeyBzcGxpdEFuZFRyaW0sIHN3YXBJdGVtcyB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBoaWVyVG9TdHIgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcblxyXG4gIGxldCBjdXJySGllcnMgPSBbLi4ucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVyc107XHJcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlKGN1cnJIaWVyczogVXNlckhpZXJbXSkge1xyXG4gICAgcGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycyA9IGN1cnJIaWVycztcclxuICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtQnV0dG9uc1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBhcmlhLWxhYmVsPVwiQWRkIE5ldyBIaWVyYXJjaHlcIlxyXG4gICAgICBvbjpjbGljaz17YXN5bmMgKCkgPT4gKGN1cnJIaWVycyA9IFsuLi5jdXJySGllcnMsIGJsYW5rVXNlckhpZXIoKV0pfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYVBsdXMgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgYXJpYS1sYWJlbD1cIlJlc2V0IEFsbCBIaWVyYXJjaGllc1wiXHJcbiAgICAgIG9uOmNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlc2V0IGFsbCBoaWVyYXJjaGllcz9cIikpIHtcclxuICAgICAgICAgIGN1cnJIaWVycyA9IFtdO1xyXG4gICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9fVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYVJlZ1RyYXNoQWx0IC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJTaG93IEhpZXJhcmNoaWVzXCJcclxuICAgICAgb246Y2xpY2s9eygpID0+IG5ldyBOb3RpY2UoY3VyckhpZXJzLm1hcChoaWVyVG9TdHIpLmpvaW4oXCJcXG5cXG5cIikpfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYUxpc3RVbCAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICB7I2VhY2ggY3VyckhpZXJzIGFzIGhpZXIsIGl9XHJcbiAgICA8ZGV0YWlscyBjbGFzcz1cIkJDLUhpZXItRGV0YWlsc1wiPlxyXG4gICAgICA8c3VtbWFyeT5cclxuICAgICAgICB7RElSRUNUSU9OUy5tYXAoKGRpcikgPT4gaGllcltkaXJdPy5qb2luKFwiLCBcIikgPz8gXCJcIilcclxuICAgICAgICAgIC5tYXAoKGRpckZpZWxkcykgPT4gYCgke2RpckZpZWxkc30pYClcclxuICAgICAgICAgIC5qb2luKFwiIFwiKX1cclxuXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJCQy1CdXR0b25zXCI+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2FwIHdpdGggSGllcmFyY2h5IEFib3ZlXCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjdXJySGllcnMgPSBzd2FwSXRlbXMoaSwgaSAtIDEsIGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFx1MjE5MVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2FwIHdpdGggSGllcmFyY2h5IEJlbG93XCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjdXJySGllcnMgPSBzd2FwSXRlbXMoaSwgaSArIDEsIGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFx1MjE5M1xyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgSGllcmFyY2h5XCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBvbGRIaWVyID0gY3VyckhpZXJzLnNwbGljZShpLCAxKVswXTtcclxuICAgICAgICAgICAgICBvbGRIaWVyLnVwLmZvckVhY2goKHVwRmllbGQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMuaW5kZXhPZih1cEZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICBESVJFQ1RJT05TLmZvckVhY2goKGRpcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2xkSGllcltkaXJdLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4SSA9IHNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuaW5kZXhPZihmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleEkgPiAtMSlcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW1pdEp1bXBUb0ZpcnN0RmllbGRzLnNwbGljZShpbmRleEksIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhKID0gc2V0dGluZ3MubGltaXRXcml0ZUJDQ2hlY2tib3hlcy5pbmRleE9mKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4SiA+IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuc3BsaWNlKGluZGV4SiwgMSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgY3VyckhpZXJzID0gY3VyckhpZXJzO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZShjdXJySGllcnMpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBYXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvc3VtbWFyeT5cclxuICAgICAgeyNlYWNoIERJUkVDVElPTlMgYXMgZGlyfVxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJCQy1BcnJvdy1MYWJlbFwiIGZvcj17ZGlyfT5cclxuICAgICAgICAgICAge0FSUk9XX0RJUkVDVElPTlNbZGlyXX1cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICBzaXplPVwiMjBcIlxyXG4gICAgICAgICAgICBuYW1lPXtkaXJ9XHJcbiAgICAgICAgICAgIHZhbHVlPXtoaWVyW2Rpcl0/LmpvaW4oXCIsIFwiKSA/PyBcIlwifVxyXG4gICAgICAgICAgICBvbjpjaGFuZ2U9e2FzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3BsaXRzID0gc3BsaXRBbmRUcmltKHZhbHVlKTtcclxuICAgICAgICAgICAgICBjdXJySGllcnNbaV1bZGlyXSA9IHNwbGl0cztcclxuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGUoY3VyckhpZXJzKTtcclxuXHJcbiAgICAgICAgICAgICAgc3BsaXRzLmZvckVhY2goKHNwbGl0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIGRpciA9PT0gXCJ1cFwiICYmXHJcbiAgICAgICAgICAgICAgICAgICFzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcy5pbmNsdWRlcyhzcGxpdClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMucHVzaChzcGxpdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuaW5jbHVkZXMoc3BsaXQpKVxyXG4gICAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW1pdEp1bXBUb0ZpcnN0RmllbGRzLnB1c2goc3BsaXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5saW1pdFdyaXRlQkNDaGVja2JveGVzLmluY2x1ZGVzKHNwbGl0KSlcclxuICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubGltaXRXcml0ZUJDQ2hlY2tib3hlcy5wdXNoKHNwbGl0KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB7L2VhY2h9XHJcbiAgICA8L2RldGFpbHM+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBsYWJlbC5CQy1BcnJvdy1MYWJlbCB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB3aWR0aDogMjBweCAhaW1wb3J0YW50O1xyXG4gIH1cclxuICBkaXYuQkMtQnV0dG9ucyB7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xyXG4gIH1cclxuXHJcbiAgZGV0YWlscy5CQy1IaWVyLURldGFpbHMge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuICAgIHBhZGRpbmc6IDEwcHggNXB4IDEwcHggMTBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XHJcbiAgfVxyXG4gIC5CQy1IaWVyLURldGFpbHMgc3VtbWFyeTo6bWFya2VyIHtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICB9XHJcblxyXG4gIC5CQy1IaWVyLURldGFpbHMgc3VtbWFyeSBidXR0b24ge1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gIH1cclxuICAuaWNvbiB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgcGFkZGluZy10b3A6IDNweDtcclxuICAgIHdpZHRoOiAxN3B4O1xyXG4gICAgaGVpZ2h0OiAxN3B4O1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgIjxzY3JpcHQ+XG4gIGV4cG9ydCBsZXQgdGl0bGUgPSBudWxsO1xuICBleHBvcnQgbGV0IHZpZXdCb3g7XG48L3NjcmlwdD5cblxuPHN0eWxlPlxuICBzdmcge1xuICAgIHN0cm9rZTogY3VycmVudENvbG9yO1xuICAgIGZpbGw6IGN1cnJlbnRDb2xvcjtcbiAgICBzdHJva2Utd2lkdGg6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gIH0gIFxuPC9zdHlsZT5cblxuPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIge3ZpZXdCb3h9PlxuICB7I2lmIHRpdGxlfVxuICAgIDx0aXRsZT57dGl0bGV9PC90aXRsZT5cbiAgey9pZn1cbiAgPHNsb3QgLz5cbjwvc3ZnPlxuIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCA1MTIgNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDggNDhhNDggNDggMCAxIDAgNDggNDggNDggNDggMCAwIDAtNDgtNDh6bTAgMTYwYTQ4IDQ4IDAgMSAwIDQ4IDQ4IDQ4IDQ4IDAgMCAwLTQ4LTQ4em0wIDE2MGE0OCA0OCAwIDEgMCA0OCA0OCA0OCA0OCAwIDAgMC00OC00OHptNDQ4IDE2SDE3NmExNiAxNiAwIDAgMC0xNiAxNnYzMmExNiAxNiAwIDAgMCAxNiAxNmgzMjBhMTYgMTYgMCAwIDAgMTYtMTZ2LTMyYTE2IDE2IDAgMCAwLTE2LTE2em0wLTMyMEgxNzZhMTYgMTYgMCAwIDAtMTYgMTZ2MzJhMTYgMTYgMCAwIDAgMTYgMTZoMzIwYTE2IDE2IDAgMCAwIDE2LTE2VjgwYTE2IDE2IDAgMCAwLTE2LTE2em0wIDE2MEgxNzZhMTYgMTYgMCAwIDAtMTYgMTZ2MzJhMTYgMTYgMCAwIDAgMTYgMTZoMzIwYTE2IDE2IDAgMCAwIDE2LTE2di0zMmExNiAxNiAwIDAgMC0xNi0xNnpcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCA0NDggNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDE2IDIwOEgyNzJWNjRjMC0xNy42Ny0xNC4zMy0zMi0zMi0zMmgtMzJjLTE3LjY3IDAtMzIgMTQuMzMtMzIgMzJ2MTQ0SDMyYy0xNy42NyAwLTMyIDE0LjMzLTMyIDMydjMyYzAgMTcuNjcgMTQuMzMgMzIgMzIgMzJoMTQ0djE0NGMwIDE3LjY3IDE0LjMzIDMyIDMyIDMyaDMyYzE3LjY3IDAgMzItMTQuMzMgMzItMzJWMzA0aDE0NGMxNy42NyAwIDMyLTE0LjMzIDMyLTMydi0zMmMwLTE3LjY3LTE0LjMzLTMyLTMyLTMyelwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiPHNjcmlwdD5cbiAgICAgICAgaW1wb3J0IEljb25CYXNlIGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlJztcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxJY29uQmFzZSB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIiB7Li4uJCRwcm9wc30+XG4gICAgICAgICAgPHBhdGggZD1cIk0yNjggNDE2aDI0YTEyIDEyIDAgMCAwIDEyLTEyVjE4OGExMiAxMiAwIDAgMC0xMi0xMmgtMjRhMTIgMTIgMCAwIDAtMTIgMTJ2MjE2YTEyIDEyIDAgMCAwIDEyIDEyek00MzIgODBoLTgyLjQxbC0zNC01Ni43QTQ4IDQ4IDAgMCAwIDI3NC40MSAwSDE3My41OWE0OCA0OCAwIDAgMC00MS4xNiAyMy4zTDk4LjQxIDgwSDE2QTE2IDE2IDAgMCAwIDAgOTZ2MTZhMTYgMTYgMCAwIDAgMTYgMTZoMTZ2MzM2YTQ4IDQ4IDAgMCAwIDQ4IDQ4aDI4OGE0OCA0OCAwIDAgMCA0OC00OFYxMjhoMTZhMTYgMTYgMCAwIDAgMTYtMTZWOTZhMTYgMTYgMCAwIDAtMTYtMTZ6TTE3MS44NCA1MC45MUE2IDYgMCAwIDEgMTc3IDQ4aDk0YTYgNiAwIDAgMSA1LjE1IDIuOTFMMjkzLjYxIDgwSDE1NC4zOXpNMzY4IDQ2NEg4MFYxMjhoMjg4em0tMjEyLTQ4aDI0YTEyIDEyIDAgMCAwIDEyLTEyVjE4OGExMiAxMiAwIDAgMC0xMi0xMmgtMjRhMTIgMTIgMCAwIDAtMTIgMTJ2MjE2YTEyIDEyIDAgMCAwIDEyIDEyelwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiaW1wb3J0IFVzZXJIaWVyYXJjaGllcyBmcm9tIFwiLi4vQ29tcG9uZW50cy9Vc2VySGllcmFyY2hpZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRIaWVyYXJjaHlTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCBmaWVsZERldGFpbHMgPSBkZXRhaWxzKFwiSGllcmFyY2hpZXNcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBmaWVsZERldGFpbHMuY3JlYXRlRWwoXCJwXCIsIHtcclxuICAgIHRleHQ6IFwiSGVyZSB5b3UgY2FuIHNldCB1cCBkaWZmZXJlbnQgaGllcmFyY2hpZXMgeW91IHVzZSBpbiB5b3VyIHZhdWx0LiBUbyBhZGQgYSBuZXcgaGllcmFyY2h5LCBjbGljayB0aGUgcGx1cyBidXR0b24uIFRoZW4sIGZpbGwgaW4gdGhlIGZpZWxkIG5hbWVzIG9mIHlvdXIgaGllcmFjaHkgaW50byB0aGUgNSBib3hlcyB0aGF0IGFwcGVhci5cIixcclxuICB9KTtcclxuICBmaWVsZERldGFpbHMuY3JlYXRlRWwoXCJwXCIsIHtcclxuICAgIHRleHQ6IFwiRm9yIGVhY2ggZGlyZWN0aW9uLCB5b3UgY2FuIGVudGVyIG11bHRpcGxlIGZpZWxkIG5hbWVzIGluIGEgY29tbWEtc2VwZXJhdGVkIGxpc3QuIEZvciBleGFtcGxlOiBgcGFyZW50LCBicm9hZGVyLCB1cHBlcmBcIixcclxuICB9KTtcclxuXHJcbiAgbmV3IFVzZXJIaWVyYXJjaGllcyh7XHJcbiAgICB0YXJnZXQ6IGZpZWxkRGV0YWlscyxcclxuICAgIHByb3BzOiB7IHBsdWdpbiB9LFxyXG4gIH0pO1xyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IHdhcm4gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgc2V0dGluZ05hbWU6IHN0cmluZztcclxuICBleHBvcnQgbGV0IG9wdGlvbnM6IHN0cmluZ1tdO1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcblxyXG4gIGxldCBzZWxlY3RlZCA9IHNldHRpbmdzW3NldHRpbmdOYW1lXTtcclxuXHJcbiAgJDogdG9Ob25lID0gc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gZmFsc2UgOiB0cnVlO1xyXG5cclxuICBhc3luYyBmdW5jdGlvbiBzYXZlKCkge1xyXG4gICAgaWYgKHNldHRpbmdzW3NldHRpbmdOYW1lXSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICByZXR1cm4gd2FybihzZXR0aW5nTmFtZSArIFwiIG5vdCBmb3VuZCBpbiBCQyBzZXR0aW5nc1wiKTtcclxuXHJcbiAgICBzZXR0aW5nc1tzZXR0aW5nTmFtZV0gPSBzZWxlY3RlZDtcclxuICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gIH1cclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2PlxyXG4gIDxidXR0b25cclxuICAgIG9uOmNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICh0b05vbmUpIHNlbGVjdGVkID0gW107XHJcbiAgICAgIGVsc2Ugc2VsZWN0ZWQgPSBvcHRpb25zO1xyXG4gICAgICBhd2FpdCBzYXZlKCk7XHJcbiAgICB9fVxyXG4gID5cclxuICAgIFNlbGVjdCB7dG9Ob25lID8gXCJOb25lXCIgOiBcIkFsbFwifVxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJncmlkXCI+XHJcbiAgeyNlYWNoIG9wdGlvbnMgYXMgb3B0aW9ufVxyXG4gICAgPGRpdj5cclxuICAgICAgPGxhYmVsPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgIHZhbHVlPXtvcHRpb259XHJcbiAgICAgICAgICBiaW5kOmdyb3VwPXtzZWxlY3RlZH1cclxuICAgICAgICAgIG9uOmNoYW5nZT17YXN5bmMgKCkgPT4gYXdhaXQgc2F2ZSgpfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAge29wdGlvbn1cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gIHsvZWFjaH1cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcbiAgLmdyaWQge1xyXG4gICAgZGlzcGxheTogZ3JpZDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTAwcHgsIDFmcikpO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgImltcG9ydCBDaGVja2JveGVzIGZyb20gXCIuLi9Db21wb25lbnRzL0NoZWNrYm94ZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEp1bXBUb05leHRTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGp1bXBUb0RpckRldGFpbHMgPSBzdWJEZXRhaWxzKFwiSnVtcCB0byBOZXh0IERpcmVjdGlvblwiLCB2aWV3RGV0YWlscyk7XHJcblxyXG4gIGp1bXBUb0RpckRldGFpbHMuY3JlYXRlRGl2KHsgY2xzOiAnc2V0dGluZy1pdGVtLW5hbWUnLCB0ZXh0OiAnTGltaXQgd2hpY2ggZmllbGRzIHRvIGp1bXAgdG8nIH0pXHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDoganVtcFRvRGlyRGV0YWlscyxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIHBsdWdpbixcclxuICAgICAgc2V0dGluZ05hbWU6IFwibGltaXRKdW1wVG9GaXJzdEZpZWxkc1wiLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKSxcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBvcGVuVmlldyB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuaW1wb3J0IHsgTUFUUklYX1ZJRVcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE1hdHJpeFZpZXdTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IE1MVmlld0RldGFpbHMgPSBzdWJEZXRhaWxzKFwiTWF0cml4IFZpZXdcIiwgdmlld0RldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaG93IGFsbCBmaWVsZCBuYW1lcyBvciBqdXN0IHJlbGF0aW9uIHR5cGVzXCIpXHJcbiAgICAuc2V0RGVzYyhmcmFnV2l0aEhUTUwoXHJcbiAgICAgIFwiU2hvdyB0aGUgbGlzdCBvZiBtZXRhZGF0YSBmaWVsZHMgZm9yIGVhY2ggcmVsYXRpb24gdHlwZSAoZS5nLiA8Y29kZT5wYXJlbnQsIGJyb2FkZXIsIHVwcGVyPC9jb2RlPiksIG9yIGp1c3QgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHR5cGUsIGkuZS4gJzxjb2RlPlBhcmVudDwvY29kZT4nLCAnPGNvZGU+U2libGluZzwvY29kZT4nLCAnPGNvZGU+Q2hpbGQ8L2NvZGU+Jy48L2JyPlx1MjcwNSA9IHNob3cgdGhlIGZ1bGwgbGlzdC5cIilcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dOYW1lT3JUeXBlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93TmFtZU9yVHlwZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgUmVsYXRpb25zaGlwIFR5cGVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTaG93IHdoZXRoZXIgYSBsaW5rIGlzIHJlYWwgb3IgaW1wbGllZC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93UmVsYXRpb25UeXBlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93UmVsYXRpb25UeXBlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGlyZWN0aW9ucyBPcmRlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBgQ2hhbmdlIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlyZWN0aW9ucyBhcHBlYXIgaW4gdGhlIE1hdHJpeCB2aWV3LjwvYnI+VGhlIGRlZmF1bHQgaXMgXCJ1cCwgc2FtZSwgZG93biwgbmV4dCwgcHJldlwiICg8Y29kZT4wMTIzNDwvY29kZT4pLlxyXG4gICAgICAgICAgPHVsPlxyXG4gICAgICAgICAgICA8bGk+MCBcdTIxOTIgdXA8L2xpPlxyXG4gICAgICAgICAgICA8bGk+MSBcdTIxOTIgc2FtZTwvbGk+XHJcbiAgICAgICAgICAgIDxsaT4yIFx1MjE5MiBkb3duPC9saT5cclxuICAgICAgICAgICAgPGxpPjMgXHUyMTkyIG5leHQ8L2xpPlxyXG4gICAgICAgICAgICA8bGk+NCBcdTIxOTIgcHJldjwvbGk+XHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBZb3UgY2FuIHJlbW92ZSBudW1iZXJzIHRvIGhpZGUgdGhvc2UgZGlyZWN0aW9ucyBpbiB0aGUgTWF0cml4IFZpZXcuIEZvciBleGFtcGxlLCA8Y29kZT4wMjwvY29kZT4gd2lsbCBvbmx5IHNob3cgdXAgYW5kIGRvd24sIGluIHRoYXQgb3JkZXIuYFxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLnNxdWFyZURpcmVjdGlvbnNPcmRlci5qb2luKFwiXCIpKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdChcIlwiKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggPD0gNSAmJlxyXG4gICAgICAgICAgdmFsdWVzLmV2ZXJ5KCh2YWx1ZSkgPT4gW1wiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIl0uaW5jbHVkZXModmFsdWUpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0dGluZ3Muc3F1YXJlRGlyZWN0aW9uc09yZGVyID0gdmFsdWVzLm1hcCgob3JkZXIpID0+XHJcbiAgICAgICAgICAgIE51bWJlci5wYXJzZUludChvcmRlcilcclxuICAgICAgICAgICkgYXMgKDAgfCAxIHwgMiB8IDMgfCA0KVtdO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgICAgICdUaGUgdmFsdWUgbXVzdCBiZSBhIDUgZGlnaXQgbnVtYmVyIHVzaW5nIG9ubHkgdGhlIGRpZ2l0cyBcIjBcIiwgXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCInXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJFbmFibGUgQWxwaGFiZXRpY2FsIFNvcnRpbmdcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIkJ5IGRlZmF1bHQsIGl0ZW1zIGluIHRoZSBNYXRyaXggdmlldyBhcmUgc29ydGVkIGJ5IHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB5b3VyIG5vdGVzLiBUb2dnbGUgdGhpcyBvbiB0byBlbmFibGUgYWxwaGFiZXRpY2FsIHNvcnRpbmcuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmVuYWJsZUFscGhhU29ydCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZW5hYmxlQWxwaGFTb3J0ID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgLy8gVE9ETyBoaWRlIHRoaXMgc2V0dGluZyBpZiAhZW5hYmxlQWxwaGFTb3J0XHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU29ydCBBbHBoYWJldGljYWxseSBBc2NlbmRpbmcvRGVzY2VuZGluZ1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiU29ydCBzcXVhcmUgaXRlbXMgYWxwaGFiZXRpY2FsbHkgaW4gQXNjZW5kaW5nIChcdTI3MDUpIG9yIERlc2NlbmRpbmcgKFx1Mjc0Qykgb3JkZXIuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmFscGhhU29ydEFzYykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWxwaGFTb3J0QXNjID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU29ydCBieSBub3RlIG5hbWUsIGJ1dCBzaG93IGFsaWFzXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJXaGVuIHRoaXMgaXMgdHVybmVkIG9mZiwgbm90ZXMgd2lsbCBmaXJzdCBiZSBzb3J0ZWQgYnkgdGhlaXIgYWxpYXMsIGFuZCB0aGVuIGJ5IHRoZWlyIG5hbWUgaWYgbm8gYWxpYXMgaXMgZm91bmQuIFR1cm4gdGhpcyBvbiB0byBzb3J0IGJ5IG5vdGUgbmFtZSBhbHdheXMsIGJ1dCBzdGlsbCBzaG93IHRoZSBhbGlhcyBpbiB0aGUgcmVzdWx0cy5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Muc29ydEJ5TmFtZVNob3dBbGlhcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc29ydEJ5TmFtZVNob3dBbGlhcyA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgSW1wbGllZCBSZWxhdGlvbnNcIilcclxuICAgIC5zZXREZXNjKFwiV2hldGhlciBvciBub3QgdG8gc2hvdyBpbXBsaWVkIHJlbGF0aW9ucyBhdCBhbGwuXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93SW1wbGllZFJlbGF0aW9ucykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc2hvd0ltcGxpZWRSZWxhdGlvbnMgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAvLyBUT0RPIEkgZG9uJ3QgdGhpbmsgdGhpcyBzZXR0aW5nIHdvcmtzIGFueW1vcmUuIEkgcmVtb3ZlZCBpdCdzIGZ1bmN0aW9uYWxpdHkgd2hlbiBhZGRpbmcgbXVsdGlwbGUgaGllcmFyY2hpZXNcclxuICAvLyBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gIC8vICAgLnNldE5hbWUoXCJGaWx0ZXIgSW1wbGllZCBTaWJsaW5nc1wiKVxyXG4gIC8vICAgLnNldERlc2MoXHJcbiAgLy8gICAgIGZyYWdXaXRoSFRNTChcclxuICAvLyAgICAgICBgSW1wbGllZCBzaWJsaW5ncyBhcmU6XHJcbiAgLy8gICAgICAgICA8b2w+XHJcbiAgLy8gICAgICAgICAgIDxsaT5ub3RlcyB3aXRoIHRoZSBzYW1lIHBhcmVudCwgb3I8L2xpPlxyXG4gIC8vICAgICAgICAgICA8bGk+bm90ZXMgdGhhdCBhcmUgcmVhbCBzaWJsaW5ncy48L2xpPlxyXG4gIC8vICAgICAgICAgPC9vbD5cclxuICAvLyAgICAgICAgIFRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gdHlwZSAxIGltcGxpZWQgc2libGluZ3MuIElmIGVuYWJsZWQsIEJyZWFkY3J1bWJzIHdpbGwgZmlsdGVyIHR5cGUgMSBpbXBsaWVkIHNpYmxpbmdzIHNvIHRoYXQgdGhleSBub3Qgb25seSBzaGFyZSB0aGUgc2FtZSBwYXJlbnQsIGJ1dCB0aGUgcGFyZW50IHJlbGF0aW9uIGhhcyB0aGUgZXhhY3Qgc2FtZSB0eXBlLiBGb3IgZXhhbXBsZSwgdGhlIHR3byByZWFsIHJlbGF0aW9ucyA8Y29kZT5CIC1wYXJlbnQtPiBBPC9jb2RlPiwgYW5kIDxjb2RlPkMgLXBhcmVudC0+IEE8L2NvZGU+IGNyZWF0ZSBhbiBpbXBsaWVkIHNpYmxpbmcgYmV0d2VlbiBCIGFuZCBDICh0aGV5IGhhdmUgdGhlIHNhbWUgcGFyZW50LCBBKS4gVGhlIHR3byByZWFsIHJlbGF0aW9ucyA8Y29kZT5CIC1wYXJlbnQtPiBBPC9jb2RlPiwgYW5kIDxjb2RlPkMgLXVwLT4gQTwvY29kZT4gY3JlYXRlIGFuIGltcGxpZWQgc2libGluZyBiZXR3ZWVuIEIgYW5kIEMgKHRoZXkgYWxzbyBoYXZlIHRoZSBzYW1lIHBhcmVudCwgQSkuIEJ1dCBpZiB0aGlzIHNldHRpbmcgaXMgdHVybmVkIG9uLCB0aGUgc2Vjb25kIGltcGxpZWQgc2libGluZyB3b3VsZCBub3Qgc2hvdywgYmVjYXVzZSB0aGUgcGFyZW50IHR5cGVzIGFyZSBkaWZmZXJuZXQgKHBhcmVudCB2ZXJzdXMgdXApLmBcclxuICAvLyAgICAgKVxyXG4gIC8vICAgKVxyXG4gIC8vICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gIC8vICAgICB0b2dnbGVcclxuICAvLyAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZmlsdGVySW1wbGllZFNpYmxpbmdzT2ZEaWZmZXJlbnRUeXBlcylcclxuICAvLyAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgLy8gICAgICAgICBzZXR0aW5ncy5maWx0ZXJJbXBsaWVkU2libGluZ3NPZkRpZmZlcmVudFR5cGVzID0gdmFsdWU7XHJcbiAgLy8gICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgLy8gICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiT3BlbiBWaWV3IGluIFJpZ2h0IG9yIExlZnQgc2lkZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiV2hlbiBsb2FkaW5nIHRoZSBtYXRyaXggdmlldywgc2hvdWxkIGl0IG9wZW4gb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBsZWFmPyBcdTI3MDUgPSBSaWdodCwgXHUyNzRDID0gTGVmdC5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MucmxMZWFmKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5ybExlYWYgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXBwLndvcmtzcGFjZS5kZXRhY2hMZWF2ZXNPZlR5cGUoTUFUUklYX1ZJRVcpO1xyXG4gICAgICAgIGF3YWl0IG9wZW5WaWV3KFxyXG4gICAgICAgICAgYXBwLFxyXG4gICAgICAgICAgTUFUUklYX1ZJRVcsXHJcbiAgICAgICAgICBNYXRyaXhWaWV3LFxyXG4gICAgICAgICAgdmFsdWUgPyBcInJpZ2h0XCIgOiBcImxlZnRcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG59XHJcbiIsICJpbXBvcnQgeyBOb3RpY2UsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgeyBzdHJUb1JlZ2V4IH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vU3lzdGVtU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG5cclxuICBjb25zdCBub1N5c3RlbURldGFpbHMgPSBzdWJEZXRhaWxzKFxyXG4gICAgXCJOYW1pbmcgU3lzdGVtXCIsXHJcbiAgICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHNcclxuICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhub1N5c3RlbURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk5hbWluZyBTeXN0ZW0gUmVnZXhcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJJZiB5b3UgbmFtZSB5b3VyIG5vdGVzIHVzaW5nIHRoZSBKb2hubnkgRGVjaW1hbCBTeXN0ZW0gb3IgYSByZWxhdGVkIHN5c3RlbSwgZW50ZXIgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgdGhlIGxvbmdlc3QgcG9zc2libGUgbmFtaW5nIHN5c3RlbSB5b3UgdXNlLiBUaGUgcmVnZXggc2hvdWxkIG9ubHkgbWF0Y2ggdGhlIG5hbWluZyBzeXN0ZW0gcGFydCBvZiB0aGUgbmFtZSwgbm90IHRoZSBhY3R1YWwgbm90ZSB0aXRsZS48L2JyPiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSB0aGUgSm9obm55IERlY2ltYWwgU3lzdGVtLCB5b3UgbWlnaHQgdXNlIDxjb2RlPi9eXFxcXGRcXFxcLlxcXFxkXFxcXC5cXFxcdy9nPC9jb2RlPiB0byBtYXRjaCB0aGUgbm90ZSBuYW1lZCA8Y29kZT4xLjIuYSBDYXJzPC9jb2RlPi48L2JyPklmIHlvdSBkb24ndCB3YW50IHRvIGNob29zZSBhIGRlZmF1bHQsIHNlbGVjdCB0aGUgYmxhbmsgb3B0aW9uIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1SZWdleCk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHN0clRvUmVnZXgodmFsdWUpKSB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1SZWdleCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXCJJbnZhbGlkIFJlZ2V4XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKG5vU3lzdGVtRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiTmFtaW5nIFN5c3RlbSBEZWxpbWl0ZXJcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJXaGF0IGNoYXJhY3RlciBkbyB5b3UgdXNlIHRvIHNwbGl0IHVwIHlvdXIgbmFtaW5nIGNvbnZlbnRpb24/IEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIDxjb2RlPjEuMi5hLmI8L2NvZGU+LCB0aGVuIHlvdXIgZGVsaW1pdGVyIGlzIGEgcGVyaW9kICg8Y29kZT4uPC9jb2RlPikuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1TcGxpdCk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgc2V0dGluZ3MubmFtaW5nU3lzdGVtU3BsaXQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcobm9TeXN0ZW1EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJOYW1pbmcgU3lzdGVtIEZpZWxkXCIpXHJcbiAgICAuc2V0RGVzYyhcIldoaWNoIGZpZWxkIHNob3VsZCBCcmVhZGNydW1icyB1c2UgZm9yIE5hbWluZyBTeXN0ZW0gbm90ZXM/XCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkKSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGRkLmFkZE9wdGlvbihmaWVsZCwgZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MubmFtaW5nU3lzdGVtRmllbGQpO1xyXG4gICAgICBkZC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1GaWVsZCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICBuZXcgU2V0dGluZyhub1N5c3RlbURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk5hbWluZyBTeXN0ZW0gRW5kcyB3aXRoIERlbGltaXRlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkRvZXMgeW91ciBuYW1pbmcgY29udmVudGlvbiBlbmQgd2l0aCB0aGUgZGVsaW1pdGVyPyBGb3IgZXhhbXBsZSwgPGNvZGU+MS4yLiBOb3RlPC9jb2RlPiBkb2VzIGVuZCB3aXRoIHRoZSBkZWxpbWl0ZXIsIGJ1dCA8Y29kZT4xLjIgTm90ZTwvY29kZT4gZG9lcyBub3QuPC9icj5Gb3IgbWF0Y2hpbmcgcHVycG9zZXMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBuYW1lIHlvdXIgbm90ZXMgd2l0aCB0aGUgZGVsaW1pdGVyIG9uIHRoZSBlbmQuIE9ubHkgdHVybiB0aGlzIHNldHRpbmcgb24gaWYgeW91IGRvIG5hbWUgeW91ciBub3RlcyB0aGlzIHdheSwgYnV0IGtub3cgdGhhdCB0aGUgcmVzdWx0cyBtYXkgbm90IGJlIGFzIGFjY3VyYXRlIGlmIHlvdSBkb24ndC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2cpID0+XHJcbiAgICAgIHRvZ1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1FbmRzV2l0aERlbGltaXRlcilcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1FbmRzV2l0aERlbGltaXRlciA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWdleE5vdGVTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCByZWdleE5vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiUmVnZXggTm90ZXNcIixcclxuICAgIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsc1xyXG4gICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlZ2V4Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgUmVnZXggTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkJ5IGRlZmF1bHQsIHJlZ2V4IG5vdGVzIHVzZSB0aGUgZmlyc3QgZmllbGQgaW4geW91ciBoaWVyYXJjaGllcyAodXN1YWxseSBhbiA8Y29kZT5cdTIxOTE8L2NvZGU+IGZpZWxkKS4gQ2hvb3NlIGEgZGlmZmVyZW50IG9uZSB0byB1c2UgYnkgZGVmYXVsdCwgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSA8Y29kZT5CQy1yZWdleC1ub3RlLWZpZWxkOiB7ZmllbGR9PC9jb2RlPi48L2JyPklmIHlvdSBkb24ndCB3YW50IHRvIGNob29zZSBhIGRlZmF1bHQsIHNlbGVjdCB0aGUgYmxhbmsgb3B0aW9uIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKS5mb3JFYWNoKFxyXG4gICAgICAgIChmaWVsZCkgPT4gKG9wdGlvbnNbZmllbGRdID0gZmllbGQpXHJcbiAgICAgICk7XHJcbiAgICAgIGRkLmFkZE9wdGlvbnMoT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7IFwiXCI6IFwiXCIgfSkpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnJlZ2V4Tm90ZUZpZWxkKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAoZmllbGQpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnJlZ2V4Tm90ZUZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBkZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IE1hcmtkb3duUmVuZGVyZXIsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWxhdGlvblNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCByZWxhdGlvbkRldGFpbHMgPSBkZXRhaWxzKFwiUmVsYXRpb25zaGlwc1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gIGZ1bmN0aW9uIG1lcm1haWREaWFncmFtKGRpYWdyYW1TdHI6IHN0cmluZykge1xyXG4gICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihcclxuICAgICAgZGlhZ3JhbVN0cixcclxuICAgICAgcmVsYXRpb25EZXRhaWxzLmNyZWF0ZURpdigpLFxyXG4gICAgICBcIlwiLFxyXG4gICAgICBudWxsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIHJlbGF0aW9uRGV0YWlscy5jcmVhdGVFbChcInBcIiwge1xyXG4gICAgdGV4dDogXCJIZXJlIHlvdSBjYW4gdG9nZ2xlIG9uL29mZiBkaWZmZXJlbnQgdHlwZXMgb2YgaW1wbGllZCByZWxhdGlvbnNoaXBzLiBBbGwgb2YgeW91ciBleHBsaWNpdCAocmVhbCkgcmVsYXRpb25zaGlwcyB3aWxsIHN0aWxsIHNob3csIGJ1dCB5b3UgY2FuIGNob29zZSB3aGljaCBpbXBsaWVkIG9uZXMgZ2V0IGZpbGxlZCBpbi5cXG5BbGwgaW1wbGllZCByZWxhdGlvbnNoaXBzIGFyZSBnaXZlbiBhIENTUyBjbGFzcyBvZiB0aGUgdHlwZSBvZiBpbXBsaWVkIHJlbGF0aW9uLCBzbyB5b3UgY2FuIHN0eWxlIHRoZW0gZGlmZmVyZW50bHkuIEZvciBleGFtcGxlIGAuQkMtQXVudGAuXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlbGF0aW9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2FtZSBQYXJlbnQgaXMgU2libGluZ3NcIilcclxuICAgIC5zZXREZXNjKFwiSWYgb25lIG5vdGUgc2hhcmVzIGEgcGFyZW50IHdpdGggYW5vdGhlciwgdHJlYXQgdGhlbSBhcyBzaWJsaW5nc1wiKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuc2FtZVBhcmVudElzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5zYW1lUGFyZW50SXNTaWJsaW5nID0gdmFsO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG1lcm1haWREaWFncmFtKFwiYGBgbWVybWFpZFxcbmZsb3djaGFydCBMUlxcbk1lIC0tPnx1cHwgRGFkXFxuU2lzdGVyIC0tPnx1cHwgRGFkXFxuTWUgPC0uLT58c2FtZXwgU2lzdGVyXFxuYGBgXCIpXHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlbGF0aW9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2libGluZ3MnIFNpYmxpbmdzXCIpXHJcbiAgICAuc2V0RGVzYyhcIlRyZWF0IHlvdXIgc2libGluZ3MnIHNpYmxpbmdzIGFzIHlvdXIgc2libGluZ3NcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnNpYmxpbmdzU2libGluZ0lzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5zaWJsaW5nc1NpYmxpbmdJc1NpYmxpbmcgPSB2YWw7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbWVybWFpZERpYWdyYW0oXCJgYGBtZXJtYWlkXFxuZmxvd2NoYXJ0IExSXFxuTWUgLS0+fHNhbWV8IFNpc3Rlclxcbk1lIC0tPnxzYW1lfCBCcm90aGVyXFxuU2lzdGVyIDwtLi0+fHNhbWV8IEJyb3RoZXJcXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaWJsaW5ncycgUGFyZW50IGlzIFBhcmVudFwiKVxyXG4gICAgLnNldERlc2MoXCJZb3VyIHNpYmxpbmdzJyBwYXJlbnRzIGFyZSB5b3VyIHBhcmVudHNcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnNpYmxpbmdzUGFyZW50SXNQYXJlbnQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWwpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuc2libGluZ3NQYXJlbnRJc1BhcmVudCA9IHZhbDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBtZXJtYWlkRGlhZ3JhbShcImBgYG1lcm1haWRcXG5mbG93Y2hhcnQgTFJcXG5TaXN0ZXIgLS0+fHVwfCBEYWRcXG5TaXN0ZXIgPC0tPnxzYW1lfCBNZVxcbk1lIC0uLT58dXB8IERhZFxcbmBgYFwiKVxyXG5cclxuICBuZXcgU2V0dGluZyhyZWxhdGlvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkF1bnQvVW5jbGVcIilcclxuICAgIC5zZXREZXNjKFwiVHJlYXQgeW91ciBwYXJlbnQncyBzaWJsaW5ncyBhcyB5b3VyIHBhcmVudHMgKGF1bnRzL3VuY2xlcylcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnBhcmVudHNTaWJsaW5nc0lzUGFyZW50cylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5wYXJlbnRzU2libGluZ3NJc1BhcmVudHMgPSB2YWw7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbWVybWFpZERpYWdyYW0oXCJgYGBtZXJtYWlkXFxuZmxvd2NoYXJ0IExSXFxuTWUgLS0+fHVwfCBEYWRcXG5EYWQgLS0+fHNhbWV8IFVuY2xlXFxuTWUgLS4tPnx1cHwgVW5jbGVcXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJDb3VzaW5zXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJUcmVhdCB0aGUgY291c2lucyBvZiBhIG5vdGUgYXMgc2libGluZ3MgKHBhcmVudHMnIHNpYmxpbmdzJyBjaGlsZHJlbiBhcmUgY291c2lucylcIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuY291c2luc0lzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5jb3VzaW5zSXNTaWJsaW5nID0gdmFsO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG1lcm1haWREaWFncmFtKFwiYGBgbWVybWFpZFxcbmZsb3djaGFydCBMUlxcbk1lIC0tPnx1cHwgRGFkXFxuRGFkIC0tPnxzYW1lfCBVbmNsZVxcblVuY2xlIC0tPnxkb3dufCBDb3VzaW5cXG5NZSA8LS4tPnxzYW1lfCBDb3VzaW5cXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJNYWtlIEN1cnJlbnQgTm90ZSBhbiBJbXBsaWVkIFNpYmxpbmdcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlRlY2hpbmNhbGx5LCB0aGUgY3VycmVudCBub3RlIGlzIGFsd2F5cyBpdCdzIG93biBpbXBsaWVkIHNpYmxpbmcuIEJ5IGRlZmF1bHQsIGl0IGlzIG5vdCBzaG93IGFzIHN1Y2guIFRvZ2dsZSB0aGlzIG9uIHRvIG1ha2UgaXQgc2hvdy5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MudHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MudHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG59XHJcbiIsICJpbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZnJhZ1dpdGhIVE1MLCBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFnTm90ZVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHRhZ05vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcIlRhZyBOb3Rlc1wiLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyh0YWdOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBUYWcgTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkJ5IGRlZmF1bHQsIHRhZyBub3RlcyB1c2UgdGhlIGZpcnN0IGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMgKHVzdWFsbHkgYW4gPGNvZGU+XHUyMTkxPC9jb2RlPiBmaWVsZCkuIENob29zZSBhIGRpZmZlcmVudCBvbmUgdG8gdXNlIGJ5IGRlZmF1bHQsIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgPGNvZGU+QkMtdGFnLW5vdGUtZmllbGQ6IHtmaWVsZH08L2NvZGU+LjwvYnI+SWYgeW91IGRvbid0IHdhbnQgdG8gY2hvb3NlIGEgZGVmYXVsdCwgc2VsZWN0IHRoZSBibGFuayBvcHRpb24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG5cclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKS5mb3JFYWNoKFxyXG4gICAgICAgIChmaWVsZCkgPT4gKG9wdGlvbnNbZmllbGRdID0gZmllbGQpXHJcbiAgICAgICk7XHJcbiAgICAgIGRkLmFkZE9wdGlvbnMoT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7IFwiXCI6IFwiXCIgfSkpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRhZ05vdGVGaWVsZClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy50YWdOb3RlRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIEFSUk9XX0RJUkVDVElPTlMsXHJcbiAgREVGQVVMVF9TRVRUSU5HUyxcclxuICBESVJFQ1RJT05TLFxyXG4gIElMTEVHQUxfRklMRU5BTUVfQ0hBUlMsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRUaHJlYWRpbmdTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGNtZHNEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHRocmVhZGluZ0RldGFpbHMgPSBzdWJEZXRhaWxzKFwiVGhyZWFkaW5nXCIsIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgdGhyZWFkaW5nRGV0YWlscy5jcmVhdGVEaXYoe1xyXG4gICAgdGV4dDogXCJTZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmRzIGBDcmVhdGUgbmV3IDxmaWVsZD4gZnJvbSBjdXJyZW50IG5vdGVgXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk9wZW4gbmV3IHRocmVhZHMgaW4gbmV3IHBhbmUgb3IgY3VycmVudCBwYW5lXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2cpID0+IHtcclxuICAgICAgdG9nLnNldFZhbHVlKHNldHRpbmdzLnRocmVhZEludG9OZXdQYW5lKTtcclxuICAgICAgdG9nLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnRocmVhZEludG9OZXdQYW5lID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlRocmVhZCB1bmRlciBDdXJzb3JcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJJZiB0aGUgc2V0dGluZyA8Y29kZT5Xcml0ZSBCcmVhZGNydW1icyBJbmxpbmU8L2NvZGU+IGlzIGVuYWJsZWQsIHdoZXJlIHNob3VsZCB0aGUgbmV3IEJyZWFkY3J1bWIgYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgbm90ZT8gXHUyNzA1ID0gVW5kZXIgdGhlIGN1cnNvciwgXHUyNzRDID0gQXQgdGhlIHRvcCBvZiB0aGUgbm90ZSAodW5kZXIgdGhlIHlhbWwsIGlmIGFwcGxpY2FibGUpXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nKSA9PiB7XHJcbiAgICAgIHRvZy5zZXRWYWx1ZShzZXR0aW5ncy50aHJlYWRVbmRlckN1cnNvcik7XHJcbiAgICAgIHRvZy5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy50aHJlYWRVbmRlckN1cnNvciA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiTmV3IE5vdGUgTmFtZSBUZW1wbGF0ZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBgV2hlbiB0aHJlYWRpbmcgaW50byBhIG5ldyBub3RlLCBjaG9vc2UgdGhlIHRlbXBsYXRlIGZvciB0aGUgbmV3IG5vdGUgbmFtZS48L2JyPlxyXG4gICAgICAgIE9wdGlvbnMgaW5jbHVkZTo8L2JyPlxyXG4gICAgICAgIDx1bD5cclxuICAgICAgICAgIDxsaT48Y29kZT57e2ZpZWxkfX08L2NvZGU+OiB0aGUgZmllbGQgYmVpbmcgdGhyZWFkIGludG88L2xpPlxyXG4gICAgICAgICAgPGxpPjxjb2RlPnt7ZGlyfX08L2NvZGU+OiB0aGUgZGlyZWN0aW9uIGJlaW5nIHRocmVhZCBpbnRvPC9saT5cclxuICAgICAgICAgIDxsaT48Y29kZT57e2N1cnJlbnR9fTwvY29kZT46IHRoZSBjdXJyZW50IG5vdGUgbmFtZTwvbGk+XHJcbiAgICAgICAgICA8bGk+PGNvZGU+e3tkYXRlfX08L2NvZGU+OiB0aGUgY3VycmVudCBkYXRlIChTZXQgdGhlIGZvcm1hdCBpbiB0aGUgc2V0dGluZyBiZWxvdyk8L2xpPlxyXG4gICAgICAgIDwvdWw+YFxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLnRocmVhZGluZ1RlbXBsYXRlKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoSUxMRUdBTF9GSUxFTkFNRV9DSEFSUy5zb21lKChjaGFyKSA9PiB2YWx1ZS5pbmNsdWRlcyhjaGFyKSkpIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgICAgIGBGaWxlIG5hbWUgY2Fubm90IGNvbnRhaW4gYW55IG9mIHRoZXNlIGNoYXJhY3RlcnM6ICR7SUxMRUdBTF9GSUxFTkFNRV9DSEFSUy5qb2luKFxyXG4gICAgICAgICAgICAgIFwiIFwiXHJcbiAgICAgICAgICAgICl9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MudGhyZWFkaW5nVGVtcGxhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXR0aW5ncy50aHJlYWRpbmdUZW1wbGF0ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRhdGUgRm9ybWF0XCIpXHJcbiAgICAuc2V0RGVzYyhcIlRoZSBkYXRlIGZvcm1hdCB1c2VkIGluIHRoZSBUaHJlYWRpbmcgVGVtcGxhdGUgKHNldHRpbmcgYWJvdmUpXCIpXHJcbiAgICAuYWRkTW9tZW50Rm9ybWF0KChmb3JtYXQpID0+IHtcclxuICAgICAgZm9ybWF0XHJcbiAgICAgICAgLnNldERlZmF1bHRGb3JtYXQoREVGQVVMVF9TRVRUSU5HUy5kYXRlRm9ybWF0KVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5kYXRlRm9ybWF0KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmRhdGVGb3JtYXQgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICBjb25zdCB0aHJlYWREaXJUZW1wbGF0ZXNTZXR0aW5nID0gbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXRDbGFzcyhcInRocmVhZC1kaXItdGVtcGxhdGVzXCIpXHJcbiAgICAuc2V0TmFtZShcIlRlbXBsYXRlciBUZW1wbGF0ZSBwZXIgRGlyZWN0aW9uXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIGBGb3IgZWFjaCBkaXJlY3Rpb24gdG8gYmUgdGhyZWFkIGludG8sIGNob29zZSBhIFRlbXBsYXRlciB0ZW1wbGF0ZSB0byBpbnNlcnQgaW50byB0aGUgbmV3IG5vdGUuPC9icj5cclxuICAgICAgICAgIEdpdmUgdGhlIGJhc2VuYW1lLCBvciB0aGUgZnVsbCBmaWxlIHBhdGggKGUuZy4gPGNvZGU+VGVtcGxhdGVzL1BhcmVudCBUZW1wbGF0ZTwvY29kZT4pLmBcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgRElSRUNUSU9OUy5mb3JFYWNoKChkaXIpID0+XHJcbiAgICB0aHJlYWREaXJUZW1wbGF0ZXNTZXR0aW5nLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihBUlJPV19ESVJFQ1RJT05TW2Rpcl0pXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRocmVhZGluZ0RpclRlbXBsYXRlc1tkaXJdKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy50aHJlYWRpbmdEaXJUZW1wbGF0ZXNbZGlyXSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IEp1Z2dsTGF5b3V0cyB9IGZyb20gXCJqdWdnbC1hcGlcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBpc0luVmF1bHQgfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzXCI7XHJcbmltcG9ydCB7IFRSQUlMX0xFTkdUSFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCBDaGVja2JveGVzIGZyb20gXCIuLi9Db21wb25lbnRzL0NoZWNrYm94ZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBkcmF3VHJhaWwgfSBmcm9tIFwiLi4vVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRyYWlsVmlld1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdmlld0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgdHJhaWxEZXRhaWxzID0gc3ViRGV0YWlscyhcIlRyYWlsL0dyaWQvSnVnZ2xcIiwgdmlld0RldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgQnJlYWRjcnVtYnMgaW4gRWRpdC9MaXZlLVByZXZpZXcgTW9kZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiSXQgYWx3YXlzIHNob3dzIGluIHByZXZpZXcgbW9kZSwgYnV0IHNob3VsZCBpdCBhbHNvIHNob3cgaW4gdGhlIG90aGVyIHR3bz9cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd0JDc0luRWRpdExQTW9kZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc2hvd0JDc0luRWRpdExQTW9kZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIHRyYWlsRGV0YWlscy5jcmVhdGVFbCgnaHInKVxyXG4gIHRyYWlsRGV0YWlscy5jcmVhdGVEaXYoe1xyXG4gICAgY2xzOiBcInNldHRpbmctaXRlbS1uYW1lXCIsXHJcbiAgICB0ZXh0OiBcIkxpbWl0IFRyYWlsIFZpZXcgdG8gb25seSBzaG93IGNlcnRhaW4gZmllbGRzXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDogdHJhaWxEZXRhaWxzLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgcGx1Z2luLFxyXG4gICAgICBzZXR0aW5nTmFtZTogXCJsaW1pdFRyYWlsQ2hlY2tib3hlc1wiLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzLCBcInVwXCIpLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgY29uc3Qgdmlld3NUb1Nob3cgPSBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlZpZXdzIHRvIHNob3dcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIkNob29zZSB3aGljaCBvZiB0aGUgdmlld3MgdG8gc2hvdyBhdCB0aGUgdG9wIG9mIHRoZSBub3RlLiBKdWdnbCBWaWV3IHJlcXVpcmVzIHRoZSBKdWdnbCBwbHVnaW4uXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VG9vbHRpcChcIlRyYWlsIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd1RyYWlsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dUcmFpbCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRUb29sdGlwKFwiR3JpZCB2aWV3XCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnNob3dHcmlkKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dHcmlkID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFRvb2x0aXAoXCJOZXh0L1ByZXZpb3VzIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd1ByZXZOZXh0KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dQcmV2TmV4dCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG5cclxuICBpZiAoYXBwLnBsdWdpbnMucGx1Z2lucy5qdWdnbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB2aWV3c1RvU2hvdy5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VG9vbHRpcChcIkp1Z2dsIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd0p1Z2dsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dKdWdnbCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoJ0dyaWQgdmlldyBkZXB0aCcpXHJcbiAgICAuc2V0RGVzYygnTGltaXQgdGhlIGluaXRpYWwgZGVwdGggb2YgdGhlIGdyaWQgdmlldycpXHJcbiAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+IHtcclxuICAgICAgc2xpZGVyXHJcbiAgICAgICAgLnNldExpbWl0cygwLCAyNSwgMSlcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZ3JpZERlZmF1bHREZXB0aClcclxuICAgICAgICAuc2V0RHluYW1pY1Rvb2x0aXAoKTtcclxuXHJcbiAgICAgIHNsaWRlci5zbGlkZXJFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZ3JpZERlZmF1bHREZXB0aCA9IHNsaWRlci5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcblxyXG4gIG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiSW5kZXggTm90ZShzKVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlRoZSBub3RlIHRoYXQgYWxsIG9mIHlvdXIgb3RoZXIgbm90ZXMgbGVhZCBiYWNrIHRvLiBUaGUgcGFyZW50IG9mIGFsbCB5b3VyIHBhcmVudCBub3Rlcy4gSnVzdCBlbnRlciB0aGUgYmFzZW5hbWUuPC9icj5Zb3UgY2FuIGFsc28gaGF2ZSBtdWx0aXBsZSBpbmRleCBub3RlcyAoY29tbWEtc2VwYXJhdGVkIGxpc3QpLjwvYnI+TGVhdmluZyB0aGlzIGZpZWxkIGVtcHR5IHdpbGwgbWFrZSB0aGUgdHJhaWwgc2hvdyBhbGwgcGF0aHMgZ29pbmcgYXMgZmFyIHVwIHRoZSBwYXJlbnQtdHJlZSBhcyBwb3NzaWJsZS5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiSW5kZXggTm90ZVwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbmRleE5vdGVzLmpvaW4oXCIsIFwiKSk7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHNwbGl0c1swXSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICBzcGxpdHMuZXZlcnkoKGluZGV4KSA9PiBpc0luVmF1bHQoaW5kZXgpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW5kZXhOb3RlcyA9IHNwbGl0cztcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9IGVsc2UgbmV3IE5vdGljZShcIkF0bGVhc3Qgb25lIG9mIHRoZSBub3RlcyBpcyBub3QgaW4geW91ciB2YXVsdFwiKTtcclxuXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaG93cyBhbGwgcGF0aHMgaWYgbm9uZSB0byBpbmRleCBub3RlIGFyZSBmb3VuZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiSWYgeW91IGhhdmUgYW4gaW5kZXggbm90ZSBjaG9zZW4sIGJ1dCB0aGUgdHJhaWwgdmlldyBoYXMgbm8gcGF0aHMgZ29pbmcgdXAgdG8gdGhvc2UgaW5kZXggbm90ZXMsIHNob3VsZCBpdCBzaG93IGFsbCBwYXRocyBpbnN0ZWFkP1wiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QWxsUGF0aHNJZk5vbmVUb0luZGV4Tm90ZSlcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5zaG93QWxsUGF0aHNJZk5vbmVUb0luZGV4Tm90ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQ6IEFsbCwgTG9uZ2VzdCwgb3IgU2hvcnRlc3RcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIklmIG11bHRpcGxlIHBhdGhzIGFyZSBmb3VuZCBnb2luZyB1cCB0aGUgcGFyZW50IHRyZWUsIHdoaWNoIG9mIHRoZW0gc2hvdWxkIHNob3c/XCJcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bihkZCA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fVxyXG4gICAgICBUUkFJTF9MRU5HVEhTLmZvckVhY2gobGVuZ3RoID0+IHtcclxuICAgICAgICBvcHRpb25zW2xlbmd0aF0gPSBsZW5ndGg7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBkZC5hZGRPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QWxsKTtcclxuICAgICAgZGQub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dBbGwgPSB2YWw7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICB9KVxyXG4gICAgfSlcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTZXBlcmF0b3JcIilcclxuICAgIC5zZXREZXNjKGZyYWdXaXRoSFRNTChcclxuICAgICAgXCJUaGUgY2hhcmFjdGVyIHRvIHNob3cgYmV0d2VlbiBjcnVtYnMgaW4gdGhlIGJyZWFkY3J1bWIgdHJhaWwuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPlx1MjE5MjwvY29kZT5cIilcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiXHUyMTkyXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRyYWlsU2VwZXJhdG9yKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnRyYWlsU2VwZXJhdG9yID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJObyBwYXRoIGZvdW5kIG1lc3NhZ2VcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlRoZSB0ZXh0IHRvIGRpc3BsYXkgd2hlbiBubyBwYXRoIHRvIHRoZSBpbmRleCBub3RlIGlzIGZvdW5kLCBvciB0aGUgY3VycmVudCBub3RlIGhhcyBubyBwYXJlbnQuXCJcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiTm8gcGF0aCB0byBpbmRleCBub3RlIHdhcyBmb3VuZFwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5ub1BhdGhNZXNzYWdlKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLm5vUGF0aE1lc3NhZ2UgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlJlc3BlY3QgUmVhZGFibGUgTGluZSBMZW5ndGhcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlNob3VsZCB0aGUgYnJlYWRjcnVtYnMgdHJhaWwgYWRqdXN0IGl0cyB3aWR0aCB0byB0aGUgcmVhZGFibGUgbGluZSBsZW5ndGgsIG9yIHVzZSBhcyBtdWNoIHNwYWNlIGFzIHBvc3NpYmxlPyBcdTI3MDUgPSB1c2UgcmVhZGFibGUgbGluZSBsZW5ndGguXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGgpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MucmVzcGVjdFJlYWRhYmxlTGluZUxlbmd0aCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgdXAgZmllbGRzIGluIEp1Z2dsXCIpXHJcbiAgICAuc2V0RGVzYyhcIkp1Z2dsIHdpbGwgc2hvdyBib3RoIHVwIGFuZCBkb3duIGZpZWxkc1wiKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93VXBJbkp1Z2dsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dVcEluSnVnZ2wgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkp1Z2dsIHZpZXcgbGF5b3V0XCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiVGhlIGxheW91dCB0eXBlIHRvIHVzZSBmb3IgdGhlIEp1Z2dsIHZpZXcuPGJyPlRoZSBoaWVyYXJjaHkgbGF5b3V0IGlzIG1vc3QgbmF0dXJhbCBmb3IgQnJlYWRjcnVtYnMsIGJ1dCBmb3IgbGFyZ2UgZ3JhcGhzIEQzIEZvcmNlIGlzIHJlY29tbWVuZGVkLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGM6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGRjLmFkZE9wdGlvbihcImhpZXJhcmNoeVwiLCBcIkhpZXJhcmNoeVwiKTtcclxuICAgICAgZGMuYWRkT3B0aW9uKFwiZDMtZm9yY2VcIiwgXCJEMyBGb3JjZVwiKTtcclxuICAgICAgZGMuYWRkT3B0aW9uKFwiY29sYVwiLCBcIkNvbGEgRm9yY2VcIik7XHJcbiAgICAgIGRjLmFkZE9wdGlvbihcImdyaWRcIiwgXCJHcmlkXCIpO1xyXG4gICAgICBkYy5hZGRPcHRpb24oXCJjb25jZW50cmljXCIsIFwiQ29uY2VudHJpY1wiKTtcclxuXHJcbiAgICAgIGRjLnNldFZhbHVlKHNldHRpbmdzLmp1Z2dsTGF5b3V0KTtcclxuICAgICAgZGMub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuanVnZ2xMYXlvdXQgPSB2YWx1ZSBhcyBKdWdnbExheW91dHM7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBBTExVTkxJTktFRCwgUkVBbENMT1NFRCwgUkVMQVRJT05TLCBWSVNUWVBFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBSZWxhdGlvbnMsIFZpc1R5cGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVmlzTW9kYWxTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHZpc01vZGFsRGV0YWlscyA9IHN1YkRldGFpbHMoXCJWaXN1YWxpc2F0aW9uIE1vZGFsXCIsIHZpZXdEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcodmlzTW9kYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IFZpc3VhbGlzYXRpb24gVHlwZVwiKVxyXG4gICAgLnNldERlc2MoXCJXaGljaCB2aXN1YWxpc2F0aW9uIHRvIHNob3cgYnkgZGVmYXVsdFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChjYjogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgVklTVFlQRVMuZm9yRWFjaCgob3B0aW9uOiBWaXNUeXBlKSA9PiB7XHJcbiAgICAgICAgY2IuYWRkT3B0aW9uKG9wdGlvbiwgb3B0aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNiLnNldFZhbHVlKHNldHRpbmdzLnZpc0dyYXBoKTtcclxuXHJcbiAgICAgIGNiLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogVmlzVHlwZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnZpc0dyYXBoID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHZpc01vZGFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBSZWxhdGlvblwiKVxyXG4gICAgLnNldERlc2MoXCJXaGljaCByZWxhdGlvbiB0eXBlIHRvIHNob3cgZmlyc3Qgd2hlbiBvcGVuaW5nIHRoZSBtb2RhbFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZCkgPT4ge1xyXG4gICAgICBSRUxBVElPTlMuZm9yRWFjaCgob3B0aW9uOiBSZWxhdGlvbnMpID0+IHtcclxuICAgICAgICBkZC5hZGRPcHRpb24ob3B0aW9uLCBvcHRpb24pO1xyXG4gICAgICB9KTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MudmlzUmVsYXRpb24pO1xyXG5cclxuICAgICAgZGQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBSZWxhdGlvbnMpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNSZWxhdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICBuZXcgU2V0dGluZyh2aXNNb2RhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgUmVhbC9DbG9zZWRcIilcclxuICAgIC5zZXREZXNjKFwiU2hvdyB0aGUgcmVhbCBvciBjbG9zZWQgZ3JhcGggYnkgZGVmYXVsdFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChjYjogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgUkVBbENMT1NFRC5mb3JFYWNoKChvcHRpb246IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNiLmFkZE9wdGlvbihvcHRpb24sIG9wdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjYi5zZXRWYWx1ZShzZXR0aW5ncy52aXNDbG9zZWQpO1xyXG5cclxuICAgICAgY2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNDbG9zZWQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgbmV3IFNldHRpbmcodmlzTW9kYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IFVubGlua2VkXCIpXHJcbiAgICAuc2V0RGVzYyhcIlNob3cgYWxsIG5vZGVzIG9yIG9ubHkgdGhvc2Ugd2hpY2ggaGF2ZSBsaW5rcyBieSBkZWZhdWx0XCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGNiOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBBTExVTkxJTktFRC5mb3JFYWNoKChvcHRpb246IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNiLmFkZE9wdGlvbihvcHRpb24sIG9wdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjYi5zZXRWYWx1ZShzZXR0aW5ncy52aXNBbGwpO1xyXG5cclxuICAgICAgY2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNBbGwgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IENoZWNrYm94ZXMgZnJvbSBcIi4uL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGVcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRXcml0ZUJDc1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgY21kc0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3Qgd3JpdGVCQ3NUb0ZpbGVEZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiV3JpdGUgQnJlYWRjcnVtYnMgdG8gRmlsZVwiLFxyXG4gICAgY21kc0RldGFpbHNcclxuICApO1xyXG5cclxuICB3cml0ZUJDc1RvRmlsZURldGFpbHMuY3JlYXRlRGl2KHtcclxuICAgIGNsczogXCJzZXR0aW5nLWl0ZW0tbmFtZVwiLFxyXG4gICAgdGV4dDogXCJMaW1pdCB0byBvbmx5IHdyaXRlIGNlcnRhaW4gZmllbGRzXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDogd3JpdGVCQ3NUb0ZpbGVEZXRhaWxzLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgcGx1Z2luLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKSxcclxuICAgICAgc2V0dGluZ05hbWU6IFwibGltaXRXcml0ZUJDQ2hlY2tib3hlc1wiLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcod3JpdGVCQ3NUb0ZpbGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJXcml0ZSBJbmxpbmVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIldoZW4gd3JpdGluZyBCQ3MgdG8gZmlsZSwgc2hvdWxkIHRoZXkgYmUgd3JpdHRlbiBpbmxpbmUgKHVzaW5nIERhdGF2aWV3IHN5bnRheCksIG9yIGludG8gdGhlIFlBTUwgb2YgdGhlIG5vdGU/XCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLndyaXRlQkNzSW5saW5lKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy53cml0ZUJDc0lubGluZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHdyaXRlQkNzVG9GaWxlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTaG93IHRoZSA8Y29kZT5Xcml0ZSBCcmVhZGNydW1icyB0byBBTEwgRmlsZXM8L2NvZGU+IGNvbW1hbmRcIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJUaGlzIGNvbW1hbmQgYXR0ZW1wdHMgdG8gdXBkYXRlIEFMTCBmaWxlcyB3aXRoIGltcGxpZWQgYnJlYWRjcnVtYnMgcG9pbnRpbmcgdG8gdGhlbS4gU28sIGl0IGlzIG5vdCBzaG93biBieSBkZWZhdWx0IChldmVuIHRob3VnaCBpdCBoYXMgMyBjb25maXJtYXRpb24gYm94ZXMgdG8gZW5zdXJlIHlvdSB3YW50IHRvIHJ1biBpdFwiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93V3JpdGVBbGxCQ3NDbWQpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dXcml0ZUFsbEJDc0NtZCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIiwgImltcG9ydCB7IEl0ZW1WaWV3LCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCBEdWNrcyBmcm9tIFwiLi4vQ29tcG9uZW50cy9EdWNrcy5zdmVsdGVcIjtcclxuaW1wb3J0IHsgRFVDS19JQ09OLCBEVUNLX1ZJRVcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEdWNrc1ZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XHJcbiAgcHJpdmF0ZSBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHByaXZhdGUgdmlldzogRHVja3M7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxlYWY6IFdvcmtzcGFjZUxlYWYsIHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGxlYWYpO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBzdXBlci5vbmxvYWQoKTtcclxuICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgdGhpcy5kcmF3KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFZpZXdUeXBlKCkge1xyXG4gICAgcmV0dXJuIERVQ0tfVklFVztcclxuICB9XHJcbiAgZ2V0RGlzcGxheVRleHQoKSB7XHJcbiAgICByZXR1cm4gXCJCcmVhZGNydW1icyBEdWNrc1wiO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyBEdWNrIGljb25cclxuICBpY29uID0gRFVDS19JQ09OO1xyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7IH1cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIHRoaXMudmlldyA9IG5ldyBEdWNrcyh7XHJcbiAgICAgIHRhcmdldDogdGhpcy5jb250ZW50RWwsXHJcbiAgICAgIHByb3BzOiB7IHBsdWdpbjogdGhpcy5wbHVnaW4sIGR1Y2tzVmlldzogdGhpcyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICI8c2NyaXB0PlxuICAgICAgICBpbXBvcnQgSWNvbkJhc2UgZnJvbSAnLi4vY29tcG9uZW50cy9JY29uQmFzZS5zdmVsdGUnO1xuICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPEljb25CYXNlIHZpZXdCb3g9XCIwIDAgMTkyIDUxMlwiIHsuLi4kJHByb3BzfT5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIwIDQyNC4yMjloMjBWMjc5Ljc3MUgyMGMtMTEuMDQ2IDAtMjAtOC45NTQtMjAtMjBWMjEyYzAtMTEuMDQ2IDguOTU0LTIwIDIwLTIwaDExMmMxMS4wNDYgMCAyMCA4Ljk1NCAyMCAyMHYyMTIuMjI5aDIwYzExLjA0NiAwIDIwIDguOTU0IDIwIDIwVjQ5MmMwIDExLjA0Ni04Ljk1NCAyMC0yMCAyMEgyMGMtMTEuMDQ2IDAtMjAtOC45NTQtMjAtMjB2LTQ3Ljc3MWMwLTExLjA0NiA4Ljk1NC0yMCAyMC0yMHpNOTYgMEM1Ni4yMzUgMCAyNCAzMi4yMzUgMjQgNzJzMzIuMjM1IDcyIDcyIDcyIDcyLTMyLjIzNSA3Mi03MlMxMzUuNzY0IDAgOTYgMHpcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgaG92ZXJQcmV2aWV3LCBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG4gIGltcG9ydCBGYUluZm8gZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYUluZm8uc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuICBpbXBvcnQgdHlwZSBEdWNrc1ZpZXcgZnJvbSBcIi4uL1ZpZXdzL0R1Y2tzVmlld1wiO1xyXG5cclxuICBleHBvcnQgbGV0IHBsdWdpbjogQkNQbHVnaW47XHJcbiAgZXhwb3J0IGxldCBkdWNrc1ZpZXc6IER1Y2tzVmlldztcclxuXHJcbiAgY29uc3QgeyBtYWluRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGZpbGVzID0gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuXHJcbiAgbGV0IHF1ZXJ5OiBzdHJpbmcgPSBcIlwiO1xyXG4gIGxldCByZWdleCA9IG5ldyBSZWdFeHAocXVlcnksIFwiZ1wiKTtcclxuICBsZXQgaW5jbHVkZSA9IHRydWU7XHJcblxyXG4gICQ6IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG5ld1JlZyA9IG5ldyBSZWdFeHAocXVlcnksIFwiZ1wiKTtcclxuICAgICAgcmVnZXggPSBuZXdSZWc7XHJcbiAgICB9IGNhdGNoIChlKSB7fVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZ2V0RHVja3MgPSAocmVnZXg6IFJlZ0V4cCkgPT4ge1xyXG4gICAgaWYgKCFyZWdleCkgcmV0dXJuO1xyXG4gICAgcmV0dXJuIGZpbGVzXHJcbiAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUuYmFzZW5hbWUpXHJcbiAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgKG5hbWUpID0+ICFtYWluRy5uZWlnaGJvcnMobmFtZSkubGVuZ3RoICYmIGluY2x1ZGUgPT09IHJlZ2V4LnRlc3QobmFtZSlcclxuICAgICAgKTtcclxuICB9O1xyXG5cclxuICAkOiBkdWNrcyA9IGdldER1Y2tzKHJlZ2V4KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2IGNsYXNzPVwiQkMtRHVja3MgbWFya2Rvd24tcHJldmlldy12aWV3XCI+XHJcbiAgPGg2Pk5vdGVzIHdpdGhvdXQgQnJlYWRjcnVtYnM8L2g2PlxyXG4gIDxzcGFuXHJcbiAgICBjbGFzcz1cImljb25cIlxyXG4gICAgYXJpYS1sYWJlbD17YEEgUmVnZXggdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXFxuSWYgJ0luY2x1ZGUnIGlzIGNoZWNrZWQsIGl0IHdpbGwgb25seSBzaG93IG5vdGVzIHRoYXQgbWF0Y2ggdGhlIHJlZ2V4LlxcbklmICdJbmNsdWRlJyBpcyBub3QgY2hlY2tlZCwgdGhpcyByZWdleCB3aWxsIGZpbHRlciBvdXQgbm90ZXMgdGhhdCBtYXRjaCBpdC5gfVxyXG4gID5cclxuICAgIDxGYUluZm8gLz5cclxuICA8L3NwYW4+XHJcbiAgPGxhYmVsPlxyXG4gICAgRmlsdGVyOlxyXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJSZWdleFwiIGJpbmQ6dmFsdWU9e3F1ZXJ5fSAvPlxyXG4gIDwvbGFiZWw+XHJcbiAgPGlucHV0IGFyaWEtbGFiZWw9XCJJbmNsdWRlXCIgdHlwZT1cImNoZWNrYm94XCIgYmluZDpjaGVja2VkPXtpbmNsdWRlfSAvPlxyXG5cclxuICB7I2VhY2ggZHVja3MgYXMgZHVja31cclxuICAgIDxkaXZcclxuICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2goZHVjaywgZSl9XHJcbiAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBkdWNrc1ZpZXcsIGR1Y2spfVxyXG4gICAgPlxyXG4gICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1taXNzaW5nLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgPGEgY2xhc3M9XCJpbnRlcm5hbC1saW5rXCI+e2R1Y2t9PC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuaWNvbiB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgcGFkZGluZy10b3A6IDVweCAhaW1wb3J0YW50O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgYWRkRmVhdGhlckljb24gfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgU2lkZVRyZWUgZnJvbSBcIi4uL0NvbXBvbmVudHMvU2lkZVRyZWUuc3ZlbHRlXCI7XHJcbmltcG9ydCB7IFRSRUVfVklFVyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uLy4uL21haW5cIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyZWVWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xyXG4gIHByaXZhdGUgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBwcml2YXRlIHZpZXc6IFNpZGVUcmVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihsZWFmKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgc3VwZXIub25sb2FkKCk7XHJcbiAgICBhcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmRyYXcoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld1R5cGUoKSB7XHJcbiAgICByZXR1cm4gVFJFRV9WSUVXO1xyXG4gIH1cclxuICBnZXREaXNwbGF5VGV4dCgpIHtcclxuICAgIHJldHVybiBcIkJyZWFkY3J1bWJzIERvd25cIjtcclxuICB9XHJcblxyXG4gIGljb24gPSBhZGRGZWF0aGVySWNvbihcImNvcm5lci1yaWdodC1kb3duXCIpIGFzIHN0cmluZztcclxuXHJcbiAgYXN5bmMgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge31cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIHRoaXMudmlldyA9IG5ldyBTaWRlVHJlZSh7XHJcbiAgICAgIHRhcmdldDogdGhpcy5jb250ZW50RWwsXHJcbiAgICAgIHByb3BzOiB7IHBsdWdpbjogdGhpcy5wbHVnaW4sIHZpZXc6IHRoaXMgfSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgeyBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbiAgaW1wb3J0IHtcclxuICAgIGhvdmVyUHJldmlldyxcclxuICAgIGlzSW5WYXVsdCxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbiAgaW1wb3J0IEZhRmlyZSBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhRmlyZS5zdmVsdGVcIjtcclxuICBpbXBvcnQgRmFSZWdTbm93Zmxha2UgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVJlZ1Nub3dmbGFrZS5zdmVsdGVcIjtcclxuICBpbXBvcnQgeyBjcmVhdGVJbmRleCwgaW5kZXhUb0xpbmVQYWlycyB9IGZyb20gXCIuLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG4gIGltcG9ydCB7IERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBEaXJlY3Rpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuICBpbXBvcnQgeyBkcm9wRGVuZHJvbiB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBkZnNBbGxQYXRocywgZ2V0U3ViSW5EaXJzIH0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBUcmVlVmlldyBmcm9tIFwiLi4vVmlld3MvVHJlZVZpZXdcIjtcclxuICBpbXBvcnQgeyBnZXRDdXJyRmlsZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBleHBvcnQgbGV0IHZpZXc6IFRyZWVWaWV3O1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzLCBhcHAsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IGNyZWF0ZUluZGV4SW5kZW50IH0gPSBzZXR0aW5ncztcclxuXHJcbiAgbGV0IGRpcjogRGlyZWN0aW9ucyA9IFwiZG93blwiO1xyXG4gIGxldCBmcm96ZW4gPSBmYWxzZTtcclxuICBsZXQgeyBiYXNlbmFtZSB9ID0gZ2V0Q3VyckZpbGUoKSA/PyB7fTtcclxuXHJcbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXHJcbiAgICBhcHAud29ya3NwYWNlLm9uKFwiYWN0aXZlLWxlYWYtY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgaWYgKGZyb3plbikgcmV0dXJuO1xyXG4gICAgICBiYXNlbmFtZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBsZXQgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICAkOiB7XHJcbiAgICBjb25zdCBkaXJHID0gZ2V0U3ViSW5EaXJzKGNsb3NlZEcsIGRpcik7XHJcbiAgICBjb25zdCBhbGxQYXRocyA9IGRmc0FsbFBhdGhzKGRpckcsIGJhc2VuYW1lKTtcclxuICAgIGNvbnN0IGluZGV4ID0gY3JlYXRlSW5kZXgoYWxsUGF0aHMsIGZhbHNlLCBjcmVhdGVJbmRleEluZGVudCk7XHJcbiAgICBpbmZvKHsgYWxsUGF0aHMsIGluZGV4IH0pO1xyXG5cclxuICAgIGxpbmVzID0gaW5kZXhUb0xpbmVQYWlycyhpbmRleCk7XHJcbiAgfVxyXG48L3NjcmlwdD5cclxuXHJcbjwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LXVua25vd24tYXJpYS1hdHRyaWJ1dGUgLS0+XHJcbjxzcGFuXHJcbiAgY2xhc3M9XCJpY29uXCJcclxuICBhcmlhLWxhYmVsPXtmcm96ZW4gPyBgRnJvemVuIG9uOiAke2Jhc2VuYW1lfWAgOiBcIlVuZnJvemVuXCJ9XHJcbiAgYXJpYS1sYWJlbC1wb3NpdGlvbj1cImxlZnRcIlxyXG4gIG9uOmNsaWNrPXsoKSA9PiB7XHJcbiAgICBmcm96ZW4gPSAhZnJvemVuO1xyXG4gICAgaWYgKCFmcm96ZW4pIGJhc2VuYW1lID0gZ2V0Q3VyckZpbGUoKT8uYmFzZW5hbWU7XHJcbiAgfX1cclxuPlxyXG4gIHsjaWYgZnJvemVufVxyXG4gICAgPEZhUmVnU25vd2ZsYWtlIC8+XHJcbiAgezplbHNlfVxyXG4gICAgPEZhRmlyZSAvPlxyXG4gIHsvaWZ9XHJcbjwvc3Bhbj5cclxuXHJcbjxidXR0b25cclxuICBhcmlhLWxhYmVsPVwiUmVmcmVzaCBTdGF0cyBWaWV3IChhbHNvIHJlZnJlc2hlcyBCcmVhZGNydW1icyBJbmRleClcIlxyXG4gIG9uOmNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgIGF3YWl0IHZpZXcuZHJhdygpO1xyXG4gIH19XHJcbj5cclxuICBcdTIxQkJcclxuPC9idXR0b24+XHJcblxyXG48c2VsZWN0IGNsYXNzPVwiZHJvcGRvd25cIiBiaW5kOnZhbHVlPXtkaXJ9PlxyXG4gIHsjZWFjaCBESVJFQ1RJT05TIGFzIGRpcmVjdGlvbn1cclxuICAgIDxvcHRpb24gdmFsdWU9e2RpcmVjdGlvbn0+e2RpcmVjdGlvbn08L29wdGlvbj5cclxuICB7L2VhY2h9XHJcbjwvc2VsZWN0PlxyXG5cclxuPGRpdiBjbGFzcz1cIkJDLWRvd25zXCI+XHJcbiAgeyNlYWNoIGxpbmVzIGFzIGxpbmV9XHJcbiAgICB7I2lmIGxpbmUubGVuZ3RoID4gMX1cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8cHJlPntsaW5lWzBdICsgXCItXCJ9PC9wcmU+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgIGNsYXNzPVwiaW50ZXJuYWwtbGlua1wiXHJcbiAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaChsaW5lWzFdLCBlKX1cclxuICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCB2aWV3LCBsaW5lWzFdKX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1taXNzaW5nLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgICAgIDxhIGNsYXNzPVwiaW50ZXJuYWwtbGluayB7aXNJblZhdWx0KGxpbmVbMV0pID8gJycgOiAnaXMtdW5yZXNvbHZlZCd9XCJcclxuICAgICAgICAgICAgPntkcm9wRGVuZHJvbihsaW5lWzFdLCBzZXR0aW5ncyl9PC9hXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIHsvaWZ9XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBidXR0b24ge1xyXG4gICAgZGlzcGxheTogaW5saW5lO1xyXG4gICAgcGFkZGluZzogMXB4IDZweCAycHggNnB4O1xyXG4gIH1cclxuXHJcbiAgLkJDLWRvd25zIHtcclxuICAgIHBhZGRpbmctbGVmdDogNXB4O1xyXG4gIH1cclxuICBwcmUge1xyXG4gICAgZGlzcGxheTogaW5saW5lO1xyXG4gIH1cclxuXHJcbiAgLmlzLXVucmVzb2x2ZWQge1xyXG4gICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLmljb24ge1xyXG4gICAgY29sb3I6IHZhcigtLXRleHQtbm9ybWFsKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIHBhZGRpbmctdG9wOiA1cHggIWltcG9ydGFudDtcclxuICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgaGVpZ2h0OiAyMHB4O1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCAzODQgNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMjE2IDIzLjg2YzAtMjMuOC0zMC42NS0zMi43Ny00NC4xNS0xMy4wNEM0OCAxOTEuODUgMjI0IDIwMCAyMjQgMjg4YzAgMzUuNjMtMjkuMTEgNjQuNDYtNjQuODUgNjMuOTktMzUuMTctLjQ1LTYzLjE1LTI5Ljc3LTYzLjE1LTY0Ljk0di04NS41MWMwLTIxLjctMjYuNDctMzIuMjMtNDEuNDMtMTYuNUMyNy44IDIxMy4xNiAwIDI2MS4zMyAwIDMyMGMwIDEwNS44NyA4Ni4xMyAxOTIgMTkyIDE5MnMxOTItODYuMTMgMTkyLTE5MmMwLTE3MC4yOS0xNjgtMTkzLTE2OC0yOTYuMTR6XCIgLz5cbiAgICAgICAgPC9JY29uQmFzZT5cbiAgICAgICIsICI8c2NyaXB0PlxuICAgICAgICBpbXBvcnQgSWNvbkJhc2UgZnJvbSAnLi4vY29tcG9uZW50cy9JY29uQmFzZS5zdmVsdGUnO1xuICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPEljb25CYXNlIHZpZXdCb3g9XCIwIDAgNDQ4IDUxMlwiIHsuLi4kJHByb3BzfT5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQ0MC4xIDM1NS4ybC0zOS4yLTIzIDM0LjEtOS4zYzguNC0yLjMgMTMuNC0xMS4xIDExLjEtMTkuNmwtNC4xLTE1LjVjLTIuMi04LjUtMTAuOS0xMy42LTE5LjMtMTEuM0wzNDMgMjk4LjIgMjcxLjIgMjU2bDcxLjktNDIuMiA3OS43IDIxLjdjOC40IDIuMyAxNy0yLjggMTkuMy0xMS4zbDQuMS0xNS41YzIuMi04LjUtMi43LTE3LjMtMTEuMS0xOS42bC0zNC4xLTkuMyAzOS4yLTIzYzcuNS00LjQgMTAuMS0xNC4yIDUuOC0yMS45bC03LjktMTMuOWMtNC4zLTcuNy0xNC0xMC4zLTIxLjUtNS45bC0zOS4yIDIzIDkuMS0zNC43YzIuMi04LjUtMi43LTE3LjMtMTEuMS0xOS42bC0xNS4yLTQuMWMtOC40LTIuMy0xNyAyLjgtMTkuMyAxMS4zbC0yMS4zIDgxLTcxLjkgNDIuMnYtODQuNUwzMDYgNzAuNGM2LjEtNi4yIDYuMS0xNi40IDAtMjIuNmwtMTEuMS0xMS4zYy02LjEtNi4yLTE2LjEtNi4yLTIyLjIgMGwtMjQuOSAyNS40VjE2YzAtOC44LTctMTYtMTUuNy0xNmgtMTUuN2MtOC43IDAtMTUuNyA3LjItMTUuNyAxNnY0Ni4xbC0yNC45LTI1LjRjLTYuMS02LjItMTYuMS02LjItMjIuMiAwTDE0Mi4xIDQ4Yy02LjEgNi4yLTYuMSAxNi40IDAgMjIuNmw1OC4zIDU5LjN2ODQuNWwtNzEuOS00Mi4yLTIxLjMtODFjLTIuMi04LjUtMTAuOS0xMy42LTE5LjMtMTEuM0w3Mi43IDg0Yy04LjQgMi4zLTEzLjQgMTEuMS0xMS4xIDE5LjZsOS4xIDM0LjctMzkuMi0yM2MtNy41LTQuNC0xNy4xLTEuOC0yMS41IDUuOWwtNy45IDEzLjljLTQuMyA3LjctMS44IDE3LjQgNS44IDIxLjlsMzkuMiAyMy0zNC4xIDkuMWMtOC40IDIuMy0xMy40IDExLjEtMTEuMSAxOS42TDYgMjI0LjJjMi4yIDguNSAxMC45IDEzLjYgMTkuMyAxMS4zbDc5LjctMjEuNyA3MS45IDQyLjItNzEuOSA0Mi4yLTc5LjctMjEuN2MtOC40LTIuMy0xNyAyLjgtMTkuMyAxMS4zbC00LjEgMTUuNWMtMi4yIDguNSAyLjcgMTcuMyAxMS4xIDE5LjZsMzQuMSA5LjMtMzkuMiAyM2MtNy41IDQuNC0xMC4xIDE0LjItNS44IDIxLjlMMTAgMzkxYzQuMyA3LjcgMTQgMTAuMyAyMS41IDUuOWwzOS4yLTIzLTkuMSAzNC43Yy0yLjIgOC41IDIuNyAxNy4zIDExLjEgMTkuNmwxNS4yIDQuMWM4LjQgMi4zIDE3LTIuOCAxOS4zLTExLjNsMjEuMy04MSA3MS45LTQyLjJ2ODQuNWwtNTguMyA1OS4zYy02LjEgNi4yLTYuMSAxNi40IDAgMjIuNmwxMS4xIDExLjNjNi4xIDYuMiAxNi4xIDYuMiAyMi4yIDBsMjQuOS0yNS40VjQ5NmMwIDguOCA3IDE2IDE1LjcgMTZoMTUuN2M4LjcgMCAxNS43LTcuMiAxNS43LTE2di00Ni4xbDI0LjkgMjUuNGM2LjEgNi4yIDE2LjEgNi4yIDIyLjIgMGwxMS4xLTExLjNjNi4xLTYuMiA2LjEtMTYuNCAwLTIyLjZsLTU4LjMtNTkuM3YtODQuNWw3MS45IDQyLjIgMjEuMyA4MWMyLjIgOC41IDEwLjkgMTMuNiAxOS4zIDExLjNMMzc1IDQyOGM4LjQtMi4zIDEzLjQtMTEuMSAxMS4xLTE5LjZsLTkuMS0zNC43IDM5LjIgMjNjNy41IDQuNCAxNy4xIDEuOCAyMS41LTUuOWw3LjktMTMuOWM0LjYtNy41IDIuMS0xNy4zLTUuNS0yMS43elwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCAiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZikge1xuICBsZXQgZGVsdGEgPSBmO1xuICBsZXQgY29tcGFyZSA9IGY7XG5cbiAgaWYgKGYubGVuZ3RoID09PSAxKSB7XG4gICAgZGVsdGEgPSAoZCwgeCkgPT4gZihkKSAtIHg7XG4gICAgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoZik7XG4gIH1cblxuICBmdW5jdGlvbiBsZWZ0KGEsIHgsIGxvLCBoaSkge1xuICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7XG4gICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7XG4gICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7XG4gICAgICBlbHNlIGhpID0gbWlkO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiByaWdodChhLCB4LCBsbywgaGkpIHtcbiAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwO1xuICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoO1xuICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7XG4gICAgICBlbHNlIGxvID0gbWlkICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIGxvO1xuICB9XG5cbiAgZnVuY3Rpb24gY2VudGVyKGEsIHgsIGxvLCBoaSkge1xuICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7XG4gICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7XG4gICAgY29uc3QgaSA9IGxlZnQoYSwgeCwgbG8sIGhpIC0gMSk7XG4gICAgcmV0dXJuIGkgPiBsbyAmJiBkZWx0YShhW2kgLSAxXSwgeCkgPiAtZGVsdGEoYVtpXSwgeCkgPyBpIC0gMSA6IGk7XG4gIH1cblxuICByZXR1cm4ge2xlZnQsIGNlbnRlciwgcmlnaHR9O1xufVxuXG5mdW5jdGlvbiBhc2NlbmRpbmdDb21wYXJhdG9yKGYpIHtcbiAgcmV0dXJuIChkLCB4KSA9PiBhc2NlbmRpbmcoZihkKSwgeCk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24qIG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gXCIuL2Jpc2VjdG9yLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG5jb25zdCBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuZXhwb3J0IGNvbnN0IGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDtcbmV4cG9ydCBjb25zdCBiaXNlY3RDZW50ZXIgPSBiaXNlY3RvcihudW1iZXIpLmNlbnRlcjtcbmV4cG9ydCBkZWZhdWx0IGJpc2VjdFJpZ2h0O1xuIiwgInZhciBlMTAgPSBNYXRoLnNxcnQoNTApLFxuICAgIGU1ID0gTWF0aC5zcXJ0KDEwKSxcbiAgICBlMiA9IE1hdGguc3FydCgyKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RhcnQsIHN0b3AsIGNvdW50KSB7XG4gIHZhciByZXZlcnNlLFxuICAgICAgaSA9IC0xLFxuICAgICAgbixcbiAgICAgIHRpY2tzLFxuICAgICAgc3RlcDtcblxuICBzdG9wID0gK3N0b3AsIHN0YXJ0ID0gK3N0YXJ0LCBjb3VudCA9ICtjb3VudDtcbiAgaWYgKHN0YXJ0ID09PSBzdG9wICYmIGNvdW50ID4gMCkgcmV0dXJuIFtzdGFydF07XG4gIGlmIChyZXZlcnNlID0gc3RvcCA8IHN0YXJ0KSBuID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9IG47XG4gIGlmICgoc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KSkgPT09IDAgfHwgIWlzRmluaXRlKHN0ZXApKSByZXR1cm4gW107XG5cbiAgaWYgKHN0ZXAgPiAwKSB7XG4gICAgbGV0IHIwID0gTWF0aC5yb3VuZChzdGFydCAvIHN0ZXApLCByMSA9IE1hdGgucm91bmQoc3RvcCAvIHN0ZXApO1xuICAgIGlmIChyMCAqIHN0ZXAgPCBzdGFydCkgKytyMDtcbiAgICBpZiAocjEgKiBzdGVwID4gc3RvcCkgLS1yMTtcbiAgICB0aWNrcyA9IG5ldyBBcnJheShuID0gcjEgLSByMCArIDEpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChyMCArIGkpICogc3RlcDtcbiAgfSBlbHNlIHtcbiAgICBzdGVwID0gLXN0ZXA7XG4gICAgbGV0IHIwID0gTWF0aC5yb3VuZChzdGFydCAqIHN0ZXApLCByMSA9IE1hdGgucm91bmQoc3RvcCAqIHN0ZXApO1xuICAgIGlmIChyMCAvIHN0ZXAgPCBzdGFydCkgKytyMDtcbiAgICBpZiAocjEgLyBzdGVwID4gc3RvcCkgLS1yMTtcbiAgICB0aWNrcyA9IG5ldyBBcnJheShuID0gcjEgLSByMCArIDEpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChyMCArIGkpIC8gc3RlcDtcbiAgfVxuXG4gIGlmIChyZXZlcnNlKSB0aWNrcy5yZXZlcnNlKCk7XG5cbiAgcmV0dXJuIHRpY2tzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgdmFyIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDAsIGNvdW50KSxcbiAgICAgIHBvd2VyID0gTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwKSAvIE1hdGguTE4xMCksXG4gICAgICBlcnJvciA9IHN0ZXAgLyBNYXRoLnBvdygxMCwgcG93ZXIpO1xuICByZXR1cm4gcG93ZXIgPj0gMFxuICAgICAgPyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKSAqIE1hdGgucG93KDEwLCBwb3dlcilcbiAgICAgIDogLU1hdGgucG93KDEwLCAtcG93ZXIpIC8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgdmFyIHN0ZXAwID0gTWF0aC5hYnMoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDAsIGNvdW50KSxcbiAgICAgIHN0ZXAxID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcDApIC8gTWF0aC5MTjEwKSksXG4gICAgICBlcnJvciA9IHN0ZXAwIC8gc3RlcDE7XG4gIGlmIChlcnJvciA+PSBlMTApIHN0ZXAxICo9IDEwO1xuICBlbHNlIGlmIChlcnJvciA+PSBlNSkgc3RlcDEgKj0gNTtcbiAgZWxzZSBpZiAoZXJyb3IgPj0gZTIpIHN0ZXAxICo9IDI7XG4gIHJldHVybiBzdG9wIDwgc3RhcnQgPyAtc3RlcDEgOiBzdGVwMTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgc3RhcnQgPSArc3RhcnQsIHN0b3AgPSArc3RvcCwgc3RlcCA9IChuID0gYXJndW1lbnRzLmxlbmd0aCkgPCAyID8gKHN0b3AgPSBzdGFydCwgc3RhcnQgPSAwLCAxKSA6IG4gPCAzID8gMSA6ICtzdGVwO1xuXG4gIHZhciBpID0gLTEsXG4gICAgICBuID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCkpIHwgMCxcbiAgICAgIHJhbmdlID0gbmV3IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgcmFuZ2VbaV0gPSBzdGFydCArIGkgKiBzdGVwO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufVxuIiwgInZhciBub29wID0ge3ZhbHVlOiAoKSA9PiB7fX07XG5cbmZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkge1xuICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyBcIlwiKSB8fCAodCBpbiBfKSB8fCAvW1xccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIHR5cGU6IFwiICsgdCk7XG4gICAgX1t0XSA9IFtdO1xuICB9XG4gIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7XG59XG5cbmZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgdGhpcy5fID0gXztcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdCk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbkRpc3BhdGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF8gPSB0aGlzLl8sXG4gICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICB0LFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS5cbiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjYWxsYmFjazogXCIgKyBjYWxsYmFjayk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7XG4gICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXztcbiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgfSxcbiAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkge1xuICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTtcbiAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3BhdGNoO1xuIiwgImV4cG9ydCB2YXIgeGh0bWwgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzdmc6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgeGh0bWw6IHhodG1sLFxuICB4bGluazogXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gIHhtbDogXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy9cIlxufTtcbiIsICJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCAiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi9uYW1lc3BhY2UuanNcIjtcbmltcG9ydCB7eGh0bWx9IGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZnVuY3Rpb24gY3JlYXRvckluaGVyaXQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LFxuICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTtcbiAgICByZXR1cm4gdXJpID09PSB4aHRtbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSB4aHRtbFxuICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSlcbiAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCBuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRvckZpeGVkKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbFxuICAgICAgPyBjcmVhdG9yRml4ZWRcbiAgICAgIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTtcbn1cbiIsICJmdW5jdGlvbiBub25lKCkge31cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4geFxuICAgID8geCAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oeCk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCAiZnVuY3Rpb24gZW1wdHkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yQWxsIGZyb20gXCIuLi9zZWxlY3RvckFsbC5qc1wiO1xuXG5mdW5jdGlvbiBhcnJheUFsbChzZWxlY3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBncm91cCA9IHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiBncm91cCA9PSBudWxsID8gW10gOiBhcnJheShncm91cCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCA9PT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBhcnJheUFsbChzZWxlY3QpO1xuICBlbHNlIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbGRNYXRjaGVyKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbiIsICJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbmQgPSBBcnJheS5wcm90b3R5cGUuZmluZDtcblxuZnVuY3Rpb24gY2hpbGRGaW5kKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmluZC5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2hpbGRGaXJzdCgpIHtcbiAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChtYXRjaCA9PSBudWxsID8gY2hpbGRGaXJzdFxuICAgICAgOiBjaGlsZEZpbmQodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsICJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7XG5cbmZ1bmN0aW9uIGNoaWxkcmVuKCkge1xuICByZXR1cm4gdGhpcy5jaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdEFsbChtYXRjaCA9PSBudWxsID8gY2hpbGRyZW5cbiAgICAgIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaGVyIGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHVwZGF0ZSkge1xuICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xufVxuIiwgImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkge1xuICB0aGlzLm93bmVyRG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudDtcbiAgdGhpcy5uYW1lc3BhY2VVUkkgPSBwYXJlbnQubmFtZXNwYWNlVVJJO1xuICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9fZGF0YV9fID0gZGF0dW07XG59XG5cbkVudGVyTm9kZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsXG4gIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LFxuICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LFxuICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9XG59O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvblx1MjAxOXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0gbmV3IE1hcCxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSxcbiAgICAgIGtleVZhbHVlO1xuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLlxuICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkgKyBcIlwiO1xuICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHtcbiAgICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS5cbiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS5cbiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLlxuICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAga2V5VmFsdWUgPSBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpICsgXCJcIjtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlc1tpXSkgPT09IG5vZGUpKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0dW0obm9kZSkge1xuICByZXR1cm4gbm9kZS5fX2RhdGFfXztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBBcnJheS5mcm9tKHRoaXMsIGRhdHVtKTtcblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSBhcnJheSh2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cykpLFxuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpO1xuXG4gICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpO1xuXG4gICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0XG4gICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSxcbiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkge1xuICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHtcbiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTtcbiAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpO1xuICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7XG4gIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjtcbiAgdXBkYXRlLl9leGl0ID0gZXhpdDtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cbiIsICJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkge1xuICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTtcbiAgZW50ZXIgPSB0eXBlb2Ygb25lbnRlciA9PT0gXCJmdW5jdGlvblwiID8gb25lbnRlcihlbnRlcikgOiBlbnRlci5hcHBlbmQob25lbnRlciArIFwiXCIpO1xuICBpZiAob251cGRhdGUgIT0gbnVsbCkgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTtcbiAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTtcbiAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0aW9uKSB7XG4gIGlmICghKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFNlbGVjdGlvbikpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgbWVyZ2VcIik7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGxldCBzaXplID0gMDtcbiAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICF0aGlzLm5vZGUoKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2UuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlXG4gICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93XG4gICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbn1cbiIsICJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uXG4gICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSlcbiAgICAgIDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHtcbiAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKVxuICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xufVxuIiwgImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwgImZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG59XG5cbmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7XG4gIHRoaXMuX25vZGUgPSBub2RlO1xuICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiKTtcbn1cblxuQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArIFwiXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZVxuICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpO1xufVxuIiwgImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCAiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCAiZnVuY3Rpb24gcmFpc2UoKSB7XG4gIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTtcbn1cbiIsICJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwgImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsICJmdW5jdGlvbiByZW1vdmUoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTtcbn1cbiIsICJmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZShmYWxzZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWVwKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChkZWVwID8gc2VsZWN0aW9uX2Nsb25lRGVlcCA6IHNlbGVjdGlvbl9jbG9uZVNoYWxsb3cpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCAiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykge1xuICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksXG4gICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGRpc3BhdGNoRnVuY3Rpb25cbiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qKCkge1xuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgeWllbGQgbm9kZTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsICJpbXBvcnQge1NlbGVjdGlvbiwgcm9vdH0gZnJvbSBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKVxuICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgbGV0IHNvdXJjZUV2ZW50O1xuICB3aGlsZSAoc291cmNlRXZlbnQgPSBldmVudC5zb3VyY2VFdmVudCkgZXZlbnQgPSBzb3VyY2VFdmVudDtcbiAgcmV0dXJuIGV2ZW50O1xufVxuIiwgImltcG9ydCBzb3VyY2VFdmVudCBmcm9tIFwiLi9zb3VyY2VFdmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCwgbm9kZSkge1xuICBldmVudCA9IHNvdXJjZUV2ZW50KGV2ZW50KTtcbiAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkgbm9kZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGlmIChub2RlKSB7XG4gICAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7XG4gICAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkge1xuICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgICBwb2ludC54ID0gZXZlbnQuY2xpZW50WCwgcG9pbnQueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gICAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldO1xuICAgIH1cbiAgICBpZiAobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcbiAgICAgIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V2ZW50LnBhZ2VYLCBldmVudC5wYWdlWV07XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgbm9ldmVudCBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZpZXcpIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG5vZXZlbnQsIHRydWUpO1xuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbm9ldmVudCwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0O1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IFwibm9uZVwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5ZXNkcmFnKHZpZXcsIG5vY2xpY2spIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG51bGwpO1xuICBpZiAobm9jbGljaykge1xuICAgIHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbm9ldmVudCwgdHJ1ZSk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBudWxsKTsgfSwgMCk7XG4gIH1cbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IHJvb3QuX19ub3NlbGVjdDtcbiAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0O1xuICB9XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERyYWdFdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICBzdWJqZWN0LFxuICB0YXJnZXQsXG4gIGlkZW50aWZpZXIsXG4gIGFjdGl2ZSxcbiAgeCwgeSwgZHgsIGR5LFxuICBkaXNwYXRjaFxufSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgdHlwZToge3ZhbHVlOiB0eXBlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHNvdXJjZUV2ZW50OiB7dmFsdWU6IHNvdXJjZUV2ZW50LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHN1YmplY3Q6IHt2YWx1ZTogc3ViamVjdCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGlkZW50aWZpZXI6IHt2YWx1ZTogaWRlbnRpZmllciwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBhY3RpdmU6IHt2YWx1ZTogYWN0aXZlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHg6IHt2YWx1ZTogeCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB5OiB7dmFsdWU6IHksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgZHg6IHt2YWx1ZTogZHgsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgZHk6IHt2YWx1ZTogZHksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG5cbkRyYWdFdmVudC5wcm90b3R5cGUub24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5fLm9uLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHZhbHVlID09PSB0aGlzLl8gPyB0aGlzIDogdmFsdWU7XG59O1xuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2RyYWcsIHt5ZXNkcmFnfSBmcm9tIFwiLi9ub2RyYWcuanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgRHJhZ0V2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnRhaW5lcigpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50Tm9kZTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFN1YmplY3QoZXZlbnQsIGQpIHtcbiAgcmV0dXJuIGQgPT0gbnVsbCA/IHt4OiBldmVudC54LCB5OiBldmVudC55fSA6IGQ7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGNvbnRhaW5lciA9IGRlZmF1bHRDb250YWluZXIsXG4gICAgICBzdWJqZWN0ID0gZGVmYXVsdFN1YmplY3QsXG4gICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLFxuICAgICAgZ2VzdHVyZXMgPSB7fSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJkcmFnXCIsIFwiZW5kXCIpLFxuICAgICAgYWN0aXZlID0gMCxcbiAgICAgIG1vdXNlZG93bngsXG4gICAgICBtb3VzZWRvd255LFxuICAgICAgbW91c2Vtb3ZpbmcsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIGNsaWNrRGlzdGFuY2UyID0gMDtcblxuICBmdW5jdGlvbiBkcmFnKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAub24oXCJtb3VzZWRvd24uZHJhZ1wiLCBtb3VzZWRvd25lZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0LmRyYWdcIiwgdG91Y2hzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuZHJhZ1wiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWdcIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwidG91Y2gtYWN0aW9uXCIsIFwibm9uZVwiKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoZXZlbnQsIGQpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5jYWxsKHRoaXMsIGV2ZW50LCBkKSkgcmV0dXJuO1xuICAgIHZhciBnZXN0dXJlID0gYmVmb3Jlc3RhcnQodGhpcywgY29udGFpbmVyLmNhbGwodGhpcywgZXZlbnQsIGQpLCBldmVudCwgZCwgXCJtb3VzZVwiKTtcbiAgICBpZiAoIWdlc3R1cmUpIHJldHVybjtcbiAgICBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuZHJhZ1wiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuZHJhZ1wiLCBtb3VzZXVwcGVkLCB0cnVlKTtcbiAgICBub2RyYWcoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgbW91c2Vtb3ZpbmcgPSBmYWxzZTtcbiAgICBtb3VzZWRvd254ID0gZXZlbnQuY2xpZW50WDtcbiAgICBtb3VzZWRvd255ID0gZXZlbnQuY2xpZW50WTtcbiAgICBnZXN0dXJlKFwic3RhcnRcIiwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vtb3ZlZChldmVudCkge1xuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGlmICghbW91c2Vtb3ZpbmcpIHtcbiAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSBtb3VzZWRvd254LCBkeSA9IGV2ZW50LmNsaWVudFkgLSBtb3VzZWRvd255O1xuICAgICAgbW91c2Vtb3ZpbmcgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgIH1cbiAgICBnZXN0dXJlcy5tb3VzZShcImRyYWdcIiwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbW91c2V1cHBlZChldmVudCkge1xuICAgIHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZ1wiLCBudWxsKTtcbiAgICB5ZXNkcmFnKGV2ZW50LnZpZXcsIG1vdXNlbW92aW5nKTtcbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBnZXN0dXJlcy5tb3VzZShcImVuZFwiLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoZXZlbnQsIGQpIHtcbiAgICBpZiAoIWZpbHRlci5jYWxsKHRoaXMsIGV2ZW50LCBkKSkgcmV0dXJuO1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIGMgPSBjb250YWluZXIuY2FsbCh0aGlzLCBldmVudCwgZCksXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgZ2VzdHVyZTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChnZXN0dXJlID0gYmVmb3Jlc3RhcnQodGhpcywgYywgZXZlbnQsIGQsIHRvdWNoZXNbaV0uaWRlbnRpZmllciwgdG91Y2hlc1tpXSkpIHtcbiAgICAgICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgICAgIGdlc3R1cmUoXCJzdGFydFwiLCBldmVudCwgdG91Y2hlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCkge1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgZ2VzdHVyZTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgICAgZ2VzdHVyZShcImRyYWdcIiwgZXZlbnQsIHRvdWNoZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kZWQoZXZlbnQpIHtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCFcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgICAgIGdlc3R1cmUoXCJlbmRcIiwgZXZlbnQsIHRvdWNoZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJlZm9yZXN0YXJ0KHRoYXQsIGNvbnRhaW5lciwgZXZlbnQsIGQsIGlkZW50aWZpZXIsIHRvdWNoKSB7XG4gICAgdmFyIGRpc3BhdGNoID0gbGlzdGVuZXJzLmNvcHkoKSxcbiAgICAgICAgcCA9IHBvaW50ZXIodG91Y2ggfHwgZXZlbnQsIGNvbnRhaW5lciksIGR4LCBkeSxcbiAgICAgICAgcztcblxuICAgIGlmICgocyA9IHN1YmplY3QuY2FsbCh0aGF0LCBuZXcgRHJhZ0V2ZW50KFwiYmVmb3Jlc3RhcnRcIiwge1xuICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXG4gICAgICAgIHRhcmdldDogZHJhZyxcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgYWN0aXZlLFxuICAgICAgICB4OiBwWzBdLFxuICAgICAgICB5OiBwWzFdLFxuICAgICAgICBkeDogMCxcbiAgICAgICAgZHk6IDAsXG4gICAgICAgIGRpc3BhdGNoXG4gICAgICB9KSwgZCkpID09IG51bGwpIHJldHVybjtcblxuICAgIGR4ID0gcy54IC0gcFswXSB8fCAwO1xuICAgIGR5ID0gcy55IC0gcFsxXSB8fCAwO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGdlc3R1cmUodHlwZSwgZXZlbnQsIHRvdWNoKSB7XG4gICAgICB2YXIgcDAgPSBwLCBuO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzdGFydFwiOiBnZXN0dXJlc1tpZGVudGlmaWVyXSA9IGdlc3R1cmUsIG4gPSBhY3RpdmUrKzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbmRcIjogZGVsZXRlIGdlc3R1cmVzW2lkZW50aWZpZXJdLCAtLWFjdGl2ZTsgLy8gbm9icmVha1xuICAgICAgICBjYXNlIFwiZHJhZ1wiOiBwID0gcG9pbnRlcih0b3VjaCB8fCBldmVudCwgY29udGFpbmVyKSwgbiA9IGFjdGl2ZTsgYnJlYWs7XG4gICAgICB9XG4gICAgICBkaXNwYXRjaC5jYWxsKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGF0LFxuICAgICAgICBuZXcgRHJhZ0V2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXG4gICAgICAgICAgc3ViamVjdDogcyxcbiAgICAgICAgICB0YXJnZXQ6IGRyYWcsXG4gICAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgICBhY3RpdmU6IG4sXG4gICAgICAgICAgeDogcFswXSArIGR4LFxuICAgICAgICAgIHk6IHBbMV0gKyBkeSxcbiAgICAgICAgICBkeDogcFswXSAtIHAwWzBdLFxuICAgICAgICAgIGR5OiBwWzFdIC0gcDBbMV0sXG4gICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIGRyYWcuZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgZHJhZykgOiBmaWx0ZXI7XG4gIH07XG5cbiAgZHJhZy5jb250YWluZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29udGFpbmVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgZHJhZykgOiBjb250YWluZXI7XG4gIH07XG5cbiAgZHJhZy5zdWJqZWN0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN1YmplY3QgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCBkcmFnKSA6IHN1YmplY3Q7XG4gIH07XG5cbiAgZHJhZy50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBkcmFnKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICBkcmFnLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IGRyYWcgOiB2YWx1ZTtcbiAgfTtcblxuICBkcmFnLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIGRyYWcpIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICByZXR1cm4gZHJhZztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHtcbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTtcbiAgcmV0dXJuIHByb3RvdHlwZTtcbn1cbiIsICJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbG9yKCkge31cblxuZXhwb3J0IHZhciBkYXJrZXIgPSAwLjc7XG5leHBvcnQgdmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjtcblxudmFyIHJlSSA9IFwiXFxcXHMqKFsrLV0/XFxcXGQrKVxcXFxzKlwiLFxuICAgIHJlTiA9IFwiXFxcXHMqKFsrLV0/XFxcXGQqXFxcXC4/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pXFxcXHMqXCIsXG4gICAgcmVQID0gXCJcXFxccyooWystXT9cXFxcZCpcXFxcLj9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKFwiXnJnYlxcXFwoXCIgKyBbcmVJLCByZUksIHJlSV0gKyBcIlxcXFwpJFwiKSxcbiAgICByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXnJnYlxcXFwoXCIgKyBbcmVQLCByZVAsIHJlUF0gKyBcIlxcXFwpJFwiKSxcbiAgICByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cChcIl5yZ2JhXFxcXChcIiArIFtyZUksIHJlSSwgcmVJLCByZU5dICsgXCJcXFxcKSRcIiksXG4gICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJecmdiYVxcXFwoXCIgKyBbcmVQLCByZVAsIHJlUCwgcmVOXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJeaHNsXFxcXChcIiArIFtyZU4sIHJlUCwgcmVQXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXmhzbGFcXFxcKFwiICsgW3JlTiwgcmVQLCByZVAsIHJlTl0gKyBcIlxcXFwpJFwiKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weTogZnVuY3Rpb24oY2hhbm5lbHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcywgY2hhbm5lbHMpO1xuICB9LFxuICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTtcbiAgfSxcbiAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogY29sb3JfZm9ybWF0SGV4LFxuICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCxcbiAgZm9ybWF0UmdiOiBjb2xvcl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2Jcbn0pO1xuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBoZXg6IHJnYl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCxcbiAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYlxufSkpO1xuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gXCIjXCIgKyBoZXgodGhpcy5yKSArIGhleCh0aGlzLmcpICsgaGV4KHRoaXMuYik7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7XG4gIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpO1xuICByZXR1cm4gKGEgPT09IDEgPyBcInJnYihcIiA6IFwicmdiYShcIilcbiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMucikgfHwgMCkpICsgXCIsIFwiXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmcpIHx8IDApKSArIFwiLCBcIlxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5iKSB8fCAwKSlcbiAgICAgICsgKGEgPT09IDEgPyBcIilcIiA6IFwiLCBcIiArIGEgKyBcIilcIik7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh2YWx1ZSkgfHwgMCkpO1xuICByZXR1cm4gKHZhbHVlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgdmFsdWUudG9TdHJpbmcoMTYpO1xufVxuXG5mdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHtcbiAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOO1xuICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtcbiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOO1xuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgSHNsO1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87XG4gIG8gPSBvLnJnYigpO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGggPSBOYU4sXG4gICAgICBzID0gbWF4IC0gbWluLFxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgaWYgKHMpIHtcbiAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjtcbiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7XG4gICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0O1xuICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47XG4gICAgaCAqPSA2MDtcbiAgfSBlbHNlIHtcbiAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDtcbiAgfVxuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLnMgPSArcztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsXG4gICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyxcbiAgICAgICAgbCA9IHRoaXMubCxcbiAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcyxcbiAgICAgICAgbTEgPSAyICogbCAtIG0yO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgaHNsMnJnYihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9LFxuICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7XG4gICAgcmV0dXJuIChhID09PSAxID8gXCJoc2woXCIgOiBcImhzbGEoXCIpXG4gICAgICAgICsgKHRoaXMuaCB8fCAwKSArIFwiLCBcIlxuICAgICAgICArICh0aGlzLnMgfHwgMCkgKiAxMDAgKyBcIiUsIFwiXG4gICAgICAgICsgKHRoaXMubCB8fCAwKSAqIDEwMCArIFwiJVwiXG4gICAgICAgICsgKGEgPT09IDEgPyBcIilcIiA6IFwiLCBcIiArIGEgKyBcIilcIik7XG4gIH1cbn0pKTtcblxuLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqL1xuZnVuY3Rpb24gaHNsMnJnYihoLCBtMSwgbTIpIHtcbiAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MFxuICAgICAgOiBoIDwgMTgwID8gbTJcbiAgICAgIDogaCA8IDI0MCA/IG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjBcbiAgICAgIDogbTEpICogMjU1O1xufVxuIiwgImV4cG9ydCBjb25zdCByYWRpYW5zID0gTWF0aC5QSSAvIDE4MDtcbmV4cG9ydCBjb25zdCBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcbiIsICJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcbmltcG9ydCB7Q29sb3IsIHJnYkNvbnZlcnQsIFJnYiwgZGFya2VyLCBicmlnaHRlcn0gZnJvbSBcIi4vY29sb3IuanNcIjtcbmltcG9ydCB7ZGVncmVlcywgcmFkaWFuc30gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG52YXIgQSA9IC0wLjE0ODYxLFxuICAgIEIgPSArMS43ODI3NyxcbiAgICBDID0gLTAuMjkyMjcsXG4gICAgRCA9IC0wLjkwNjQ5LFxuICAgIEUgPSArMS45NzI5NCxcbiAgICBFRCA9IEUgKiBELFxuICAgIEVCID0gRSAqIEIsXG4gICAgQkNfREEgPSBCICogQyAtIEQgKiBBO1xuXG5mdW5jdGlvbiBjdWJlaGVsaXhDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBDdWJlaGVsaXgpIHJldHVybiBuZXcgQ3ViZWhlbGl4KG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIGwgPSAoQkNfREEgKiBiICsgRUQgKiByIC0gRUIgKiBnKSAvIChCQ19EQSArIEVEIC0gRUIpLFxuICAgICAgYmwgPSBiIC0gbCxcbiAgICAgIGsgPSAoRSAqIChnIC0gbCkgLSBDICogYmwpIC8gRCxcbiAgICAgIHMgPSBNYXRoLnNxcnQoayAqIGsgKyBibCAqIGJsKSAvIChFICogbCAqICgxIC0gbCkpLCAvLyBOYU4gaWYgbD0wIG9yIGw9MVxuICAgICAgaCA9IHMgPyBNYXRoLmF0YW4yKGssIGJsKSAqIGRlZ3JlZXMgLSAxMjAgOiBOYU47XG4gIHJldHVybiBuZXcgQ3ViZWhlbGl4KGggPCAwID8gaCArIDM2MCA6IGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY3ViZWhlbGl4Q29udmVydChoKSA6IG5ldyBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShDdWJlaGVsaXgsIGN1YmVoZWxpeCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaCA9IGlzTmFOKHRoaXMuaCkgPyAwIDogKHRoaXMuaCArIDEyMCkgKiByYWRpYW5zLFxuICAgICAgICBsID0gK3RoaXMubCxcbiAgICAgICAgYSA9IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zICogbCAqICgxIC0gbCksXG4gICAgICAgIGNvc2ggPSBNYXRoLmNvcyhoKSxcbiAgICAgICAgc2luaCA9IE1hdGguc2luKGgpO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgMjU1ICogKGwgKyBhICogKEEgKiBjb3NoICsgQiAqIHNpbmgpKSxcbiAgICAgIDI1NSAqIChsICsgYSAqIChDICogY29zaCArIEQgKiBzaW5oKSksXG4gICAgICAyNTUgKiAobCArIGEgKiAoRSAqIGNvc2gpKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH1cbn0pKTtcbiIsICJleHBvcnQgZnVuY3Rpb24gYmFzaXModDEsIHYwLCB2MSwgdjIsIHYzKSB7XG4gIHZhciB0MiA9IHQxICogdDEsIHQzID0gdDIgKiB0MTtcbiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAtIHQzKSAqIHYwXG4gICAgICArICg0IC0gNiAqIHQyICsgMyAqIHQzKSAqIHYxXG4gICAgICArICgxICsgMyAqIHQxICsgMyAqIHQyIC0gMyAqIHQzKSAqIHYyXG4gICAgICArIHQzICogdjMpIC8gNjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaV0sXG4gICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSxcbiAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MixcbiAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwgImltcG9ydCB7YmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLFxuICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLFxuICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sXG4gICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSxcbiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCAiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGxpbmVhcihhLCBkKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKyB0ICogZDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXhwb25lbnRpYWwoYSwgYiwgeSkge1xuICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coYSArIHQgKiBiLCB5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh1ZShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnYW1tYSh5KSB7XG4gIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG4iLCAiaW1wb3J0IHtyZ2IgYXMgY29sb3JSZ2J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGJhc2lzIGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5pbXBvcnQgYmFzaXNDbG9zZWQgZnJvbSBcIi4vYmFzaXNDbG9zZWQuanNcIjtcbmltcG9ydCBub2dhbW1hLCB7Z2FtbWF9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7XG4gIHZhciBjb2xvciA9IGdhbW1hKHkpO1xuXG4gIGZ1bmN0aW9uIHJnYihzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSBjb2xvclJnYihzdGFydCkpLnIsIChlbmQgPSBjb2xvclJnYihlbmQpKS5yKSxcbiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSxcbiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBzdGFydC5yID0gcih0KTtcbiAgICAgIHN0YXJ0LmcgPSBnKHQpO1xuICAgICAgc3RhcnQuYiA9IGIodCk7XG4gICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgfTtcbiAgfVxuXG4gIHJnYi5nYW1tYSA9IHJnYkdhbW1hO1xuXG4gIHJldHVybiByZ2I7XG59KSgxKTtcblxuZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7XG4gICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLFxuICAgICAgICByID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBnID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBiID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBpLCBjb2xvcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb2xvciA9IGNvbG9yUmdiKGNvbG9yc1tpXSk7XG4gICAgICByW2ldID0gY29sb3IuciB8fCAwO1xuICAgICAgZ1tpXSA9IGNvbG9yLmcgfHwgMDtcbiAgICAgIGJbaV0gPSBjb2xvci5iIHx8IDA7XG4gICAgfVxuICAgIHIgPSBzcGxpbmUocik7XG4gICAgZyA9IHNwbGluZShnKTtcbiAgICBiID0gc3BsaW5lKGIpO1xuICAgIGNvbG9yLm9wYWNpdHkgPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBjb2xvci5yID0gcih0KTtcbiAgICAgIGNvbG9yLmcgPSBnKHQpO1xuICAgICAgY29sb3IuYiA9IGIodCk7XG4gICAgICByZXR1cm4gY29sb3IgKyBcIlwiO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMpO1xuZXhwb3J0IHZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICBpZiAoIWIpIGIgPSBbXTtcbiAgdmFyIG4gPSBhID8gTWF0aC5taW4oYi5sZW5ndGgsIGEubGVuZ3RoKSA6IDAsXG4gICAgICBjID0gYi5zbGljZSgpLFxuICAgICAgaTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjW2ldID0gYVtpXSAqICgxIC0gdCkgKyBiW2ldICogdDtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyQXJyYXkoeCkge1xuICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHgpICYmICEoeCBpbnN0YW5jZW9mIERhdGFWaWV3KTtcbn1cbiIsICJpbXBvcnQgdmFsdWUgZnJvbSBcIi4vdmFsdWUuanNcIjtcbmltcG9ydCBudW1iZXJBcnJheSwge2lzTnVtYmVyQXJyYXl9IGZyb20gXCIuL251bWJlckFycmF5LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIChpc051bWJlckFycmF5KGIpID8gbnVtYmVyQXJyYXkgOiBnZW5lcmljQXJyYXkpKGEsIGIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJpY0FycmF5KGEsIGIpIHtcbiAgdmFyIG5iID0gYiA/IGIubGVuZ3RoIDogMCxcbiAgICAgIG5hID0gYSA/IE1hdGgubWluKG5iLCBhLmxlbmd0aCkgOiAwLFxuICAgICAgeCA9IG5ldyBBcnJheShuYSksXG4gICAgICBjID0gbmV3IEFycmF5KG5iKSxcbiAgICAgIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIHhbaV0gPSB2YWx1ZShhW2ldLCBiW2ldKTtcbiAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTtcblxuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSBjW2ldID0geFtpXSh0KTtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBkID0gbmV3IERhdGU7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBkLnNldFRpbWUoYSAqICgxIC0gdCkgKyBiICogdCksIGQ7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsICJpbXBvcnQgdmFsdWUgZnJvbSBcIi4vdmFsdWUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgaSA9IHt9LFxuICAgICAgYyA9IHt9LFxuICAgICAgaztcblxuICBpZiAoYSA9PT0gbnVsbCB8fCB0eXBlb2YgYSAhPT0gXCJvYmplY3RcIikgYSA9IHt9O1xuICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIikgYiA9IHt9O1xuXG4gIGZvciAoayBpbiBiKSB7XG4gICAgaWYgKGsgaW4gYSkge1xuICAgICAgaVtrXSA9IHZhbHVlKGFba10sIGJba10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjW2tdID0gYltrXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cbiIsICJpbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG52YXIgcmVBID0gL1stK10/KD86XFxkK1xcLj9cXGQqfFxcLj9cXGQrKSg/OltlRV1bLStdP1xcZCspPy9nLFxuICAgIHJlQiA9IG5ldyBSZWdFeHAocmVBLnNvdXJjZSwgXCJnXCIpO1xuXG5mdW5jdGlvbiB6ZXJvKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbmUoYikge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBiKHQpICsgXCJcIjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYmkgPSByZUEubGFzdEluZGV4ID0gcmVCLmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGFtLCAvLyBjdXJyZW50IG1hdGNoIGluIGFcbiAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGJcbiAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueVxuICAgICAgaSA9IC0xLCAvLyBpbmRleCBpbiBzXG4gICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuXG4gIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy5cbiAgYSA9IGEgKyBcIlwiLCBiID0gYiArIFwiXCI7XG5cbiAgLy8gSW50ZXJwb2xhdGUgcGFpcnMgb2YgbnVtYmVycyBpbiBhICYgYi5cbiAgd2hpbGUgKChhbSA9IHJlQS5leGVjKGEpKVxuICAgICAgJiYgKGJtID0gcmVCLmV4ZWMoYikpKSB7XG4gICAgaWYgKChicyA9IGJtLmluZGV4KSA+IGJpKSB7IC8vIGEgc3RyaW5nIHByZWNlZGVzIHRoZSBuZXh0IG51bWJlciBpbiBiXG4gICAgICBicyA9IGIuc2xpY2UoYmksIGJzKTtcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBicztcbiAgICB9XG4gICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7IC8vIG51bWJlcnMgaW4gYSAmIGIgbWF0Y2hcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBibTtcbiAgICB9IGVsc2UgeyAvLyBpbnRlcnBvbGF0ZSBub24tbWF0Y2hpbmcgbnVtYmVyc1xuICAgICAgc1srK2ldID0gbnVsbDtcbiAgICAgIHEucHVzaCh7aTogaSwgeDogbnVtYmVyKGFtLCBibSl9KTtcbiAgICB9XG4gICAgYmkgPSByZUIubGFzdEluZGV4O1xuICB9XG5cbiAgLy8gQWRkIHJlbWFpbnMgb2YgYi5cbiAgaWYgKGJpIDwgYi5sZW5ndGgpIHtcbiAgICBicyA9IGIuc2xpY2UoYmkpO1xuICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gIH1cblxuICAvLyBTcGVjaWFsIG9wdGltaXphdGlvbiBmb3Igb25seSBhIHNpbmdsZSBtYXRjaC5cbiAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy5cbiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdXG4gICAgICA/IG9uZShxWzBdLngpXG4gICAgICA6IHplcm8oYikpXG4gICAgICA6IChiID0gcS5sZW5ndGgsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgICAgIH0pO1xufVxuIiwgImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHJnYiBmcm9tIFwiLi9yZ2IuanNcIjtcbmltcG9ydCB7Z2VuZXJpY0FycmF5fSBmcm9tIFwiLi9hcnJheS5qc1wiO1xuaW1wb3J0IGRhdGUgZnJvbSBcIi4vZGF0ZS5qc1wiO1xuaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcbmltcG9ydCBvYmplY3QgZnJvbSBcIi4vb2JqZWN0LmpzXCI7XG5pbXBvcnQgc3RyaW5nIGZyb20gXCIuL3N0cmluZy5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgbnVtYmVyQXJyYXksIHtpc051bWJlckFycmF5fSBmcm9tIFwiLi9udW1iZXJBcnJheS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciB0ID0gdHlwZW9mIGIsIGM7XG4gIHJldHVybiBiID09IG51bGwgfHwgdCA9PT0gXCJib29sZWFuXCIgPyBjb25zdGFudChiKVxuICAgICAgOiAodCA9PT0gXCJudW1iZXJcIiA/IG51bWJlclxuICAgICAgOiB0ID09PSBcInN0cmluZ1wiID8gKChjID0gY29sb3IoYikpID8gKGIgPSBjLCByZ2IpIDogc3RyaW5nKVxuICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyByZ2JcbiAgICAgIDogYiBpbnN0YW5jZW9mIERhdGUgPyBkYXRlXG4gICAgICA6IGlzTnVtYmVyQXJyYXkoYikgPyBudW1iZXJBcnJheVxuICAgICAgOiBBcnJheS5pc0FycmF5KGIpID8gZ2VuZXJpY0FycmF5XG4gICAgICA6IHR5cGVvZiBiLnZhbHVlT2YgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgYi50b1N0cmluZyAhPT0gXCJmdW5jdGlvblwiIHx8IGlzTmFOKGIpID8gb2JqZWN0XG4gICAgICA6IG51bWJlcikoYSwgYik7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChhICogKDEgLSB0KSArIGIgKiB0KTtcbiAgfTtcbn1cbiIsICJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsICJpbXBvcnQgZGVjb21wb3NlLCB7aWRlbnRpdHl9IGZyb20gXCIuL2RlY29tcG9zZS5qc1wiO1xuXG52YXIgc3ZnTm9kZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkge1xuICBjb25zdCBtID0gbmV3ICh0eXBlb2YgRE9NTWF0cml4ID09PSBcImZ1bmN0aW9uXCIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgXCJcIik7XG4gIHJldHVybiBtLmlzSWRlbnRpdHkgPyBpZGVudGl0eSA6IGRlY29tcG9zZShtLmEsIG0uYiwgbS5jLCBtLmQsIG0uZSwgbS5mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdmFsdWUpO1xuICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eTtcbiAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7XG4gIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7XG59XG4iLCAiaW1wb3J0IG51bWJlciBmcm9tIFwiLi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge3BhcnNlQ3NzLCBwYXJzZVN2Z30gZnJvbSBcIi4vcGFyc2UuanNcIjtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7XG5cbiAgZnVuY3Rpb24gcG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIgXCIgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKFwidHJhbnNsYXRlKFwiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHtcbiAgICAgIHMucHVzaChcInRyYW5zbGF0ZShcIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoXG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiICsgeGIgKyBcIixcIiArIHliICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcbiAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTtcbiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTtcbiAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTtcbiAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTtcbiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7XG4gICAgYSA9IGIgPSBudWxsOyAvLyBnY1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87XG4gICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsIFwicHgsIFwiLCBcInB4KVwiLCBcImRlZylcIik7XG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcbiIsICJ2YXIgZXBzaWxvbjIgPSAxZS0xMjtcblxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiBzaW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHRhbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHpvb21SaG8ocmhvLCByaG8yLCByaG80KSB7XG5cbiAgLy8gcDAgPSBbdXgwLCB1eTAsIHcwXVxuICAvLyBwMSA9IFt1eDEsIHV5MSwgdzFdXG4gIGZ1bmN0aW9uIHpvb20ocDAsIHAxKSB7XG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSxcbiAgICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgICBkeCA9IHV4MSAtIHV4MCxcbiAgICAgICAgZHkgPSB1eTEgLSB1eTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICAgIGksXG4gICAgICAgIFM7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIFx1MjI0NSB1MS5cbiAgICBpZiAoZDIgPCBlcHNpbG9uMikge1xuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB0ICogZHgsXG4gICAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhbCBjYXNlLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSxcbiAgICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSxcbiAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksXG4gICAgICAgICAgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpO1xuICAgICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHZhciBzID0gdCAqIFMsXG4gICAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEpICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgICAgdXkwICsgdSAqIGR5LFxuICAgICAgICAgIHcwICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwICogcmhvIC8gTWF0aC5TUVJUMjtcblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgem9vbS5yaG8gPSBmdW5jdGlvbihfKSB7XG4gICAgdmFyIF8xID0gTWF0aC5tYXgoMWUtMywgK18pLCBfMiA9IF8xICogXzEsIF80ID0gXzIgKiBfMjtcbiAgICByZXR1cm4gem9vbVJobyhfMSwgXzIsIF80KTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn0pKE1hdGguU1FSVDIsIDIsIDQpO1xuIiwgImltcG9ydCB7Y3ViZWhlbGl4IGFzIGNvbG9yQ3ViZWhlbGl4fSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBjb2xvciwge2h1ZX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZnVuY3Rpb24gY3ViZWhlbGl4KGh1ZSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGN1YmVoZWxpeEdhbW1hKHkpIHtcbiAgICB5ID0gK3k7XG5cbiAgICBmdW5jdGlvbiBjdWJlaGVsaXgoc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGggPSBodWUoKHN0YXJ0ID0gY29sb3JDdWJlaGVsaXgoc3RhcnQpKS5oLCAoZW5kID0gY29sb3JDdWJlaGVsaXgoZW5kKSkuaCksXG4gICAgICAgICAgcyA9IGNvbG9yKHN0YXJ0LnMsIGVuZC5zKSxcbiAgICAgICAgICBsID0gY29sb3Ioc3RhcnQubCwgZW5kLmwpLFxuICAgICAgICAgIG9wYWNpdHkgPSBjb2xvcihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICBzdGFydC5oID0gaCh0KTtcbiAgICAgICAgc3RhcnQucyA9IHModCk7XG4gICAgICAgIHN0YXJ0LmwgPSBsKE1hdGgucG93KHQsIHkpKTtcbiAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGN1YmVoZWxpeC5nYW1tYSA9IGN1YmVoZWxpeEdhbW1hO1xuXG4gICAgcmV0dXJuIGN1YmVoZWxpeDtcbiAgfSkoMSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGN1YmVoZWxpeChodWUpO1xuZXhwb3J0IHZhciBjdWJlaGVsaXhMb25nID0gY3ViZWhlbGl4KGNvbG9yKTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnRlcnBvbGF0b3IsIG4pIHtcbiAgdmFyIHNhbXBsZXMgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBzYW1wbGVzW2ldID0gaW50ZXJwb2xhdG9yKGkgLyAobiAtIDEpKTtcbiAgcmV0dXJuIHNhbXBsZXM7XG59XG4iLCAidmFyIGZyYW1lID0gMCwgLy8gaXMgYW4gYW5pbWF0aW9uIGZyYW1lIHBlbmRpbmc/XG4gICAgdGltZW91dCA9IDAsIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nP1xuICAgIGludGVydmFsID0gMCwgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlP1xuICAgIHBva2VEZWxheSA9IDEwMDAsIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3XG4gICAgdGFza0hlYWQsXG4gICAgdGFza1RhaWwsXG4gICAgY2xvY2tMYXN0ID0gMCxcbiAgICBjbG9ja05vdyA9IDAsXG4gICAgY2xvY2tTa2V3ID0gMCxcbiAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gXCJvYmplY3RcIiAmJiBwZXJmb3JtYW5jZS5ub3cgPyBwZXJmb3JtYW5jZSA6IERhdGUsXG4gICAgc2V0RnJhbWUgPSB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91dChmLCAxNyk7IH07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBjbG9ja05vdyB8fCAoc2V0RnJhbWUoY2xlYXJOb3cpLCBjbG9ja05vdyA9IGNsb2NrLm5vdygpICsgY2xvY2tTa2V3KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJOb3coKSB7XG4gIGNsb2NrTm93ID0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVyKCkge1xuICB0aGlzLl9jYWxsID1cbiAgdGhpcy5fdGltZSA9XG4gIHRoaXMuX25leHQgPSBudWxsO1xufVxuXG5UaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUaW1lcixcbiAgcmVzdGFydDogZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lKSArIChkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheSk7XG4gICAgaWYgKCF0aGlzLl9uZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7XG4gICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpcztcbiAgICAgIGVsc2UgdGFza0hlYWQgPSB0aGlzO1xuICAgICAgdGFza1RhaWwgPSB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7XG4gICAgdGhpcy5fdGltZSA9IHRpbWU7XG4gICAgc2xlZXAoKTtcbiAgfSxcbiAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2NhbGwpIHtcbiAgICAgIHRoaXMuX2NhbGwgPSBudWxsO1xuICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5O1xuICAgICAgc2xlZXAoKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lcihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7XG4gIG5vdygpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSwgaWYgbm90IGFscmVhZHkgc2V0LlxuICArK2ZyYW1lOyAvLyBQcmV0ZW5kIHdlXHUyMDE5dmUgc2V0IGFuIGFsYXJtLCBpZiB3ZSBoYXZlblx1MjAxOXQgYWxyZWFkeS5cbiAgdmFyIHQgPSB0YXNrSGVhZCwgZTtcbiAgd2hpbGUgKHQpIHtcbiAgICBpZiAoKGUgPSBjbG9ja05vdyAtIHQuX3RpbWUpID49IDApIHQuX2NhbGwuY2FsbChudWxsLCBlKTtcbiAgICB0ID0gdC5fbmV4dDtcbiAgfVxuICAtLWZyYW1lO1xufVxuXG5mdW5jdGlvbiB3YWtlKCkge1xuICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7XG4gIGZyYW1lID0gdGltZW91dCA9IDA7XG4gIHRyeSB7XG4gICAgdGltZXJGbHVzaCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZyYW1lID0gMDtcbiAgICBuYXAoKTtcbiAgICBjbG9ja05vdyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9rZSgpIHtcbiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDtcbiAgaWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5vdztcbn1cblxuZnVuY3Rpb24gbmFwKCkge1xuICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7XG4gIHdoaWxlICh0MSkge1xuICAgIGlmICh0MS5fY2FsbCkge1xuICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lO1xuICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsO1xuICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyO1xuICAgIH1cbiAgfVxuICB0YXNrVGFpbCA9IHQwO1xuICBzbGVlcCh0aW1lKTtcbn1cblxuZnVuY3Rpb24gc2xlZXAodGltZSkge1xuICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS5cbiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuXG4gIGlmIChkZWxheSA+IDI0KSB7XG4gICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTtcbiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTtcbiAgICBmcmFtZSA9IDEsIHNldEZyYW1lKHdha2UpO1xuICB9XG59XG4iLCAiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXIsIHRpbWVvdXR9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZW1wdHlPbiA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJjYW5jZWxcIiwgXCJpbnRlcnJ1cHRcIik7XG52YXIgZW1wdHlUd2VlbiA9IFtdO1xuXG5leHBvcnQgdmFyIENSRUFURUQgPSAwO1xuZXhwb3J0IHZhciBTQ0hFRFVMRUQgPSAxO1xuZXhwb3J0IHZhciBTVEFSVElORyA9IDI7XG5leHBvcnQgdmFyIFNUQVJURUQgPSAzO1xuZXhwb3J0IHZhciBSVU5OSU5HID0gNDtcbmV4cG9ydCB2YXIgRU5ESU5HID0gNTtcbmV4cG9ydCB2YXIgRU5ERUQgPSA2O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTtcbiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47XG4gIGNyZWF0ZShub2RlLCBpZCwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgb246IGVtcHR5T24sXG4gICAgdHdlZW46IGVtcHR5VHdlZW4sXG4gICAgdGltZTogdGltaW5nLnRpbWUsXG4gICAgZGVsYXk6IHRpbWluZy5kZWxheSxcbiAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLFxuICAgIGVhc2U6IHRpbWluZy5lYXNlLFxuICAgIHRpbWVyOiBudWxsLFxuICAgIHN0YXRlOiBDUkVBVEVEXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcihcInRyYW5zaXRpb24gbm90IGZvdW5kXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICB0d2VlbjtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC5cbiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shXG4gIHNjaGVkdWxlc1tpZF0gPSBzZWxmO1xuICBzZWxmLnRpbWVyID0gdGltZXIoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7XG4gICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuXG4gICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkge1xuICAgIHZhciBpLCBqLCBuLCBvO1xuXG4gICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LlxuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7XG5cbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBvID0gc2NoZWR1bGVzW2ldO1xuICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSxcbiAgICAgIC8vIGRlZmVyIHN0YXJ0aW5nIGFuIGludGVycnVwdGluZyB0cmFuc2l0aW9uIHVudGlsIHRoYXQgdHJhbnNpdGlvbiBoYXMgYVxuICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCFcbiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dChzdGFydCk7XG5cbiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS5cbiAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImludGVycnVwdFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLlxuICAgICAgZWxzZSBpZiAoK2kgPCBpZCkge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni5cbiAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIVxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiFcbiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suXG4gICAgdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HO1xuICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcbiAgICAgICAgdGljayhlbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC5cbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLlxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORztcbiAgICBzZWxmLm9uLmNhbGwoXCJzdGFydFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkcpIHJldHVybjsgLy8gaW50ZXJydXB0ZWRcbiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLlxuICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkge1xuICAgICAgICB0d2VlblsrK2pdID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHtcbiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpO1xuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykge1xuICAgICAgc2VsZi5vbi5jYWxsKFwiZW5kXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgICAgc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc2VsZi5zdGF0ZSA9IEVOREVEO1xuICAgIHNlbGYudGltZXIuc3RvcCgpO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdO1xuICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQge1NUQVJUSU5HLCBFTkRJTkcsIEVOREVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBlbXB0eSA9IHRydWUsXG4gICAgICBpO1xuXG4gIGlmICghc2NoZWR1bGVzKSByZXR1cm47XG5cbiAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcblxuICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfVxuICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7XG4gICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDtcbiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7XG4gICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyBcImludGVycnVwdFwiIDogXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICB9XG5cbiAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG59XG4iLCAiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTtcbiAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xW2ldID0gdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICBuYW1lICs9IFwiXCI7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDtcblxuICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTtcbiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07XG4gIH07XG59XG4iLCAiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCAiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJhdHRyLlwiICsgbmFtZTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmVhc2U7XG59XG4iLCAiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCAiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG4gIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gc3RhcnQobmFtZSkge1xuICByZXR1cm4gKG5hbWUgKyBcIlwiKS50cmltKCkuc3BsaXQoL158XFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuICF0IHx8IHQgPT09IFwic3RhcnRcIjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBvbjAsIG9uMSwgc2l0ID0gc3RhcnQobmFtZSkgPyBpbml0IDogc2V0O1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2l0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyXG4gICAgICA/IGdldCh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpXG4gICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikpO1xufVxuIiwgImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdG9yfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3RvckFsbH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHtcbiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzdHlsZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgc3RyaW5nMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHN0cmluZzEwID0gc3RyaW5nMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksXG4gICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgc3RyaW5nMSA9IHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciBvbjAsIG9uMSwgbGlzdGVuZXIwLCBrZXkgPSBcInN0eWxlLlwiICsgbmFtZSwgZXZlbnQgPSBcImVuZC5cIiArIGtleSwgcmVtb3ZlO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbixcbiAgICAgICAgbGlzdGVuZXIgPSBzY2hlZHVsZS52YWx1ZVtrZXldID09IG51bGwgPyByZW1vdmUgfHwgKHJlbW92ZSA9IHN0eWxlUmVtb3ZlKG5hbWUpKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCB8fCBsaXN0ZW5lcjAgIT09IGxpc3RlbmVyKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKGV2ZW50LCBsaXN0ZW5lcjAgPSBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBpID0gKG5hbWUgKz0gXCJcIikgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIHN0eWxlUmVtb3ZlKG5hbWUpKVxuICAgIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUZ1bmN0aW9uKG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJzdHlsZS5cIiArIG5hbWUsIHZhbHVlKSkpXG4gICAgICAuZWFjaChzdHlsZU1heWJlUmVtb3ZlKHRoaXMuX2lkLCBuYW1lKSlcbiAgICA6IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIG51bGwpO1xufVxuIiwgImZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgdCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleSA9IFwic3R5bGUuXCIgKyAobmFtZSArPSBcIlwiKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKTtcbn1cbiIsICJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCAiZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gaS5jYWxsKHRoaXMsIHQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiB0ZXh0SW50ZXJwb2xhdGUoaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcInRleHRcIjtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZDAgPSB0aGlzLl9pZCxcbiAgICAgIGlkMSA9IG5ld0lkKCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQobm9kZSwgaWQwKTtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwge1xuICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpO1xufVxuIiwgImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwgImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHJUd2VlbiBmcm9tIFwiLi9hdHRyVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2RlbGF5IGZyb20gXCIuL2RlbGF5LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZSBmcm9tIFwiLi9lYXNlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlVmFyeWluZyBmcm9tIFwiLi9lYXNlVmFyeWluZy5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3QgZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3Rpb24gZnJvbSBcIi4vc2VsZWN0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZSBmcm9tIFwiLi9zdHlsZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGVUd2VlbiBmcm9tIFwiLi9zdHlsZVR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHRUd2VlbiBmcm9tIFwiLi90ZXh0VHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHdlZW4gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2VuZCBmcm9tIFwiLi9lbmQuanNcIjtcblxudmFyIGlkID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xuICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgdGhpcy5faWQgPSBpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNpdGlvbihuYW1lKSB7XG4gIHJldHVybiBzZWxlY3Rpb24oKS50cmFuc2l0aW9uKG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3SWQoKSB7XG4gIHJldHVybiArK2lkO1xufVxuXG52YXIgc2VsZWN0aW9uX3Byb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGU7XG5cblRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2l0aW9uLFxuICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LFxuICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwgImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwgImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUgZnJvbSBcIi4uL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7ZWFzZUN1YmljSW5PdXR9IGZyb20gXCJkMy1lYXNlXCI7XG5pbXBvcnQge25vd30gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBkZWZhdWx0VGltaW5nID0ge1xuICB0aW1lOiBudWxsLCAvLyBTZXQgb24gdXNlLlxuICBkZWxheTogMCxcbiAgZHVyYXRpb246IDI1MCxcbiAgZWFzZTogZWFzZUN1YmljSW5PdXRcbn07XG5cbmZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHtcbiAgdmFyIHRpbWluZztcbiAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHtcbiAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2l0aW9uICR7aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGltaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBpZCxcbiAgICAgIHRpbWluZztcblxuICBpZiAobmFtZSBpbnN0YW5jZW9mIFRyYW5zaXRpb24pIHtcbiAgICBpZCA9IG5hbWUuX2lkLCBuYW1lID0gbmFtZS5fbmFtZTtcbiAgfSBlbHNlIHtcbiAgICBpZCA9IG5ld0lkKCksICh0aW1pbmcgPSBkZWZhdWx0VGltaW5nKS50aW1lID0gbm93KCksIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtkcmFnRGlzYWJsZSwgZHJhZ0VuYWJsZX0gZnJvbSBcImQzLWRyYWdcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGV9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtwb2ludGVyLCBzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgQnJ1c2hFdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbnZhciBNT0RFX0RSQUcgPSB7bmFtZTogXCJkcmFnXCJ9LFxuICAgIE1PREVfU1BBQ0UgPSB7bmFtZTogXCJzcGFjZVwifSxcbiAgICBNT0RFX0hBTkRMRSA9IHtuYW1lOiBcImhhbmRsZVwifSxcbiAgICBNT0RFX0NFTlRFUiA9IHtuYW1lOiBcImNlbnRlclwifTtcblxuY29uc3Qge2FicywgbWF4LCBtaW59ID0gTWF0aDtcblxuZnVuY3Rpb24gbnVtYmVyMShlKSB7XG4gIHJldHVybiBbK2VbMF0sICtlWzFdXTtcbn1cblxuZnVuY3Rpb24gbnVtYmVyMihlKSB7XG4gIHJldHVybiBbbnVtYmVyMShlWzBdKSwgbnVtYmVyMShlWzFdKV07XG59XG5cbnZhciBYID0ge1xuICBuYW1lOiBcInhcIixcbiAgaGFuZGxlczogW1wid1wiLCBcImVcIl0ubWFwKHR5cGUpLFxuICBpbnB1dDogZnVuY3Rpb24oeCwgZSkgeyByZXR1cm4geCA9PSBudWxsID8gbnVsbCA6IFtbK3hbMF0sIGVbMF1bMV1dLCBbK3hbMV0sIGVbMV1bMV1dXTsgfSxcbiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgJiYgW3h5WzBdWzBdLCB4eVsxXVswXV07IH1cbn07XG5cbnZhciBZID0ge1xuICBuYW1lOiBcInlcIixcbiAgaGFuZGxlczogW1wiblwiLCBcInNcIl0ubWFwKHR5cGUpLFxuICBpbnB1dDogZnVuY3Rpb24oeSwgZSkgeyByZXR1cm4geSA9PSBudWxsID8gbnVsbCA6IFtbZVswXVswXSwgK3lbMF1dLCBbZVsxXVswXSwgK3lbMV1dXTsgfSxcbiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgJiYgW3h5WzBdWzFdLCB4eVsxXVsxXV07IH1cbn07XG5cbnZhciBYWSA9IHtcbiAgbmFtZTogXCJ4eVwiLFxuICBoYW5kbGVzOiBbXCJuXCIsIFwid1wiLCBcImVcIiwgXCJzXCIsIFwibndcIiwgXCJuZVwiLCBcInN3XCIsIFwic2VcIl0ubWFwKHR5cGUpLFxuICBpbnB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5ID09IG51bGwgPyBudWxsIDogbnVtYmVyMih4eSk7IH0sXG4gIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5OyB9XG59O1xuXG52YXIgY3Vyc29ycyA9IHtcbiAgb3ZlcmxheTogXCJjcm9zc2hhaXJcIixcbiAgc2VsZWN0aW9uOiBcIm1vdmVcIixcbiAgbjogXCJucy1yZXNpemVcIixcbiAgZTogXCJldy1yZXNpemVcIixcbiAgczogXCJucy1yZXNpemVcIixcbiAgdzogXCJldy1yZXNpemVcIixcbiAgbnc6IFwibndzZS1yZXNpemVcIixcbiAgbmU6IFwibmVzdy1yZXNpemVcIixcbiAgc2U6IFwibndzZS1yZXNpemVcIixcbiAgc3c6IFwibmVzdy1yZXNpemVcIlxufTtcblxudmFyIGZsaXBYID0ge1xuICBlOiBcIndcIixcbiAgdzogXCJlXCIsXG4gIG53OiBcIm5lXCIsXG4gIG5lOiBcIm53XCIsXG4gIHNlOiBcInN3XCIsXG4gIHN3OiBcInNlXCJcbn07XG5cbnZhciBmbGlwWSA9IHtcbiAgbjogXCJzXCIsXG4gIHM6IFwiblwiLFxuICBudzogXCJzd1wiLFxuICBuZTogXCJzZVwiLFxuICBzZTogXCJuZVwiLFxuICBzdzogXCJud1wiXG59O1xuXG52YXIgc2lnbnNYID0ge1xuICBvdmVybGF5OiArMSxcbiAgc2VsZWN0aW9uOiArMSxcbiAgbjogbnVsbCxcbiAgZTogKzEsXG4gIHM6IG51bGwsXG4gIHc6IC0xLFxuICBudzogLTEsXG4gIG5lOiArMSxcbiAgc2U6ICsxLFxuICBzdzogLTFcbn07XG5cbnZhciBzaWduc1kgPSB7XG4gIG92ZXJsYXk6ICsxLFxuICBzZWxlY3Rpb246ICsxLFxuICBuOiAtMSxcbiAgZTogbnVsbCxcbiAgczogKzEsXG4gIHc6IG51bGwsXG4gIG53OiAtMSxcbiAgbmU6IC0xLFxuICBzZTogKzEsXG4gIHN3OiArMVxufTtcblxuZnVuY3Rpb24gdHlwZSh0KSB7XG4gIHJldHVybiB7dHlwZTogdH07XG59XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIHN2ZyA9IHRoaXMub3duZXJTVkdFbGVtZW50IHx8IHRoaXM7XG4gIGlmIChzdmcuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgIHN2ZyA9IHN2Zy52aWV3Qm94LmJhc2VWYWw7XG4gICAgcmV0dXJuIFtbc3ZnLngsIHN2Zy55XSwgW3N2Zy54ICsgc3ZnLndpZHRoLCBzdmcueSArIHN2Zy5oZWlnaHRdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW3N2Zy53aWR0aC5iYXNlVmFsLnZhbHVlLCBzdmcuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuLy8gTGlrZSBkMy5sb2NhbCwgYnV0IHdpdGggdGhlIG5hbWUgXHUyMDFDX19icnVzaFx1MjAxRCByYXRoZXIgdGhhbiBhdXRvLWdlbmVyYXRlZC5cbmZ1bmN0aW9uIGxvY2FsKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fYnJ1c2gpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47XG4gIHJldHVybiBub2RlLl9fYnJ1c2g7XG59XG5cbmZ1bmN0aW9uIGVtcHR5KGV4dGVudCkge1xuICByZXR1cm4gZXh0ZW50WzBdWzBdID09PSBleHRlbnRbMV1bMF1cbiAgICAgIHx8IGV4dGVudFswXVsxXSA9PT0gZXh0ZW50WzFdWzFdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJ1c2hTZWxlY3Rpb24obm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl9fYnJ1c2g7XG4gIHJldHVybiBzdGF0ZSA/IHN0YXRlLmRpbS5vdXRwdXQoc3RhdGUuc2VsZWN0aW9uKSA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicnVzaFgoKSB7XG4gIHJldHVybiBicnVzaChYKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJydXNoWSgpIHtcbiAgcmV0dXJuIGJydXNoKFkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGJydXNoKFhZKTtcbn1cblxuZnVuY3Rpb24gYnJ1c2goZGltKSB7XG4gIHZhciBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBrZXlzID0gdHJ1ZSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJicnVzaFwiLCBcImVuZFwiKSxcbiAgICAgIGhhbmRsZVNpemUgPSA2LFxuICAgICAgdG91Y2hlbmRpbmc7XG5cbiAgZnVuY3Rpb24gYnJ1c2goZ3JvdXApIHtcbiAgICB2YXIgb3ZlcmxheSA9IGdyb3VwXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fYnJ1c2hcIiwgaW5pdGlhbGl6ZSlcbiAgICAgIC5zZWxlY3RBbGwoXCIub3ZlcmxheVwiKVxuICAgICAgLmRhdGEoW3R5cGUoXCJvdmVybGF5XCIpXSk7XG5cbiAgICBvdmVybGF5LmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAuYXR0cihcImNsYXNzXCIsIFwib3ZlcmxheVwiKVxuICAgICAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnMub3ZlcmxheSlcbiAgICAgIC5tZXJnZShvdmVybGF5KVxuICAgICAgICAuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgZXh0ZW50ID0gbG9jYWwodGhpcykuZXh0ZW50O1xuICAgICAgICAgIHNlbGVjdCh0aGlzKVxuICAgICAgICAgICAgICAuYXR0cihcInhcIiwgZXh0ZW50WzBdWzBdKVxuICAgICAgICAgICAgICAuYXR0cihcInlcIiwgZXh0ZW50WzBdWzFdKVxuICAgICAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIGV4dGVudFsxXVswXSAtIGV4dGVudFswXVswXSlcbiAgICAgICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgZXh0ZW50WzFdWzFdIC0gZXh0ZW50WzBdWzFdKTtcbiAgICAgICAgfSk7XG5cbiAgICBncm91cC5zZWxlY3RBbGwoXCIuc2VsZWN0aW9uXCIpXG4gICAgICAuZGF0YShbdHlwZShcInNlbGVjdGlvblwiKV0pXG4gICAgICAuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJzZWxlY3Rpb25cIilcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5zZWxlY3Rpb24pXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcIiM3NzdcIilcbiAgICAgICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgMC4zKVxuICAgICAgICAuYXR0cihcInN0cm9rZVwiLCBcIiNmZmZcIilcbiAgICAgICAgLmF0dHIoXCJzaGFwZS1yZW5kZXJpbmdcIiwgXCJjcmlzcEVkZ2VzXCIpO1xuXG4gICAgdmFyIGhhbmRsZSA9IGdyb3VwLnNlbGVjdEFsbChcIi5oYW5kbGVcIilcbiAgICAgIC5kYXRhKGRpbS5oYW5kbGVzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGU7IH0pO1xuXG4gICAgaGFuZGxlLmV4aXQoKS5yZW1vdmUoKTtcblxuICAgIGhhbmRsZS5lbnRlcigpLmFwcGVuZChcInJlY3RcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBmdW5jdGlvbihkKSB7IHJldHVybiBcImhhbmRsZSBoYW5kbGUtLVwiICsgZC50eXBlOyB9KVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBjdXJzb3JzW2QudHlwZV07IH0pO1xuXG4gICAgZ3JvdXBcbiAgICAgICAgLmVhY2gocmVkcmF3KVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXG4gICAgICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIilcbiAgICAgICAgLm9uKFwibW91c2Vkb3duLmJydXNoXCIsIHN0YXJ0ZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC5icnVzaFwiLCBzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuYnJ1c2hcIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2hcIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwidG91Y2gtYWN0aW9uXCIsIFwibm9uZVwiKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgYnJ1c2gubW92ZSA9IGZ1bmN0aW9uKGdyb3VwLCBzZWxlY3Rpb24pIHtcbiAgICBpZiAoZ3JvdXAudHdlZW4pIHtcbiAgICAgIGdyb3VwXG4gICAgICAgICAgLm9uKFwic3RhcnQuYnJ1c2hcIiwgZnVuY3Rpb24oZXZlbnQpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoZXZlbnQpOyB9KVxuICAgICAgICAgIC5vbihcImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2hcIiwgZnVuY3Rpb24oZXZlbnQpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZChldmVudCk7IH0pXG4gICAgICAgICAgLnR3ZWVuKFwiYnJ1c2hcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgc3RhdGUgPSB0aGF0Ll9fYnJ1c2gsXG4gICAgICAgICAgICAgICAgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJndW1lbnRzKSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24wID0gc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksXG4gICAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKHNlbGVjdGlvbjAsIHNlbGVjdGlvbjEpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiB0d2Vlbih0KSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHQgPT09IDEgJiYgc2VsZWN0aW9uMSA9PT0gbnVsbCA/IG51bGwgOiBpKHQpO1xuICAgICAgICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICAgICAgICAgICAgZW1pdC5icnVzaCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uMCAhPT0gbnVsbCAmJiBzZWxlY3Rpb24xICE9PSBudWxsID8gdHdlZW4gOiB0d2VlbigxKTtcbiAgICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBcbiAgICAgICAgICAuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgIHN0YXRlID0gdGhhdC5fX2JydXNoLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0aW9uLmFwcGx5KHRoYXQsIGFyZ3MpIDogc2VsZWN0aW9uLCBzdGF0ZS5leHRlbnQpLFxuICAgICAgICAgICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3MpLmJlZm9yZXN0YXJ0KCk7XG5cbiAgICAgICAgICAgIGludGVycnVwdCh0aGF0KTtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogc2VsZWN0aW9uMTtcbiAgICAgICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgICAgICAgZW1pdC5zdGFydCgpLmJydXNoKCkuZW5kKCk7XG4gICAgICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGJydXNoLmNsZWFyID0gZnVuY3Rpb24oZ3JvdXApIHtcbiAgICBicnVzaC5tb3ZlKGdyb3VwLCBudWxsKTtcbiAgfTtcblxuICBmdW5jdGlvbiByZWRyYXcoKSB7XG4gICAgdmFyIGdyb3VwID0gc2VsZWN0KHRoaXMpLFxuICAgICAgICBzZWxlY3Rpb24gPSBsb2NhbCh0aGlzKS5zZWxlY3Rpb247XG5cbiAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICBncm91cC5zZWxlY3RBbGwoXCIuc2VsZWN0aW9uXCIpXG4gICAgICAgICAgLnN0eWxlKFwiZGlzcGxheVwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwieFwiLCBzZWxlY3Rpb25bMF1bMF0pXG4gICAgICAgICAgLmF0dHIoXCJ5XCIsIHNlbGVjdGlvblswXVsxXSlcbiAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIHNlbGVjdGlvblsxXVswXSAtIHNlbGVjdGlvblswXVswXSlcbiAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBzZWxlY3Rpb25bMV1bMV0gLSBzZWxlY3Rpb25bMF1bMV0pO1xuXG4gICAgICBncm91cC5zZWxlY3RBbGwoXCIuaGFuZGxlXCIpXG4gICAgICAgICAgLnN0eWxlKFwiZGlzcGxheVwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwieFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGVbZC50eXBlLmxlbmd0aCAtIDFdID09PSBcImVcIiA/IHNlbGVjdGlvblsxXVswXSAtIGhhbmRsZVNpemUgLyAyIDogc2VsZWN0aW9uWzBdWzBdIC0gaGFuZGxlU2l6ZSAvIDI7IH0pXG4gICAgICAgICAgLmF0dHIoXCJ5XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZVswXSA9PT0gXCJzXCIgPyBzZWxlY3Rpb25bMV1bMV0gLSBoYW5kbGVTaXplIC8gMiA6IHNlbGVjdGlvblswXVsxXSAtIGhhbmRsZVNpemUgLyAyOyB9KVxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlID09PSBcIm5cIiB8fCBkLnR5cGUgPT09IFwic1wiID8gc2VsZWN0aW9uWzFdWzBdIC0gc2VsZWN0aW9uWzBdWzBdICsgaGFuZGxlU2l6ZSA6IGhhbmRsZVNpemU7IH0pXG4gICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlID09PSBcImVcIiB8fCBkLnR5cGUgPT09IFwid1wiID8gc2VsZWN0aW9uWzFdWzFdIC0gc2VsZWN0aW9uWzBdWzFdICsgaGFuZGxlU2l6ZSA6IGhhbmRsZVNpemU7IH0pO1xuICAgIH1cblxuICAgIGVsc2Uge1xuICAgICAgZ3JvdXAuc2VsZWN0QWxsKFwiLnNlbGVjdGlvbiwuaGFuZGxlXCIpXG4gICAgICAgICAgLnN0eWxlKFwiZGlzcGxheVwiLCBcIm5vbmVcIilcbiAgICAgICAgICAuYXR0cihcInhcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcInlcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHZhciBlbWl0ID0gdGhhdC5fX2JydXNoLmVtaXR0ZXI7XG4gICAgcmV0dXJuIGVtaXQgJiYgKCFjbGVhbiB8fCAhZW1pdC5jbGVhbikgPyBlbWl0IDogbmV3IEVtaXR0ZXIodGhhdCwgYXJncywgY2xlYW4pO1xuICB9XG5cbiAgZnVuY3Rpb24gRW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLnN0YXRlID0gdGhhdC5fX2JydXNoO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLmNsZWFuID0gY2xlYW47XG4gIH1cblxuICBFbWl0dGVyLnByb3RvdHlwZSA9IHtcbiAgICBiZWZvcmVzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkgdGhpcy5zdGF0ZS5lbWl0dGVyID0gdGhpcywgdGhpcy5zdGFydGluZyA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbihldmVudCwgbW9kZSkge1xuICAgICAgaWYgKHRoaXMuc3RhcnRpbmcpIHRoaXMuc3RhcnRpbmcgPSBmYWxzZSwgdGhpcy5lbWl0KFwic3RhcnRcIiwgZXZlbnQsIG1vZGUpO1xuICAgICAgZWxzZSB0aGlzLmVtaXQoXCJicnVzaFwiLCBldmVudCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGJydXNoOiBmdW5jdGlvbihldmVudCwgbW9kZSkge1xuICAgICAgdGhpcy5lbWl0KFwiYnJ1c2hcIiwgZXZlbnQsIG1vZGUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkgZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlciwgdGhpcy5lbWl0KFwiZW5kXCIsIGV2ZW50LCBtb2RlKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSwgZXZlbnQsIG1vZGUpIHtcbiAgICAgIHZhciBkID0gc2VsZWN0KHRoaXMudGhhdCkuZGF0dW0oKTtcbiAgICAgIGxpc3RlbmVycy5jYWxsKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLnRoYXQsXG4gICAgICAgIG5ldyBCcnVzaEV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiBicnVzaCxcbiAgICAgICAgICBzZWxlY3Rpb246IGRpbS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pLFxuICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gc3RhcnRlZChldmVudCkge1xuICAgIGlmICh0b3VjaGVuZGluZyAmJiAhZXZlbnQudG91Y2hlcykgcmV0dXJuO1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcblxuICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgdHlwZSA9IGV2ZW50LnRhcmdldC5fX2RhdGFfXy50eXBlLFxuICAgICAgICBtb2RlID0gKGtleXMgJiYgZXZlbnQubWV0YUtleSA/IHR5cGUgPSBcIm92ZXJsYXlcIiA6IHR5cGUpID09PSBcInNlbGVjdGlvblwiID8gTU9ERV9EUkFHIDogKGtleXMgJiYgZXZlbnQuYWx0S2V5ID8gTU9ERV9DRU5URVIgOiBNT0RFX0hBTkRMRSksXG4gICAgICAgIHNpZ25YID0gZGltID09PSBZID8gbnVsbCA6IHNpZ25zWFt0eXBlXSxcbiAgICAgICAgc2lnblkgPSBkaW0gPT09IFggPyBudWxsIDogc2lnbnNZW3R5cGVdLFxuICAgICAgICBzdGF0ZSA9IGxvY2FsKHRoYXQpLFxuICAgICAgICBleHRlbnQgPSBzdGF0ZS5leHRlbnQsXG4gICAgICAgIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbixcbiAgICAgICAgVyA9IGV4dGVudFswXVswXSwgdzAsIHcxLFxuICAgICAgICBOID0gZXh0ZW50WzBdWzFdLCBuMCwgbjEsXG4gICAgICAgIEUgPSBleHRlbnRbMV1bMF0sIGUwLCBlMSxcbiAgICAgICAgUyA9IGV4dGVudFsxXVsxXSwgczAsIHMxLFxuICAgICAgICBkeCA9IDAsXG4gICAgICAgIGR5ID0gMCxcbiAgICAgICAgbW92aW5nLFxuICAgICAgICBzaGlmdGluZyA9IHNpZ25YICYmIHNpZ25ZICYmIGtleXMgJiYgZXZlbnQuc2hpZnRLZXksXG4gICAgICAgIGxvY2tYLFxuICAgICAgICBsb2NrWSxcbiAgICAgICAgcG9pbnRzID0gQXJyYXkuZnJvbShldmVudC50b3VjaGVzIHx8IFtldmVudF0sIHQgPT4ge1xuICAgICAgICAgIGNvbnN0IGkgPSB0LmlkZW50aWZpZXI7XG4gICAgICAgICAgdCA9IHBvaW50ZXIodCwgdGhhdCk7XG4gICAgICAgICAgdC5wb2ludDAgPSB0LnNsaWNlKCk7XG4gICAgICAgICAgdC5pZGVudGlmaWVyID0gaTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfSk7XG5cbiAgICBpZiAodHlwZSA9PT0gXCJvdmVybGF5XCIpIHtcbiAgICAgIGlmIChzZWxlY3Rpb24pIG1vdmluZyA9IHRydWU7XG4gICAgICBjb25zdCBwdHMgPSBbcG9pbnRzWzBdLCBwb2ludHNbMV0gfHwgcG9pbnRzWzBdXTtcbiAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IFtbXG4gICAgICAgICAgdzAgPSBkaW0gPT09IFkgPyBXIDogbWluKHB0c1swXVswXSwgcHRzWzFdWzBdKSxcbiAgICAgICAgICBuMCA9IGRpbSA9PT0gWCA/IE4gOiBtaW4ocHRzWzBdWzFdLCBwdHNbMV1bMV0pXG4gICAgICAgIF0sIFtcbiAgICAgICAgICBlMCA9IGRpbSA9PT0gWSA/IEUgOiBtYXgocHRzWzBdWzBdLCBwdHNbMV1bMF0pLFxuICAgICAgICAgIHMwID0gZGltID09PSBYID8gUyA6IG1heChwdHNbMF1bMV0sIHB0c1sxXVsxXSlcbiAgICAgICAgXV07XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA+IDEpIG1vdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdzAgPSBzZWxlY3Rpb25bMF1bMF07XG4gICAgICBuMCA9IHNlbGVjdGlvblswXVsxXTtcbiAgICAgIGUwID0gc2VsZWN0aW9uWzFdWzBdO1xuICAgICAgczAgPSBzZWxlY3Rpb25bMV1bMV07XG4gICAgfVxuXG4gICAgdzEgPSB3MDtcbiAgICBuMSA9IG4wO1xuICAgIGUxID0gZTA7XG4gICAgczEgPSBzMDtcblxuICAgIHZhciBncm91cCA9IHNlbGVjdCh0aGF0KVxuICAgICAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKTtcblxuICAgIHZhciBvdmVybGF5ID0gZ3JvdXAuc2VsZWN0QWxsKFwiLm92ZXJsYXlcIilcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlXSk7XG5cbiAgICBpbnRlcnJ1cHQodGhhdCk7XG4gICAgdmFyIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cywgdHJ1ZSkuYmVmb3Jlc3RhcnQoKTtcblxuICAgIGlmIChldmVudC50b3VjaGVzKSB7XG4gICAgICBlbWl0Lm1vdmVkID0gbW92ZWQ7XG4gICAgICBlbWl0LmVuZGVkID0gZW5kZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2aWV3ID0gc2VsZWN0KGV2ZW50LnZpZXcpXG4gICAgICAgICAgLm9uKFwibW91c2Vtb3ZlLmJydXNoXCIsIG1vdmVkLCB0cnVlKVxuICAgICAgICAgIC5vbihcIm1vdXNldXAuYnJ1c2hcIiwgZW5kZWQsIHRydWUpO1xuICAgICAgaWYgKGtleXMpIHZpZXdcbiAgICAgICAgICAub24oXCJrZXlkb3duLmJydXNoXCIsIGtleWRvd25lZCwgdHJ1ZSlcbiAgICAgICAgICAub24oXCJrZXl1cC5icnVzaFwiLCBrZXl1cHBlZCwgdHJ1ZSlcblxuICAgICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7XG4gICAgfVxuXG4gICAgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgZW1pdC5zdGFydChldmVudCwgbW9kZS5uYW1lKTtcblxuICAgIGZ1bmN0aW9uIG1vdmVkKGV2ZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgZXZlbnQuY2hhbmdlZFRvdWNoZXMgfHwgW2V2ZW50XSkge1xuICAgICAgICBmb3IgKGNvbnN0IGQgb2YgcG9pbnRzKVxuICAgICAgICAgIGlmIChkLmlkZW50aWZpZXIgPT09IHAuaWRlbnRpZmllcikgZC5jdXIgPSBwb2ludGVyKHAsIHRoYXQpO1xuICAgICAgfVxuICAgICAgaWYgKHNoaWZ0aW5nICYmICFsb2NrWCAmJiAhbG9ja1kgJiYgcG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50c1swXTtcbiAgICAgICAgaWYgKGFicyhwb2ludC5jdXJbMF0gLSBwb2ludFswXSkgPiBhYnMocG9pbnQuY3VyWzFdIC0gcG9pbnRbMV0pKVxuICAgICAgICAgIGxvY2tZID0gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGxvY2tYID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcG9pbnRzKVxuICAgICAgICBpZiAocG9pbnQuY3VyKSBwb2ludFswXSA9IHBvaW50LmN1clswXSwgcG9pbnRbMV0gPSBwb2ludC5jdXJbMV07XG4gICAgICBtb3ZpbmcgPSB0cnVlO1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBtb3ZlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3ZlKGV2ZW50KSB7XG4gICAgICBjb25zdCBwb2ludCA9IHBvaW50c1swXSwgcG9pbnQwID0gcG9pbnQucG9pbnQwO1xuICAgICAgdmFyIHQ7XG5cbiAgICAgIGR4ID0gcG9pbnRbMF0gLSBwb2ludDBbMF07XG4gICAgICBkeSA9IHBvaW50WzFdIC0gcG9pbnQwWzFdO1xuXG4gICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgY2FzZSBNT0RFX1NQQUNFOlxuICAgICAgICBjYXNlIE1PREVfRFJBRzoge1xuICAgICAgICAgIGlmIChzaWduWCkgZHggPSBtYXgoVyAtIHcwLCBtaW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTAgKyBkeDtcbiAgICAgICAgICBpZiAoc2lnblkpIGR5ID0gbWF4KE4gLSBuMCwgbWluKFMgLSBzMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwICsgZHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBNT0RFX0hBTkRMRToge1xuICAgICAgICAgIGlmIChwb2ludHNbMV0pIHtcbiAgICAgICAgICAgIGlmIChzaWduWCkgdzEgPSBtYXgoVywgbWluKEUsIHBvaW50c1swXVswXSkpLCBlMSA9IG1heChXLCBtaW4oRSwgcG9pbnRzWzFdWzBdKSksIHNpZ25YID0gMTtcbiAgICAgICAgICAgIGlmIChzaWduWSkgbjEgPSBtYXgoTiwgbWluKFMsIHBvaW50c1swXVsxXSkpLCBzMSA9IG1heChOLCBtaW4oUywgcG9pbnRzWzFdWzFdKSksIHNpZ25ZID0gMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZHggPSBtYXgoVyAtIHcwLCBtaW4oRSAtIHcwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTA7XG4gICAgICAgICAgICBlbHNlIGlmIChzaWduWCA+IDApIGR4ID0gbWF4KFcgLSBlMCwgbWluKEUgLSBlMCwgZHgpKSwgdzEgPSB3MCwgZTEgPSBlMCArIGR4O1xuICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgZHkgPSBtYXgoTiAtIG4wLCBtaW4oUyAtIG4wLCBkeSkpLCBuMSA9IG4wICsgZHksIHMxID0gczA7XG4gICAgICAgICAgICBlbHNlIGlmIChzaWduWSA+IDApIGR5ID0gbWF4KE4gLSBzMCwgbWluKFMgLSBzMCwgZHkpKSwgbjEgPSBuMCwgczEgPSBzMCArIGR5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIE1PREVfQ0VOVEVSOiB7XG4gICAgICAgICAgaWYgKHNpZ25YKSB3MSA9IG1heChXLCBtaW4oRSwgdzAgLSBkeCAqIHNpZ25YKSksIGUxID0gbWF4KFcsIG1pbihFLCBlMCArIGR4ICogc2lnblgpKTtcbiAgICAgICAgICBpZiAoc2lnblkpIG4xID0gbWF4KE4sIG1pbihTLCBuMCAtIGR5ICogc2lnblkpKSwgczEgPSBtYXgoTiwgbWluKFMsIHMwICsgZHkgKiBzaWduWSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlMSA8IHcxKSB7XG4gICAgICAgIHNpZ25YICo9IC0xO1xuICAgICAgICB0ID0gdzAsIHcwID0gZTAsIGUwID0gdDtcbiAgICAgICAgdCA9IHcxLCB3MSA9IGUxLCBlMSA9IHQ7XG4gICAgICAgIGlmICh0eXBlIGluIGZsaXBYKSBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlID0gZmxpcFhbdHlwZV1dKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMxIDwgbjEpIHtcbiAgICAgICAgc2lnblkgKj0gLTE7XG4gICAgICAgIHQgPSBuMCwgbjAgPSBzMCwgczAgPSB0O1xuICAgICAgICB0ID0gbjEsIG4xID0gczEsIHMxID0gdDtcbiAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFkpIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGUgPSBmbGlwWVt0eXBlXV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uKSBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247IC8vIE1heSBiZSBzZXQgYnkgYnJ1c2gubW92ZSFcbiAgICAgIGlmIChsb2NrWCkgdzEgPSBzZWxlY3Rpb25bMF1bMF0sIGUxID0gc2VsZWN0aW9uWzFdWzBdO1xuICAgICAgaWYgKGxvY2tZKSBuMSA9IHNlbGVjdGlvblswXVsxXSwgczEgPSBzZWxlY3Rpb25bMV1bMV07XG5cbiAgICAgIGlmIChzZWxlY3Rpb25bMF1bMF0gIT09IHcxXG4gICAgICAgICAgfHwgc2VsZWN0aW9uWzBdWzFdICE9PSBuMVxuICAgICAgICAgIHx8IHNlbGVjdGlvblsxXVswXSAhPT0gZTFcbiAgICAgICAgICB8fCBzZWxlY3Rpb25bMV1bMV0gIT09IHMxKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IFtbdzEsIG4xXSwgW2UxLCBzMV1dO1xuICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICAgICAgZW1pdC5icnVzaChldmVudCwgbW9kZS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRlZChldmVudCkge1xuICAgICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgICBpZiAoZXZlbnQudG91Y2hlcykge1xuICAgICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgICAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgNTAwKTsgLy8gR2hvc3QgY2xpY2tzIGFyZSBkZWxheWVkIVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZ0VuYWJsZShldmVudC52aWV3LCBtb3ZpbmcpO1xuICAgICAgICB2aWV3Lm9uKFwia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaFwiLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGdyb3VwLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKTtcbiAgICAgIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzLm92ZXJsYXkpO1xuICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbikgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uOyAvLyBNYXkgYmUgc2V0IGJ5IGJydXNoLm1vdmUgKG9uIHN0YXJ0KSFcbiAgICAgIGlmIChlbXB0eShzZWxlY3Rpb24pKSBzdGF0ZS5zZWxlY3Rpb24gPSBudWxsLCByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICAgIGVtaXQuZW5kKGV2ZW50LCBtb2RlLm5hbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtleWRvd25lZChldmVudCkge1xuICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgMTY6IHsgLy8gU0hJRlRcbiAgICAgICAgICBzaGlmdGluZyA9IHNpZ25YICYmIHNpZ25ZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTg6IHsgLy8gQUxUXG4gICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfSEFORExFKSB7XG4gICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsgZHggKiBzaWduWDtcbiAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblksIG4wID0gbjEgKyBkeSAqIHNpZ25ZO1xuICAgICAgICAgICAgbW9kZSA9IE1PREVfQ0VOVEVSO1xuICAgICAgICAgICAgbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFOyB0YWtlcyBwcmlvcml0eSBvdmVyIEFMVFxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSB8fCBtb2RlID09PSBNT0RFX0NFTlRFUikge1xuICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMSAtIGR4OyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzEgLSBkeDtcbiAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczEgLSBkeTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xIC0gZHk7XG4gICAgICAgICAgICBtb2RlID0gTU9ERV9TUEFDRTtcbiAgICAgICAgICAgIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzLnNlbGVjdGlvbik7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtleXVwcGVkKGV2ZW50KSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVFxuICAgICAgICAgIGlmIChzaGlmdGluZykge1xuICAgICAgICAgICAgbG9ja1ggPSBsb2NrWSA9IHNoaWZ0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTg6IHsgLy8gQUxUXG4gICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfQ0VOVEVSKSB7XG4gICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxOyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzE7XG4gICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxOyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjE7XG4gICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0VcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9TUEFDRSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsgZHggKiBzaWduWDtcbiAgICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwgbjAgPSBuMSArIGR5ICogc2lnblk7XG4gICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTtcbiAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xO1xuICAgICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlXSk7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQpIHtcbiAgICBlbWl0dGVyKHRoaXMsIGFyZ3VtZW50cykubW92ZWQoZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCkge1xuICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5lbmRlZChldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX19icnVzaCB8fCB7c2VsZWN0aW9uOiBudWxsfTtcbiAgICBzdGF0ZS5leHRlbnQgPSBudW1iZXIyKGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICBzdGF0ZS5kaW0gPSBkaW07XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgYnJ1c2guZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQobnVtYmVyMihfKSksIGJydXNoKSA6IGV4dGVudDtcbiAgfTtcblxuICBicnVzaC5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBicnVzaCkgOiBmaWx0ZXI7XG4gIH07XG5cbiAgYnJ1c2gudG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgYnJ1c2gpIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIGJydXNoLmhhbmRsZVNpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaGFuZGxlU2l6ZSA9ICtfLCBicnVzaCkgOiBoYW5kbGVTaXplO1xuICB9O1xuXG4gIGJydXNoLmtleU1vZGlmaWVycyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gISFfLCBicnVzaCkgOiBrZXlzO1xuICB9O1xuXG4gIGJydXNoLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IGJydXNoIDogdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIGJydXNoO1xufVxuIiwgImNvbnN0IHBpID0gTWF0aC5QSSxcbiAgICB0YXUgPSAyICogcGksXG4gICAgZXBzaWxvbiA9IDFlLTYsXG4gICAgdGF1RXBzaWxvbiA9IHRhdSAtIGVwc2lsb247XG5cbmZ1bmN0aW9uIFBhdGgoKSB7XG4gIHRoaXMuX3gwID0gdGhpcy5feTAgPSAvLyBzdGFydCBvZiBjdXJyZW50IHN1YnBhdGhcbiAgdGhpcy5feDEgPSB0aGlzLl95MSA9IG51bGw7IC8vIGVuZCBvZiBjdXJyZW50IHN1YnBhdGhcbiAgdGhpcy5fID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gcGF0aCgpIHtcbiAgcmV0dXJuIG5ldyBQYXRoO1xufVxuXG5QYXRoLnByb3RvdHlwZSA9IHBhdGgucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogUGF0aCxcbiAgbW92ZVRvOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiTVwiICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpO1xuICB9LFxuICBjbG9zZVBhdGg6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl94MSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5feDEgPSB0aGlzLl94MCwgdGhpcy5feTEgPSB0aGlzLl95MDtcbiAgICAgIHRoaXMuXyArPSBcIlpcIjtcbiAgICB9XG4gIH0sXG4gIGxpbmVUbzogZnVuY3Rpb24oeCwgeSkge1xuICAgIHRoaXMuXyArPSBcIkxcIiArICh0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kxID0gK3kpO1xuICB9LFxuICBxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJRXCIgKyAoK3gxKSArIFwiLFwiICsgKCt5MSkgKyBcIixcIiArICh0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kxID0gK3kpO1xuICB9LFxuICBiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeCwgeSkge1xuICAgIHRoaXMuXyArPSBcIkNcIiArICgreDEpICsgXCIsXCIgKyAoK3kxKSArIFwiLFwiICsgKCt4MikgKyBcIixcIiArICgreTIpICsgXCIsXCIgKyAodGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgYXJjVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCByKSB7XG4gICAgeDEgPSAreDEsIHkxID0gK3kxLCB4MiA9ICt4MiwgeTIgPSAreTIsIHIgPSArcjtcbiAgICB2YXIgeDAgPSB0aGlzLl94MSxcbiAgICAgICAgeTAgPSB0aGlzLl95MSxcbiAgICAgICAgeDIxID0geDIgLSB4MSxcbiAgICAgICAgeTIxID0geTIgLSB5MSxcbiAgICAgICAgeDAxID0geDAgLSB4MSxcbiAgICAgICAgeTAxID0geTAgLSB5MSxcbiAgICAgICAgbDAxXzIgPSB4MDEgKiB4MDEgKyB5MDEgKiB5MDE7XG5cbiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci5cbiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcihcIm5lZ2F0aXZlIHJhZGl1czogXCIgKyByKTtcblxuICAgIC8vIElzIHRoaXMgcGF0aCBlbXB0eT8gTW92ZSB0byAoeDEseTEpLlxuICAgIGlmICh0aGlzLl94MSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fICs9IFwiTVwiICsgKHRoaXMuX3gxID0geDEpICsgXCIsXCIgKyAodGhpcy5feTEgPSB5MSk7XG4gICAgfVxuXG4gICAgLy8gT3IsIGlzICh4MSx5MSkgY29pbmNpZGVudCB3aXRoICh4MCx5MCk/IERvIG5vdGhpbmcuXG4gICAgZWxzZSBpZiAoIShsMDFfMiA+IGVwc2lsb24pKTtcblxuICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHkyKSBjb2xsaW5lYXI/XG4gICAgLy8gRXF1aXZhbGVudGx5LCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDIseTIpP1xuICAgIC8vIE9yLCBpcyB0aGUgcmFkaXVzIHplcm8/IExpbmUgdG8gKHgxLHkxKS5cbiAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNpbG9uKSB8fCAhcikge1xuICAgICAgdGhpcy5fICs9IFwiTFwiICsgKHRoaXMuX3gxID0geDEpICsgXCIsXCIgKyAodGhpcy5feTEgPSB5MSk7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFyYyFcbiAgICBlbHNlIHtcbiAgICAgIHZhciB4MjAgPSB4MiAtIHgwLFxuICAgICAgICAgIHkyMCA9IHkyIC0geTAsXG4gICAgICAgICAgbDIxXzIgPSB4MjEgKiB4MjEgKyB5MjEgKiB5MjEsXG4gICAgICAgICAgbDIwXzIgPSB4MjAgKiB4MjAgKyB5MjAgKiB5MjAsXG4gICAgICAgICAgbDIxID0gTWF0aC5zcXJ0KGwyMV8yKSxcbiAgICAgICAgICBsMDEgPSBNYXRoLnNxcnQobDAxXzIpLFxuICAgICAgICAgIGwgPSByICogTWF0aC50YW4oKHBpIC0gTWF0aC5hY29zKChsMjFfMiArIGwwMV8yIC0gbDIwXzIpIC8gKDIgKiBsMjEgKiBsMDEpKSkgLyAyKSxcbiAgICAgICAgICB0MDEgPSBsIC8gbDAxLFxuICAgICAgICAgIHQyMSA9IGwgLyBsMjE7XG5cbiAgICAgIC8vIElmIHRoZSBzdGFydCB0YW5nZW50IGlzIG5vdCBjb2luY2lkZW50IHdpdGggKHgwLHkwKSwgbGluZSB0by5cbiAgICAgIGlmIChNYXRoLmFicyh0MDEgLSAxKSA+IGVwc2lsb24pIHtcbiAgICAgICAgdGhpcy5fICs9IFwiTFwiICsgKHgxICsgdDAxICogeDAxKSArIFwiLFwiICsgKHkxICsgdDAxICogeTAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fICs9IFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsMCxcIiArICgrKHkwMSAqIHgyMCA+IHgwMSAqIHkyMCkpICsgXCIsXCIgKyAodGhpcy5feDEgPSB4MSArIHQyMSAqIHgyMSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkxICsgdDIxICogeTIxKTtcbiAgICB9XG4gIH0sXG4gIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBjY3cpIHtcbiAgICB4ID0gK3gsIHkgPSAreSwgciA9ICtyLCBjY3cgPSAhIWNjdztcbiAgICB2YXIgZHggPSByICogTWF0aC5jb3MoYTApLFxuICAgICAgICBkeSA9IHIgKiBNYXRoLnNpbihhMCksXG4gICAgICAgIHgwID0geCArIGR4LFxuICAgICAgICB5MCA9IHkgKyBkeSxcbiAgICAgICAgY3cgPSAxIF4gY2N3LFxuICAgICAgICBkYSA9IGNjdyA/IGEwIC0gYTEgOiBhMSAtIGEwO1xuXG4gICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuXG4gICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJuZWdhdGl2ZSByYWRpdXM6IFwiICsgcik7XG5cbiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgwLHkwKS5cbiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuXyArPSBcIk1cIiArIHgwICsgXCIsXCIgKyB5MDtcbiAgICB9XG5cbiAgICAvLyBPciwgaXMgKHgwLHkwKSBub3QgY29pbmNpZGVudCB3aXRoIHRoZSBwcmV2aW91cyBwb2ludD8gTGluZSB0byAoeDAseTApLlxuICAgIGVsc2UgaWYgKE1hdGguYWJzKHRoaXMuX3gxIC0geDApID4gZXBzaWxvbiB8fCBNYXRoLmFicyh0aGlzLl95MSAtIHkwKSA+IGVwc2lsb24pIHtcbiAgICAgIHRoaXMuXyArPSBcIkxcIiArIHgwICsgXCIsXCIgKyB5MDtcbiAgICB9XG5cbiAgICAvLyBJcyB0aGlzIGFyYyBlbXB0eT8gV2VcdTIwMTlyZSBkb25lLlxuICAgIGlmICghcikgcmV0dXJuO1xuXG4gICAgLy8gRG9lcyB0aGUgYW5nbGUgZ28gdGhlIHdyb25nIHdheT8gRmxpcCB0aGUgZGlyZWN0aW9uLlxuICAgIGlmIChkYSA8IDApIGRhID0gZGEgJSB0YXUgKyB0YXU7XG5cbiAgICAvLyBJcyB0aGlzIGEgY29tcGxldGUgY2lyY2xlPyBEcmF3IHR3byBhcmNzIHRvIGNvbXBsZXRlIHRoZSBjaXJjbGUuXG4gICAgaWYgKGRhID4gdGF1RXBzaWxvbikge1xuICAgICAgdGhpcy5fICs9IFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsMSxcIiArIGN3ICsgXCIsXCIgKyAoeCAtIGR4KSArIFwiLFwiICsgKHkgLSBkeSkgKyBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLDEsXCIgKyBjdyArIFwiLFwiICsgKHRoaXMuX3gxID0geDApICsgXCIsXCIgKyAodGhpcy5feTEgPSB5MCk7XG4gICAgfVxuXG4gICAgLy8gSXMgdGhpcyBhcmMgbm9uLWVtcHR5PyBEcmF3IGFuIGFyYyFcbiAgICBlbHNlIGlmIChkYSA+IGVwc2lsb24pIHtcbiAgICAgIHRoaXMuXyArPSBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLFwiICsgKCsoZGEgPj0gcGkpKSArIFwiLFwiICsgY3cgKyBcIixcIiArICh0aGlzLl94MSA9IHggKyByICogTWF0aC5jb3MoYTEpKSArIFwiLFwiICsgKHRoaXMuX3kxID0geSArIHIgKiBNYXRoLnNpbihhMSkpO1xuICAgIH1cbiAgfSxcbiAgcmVjdDogZnVuY3Rpb24oeCwgeSwgdywgaCkge1xuICAgIHRoaXMuXyArPSBcIk1cIiArICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KSArIFwiaFwiICsgKCt3KSArIFwidlwiICsgKCtoKSArIFwiaFwiICsgKC13KSArIFwiWlwiO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuXztcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0aDtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5KSB7XG4gIHZhciBub2Rlcywgc3RyZW5ndGggPSAxO1xuXG4gIGlmICh4ID09IG51bGwpIHggPSAwO1xuICBpZiAoeSA9PSBudWxsKSB5ID0gMDtcblxuICBmdW5jdGlvbiBmb3JjZSgpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3ggPSAwLFxuICAgICAgICBzeSA9IDA7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIHN4ICs9IG5vZGUueCwgc3kgKz0gbm9kZS55O1xuICAgIH1cblxuICAgIGZvciAoc3ggPSAoc3ggLyBuIC0geCkgKiBzdHJlbmd0aCwgc3kgPSAoc3kgLyBuIC0geSkgKiBzdHJlbmd0aCwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS54IC09IHN4LCBub2RlLnkgLT0gc3k7XG4gICAgfVxuICB9XG5cbiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBub2RlcyA9IF87XG4gIH07XG5cbiAgZm9yY2UueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gK18sIGZvcmNlKSA6IHg7XG4gIH07XG5cbiAgZm9yY2UueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gK18sIGZvcmNlKSA6IHk7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSArXywgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGQpIHtcbiAgY29uc3QgeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCksXG4gICAgICB5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKTtcbiAgcmV0dXJuIGFkZCh0aGlzLmNvdmVyKHgsIHkpLCB4LCB5LCBkKTtcbn1cblxuZnVuY3Rpb24gYWRkKHRyZWUsIHgsIHksIGQpIHtcbiAgaWYgKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSByZXR1cm4gdHJlZTsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzXG5cbiAgdmFyIHBhcmVudCxcbiAgICAgIG5vZGUgPSB0cmVlLl9yb290LFxuICAgICAgbGVhZiA9IHtkYXRhOiBkfSxcbiAgICAgIHgwID0gdHJlZS5feDAsXG4gICAgICB5MCA9IHRyZWUuX3kwLFxuICAgICAgeDEgPSB0cmVlLl94MSxcbiAgICAgIHkxID0gdHJlZS5feTEsXG4gICAgICB4bSxcbiAgICAgIHltLFxuICAgICAgeHAsXG4gICAgICB5cCxcbiAgICAgIHJpZ2h0LFxuICAgICAgYm90dG9tLFxuICAgICAgaSxcbiAgICAgIGo7XG5cbiAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFmLlxuICBpZiAoIW5vZGUpIHJldHVybiB0cmVlLl9yb290ID0gbGVhZiwgdHJlZTtcblxuICAvLyBGaW5kIHRoZSBleGlzdGluZyBsZWFmIGZvciB0aGUgbmV3IHBvaW50LCBvciBhZGQgaXQuXG4gIHdoaWxlIChub2RlLmxlbmd0aCkge1xuICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTtcbiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltO1xuICAgIGlmIChwYXJlbnQgPSBub2RlLCAhKG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkpIHJldHVybiBwYXJlbnRbaV0gPSBsZWFmLCB0cmVlO1xuICB9XG5cbiAgLy8gSXMgdGhlIG5ldyBwb2ludCBpcyBleGFjdGx5IGNvaW5jaWRlbnQgd2l0aCB0aGUgZXhpc3RpbmcgcG9pbnQ/XG4gIHhwID0gK3RyZWUuX3guY2FsbChudWxsLCBub2RlLmRhdGEpO1xuICB5cCA9ICt0cmVlLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKTtcbiAgaWYgKHggPT09IHhwICYmIHkgPT09IHlwKSByZXR1cm4gbGVhZi5uZXh0ID0gbm9kZSwgcGFyZW50ID8gcGFyZW50W2ldID0gbGVhZiA6IHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlO1xuXG4gIC8vIE90aGVyd2lzZSwgc3BsaXQgdGhlIGxlYWYgbm9kZSB1bnRpbCB0aGUgb2xkIGFuZCBuZXcgcG9pbnQgYXJlIHNlcGFyYXRlZC5cbiAgZG8ge1xuICAgIHBhcmVudCA9IHBhcmVudCA/IHBhcmVudFtpXSA9IG5ldyBBcnJheSg0KSA6IHRyZWUuX3Jvb3QgPSBuZXcgQXJyYXkoNCk7XG4gICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtO1xuICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07XG4gIH0gd2hpbGUgKChpID0gYm90dG9tIDw8IDEgfCByaWdodCkgPT09IChqID0gKHlwID49IHltKSA8PCAxIHwgKHhwID49IHhtKSkpO1xuICByZXR1cm4gcGFyZW50W2pdID0gbm9kZSwgcGFyZW50W2ldID0gbGVhZiwgdHJlZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEFsbChkYXRhKSB7XG4gIHZhciBkLCBpLCBuID0gZGF0YS5sZW5ndGgsXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHh6ID0gbmV3IEFycmF5KG4pLFxuICAgICAgeXogPSBuZXcgQXJyYXkobiksXG4gICAgICB4MCA9IEluZmluaXR5LFxuICAgICAgeTAgPSBJbmZpbml0eSxcbiAgICAgIHgxID0gLUluZmluaXR5LFxuICAgICAgeTEgPSAtSW5maW5pdHk7XG5cbiAgLy8gQ29tcHV0ZSB0aGUgcG9pbnRzIGFuZCB0aGVpciBleHRlbnQuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoaXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCA9IGRhdGFbaV0pKSB8fCBpc05hTih5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKSkpIGNvbnRpbnVlO1xuICAgIHh6W2ldID0geDtcbiAgICB5eltpXSA9IHk7XG4gICAgaWYgKHggPCB4MCkgeDAgPSB4O1xuICAgIGlmICh4ID4geDEpIHgxID0geDtcbiAgICBpZiAoeSA8IHkwKSB5MCA9IHk7XG4gICAgaWYgKHkgPiB5MSkgeTEgPSB5O1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgd2VyZSBubyAodmFsaWQpIHBvaW50cywgYWJvcnQuXG4gIGlmICh4MCA+IHgxIHx8IHkwID4geTEpIHJldHVybiB0aGlzO1xuXG4gIC8vIEV4cGFuZCB0aGUgdHJlZSB0byBjb3ZlciB0aGUgbmV3IHBvaW50cy5cbiAgdGhpcy5jb3Zlcih4MCwgeTApLmNvdmVyKHgxLCB5MSk7XG5cbiAgLy8gQWRkIHRoZSBuZXcgcG9pbnRzLlxuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgYWRkKHRoaXMsIHh6W2ldLCB5eltpXSwgZGF0YVtpXSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5KSB7XG4gIGlmIChpc05hTih4ID0gK3gpIHx8IGlzTmFOKHkgPSAreSkpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHNcblxuICB2YXIgeDAgPSB0aGlzLl94MCxcbiAgICAgIHkwID0gdGhpcy5feTAsXG4gICAgICB4MSA9IHRoaXMuX3gxLFxuICAgICAgeTEgPSB0aGlzLl95MTtcblxuICAvLyBJZiB0aGUgcXVhZHRyZWUgaGFzIG5vIGV4dGVudCwgaW5pdGlhbGl6ZSB0aGVtLlxuICAvLyBJbnRlZ2VyIGV4dGVudCBhcmUgbmVjZXNzYXJ5IHNvIHRoYXQgaWYgd2UgbGF0ZXIgZG91YmxlIHRoZSBleHRlbnQsXG4gIC8vIHRoZSBleGlzdGluZyBxdWFkcmFudCBib3VuZGFyaWVzIGRvblx1MjAxOXQgY2hhbmdlIGR1ZSB0byBmbG9hdGluZyBwb2ludCBlcnJvciFcbiAgaWYgKGlzTmFOKHgwKSkge1xuICAgIHgxID0gKHgwID0gTWF0aC5mbG9vcih4KSkgKyAxO1xuICAgIHkxID0gKHkwID0gTWF0aC5mbG9vcih5KSkgKyAxO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCBkb3VibGUgcmVwZWF0ZWRseSB0byBjb3Zlci5cbiAgZWxzZSB7XG4gICAgdmFyIHogPSB4MSAtIHgwIHx8IDEsXG4gICAgICAgIG5vZGUgPSB0aGlzLl9yb290LFxuICAgICAgICBwYXJlbnQsXG4gICAgICAgIGk7XG5cbiAgICB3aGlsZSAoeDAgPiB4IHx8IHggPj0geDEgfHwgeTAgPiB5IHx8IHkgPj0geTEpIHtcbiAgICAgIGkgPSAoeSA8IHkwKSA8PCAxIHwgKHggPCB4MCk7XG4gICAgICBwYXJlbnQgPSBuZXcgQXJyYXkoNCksIHBhcmVudFtpXSA9IG5vZGUsIG5vZGUgPSBwYXJlbnQsIHogKj0gMjtcbiAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICBjYXNlIDA6IHgxID0geDAgKyB6LCB5MSA9IHkwICsgejsgYnJlYWs7XG4gICAgICAgIGNhc2UgMTogeDAgPSB4MSAtIHosIHkxID0geTAgKyB6OyBicmVhaztcbiAgICAgICAgY2FzZSAyOiB4MSA9IHgwICsgeiwgeTAgPSB5MSAtIHo7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IHgwID0geDEgLSB6LCB5MCA9IHkxIC0gejsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Jvb3QgJiYgdGhpcy5fcm9vdC5sZW5ndGgpIHRoaXMuX3Jvb3QgPSBub2RlO1xuICB9XG5cbiAgdGhpcy5feDAgPSB4MDtcbiAgdGhpcy5feTAgPSB5MDtcbiAgdGhpcy5feDEgPSB4MTtcbiAgdGhpcy5feTEgPSB5MTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBkYXRhID0gW107XG4gIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghbm9kZS5sZW5ndGgpIGRvIGRhdGEucHVzaChub2RlLmRhdGEpOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4dClcbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKF8pIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5jb3ZlcigrX1swXVswXSwgK19bMF1bMV0pLmNvdmVyKCtfWzFdWzBdLCArX1sxXVsxXSlcbiAgICAgIDogaXNOYU4odGhpcy5feDApID8gdW5kZWZpbmVkIDogW1t0aGlzLl94MCwgdGhpcy5feTBdLCBbdGhpcy5feDEsIHRoaXMuX3kxXV07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdGhpcy5ub2RlID0gbm9kZTtcbiAgdGhpcy54MCA9IHgwO1xuICB0aGlzLnkwID0geTA7XG4gIHRoaXMueDEgPSB4MTtcbiAgdGhpcy55MSA9IHkxO1xufVxuIiwgImltcG9ydCBRdWFkIGZyb20gXCIuL3F1YWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgeSwgcmFkaXVzKSB7XG4gIHZhciBkYXRhLFxuICAgICAgeDAgPSB0aGlzLl94MCxcbiAgICAgIHkwID0gdGhpcy5feTAsXG4gICAgICB4MSxcbiAgICAgIHkxLFxuICAgICAgeDIsXG4gICAgICB5MixcbiAgICAgIHgzID0gdGhpcy5feDEsXG4gICAgICB5MyA9IHRoaXMuX3kxLFxuICAgICAgcXVhZHMgPSBbXSxcbiAgICAgIG5vZGUgPSB0aGlzLl9yb290LFxuICAgICAgcSxcbiAgICAgIGk7XG5cbiAgaWYgKG5vZGUpIHF1YWRzLnB1c2gobmV3IFF1YWQobm9kZSwgeDAsIHkwLCB4MywgeTMpKTtcbiAgaWYgKHJhZGl1cyA9PSBudWxsKSByYWRpdXMgPSBJbmZpbml0eTtcbiAgZWxzZSB7XG4gICAgeDAgPSB4IC0gcmFkaXVzLCB5MCA9IHkgLSByYWRpdXM7XG4gICAgeDMgPSB4ICsgcmFkaXVzLCB5MyA9IHkgKyByYWRpdXM7XG4gICAgcmFkaXVzICo9IHJhZGl1cztcbiAgfVxuXG4gIHdoaWxlIChxID0gcXVhZHMucG9wKCkpIHtcblxuICAgIC8vIFN0b3Agc2VhcmNoaW5nIGlmIHRoaXMgcXVhZHJhbnQgY2FuXHUyMDE5dCBjb250YWluIGEgY2xvc2VyIG5vZGUuXG4gICAgaWYgKCEobm9kZSA9IHEubm9kZSlcbiAgICAgICAgfHwgKHgxID0gcS54MCkgPiB4M1xuICAgICAgICB8fCAoeTEgPSBxLnkwKSA+IHkzXG4gICAgICAgIHx8ICh4MiA9IHEueDEpIDwgeDBcbiAgICAgICAgfHwgKHkyID0gcS55MSkgPCB5MCkgY29udGludWU7XG5cbiAgICAvLyBCaXNlY3QgdGhlIGN1cnJlbnQgcXVhZHJhbnQuXG4gICAgaWYgKG5vZGUubGVuZ3RoKSB7XG4gICAgICB2YXIgeG0gPSAoeDEgKyB4MikgLyAyLFxuICAgICAgICAgIHltID0gKHkxICsgeTIpIC8gMjtcblxuICAgICAgcXVhZHMucHVzaChcbiAgICAgICAgbmV3IFF1YWQobm9kZVszXSwgeG0sIHltLCB4MiwgeTIpLFxuICAgICAgICBuZXcgUXVhZChub2RlWzJdLCB4MSwgeW0sIHhtLCB5MiksXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbMV0sIHhtLCB5MSwgeDIsIHltKSxcbiAgICAgICAgbmV3IFF1YWQobm9kZVswXSwgeDEsIHkxLCB4bSwgeW0pXG4gICAgICApO1xuXG4gICAgICAvLyBWaXNpdCB0aGUgY2xvc2VzdCBxdWFkcmFudCBmaXJzdC5cbiAgICAgIGlmIChpID0gKHkgPj0geW0pIDw8IDEgfCAoeCA+PSB4bSkpIHtcbiAgICAgICAgcSA9IHF1YWRzW3F1YWRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBxdWFkc1txdWFkcy5sZW5ndGggLSAxXSA9IHF1YWRzW3F1YWRzLmxlbmd0aCAtIDEgLSBpXTtcbiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldID0gcTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWaXNpdCB0aGlzIHBvaW50LiAoVmlzaXRpbmcgY29pbmNpZGVudCBwb2ludHMgaXNuXHUyMDE5dCBuZWNlc3NhcnkhKVxuICAgIGVsc2Uge1xuICAgICAgdmFyIGR4ID0geCAtICt0aGlzLl94LmNhbGwobnVsbCwgbm9kZS5kYXRhKSxcbiAgICAgICAgICBkeSA9IHkgLSArdGhpcy5feS5jYWxsKG51bGwsIG5vZGUuZGF0YSksXG4gICAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICAgIGlmIChkMiA8IHJhZGl1cykge1xuICAgICAgICB2YXIgZCA9IE1hdGguc3FydChyYWRpdXMgPSBkMik7XG4gICAgICAgIHgwID0geCAtIGQsIHkwID0geSAtIGQ7XG4gICAgICAgIHgzID0geCArIGQsIHkzID0geSArIGQ7XG4gICAgICAgIGRhdGEgPSBub2RlLmRhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICBpZiAoaXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50c1xuXG4gIHZhciBwYXJlbnQsXG4gICAgICBub2RlID0gdGhpcy5fcm9vdCxcbiAgICAgIHJldGFpbmVyLFxuICAgICAgcHJldmlvdXMsXG4gICAgICBuZXh0LFxuICAgICAgeDAgPSB0aGlzLl94MCxcbiAgICAgIHkwID0gdGhpcy5feTAsXG4gICAgICB4MSA9IHRoaXMuX3gxLFxuICAgICAgeTEgPSB0aGlzLl95MSxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeG0sXG4gICAgICB5bSxcbiAgICAgIHJpZ2h0LFxuICAgICAgYm90dG9tLFxuICAgICAgaSxcbiAgICAgIGo7XG5cbiAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFmLlxuICBpZiAoIW5vZGUpIHJldHVybiB0aGlzO1xuXG4gIC8vIEZpbmQgdGhlIGxlYWYgbm9kZSBmb3IgdGhlIHBvaW50LlxuICAvLyBXaGlsZSBkZXNjZW5kaW5nLCBhbHNvIHJldGFpbiB0aGUgZGVlcGVzdCBwYXJlbnQgd2l0aCBhIG5vbi1yZW1vdmVkIHNpYmxpbmcuXG4gIGlmIChub2RlLmxlbmd0aCkgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07XG4gICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTtcbiAgICBpZiAoIShwYXJlbnQgPSBub2RlLCBub2RlID0gbm9kZVtpID0gYm90dG9tIDw8IDEgfCByaWdodF0pKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBicmVhaztcbiAgICBpZiAocGFyZW50WyhpICsgMSkgJiAzXSB8fCBwYXJlbnRbKGkgKyAyKSAmIDNdIHx8IHBhcmVudFsoaSArIDMpICYgM10pIHJldGFpbmVyID0gcGFyZW50LCBqID0gaTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIHBvaW50IHRvIHJlbW92ZS5cbiAgd2hpbGUgKG5vZGUuZGF0YSAhPT0gZCkgaWYgKCEocHJldmlvdXMgPSBub2RlLCBub2RlID0gbm9kZS5uZXh0KSkgcmV0dXJuIHRoaXM7XG4gIGlmIChuZXh0ID0gbm9kZS5uZXh0KSBkZWxldGUgbm9kZS5uZXh0O1xuXG4gIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb2luY2lkZW50IHBvaW50cywgcmVtb3ZlIGp1c3QgdGhlIHBvaW50LlxuICBpZiAocHJldmlvdXMpIHJldHVybiAobmV4dCA/IHByZXZpb3VzLm5leHQgPSBuZXh0IDogZGVsZXRlIHByZXZpb3VzLm5leHQpLCB0aGlzO1xuXG4gIC8vIElmIHRoaXMgaXMgdGhlIHJvb3QgcG9pbnQsIHJlbW92ZSBpdC5cbiAgaWYgKCFwYXJlbnQpIHJldHVybiB0aGlzLl9yb290ID0gbmV4dCwgdGhpcztcblxuICAvLyBSZW1vdmUgdGhpcyBsZWFmLlxuICBuZXh0ID8gcGFyZW50W2ldID0gbmV4dCA6IGRlbGV0ZSBwYXJlbnRbaV07XG5cbiAgLy8gSWYgdGhlIHBhcmVudCBub3cgY29udGFpbnMgZXhhY3RseSBvbmUgbGVhZiwgY29sbGFwc2Ugc3VwZXJmbHVvdXMgcGFyZW50cy5cbiAgaWYgKChub2RlID0gcGFyZW50WzBdIHx8IHBhcmVudFsxXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzNdKVxuICAgICAgJiYgbm9kZSA9PT0gKHBhcmVudFszXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFswXSlcbiAgICAgICYmICFub2RlLmxlbmd0aCkge1xuICAgIGlmIChyZXRhaW5lcikgcmV0YWluZXJbal0gPSBub2RlO1xuICAgIGVsc2UgdGhpcy5fcm9vdCA9IG5vZGU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbChkYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gZGF0YS5sZW5ndGg7IGkgPCBuOyArK2kpIHRoaXMucmVtb3ZlKGRhdGFbaV0pO1xuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBzaXplID0gMDtcbiAgdGhpcy52aXNpdChmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKCFub2RlLmxlbmd0aCkgZG8gKytzaXplOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4dClcbiAgfSk7XG4gIHJldHVybiBzaXplO1xufVxuIiwgImltcG9ydCBRdWFkIGZyb20gXCIuL3F1YWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIHF1YWRzID0gW10sIHEsIG5vZGUgPSB0aGlzLl9yb290LCBjaGlsZCwgeDAsIHkwLCB4MSwgeTE7XG4gIGlmIChub2RlKSBxdWFkcy5wdXNoKG5ldyBRdWFkKG5vZGUsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSk7XG4gIHdoaWxlIChxID0gcXVhZHMucG9wKCkpIHtcbiAgICBpZiAoIWNhbGxiYWNrKG5vZGUgPSBxLm5vZGUsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSkgJiYgbm9kZS5sZW5ndGgpIHtcbiAgICAgIHZhciB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsgeTEpIC8gMjtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5bSwgeDEsIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzJdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeW0sIHhtLCB5MSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMF0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5MCwgeG0sIHltKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBRdWFkIGZyb20gXCIuL3F1YWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIHF1YWRzID0gW10sIG5leHQgPSBbXSwgcTtcbiAgaWYgKHRoaXMuX3Jvb3QpIHF1YWRzLnB1c2gobmV3IFF1YWQodGhpcy5fcm9vdCwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTtcbiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkge1xuICAgIHZhciBub2RlID0gcS5ub2RlO1xuICAgIGlmIChub2RlLmxlbmd0aCkge1xuICAgICAgdmFyIGNoaWxkLCB4MCA9IHEueDAsIHkwID0gcS55MCwgeDEgPSBxLngxLCB5MSA9IHEueTEsIHhtID0gKHgwICsgeDEpIC8gMiwgeW0gPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHkwLCB4bSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5MCwgeDEsIHltKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzJdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeW0sIHhtLCB5MSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHltLCB4MSwgeTEpKTtcbiAgICB9XG4gICAgbmV4dC5wdXNoKHEpO1xuICB9XG4gIHdoaWxlIChxID0gbmV4dC5wb3AoKSkge1xuICAgIGNhbGxiYWNrKHEubm9kZSwgcS54MCwgcS55MCwgcS54MSwgcS55MSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRYKGQpIHtcbiAgcmV0dXJuIGRbMF07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKF8pIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5feCA9IF8sIHRoaXMpIDogdGhpcy5feDtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gZGVmYXVsdFkoZCkge1xuICByZXR1cm4gZFsxXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl95ID0gXywgdGhpcykgOiB0aGlzLl95O1xufVxuIiwgImltcG9ydCB0cmVlX2FkZCwge2FkZEFsbCBhcyB0cmVlX2FkZEFsbH0gZnJvbSBcIi4vYWRkLmpzXCI7XG5pbXBvcnQgdHJlZV9jb3ZlciBmcm9tIFwiLi9jb3Zlci5qc1wiO1xuaW1wb3J0IHRyZWVfZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgdHJlZV9leHRlbnQgZnJvbSBcIi4vZXh0ZW50LmpzXCI7XG5pbXBvcnQgdHJlZV9maW5kIGZyb20gXCIuL2ZpbmQuanNcIjtcbmltcG9ydCB0cmVlX3JlbW92ZSwge3JlbW92ZUFsbCBhcyB0cmVlX3JlbW92ZUFsbH0gZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgdHJlZV9yb290IGZyb20gXCIuL3Jvb3QuanNcIjtcbmltcG9ydCB0cmVlX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHRyZWVfdmlzaXQgZnJvbSBcIi4vdmlzaXQuanNcIjtcbmltcG9ydCB0cmVlX3Zpc2l0QWZ0ZXIgZnJvbSBcIi4vdmlzaXRBZnRlci5qc1wiO1xuaW1wb3J0IHRyZWVfeCwge2RlZmF1bHRYfSBmcm9tIFwiLi94LmpzXCI7XG5pbXBvcnQgdHJlZV95LCB7ZGVmYXVsdFl9IGZyb20gXCIuL3kuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhZHRyZWUobm9kZXMsIHgsIHkpIHtcbiAgdmFyIHRyZWUgPSBuZXcgUXVhZHRyZWUoeCA9PSBudWxsID8gZGVmYXVsdFggOiB4LCB5ID09IG51bGwgPyBkZWZhdWx0WSA6IHksIE5hTiwgTmFOLCBOYU4sIE5hTik7XG4gIHJldHVybiBub2RlcyA9PSBudWxsID8gdHJlZSA6IHRyZWUuYWRkQWxsKG5vZGVzKTtcbn1cblxuZnVuY3Rpb24gUXVhZHRyZWUoeCwgeSwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdGhpcy5feCA9IHg7XG4gIHRoaXMuX3kgPSB5O1xuICB0aGlzLl94MCA9IHgwO1xuICB0aGlzLl95MCA9IHkwO1xuICB0aGlzLl94MSA9IHgxO1xuICB0aGlzLl95MSA9IHkxO1xuICB0aGlzLl9yb290ID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBsZWFmX2NvcHkobGVhZikge1xuICB2YXIgY29weSA9IHtkYXRhOiBsZWFmLmRhdGF9LCBuZXh0ID0gY29weTtcbiAgd2hpbGUgKGxlYWYgPSBsZWFmLm5leHQpIG5leHQgPSBuZXh0Lm5leHQgPSB7ZGF0YTogbGVhZi5kYXRhfTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbnZhciB0cmVlUHJvdG8gPSBxdWFkdHJlZS5wcm90b3R5cGUgPSBRdWFkdHJlZS5wcm90b3R5cGU7XG5cbnRyZWVQcm90by5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjb3B5ID0gbmV3IFF1YWR0cmVlKHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSxcbiAgICAgIG5vZGUgPSB0aGlzLl9yb290LFxuICAgICAgbm9kZXMsXG4gICAgICBjaGlsZDtcblxuICBpZiAoIW5vZGUpIHJldHVybiBjb3B5O1xuXG4gIGlmICghbm9kZS5sZW5ndGgpIHJldHVybiBjb3B5Ll9yb290ID0gbGVhZl9jb3B5KG5vZGUpLCBjb3B5O1xuXG4gIG5vZGVzID0gW3tzb3VyY2U6IG5vZGUsIHRhcmdldDogY29weS5fcm9vdCA9IG5ldyBBcnJheSg0KX1dO1xuICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGUuc291cmNlW2ldKSB7XG4gICAgICAgIGlmIChjaGlsZC5sZW5ndGgpIG5vZGVzLnB1c2goe3NvdXJjZTogY2hpbGQsIHRhcmdldDogbm9kZS50YXJnZXRbaV0gPSBuZXcgQXJyYXkoNCl9KTtcbiAgICAgICAgZWxzZSBub2RlLnRhcmdldFtpXSA9IGxlYWZfY29weShjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59O1xuXG50cmVlUHJvdG8uYWRkID0gdHJlZV9hZGQ7XG50cmVlUHJvdG8uYWRkQWxsID0gdHJlZV9hZGRBbGw7XG50cmVlUHJvdG8uY292ZXIgPSB0cmVlX2NvdmVyO1xudHJlZVByb3RvLmRhdGEgPSB0cmVlX2RhdGE7XG50cmVlUHJvdG8uZXh0ZW50ID0gdHJlZV9leHRlbnQ7XG50cmVlUHJvdG8uZmluZCA9IHRyZWVfZmluZDtcbnRyZWVQcm90by5yZW1vdmUgPSB0cmVlX3JlbW92ZTtcbnRyZWVQcm90by5yZW1vdmVBbGwgPSB0cmVlX3JlbW92ZUFsbDtcbnRyZWVQcm90by5yb290ID0gdHJlZV9yb290O1xudHJlZVByb3RvLnNpemUgPSB0cmVlX3NpemU7XG50cmVlUHJvdG8udmlzaXQgPSB0cmVlX3Zpc2l0O1xudHJlZVByb3RvLnZpc2l0QWZ0ZXIgPSB0cmVlX3Zpc2l0QWZ0ZXI7XG50cmVlUHJvdG8ueCA9IHRyZWVfeDtcbnRyZWVQcm90by55ID0gdHJlZV95O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJhbmRvbSkge1xuICByZXR1cm4gKHJhbmRvbSgpIC0gMC41KSAqIDFlLTY7XG59XG4iLCAiaW1wb3J0IHtxdWFkdHJlZX0gZnJvbSBcImQzLXF1YWR0cmVlXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlLmpzXCI7XG5cbmZ1bmN0aW9uIHgoZCkge1xuICByZXR1cm4gZC54ICsgZC52eDtcbn1cblxuZnVuY3Rpb24geShkKSB7XG4gIHJldHVybiBkLnkgKyBkLnZ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyYWRpdXMpIHtcbiAgdmFyIG5vZGVzLFxuICAgICAgcmFkaWksXG4gICAgICByYW5kb20sXG4gICAgICBzdHJlbmd0aCA9IDEsXG4gICAgICBpdGVyYXRpb25zID0gMTtcblxuICBpZiAodHlwZW9mIHJhZGl1cyAhPT0gXCJmdW5jdGlvblwiKSByYWRpdXMgPSBjb25zdGFudChyYWRpdXMgPT0gbnVsbCA/IDEgOiArcmFkaXVzKTtcblxuICBmdW5jdGlvbiBmb3JjZSgpIHtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgdHJlZSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgeGksXG4gICAgICAgIHlpLFxuICAgICAgICByaSxcbiAgICAgICAgcmkyO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBpdGVyYXRpb25zOyArK2spIHtcbiAgICAgIHRyZWUgPSBxdWFkdHJlZShub2RlcywgeCwgeSkudmlzaXRBZnRlcihwcmVwYXJlKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICByaSA9IHJhZGlpW25vZGUuaW5kZXhdLCByaTIgPSByaSAqIHJpO1xuICAgICAgICB4aSA9IG5vZGUueCArIG5vZGUudng7XG4gICAgICAgIHlpID0gbm9kZS55ICsgbm9kZS52eTtcbiAgICAgICAgdHJlZS52aXNpdChhcHBseSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICAgIHZhciBkYXRhID0gcXVhZC5kYXRhLCByaiA9IHF1YWQuciwgciA9IHJpICsgcmo7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5pbmRleCA+IG5vZGUuaW5kZXgpIHtcbiAgICAgICAgICB2YXIgeCA9IHhpIC0gZGF0YS54IC0gZGF0YS52eCxcbiAgICAgICAgICAgICAgeSA9IHlpIC0gZGF0YS55IC0gZGF0YS52eSxcbiAgICAgICAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7XG4gICAgICAgICAgaWYgKGwgPCByICogcikge1xuICAgICAgICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUocmFuZG9tKSwgbCArPSB4ICogeDtcbiAgICAgICAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geSAqIHk7XG4gICAgICAgICAgICBsID0gKHIgLSAobCA9IE1hdGguc3FydChsKSkpIC8gbCAqIHN0cmVuZ3RoO1xuICAgICAgICAgICAgbm9kZS52eCArPSAoeCAqPSBsKSAqIChyID0gKHJqICo9IHJqKSAvIChyaTIgKyByaikpO1xuICAgICAgICAgICAgbm9kZS52eSArPSAoeSAqPSBsKSAqIHI7XG4gICAgICAgICAgICBkYXRhLnZ4IC09IHggKiAociA9IDEgLSByKTtcbiAgICAgICAgICAgIGRhdGEudnkgLT0geSAqIHI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4MCA+IHhpICsgciB8fCB4MSA8IHhpIC0gciB8fCB5MCA+IHlpICsgciB8fCB5MSA8IHlpIC0gcjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlKHF1YWQpIHtcbiAgICBpZiAocXVhZC5kYXRhKSByZXR1cm4gcXVhZC5yID0gcmFkaWlbcXVhZC5kYXRhLmluZGV4XTtcbiAgICBmb3IgKHZhciBpID0gcXVhZC5yID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgaWYgKHF1YWRbaV0gJiYgcXVhZFtpXS5yID4gcXVhZC5yKSB7XG4gICAgICAgIHF1YWQuciA9IHF1YWRbaV0ucjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTtcbiAgICByYWRpaSA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHJhZGlpW25vZGUuaW5kZXhdID0gK3JhZGl1cyhub2RlLCBpLCBub2Rlcyk7XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oX25vZGVzLCBfcmFuZG9tKSB7XG4gICAgbm9kZXMgPSBfbm9kZXM7XG4gICAgcmFuZG9tID0gX3JhbmRvbTtcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2UuaXRlcmF0aW9ucyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpdGVyYXRpb25zID0gK18sIGZvcmNlKSA6IGl0ZXJhdGlvbnM7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSArXywgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UucmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHJhZGl1cztcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCAiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgamlnZ2xlIGZyb20gXCIuL2ppZ2dsZS5qc1wiO1xuXG5mdW5jdGlvbiBpbmRleChkKSB7XG4gIHJldHVybiBkLmluZGV4O1xufVxuXG5mdW5jdGlvbiBmaW5kKG5vZGVCeUlkLCBub2RlSWQpIHtcbiAgdmFyIG5vZGUgPSBub2RlQnlJZC5nZXQobm9kZUlkKTtcbiAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJub2RlIG5vdCBmb3VuZDogXCIgKyBub2RlSWQpO1xuICByZXR1cm4gbm9kZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obGlua3MpIHtcbiAgdmFyIGlkID0gaW5kZXgsXG4gICAgICBzdHJlbmd0aCA9IGRlZmF1bHRTdHJlbmd0aCxcbiAgICAgIHN0cmVuZ3RocyxcbiAgICAgIGRpc3RhbmNlID0gY29uc3RhbnQoMzApLFxuICAgICAgZGlzdGFuY2VzLFxuICAgICAgbm9kZXMsXG4gICAgICBjb3VudCxcbiAgICAgIGJpYXMsXG4gICAgICByYW5kb20sXG4gICAgICBpdGVyYXRpb25zID0gMTtcblxuICBpZiAobGlua3MgPT0gbnVsbCkgbGlua3MgPSBbXTtcblxuICBmdW5jdGlvbiBkZWZhdWx0U3RyZW5ndGgobGluaykge1xuICAgIHJldHVybiAxIC8gTWF0aC5taW4oY291bnRbbGluay5zb3VyY2UuaW5kZXhdLCBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHtcbiAgICBmb3IgKHZhciBrID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxpbmssIHNvdXJjZSwgdGFyZ2V0LCB4LCB5LCBsLCBiOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGxpbmsgPSBsaW5rc1tpXSwgc291cmNlID0gbGluay5zb3VyY2UsIHRhcmdldCA9IGxpbmsudGFyZ2V0O1xuICAgICAgICB4ID0gdGFyZ2V0LnggKyB0YXJnZXQudnggLSBzb3VyY2UueCAtIHNvdXJjZS52eCB8fCBqaWdnbGUocmFuZG9tKTtcbiAgICAgICAgeSA9IHRhcmdldC55ICsgdGFyZ2V0LnZ5IC0gc291cmNlLnkgLSBzb3VyY2UudnkgfHwgamlnZ2xlKHJhbmRvbSk7XG4gICAgICAgIGwgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gICAgICAgIGwgPSAobCAtIGRpc3RhbmNlc1tpXSkgLyBsICogYWxwaGEgKiBzdHJlbmd0aHNbaV07XG4gICAgICAgIHggKj0gbCwgeSAqPSBsO1xuICAgICAgICB0YXJnZXQudnggLT0geCAqIChiID0gYmlhc1tpXSk7XG4gICAgICAgIHRhcmdldC52eSAtPSB5ICogYjtcbiAgICAgICAgc291cmNlLnZ4ICs9IHggKiAoYiA9IDEgLSBiKTtcbiAgICAgICAgc291cmNlLnZ5ICs9IHkgKiBiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuXG4gICAgdmFyIGksXG4gICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICAgIG0gPSBsaW5rcy5sZW5ndGgsXG4gICAgICAgIG5vZGVCeUlkID0gbmV3IE1hcChub2Rlcy5tYXAoKGQsIGkpID0+IFtpZChkLCBpLCBub2RlcyksIGRdKSksXG4gICAgICAgIGxpbms7XG5cbiAgICBmb3IgKGkgPSAwLCBjb3VudCA9IG5ldyBBcnJheShuKTsgaSA8IG07ICsraSkge1xuICAgICAgbGluayA9IGxpbmtzW2ldLCBsaW5rLmluZGV4ID0gaTtcbiAgICAgIGlmICh0eXBlb2YgbGluay5zb3VyY2UgIT09IFwib2JqZWN0XCIpIGxpbmsuc291cmNlID0gZmluZChub2RlQnlJZCwgbGluay5zb3VyY2UpO1xuICAgICAgaWYgKHR5cGVvZiBsaW5rLnRhcmdldCAhPT0gXCJvYmplY3RcIikgbGluay50YXJnZXQgPSBmaW5kKG5vZGVCeUlkLCBsaW5rLnRhcmdldCk7XG4gICAgICBjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gPSAoY291bnRbbGluay5zb3VyY2UuaW5kZXhdIHx8IDApICsgMTtcbiAgICAgIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSA9IChjb3VudFtsaW5rLnRhcmdldC5pbmRleF0gfHwgMCkgKyAxO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDAsIGJpYXMgPSBuZXcgQXJyYXkobSk7IGkgPCBtOyArK2kpIHtcbiAgICAgIGxpbmsgPSBsaW5rc1tpXSwgYmlhc1tpXSA9IGNvdW50W2xpbmsuc291cmNlLmluZGV4XSAvIChjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gKyBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0pO1xuICAgIH1cblxuICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShtKSwgaW5pdGlhbGl6ZVN0cmVuZ3RoKCk7XG4gICAgZGlzdGFuY2VzID0gbmV3IEFycmF5KG0pLCBpbml0aWFsaXplRGlzdGFuY2UoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemVTdHJlbmd0aCgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgc3RyZW5ndGhzW2ldID0gK3N0cmVuZ3RoKGxpbmtzW2ldLCBpLCBsaW5rcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZURpc3RhbmNlKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBkaXN0YW5jZXNbaV0gPSArZGlzdGFuY2UobGlua3NbaV0sIGksIGxpbmtzKTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oX25vZGVzLCBfcmFuZG9tKSB7XG4gICAgbm9kZXMgPSBfbm9kZXM7XG4gICAgcmFuZG9tID0gX3JhbmRvbTtcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2UubGlua3MgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobGlua3MgPSBfLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IGxpbmtzO1xuICB9O1xuXG4gIGZvcmNlLmlkID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlkID0gXywgZm9yY2UpIDogaWQ7XG4gIH07XG5cbiAgZm9yY2UuaXRlcmF0aW9ucyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpdGVyYXRpb25zID0gK18sIGZvcmNlKSA6IGl0ZXJhdGlvbnM7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZVN0cmVuZ3RoKCksIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIGZvcmNlLmRpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemVEaXN0YW5jZSgpLCBmb3JjZSkgOiBkaXN0YW5jZTtcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCAiLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2NvbmdydWVudGlhbF9nZW5lcmF0b3IjUGFyYW1ldGVyc19pbl9jb21tb25fdXNlXG5jb25zdCBhID0gMTY2NDUyNTtcbmNvbnN0IGMgPSAxMDEzOTA0MjIzO1xuY29uc3QgbSA9IDQyOTQ5NjcyOTY7IC8vIDJeMzJcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGxldCBzID0gMTtcbiAgcmV0dXJuICgpID0+IChzID0gKGEgKiBzICsgYykgJSBtKSAvIG07XG59XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3RpbWVyfSBmcm9tIFwiZDMtdGltZXJcIjtcbmltcG9ydCBsY2cgZnJvbSBcIi4vbGNnLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB4KGQpIHtcbiAgcmV0dXJuIGQueDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHkoZCkge1xuICByZXR1cm4gZC55O1xufVxuXG52YXIgaW5pdGlhbFJhZGl1cyA9IDEwLFxuICAgIGluaXRpYWxBbmdsZSA9IE1hdGguUEkgKiAoMyAtIE1hdGguc3FydCg1KSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGVzKSB7XG4gIHZhciBzaW11bGF0aW9uLFxuICAgICAgYWxwaGEgPSAxLFxuICAgICAgYWxwaGFNaW4gPSAwLjAwMSxcbiAgICAgIGFscGhhRGVjYXkgPSAxIC0gTWF0aC5wb3coYWxwaGFNaW4sIDEgLyAzMDApLFxuICAgICAgYWxwaGFUYXJnZXQgPSAwLFxuICAgICAgdmVsb2NpdHlEZWNheSA9IDAuNixcbiAgICAgIGZvcmNlcyA9IG5ldyBNYXAoKSxcbiAgICAgIHN0ZXBwZXIgPSB0aW1lcihzdGVwKSxcbiAgICAgIGV2ZW50ID0gZGlzcGF0Y2goXCJ0aWNrXCIsIFwiZW5kXCIpLFxuICAgICAgcmFuZG9tID0gbGNnKCk7XG5cbiAgaWYgKG5vZGVzID09IG51bGwpIG5vZGVzID0gW107XG5cbiAgZnVuY3Rpb24gc3RlcCgpIHtcbiAgICB0aWNrKCk7XG4gICAgZXZlbnQuY2FsbChcInRpY2tcIiwgc2ltdWxhdGlvbik7XG4gICAgaWYgKGFscGhhIDwgYWxwaGFNaW4pIHtcbiAgICAgIHN0ZXBwZXIuc3RvcCgpO1xuICAgICAgZXZlbnQuY2FsbChcImVuZFwiLCBzaW11bGF0aW9uKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGl0ZXJhdGlvbnMpIHtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTtcblxuICAgIGlmIChpdGVyYXRpb25zID09PSB1bmRlZmluZWQpIGl0ZXJhdGlvbnMgPSAxO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBpdGVyYXRpb25zOyArK2spIHtcbiAgICAgIGFscGhhICs9IChhbHBoYVRhcmdldCAtIGFscGhhKSAqIGFscGhhRGVjYXk7XG5cbiAgICAgIGZvcmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGZvcmNlKSB7XG4gICAgICAgIGZvcmNlKGFscGhhKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuZnggPT0gbnVsbCkgbm9kZS54ICs9IG5vZGUudnggKj0gdmVsb2NpdHlEZWNheTtcbiAgICAgICAgZWxzZSBub2RlLnggPSBub2RlLmZ4LCBub2RlLnZ4ID0gMDtcbiAgICAgICAgaWYgKG5vZGUuZnkgPT0gbnVsbCkgbm9kZS55ICs9IG5vZGUudnkgKj0gdmVsb2NpdHlEZWNheTtcbiAgICAgICAgZWxzZSBub2RlLnkgPSBub2RlLmZ5LCBub2RlLnZ5ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2ltdWxhdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemVOb2RlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLmluZGV4ID0gaTtcbiAgICAgIGlmIChub2RlLmZ4ICE9IG51bGwpIG5vZGUueCA9IG5vZGUuZng7XG4gICAgICBpZiAobm9kZS5meSAhPSBudWxsKSBub2RlLnkgPSBub2RlLmZ5O1xuICAgICAgaWYgKGlzTmFOKG5vZGUueCkgfHwgaXNOYU4obm9kZS55KSkge1xuICAgICAgICB2YXIgcmFkaXVzID0gaW5pdGlhbFJhZGl1cyAqIE1hdGguc3FydCgwLjUgKyBpKSwgYW5nbGUgPSBpICogaW5pdGlhbEFuZ2xlO1xuICAgICAgICBub2RlLnggPSByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIG5vZGUueSA9IHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc05hTihub2RlLnZ4KSB8fCBpc05hTihub2RlLnZ5KSkge1xuICAgICAgICBub2RlLnZ4ID0gbm9kZS52eSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZUZvcmNlKGZvcmNlKSB7XG4gICAgaWYgKGZvcmNlLmluaXRpYWxpemUpIGZvcmNlLmluaXRpYWxpemUobm9kZXMsIHJhbmRvbSk7XG4gICAgcmV0dXJuIGZvcmNlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZU5vZGVzKCk7XG5cbiAgcmV0dXJuIHNpbXVsYXRpb24gPSB7XG4gICAgdGljazogdGljayxcblxuICAgIHJlc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHN0ZXBwZXIucmVzdGFydChzdGVwKSwgc2ltdWxhdGlvbjtcbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RlcHBlci5zdG9wKCksIHNpbXVsYXRpb247XG4gICAgfSxcblxuICAgIG5vZGVzOiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlcyA9IF8sIGluaXRpYWxpemVOb2RlcygpLCBmb3JjZXMuZm9yRWFjaChpbml0aWFsaXplRm9yY2UpLCBzaW11bGF0aW9uKSA6IG5vZGVzO1xuICAgIH0sXG5cbiAgICBhbHBoYTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGEgPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYTtcbiAgICB9LFxuXG4gICAgYWxwaGFNaW46IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhTWluID0gK18sIHNpbXVsYXRpb24pIDogYWxwaGFNaW47XG4gICAgfSxcblxuICAgIGFscGhhRGVjYXk6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhRGVjYXkgPSArXywgc2ltdWxhdGlvbikgOiArYWxwaGFEZWNheTtcbiAgICB9LFxuXG4gICAgYWxwaGFUYXJnZXQ6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhVGFyZ2V0ID0gK18sIHNpbXVsYXRpb24pIDogYWxwaGFUYXJnZXQ7XG4gICAgfSxcblxuICAgIHZlbG9jaXR5RGVjYXk6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZlbG9jaXR5RGVjYXkgPSAxIC0gXywgc2ltdWxhdGlvbikgOiAxIC0gdmVsb2NpdHlEZWNheTtcbiAgICB9LFxuXG4gICAgcmFuZG9tU291cmNlOiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5kb20gPSBfLCBmb3JjZXMuZm9yRWFjaChpbml0aWFsaXplRm9yY2UpLCBzaW11bGF0aW9uKSA6IHJhbmRvbTtcbiAgICB9LFxuXG4gICAgZm9yY2U6IGZ1bmN0aW9uKG5hbWUsIF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMSA/ICgoXyA9PSBudWxsID8gZm9yY2VzLmRlbGV0ZShuYW1lKSA6IGZvcmNlcy5zZXQobmFtZSwgaW5pdGlhbGl6ZUZvcmNlKF8pKSksIHNpbXVsYXRpb24pIDogZm9yY2VzLmdldChuYW1lKTtcbiAgICB9LFxuXG4gICAgZmluZDogZnVuY3Rpb24oeCwgeSwgcmFkaXVzKSB7XG4gICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgICBkeCxcbiAgICAgICAgICBkeSxcbiAgICAgICAgICBkMixcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGNsb3Nlc3Q7XG5cbiAgICAgIGlmIChyYWRpdXMgPT0gbnVsbCkgcmFkaXVzID0gSW5maW5pdHk7XG4gICAgICBlbHNlIHJhZGl1cyAqPSByYWRpdXM7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBkeCA9IHggLSBub2RlLng7XG4gICAgICAgIGR5ID0geSAtIG5vZGUueTtcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICAgICAgaWYgKGQyIDwgcmFkaXVzKSBjbG9zZXN0ID0gbm9kZSwgcmFkaXVzID0gZDI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjbG9zZXN0O1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24obmFtZSwgXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gKGV2ZW50Lm9uKG5hbWUsIF8pLCBzaW11bGF0aW9uKSA6IGV2ZW50Lm9uKG5hbWUpO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQge3F1YWR0cmVlfSBmcm9tIFwiZDMtcXVhZHRyZWVcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGppZ2dsZSBmcm9tIFwiLi9qaWdnbGUuanNcIjtcbmltcG9ydCB7eCwgeX0gZnJvbSBcIi4vc2ltdWxhdGlvbi5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5vZGVzLFxuICAgICAgbm9kZSxcbiAgICAgIHJhbmRvbSxcbiAgICAgIGFscGhhLFxuICAgICAgc3RyZW5ndGggPSBjb25zdGFudCgtMzApLFxuICAgICAgc3RyZW5ndGhzLFxuICAgICAgZGlzdGFuY2VNaW4yID0gMSxcbiAgICAgIGRpc3RhbmNlTWF4MiA9IEluZmluaXR5LFxuICAgICAgdGhldGEyID0gMC44MTtcblxuICBmdW5jdGlvbiBmb3JjZShfKSB7XG4gICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIHRyZWUgPSBxdWFkdHJlZShub2RlcywgeCwgeSkudmlzaXRBZnRlcihhY2N1bXVsYXRlKTtcbiAgICBmb3IgKGFscGhhID0gXywgaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgdHJlZS52aXNpdChhcHBseSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTtcbiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgbm9kZSA9IG5vZGVzW2ldLCBzdHJlbmd0aHNbbm9kZS5pbmRleF0gPSArc3RyZW5ndGgobm9kZSwgaSwgbm9kZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gYWNjdW11bGF0ZShxdWFkKSB7XG4gICAgdmFyIHN0cmVuZ3RoID0gMCwgcSwgYywgd2VpZ2h0ID0gMCwgeCwgeSwgaTtcblxuICAgIC8vIEZvciBpbnRlcm5hbCBub2RlcywgYWNjdW11bGF0ZSBmb3JjZXMgZnJvbSBjaGlsZCBxdWFkcmFudHMuXG4gICAgaWYgKHF1YWQubGVuZ3RoKSB7XG4gICAgICBmb3IgKHggPSB5ID0gaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgaWYgKChxID0gcXVhZFtpXSkgJiYgKGMgPSBNYXRoLmFicyhxLnZhbHVlKSkpIHtcbiAgICAgICAgICBzdHJlbmd0aCArPSBxLnZhbHVlLCB3ZWlnaHQgKz0gYywgeCArPSBjICogcS54LCB5ICs9IGMgKiBxLnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1YWQueCA9IHggLyB3ZWlnaHQ7XG4gICAgICBxdWFkLnkgPSB5IC8gd2VpZ2h0O1xuICAgIH1cblxuICAgIC8vIEZvciBsZWFmIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNvaW5jaWRlbnQgcXVhZHJhbnRzLlxuICAgIGVsc2Uge1xuICAgICAgcSA9IHF1YWQ7XG4gICAgICBxLnggPSBxLmRhdGEueDtcbiAgICAgIHEueSA9IHEuZGF0YS55O1xuICAgICAgZG8gc3RyZW5ndGggKz0gc3RyZW5ndGhzW3EuZGF0YS5pbmRleF07XG4gICAgICB3aGlsZSAocSA9IHEubmV4dCk7XG4gICAgfVxuXG4gICAgcXVhZC52YWx1ZSA9IHN0cmVuZ3RoO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDEsIF8sIHgyKSB7XG4gICAgaWYgKCFxdWFkLnZhbHVlKSByZXR1cm4gdHJ1ZTtcblxuICAgIHZhciB4ID0gcXVhZC54IC0gbm9kZS54LFxuICAgICAgICB5ID0gcXVhZC55IC0gbm9kZS55LFxuICAgICAgICB3ID0geDIgLSB4MSxcbiAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7XG5cbiAgICAvLyBBcHBseSB0aGUgQmFybmVzLUh1dCBhcHByb3hpbWF0aW9uIGlmIHBvc3NpYmxlLlxuICAgIC8vIExpbWl0IGZvcmNlcyBmb3IgdmVyeSBjbG9zZSBub2RlczsgcmFuZG9taXplIGRpcmVjdGlvbiBpZiBjb2luY2lkZW50LlxuICAgIGlmICh3ICogdyAvIHRoZXRhMiA8IGwpIHtcbiAgICAgIGlmIChsIDwgZGlzdGFuY2VNYXgyKSB7XG4gICAgICAgIGlmICh4ID09PSAwKSB4ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geCAqIHg7XG4gICAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geSAqIHk7XG4gICAgICAgIGlmIChsIDwgZGlzdGFuY2VNaW4yKSBsID0gTWF0aC5zcXJ0KGRpc3RhbmNlTWluMiAqIGwpO1xuICAgICAgICBub2RlLnZ4ICs9IHggKiBxdWFkLnZhbHVlICogYWxwaGEgLyBsO1xuICAgICAgICBub2RlLnZ5ICs9IHkgKiBxdWFkLnZhbHVlICogYWxwaGEgLyBsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBwcm9jZXNzIHBvaW50cyBkaXJlY3RseS5cbiAgICBlbHNlIGlmIChxdWFkLmxlbmd0aCB8fCBsID49IGRpc3RhbmNlTWF4MikgcmV0dXJuO1xuXG4gICAgLy8gTGltaXQgZm9yY2VzIGZvciB2ZXJ5IGNsb3NlIG5vZGVzOyByYW5kb21pemUgZGlyZWN0aW9uIGlmIGNvaW5jaWRlbnQuXG4gICAgaWYgKHF1YWQuZGF0YSAhPT0gbm9kZSB8fCBxdWFkLm5leHQpIHtcbiAgICAgIGlmICh4ID09PSAwKSB4ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geCAqIHg7XG4gICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZShyYW5kb20pLCBsICs9IHkgKiB5O1xuICAgICAgaWYgKGwgPCBkaXN0YW5jZU1pbjIpIGwgPSBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yICogbCk7XG4gICAgfVxuXG4gICAgZG8gaWYgKHF1YWQuZGF0YSAhPT0gbm9kZSkge1xuICAgICAgdyA9IHN0cmVuZ3Roc1txdWFkLmRhdGEuaW5kZXhdICogYWxwaGEgLyBsO1xuICAgICAgbm9kZS52eCArPSB4ICogdztcbiAgICAgIG5vZGUudnkgKz0geSAqIHc7XG4gICAgfSB3aGlsZSAocXVhZCA9IHF1YWQubmV4dCk7XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oX25vZGVzLCBfcmFuZG9tKSB7XG4gICAgbm9kZXMgPSBfbm9kZXM7XG4gICAgcmFuZG9tID0gX3JhbmRvbTtcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS5kaXN0YW5jZU1pbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZU1pbjIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWluMik7XG4gIH07XG5cbiAgZm9yY2UuZGlzdGFuY2VNYXggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNYXgyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1heDIpO1xuICB9O1xuXG4gIGZvcmNlLnRoZXRhID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoZXRhMiA9IF8gKiBfLCBmb3JjZSkgOiBNYXRoLnNxcnQodGhldGEyKTtcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gTWF0aC5hYnMoeCA9IE1hdGgucm91bmQoeCkpID49IDFlMjFcbiAgICAgID8geC50b0xvY2FsZVN0cmluZyhcImVuXCIpLnJlcGxhY2UoLywvZywgXCJcIilcbiAgICAgIDogeC50b1N0cmluZygxMCk7XG59XG5cbi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGhcbi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLlxuLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWxQYXJ0cygxLjIzKSByZXR1cm5zIFtcIjEyM1wiLCAwXS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCkge1xuICBpZiAoKGkgPSAoeCA9IHAgPyB4LnRvRXhwb25lbnRpYWwocCAtIDEpIDogeC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoXCJlXCIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIFx1MDBCMUluZmluaXR5XG4gIHZhciBpLCBjb2VmZmljaWVudCA9IHguc2xpY2UoMCwgaSk7XG5cbiAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXFxkXFwuXFxkK2VbLStdXFxkK1xuICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcXGRlWy0rXVxcZCsgKGUuZy4sIDFlKzMpLlxuICByZXR1cm4gW1xuICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsXG4gICAgK3guc2xpY2UoaSArIDEpXG4gIF07XG59XG4iLCAiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWxQYXJ0cyhNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGdyb3VwaW5nLCB0aG91c2FuZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkge1xuICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLFxuICAgICAgICB0ID0gW10sXG4gICAgICAgIGogPSAwLFxuICAgICAgICBnID0gZ3JvdXBpbmdbMF0sXG4gICAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICB3aGlsZSAoaSA+IDAgJiYgZyA+IDApIHtcbiAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpO1xuICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICBpZiAoKGxlbmd0aCArPSBnICsgMSkgPiB3aWR0aCkgYnJlYWs7XG4gICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdO1xuICAgIH1cblxuICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obnVtZXJhbHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHJldHVybiBudW1lcmFsc1sraV07XG4gICAgfSk7XG4gIH07XG59XG4iLCAiLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXVxudmFyIHJlID0gL14oPzooLik/KFs8Pj1eXSkpPyhbK1xcLSggXSk/KFskI10pPygwKT8oXFxkKyk/KCwpPyhcXC5cXGQrKT8ofik/KFthLXolXSk/JC9pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmb3JtYXQ6IFwiICsgc3BlY2lmaWVyKTtcbiAgdmFyIG1hdGNoO1xuICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcih7XG4gICAgZmlsbDogbWF0Y2hbMV0sXG4gICAgYWxpZ246IG1hdGNoWzJdLFxuICAgIHNpZ246IG1hdGNoWzNdLFxuICAgIHN5bWJvbDogbWF0Y2hbNF0sXG4gICAgemVybzogbWF0Y2hbNV0sXG4gICAgd2lkdGg6IG1hdGNoWzZdLFxuICAgIGNvbW1hOiBtYXRjaFs3XSxcbiAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLFxuICAgIHRyaW06IG1hdGNoWzldLFxuICAgIHR5cGU6IG1hdGNoWzEwXVxuICB9KTtcbn1cblxuZm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZSA9IEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2ZcblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/IFwiIFwiIDogc3BlY2lmaWVyLmZpbGwgKyBcIlwiO1xuICB0aGlzLmFsaWduID0gc3BlY2lmaWVyLmFsaWduID09PSB1bmRlZmluZWQgPyBcIj5cIiA6IHNwZWNpZmllci5hbGlnbiArIFwiXCI7XG4gIHRoaXMuc2lnbiA9IHNwZWNpZmllci5zaWduID09PSB1bmRlZmluZWQgPyBcIi1cIiA6IHNwZWNpZmllci5zaWduICsgXCJcIjtcbiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnN5bWJvbCArIFwiXCI7XG4gIHRoaXMuemVybyA9ICEhc3BlY2lmaWVyLnplcm87XG4gIHRoaXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIud2lkdGg7XG4gIHRoaXMuY29tbWEgPSAhIXNwZWNpZmllci5jb21tYTtcbiAgdGhpcy5wcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLnByZWNpc2lvbjtcbiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTtcbiAgdGhpcy50eXBlID0gc3BlY2lmaWVyLnR5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIudHlwZSArIFwiXCI7XG59XG5cbkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZmlsbFxuICAgICAgKyB0aGlzLmFsaWduXG4gICAgICArIHRoaXMuc2lnblxuICAgICAgKyB0aGlzLnN5bWJvbFxuICAgICAgKyAodGhpcy56ZXJvID8gXCIwXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSlcbiAgICAgICsgKHRoaXMuY29tbWEgPyBcIixcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFwiLlwiICsgTWF0aC5tYXgoMCwgdGhpcy5wcmVjaXNpb24gfCAwKSlcbiAgICAgICsgKHRoaXMudHJpbSA/IFwiflwiIDogXCJcIilcbiAgICAgICsgdGhpcy50eXBlO1xufTtcbiIsICIvLyBUcmltcyBpbnNpZ25pZmljYW50IHplcm9zLCBlLmcuLCByZXBsYWNlcyAxLjIwMDBrIHdpdGggMS4yay5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHMpIHtcbiAgb3V0OiBmb3IgKHZhciBuID0gcy5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkge1xuICAgIHN3aXRjaCAoc1tpXSkge1xuICAgICAgY2FzZSBcIi5cIjogaTAgPSBpMSA9IGk7IGJyZWFrO1xuICAgICAgY2FzZSBcIjBcIjogaWYgKGkwID09PSAwKSBpMCA9IGk7IGkxID0gaTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBpZiAoIStzW2ldKSBicmVhayBvdXQ7IGlmIChpMCA+IDApIGkwID0gMDsgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBpMCA+IDAgPyBzLnNsaWNlKDAsIGkwKSArIHMuc2xpY2UoaTEgKyAxKSA6IHM7XG59XG4iLCAiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IHZhciBwcmVmaXhFeHBvbmVudDtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV0sXG4gICAgICBpID0gZXhwb25lbnQgLSAocHJlZml4RXhwb25lbnQgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCAvIDMpKSkgKiAzKSArIDEsXG4gICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoO1xuICByZXR1cm4gaSA9PT0gbiA/IGNvZWZmaWNpZW50XG4gICAgICA6IGkgPiBuID8gY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoaSAtIG4gKyAxKS5qb2luKFwiMFwiKVxuICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShpKVxuICAgICAgOiBcIjAuXCIgKyBuZXcgQXJyYXkoMSAtIGkpLmpvaW4oXCIwXCIpICsgZm9ybWF0RGVjaW1hbFBhcnRzKHgsIE1hdGgubWF4KDAsIHAgKyBpIC0gMSkpWzBdOyAvLyBsZXNzIHRoYW4gMXkhXG59XG4iLCAiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV07XG4gIHJldHVybiBleHBvbmVudCA8IDAgPyBcIjAuXCIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKFwiMFwiKSArIGNvZWZmaWNpZW50XG4gICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSlcbiAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKFwiMFwiKTtcbn1cbiIsICJpbXBvcnQgZm9ybWF0RGVjaW1hbCBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5pbXBvcnQgZm9ybWF0UHJlZml4QXV0byBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgZm9ybWF0Um91bmRlZCBmcm9tIFwiLi9mb3JtYXRSb3VuZGVkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgXCIlXCI6ICh4LCBwKSA9PiAoeCAqIDEwMCkudG9GaXhlZChwKSxcbiAgXCJiXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpLFxuICBcImNcIjogKHgpID0+IHggKyBcIlwiLFxuICBcImRcIjogZm9ybWF0RGVjaW1hbCxcbiAgXCJlXCI6ICh4LCBwKSA9PiB4LnRvRXhwb25lbnRpYWwocCksXG4gIFwiZlwiOiAoeCwgcCkgPT4geC50b0ZpeGVkKHApLFxuICBcImdcIjogKHgsIHApID0+IHgudG9QcmVjaXNpb24ocCksXG4gIFwib1wiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KSxcbiAgXCJwXCI6ICh4LCBwKSA9PiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApLFxuICBcInJcIjogZm9ybWF0Um91bmRlZCxcbiAgXCJzXCI6IGZvcm1hdFByZWZpeEF1dG8sXG4gIFwiWFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSxcbiAgXCJ4XCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KVxufTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufVxuIiwgImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuaW1wb3J0IGZvcm1hdEdyb3VwIGZyb20gXCIuL2Zvcm1hdEdyb3VwLmpzXCI7XG5pbXBvcnQgZm9ybWF0TnVtZXJhbHMgZnJvbSBcIi4vZm9ybWF0TnVtZXJhbHMuanNcIjtcbmltcG9ydCBmb3JtYXRTcGVjaWZpZXIgZnJvbSBcIi4vZm9ybWF0U3BlY2lmaWVyLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHJpbSBmcm9tIFwiLi9mb3JtYXRUcmltLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHlwZXMgZnJvbSBcIi4vZm9ybWF0VHlwZXMuanNcIjtcbmltcG9ydCB7cHJlZml4RXhwb25lbnR9IGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuXG52YXIgbWFwID0gQXJyYXkucHJvdG90eXBlLm1hcCxcbiAgICBwcmVmaXhlcyA9IFtcInlcIixcInpcIixcImFcIixcImZcIixcInBcIixcIm5cIixcIlx1MDBCNVwiLFwibVwiLFwiXCIsXCJrXCIsXCJNXCIsXCJHXCIsXCJUXCIsXCJQXCIsXCJFXCIsXCJaXCIsXCJZXCJdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsb2NhbGUpIHtcbiAgdmFyIGdyb3VwID0gbG9jYWxlLmdyb3VwaW5nID09PSB1bmRlZmluZWQgfHwgbG9jYWxlLnRob3VzYW5kcyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXRHcm91cChtYXAuY2FsbChsb2NhbGUuZ3JvdXBpbmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyBcIlwiKSxcbiAgICAgIGN1cnJlbmN5UHJlZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzBdICsgXCJcIixcbiAgICAgIGN1cnJlbmN5U3VmZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzFdICsgXCJcIixcbiAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCA9PT0gdW5kZWZpbmVkID8gXCIuXCIgOiBsb2NhbGUuZGVjaW1hbCArIFwiXCIsXG4gICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXROdW1lcmFscyhtYXAuY2FsbChsb2NhbGUubnVtZXJhbHMsIFN0cmluZykpLFxuICAgICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyBcIiVcIiA6IGxvY2FsZS5wZXJjZW50ICsgXCJcIixcbiAgICAgIG1pbnVzID0gbG9jYWxlLm1pbnVzID09PSB1bmRlZmluZWQgPyBcIlx1MjIxMlwiIDogbG9jYWxlLm1pbnVzICsgXCJcIixcbiAgICAgIG5hbiA9IGxvY2FsZS5uYW4gPT09IHVuZGVmaW5lZCA/IFwiTmFOXCIgOiBsb2NhbGUubmFuICsgXCJcIjtcblxuICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyKSB7XG4gICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcik7XG5cbiAgICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLFxuICAgICAgICBhbGlnbiA9IHNwZWNpZmllci5hbGlnbixcbiAgICAgICAgc2lnbiA9IHNwZWNpZmllci5zaWduLFxuICAgICAgICBzeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sLFxuICAgICAgICB6ZXJvID0gc3BlY2lmaWVyLnplcm8sXG4gICAgICAgIHdpZHRoID0gc3BlY2lmaWVyLndpZHRoLFxuICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSxcbiAgICAgICAgcHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbixcbiAgICAgICAgdHJpbSA9IHNwZWNpZmllci50cmltLFxuICAgICAgICB0eXBlID0gc3BlY2lmaWVyLnR5cGU7XG5cbiAgICAvLyBUaGUgXCJuXCIgdHlwZSBpcyBhbiBhbGlhcyBmb3IgXCIsZ1wiLlxuICAgIGlmICh0eXBlID09PSBcIm5cIikgY29tbWEgPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBUaGUgXCJcIiB0eXBlLCBhbmQgYW55IGludmFsaWQgdHlwZSwgaXMgYW4gYWxpYXMgZm9yIFwiLjEyfmdcIi5cbiAgICBlbHNlIGlmICghZm9ybWF0VHlwZXNbdHlwZV0pIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkICYmIChwcmVjaXNpb24gPSAxMiksIHRyaW0gPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy5cbiAgICBpZiAoemVybyB8fCAoZmlsbCA9PT0gXCIwXCIgJiYgYWxpZ24gPT09IFwiPVwiKSkgemVybyA9IHRydWUsIGZpbGwgPSBcIjBcIiwgYWxpZ24gPSBcIj1cIjtcblxuICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLlxuICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lQcmVmaXggOiBzeW1ib2wgPT09IFwiI1wiICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyBcIjBcIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6IFwiXCIsXG4gICAgICAgIHN1ZmZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVN1ZmZpeCA6IC9bJXBdLy50ZXN0KHR5cGUpID8gcGVyY2VudCA6IFwiXCI7XG5cbiAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlP1xuICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlP1xuICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/XG4gICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlc1t0eXBlXSxcbiAgICAgICAgbWF5YmVTdWZmaXggPSAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTtcblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCxcbiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLlxuICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS5cbiAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uXG4gICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyA2XG4gICAgICAgIDogL1tncHJzXS8udGVzdCh0eXBlKSA/IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBwcmVjaXNpb24pKVxuICAgICAgICA6IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSkge1xuICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LFxuICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LFxuICAgICAgICAgIGksIG4sIGM7XG5cbiAgICAgIGlmICh0eXBlID09PSBcImNcIikge1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gK3ZhbHVlO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgc2lnbi4gLTAgaXMgbm90IGxlc3MgdGhhbiAwLCBidXQgMSAvIC0wIGlzIVxuICAgICAgICB2YXIgdmFsdWVOZWdhdGl2ZSA9IHZhbHVlIDwgMCB8fCAxIC8gdmFsdWUgPCAwO1xuXG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgZm9ybWF0dGluZy5cbiAgICAgICAgdmFsdWUgPSBpc05hTih2YWx1ZSkgPyBuYW4gOiBmb3JtYXRUeXBlKE1hdGguYWJzKHZhbHVlKSwgcHJlY2lzaW9uKTtcblxuICAgICAgICAvLyBUcmltIGluc2lnbmlmaWNhbnQgemVyb3MuXG4gICAgICAgIGlmICh0cmltKSB2YWx1ZSA9IGZvcm1hdFRyaW0odmFsdWUpO1xuXG4gICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gYWZ0ZXIgZm9ybWF0dGluZywgYW5kIG5vIGV4cGxpY2l0IHBvc2l0aXZlIHNpZ24gaXMgcmVxdWVzdGVkLCBoaWRlIHRoZSBzaWduLlxuICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDAgJiYgc2lnbiAhPT0gXCIrXCIpIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSBcIihcIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09PSBcIi1cIiB8fCBzaWduID09PSBcIihcIiA/IFwiXCIgOiBzaWduKSArIHZhbHVlUHJlZml4O1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9ICh0eXBlID09PSBcInNcIiA/IHByZWZpeGVzWzggKyBwcmVmaXhFeHBvbmVudCAvIDNdIDogXCJcIikgKyB2YWx1ZVN1ZmZpeCArICh2YWx1ZU5lZ2F0aXZlICYmIHNpZ24gPT09IFwiKFwiID8gXCIpXCIgOiBcIlwiKTtcblxuICAgICAgICAvLyBCcmVhayB0aGUgZm9ybWF0dGVkIHZhbHVlIGludG8gdGhlIGludGVnZXIgXHUyMDFDdmFsdWVcdTIwMUQgcGFydCB0aGF0IGNhbiBiZVxuICAgICAgICAvLyBncm91cGVkLCBhbmQgZnJhY3Rpb25hbCBvciBleHBvbmVudGlhbCBcdTIwMUNzdWZmaXhcdTIwMUQgcGFydCB0aGF0IGlzIG5vdC5cbiAgICAgICAgaWYgKG1heWJlU3VmZml4KSB7XG4gICAgICAgICAgaSA9IC0xLCBuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgICBpZiAoYyA9IHZhbHVlLmNoYXJDb2RlQXQoaSksIDQ4ID4gYyB8fCBjID4gNTcpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdWZmaXggPSAoYyA9PT0gNDYgPyBkZWNpbWFsICsgdmFsdWUuc2xpY2UoaSArIDEpIDogdmFsdWUuc2xpY2UoaSkpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgbm90IFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGJlZm9yZSBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmICF6ZXJvKSB2YWx1ZSA9IGdyb3VwKHZhbHVlLCBJbmZpbml0eSk7XG5cbiAgICAgIC8vIENvbXB1dGUgdGhlIHBhZGRpbmcuXG4gICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLFxuICAgICAgICAgIHBhZGRpbmcgPSBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgOiBcIlwiO1xuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYWZ0ZXIgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiB6ZXJvKSB2YWx1ZSA9IGdyb3VwKHBhZGRpbmcgKyB2YWx1ZSwgcGFkZGluZy5sZW5ndGggPyB3aWR0aCAtIHZhbHVlU3VmZml4Lmxlbmd0aCA6IEluZmluaXR5KSwgcGFkZGluZyA9IFwiXCI7XG5cbiAgICAgIC8vIFJlY29uc3RydWN0IHRoZSBmaW5hbCBvdXRwdXQgYmFzZWQgb24gdGhlIGRlc2lyZWQgYWxpZ25tZW50LlxuICAgICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgICBjYXNlIFwiPFwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiPVwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgcGFkZGluZyArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiXlwiOiB2YWx1ZSA9IHBhZGRpbmcuc2xpY2UoMCwgbGVuZ3RoID0gcGFkZGluZy5sZW5ndGggPj4gMSkgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nLnNsaWNlKGxlbmd0aCk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB2YWx1ZSA9IHBhZGRpbmcgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVtZXJhbHModmFsdWUpO1xuICAgIH1cblxuICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNwZWNpZmllciArIFwiXCI7XG4gICAgfTtcblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkge1xuICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSBcImZcIiwgc3BlY2lmaWVyKSksXG4gICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyxcbiAgICAgICAgayA9IE1hdGgucG93KDEwLCAtZSksXG4gICAgICAgIHByZWZpeCA9IHByZWZpeGVzWzggKyBlIC8gM107XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4O1xuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdDogbmV3Rm9ybWF0LFxuICAgIGZvcm1hdFByZWZpeDogZm9ybWF0UHJlZml4XG4gIH07XG59XG4iLCAiaW1wb3J0IGZvcm1hdExvY2FsZSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcblxudmFyIGxvY2FsZTtcbmV4cG9ydCB2YXIgZm9ybWF0O1xuZXhwb3J0IHZhciBmb3JtYXRQcmVmaXg7XG5cbmRlZmF1bHRMb2NhbGUoe1xuICB0aG91c2FuZHM6IFwiLFwiLFxuICBncm91cGluZzogWzNdLFxuICBjdXJyZW5jeTogW1wiJFwiLCBcIlwiXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikge1xuICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7XG4gIGZvcm1hdCA9IGxvY2FsZS5mb3JtYXQ7XG4gIGZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7XG4gIHJldHVybiBsb2NhbGU7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXApIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIC1leHBvbmVudChNYXRoLmFicyhzdGVwKSkpO1xufVxuIiwgImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGVwLCB2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMgLSBleHBvbmVudChNYXRoLmFicyhzdGVwKSkpO1xufVxuIiwgImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGVwLCBtYXgpIHtcbiAgc3RlcCA9IE1hdGguYWJzKHN0ZXApLCBtYXggPSBNYXRoLmFicyhtYXgpIC0gc3RlcDtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cG9uZW50KG1heCkgLSBleHBvbmVudChzdGVwKSkgKyAxO1xufVxuIiwgImZ1bmN0aW9uIGRlZmF1bHRTZXBhcmF0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyO1xufVxuXG5mdW5jdGlvbiBtZWFuWChjaGlsZHJlbikge1xuICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKG1lYW5YUmVkdWNlLCAwKSAvIGNoaWxkcmVuLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gbWVhblhSZWR1Y2UoeCwgYykge1xuICByZXR1cm4geCArIGMueDtcbn1cblxuZnVuY3Rpb24gbWF4WShjaGlsZHJlbikge1xuICByZXR1cm4gMSArIGNoaWxkcmVuLnJlZHVjZShtYXhZUmVkdWNlLCAwKTtcbn1cblxuZnVuY3Rpb24gbWF4WVJlZHVjZSh5LCBjKSB7XG4gIHJldHVybiBNYXRoLm1heCh5LCBjLnkpO1xufVxuXG5mdW5jdGlvbiBsZWFmTGVmdChub2RlKSB7XG4gIHZhciBjaGlsZHJlbjtcbiAgd2hpbGUgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuWzBdO1xuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gbGVhZlJpZ2h0KG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuO1xuICB3aGlsZSAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbixcbiAgICAgIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIG5vZGVTaXplID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gY2x1c3Rlcihyb290KSB7XG4gICAgdmFyIHByZXZpb3VzTm9kZSxcbiAgICAgICAgeCA9IDA7XG5cbiAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRpbmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLlxuICAgIHJvb3QuZWFjaEFmdGVyKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgbm9kZS54ID0gbWVhblgoY2hpbGRyZW4pO1xuICAgICAgICBub2RlLnkgPSBtYXhZKGNoaWxkcmVuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUueCA9IHByZXZpb3VzTm9kZSA/IHggKz0gc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c05vZGUpIDogMDtcbiAgICAgICAgbm9kZS55ID0gMDtcbiAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBsZWZ0ID0gbGVhZkxlZnQocm9vdCksXG4gICAgICAgIHJpZ2h0ID0gbGVhZlJpZ2h0KHJvb3QpLFxuICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMixcbiAgICAgICAgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyO1xuXG4gICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuXG4gICAgcmV0dXJuIHJvb3QuZWFjaEFmdGVyKG5vZGVTaXplID8gZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHJvb3QueCkgKiBkeDtcbiAgICAgIG5vZGUueSA9IChyb290LnkgLSBub2RlLnkpICogZHk7XG4gICAgfSA6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBkeDtcbiAgICAgIG5vZGUueSA9ICgxIC0gKHJvb3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIGR5O1xuICAgIH0pO1xuICB9XG5cbiAgY2x1c3Rlci5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlcGFyYXRpb24gPSB4LCBjbHVzdGVyKSA6IHNlcGFyYXRpb247XG4gIH07XG5cbiAgY2x1c3Rlci5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXplID8gbnVsbCA6IFtkeCwgZHldKTtcbiAgfTtcblxuICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gdHJ1ZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBbZHgsIGR5XSA6IG51bGwpO1xuICB9O1xuXG4gIHJldHVybiBjbHVzdGVyO1xufVxuIiwgImZ1bmN0aW9uIGNvdW50KG5vZGUpIHtcbiAgdmFyIHN1bSA9IDAsXG4gICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sXG4gICAgICBpID0gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoO1xuICBpZiAoIWkpIHN1bSA9IDE7XG4gIGVsc2Ugd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7XG4gIG5vZGUudmFsdWUgPSBzdW07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoY291bnQpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGF0KSB7XG4gIGxldCBpbmRleCA9IC0xO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykge1xuICAgIGNhbGxiYWNrLmNhbGwodGhhdCwgbm9kZSwgKytpbmRleCwgdGhpcyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIHRoYXQpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXSwgY2hpbGRyZW4sIGksIGluZGV4ID0gLTE7XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBjYWxsYmFjay5jYWxsKHRoYXQsIG5vZGUsICsraW5kZXgsIHRoaXMpO1xuICAgIGlmIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIG5vZGVzLnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgdGhhdCkge1xuICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBuZXh0ID0gW10sIGNoaWxkcmVuLCBpLCBuLCBpbmRleCA9IC0xO1xuICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7XG4gICAgbmV4dC5wdXNoKG5vZGUpO1xuICAgIGlmIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHdoaWxlIChub2RlID0gbmV4dC5wb3AoKSkge1xuICAgIGNhbGxiYWNrLmNhbGwodGhhdCwgbm9kZSwgKytpbmRleCwgdGhpcyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIHRoYXQpIHtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSB7XG4gICAgaWYgKGNhbGxiYWNrLmNhbGwodGhhdCwgbm9kZSwgKytpbmRleCwgdGhpcykpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLmVhY2hBZnRlcihmdW5jdGlvbihub2RlKSB7XG4gICAgdmFyIHN1bSA9ICt2YWx1ZShub2RlLmRhdGEpIHx8IDAsXG4gICAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbixcbiAgICAgICAgaSA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aDtcbiAgICB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTtcbiAgICBub2RlLnZhbHVlID0gc3VtO1xuICB9KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIHJldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBub2RlLmNoaWxkcmVuLnNvcnQoY29tcGFyZSk7XG4gICAgfVxuICB9KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbmQpIHtcbiAgdmFyIHN0YXJ0ID0gdGhpcyxcbiAgICAgIGFuY2VzdG9yID0gbGVhc3RDb21tb25BbmNlc3RvcihzdGFydCwgZW5kKSxcbiAgICAgIG5vZGVzID0gW3N0YXJ0XTtcbiAgd2hpbGUgKHN0YXJ0ICE9PSBhbmNlc3Rvcikge1xuICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50O1xuICAgIG5vZGVzLnB1c2goc3RhcnQpO1xuICB9XG4gIHZhciBrID0gbm9kZXMubGVuZ3RoO1xuICB3aGlsZSAoZW5kICE9PSBhbmNlc3Rvcikge1xuICAgIG5vZGVzLnNwbGljZShrLCAwLCBlbmQpO1xuICAgIGVuZCA9IGVuZC5wYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIG5vZGVzO1xufVxuXG5mdW5jdGlvbiBsZWFzdENvbW1vbkFuY2VzdG9yKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiBhO1xuICB2YXIgYU5vZGVzID0gYS5hbmNlc3RvcnMoKSxcbiAgICAgIGJOb2RlcyA9IGIuYW5jZXN0b3JzKCksXG4gICAgICBjID0gbnVsbDtcbiAgYSA9IGFOb2Rlcy5wb3AoKTtcbiAgYiA9IGJOb2Rlcy5wb3AoKTtcbiAgd2hpbGUgKGEgPT09IGIpIHtcbiAgICBjID0gYTtcbiAgICBhID0gYU5vZGVzLnBvcCgpO1xuICAgIGIgPSBiTm9kZXMucG9wKCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV07XG4gIHdoaWxlIChub2RlID0gbm9kZS5wYXJlbnQpIHtcbiAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBsZWF2ZXMgPSBbXTtcbiAgdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGxlYXZlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsZWF2ZXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciByb290ID0gdGhpcywgbGlua3MgPSBbXTtcbiAgcm9vdC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZSAhPT0gcm9vdCkgeyAvLyBEb25cdTIwMTl0IGluY2x1ZGUgdGhlIHJvb3RcdTIwMTlzIHBhcmVudCwgaWYgYW55LlxuICAgICAgbGlua3MucHVzaCh7c291cmNlOiBub2RlLnBhcmVudCwgdGFyZ2V0OiBub2RlfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpbmtzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLCBjdXJyZW50LCBuZXh0ID0gW25vZGVdLCBjaGlsZHJlbiwgaSwgbjtcbiAgZG8ge1xuICAgIGN1cnJlbnQgPSBuZXh0LnJldmVyc2UoKSwgbmV4dCA9IFtdO1xuICAgIHdoaWxlIChub2RlID0gY3VycmVudC5wb3AoKSkge1xuICAgICAgeWllbGQgbm9kZTtcbiAgICAgIGlmIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChpID0gMCwgbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICAgIG5leHQucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKG5leHQubGVuZ3RoKTtcbn1cbiIsICJpbXBvcnQgbm9kZV9jb3VudCBmcm9tIFwiLi9jb3VudC5qc1wiO1xuaW1wb3J0IG5vZGVfZWFjaCBmcm9tIFwiLi9lYWNoLmpzXCI7XG5pbXBvcnQgbm9kZV9lYWNoQmVmb3JlIGZyb20gXCIuL2VhY2hCZWZvcmUuanNcIjtcbmltcG9ydCBub2RlX2VhY2hBZnRlciBmcm9tIFwiLi9lYWNoQWZ0ZXIuanNcIjtcbmltcG9ydCBub2RlX2ZpbmQgZnJvbSBcIi4vZmluZC5qc1wiO1xuaW1wb3J0IG5vZGVfc3VtIGZyb20gXCIuL3N1bS5qc1wiO1xuaW1wb3J0IG5vZGVfc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgbm9kZV9wYXRoIGZyb20gXCIuL3BhdGguanNcIjtcbmltcG9ydCBub2RlX2FuY2VzdG9ycyBmcm9tIFwiLi9hbmNlc3RvcnMuanNcIjtcbmltcG9ydCBub2RlX2Rlc2NlbmRhbnRzIGZyb20gXCIuL2Rlc2NlbmRhbnRzLmpzXCI7XG5pbXBvcnQgbm9kZV9sZWF2ZXMgZnJvbSBcIi4vbGVhdmVzLmpzXCI7XG5pbXBvcnQgbm9kZV9saW5rcyBmcm9tIFwiLi9saW5rcy5qc1wiO1xuaW1wb3J0IG5vZGVfaXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGllcmFyY2h5KGRhdGEsIGNoaWxkcmVuKSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgZGF0YSA9IFt1bmRlZmluZWQsIGRhdGFdO1xuICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSBjaGlsZHJlbiA9IG1hcENoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICBjaGlsZHJlbiA9IG9iamVjdENoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJvb3QgPSBuZXcgTm9kZShkYXRhKSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlcyA9IFtyb290XSxcbiAgICAgIGNoaWxkLFxuICAgICAgY2hpbGRzLFxuICAgICAgaSxcbiAgICAgIG47XG5cbiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkge1xuICAgIGlmICgoY2hpbGRzID0gY2hpbGRyZW4obm9kZS5kYXRhKSkgJiYgKG4gPSAoY2hpbGRzID0gQXJyYXkuZnJvbShjaGlsZHMpKS5sZW5ndGgpKSB7XG4gICAgICBub2RlLmNoaWxkcmVuID0gY2hpbGRzO1xuICAgICAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIG5vZGVzLnB1c2goY2hpbGQgPSBjaGlsZHNbaV0gPSBuZXcgTm9kZShjaGlsZHNbaV0pKTtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTtcbiAgICAgICAgY2hpbGQuZGVwdGggPSBub2RlLmRlcHRoICsgMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcm9vdC5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpO1xufVxuXG5mdW5jdGlvbiBub2RlX2NvcHkoKSB7XG4gIHJldHVybiBoaWVyYXJjaHkodGhpcykuZWFjaEJlZm9yZShjb3B5RGF0YSk7XG59XG5cbmZ1bmN0aW9uIG9iamVjdENoaWxkcmVuKGQpIHtcbiAgcmV0dXJuIGQuY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZCkgPyBkWzFdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gY29weURhdGEobm9kZSkge1xuICBpZiAobm9kZS5kYXRhLnZhbHVlICE9PSB1bmRlZmluZWQpIG5vZGUudmFsdWUgPSBub2RlLmRhdGEudmFsdWU7XG4gIG5vZGUuZGF0YSA9IG5vZGUuZGF0YS5kYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUhlaWdodChub2RlKSB7XG4gIHZhciBoZWlnaHQgPSAwO1xuICBkbyBub2RlLmhlaWdodCA9IGhlaWdodDtcbiAgd2hpbGUgKChub2RlID0gbm9kZS5wYXJlbnQpICYmIChub2RlLmhlaWdodCA8ICsraGVpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBOb2RlKGRhdGEpIHtcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5kZXB0aCA9XG4gIHRoaXMuaGVpZ2h0ID0gMDtcbiAgdGhpcy5wYXJlbnQgPSBudWxsO1xufVxuXG5Ob2RlLnByb3RvdHlwZSA9IGhpZXJhcmNoeS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBOb2RlLFxuICBjb3VudDogbm9kZV9jb3VudCxcbiAgZWFjaDogbm9kZV9lYWNoLFxuICBlYWNoQWZ0ZXI6IG5vZGVfZWFjaEFmdGVyLFxuICBlYWNoQmVmb3JlOiBub2RlX2VhY2hCZWZvcmUsXG4gIGZpbmQ6IG5vZGVfZmluZCxcbiAgc3VtOiBub2RlX3N1bSxcbiAgc29ydDogbm9kZV9zb3J0LFxuICBwYXRoOiBub2RlX3BhdGgsXG4gIGFuY2VzdG9yczogbm9kZV9hbmNlc3RvcnMsXG4gIGRlc2NlbmRhbnRzOiBub2RlX2Rlc2NlbmRhbnRzLFxuICBsZWF2ZXM6IG5vZGVfbGVhdmVzLFxuICBsaW5rczogbm9kZV9saW5rcyxcbiAgY29weTogbm9kZV9jb3B5LFxuICBbU3ltYm9sLml0ZXJhdG9yXTogbm9kZV9pdGVyYXRvclxufTtcbiIsICJleHBvcnQgZnVuY3Rpb24gb3B0aW9uYWwoZikge1xuICByZXR1cm4gZiA9PSBudWxsID8gbnVsbCA6IHJlcXVpcmVkKGYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQoZikge1xuICBpZiAodHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZjtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gY29uc3RhbnRaZXJvKCkge1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICBub2RlLngwID0gTWF0aC5yb3VuZChub2RlLngwKTtcbiAgbm9kZS55MCA9IE1hdGgucm91bmQobm9kZS55MCk7XG4gIG5vZGUueDEgPSBNYXRoLnJvdW5kKG5vZGUueDEpO1xuICBub2RlLnkxID0gTWF0aC5yb3VuZChub2RlLnkxKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbixcbiAgICAgIG5vZGUsXG4gICAgICBpID0gLTEsXG4gICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgayA9IHBhcmVudC52YWx1ZSAmJiAoeDEgLSB4MCkgLyBwYXJlbnQudmFsdWU7XG5cbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkxO1xuICAgIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgwICs9IG5vZGUudmFsdWUgKiBrO1xuICB9XG59XG4iLCAiaW1wb3J0IHJvdW5kTm9kZSBmcm9tIFwiLi90cmVlbWFwL3JvdW5kLmpzXCI7XG5pbXBvcnQgdHJlZW1hcERpY2UgZnJvbSBcIi4vdHJlZW1hcC9kaWNlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgcGFkZGluZyA9IDAsXG4gICAgICByb3VuZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHBhcnRpdGlvbihyb290KSB7XG4gICAgdmFyIG4gPSByb290LmhlaWdodCArIDE7XG4gICAgcm9vdC54MCA9XG4gICAgcm9vdC55MCA9IHBhZGRpbmc7XG4gICAgcm9vdC54MSA9IGR4O1xuICAgIHJvb3QueTEgPSBkeSAvIG47XG4gICAgcm9vdC5lYWNoQmVmb3JlKHBvc2l0aW9uTm9kZShkeSwgbikpO1xuICAgIGlmIChyb3VuZCkgcm9vdC5lYWNoQmVmb3JlKHJvdW5kTm9kZSk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUoZHksIG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgdHJlZW1hcERpY2Uobm9kZSwgbm9kZS54MCwgZHkgKiAobm9kZS5kZXB0aCArIDEpIC8gbiwgbm9kZS54MSwgZHkgKiAobm9kZS5kZXB0aCArIDIpIC8gbik7XG4gICAgICB9XG4gICAgICB2YXIgeDAgPSBub2RlLngwLFxuICAgICAgICAgIHkwID0gbm9kZS55MCxcbiAgICAgICAgICB4MSA9IG5vZGUueDEgLSBwYWRkaW5nLFxuICAgICAgICAgIHkxID0gbm9kZS55MSAtIHBhZGRpbmc7XG4gICAgICBpZiAoeDEgPCB4MCkgeDAgPSB4MSA9ICh4MCArIHgxKSAvIDI7XG4gICAgICBpZiAoeTEgPCB5MCkgeTAgPSB5MSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICBub2RlLngwID0geDA7XG4gICAgICBub2RlLnkwID0geTA7XG4gICAgICBub2RlLngxID0geDE7XG4gICAgICBub2RlLnkxID0geTE7XG4gICAgfTtcbiAgfVxuXG4gIHBhcnRpdGlvbi5yb3VuZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgcGFydGl0aW9uKSA6IHJvdW5kO1xuICB9O1xuXG4gIHBhcnRpdGlvbi5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHBhcnRpdGlvbikgOiBbZHgsIGR5XTtcbiAgfTtcblxuICBwYXJ0aXRpb24ucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nID0gK3gsIHBhcnRpdGlvbikgOiBwYWRkaW5nO1xuICB9O1xuXG4gIHJldHVybiBwYXJ0aXRpb247XG59XG4iLCAiaW1wb3J0IHtyZXF1aXJlZH0gZnJvbSBcIi4vYWNjZXNzb3JzLmpzXCI7XG5pbXBvcnQge05vZGUsIGNvbXB1dGVIZWlnaHR9IGZyb20gXCIuL2hpZXJhcmNoeS9pbmRleC5qc1wiO1xuXG52YXIgcHJlcm9vdCA9IHtkZXB0aDogLTF9LFxuICAgIGFtYmlndW91cyA9IHt9O1xuXG5mdW5jdGlvbiBkZWZhdWx0SWQoZCkge1xuICByZXR1cm4gZC5pZDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFBhcmVudElkKGQpIHtcbiAgcmV0dXJuIGQucGFyZW50SWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgaWQgPSBkZWZhdWx0SWQsXG4gICAgICBwYXJlbnRJZCA9IGRlZmF1bHRQYXJlbnRJZDtcblxuICBmdW5jdGlvbiBzdHJhdGlmeShkYXRhKSB7XG4gICAgdmFyIG5vZGVzID0gQXJyYXkuZnJvbShkYXRhKSxcbiAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgZCxcbiAgICAgICAgaSxcbiAgICAgICAgcm9vdCxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBub2RlLFxuICAgICAgICBub2RlSWQsXG4gICAgICAgIG5vZGVLZXksXG4gICAgICAgIG5vZGVCeUtleSA9IG5ldyBNYXA7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBkID0gbm9kZXNbaV0sIG5vZGUgPSBub2Rlc1tpXSA9IG5ldyBOb2RlKGQpO1xuICAgICAgaWYgKChub2RlSWQgPSBpZChkLCBpLCBkYXRhKSkgIT0gbnVsbCAmJiAobm9kZUlkICs9IFwiXCIpKSB7XG4gICAgICAgIG5vZGVLZXkgPSBub2RlLmlkID0gbm9kZUlkO1xuICAgICAgICBub2RlQnlLZXkuc2V0KG5vZGVLZXksIG5vZGVCeUtleS5oYXMobm9kZUtleSkgPyBhbWJpZ3VvdXMgOiBub2RlKTtcbiAgICAgIH1cbiAgICAgIGlmICgobm9kZUlkID0gcGFyZW50SWQoZCwgaSwgZGF0YSkpICE9IG51bGwgJiYgKG5vZGVJZCArPSBcIlwiKSkge1xuICAgICAgICBub2RlLnBhcmVudCA9IG5vZGVJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICBpZiAobm9kZUlkID0gbm9kZS5wYXJlbnQpIHtcbiAgICAgICAgcGFyZW50ID0gbm9kZUJ5S2V5LmdldChub2RlSWQpO1xuICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZzogXCIgKyBub2RlSWQpO1xuICAgICAgICBpZiAocGFyZW50ID09PSBhbWJpZ3VvdXMpIHRocm93IG5ldyBFcnJvcihcImFtYmlndW91czogXCIgKyBub2RlSWQpO1xuICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuKSBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgZWxzZSBwYXJlbnQuY2hpbGRyZW4gPSBbbm9kZV07XG4gICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJvb3QpIHRocm93IG5ldyBFcnJvcihcIm11bHRpcGxlIHJvb3RzXCIpO1xuICAgICAgICByb290ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJvb3QpIHRocm93IG5ldyBFcnJvcihcIm5vIHJvb3RcIik7XG4gICAgcm9vdC5wYXJlbnQgPSBwcmVyb290O1xuICAgIHJvb3QuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7IG5vZGUuZGVwdGggPSBub2RlLnBhcmVudC5kZXB0aCArIDE7IC0tbjsgfSkuZWFjaEJlZm9yZShjb21wdXRlSGVpZ2h0KTtcbiAgICByb290LnBhcmVudCA9IG51bGw7XG4gICAgaWYgKG4gPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJjeWNsZVwiKTtcblxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgc3RyYXRpZnkuaWQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaWQgPSByZXF1aXJlZCh4KSwgc3RyYXRpZnkpIDogaWQ7XG4gIH07XG5cbiAgc3RyYXRpZnkucGFyZW50SWQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFyZW50SWQgPSByZXF1aXJlZCh4KSwgc3RyYXRpZnkpIDogcGFyZW50SWQ7XG4gIH07XG5cbiAgcmV0dXJuIHN0cmF0aWZ5O1xufVxuIiwgImltcG9ydCB7Tm9kZX0gZnJvbSBcIi4vaGllcmFyY2h5L2luZGV4LmpzXCI7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXBhcmF0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyO1xufVxuXG4vLyBmdW5jdGlvbiByYWRpYWxTZXBhcmF0aW9uKGEsIGIpIHtcbi8vICAgcmV0dXJuIChhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMikgLyBhLmRlcHRoO1xuLy8gfVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxlZnQgY29udG91ciBvZiBhIHN1YnRyZWUgKG9yXG4vLyBzdWJmb3Jlc3QpLiBJdCByZXR1cm5zIHRoZSBzdWNjZXNzb3Igb2YgdiBvbiB0aGlzIGNvbnRvdXIuIFRoaXMgc3VjY2Vzc29yIGlzXG4vLyBlaXRoZXIgZ2l2ZW4gYnkgdGhlIGxlZnRtb3N0IGNoaWxkIG9mIHYgb3IgYnkgdGhlIHRocmVhZCBvZiB2LiBUaGUgZnVuY3Rpb25cbi8vIHJldHVybnMgbnVsbCBpZiBhbmQgb25seSBpZiB2IGlzIG9uIHRoZSBoaWdoZXN0IGxldmVsIG9mIGl0cyBzdWJ0cmVlLlxuZnVuY3Rpb24gbmV4dExlZnQodikge1xuICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuO1xuICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlblswXSA6IHYudDtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiB3b3JrcyBhbmFsb2dvdXNseSB0byBuZXh0TGVmdC5cbmZ1bmN0aW9uIG5leHRSaWdodCh2KSB7XG4gIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW47XG4gIHJldHVybiBjaGlsZHJlbiA/IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdIDogdi50O1xufVxuXG4vLyBTaGlmdHMgdGhlIGN1cnJlbnQgc3VidHJlZSByb290ZWQgYXQgdysuIFRoaXMgaXMgZG9uZSBieSBpbmNyZWFzaW5nXG4vLyBwcmVsaW0odyspIGFuZCBtb2QodyspIGJ5IHNoaWZ0LlxuZnVuY3Rpb24gbW92ZVN1YnRyZWUod20sIHdwLCBzaGlmdCkge1xuICB2YXIgY2hhbmdlID0gc2hpZnQgLyAod3AuaSAtIHdtLmkpO1xuICB3cC5jIC09IGNoYW5nZTtcbiAgd3AucyArPSBzaGlmdDtcbiAgd20uYyArPSBjaGFuZ2U7XG4gIHdwLnogKz0gc2hpZnQ7XG4gIHdwLm0gKz0gc2hpZnQ7XG59XG5cbi8vIEFsbCBvdGhlciBzaGlmdHMsIGFwcGxpZWQgdG8gdGhlIHNtYWxsZXIgc3VidHJlZXMgYmV0d2VlbiB3LSBhbmQgdyssIGFyZVxuLy8gcGVyZm9ybWVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIHByZXBhcmUgdGhlIHNoaWZ0cywgd2UgaGF2ZSB0byBhZGp1c3Rcbi8vIGNoYW5nZSh3KyksIHNoaWZ0KHcrKSwgYW5kIGNoYW5nZSh3LSkuXG5mdW5jdGlvbiBleGVjdXRlU2hpZnRzKHYpIHtcbiAgdmFyIHNoaWZ0ID0gMCxcbiAgICAgIGNoYW5nZSA9IDAsXG4gICAgICBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sXG4gICAgICBpID0gY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgdztcbiAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgdyA9IGNoaWxkcmVuW2ldO1xuICAgIHcueiArPSBzaGlmdDtcbiAgICB3Lm0gKz0gc2hpZnQ7XG4gICAgc2hpZnQgKz0gdy5zICsgKGNoYW5nZSArPSB3LmMpO1xuICB9XG59XG5cbi8vIElmIHZpLVx1MjAxOXMgYW5jZXN0b3IgaXMgYSBzaWJsaW5nIG9mIHYsIHJldHVybnMgdmktXHUyMDE5cyBhbmNlc3Rvci4gT3RoZXJ3aXNlLFxuLy8gcmV0dXJucyB0aGUgc3BlY2lmaWVkIChkZWZhdWx0KSBhbmNlc3Rvci5cbmZ1bmN0aW9uIG5leHRBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSB7XG4gIHJldHVybiB2aW0uYS5wYXJlbnQgPT09IHYucGFyZW50ID8gdmltLmEgOiBhbmNlc3Rvcjtcbn1cblxuZnVuY3Rpb24gVHJlZU5vZGUobm9kZSwgaSkge1xuICB0aGlzLl8gPSBub2RlO1xuICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIHRoaXMuY2hpbGRyZW4gPSBudWxsO1xuICB0aGlzLkEgPSBudWxsOyAvLyBkZWZhdWx0IGFuY2VzdG9yXG4gIHRoaXMuYSA9IHRoaXM7IC8vIGFuY2VzdG9yXG4gIHRoaXMueiA9IDA7IC8vIHByZWxpbVxuICB0aGlzLm0gPSAwOyAvLyBtb2RcbiAgdGhpcy5jID0gMDsgLy8gY2hhbmdlXG4gIHRoaXMucyA9IDA7IC8vIHNoaWZ0XG4gIHRoaXMudCA9IG51bGw7IC8vIHRocmVhZFxuICB0aGlzLmkgPSBpOyAvLyBudW1iZXJcbn1cblxuVHJlZU5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShOb2RlLnByb3RvdHlwZSk7XG5cbmZ1bmN0aW9uIHRyZWVSb290KHJvb3QpIHtcbiAgdmFyIHRyZWUgPSBuZXcgVHJlZU5vZGUocm9vdCwgMCksXG4gICAgICBub2RlLFxuICAgICAgbm9kZXMgPSBbdHJlZV0sXG4gICAgICBjaGlsZCxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgaSxcbiAgICAgIG47XG5cbiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkge1xuICAgIGlmIChjaGlsZHJlbiA9IG5vZGUuXy5jaGlsZHJlbikge1xuICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuID0gY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBub2Rlcy5wdXNoKGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXSA9IG5ldyBUcmVlTm9kZShjaGlsZHJlbltpXSwgaSkpO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICh0cmVlLnBhcmVudCA9IG5ldyBUcmVlTm9kZShudWxsLCAwKSkuY2hpbGRyZW4gPSBbdHJlZV07XG4gIHJldHVybiB0cmVlO1xufVxuXG4vLyBOb2RlLWxpbmsgdHJlZSBkaWFncmFtIHVzaW5nIHRoZSBSZWluZ29sZC1UaWxmb3JkIFwidGlkeVwiIGFsZ29yaXRobVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBzZXBhcmF0aW9uID0gZGVmYXVsdFNlcGFyYXRpb24sXG4gICAgICBkeCA9IDEsXG4gICAgICBkeSA9IDEsXG4gICAgICBub2RlU2l6ZSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gdHJlZShyb290KSB7XG4gICAgdmFyIHQgPSB0cmVlUm9vdChyb290KTtcblxuICAgIC8vIENvbXB1dGUgdGhlIGxheW91dCB1c2luZyBCdWNoaGVpbSBldCBhbC5cdTIwMTlzIGFsZ29yaXRobS5cbiAgICB0LmVhY2hBZnRlcihmaXJzdFdhbGspLCB0LnBhcmVudC5tID0gLXQuejtcbiAgICB0LmVhY2hCZWZvcmUoc2Vjb25kV2Fsayk7XG5cbiAgICAvLyBJZiBhIGZpeGVkIG5vZGUgc2l6ZSBpcyBzcGVjaWZpZWQsIHNjYWxlIHggYW5kIHkuXG4gICAgaWYgKG5vZGVTaXplKSByb290LmVhY2hCZWZvcmUoc2l6ZU5vZGUpO1xuXG4gICAgLy8gSWYgYSBmaXhlZCB0cmVlIHNpemUgaXMgc3BlY2lmaWVkLCBzY2FsZSB4IGFuZCB5IGJhc2VkIG9uIHRoZSBleHRlbnQuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbGVmdC1tb3N0LCByaWdodC1tb3N0LCBhbmQgZGVwdGgtbW9zdCBub2RlcyBmb3IgZXh0ZW50cy5cbiAgICBlbHNlIHtcbiAgICAgIHZhciBsZWZ0ID0gcm9vdCxcbiAgICAgICAgICByaWdodCA9IHJvb3QsXG4gICAgICAgICAgYm90dG9tID0gcm9vdDtcbiAgICAgIHJvb3QuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnggPCBsZWZ0LngpIGxlZnQgPSBub2RlO1xuICAgICAgICBpZiAobm9kZS54ID4gcmlnaHQueCkgcmlnaHQgPSBub2RlO1xuICAgICAgICBpZiAobm9kZS5kZXB0aCA+IGJvdHRvbS5kZXB0aCkgYm90dG9tID0gbm9kZTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHMgPSBsZWZ0ID09PSByaWdodCA/IDEgOiBzZXBhcmF0aW9uKGxlZnQsIHJpZ2h0KSAvIDIsXG4gICAgICAgICAgdHggPSBzIC0gbGVmdC54LFxuICAgICAgICAgIGt4ID0gZHggLyAocmlnaHQueCArIHMgKyB0eCksXG4gICAgICAgICAga3kgPSBkeSAvIChib3R0b20uZGVwdGggfHwgMSk7XG4gICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBub2RlLnggPSAobm9kZS54ICsgdHgpICoga3g7XG4gICAgICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBreTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLy8gQ29tcHV0ZXMgYSBwcmVsaW1pbmFyeSB4LWNvb3JkaW5hdGUgZm9yIHYuIEJlZm9yZSB0aGF0LCBGSVJTVCBXQUxLIGlzXG4gIC8vIGFwcGxpZWQgcmVjdXJzaXZlbHkgdG8gdGhlIGNoaWxkcmVuIG9mIHYsIGFzIHdlbGwgYXMgdGhlIGZ1bmN0aW9uXG4gIC8vIEFQUE9SVElPTi4gQWZ0ZXIgc3BhY2luZyBvdXQgdGhlIGNoaWxkcmVuIGJ5IGNhbGxpbmcgRVhFQ1VURSBTSElGVFMsIHRoZVxuICAvLyBub2RlIHYgaXMgcGxhY2VkIHRvIHRoZSBtaWRwb2ludCBvZiBpdHMgb3V0ZXJtb3N0IGNoaWxkcmVuLlxuICBmdW5jdGlvbiBmaXJzdFdhbGsodikge1xuICAgIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sXG4gICAgICAgIHNpYmxpbmdzID0gdi5wYXJlbnQuY2hpbGRyZW4sXG4gICAgICAgIHcgPSB2LmkgPyBzaWJsaW5nc1t2LmkgLSAxXSA6IG51bGw7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBleGVjdXRlU2hpZnRzKHYpO1xuICAgICAgdmFyIG1pZHBvaW50ID0gKGNoaWxkcmVuWzBdLnogKyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS56KSAvIDI7XG4gICAgICBpZiAodykge1xuICAgICAgICB2LnogPSB3LnogKyBzZXBhcmF0aW9uKHYuXywgdy5fKTtcbiAgICAgICAgdi5tID0gdi56IC0gbWlkcG9pbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2LnogPSBtaWRwb2ludDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHcpIHtcbiAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pO1xuICAgIH1cbiAgICB2LnBhcmVudC5BID0gYXBwb3J0aW9uKHYsIHcsIHYucGFyZW50LkEgfHwgc2libGluZ3NbMF0pO1xuICB9XG5cbiAgLy8gQ29tcHV0ZXMgYWxsIHJlYWwgeC1jb29yZGluYXRlcyBieSBzdW1taW5nIHVwIHRoZSBtb2RpZmllcnMgcmVjdXJzaXZlbHkuXG4gIGZ1bmN0aW9uIHNlY29uZFdhbGsodikge1xuICAgIHYuXy54ID0gdi56ICsgdi5wYXJlbnQubTtcbiAgICB2Lm0gKz0gdi5wYXJlbnQubTtcbiAgfVxuXG4gIC8vIFRoZSBjb3JlIG9mIHRoZSBhbGdvcml0aG0uIEhlcmUsIGEgbmV3IHN1YnRyZWUgaXMgY29tYmluZWQgd2l0aCB0aGVcbiAgLy8gcHJldmlvdXMgc3VidHJlZXMuIFRocmVhZHMgYXJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGluc2lkZSBhbmQgb3V0c2lkZVxuICAvLyBjb250b3VycyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZSB1cCB0byB0aGUgaGlnaGVzdCBjb21tb24gbGV2ZWwuIFRoZVxuICAvLyB2ZXJ0aWNlcyB1c2VkIGZvciB0aGUgdHJhdmVyc2FscyBhcmUgdmkrLCB2aS0sIHZvLSwgYW5kIHZvKywgd2hlcmUgdGhlXG4gIC8vIHN1cGVyc2NyaXB0IG8gbWVhbnMgb3V0c2lkZSBhbmQgaSBtZWFucyBpbnNpZGUsIHRoZSBzdWJzY3JpcHQgLSBtZWFucyBsZWZ0XG4gIC8vIHN1YnRyZWUgYW5kICsgbWVhbnMgcmlnaHQgc3VidHJlZS4gRm9yIHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyBhbG9uZyB0aGVcbiAgLy8gY29udG91ciwgd2UgdXNlIHJlc3BlY3RpdmUgdmFyaWFibGVzIHNpKywgc2ktLCBzby0sIGFuZCBzbysuIFdoZW5ldmVyIHR3b1xuICAvLyBub2RlcyBvZiB0aGUgaW5zaWRlIGNvbnRvdXJzIGNvbmZsaWN0LCB3ZSBjb21wdXRlIHRoZSBsZWZ0IG9uZSBvZiB0aGVcbiAgLy8gZ3JlYXRlc3QgdW5jb21tb24gYW5jZXN0b3JzIHVzaW5nIHRoZSBmdW5jdGlvbiBBTkNFU1RPUiBhbmQgY2FsbCBNT1ZFXG4gIC8vIFNVQlRSRUUgdG8gc2hpZnQgdGhlIHN1YnRyZWUgYW5kIHByZXBhcmUgdGhlIHNoaWZ0cyBvZiBzbWFsbGVyIHN1YnRyZWVzLlxuICAvLyBGaW5hbGx5LCB3ZSBhZGQgYSBuZXcgdGhyZWFkIChpZiBuZWNlc3NhcnkpLlxuICBmdW5jdGlvbiBhcHBvcnRpb24odiwgdywgYW5jZXN0b3IpIHtcbiAgICBpZiAodykge1xuICAgICAgdmFyIHZpcCA9IHYsXG4gICAgICAgICAgdm9wID0gdixcbiAgICAgICAgICB2aW0gPSB3LFxuICAgICAgICAgIHZvbSA9IHZpcC5wYXJlbnQuY2hpbGRyZW5bMF0sXG4gICAgICAgICAgc2lwID0gdmlwLm0sXG4gICAgICAgICAgc29wID0gdm9wLm0sXG4gICAgICAgICAgc2ltID0gdmltLm0sXG4gICAgICAgICAgc29tID0gdm9tLm0sXG4gICAgICAgICAgc2hpZnQ7XG4gICAgICB3aGlsZSAodmltID0gbmV4dFJpZ2h0KHZpbSksIHZpcCA9IG5leHRMZWZ0KHZpcCksIHZpbSAmJiB2aXApIHtcbiAgICAgICAgdm9tID0gbmV4dExlZnQodm9tKTtcbiAgICAgICAgdm9wID0gbmV4dFJpZ2h0KHZvcCk7XG4gICAgICAgIHZvcC5hID0gdjtcbiAgICAgICAgc2hpZnQgPSB2aW0ueiArIHNpbSAtIHZpcC56IC0gc2lwICsgc2VwYXJhdGlvbih2aW0uXywgdmlwLl8pO1xuICAgICAgICBpZiAoc2hpZnQgPiAwKSB7XG4gICAgICAgICAgbW92ZVN1YnRyZWUobmV4dEFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpLCB2LCBzaGlmdCk7XG4gICAgICAgICAgc2lwICs9IHNoaWZ0O1xuICAgICAgICAgIHNvcCArPSBzaGlmdDtcbiAgICAgICAgfVxuICAgICAgICBzaW0gKz0gdmltLm07XG4gICAgICAgIHNpcCArPSB2aXAubTtcbiAgICAgICAgc29tICs9IHZvbS5tO1xuICAgICAgICBzb3AgKz0gdm9wLm07XG4gICAgICB9XG4gICAgICBpZiAodmltICYmICFuZXh0UmlnaHQodm9wKSkge1xuICAgICAgICB2b3AudCA9IHZpbTtcbiAgICAgICAgdm9wLm0gKz0gc2ltIC0gc29wO1xuICAgICAgfVxuICAgICAgaWYgKHZpcCAmJiAhbmV4dExlZnQodm9tKSkge1xuICAgICAgICB2b20udCA9IHZpcDtcbiAgICAgICAgdm9tLm0gKz0gc2lwIC0gc29tO1xuICAgICAgICBhbmNlc3RvciA9IHY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpemVOb2RlKG5vZGUpIHtcbiAgICBub2RlLnggKj0gZHg7XG4gICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGR5O1xuICB9XG5cbiAgdHJlZS5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlcGFyYXRpb24gPSB4LCB0cmVlKSA6IHNlcGFyYXRpb247XG4gIH07XG5cbiAgdHJlZS5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWUpIDogKG5vZGVTaXplID8gbnVsbCA6IFtkeCwgZHldKTtcbiAgfTtcblxuICB0cmVlLm5vZGVTaXplID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gdHJ1ZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUgPyBbZHgsIGR5XSA6IG51bGwpO1xuICB9O1xuXG4gIHJldHVybiB0cmVlO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgbm9kZSxcbiAgICAgIGkgPSAtMSxcbiAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICBrID0gcGFyZW50LnZhbHVlICYmICh5MSAtIHkwKSAvIHBhcmVudC52YWx1ZTtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDE7XG4gICAgbm9kZS55MCA9IHkwLCBub2RlLnkxID0geTAgKz0gbm9kZS52YWx1ZSAqIGs7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHJlZW1hcERpY2UgZnJvbSBcIi4vZGljZS5qc1wiO1xuaW1wb3J0IHRyZWVtYXBTbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuXG5leHBvcnQgdmFyIHBoaSA9ICgxICsgTWF0aC5zcXJ0KDUpKSAvIDI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmlmeVJhdGlvKHJhdGlvLCBwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciByb3dzID0gW10sXG4gICAgICBub2RlcyA9IHBhcmVudC5jaGlsZHJlbixcbiAgICAgIHJvdyxcbiAgICAgIG5vZGVWYWx1ZSxcbiAgICAgIGkwID0gMCxcbiAgICAgIGkxID0gMCxcbiAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICBkeCwgZHksXG4gICAgICB2YWx1ZSA9IHBhcmVudC52YWx1ZSxcbiAgICAgIHN1bVZhbHVlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIG5ld1JhdGlvLFxuICAgICAgbWluUmF0aW8sXG4gICAgICBhbHBoYSxcbiAgICAgIGJldGE7XG5cbiAgd2hpbGUgKGkwIDwgbikge1xuICAgIGR4ID0geDEgLSB4MCwgZHkgPSB5MSAtIHkwO1xuXG4gICAgLy8gRmluZCB0aGUgbmV4dCBub24tZW1wdHkgbm9kZS5cbiAgICBkbyBzdW1WYWx1ZSA9IG5vZGVzW2kxKytdLnZhbHVlOyB3aGlsZSAoIXN1bVZhbHVlICYmIGkxIDwgbik7XG4gICAgbWluVmFsdWUgPSBtYXhWYWx1ZSA9IHN1bVZhbHVlO1xuICAgIGFscGhhID0gTWF0aC5tYXgoZHkgLyBkeCwgZHggLyBkeSkgLyAodmFsdWUgKiByYXRpbyk7XG4gICAgYmV0YSA9IHN1bVZhbHVlICogc3VtVmFsdWUgKiBhbHBoYTtcbiAgICBtaW5SYXRpbyA9IE1hdGgubWF4KG1heFZhbHVlIC8gYmV0YSwgYmV0YSAvIG1pblZhbHVlKTtcblxuICAgIC8vIEtlZXAgYWRkaW5nIG5vZGVzIHdoaWxlIHRoZSBhc3BlY3QgcmF0aW8gbWFpbnRhaW5zIG9yIGltcHJvdmVzLlxuICAgIGZvciAoOyBpMSA8IG47ICsraTEpIHtcbiAgICAgIHN1bVZhbHVlICs9IG5vZGVWYWx1ZSA9IG5vZGVzW2kxXS52YWx1ZTtcbiAgICAgIGlmIChub2RlVmFsdWUgPCBtaW5WYWx1ZSkgbWluVmFsdWUgPSBub2RlVmFsdWU7XG4gICAgICBpZiAobm9kZVZhbHVlID4gbWF4VmFsdWUpIG1heFZhbHVlID0gbm9kZVZhbHVlO1xuICAgICAgYmV0YSA9IHN1bVZhbHVlICogc3VtVmFsdWUgKiBhbHBoYTtcbiAgICAgIG5ld1JhdGlvID0gTWF0aC5tYXgobWF4VmFsdWUgLyBiZXRhLCBiZXRhIC8gbWluVmFsdWUpO1xuICAgICAgaWYgKG5ld1JhdGlvID4gbWluUmF0aW8pIHsgc3VtVmFsdWUgLT0gbm9kZVZhbHVlOyBicmVhazsgfVxuICAgICAgbWluUmF0aW8gPSBuZXdSYXRpbztcbiAgICB9XG5cbiAgICAvLyBQb3NpdGlvbiBhbmQgcmVjb3JkIHRoZSByb3cgb3JpZW50YXRpb24uXG4gICAgcm93cy5wdXNoKHJvdyA9IHt2YWx1ZTogc3VtVmFsdWUsIGRpY2U6IGR4IDwgZHksIGNoaWxkcmVuOiBub2Rlcy5zbGljZShpMCwgaTEpfSk7XG4gICAgaWYgKHJvdy5kaWNlKSB0cmVlbWFwRGljZShyb3csIHgwLCB5MCwgeDEsIHZhbHVlID8geTAgKz0gZHkgKiBzdW1WYWx1ZSAvIHZhbHVlIDogeTEpO1xuICAgIGVsc2UgdHJlZW1hcFNsaWNlKHJvdywgeDAsIHkwLCB2YWx1ZSA/IHgwICs9IGR4ICogc3VtVmFsdWUgLyB2YWx1ZSA6IHgxLCB5MSk7XG4gICAgdmFsdWUgLT0gc3VtVmFsdWUsIGkwID0gaTE7XG4gIH1cblxuICByZXR1cm4gcm93cztcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIGN1c3RvbShyYXRpbykge1xuXG4gIGZ1bmN0aW9uIHNxdWFyaWZ5KHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICBzcXVhcmlmeVJhdGlvKHJhdGlvLCBwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKTtcbiAgfVxuXG4gIHNxdWFyaWZ5LnJhdGlvID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBjdXN0b20oKHggPSAreCkgPiAxID8geCA6IDEpO1xuICB9O1xuXG4gIHJldHVybiBzcXVhcmlmeTtcbn0pKHBoaSk7XG4iLCAiaW1wb3J0IHJvdW5kTm9kZSBmcm9tIFwiLi9yb3VuZC5qc1wiO1xuaW1wb3J0IHNxdWFyaWZ5IGZyb20gXCIuL3NxdWFyaWZ5LmpzXCI7XG5pbXBvcnQge3JlcXVpcmVkfSBmcm9tIFwiLi4vYWNjZXNzb3JzLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQsIHtjb25zdGFudFplcm99IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHRpbGUgPSBzcXVhcmlmeSxcbiAgICAgIHJvdW5kID0gZmFsc2UsXG4gICAgICBkeCA9IDEsXG4gICAgICBkeSA9IDEsXG4gICAgICBwYWRkaW5nU3RhY2sgPSBbMF0sXG4gICAgICBwYWRkaW5nSW5uZXIgPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nVG9wID0gY29uc3RhbnRaZXJvLFxuICAgICAgcGFkZGluZ1JpZ2h0ID0gY29uc3RhbnRaZXJvLFxuICAgICAgcGFkZGluZ0JvdHRvbSA9IGNvbnN0YW50WmVybyxcbiAgICAgIHBhZGRpbmdMZWZ0ID0gY29uc3RhbnRaZXJvO1xuXG4gIGZ1bmN0aW9uIHRyZWVtYXAocm9vdCkge1xuICAgIHJvb3QueDAgPVxuICAgIHJvb3QueTAgPSAwO1xuICAgIHJvb3QueDEgPSBkeDtcbiAgICByb290LnkxID0gZHk7XG4gICAgcm9vdC5lYWNoQmVmb3JlKHBvc2l0aW9uTm9kZSk7XG4gICAgcGFkZGluZ1N0YWNrID0gWzBdO1xuICAgIGlmIChyb3VuZCkgcm9vdC5lYWNoQmVmb3JlKHJvdW5kTm9kZSk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUobm9kZSkge1xuICAgIHZhciBwID0gcGFkZGluZ1N0YWNrW25vZGUuZGVwdGhdLFxuICAgICAgICB4MCA9IG5vZGUueDAgKyBwLFxuICAgICAgICB5MCA9IG5vZGUueTAgKyBwLFxuICAgICAgICB4MSA9IG5vZGUueDEgLSBwLFxuICAgICAgICB5MSA9IG5vZGUueTEgLSBwO1xuICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjtcbiAgICBpZiAoeTEgPCB5MCkgeTAgPSB5MSA9ICh5MCArIHkxKSAvIDI7XG4gICAgbm9kZS54MCA9IHgwO1xuICAgIG5vZGUueTAgPSB5MDtcbiAgICBub2RlLngxID0geDE7XG4gICAgbm9kZS55MSA9IHkxO1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBwID0gcGFkZGluZ1N0YWNrW25vZGUuZGVwdGggKyAxXSA9IHBhZGRpbmdJbm5lcihub2RlKSAvIDI7XG4gICAgICB4MCArPSBwYWRkaW5nTGVmdChub2RlKSAtIHA7XG4gICAgICB5MCArPSBwYWRkaW5nVG9wKG5vZGUpIC0gcDtcbiAgICAgIHgxIC09IHBhZGRpbmdSaWdodChub2RlKSAtIHA7XG4gICAgICB5MSAtPSBwYWRkaW5nQm90dG9tKG5vZGUpIC0gcDtcbiAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjtcbiAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjtcbiAgICAgIHRpbGUobm9kZSwgeDAsIHkwLCB4MSwgeTEpO1xuICAgIH1cbiAgfVxuXG4gIHRyZWVtYXAucm91bmQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIXgsIHRyZWVtYXApIDogcm91bmQ7XG4gIH07XG5cbiAgdHJlZW1hcC5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWVtYXApIDogW2R4LCBkeV07XG4gIH07XG5cbiAgdHJlZW1hcC50aWxlID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpbGUgPSByZXF1aXJlZCh4KSwgdHJlZW1hcCkgOiB0aWxlO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRyZWVtYXAucGFkZGluZ0lubmVyKHgpLnBhZGRpbmdPdXRlcih4KSA6IHRyZWVtYXAucGFkZGluZ0lubmVyKCk7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nSW5uZXIgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0lubmVyO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ091dGVyID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nVG9wKHgpLnBhZGRpbmdSaWdodCh4KS5wYWRkaW5nQm90dG9tKHgpLnBhZGRpbmdMZWZ0KHgpIDogdHJlZW1hcC5wYWRkaW5nVG9wKCk7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nVG9wID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdUb3AgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nVG9wO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ1JpZ2h0ID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdSaWdodCA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdSaWdodDtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdCb3R0b20gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0JvdHRvbSA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdCb3R0b207XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nTGVmdCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nTGVmdCA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdMZWZ0O1xuICB9O1xuXG4gIHJldHVybiB0cmVlbWFwO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgaSwgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIHN1bSwgc3VtcyA9IG5ldyBBcnJheShuICsgMSk7XG5cbiAgZm9yIChzdW1zWzBdID0gc3VtID0gaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBzdW1zW2kgKyAxXSA9IHN1bSArPSBub2Rlc1tpXS52YWx1ZTtcbiAgfVxuXG4gIHBhcnRpdGlvbigwLCBuLCBwYXJlbnQudmFsdWUsIHgwLCB5MCwgeDEsIHkxKTtcblxuICBmdW5jdGlvbiBwYXJ0aXRpb24oaSwgaiwgdmFsdWUsIHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgaWYgKGkgPj0gaiAtIDEpIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBub2RlLngwID0geDAsIG5vZGUueTAgPSB5MDtcbiAgICAgIG5vZGUueDEgPSB4MSwgbm9kZS55MSA9IHkxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZU9mZnNldCA9IHN1bXNbaV0sXG4gICAgICAgIHZhbHVlVGFyZ2V0ID0gKHZhbHVlIC8gMikgKyB2YWx1ZU9mZnNldCxcbiAgICAgICAgayA9IGkgKyAxLFxuICAgICAgICBoaSA9IGogLSAxO1xuXG4gICAgd2hpbGUgKGsgPCBoaSkge1xuICAgICAgdmFyIG1pZCA9IGsgKyBoaSA+Pj4gMTtcbiAgICAgIGlmIChzdW1zW21pZF0gPCB2YWx1ZVRhcmdldCkgayA9IG1pZCArIDE7XG4gICAgICBlbHNlIGhpID0gbWlkO1xuICAgIH1cblxuICAgIGlmICgodmFsdWVUYXJnZXQgLSBzdW1zW2sgLSAxXSkgPCAoc3Vtc1trXSAtIHZhbHVlVGFyZ2V0KSAmJiBpICsgMSA8IGspIC0taztcblxuICAgIHZhciB2YWx1ZUxlZnQgPSBzdW1zW2tdIC0gdmFsdWVPZmZzZXQsXG4gICAgICAgIHZhbHVlUmlnaHQgPSB2YWx1ZSAtIHZhbHVlTGVmdDtcblxuICAgIGlmICgoeDEgLSB4MCkgPiAoeTEgLSB5MCkpIHtcbiAgICAgIHZhciB4ayA9IHZhbHVlID8gKHgwICogdmFsdWVSaWdodCArIHgxICogdmFsdWVMZWZ0KSAvIHZhbHVlIDogeDE7XG4gICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHhrLCB5MSk7XG4gICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeGssIHkwLCB4MSwgeTEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgeWsgPSB2YWx1ZSA/ICh5MCAqIHZhbHVlUmlnaHQgKyB5MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZSA6IHkxO1xuICAgICAgcGFydGl0aW9uKGksIGssIHZhbHVlTGVmdCwgeDAsIHkwLCB4MSwgeWspO1xuICAgICAgcGFydGl0aW9uKGssIGosIHZhbHVlUmlnaHQsIHgwLCB5aywgeDEsIHkxKTtcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaW5pdFJhbmdlKGRvbWFpbiwgcmFuZ2UpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiBicmVhaztcbiAgICBjYXNlIDE6IHRoaXMucmFuZ2UoZG9tYWluKTsgYnJlYWs7XG4gICAgZGVmYXVsdDogdGhpcy5yYW5nZShyYW5nZSkuZG9tYWluKGRvbWFpbik7IGJyZWFrO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdEludGVycG9sYXRvcihkb21haW4sIGludGVycG9sYXRvcikge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IGJyZWFrO1xuICAgIGNhc2UgMToge1xuICAgICAgaWYgKHR5cGVvZiBkb21haW4gPT09IFwiZnVuY3Rpb25cIikgdGhpcy5pbnRlcnBvbGF0b3IoZG9tYWluKTtcbiAgICAgIGVsc2UgdGhpcy5yYW5nZShkb21haW4pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRoaXMuZG9tYWluKGRvbWFpbik7XG4gICAgICBpZiAodHlwZW9mIGludGVycG9sYXRvciA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmludGVycG9sYXRvcihpbnRlcnBvbGF0b3IpO1xuICAgICAgZWxzZSB0aGlzLnJhbmdlKGludGVycG9sYXRvcik7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXQuanNcIjtcblxuZXhwb3J0IGNvbnN0IGltcGxpY2l0ID0gU3ltYm9sKFwiaW1wbGljaXRcIik7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGluYWwoKSB7XG4gIHZhciBpbmRleCA9IG5ldyBNYXAoKSxcbiAgICAgIGRvbWFpbiA9IFtdLFxuICAgICAgcmFuZ2UgPSBbXSxcbiAgICAgIHVua25vd24gPSBpbXBsaWNpdDtcblxuICBmdW5jdGlvbiBzY2FsZShkKSB7XG4gICAgdmFyIGtleSA9IGQgKyBcIlwiLCBpID0gaW5kZXguZ2V0KGtleSk7XG4gICAgaWYgKCFpKSB7XG4gICAgICBpZiAodW5rbm93biAhPT0gaW1wbGljaXQpIHJldHVybiB1bmtub3duO1xuICAgICAgaW5kZXguc2V0KGtleSwgaSA9IGRvbWFpbi5wdXNoKGQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlWyhpIC0gMSkgJSByYW5nZS5sZW5ndGhdO1xuICB9XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgIGRvbWFpbiA9IFtdLCBpbmRleCA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIF8pIHtcbiAgICAgIGNvbnN0IGtleSA9IHZhbHVlICsgXCJcIjtcbiAgICAgIGlmIChpbmRleC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBpbmRleC5zZXQoa2V5LCBkb21haW4ucHVzaCh2YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBBcnJheS5mcm9tKF8pLCBzY2FsZSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvcmRpbmFsKGRvbWFpbiwgcmFuZ2UpLnVua25vd24odW5rbm93bik7XG4gIH07XG5cbiAgaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xuXG4gIHJldHVybiBzY2FsZTtcbn1cbiIsICJpbXBvcnQge3JhbmdlIGFzIHNlcXVlbmNlfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5pbXBvcnQgb3JkaW5hbCBmcm9tIFwiLi9vcmRpbmFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJhbmQoKSB7XG4gIHZhciBzY2FsZSA9IG9yZGluYWwoKS51bmtub3duKHVuZGVmaW5lZCksXG4gICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sXG4gICAgICBvcmRpbmFsUmFuZ2UgPSBzY2FsZS5yYW5nZSxcbiAgICAgIHIwID0gMCxcbiAgICAgIHIxID0gMSxcbiAgICAgIHN0ZXAsXG4gICAgICBiYW5kd2lkdGgsXG4gICAgICByb3VuZCA9IGZhbHNlLFxuICAgICAgcGFkZGluZ0lubmVyID0gMCxcbiAgICAgIHBhZGRpbmdPdXRlciA9IDAsXG4gICAgICBhbGlnbiA9IDAuNTtcblxuICBkZWxldGUgc2NhbGUudW5rbm93bjtcblxuICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgIHZhciBuID0gZG9tYWluKCkubGVuZ3RoLFxuICAgICAgICByZXZlcnNlID0gcjEgPCByMCxcbiAgICAgICAgc3RhcnQgPSByZXZlcnNlID8gcjEgOiByMCxcbiAgICAgICAgc3RvcCA9IHJldmVyc2UgPyByMCA6IHIxO1xuICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDEsIG4gLSBwYWRkaW5nSW5uZXIgKyBwYWRkaW5nT3V0ZXIgKiAyKTtcbiAgICBpZiAocm91bmQpIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApO1xuICAgIHN0YXJ0ICs9IChzdG9wIC0gc3RhcnQgLSBzdGVwICogKG4gLSBwYWRkaW5nSW5uZXIpKSAqIGFsaWduO1xuICAgIGJhbmR3aWR0aCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmdJbm5lcik7XG4gICAgaWYgKHJvdW5kKSBzdGFydCA9IE1hdGgucm91bmQoc3RhcnQpLCBiYW5kd2lkdGggPSBNYXRoLnJvdW5kKGJhbmR3aWR0aCk7XG4gICAgdmFyIHZhbHVlcyA9IHNlcXVlbmNlKG4pLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiBzdGFydCArIHN0ZXAgKiBpOyB9KTtcbiAgICByZXR1cm4gb3JkaW5hbFJhbmdlKHJldmVyc2UgPyB2YWx1ZXMucmV2ZXJzZSgpIDogdmFsdWVzKTtcbiAgfVxuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4oXyksIHJlc2NhbGUoKSkgOiBkb21haW4oKTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChbcjAsIHIxXSA9IF8sIHIwID0gK3IwLCByMSA9ICtyMSwgcmVzY2FsZSgpKSA6IFtyMCwgcjFdO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIFtyMCwgcjFdID0gXywgcjAgPSArcjAsIHIxID0gK3IxLCByb3VuZCA9IHRydWUsIHJlc2NhbGUoKTtcbiAgfTtcblxuICBzY2FsZS5iYW5kd2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYmFuZHdpZHRoO1xuICB9O1xuXG4gIHNjYWxlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gc3RlcDtcbiAgfTtcblxuICBzY2FsZS5yb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEhXywgcmVzY2FsZSgpKSA6IHJvdW5kO1xuICB9O1xuXG4gIHNjYWxlLnBhZGRpbmcgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5taW4oMSwgcGFkZGluZ091dGVyID0gK18pLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyO1xuICB9O1xuXG4gIHNjYWxlLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBNYXRoLm1pbigxLCBfKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjtcbiAgfTtcblxuICBzY2FsZS5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ091dGVyID0gK18sIHJlc2NhbGUoKSkgOiBwYWRkaW5nT3V0ZXI7XG4gIH07XG5cbiAgc2NhbGUuYWxpZ24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxpZ24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBhbGlnbjtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGJhbmQoZG9tYWluKCksIFtyMCwgcjFdKVxuICAgICAgICAucm91bmQocm91bmQpXG4gICAgICAgIC5wYWRkaW5nSW5uZXIocGFkZGluZ0lubmVyKVxuICAgICAgICAucGFkZGluZ091dGVyKHBhZGRpbmdPdXRlcilcbiAgICAgICAgLmFsaWduKGFsaWduKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHJlc2NhbGUoKSwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRpc2goc2NhbGUpIHtcbiAgdmFyIGNvcHkgPSBzY2FsZS5jb3B5O1xuXG4gIHNjYWxlLnBhZGRpbmcgPSBzY2FsZS5wYWRkaW5nT3V0ZXI7XG4gIGRlbGV0ZSBzY2FsZS5wYWRkaW5nSW5uZXI7XG4gIGRlbGV0ZSBzY2FsZS5wYWRkaW5nT3V0ZXI7XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBwb2ludGlzaChjb3B5KCkpO1xuICB9O1xuXG4gIHJldHVybiBzY2FsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50KCkge1xuICByZXR1cm4gcG9pbnRpc2goYmFuZC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhZGRpbmdJbm5lcigxKSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uc3RhbnRzKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gIHJldHVybiAreDtcbn1cbiIsICJpbXBvcnQge2Jpc2VjdH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2ludGVycG9sYXRlIGFzIGludGVycG9sYXRlVmFsdWUsIGludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJvdW5kfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHVuaXQgPSBbMCwgMV07XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eSh4KSB7XG4gIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUoYSwgYikge1xuICByZXR1cm4gKGIgLT0gKGEgPSArYSkpXG4gICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgLyBiOyB9XG4gICAgICA6IGNvbnN0YW50KGlzTmFOKGIpID8gTmFOIDogMC41KTtcbn1cblxuZnVuY3Rpb24gY2xhbXBlcihhLCBiKSB7XG4gIHZhciB0O1xuICBpZiAoYSA+IGIpIHQgPSBhLCBhID0gYiwgYiA9IHQ7XG4gIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLm1heChhLCBNYXRoLm1pbihiLCB4KSk7IH07XG59XG5cbi8vIG5vcm1hbGl6ZShhLCBiKSh4KSB0YWtlcyBhIGRvbWFpbiB2YWx1ZSB4IGluIFthLGJdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0IGluIFswLDFdLlxuLy8gaW50ZXJwb2xhdGUoYSwgYikodCkgdGFrZXMgYSBwYXJhbWV0ZXIgdCBpbiBbMCwxXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByYW5nZSB2YWx1ZSB4IGluIFthLGJdLlxuZnVuY3Rpb24gYmltYXAoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIGQwID0gZG9tYWluWzBdLCBkMSA9IGRvbWFpblsxXSwgcjAgPSByYW5nZVswXSwgcjEgPSByYW5nZVsxXTtcbiAgaWYgKGQxIDwgZDApIGQwID0gbm9ybWFsaXplKGQxLCBkMCksIHIwID0gaW50ZXJwb2xhdGUocjEsIHIwKTtcbiAgZWxzZSBkMCA9IG5vcm1hbGl6ZShkMCwgZDEpLCByMCA9IGludGVycG9sYXRlKHIwLCByMSk7XG4gIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiByMChkMCh4KSk7IH07XG59XG5cbmZ1bmN0aW9uIHBvbHltYXAoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIGogPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpIC0gMSxcbiAgICAgIGQgPSBuZXcgQXJyYXkoaiksXG4gICAgICByID0gbmV3IEFycmF5KGopLFxuICAgICAgaSA9IC0xO1xuXG4gIC8vIFJldmVyc2UgZGVzY2VuZGluZyBkb21haW5zLlxuICBpZiAoZG9tYWluW2pdIDwgZG9tYWluWzBdKSB7XG4gICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgIHJhbmdlID0gcmFuZ2Uuc2xpY2UoKS5yZXZlcnNlKCk7XG4gIH1cblxuICB3aGlsZSAoKytpIDwgaikge1xuICAgIGRbaV0gPSBub3JtYWxpemUoZG9tYWluW2ldLCBkb21haW5baSArIDFdKTtcbiAgICByW2ldID0gaW50ZXJwb2xhdGUocmFuZ2VbaV0sIHJhbmdlW2kgKyAxXSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgIHZhciBpID0gYmlzZWN0KGRvbWFpbiwgeCwgMSwgaikgLSAxO1xuICAgIHJldHVybiByW2ldKGRbaV0oeCkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weShzb3VyY2UsIHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0XG4gICAgICAuZG9tYWluKHNvdXJjZS5kb21haW4oKSlcbiAgICAgIC5yYW5nZShzb3VyY2UucmFuZ2UoKSlcbiAgICAgIC5pbnRlcnBvbGF0ZShzb3VyY2UuaW50ZXJwb2xhdGUoKSlcbiAgICAgIC5jbGFtcChzb3VyY2UuY2xhbXAoKSlcbiAgICAgIC51bmtub3duKHNvdXJjZS51bmtub3duKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtZXIoKSB7XG4gIHZhciBkb21haW4gPSB1bml0LFxuICAgICAgcmFuZ2UgPSB1bml0LFxuICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVZhbHVlLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgdW50cmFuc2Zvcm0sXG4gICAgICB1bmtub3duLFxuICAgICAgY2xhbXAgPSBpZGVudGl0eSxcbiAgICAgIHBpZWNld2lzZSxcbiAgICAgIG91dHB1dCxcbiAgICAgIGlucHV0O1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIG4gPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpO1xuICAgIGlmIChjbGFtcCAhPT0gaWRlbnRpdHkpIGNsYW1wID0gY2xhbXBlcihkb21haW5bMF0sIGRvbWFpbltuIC0gMV0pO1xuICAgIHBpZWNld2lzZSA9IG4gPiAyID8gcG9seW1hcCA6IGJpbWFwO1xuICAgIG91dHB1dCA9IGlucHV0ID0gbnVsbDtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgcmV0dXJuIHggPT0gbnVsbCB8fCBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IChvdXRwdXQgfHwgKG91dHB1dCA9IHBpZWNld2lzZShkb21haW4ubWFwKHRyYW5zZm9ybSksIHJhbmdlLCBpbnRlcnBvbGF0ZSkpKSh0cmFuc2Zvcm0oY2xhbXAoeCkpKTtcbiAgfVxuXG4gIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gY2xhbXAodW50cmFuc2Zvcm0oKGlucHV0IHx8IChpbnB1dCA9IHBpZWNld2lzZShyYW5nZSwgZG9tYWluLm1hcCh0cmFuc2Zvcm0pLCBpbnRlcnBvbGF0ZU51bWJlcikpKSh5KSkpO1xuICB9O1xuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBBcnJheS5mcm9tKF8sIG51bWJlciksIHJlc2NhbGUoKSkgOiBkb21haW4uc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IEFycmF5LmZyb20oXyksIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIHJhbmdlID0gQXJyYXkuZnJvbShfKSwgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVJvdW5kLCByZXNjYWxlKCk7XG4gIH07XG5cbiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSBfID8gdHJ1ZSA6IGlkZW50aXR5LCByZXNjYWxlKCkpIDogY2xhbXAgIT09IGlkZW50aXR5O1xuICB9O1xuXG4gIHNjYWxlLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgcmVzY2FsZSgpKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQsIHUpIHtcbiAgICB0cmFuc2Zvcm0gPSB0LCB1bnRyYW5zZm9ybSA9IHU7XG4gICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udGludW91cygpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyKCkoaWRlbnRpdHksIGlkZW50aXR5KTtcbn1cbiIsICJpbXBvcnQge3RpY2tTdGVwfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7Zm9ybWF0LCBmb3JtYXRQcmVmaXgsIGZvcm1hdFNwZWNpZmllciwgcHJlY2lzaW9uRml4ZWQsIHByZWNpc2lvblByZWZpeCwgcHJlY2lzaW9uUm91bmR9IGZyb20gXCJkMy1mb3JtYXRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGlja0Zvcm1hdChzdGFydCwgc3RvcCwgY291bnQsIHNwZWNpZmllcikge1xuICB2YXIgc3RlcCA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCksXG4gICAgICBwcmVjaXNpb247XG4gIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIgPT0gbnVsbCA/IFwiLGZcIiA6IHNwZWNpZmllcik7XG4gIHN3aXRjaCAoc3BlY2lmaWVyLnR5cGUpIHtcbiAgICBjYXNlIFwic1wiOiB7XG4gICAgICB2YXIgdmFsdWUgPSBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKTtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvblByZWZpeChzdGVwLCB2YWx1ZSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uO1xuICAgICAgcmV0dXJuIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKTtcbiAgICB9XG4gICAgY2FzZSBcIlwiOlxuICAgIGNhc2UgXCJlXCI6XG4gICAgY2FzZSBcImdcIjpcbiAgICBjYXNlIFwicFwiOlxuICAgIGNhc2UgXCJyXCI6IHtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvblJvdW5kKHN0ZXAsIE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09IFwiZVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZlwiOlxuICAgIGNhc2UgXCIlXCI6IHtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvbkZpeGVkKHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gXCIlXCIpICogMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm9ybWF0KHNwZWNpZmllcik7XG59XG4iLCAiaW1wb3J0IHt0aWNrcywgdGlja0luY3JlbWVudH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQgY29udGludW91cywge2NvcHl9IGZyb20gXCIuL2NvbnRpbnVvdXMuanNcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5pbXBvcnQgdGlja0Zvcm1hdCBmcm9tIFwiLi90aWNrRm9ybWF0LmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lYXJpc2goc2NhbGUpIHtcbiAgdmFyIGRvbWFpbiA9IHNjYWxlLmRvbWFpbjtcblxuICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICByZXR1cm4gdGlja3MoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCk7XG4gIH07XG5cbiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHtcbiAgICB2YXIgZCA9IGRvbWFpbigpO1xuICAgIHJldHVybiB0aWNrRm9ybWF0KGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQsIHNwZWNpZmllcik7XG4gIH07XG5cbiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMTA7XG5cbiAgICB2YXIgZCA9IGRvbWFpbigpO1xuICAgIHZhciBpMCA9IDA7XG4gICAgdmFyIGkxID0gZC5sZW5ndGggLSAxO1xuICAgIHZhciBzdGFydCA9IGRbaTBdO1xuICAgIHZhciBzdG9wID0gZFtpMV07XG4gICAgdmFyIHByZXN0ZXA7XG4gICAgdmFyIHN0ZXA7XG4gICAgdmFyIG1heEl0ZXIgPSAxMDtcblxuICAgIGlmIChzdG9wIDwgc3RhcnQpIHtcbiAgICAgIHN0ZXAgPSBzdGFydCwgc3RhcnQgPSBzdG9wLCBzdG9wID0gc3RlcDtcbiAgICAgIHN0ZXAgPSBpMCwgaTAgPSBpMSwgaTEgPSBzdGVwO1xuICAgIH1cbiAgICBcbiAgICB3aGlsZSAobWF4SXRlci0tID4gMCkge1xuICAgICAgc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KTtcbiAgICAgIGlmIChzdGVwID09PSBwcmVzdGVwKSB7XG4gICAgICAgIGRbaTBdID0gc3RhcnRcbiAgICAgICAgZFtpMV0gPSBzdG9wXG4gICAgICAgIHJldHVybiBkb21haW4oZCk7XG4gICAgICB9IGVsc2UgaWYgKHN0ZXAgPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAvIHN0ZXApICogc3RlcDtcbiAgICAgICAgc3RvcCA9IE1hdGguY2VpbChzdG9wIC8gc3RlcCkgKiBzdGVwO1xuICAgICAgfSBlbHNlIGlmIChzdGVwIDwgMCkge1xuICAgICAgICBzdGFydCA9IE1hdGguY2VpbChzdGFydCAqIHN0ZXApIC8gc3RlcDtcbiAgICAgICAgc3RvcCA9IE1hdGguZmxvb3Ioc3RvcCAqIHN0ZXApIC8gc3RlcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcHJlc3RlcCA9IHN0ZXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9O1xuXG4gIHJldHVybiBzY2FsZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGluZWFyKCkge1xuICB2YXIgc2NhbGUgPSBjb250aW51b3VzKCk7XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBsaW5lYXIoKSk7XG4gIH07XG5cbiAgaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xuXG4gIHJldHVybiBsaW5lYXJpc2goc2NhbGUpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNwZWNpZmllcikge1xuICB2YXIgbiA9IHNwZWNpZmllci5sZW5ndGggLyA2IHwgMCwgY29sb3JzID0gbmV3IEFycmF5KG4pLCBpID0gMDtcbiAgd2hpbGUgKGkgPCBuKSBjb2xvcnNbaV0gPSBcIiNcIiArIHNwZWNpZmllci5zbGljZShpICogNiwgKytpICogNik7XG4gIHJldHVybiBjb2xvcnM7XG59XG4iLCAiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZlwiKTtcbiIsICJpbXBvcnQge2N1YmVoZWxpeH0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlQ3ViZWhlbGl4TG9uZ30gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5cbmV4cG9ydCB2YXIgd2FybSA9IGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhjdWJlaGVsaXgoLTEwMCwgMC43NSwgMC4zNSksIGN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7XG5cbmV4cG9ydCB2YXIgY29vbCA9IGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhjdWJlaGVsaXgoMjYwLCAwLjc1LCAwLjM1KSwgY3ViZWhlbGl4KDgwLCAxLjUwLCAwLjgpKTtcblxudmFyIGMgPSBjdWJlaGVsaXgoKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odCkge1xuICBpZiAodCA8IDAgfHwgdCA+IDEpIHQgLT0gTWF0aC5mbG9vcih0KTtcbiAgdmFyIHRzID0gTWF0aC5hYnModCAtIDAuNSk7XG4gIGMuaCA9IDM2MCAqIHQgLSAxMDA7XG4gIGMucyA9IDEuNSAtIDEuNSAqIHRzO1xuICBjLmwgPSAwLjggLSAwLjkgKiB0cztcbiAgcmV0dXJuIGMgKyBcIlwiO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0YW50KCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwgImV4cG9ydCB2YXIgYWJzID0gTWF0aC5hYnM7XG5leHBvcnQgdmFyIGF0YW4yID0gTWF0aC5hdGFuMjtcbmV4cG9ydCB2YXIgY29zID0gTWF0aC5jb3M7XG5leHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgc2luID0gTWF0aC5zaW47XG5leHBvcnQgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7XG5cbmV4cG9ydCB2YXIgZXBzaWxvbiA9IDFlLTEyO1xuZXhwb3J0IHZhciBwaSA9IE1hdGguUEk7XG5leHBvcnQgdmFyIGhhbGZQaSA9IHBpIC8gMjtcbmV4cG9ydCB2YXIgdGF1ID0gMiAqIHBpO1xuXG5leHBvcnQgZnVuY3Rpb24gYWNvcyh4KSB7XG4gIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBwaSA6IE1hdGguYWNvcyh4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzaW4oeCkge1xuICByZXR1cm4geCA+PSAxID8gaGFsZlBpIDogeCA8PSAtMSA/IC1oYWxmUGkgOiBNYXRoLmFzaW4oeCk7XG59XG4iLCAiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQge2FicywgYWNvcywgYXNpbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgaGFsZlBpLCBtYXgsIG1pbiwgcGksIHNpbiwgc3FydCwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGFyY0lubmVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQuaW5uZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY091dGVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY1N0YXJ0QW5nbGUoZCkge1xuICByZXR1cm4gZC5zdGFydEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNFbmRBbmdsZShkKSB7XG4gIHJldHVybiBkLmVuZEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNQYWRBbmdsZShkKSB7XG4gIHJldHVybiBkICYmIGQucGFkQW5nbGU7IC8vIE5vdGU6IG9wdGlvbmFsIVxufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3QoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIHZhciB4MTAgPSB4MSAtIHgwLCB5MTAgPSB5MSAtIHkwLFxuICAgICAgeDMyID0geDMgLSB4MiwgeTMyID0geTMgLSB5MixcbiAgICAgIHQgPSB5MzIgKiB4MTAgLSB4MzIgKiB5MTA7XG4gIGlmICh0ICogdCA8IGVwc2lsb24pIHJldHVybjtcbiAgdCA9ICh4MzIgKiAoeTAgLSB5MikgLSB5MzIgKiAoeDAgLSB4MikpIC8gdDtcbiAgcmV0dXJuIFt4MCArIHQgKiB4MTAsIHkwICsgdCAqIHkxMF07XG59XG5cbi8vIENvbXB1dGUgcGVycGVuZGljdWxhciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuXG4vLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0NpcmNsZS1MaW5lSW50ZXJzZWN0aW9uLmh0bWxcbmZ1bmN0aW9uIGNvcm5lclRhbmdlbnRzKHgwLCB5MCwgeDEsIHkxLCByMSwgcmMsIGN3KSB7XG4gIHZhciB4MDEgPSB4MCAtIHgxLFxuICAgICAgeTAxID0geTAgLSB5MSxcbiAgICAgIGxvID0gKGN3ID8gcmMgOiAtcmMpIC8gc3FydCh4MDEgKiB4MDEgKyB5MDEgKiB5MDEpLFxuICAgICAgb3ggPSBsbyAqIHkwMSxcbiAgICAgIG95ID0gLWxvICogeDAxLFxuICAgICAgeDExID0geDAgKyBveCxcbiAgICAgIHkxMSA9IHkwICsgb3ksXG4gICAgICB4MTAgPSB4MSArIG94LFxuICAgICAgeTEwID0geTEgKyBveSxcbiAgICAgIHgwMCA9ICh4MTEgKyB4MTApIC8gMixcbiAgICAgIHkwMCA9ICh5MTEgKyB5MTApIC8gMixcbiAgICAgIGR4ID0geDEwIC0geDExLFxuICAgICAgZHkgPSB5MTAgLSB5MTEsXG4gICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgciA9IHIxIC0gcmMsXG4gICAgICBEID0geDExICogeTEwIC0geDEwICogeTExLFxuICAgICAgZCA9IChkeSA8IDAgPyAtMSA6IDEpICogc3FydChtYXgoMCwgciAqIHIgKiBkMiAtIEQgKiBEKSksXG4gICAgICBjeDAgPSAoRCAqIGR5IC0gZHggKiBkKSAvIGQyLFxuICAgICAgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsXG4gICAgICBjeDEgPSAoRCAqIGR5ICsgZHggKiBkKSAvIGQyLFxuICAgICAgY3kxID0gKC1EICogZHggKyBkeSAqIGQpIC8gZDIsXG4gICAgICBkeDAgPSBjeDAgLSB4MDAsXG4gICAgICBkeTAgPSBjeTAgLSB5MDAsXG4gICAgICBkeDEgPSBjeDEgLSB4MDAsXG4gICAgICBkeTEgPSBjeTEgLSB5MDA7XG5cbiAgLy8gUGljayB0aGUgY2xvc2VyIG9mIHRoZSB0d28gaW50ZXJzZWN0aW9uIHBvaW50cy5cbiAgLy8gVE9ETyBJcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGludGVyc2VjdGlvbiB0byB1c2U/XG4gIGlmIChkeDAgKiBkeDAgKyBkeTAgKiBkeTAgPiBkeDEgKiBkeDEgKyBkeTEgKiBkeTEpIGN4MCA9IGN4MSwgY3kwID0gY3kxO1xuXG4gIHJldHVybiB7XG4gICAgY3g6IGN4MCxcbiAgICBjeTogY3kwLFxuICAgIHgwMTogLW94LFxuICAgIHkwMTogLW95LFxuICAgIHgxMTogY3gwICogKHIxIC8gciAtIDEpLFxuICAgIHkxMTogY3kwICogKHIxIC8gciAtIDEpXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgaW5uZXJSYWRpdXMgPSBhcmNJbm5lclJhZGl1cyxcbiAgICAgIG91dGVyUmFkaXVzID0gYXJjT3V0ZXJSYWRpdXMsXG4gICAgICBjb3JuZXJSYWRpdXMgPSBjb25zdGFudCgwKSxcbiAgICAgIHBhZFJhZGl1cyA9IG51bGwsXG4gICAgICBzdGFydEFuZ2xlID0gYXJjU3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gYXJjRW5kQW5nbGUsXG4gICAgICBwYWRBbmdsZSA9IGFyY1BhZEFuZ2xlLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gYXJjKCkge1xuICAgIHZhciBidWZmZXIsXG4gICAgICAgIHIsXG4gICAgICAgIHIwID0gK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHIxID0gK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZlBpLFxuICAgICAgICBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksXG4gICAgICAgIGRhID0gYWJzKGExIC0gYTApLFxuICAgICAgICBjdyA9IGExID4gYTA7XG5cbiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3V0ZXIgcmFkaXVzIGlzIGFsd2F5cyBsYXJnZXIgdGhhbiB0aGUgaW5uZXIgcmFkaXVzLlxuICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjtcblxuICAgIC8vIElzIGl0IGEgcG9pbnQ/XG4gICAgaWYgKCEocjEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oMCwgMCk7XG5cbiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzP1xuICAgIGVsc2UgaWYgKGRhID4gdGF1IC0gZXBzaWxvbikge1xuICAgICAgY29udGV4dC5tb3ZlVG8ocjEgKiBjb3MoYTApLCByMSAqIHNpbihhMCkpO1xuICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwLCBhMSwgIWN3KTtcbiAgICAgIGlmIChyMCA+IGVwc2lsb24pIHtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8ocjAgKiBjb3MoYTEpLCByMCAqIHNpbihhMSkpO1xuICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEsIGEwLCBjdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3IgaXMgaXQgYSBjaXJjdWxhciBvciBhbm51bGFyIHNlY3Rvcj9cbiAgICBlbHNlIHtcbiAgICAgIHZhciBhMDEgPSBhMCxcbiAgICAgICAgICBhMTEgPSBhMSxcbiAgICAgICAgICBhMDAgPSBhMCxcbiAgICAgICAgICBhMTAgPSBhMSxcbiAgICAgICAgICBkYTAgPSBkYSxcbiAgICAgICAgICBkYTEgPSBkYSxcbiAgICAgICAgICBhcCA9IHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLyAyLFxuICAgICAgICAgIHJwID0gKGFwID4gZXBzaWxvbikgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNxcnQocjAgKiByMCArIHIxICogcjEpKSxcbiAgICAgICAgICByYyA9IG1pbihhYnMocjEgLSByMCkgLyAyLCArY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLFxuICAgICAgICAgIHJjMCA9IHJjLFxuICAgICAgICAgIHJjMSA9IHJjLFxuICAgICAgICAgIHQwLFxuICAgICAgICAgIHQxO1xuXG4gICAgICAvLyBBcHBseSBwYWRkaW5nPyBOb3RlIHRoYXQgc2luY2UgcjEgXHUyMjY1IHIwLCBkYTEgXHUyMjY1IGRhMC5cbiAgICAgIGlmIChycCA+IGVwc2lsb24pIHtcbiAgICAgICAgdmFyIHAwID0gYXNpbihycCAvIHIwICogc2luKGFwKSksXG4gICAgICAgICAgICBwMSA9IGFzaW4ocnAgLyByMSAqIHNpbihhcCkpO1xuICAgICAgICBpZiAoKGRhMCAtPSBwMCAqIDIpID4gZXBzaWxvbikgcDAgKj0gKGN3ID8gMSA6IC0xKSwgYTAwICs9IHAwLCBhMTAgLT0gcDA7XG4gICAgICAgIGVsc2UgZGEwID0gMCwgYTAwID0gYTEwID0gKGEwICsgYTEpIC8gMjtcbiAgICAgICAgaWYgKChkYTEgLT0gcDEgKiAyKSA+IGVwc2lsb24pIHAxICo9IChjdyA/IDEgOiAtMSksIGEwMSArPSBwMSwgYTExIC09IHAxO1xuICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9IChhMCArIGExKSAvIDI7XG4gICAgICB9XG5cbiAgICAgIHZhciB4MDEgPSByMSAqIGNvcyhhMDEpLFxuICAgICAgICAgIHkwMSA9IHIxICogc2luKGEwMSksXG4gICAgICAgICAgeDEwID0gcjAgKiBjb3MoYTEwKSxcbiAgICAgICAgICB5MTAgPSByMCAqIHNpbihhMTApO1xuXG4gICAgICAvLyBBcHBseSByb3VuZGVkIGNvcm5lcnM/XG4gICAgICBpZiAocmMgPiBlcHNpbG9uKSB7XG4gICAgICAgIHZhciB4MTEgPSByMSAqIGNvcyhhMTEpLFxuICAgICAgICAgICAgeTExID0gcjEgKiBzaW4oYTExKSxcbiAgICAgICAgICAgIHgwMCA9IHIwICogY29zKGEwMCksXG4gICAgICAgICAgICB5MDAgPSByMCAqIHNpbihhMDApLFxuICAgICAgICAgICAgb2M7XG5cbiAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGNvcm5lciByYWRpdXMgYWNjb3JkaW5nIHRvIHRoZSBzZWN0b3IgYW5nbGUuXG4gICAgICAgIGlmIChkYSA8IHBpICYmIChvYyA9IGludGVyc2VjdCh4MDEsIHkwMSwgeDAwLCB5MDAsIHgxMSwgeTExLCB4MTAsIHkxMCkpKSB7XG4gICAgICAgICAgdmFyIGF4ID0geDAxIC0gb2NbMF0sXG4gICAgICAgICAgICAgIGF5ID0geTAxIC0gb2NbMV0sXG4gICAgICAgICAgICAgIGJ4ID0geDExIC0gb2NbMF0sXG4gICAgICAgICAgICAgIGJ5ID0geTExIC0gb2NbMV0sXG4gICAgICAgICAgICAgIGtjID0gMSAvIHNpbihhY29zKChheCAqIGJ4ICsgYXkgKiBieSkgLyAoc3FydChheCAqIGF4ICsgYXkgKiBheSkgKiBzcXJ0KGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksXG4gICAgICAgICAgICAgIGxjID0gc3FydChvY1swXSAqIG9jWzBdICsgb2NbMV0gKiBvY1sxXSk7XG4gICAgICAgICAgcmMwID0gbWluKHJjLCAocjAgLSBsYykgLyAoa2MgLSAxKSk7XG4gICAgICAgICAgcmMxID0gbWluKHJjLCAocjEgLSBsYykgLyAoa2MgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSXMgdGhlIHNlY3RvciBjb2xsYXBzZWQgdG8gYSBsaW5lP1xuICAgICAgaWYgKCEoZGExID4gZXBzaWxvbikpIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKTtcblxuICAgICAgLy8gRG9lcyB0aGUgc2VjdG9yXHUyMDE5cyBvdXRlciByaW5nIGhhdmUgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgZWxzZSBpZiAocmMxID4gZXBzaWxvbikge1xuICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzKHgwMCwgeTAwLCB4MDEsIHkwMSwgcjEsIHJjMSwgY3cpO1xuICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgxMSwgeTExLCB4MTAsIHkxMCwgcjEsIHJjMSwgY3cpO1xuXG4gICAgICAgIGNvbnRleHQubW92ZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7XG5cbiAgICAgICAgLy8gSGF2ZSB0aGUgY29ybmVycyBtZXJnZWQ/XG4gICAgICAgIGlmIChyYzEgPCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MC55MTEsIHQwLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGF0YW4yKHQwLmN5ICsgdDAueTExLCB0MC5jeCArIHQwLngxMSksIGF0YW4yKHQxLmN5ICsgdDEueTExLCB0MS5jeCArIHQxLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzEsIGF0YW4yKHQxLnkxMSwgdDEueDExKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9yIGlzIHRoZSBvdXRlciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/XG4gICAgICBlbHNlIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKSwgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwMSwgYTExLCAhY3cpO1xuXG4gICAgICAvLyBJcyB0aGVyZSBubyBpbm5lciByaW5nLCBhbmQgaXRcdTIwMTlzIGEgY2lyY3VsYXIgc2VjdG9yP1xuICAgICAgLy8gT3IgcGVyaGFwcyBpdFx1MjAxOXMgYW4gYW5udWxhciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nP1xuICAgICAgaWYgKCEocjAgPiBlcHNpbG9uKSB8fCAhKGRhMCA+IGVwc2lsb24pKSBjb250ZXh0LmxpbmVUbyh4MTAsIHkxMCk7XG5cbiAgICAgIC8vIERvZXMgdGhlIHNlY3Rvclx1MjAxOXMgaW5uZXIgcmluZyAob3IgcG9pbnQpIGhhdmUgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbikge1xuICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzKHgxMCwgeTEwLCB4MTEsIHkxMSwgcjAsIC1yYzAsIGN3KTtcbiAgICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MDEsIHkwMSwgeDAwLCB5MDAsIHIwLCAtcmMwLCBjdyk7XG5cbiAgICAgICAgY29udGV4dC5saW5lVG8odDAuY3ggKyB0MC54MDEsIHQwLmN5ICsgdDAueTAxKTtcblxuICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD9cbiAgICAgICAgaWYgKHJjMCA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMwLCBhdGFuMih0MS55MTEsIHQxLngxMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPciBpcyB0aGUgaW5uZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjP1xuICAgICAgZWxzZSBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEwLCBhMDAsIGN3KTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9ICgraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsXG4gICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSAvIDI7XG4gICAgcmV0dXJuIFtjb3MoYSkgKiByLCBzaW4oYSkgKiByXTtcbiAgfTtcblxuICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW5uZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGlubmVyUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5vdXRlclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdXRlclJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogb3V0ZXJSYWRpdXM7XG4gIH07XG5cbiAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb3JuZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGNvcm5lclJhZGl1cztcbiAgfTtcblxuICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZFJhZGl1cyA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHBhZFJhZGl1cztcbiAgfTtcblxuICBhcmMuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBzdGFydEFuZ2xlO1xuICB9O1xuXG4gIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlbmRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogZW5kQW5nbGU7XG4gIH07XG5cbiAgYXJjLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBwYWRBbmdsZTtcbiAgfTtcblxuICBhcmMuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgYXJjKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGFyYztcbn1cbiIsICJleHBvcnQgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIHhcbiAgICA/IHggLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKHgpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwgImZ1bmN0aW9uIExpbmVhcihjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5MaW5lYXIucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpOyBicmVhaztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBMaW5lYXIoY29udGV4dCk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHgocCkge1xuICByZXR1cm4gcFswXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHkocCkge1xuICByZXR1cm4gcFsxXTtcbn1cbiIsICJpbXBvcnQge3BhdGh9IGZyb20gXCJkMy1wYXRoXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGN1cnZlTGluZWFyIGZyb20gXCIuL2N1cnZlL2xpbmVhci5qc1wiO1xuaW1wb3J0IHt4IGFzIHBvaW50WCwgeSBhcyBwb2ludFl9IGZyb20gXCIuL3BvaW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdmFyIGRlZmluZWQgPSBjb25zdGFudCh0cnVlKSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhcixcbiAgICAgIG91dHB1dCA9IG51bGw7XG5cbiAgeCA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogKHggPT09IHVuZGVmaW5lZCkgPyBwb2ludFggOiBjb25zdGFudCh4KTtcbiAgeSA9IHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyB5IDogKHkgPT09IHVuZGVmaW5lZCkgPyBwb2ludFkgOiBjb25zdGFudCh5KTtcblxuICBmdW5jdGlvbiBsaW5lKGRhdGEpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IChkYXRhID0gYXJyYXkoZGF0YSkpLmxlbmd0aCxcbiAgICAgICAgZCxcbiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSxcbiAgICAgICAgYnVmZmVyO1xuXG4gICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgb3V0cHV0ID0gY3VydmUoYnVmZmVyID0gcGF0aCgpKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7XG4gICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7XG4gICAgICAgIGlmIChkZWZpbmVkMCA9ICFkZWZpbmVkMCkgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5lZDApIG91dHB1dC5wb2ludCgreChkLCBpLCBkYXRhKSwgK3koZCwgaSwgZGF0YSkpO1xuICAgIH1cblxuICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBsaW5lLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5lKSA6IHg7XG4gIH07XG5cbiAgbGluZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluZSkgOiB5O1xuICB9O1xuXG4gIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBsaW5lKSA6IGRlZmluZWQ7XG4gIH07XG5cbiAgbGluZS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJ2ZSA9IF8sIGNvbnRleHQgIT0gbnVsbCAmJiAob3V0cHV0ID0gY3VydmUoY29udGV4dCkpLCBsaW5lKSA6IGN1cnZlO1xuICB9O1xuXG4gIGxpbmUuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgbGluZSkgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBsaW5lO1xufVxuIiwgImltcG9ydCBjdXJ2ZUxpbmVhciBmcm9tIFwiLi9saW5lYXIuanNcIjtcblxuZXhwb3J0IHZhciBjdXJ2ZVJhZGlhbExpbmVhciA9IGN1cnZlUmFkaWFsKGN1cnZlTGluZWFyKTtcblxuZnVuY3Rpb24gUmFkaWFsKGN1cnZlKSB7XG4gIHRoaXMuX2N1cnZlID0gY3VydmU7XG59XG5cblJhZGlhbC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fY3VydmUuYXJlYVN0YXJ0KCk7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmFyZWFFbmQoKTtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKTtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fY3VydmUubGluZUVuZCgpO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oYSwgcikge1xuICAgIHRoaXMuX2N1cnZlLnBvaW50KHIgKiBNYXRoLnNpbihhKSwgciAqIC1NYXRoLmNvcyhhKSk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1cnZlUmFkaWFsKGN1cnZlKSB7XG5cbiAgZnVuY3Rpb24gcmFkaWFsKGNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IFJhZGlhbChjdXJ2ZShjb250ZXh0KSk7XG4gIH1cblxuICByYWRpYWwuX2N1cnZlID0gY3VydmU7XG5cbiAgcmV0dXJuIHJhZGlhbDtcbn1cbiIsICJpbXBvcnQgY3VydmVSYWRpYWwsIHtjdXJ2ZVJhZGlhbExpbmVhcn0gZnJvbSBcIi4vY3VydmUvcmFkaWFsLmpzXCI7XG5pbXBvcnQgbGluZSBmcm9tIFwiLi9saW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lUmFkaWFsKGwpIHtcbiAgdmFyIGMgPSBsLmN1cnZlO1xuXG4gIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7XG4gIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55O1xuXG4gIGwuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7XG4gIH07XG5cbiAgcmV0dXJuIGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbGluZVJhZGlhbChsaW5lKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpKTtcbn1cbiIsICJpbXBvcnQge3BhdGh9IGZyb20gXCJkMy1wYXRoXCI7XG5pbXBvcnQge3NsaWNlfSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCB7eCBhcyBwb2ludFgsIHkgYXMgcG9pbnRZfSBmcm9tIFwiLi4vcG9pbnQuanNcIjtcbmltcG9ydCBwb2ludFJhZGlhbCBmcm9tIFwiLi4vcG9pbnRSYWRpYWwuanNcIjtcblxuZnVuY3Rpb24gbGlua1NvdXJjZShkKSB7XG4gIHJldHVybiBkLnNvdXJjZTtcbn1cblxuZnVuY3Rpb24gbGlua1RhcmdldChkKSB7XG4gIHJldHVybiBkLnRhcmdldDtcbn1cblxuZnVuY3Rpb24gbGluayhjdXJ2ZSkge1xuICB2YXIgc291cmNlID0gbGlua1NvdXJjZSxcbiAgICAgIHRhcmdldCA9IGxpbmtUYXJnZXQsXG4gICAgICB4ID0gcG9pbnRYLFxuICAgICAgeSA9IHBvaW50WSxcbiAgICAgIGNvbnRleHQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGxpbmsoKSB7XG4gICAgdmFyIGJ1ZmZlciwgYXJndiA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKSwgcyA9IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd2KSwgdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmd2KTtcbiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7XG4gICAgY3VydmUoY29udGV4dCwgK3guYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSBzLCBhcmd2KSksICt5LmFwcGx5KHRoaXMsIGFyZ3YpLCAreC5hcHBseSh0aGlzLCAoYXJndlswXSA9IHQsIGFyZ3YpKSwgK3kuYXBwbHkodGhpcywgYXJndikpO1xuICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgbGluay5zb3VyY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc291cmNlID0gXywgbGluaykgOiBzb3VyY2U7XG4gIH07XG5cbiAgbGluay50YXJnZXQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFyZ2V0ID0gXywgbGluaykgOiB0YXJnZXQ7XG4gIH07XG5cbiAgbGluay54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluaykgOiB4O1xuICB9O1xuXG4gIGxpbmsueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmspIDogeTtcbiAgfTtcblxuICBsaW5rLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGxpbmspIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gbGluaztcbn1cblxuZnVuY3Rpb24gY3VydmVIb3Jpem9udGFsKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7XG4gIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7XG59XG5cbmZ1bmN0aW9uIGN1cnZlVmVydGljYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwLCB5MCA9ICh5MCArIHkxKSAvIDIsIHgxLCB5MCwgeDEsIHkxKTtcbn1cblxuZnVuY3Rpb24gY3VydmVSYWRpYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIHAwID0gcG9pbnRSYWRpYWwoeDAsIHkwKSxcbiAgICAgIHAxID0gcG9pbnRSYWRpYWwoeDAsIHkwID0gKHkwICsgeTEpIC8gMiksXG4gICAgICBwMiA9IHBvaW50UmFkaWFsKHgxLCB5MCksXG4gICAgICBwMyA9IHBvaW50UmFkaWFsKHgxLCB5MSk7XG4gIGNvbnRleHQubW92ZVRvKHAwWzBdLCBwMFsxXSk7XG4gIGNvbnRleHQuYmV6aWVyQ3VydmVUbyhwMVswXSwgcDFbMV0sIHAyWzBdLCBwMlsxXSwgcDNbMF0sIHAzWzFdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtIb3Jpem9udGFsKCkge1xuICByZXR1cm4gbGluayhjdXJ2ZUhvcml6b250YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua1ZlcnRpY2FsKCkge1xuICByZXR1cm4gbGluayhjdXJ2ZVZlcnRpY2FsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtSYWRpYWwoKSB7XG4gIHZhciBsID0gbGluayhjdXJ2ZVJhZGlhbCk7XG4gIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7XG4gIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55O1xuICByZXR1cm4gbDtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gcG9pbnQodGhhdCwgeCwgeSkge1xuICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oXG4gICAgKDIgKiB0aGF0Ll94MCArIHRoYXQuX3gxKSAvIDMsXG4gICAgKDIgKiB0aGF0Ll95MCArIHRoYXQuX3kxKSAvIDMsXG4gICAgKHRoYXQuX3gwICsgMiAqIHRoYXQuX3gxKSAvIDMsXG4gICAgKHRoYXQuX3kwICsgMiAqIHRoYXQuX3kxKSAvIDMsXG4gICAgKHRoYXQuX3gwICsgNCAqIHRoYXQuX3gxICsgeCkgLyA2LFxuICAgICh0aGF0Ll95MCArIDQgKiB0aGF0Ll95MSArIHkpIC8gNlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQmFzaXMoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuQmFzaXMucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDM6IHBvaW50KHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IC8vIHByb2NlZWRcbiAgICAgIGNhc2UgMjogdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsIHRoaXMuX3kxKTsgYnJlYWs7XG4gICAgfVxuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9jb250ZXh0LmxpbmVUbygoNSAqIHRoaXMuX3gwICsgdGhpcy5feDEpIC8gNiwgKDUgKiB0aGlzLl95MCArIHRoaXMuX3kxKSAvIDYpOyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBCYXNpcyhjb250ZXh0KTtcbn1cbiIsICJpbXBvcnQge0Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5mdW5jdGlvbiBCdW5kbGUoY29udGV4dCwgYmV0YSkge1xuICB0aGlzLl9iYXNpcyA9IG5ldyBCYXNpcyhjb250ZXh0KTtcbiAgdGhpcy5fYmV0YSA9IGJldGE7XG59XG5cbkJ1bmRsZS5wcm90b3R5cGUgPSB7XG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feCA9IFtdO1xuICAgIHRoaXMuX3kgPSBbXTtcbiAgICB0aGlzLl9iYXNpcy5saW5lU3RhcnQoKTtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHggPSB0aGlzLl94LFxuICAgICAgICB5ID0gdGhpcy5feSxcbiAgICAgICAgaiA9IHgubGVuZ3RoIC0gMTtcblxuICAgIGlmIChqID4gMCkge1xuICAgICAgdmFyIHgwID0geFswXSxcbiAgICAgICAgICB5MCA9IHlbMF0sXG4gICAgICAgICAgZHggPSB4W2pdIC0geDAsXG4gICAgICAgICAgZHkgPSB5W2pdIC0geTAsXG4gICAgICAgICAgaSA9IC0xLFxuICAgICAgICAgIHQ7XG5cbiAgICAgIHdoaWxlICgrK2kgPD0gaikge1xuICAgICAgICB0ID0gaSAvIGo7XG4gICAgICAgIHRoaXMuX2Jhc2lzLnBvaW50KFxuICAgICAgICAgIHRoaXMuX2JldGEgKiB4W2ldICsgKDEgLSB0aGlzLl9iZXRhKSAqICh4MCArIHQgKiBkeCksXG4gICAgICAgICAgdGhpcy5fYmV0YSAqIHlbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHkwICsgdCAqIGR5KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3ggPSB0aGlzLl95ID0gbnVsbDtcbiAgICB0aGlzLl9iYXNpcy5saW5lRW5kKCk7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5feC5wdXNoKCt4KTtcbiAgICB0aGlzLl95LnB1c2goK3kpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKGJldGEpIHtcblxuICBmdW5jdGlvbiBidW5kbGUoY29udGV4dCkge1xuICAgIHJldHVybiBiZXRhID09PSAxID8gbmV3IEJhc2lzKGNvbnRleHQpIDogbmV3IEJ1bmRsZShjb250ZXh0LCBiZXRhKTtcbiAgfVxuXG4gIGJ1bmRsZS5iZXRhID0gZnVuY3Rpb24oYmV0YSkge1xuICAgIHJldHVybiBjdXN0b20oK2JldGEpO1xuICB9O1xuXG4gIHJldHVybiBidW5kbGU7XG59KSgwLjg1KTtcbiIsICJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gWm9vbUV2ZW50KHR5cGUsIHtcbiAgc291cmNlRXZlbnQsXG4gIHRhcmdldCxcbiAgdHJhbnNmb3JtLFxuICBkaXNwYXRjaFxufSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgdHlwZToge3ZhbHVlOiB0eXBlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHNvdXJjZUV2ZW50OiB7dmFsdWU6IHNvdXJjZUV2ZW50LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRhcmdldDoge3ZhbHVlOiB0YXJnZXQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdHJhbnNmb3JtOiB7dmFsdWU6IHRyYW5zZm9ybSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBfOiB7dmFsdWU6IGRpc3BhdGNofVxuICB9KTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgWm9vbUV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQge1RyYW5zZm9ybSwgaWRlbnRpdHl9IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuLy8gZXhjZXB0IGZvciBwaW5jaC10by16b29tLCB3aGljaCBpcyBzZW50IGFzIGEgd2hlZWwrY3RybEtleSBldmVudFxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7XG4gIHZhciBlID0gdGhpcztcbiAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7XG4gICAgaWYgKGUuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgICAgZSA9IGUudmlld0JveC5iYXNlVmFsO1xuICAgICAgcmV0dXJuIFtbZS54LCBlLnldLCBbZS54ICsgZS53aWR0aCwgZS55ICsgZS5oZWlnaHRdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbMCwgMF0sIFtlLndpZHRoLmJhc2VWYWwudmFsdWUsIGUuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0oKSB7XG4gIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFdoZWVsRGVsdGEoZXZlbnQpIHtcbiAgcmV0dXJuIC1ldmVudC5kZWx0YVkgKiAoZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMC4wNSA6IGV2ZW50LmRlbHRhTW9kZSA/IDEgOiAwLjAwMikgKiAoZXZlbnQuY3RybEtleSA/IDEwIDogMSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkge1xuICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSxcbiAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sXG4gICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLFxuICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTtcbiAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoXG4gICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLFxuICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgY29uc3RyYWluID0gZGVmYXVsdENvbnN0cmFpbixcbiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxEZWx0YSxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBzY2FsZUV4dGVudCA9IFswLCBJbmZpbml0eV0sXG4gICAgICB0cmFuc2xhdGVFeHRlbnQgPSBbWy1JbmZpbml0eSwgLUluZmluaXR5XSwgW0luZmluaXR5LCBJbmZpbml0eV1dLFxuICAgICAgZHVyYXRpb24gPSAyNTAsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJ6b29tXCIsIFwiZW5kXCIpLFxuICAgICAgdG91Y2hzdGFydGluZyxcbiAgICAgIHRvdWNoZmlyc3QsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIHRvdWNoRGVsYXkgPSA1MDAsXG4gICAgICB3aGVlbERlbGF5ID0gMTUwLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwLFxuICAgICAgdGFwRGlzdGFuY2UgPSAxMDtcblxuICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSlcbiAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCB3aGVlbGVkKVxuICAgICAgICAub24oXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZWRvd25lZClcbiAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbVwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uO1xuICAgIHNlbGVjdGlvbi5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKTtcbiAgICBpZiAoY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uKSB7XG4gICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAuZXZlbnQoZXZlbnQpXG4gICAgICAgICAgLnN0YXJ0KClcbiAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRyYW5zZm9ybSlcbiAgICAgICAgICAuZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20uc2NhbGVUbyhzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uayxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGswICogazE7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcCxcbiAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIG51bGwsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7XG4gICAgICByZXR1cm4gY29uc3RyYWluKGlkZW50aXR5LnRyYW5zbGF0ZShwMFswXSwgcDBbMV0pLnNjYWxlKHQuaykudHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8gLXguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC14LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8gLXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC15XG4gICAgICApLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHtcbiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7XG4gICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHRyYW5zZm9ybSwgcDAsIHAxKSB7XG4gICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7XG4gICAgcmV0dXJuIHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7XG4gIH1cblxuICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHtcbiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHRyYW5zaXRpb25cbiAgICAgICAgLm9uKFwic3RhcnQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5zdGFydCgpOyB9KVxuICAgICAgICAub24oXCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5lbmQoKTsgfSlcbiAgICAgICAgLnR3ZWVuKFwiem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgICAgICAgZSA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKSxcbiAgICAgICAgICAgICAgcCA9IHBvaW50ID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwb2ludCA9PT0gXCJmdW5jdGlvblwiID8gcG9pbnQuYXBwbHkodGhhdCwgYXJncykgOiBwb2ludCxcbiAgICAgICAgICAgICAgdyA9IE1hdGgubWF4KGVbMV1bMF0gLSBlWzBdWzBdLCBlWzFdWzFdIC0gZVswXVsxXSksXG4gICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSxcbiAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6IHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKGEuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYS5rKSwgYi5pbnZlcnQocCkuY29uY2F0KHcgLyBiLmspKTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvciBvbiBlbmQuXG4gICAgICAgICAgICBlbHNlIHsgdmFyIGwgPSBpKHQpLCBrID0gdyAvIGxbMl07IHQgPSBuZXcgVHJhbnNmb3JtKGssIHBbMF0gLSBsWzBdICogaywgcFsxXSAtIGxbMV0gKiBrKTsgfVxuICAgICAgICAgICAgZy56b29tKG51bGwsIHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VzdHVyZSh0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX196b29taW5nKSB8fCBuZXcgR2VzdHVyZSh0aGF0LCBhcmdzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEdlc3R1cmUodGhhdCwgYXJncykge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5zb3VyY2VFdmVudCA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgdGhpcy50YXBzID0gMDtcbiAgfVxuXG4gIEdlc3R1cmUucHJvdG90eXBlID0ge1xuICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSB0aGlzLnNvdXJjZUV2ZW50ID0gZXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7XG4gICAgICAgIHRoaXMudGhhdC5fX3pvb21pbmcgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdGFydFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgem9vbTogZnVuY3Rpb24oa2V5LCB0cmFuc2Zvcm0pIHtcbiAgICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gXCJtb3VzZVwiKSB0aGlzLm1vdXNlWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLm1vdXNlWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDBbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDFbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKTtcbiAgICAgIHRoaXMudGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07XG4gICAgICB0aGlzLmVtaXQoXCJ6b29tXCIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmc7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IFpvb21FdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IHRoaXMuc291cmNlRXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiB6b29tLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLnRoYXQuX196b29tLFxuICAgICAgICAgIGRpc3BhdGNoOiBsaXN0ZW5lcnNcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBtb3VzZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LlxuICAgIC8vIElmIHRoZXJlIHdlcmUgcmVjZW50IHdoZWVsIGV2ZW50cywgcmVzZXQgdGhlIHdoZWVsIGlkbGUgdGltZW91dC5cbiAgICBpZiAoZy53aGVlbCkge1xuICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0gfHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkge1xuICAgICAgICBnLm1vdXNlWzFdID0gdC5pbnZlcnQoZy5tb3VzZVswXSA9IHApO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29uXHUyMDE5dCB0cmlnZ2VyIGEgdHJhbnNmb3JtIGNoYW5nZSwgaWdub3JlIGl0LlxuICAgIGVsc2UgaWYgKHQuayA9PT0gaykgcmV0dXJuO1xuXG4gICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQgdGhlIHN0YXJ0LlxuICAgIGVsc2Uge1xuICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIHRydWUpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdiA9IHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS56b29tXCIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKFwibW91c2V1cC56b29tXCIsIG1vdXNldXBwZWQsIHRydWUpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksXG4gICAgICAgIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICB4MCA9IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHkwID0gZXZlbnQuY2xpZW50WTtcblxuICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTtcbiAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgZy5zdGFydCgpO1xuXG4gICAgZnVuY3Rpb24gbW91c2Vtb3ZlZChldmVudCkge1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBpZiAoIWcubW92ZWQpIHtcbiAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIHgwLCBkeSA9IGV2ZW50LmNsaWVudFkgLSB5MDtcbiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgICB9XG4gICAgICBnLmV2ZW50KGV2ZW50KVxuICAgICAgIC56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW91c2V1cHBlZChldmVudCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGcuZXZlbnQoZXZlbnQpLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgIHAwID0gcG9pbnRlcihldmVudC5jaGFuZ2VkVG91Y2hlcyA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQsIHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3MpLCB0cmFuc2xhdGVFeHRlbnQpO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwLCBldmVudCk7XG4gICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEsIHAwLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC50b3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gbikuZXZlbnQoZXZlbnQpLFxuICAgICAgICBzdGFydGVkLCBpLCB0LCBwO1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCksIHQuaWRlbnRpZmllcl07XG4gICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHAsIHN0YXJ0ZWQgPSB0cnVlLCBnLnRhcHMgPSAxICsgISF0b3VjaHN0YXJ0aW5nO1xuICAgICAgZWxzZSBpZiAoIWcudG91Y2gxICYmIGcudG91Y2gwWzJdICE9PSBwWzJdKSBnLnRvdWNoMSA9IHAsIGcudGFwcyA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoZmlyc3QgPSBwWzBdLCB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwO1xuICAgIH1cbiAgICB0ID0gZy50aGF0Ll9fem9vbTtcbiAgICBpZiAoZy50b3VjaDEpIHtcbiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLFxuICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sXG4gICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCxcbiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsO1xuICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7XG4gICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdO1xuICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdO1xuICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgZy56b29tKFwidG91Y2hcIiwgY29uc3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV07XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxO1xuICAgIH1cbiAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7XG4gICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7XG4gICAgZWxzZSB7XG4gICAgICBnLmVuZCgpO1xuICAgICAgLy8gSWYgdGhpcyB3YXMgYSBkYmx0YXAsIHJlcm91dGUgdG8gdGhlIChvcHRpb25hbCkgZGJsY2xpY2suem9vbSBoYW5kbGVyLlxuICAgICAgaWYgKGcudGFwcyA9PT0gMikge1xuICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgICAgaWYgKE1hdGguaHlwb3QodG91Y2hmaXJzdFswXSAtIHRbMF0sIHRvdWNoZmlyc3RbMV0gLSB0WzFdKSA8IHRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgdmFyIHAgPSBzZWxlY3QodGhpcykub24oXCJkYmxjbGljay56b29tXCIpO1xuICAgICAgICAgIGlmIChwKSBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7XG4gIH07XG5cbiAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IGZpbHRlcjtcbiAgfTtcblxuICB6b29tLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDtcbiAgfTtcblxuICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlRXh0ZW50WzBdWzBdID0gK19bMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVswXSA9ICtfWzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV0gPSArX1swXVsxXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdID0gK19bMV1bMV0sIHpvb20pIDogW1t0cmFuc2xhdGVFeHRlbnRbMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXV0sIFt0cmFuc2xhdGVFeHRlbnRbMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXV1dO1xuICB9O1xuXG4gIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluO1xuICB9O1xuXG4gIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjtcbiAgfTtcblxuICB6b29tLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgem9vbSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICB6b29tLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICB6b29tLnRhcERpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcERpc3RhbmNlID0gK18sIHpvb20pIDogdGFwRGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IE1vZGFsLCBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IFZpc0NvbXAgZnJvbSBcIi4uL0NvbXBvbmVudHMvVmlzQ29tcC5zdmVsdGVcIjtcclxuaW1wb3J0IHR5cGUgeyBBZGpMaXN0SXRlbSwgZDNHcmFwaCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0SW5OZWlnaGJvdXJzLFxyXG4gIGdldE91dE5laWdoYm91cnMsXHJcbiAgZ2V0U2lua3MsXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBncmFwaGxpYlRvRDMoZzogR3JhcGgpOiBkM0dyYXBoIHtcclxuICBjb25zdCBkM0dyYXBoOiBkM0dyYXBoID0geyBub2RlczogW10sIGxpbmtzOiBbXSB9O1xyXG4gIGNvbnN0IG5vZGVJRHMgPSB7fTtcclxuXHJcbiAgZy5ub2RlcygpLmZvckVhY2goKG5vZGUsIGkpID0+IHtcclxuICAgIGQzR3JhcGgubm9kZXMucHVzaCh7IGlkOiBpLCBuYW1lOiBub2RlIH0pO1xyXG4gICAgbm9kZUlEc1tub2RlXSA9IGk7XHJcbiAgfSk7XHJcbiAgZy5mb3JFYWNoRWRnZSgoaywgYSwgcywgdCkgPT4ge1xyXG4gICAgZDNHcmFwaC5saW5rcy5wdXNoKHtcclxuICAgICAgc291cmNlOiBub2RlSURzW3NdLFxyXG4gICAgICB0YXJnZXQ6IG5vZGVJRHNbdF0sXHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIGQzR3JhcGg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBiZnNGcm9tQWxsU2lua3MoZzogR3JhcGgpIHtcclxuICBjb25zdCBxdWV1ZTogc3RyaW5nW10gPSBnZXRTaW5rcyhnKTtcclxuICBjb25zdCBhZGpMaXN0OiBBZGpMaXN0SXRlbVtdID0gW107XHJcblxyXG4gIGxldCBpID0gMDtcclxuICB3aGlsZSAocXVldWUubGVuZ3RoICYmIGkgPCAxMDAwKSB7XHJcbiAgICBpKys7XHJcblxyXG4gICAgY29uc3QgY3Vyck5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgY29uc3QgbmV3Tm9kZXMgPSBnZXRJbk5laWdoYm91cnMoZywgY3Vyck5vZGUpO1xyXG5cclxuICAgIGlmIChuZXdOb2Rlcy5sZW5ndGgpIHtcclxuICAgICAgbmV3Tm9kZXMuZm9yRWFjaCgocHJlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV4dDogQWRqTGlzdEl0ZW0gPSB7XHJcbiAgICAgICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgICAgIHBhcmVudElkOiBwcmUsXHJcbiAgICAgICAgICBkZXB0aDogaSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHF1ZXVlLnB1c2gocHJlKTtcclxuICAgICAgICBhZGpMaXN0LnB1c2gobmV4dCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYWRqTGlzdC5wdXNoKHtcclxuICAgICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgICBwYXJlbnRJZDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGRlcHRoOiBpLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IG1heERlcHRoID0gYWRqTGlzdC5zb3J0KChhLCBiKSA9PiBhLmRlcHRoIC0gYi5kZXB0aCkubGFzdCgpLmRlcHRoO1xyXG4gIGFkakxpc3QuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaGVpZ2h0ID0gbWF4RGVwdGggLSBpdGVtLmRlcHRoKSk7XHJcbiAgcmV0dXJuIGFkakxpc3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZnNBZGpMaXN0KGc6IEdyYXBoLCBzdGFydE5vZGU6IHN0cmluZyk6IEFkakxpc3RJdGVtW10ge1xyXG4gIGNvbnN0IHF1ZXVlOiBzdHJpbmdbXSA9IFtzdGFydE5vZGVdO1xyXG4gIGNvbnN0IGFkakxpc3Q6IEFkakxpc3RJdGVtW10gPSBbXTtcclxuXHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuXHJcbiAgICBjb25zdCBjdXJyTm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XHJcbiAgICBjb25zdCBuZXdOb2RlcyA9IGdldE91dE5laWdoYm91cnMoZywgY3Vyck5vZGUpO1xyXG5cclxuICAgIGlmIChuZXdOb2Rlcy5sZW5ndGgpIHtcclxuICAgICAgbmV3Tm9kZXMuZm9yRWFjaCgoc3VjYykgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5leHQ6IEFkakxpc3RJdGVtID0ge1xyXG4gICAgICAgICAgbmFtZTogY3Vyck5vZGUsXHJcbiAgICAgICAgICBwYXJlbnRJZDogc3VjYyxcclxuICAgICAgICAgIGRlcHRoOiBpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcXVldWUucHVzaChzdWNjKTtcclxuICAgICAgICBhZGpMaXN0LnB1c2gobmV4dCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYWRqTGlzdC5wdXNoKHtcclxuICAgICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgICBwYXJlbnRJZDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGRlcHRoOiBpLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgY29uc3QgbWF4RGVwdGggPSBhZGpMaXN0LnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKS5sYXN0KCkuZGVwdGg7XHJcbiAgYWRqTGlzdC5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5oZWlnaHQgPSBtYXhEZXB0aCAtIGl0ZW0uZGVwdGgpKTtcclxuXHJcbiAgcmV0dXJuIGFkakxpc3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBiZnNBZGpMaXN0KGc6IEdyYXBoLCBzdGFydE5vZGU6IHN0cmluZyk6IEFkakxpc3RJdGVtW10ge1xyXG4gIGNvbnN0IHF1ZXVlOiBzdHJpbmdbXSA9IFtzdGFydE5vZGVdO1xyXG4gIGNvbnN0IGFkakxpc3Q6IEFkakxpc3RJdGVtW10gPSBbXTtcclxuXHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuXHJcbiAgICBjb25zdCBjdXJyTm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XHJcbiAgICBjb25zdCBuZWlnaGJvdXJzID0ge1xyXG4gICAgICBzdWNjczogZ2V0T3V0TmVpZ2hib3VycyhnLCBjdXJyTm9kZSksXHJcbiAgICAgIHByZXM6IGdldEluTmVpZ2hib3VycyhnLCBjdXJyTm9kZSksXHJcbiAgICB9O1xyXG4gICAgY29uc29sZS5sb2coeyBjdXJyTm9kZSwgbmVpZ2hib3VycyB9KTtcclxuXHJcbiAgICBjb25zdCBuZXh0OiBBZGpMaXN0SXRlbSA9IHtcclxuICAgICAgbmFtZTogY3Vyck5vZGUsXHJcbiAgICAgIHByZXM6IHVuZGVmaW5lZCxcclxuICAgICAgc3VjY3M6IHVuZGVmaW5lZCxcclxuICAgICAgcGFyZW50SWQ6IGksXHJcbiAgICAgIGRlcHRoOiBpLFxyXG4gICAgfTtcclxuICAgIGlmIChuZWlnaGJvdXJzLnN1Y2NzLmxlbmd0aCkge1xyXG4gICAgICBuZXh0LnN1Y2NzID0gbmVpZ2hib3Vycy5zdWNjcztcclxuICAgICAgcXVldWUucHVzaCguLi5uZWlnaGJvdXJzLnN1Y2NzKTtcclxuICAgIH1cclxuICAgIGlmIChuZWlnaGJvdXJzLnByZXMubGVuZ3RoKSB7XHJcbiAgICAgIG5leHQucHJlcyA9IG5laWdoYm91cnMucHJlcztcclxuICAgIH1cclxuICAgIGFkakxpc3QucHVzaChuZXh0KTtcclxuICB9XHJcbiAgY29uc3QgbWF4RGVwdGggPSBhZGpMaXN0LnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKS5sYXN0KCkuZGVwdGg7XHJcbiAgYWRqTGlzdC5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5oZWlnaHQgPSBtYXhEZXB0aCAtIGl0ZW0uZGVwdGgpKTtcclxuXHJcbiAgcmV0dXJuIGFkakxpc3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZnNGbGF0QWRqTGlzdChnOiBHcmFwaCwgc3RhcnROb2RlOiBzdHJpbmcpIHtcclxuICBjb25zdCBub2RlcyA9IGcubm9kZXMoKTtcclxuICBjb25zdCBub2RlQ291bnQgPSBub2Rlcy5sZW5ndGg7XHJcbiAgY29uc3QgdmlzaXRzID0ge307XHJcbiAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xyXG4gICAgdmlzaXRzW25vZGVdID0gbm9kZUNvdW50ICogaTtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgcXVldWU6IHN0cmluZ1tdID0gW3N0YXJ0Tm9kZV07XHJcbiAgY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IFtdO1xyXG5cclxuICBsZXQgZGVwdGggPSAxO1xyXG4gIGxldCBpID0gMDtcclxuICB3aGlsZSAocXVldWUubGVuZ3RoICYmIGkgPCAxMDAwKSB7XHJcbiAgICBpKys7XHJcblxyXG4gICAgY29uc3QgY3Vyck5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgY29uc3QgbmV4dCA9IGdldE91dE5laWdoYm91cnMoZywgY3Vyck5vZGUpO1xyXG5cclxuICAgIGlmIChuZXh0Lmxlbmd0aCkge1xyXG4gICAgICBxdWV1ZS51bnNoaWZ0KC4uLm5leHQpO1xyXG4gICAgICBuZXh0LmZvckVhY2goKHN1Y2MpID0+IHtcclxuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IG5vZGVDb3VudCAqIG5vZGVzLmluZGV4T2Yoc3VjYyk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgIWFkakxpc3Quc29tZShcclxuICAgICAgICAgICAgKGFkakl0ZW0pID0+XHJcbiAgICAgICAgICAgICAgYWRqSXRlbS5uYW1lID09PSBjdXJyTm9kZSAmJiBhZGpJdGVtLnBhcmVudElkID09PSBwYXJlbnRJZFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgYWRqTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgaWQ6IHZpc2l0c1tjdXJyTm9kZV0gYXMgbnVtYmVyLFxyXG4gICAgICAgICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgICAgICAgcGFyZW50SWQsXHJcbiAgICAgICAgICAgIGRlcHRoLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB2aXNpdHNbY3Vyck5vZGVdKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgZGVwdGgrKztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFkakxpc3QucHVzaCh7XHJcbiAgICAgICAgaWQ6IHZpc2l0c1tjdXJyTm9kZV0gYXMgbnVtYmVyLFxyXG4gICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgIHBhcmVudElkOiA5OTk5OTk5OTksXHJcbiAgICAgICAgZGVwdGgsXHJcbiAgICAgIH0pO1xyXG4gICAgICBkZXB0aCA9IDE7XHJcbiAgICAgIHZpc2l0c1tjdXJyTm9kZV0rKztcclxuICAgIH1cclxuICB9XHJcbiAgYWRqTGlzdC5wdXNoKHtcclxuICAgIGlkOiA5OTk5OTk5OTksXHJcbiAgICBuYW1lOiBcIkNPTlRBSU5FUlwiLFxyXG4gICAgcGFyZW50SWQ6IHVuZGVmaW5lZCxcclxuICAgIGRlcHRoOiAwLFxyXG4gIH0pO1xyXG5cclxuICBjb25zdCBtYXhEZXB0aCA9IGFkakxpc3Quc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpLmxhc3QoKS5kZXB0aDtcclxuICBhZGpMaXN0LmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmhlaWdodCA9IG1heERlcHRoIC0gaXRlbS5kZXB0aCkpO1xyXG5cclxuICBjb25zb2xlLmxvZyh7IHZpc2l0cyB9KTtcclxuICByZXR1cm4gYWRqTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHN0cmF0aWZ5ID0gZDNcclxuICAuc3RyYXRpZnkoKVxyXG4gIC5pZChmdW5jdGlvbiAoZDogQWRqTGlzdEl0ZW0pIHtcclxuICAgIGNvbnNvbGUubG9nKHsgZCB9KTtcclxuICAgIHJldHVybiBkLm5hbWU7XHJcbiAgfSlcclxuICAucGFyZW50SWQoZnVuY3Rpb24gKGQ6IEFkakxpc3RJdGVtKSB7XHJcbiAgICByZXR1cm4gZC5wYXJlbnRJZDtcclxuICB9KTtcclxuZXhwb3J0IGNsYXNzIFZpc01vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgbW9kYWw6IFZpc01vZGFsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB0aGlzLm1vZGFsID0gdGhpcztcclxuICB9XHJcblxyXG4gIG9uT3BlbigpIHtcclxuICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgIFwiQWxvdCBvZiB0aGVzZSBmZWF0dXJlcyBtYXkgbm90IHdvcmssIGl0IGlzIHN0aWxsIHZlcnkgZXhwZXJpbWVudGFsLlwiXHJcbiAgICApO1xyXG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcbiAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuXHJcbiAgICBuZXcgVmlzQ29tcCh7XHJcbiAgICAgIHRhcmdldDogY29udGVudEVsLFxyXG4gICAgICBwcm9wczoge1xyXG4gICAgICAgIG1vZGFsOiB0aGlzLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsb3NlKCkge1xyXG4gICAgdGhpcy5jb250ZW50RWwuZW1wdHkoKTtcclxuICB9XHJcbn1cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgd2FybiB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG4gIGltcG9ydCB7IEFMTFVOTElOS0VELCBSRUFsQ0xPU0VELCBSRUxBVElPTlMsIFZJU1RZUEVTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG4gIGltcG9ydCB0eXBlIHsgVmlzR3JhcGhzLCBWaXNUeXBlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQge1xyXG4gICAgY2xvc2VJbXBsaWVkTGlua3MsXHJcbiAgICBnZXRTdWJJbkRpcnMsXHJcbiAgICByZW1vdmVVbmxpbmtlZE5vZGVzLFxyXG4gIH0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuICBpbXBvcnQgeyBhcmNEaWFncmFtIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL0FyY0RpYWdyYW1cIjtcclxuICBpbXBvcnQgeyBjaXJjbGVQYWNraW5nIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL0NpcmNsZVBhY2tpbmdcIjtcclxuICBpbXBvcnQgeyBlZGdlQnVuZGxpbmcgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvRWRnZUJ1bmRsaW5nXCI7XHJcbiAgaW1wb3J0IHsgZm9yY2VEaXJlY3RlZEcgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvRm9yY2VEaXJlY3RlZEdcIjtcclxuICBpbXBvcnQgeyBpY2ljbGUgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvSWNpY2xlXCI7XHJcbiAgaW1wb3J0IHsgcmFkaWFsVHJlZSB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9SYWRpYWxUcmVlXCI7XHJcbiAgaW1wb3J0IHsgc3VuYnVyc3QgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvU3VuYnVyc3RcIjtcclxuICBpbXBvcnQgeyB0aWR5VHJlZSB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9UaWR5VHJlZVwiO1xyXG4gIGltcG9ydCB7IHRyZWVNYXAgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvVHJlZU1hcFwiO1xyXG4gIGltcG9ydCB0eXBlIHsgVmlzTW9kYWwgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvVmlzTW9kYWxcIjtcclxuICBpbXBvcnQgeyBnZXRDdXJyRmlsZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgbW9kYWw6IFZpc01vZGFsO1xyXG5cclxuICBjb25zdCB7IHBsdWdpbiB9ID0gbW9kYWw7XHJcbiAgY29uc3QgeyBtYWluRywgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHZpc0dyYXBoLCB2aXNSZWxhdGlvbiwgdmlzQ2xvc2VkLCB2aXNBbGwgfSA9IHNldHRpbmdzO1xyXG5cclxuICBjb25zdCBjdXJyRmlsZSA9IGdldEN1cnJGaWxlKCk7XHJcblxyXG4gIGNvbnN0IHNlbGVjdG9ycyA9IFtcclxuICAgIHtcclxuICAgICAgdGV4dDogXCJUeXBlXCIsXHJcbiAgICAgIG9wdGlvbnM6IFZJU1RZUEVTLFxyXG4gICAgICB2YWw6IHZpc0dyYXBoLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDogXCJSZWxhdGlvblwiLFxyXG4gICAgICBvcHRpb25zOiBSRUxBVElPTlMsXHJcbiAgICAgIHZhbDogdmlzUmVsYXRpb24sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBcIkNsb3NlIEltcGxpZWRcIixcclxuICAgICAgb3B0aW9uczogUkVBbENMT1NFRCxcclxuICAgICAgdmFsOiB2aXNDbG9zZWQsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBcIk5vIFVubGlua2VkXCIsXHJcbiAgICAgIG9wdGlvbnM6IEFMTFVOTElOS0VELFxyXG4gICAgICB2YWw6IHZpc0FsbCxcclxuICAgIH0sXHJcbiAgXTtcclxuXHJcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gW1xyXG4gICAgTWF0aC5yb3VuZCh3aW5kb3cuaW5uZXJXaWR0aCAvIDEuMyksXHJcbiAgICBNYXRoLnJvdW5kKHdpbmRvdy5pbm5lckhlaWdodCAvIDEuMyksXHJcbiAgXTtcclxuXHJcbiAgY29uc3QgW3VwLCBzYW1lLCBkb3duXSA9IFtcclxuICAgIGdldFN1YkluRGlycyhtYWluRywgXCJ1cFwiKSxcclxuICAgIGdldFN1YkluRGlycyhtYWluRywgXCJzYW1lXCIpLFxyXG4gICAgZ2V0U3ViSW5EaXJzKG1haW5HLCBcImRvd25cIiksXHJcbiAgXTtcclxuXHJcbiAgY29uc3QgW2Nsb3NlZFBhcmVudE5vU2luZ2xlLCBjbG9zZWRTaWJsaW5nTm9TaW5nbGUsIGNsb3NlZENoaWxkTm9TaW5nbGVdID0gW1xyXG4gICAgY2xvc2VJbXBsaWVkTGlua3ModXAsIGRvd24pLFxyXG4gICAgY2xvc2VJbXBsaWVkTGlua3Moc2FtZSwgc2FtZSksXHJcbiAgICBjbG9zZUltcGxpZWRMaW5rcyhkb3duLCB1cCksXHJcbiAgXTtcclxuXHJcbiAgY29uc3QgZ3JhcGhzOiBWaXNHcmFwaHMgPSB7XHJcbiAgICBQYXJlbnQ6IHtcclxuICAgICAgUmVhbDoge1xyXG4gICAgICAgIEFsbDogdXAsXHJcbiAgICAgICAgXCJObyBVbmxpbmtlZFwiOiByZW1vdmVVbmxpbmtlZE5vZGVzKHVwKSxcclxuICAgICAgfSxcclxuICAgICAgQ2xvc2VkOiB7XHJcbiAgICAgICAgQWxsOiBjbG9zZWRQYXJlbnROb1NpbmdsZSxcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXMoY2xvc2VkUGFyZW50Tm9TaW5nbGUpLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIFNpYmxpbmc6IHtcclxuICAgICAgUmVhbDoge1xyXG4gICAgICAgIEFsbDogc2FtZSxcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXMoc2FtZSksXHJcbiAgICAgIH0sXHJcbiAgICAgIENsb3NlZDoge1xyXG4gICAgICAgIEFsbDogY2xvc2VkU2libGluZ05vU2luZ2xlLFxyXG4gICAgICAgIFwiTm8gVW5saW5rZWRcIjogcmVtb3ZlVW5saW5rZWROb2RlcyhjbG9zZWRTaWJsaW5nTm9TaW5nbGUpLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIENoaWxkOiB7XHJcbiAgICAgIFJlYWw6IHtcclxuICAgICAgICBBbGw6IGRvd24sXHJcbiAgICAgICAgXCJObyBVbmxpbmtlZFwiOiByZW1vdmVVbmxpbmtlZE5vZGVzKGRvd24pLFxyXG4gICAgICB9LFxyXG4gICAgICBDbG9zZWQ6IHtcclxuICAgICAgICBBbGw6IGNsb3NlZENoaWxkTm9TaW5nbGUsXHJcbiAgICAgICAgXCJObyBVbmxpbmtlZFwiOiByZW1vdmVVbmxpbmtlZE5vZGVzKGNsb3NlZENoaWxkTm9TaW5nbGUpLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICAkOiBhcmdBcnIgPSBbXHJcbiAgICBncmFwaHNbc2VsZWN0b3JzWzFdLnZhbF1bc2VsZWN0b3JzWzJdLnZhbF1bc2VsZWN0b3JzWzNdLnZhbF0sXHJcbiAgICBhcHAsXHJcbiAgICBjdXJyRmlsZSxcclxuICAgIG1vZGFsLFxyXG4gICAgd2lkdGgsXHJcbiAgICBoZWlnaHQsXHJcbiAgXTtcclxuXHJcbiAgY29uc3QgdHlwZXM6IHtcclxuICAgIFt2aXMgaW4gVmlzVHlwZV06ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcclxuICB9ID0ge1xyXG4gICAgXCJGb3JjZSBEaXJlY3RlZCBHcmFwaFwiOiBmb3JjZURpcmVjdGVkRyxcclxuICAgIFwiVGlkeSBUcmVlXCI6IHRpZHlUcmVlLFxyXG4gICAgXCJDaXJjbGUgUGFja2luZ1wiOiBjaXJjbGVQYWNraW5nLFxyXG4gICAgXCJFZGdlIEJ1bmRsaW5nXCI6IGVkZ2VCdW5kbGluZyxcclxuICAgIFwiQXJjIERpYWdyYW1cIjogYXJjRGlhZ3JhbSxcclxuICAgIFN1bmJ1cnN0OiBzdW5idXJzdCxcclxuICAgIFwiVHJlZSBNYXBcIjogdHJlZU1hcCxcclxuICAgIEljaWNsZTogaWNpY2xlLFxyXG4gICAgXCJSYWRpYWwgVHJlZVwiOiByYWRpYWxUcmVlLFxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIGRyYXcodHlwZTogVmlzVHlwZSkge1xyXG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmQzLWdyYXBoXCIpKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZDMtZ3JhcGhcIik/LmVtcHR5KCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHR5cGVzW3R5cGVdKC4uLmFyZ0Fycik7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIHdhcm4oZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5kMy1ncmFwaFwiKS5lbXB0eSgpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHR5cGVzW3R5cGVdKC4uLmFyZ0Fycik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgd2FybihlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICQ6IGRyYXcoc2VsZWN0b3JzWzBdLnZhbCBhcyBWaXNUeXBlKTtcclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2PlxyXG4gIHsjZWFjaCBzZWxlY3RvcnMgYXMgeyB0ZXh0LCBvcHRpb25zLCB2YWwgfX1cclxuICAgIDxzcGFuPlxyXG4gICAgICB7dGV4dH06XHJcbiAgICAgIDxzZWxlY3QgYmluZDp2YWx1ZT17dmFsfT5cclxuICAgICAgICB7I2VhY2ggb3B0aW9ucyBhcyBvcH1cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9e29wfT57b3B9PC9vcHRpb24+XHJcbiAgICAgICAgey9lYWNofVxyXG4gICAgICA8L3NlbGVjdD5cclxuICAgIDwvc3Bhbj5cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImQzLWdyYXBoXCIgLz5cclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgZDNOb2RlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZ3JhcGhsaWJUb0QzLCBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcbmltcG9ydCB7IG9wZW5PclN3aXRjaCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcblxyXG5leHBvcnQgY29uc3QgYXJjRGlhZ3JhbSA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IGRhdGEgPSBncmFwaGxpYlRvRDMoZ3JhcGgpO1xyXG5cclxuICBjb25zdCBtYXJnaW4gPSB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiAyMCwgbGVmdDogMTUwIH07XHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpO1xyXG5cclxuICBjb25zdCBub2RlcyA9IGRhdGEubm9kZXMubWFwKCh7IGlkLCBuYW1lIH0pID0+ICh7XHJcbiAgICBpZCxcclxuICAgIG5hbWUsXHJcbiAgICBzb3VyY2VMaW5rczogW10sXHJcbiAgICB0YXJnZXRMaW5rczogW10sXHJcbiAgfSkpO1xyXG5cclxuICBjb25zdCBub2RlQnlJZCA9IG5ldyBNYXAobm9kZXMubWFwKChkKSA9PiBbZC5pZCwgZF0pKTtcclxuXHJcbiAgY29uc3QgbGlua3MgPSBkYXRhLmxpbmtzLm1hcCgoeyBzb3VyY2UsIHRhcmdldCB9KSA9PiAoe1xyXG4gICAgc291cmNlOiBub2RlQnlJZC5nZXQoc291cmNlIGFzIG51bWJlciksXHJcbiAgICB0YXJnZXQ6IG5vZGVCeUlkLmdldCh0YXJnZXQgYXMgbnVtYmVyKSxcclxuICB9KSk7XHJcblxyXG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xyXG4gICAgY29uc3QgeyBzb3VyY2UsIHRhcmdldCB9ID0gbGluaztcclxuICAgIHNvdXJjZS5zb3VyY2VMaW5rcy5wdXNoKGxpbmspO1xyXG4gICAgdGFyZ2V0LnRhcmdldExpbmtzLnB1c2gobGluayk7XHJcbiAgfVxyXG5cclxuICBzdmcuYXBwZW5kKFwic3R5bGVcIikudGV4dChgXHJcblxyXG5wYXRoIHtcclxuICBzdHJva2U6ICM4MDgwODA7XHJcbiAgb3BhY2l0eTogMC44O1xyXG59XHJcblxyXG50ZXh0IHtcclxuICBzdHJva2U6IHZhcigtLXRleHQtYSk7XHJcbiAgb3BhY2l0eTogMC44O1xyXG59XHJcblxyXG5cclxuLmhvdmVyIGcucHJpbWFyeSB0ZXh0IHtcclxuICBmaWxsOiBibGFjaztcclxufVxyXG5cclxuLmhvdmVyIGcuc2Vjb25kYXJ5IHRleHQge1xyXG4gIGZpbGw6ICMzMzM7XHJcbn1cclxuXHJcbi5ob3ZlciAuc2Vjb25kYXJ5IHtcclxuICAgIGNvbG9yOiByZWQ7XHJcbn1cclxuXHJcbi5ob3ZlciBwYXRoLnByaW1hcnkge1xyXG4gIHN0cm9rZTogIzMzMztcclxuICBzdHJva2Utb3BhY2l0eTogMTtcclxufVxyXG5cclxuLmhvdmVyIHJlY3Qge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuYCk7XHJcblxyXG4gIGNvbnN0IHkgPSBkMy5zY2FsZVBvaW50KG5vZGVzLm1hcCgoZCkgPT4gZC5uYW1lKS5zb3J0KGQzLmFzY2VuZGluZyksIFtcclxuICAgIG1hcmdpbi50b3AsXHJcbiAgICBoZWlnaHQgLSBtYXJnaW4uYm90dG9tLFxyXG4gIF0pO1xyXG5cclxuICBjb25zdCBsYWJlbCA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwiZm9udC1mYW1pbHlcIiwgXCJzYW5zLXNlcmlmXCIpXHJcbiAgICAuYXR0cihcImZvbnQtc2l6ZVwiLCAxMClcclxuICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJlbmRcIilcclxuICAgIC5zZWxlY3RBbGwoXCJnXCIpXHJcbiAgICAuZGF0YShub2RlcylcclxuICAgIC5qb2luKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGQpID0+IGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdH0sJHsoZC55ID0geShkLm5hbWUpKX0pYClcclxuICAgIC5jYWxsKChnKSA9PlxyXG4gICAgICBnXHJcbiAgICAgICAgLmFwcGVuZChcInRleHRcIilcclxuICAgICAgICAuYXR0cihcInhcIiwgLTYpXHJcbiAgICAgICAgLmF0dHIoXCJkeVwiLCBcIjAuMzVlbVwiKVxyXG4gICAgICAgIC8vIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4gZDMubGFiKGNvbG9yKGQuZ3JvdXApKS5kYXJrZXIoMikpXHJcbiAgICAgICAgLnRleHQoKGQpID0+IGQubmFtZSlcclxuICAgIClcclxuICAgIC5jYWxsKFxyXG4gICAgICAoZykgPT4gZy5hcHBlbmQoXCJjaXJjbGVcIikuYXR0cihcInJcIiwgMylcclxuICAgICAgLy8gLmF0dHIoXCJmaWxsXCIsIChkKSA9PiBjb2xvcihkLmdyb3VwKSlcclxuICAgICk7XHJcblxyXG4gIGNvbnN0IHBhdGggPSBzdmdcclxuICAgIC5pbnNlcnQoXCJnXCIsIFwiKlwiKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utb3BhY2l0eVwiLCAwLjYpXHJcbiAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAxLjUpXHJcbiAgICAuc2VsZWN0QWxsKFwicGF0aFwiKVxyXG4gICAgLmRhdGEobGlua3MpXHJcbiAgICAuam9pbihcInBhdGhcIilcclxuICAgIC8vIC5hdHRyKFwic3Ryb2tlXCIsIChkKSA9PlxyXG4gICAgLy8gICBkLnNvdXJjZS5ncm91cCA9PT0gZC50YXJnZXQuZ3JvdXAgPyBjb2xvcihkLnNvdXJjZS5ncm91cCkgOiBcIiNhYWFcIlxyXG4gICAgLy8gKVxyXG4gICAgLmF0dHIoXCJkXCIsIGFyYyk7XHJcblxyXG4gIGNvbnN0IHN0ZXAgPSAxMDQ7XHJcblxyXG4gIGNvbnN0IG5vZGVDbGljayA9IChldmVudDogTW91c2VFdmVudCwgZGVzdDogc3RyaW5nKSA9PiB7XHJcbiAgICBvcGVuT3JTd2l0Y2goZGVzdCwgZXZlbnQpO1xyXG4gICAgbW9kYWwuY2xvc2UoKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBvdmVybGF5ID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKVxyXG4gICAgLnNlbGVjdEFsbChcInJlY3RcIilcclxuICAgIC5kYXRhKG5vZGVzKVxyXG4gICAgLmpvaW4oXCJyZWN0XCIpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIG1hcmdpbi5sZWZ0ICsgNDApXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBzdGVwKVxyXG4gICAgLmF0dHIoXCJ5XCIsIChkKSA9PiB5KGQubmFtZSkgLSBzdGVwIC8gMilcclxuICAgIC5vbihcIm1vdXNlb3ZlclwiLCAoZCkgPT4ge1xyXG4gICAgICBzdmcuY2xhc3NlZChcImhvdmVyXCIsIHRydWUpO1xyXG4gICAgICBsYWJlbC5jbGFzc2VkKFwicHJpbWFyeVwiLCAobikgPT4gbiA9PT0gZCk7XHJcbiAgICAgIGxhYmVsLmNsYXNzZWQoXHJcbiAgICAgICAgXCJzZWNvbmRhcnlcIixcclxuICAgICAgICAobikgPT5cclxuICAgICAgICAgIG4uc291cmNlTGlua3Muc29tZSgobCkgPT4gbC50YXJnZXQgPT09IGQpIHx8XHJcbiAgICAgICAgICBuLnRhcmdldExpbmtzLnNvbWUoKGwpID0+IGwuc291cmNlID09PSBkKVxyXG4gICAgICApO1xyXG4gICAgICBwYXRoXHJcbiAgICAgICAgLmNsYXNzZWQoXCJwcmltYXJ5XCIsIChsKSA9PiBsLnNvdXJjZSA9PT0gZCB8fCBsLnRhcmdldCA9PT0gZClcclxuICAgICAgICAuZmlsdGVyKFwiLnByaW1hcnlcIilcclxuICAgICAgICAucmFpc2UoKTtcclxuICAgIH0pXHJcbiAgICAub24oXCJtb3VzZW91dFwiLCAoZCkgPT4ge1xyXG4gICAgICBzdmcuY2xhc3NlZChcImhvdmVyXCIsIGZhbHNlKTtcclxuICAgICAgbGFiZWwuY2xhc3NlZChcInByaW1hcnlcIiwgZmFsc2UpO1xyXG4gICAgICBsYWJlbC5jbGFzc2VkKFwic2Vjb25kYXJ5XCIsIGZhbHNlKTtcclxuICAgICAgcGF0aC5jbGFzc2VkKFwicHJpbWFyeVwiLCBmYWxzZSkub3JkZXIoKTtcclxuICAgIH0pXHJcbiAgICAub24oXCJjbGlja1wiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGQzTm9kZSkgPT4ge1xyXG4gICAgICBub2RlQ2xpY2soZXZlbnQsIGQubmFtZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgLy8gICBmdW5jdGlvbiB1cGRhdGUoKSB7XHJcbiAgLy8gICAgIHkuZG9tYWluKG5vZGVzLnNvcnQodmlld29mIG9yZGVyLnZhbHVlKS5tYXAoZCA9PiBkLmlkKSk7XHJcblxyXG4gIC8vICAgICBjb25zdCB0ID0gc3ZnLnRyYW5zaXRpb24oKVxyXG4gIC8vICAgICAgICAgLmR1cmF0aW9uKDc1MCk7XHJcblxyXG4gIC8vICAgICBsYWJlbC50cmFuc2l0aW9uKHQpXHJcbiAgLy8gICAgICAgICAuZGVsYXkoKGQsIGkpID0+IGkgKiAyMClcclxuICAvLyAgICAgICAgIC5hdHRyVHdlZW4oXCJ0cmFuc2Zvcm1cIiwgZCA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGkgPSBkMy5pbnRlcnBvbGF0ZU51bWJlcihkLnksIHkoZC5pZCkpO1xyXG4gIC8vICAgICAgICAgICByZXR1cm4gdCA9PiBgdHJhbnNsYXRlKCR7bWFyZ2luLmxlZnR9LCR7ZC55ID0gaSh0KX0pYDtcclxuICAvLyAgICAgICAgIH0pO1xyXG5cclxuICAvLyAgICAgcGF0aC50cmFuc2l0aW9uKHQpXHJcbiAgLy8gICAgICAgICAuZHVyYXRpb24oNzUwICsgbm9kZXMubGVuZ3RoICogMjApXHJcbiAgLy8gICAgICAgICAuYXR0clR3ZWVuKFwiZFwiLCBkID0+ICgpID0+IGFyYyhkKSk7XHJcblxyXG4gIC8vICAgICBvdmVybGF5LnRyYW5zaXRpb24odClcclxuICAvLyAgICAgICAgIC5kZWxheSgoZCwgaSkgPT4gaSAqIDIwKVxyXG4gIC8vICAgICAgICAgLmF0dHIoXCJ5XCIsIGQgPT4geShkLmlkKSAtIHN0ZXAgLyAyKTtcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICB2aWV3b2Ygb3JkZXIuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHVwZGF0ZSk7XHJcbiAgLy8gICBpbnZhbGlkYXRpb24udGhlbigoKSA9PiB2aWV3b2Ygb3JkZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHVwZGF0ZSkpO1xyXG5cclxuICBmdW5jdGlvbiBhcmMoZDogeyBzb3VyY2U6IHsgeTogbnVtYmVyIH07IHRhcmdldDogeyB5OiBudW1iZXIgfSB9KSB7XHJcbiAgICBjb25zdCB5MSA9IGQuc291cmNlLnk7XHJcbiAgICBjb25zdCB5MiA9IGQudGFyZ2V0Lnk7XHJcbiAgICBjb25zdCByID0gTWF0aC5hYnMoeTIgLSB5MSkgLyAyO1xyXG4gICAgcmV0dXJuIGBNJHttYXJnaW4ubGVmdH0sJHt5MX1BJHtyfSwke3J9IDAsMCwke3kxIDwgeTIgPyAxIDogMH0gJHttYXJnaW4ubGVmdFxyXG4gICAgICB9LCR7eTJ9YDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHpvb21lZCh7IHRyYW5zZm9ybSB9KSB7XHJcbiAgICBzdmcuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gIH1cclxuICBzdmcuY2FsbChcclxuICAgIGQzXHJcbiAgICAgIC56b29tKClcclxuICAgICAgLmV4dGVudChbXHJcbiAgICAgICAgWzAsIDBdLFxyXG4gICAgICAgIFt3aWR0aCwgaGVpZ2h0XSxcclxuICAgICAgXSlcclxuICAgICAgLnNjYWxlRXh0ZW50KFswLjUsIDhdKVxyXG4gICAgICAub24oXCJ6b29tXCIsIHpvb21lZClcclxuICApO1xyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBBZGpMaXN0SXRlbSwgZDNMaW5rLCBkM05vZGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBiZnNBZGpMaXN0LCBkZnNGbGF0QWRqTGlzdCwgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5pbXBvcnQgeyBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgeyBnZXRDdXJyRmlsZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgY2lyY2xlUGFja2luZyA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IGZsYXRBZGogPSBkZnNGbGF0QWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgZmxhdEFkaiB9KTtcclxuXHJcbiAgY29uc3QgaGllcmFyY2h5ID0gZDMuc3RyYXRpZnkoKShmbGF0QWRqKTtcclxuICBjb25zb2xlLmxvZyh7IGhpZXJhcmNoeSB9KTtcclxuXHJcbiAgY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IGJmc0Fkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGFkakxpc3QgfSk7XHJcblxyXG4gIGNvbnN0IG5vRG91YmxlcyA9IFsuLi5hZGpMaXN0XTtcclxuICBub0RvdWJsZXMuZm9yRWFjaCgoYSwgaSkgPT4ge1xyXG4gICAgaWYgKG5vRG91Ymxlcy5zb21lKChiLCBqKSA9PiBpICE9PSBqICYmIGEubmFtZSA9PT0gYi5uYW1lKSkge1xyXG4gICAgICBjb25zdCBpbmRleCA9IG5vRG91Ymxlcy5maW5kSW5kZXgoKGIsIGopID0+IGkgIT09IGogJiYgYS5uYW1lID09PSBiLm5hbWUpO1xyXG4gICAgICBub0RvdWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgLy8gY29uc3Qgbm9Eb3VibGVzID0gYWRqTGlzdC5maWx0ZXIoKGEpID0+IHtcclxuICAvLyAgICFhZGpMaXN0LnNvbWUoKGIpID0+IHtcclxuICAvLyAgICAgY29uc29sZS5sb2coeyBhLCBiIH0pO1xyXG4gIC8vICAgICByZXR1cm4gYS5uYW1lICE9PSBiLm5hbWUgJiYgYS5wYXJlbnRJZCA9PT0gYi5wYXJlbnRJZDtcclxuICAvLyAgIH0pO1xyXG4gIC8vIH0pO1xyXG4gIGNvbnNvbGUubG9nKHsgbm9Eb3VibGVzIH0pO1xyXG5cclxuICAvLyBjb25zdCByb290ID0gc3RyYXRpZnkobm9Eb3VibGVzKTtcclxuICAvLyBjb25zb2xlLmxvZyhyb290KTtcclxuXHJcbiAgLy8gY29uc3QgaGllcmFyY2h5OiBkM1RyZWUgPSBjcmVhdGVUcmVlSGllcmFyY2h5KG5vRG91Ymxlcywge1xyXG4gIC8vICAgaWQ6IFwibmFtZVwiLFxyXG4gIC8vICAgZXhjbHVkZVBhcmVudDogdHJ1ZSxcclxuICAvLyB9KTtcclxuXHJcbiAgLy8gY29uc29sZS5sb2coeyBoaWVyYXJjaHkgfSk7XHJcblxyXG4gIGNvbnN0IGxpbmtBcnI6IGQzTGlua1tdID0gbm9Eb3VibGVzLm1hcCgoZCkgPT4ge1xyXG4gICAgcmV0dXJuIHsgc291cmNlOiBkLm5hbWUsIHRhcmdldDogZC5wYXJlbnRJZCB9O1xyXG4gIH0pO1xyXG4gIGNvbnN0IGxpbmtzID0gbGlua0Fyci5tYXAoKGQpID0+IE9iamVjdC5jcmVhdGUoZCkpO1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcblxyXG4gIGNvbnN0IG5vZGVDb2xvdXIgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICBcIi0tdGV4dC1hY2NlbnRcIlxyXG4gICk7XHJcblxyXG4gIC8vIEluaXRpYWxpemUgdGhlIGNpcmNsZTogYWxsIGxvY2F0ZWQgYXQgdGhlIGNlbnRlciBvZiB0aGUgc3ZnIGFyZWFcclxuICBjb25zdCBub2RlID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLnNlbGVjdEFsbChcImNpcmNsZVwiKVxyXG4gICAgLmRhdGEobm9Eb3VibGVzKVxyXG4gICAgLmpvaW4oXCJjaXJjbGVcIilcclxuICAgIC5hdHRyKFwiclwiLCAoZCkgPT4gTWF0aC5yb3VuZChkLmhlaWdodCAvIDEwKSArIDEwKVxyXG4gICAgLmF0dHIoXCJjeFwiLCB3aWR0aCAvIDIpXHJcbiAgICAuYXR0cihcImN5XCIsIGhlaWdodCAvIDIpXHJcbiAgICAuc3R5bGUoXCJmaWxsXCIsIG5vZGVDb2xvdXIpXHJcbiAgICAuc3R5bGUoXCJmaWxsLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgbm9kZUNvbG91cilcclxuICAgIC5zdHlsZShcInN0cm9rZS13aWR0aFwiLCA0KTtcclxuXHJcbiAgbm9kZS5hdHRyKFwiYXJpYS1sYWJlbFwiLCAoZDogQWRqTGlzdEl0ZW0pID0+IGQubmFtZSk7XHJcblxyXG4gIGNvbnN0IG5vZGVDbGljayA9IChldmVudDogTW91c2VFdmVudCwgZGVzdDogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBjdXJyRmlsZSA9IGdldEN1cnJGaWxlKCk7XHJcbiAgICBvcGVuT3JTd2l0Y2goZGVzdCwgZXZlbnQpO1xyXG4gICAgbW9kYWwuY2xvc2UoKTtcclxuICB9O1xyXG4gIG5vZGUub24oXCJjbGlja1wiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGQzTm9kZSkgPT4ge1xyXG4gICAgbm9kZUNsaWNrKGV2ZW50LCBkLm5hbWUpO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBsaW5rID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCIjODY4MjgyXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1vcGFjaXR5XCIsIDAuNilcclxuICAgIC5zZWxlY3RBbGwoXCJsaW5lXCIpXHJcbiAgICAuZGF0YShsaW5rcylcclxuICAgIC5qb2luKFwibGluZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMC44KTtcclxuXHJcbiAgLy8gRmVhdHVyZXMgb2YgdGhlIGZvcmNlcyBhcHBsaWVkIHRvIHRoZSBub2RlczpcclxuICBjb25zdCBzaW11bGF0aW9uID0gZDNcclxuICAgIC5mb3JjZVNpbXVsYXRpb24oKVxyXG4gICAgLmZvcmNlKFxyXG4gICAgICBcImNlbnRlclwiLFxyXG4gICAgICBkM1xyXG4gICAgICAgIC5mb3JjZUNlbnRlcigpXHJcbiAgICAgICAgLngod2lkdGggLyAyKVxyXG4gICAgICAgIC55KGhlaWdodCAvIDIpXHJcbiAgICApIC8vIEF0dHJhY3Rpb24gdG8gdGhlIGNlbnRlciBvZiB0aGUgc3ZnIGFyZWFcclxuICAgIC5mb3JjZShcImNoYXJnZVwiLCBkMy5mb3JjZU1hbnlCb2R5KCkuc3RyZW5ndGgoMC41KSkgLy8gTm9kZXMgYXJlIGF0dHJhY3RlZCBvbmUgZWFjaCBvdGhlciBvZiB2YWx1ZSBpcyA+IDBcclxuICAgIC5mb3JjZShcclxuICAgICAgXCJjb2xsaWRlXCIsXHJcbiAgICAgIGQzLmZvcmNlQ29sbGlkZSgpLnN0cmVuZ3RoKDAuMDI1KS5yYWRpdXMoMzApLml0ZXJhdGlvbnMoMSlcclxuICAgICk7IC8vIEZvcmNlIHRoYXQgYXZvaWRzIGNpcmNsZSBvdmVybGFwcGluZ1xyXG5cclxuICAvLyBBcHBseSB0aGVzZSBmb3JjZXMgdG8gdGhlIG5vZGVzIGFuZCB1cGRhdGUgdGhlaXIgcG9zaXRpb25zLlxyXG4gIC8vIE9uY2UgdGhlIGZvcmNlIGFsZ29yaXRobSBpcyBoYXBweSB3aXRoIHBvc2l0aW9ucyAoJ2FscGhhJyB2YWx1ZSBpcyBsb3cgZW5vdWdoKSwgc2ltdWxhdGlvbnMgd2lsbCBzdG9wLlxyXG4gIHNpbXVsYXRpb24ubm9kZXMobm9Eb3VibGVzKS5vbihcInRpY2tcIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgIG5vZGUuYXR0cihcImN4XCIsIChkKSA9PiBkLngpLmF0dHIoXCJjeVwiLCAoZCkgPT4gZC55KTtcclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIG5vZGUuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gIH1cclxuICBzdmcuY2FsbChcclxuICAgIGQzXHJcbiAgICAgIC56b29tKClcclxuICAgICAgLmV4dGVudChbXHJcbiAgICAgICAgWzAsIDBdLFxyXG4gICAgICAgIFt3aWR0aCwgaGVpZ2h0XSxcclxuICAgICAgXSlcclxuICAgICAgLnNjYWxlRXh0ZW50KFswLjUsIDhdKVxyXG4gICAgICAub24oXCJ6b29tXCIsIHpvb21lZClcclxuICApO1xyXG5cclxuICBjb25zdCBkcmFnID0gKFxyXG4gICAgc2ltdWxhdGlvbjogZDMuU2ltdWxhdGlvbjxkMy5TaW11bGF0aW9uTm9kZURhdHVtLCB1bmRlZmluZWQ+XHJcbiAgKSA9PiB7XHJcbiAgICBmdW5jdGlvbiBkcmFnc3RhcnRlZChldmVudCwgZCkge1xyXG4gICAgICBpZiAoIWV2ZW50LmFjdGl2ZSkgc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwLjMpLnJlc3RhcnQoKTtcclxuICAgICAgZC5meCA9IGQueDtcclxuICAgICAgZC5meSA9IGQueTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkcmFnZ2VkKGV2ZW50LCBkKSB7XHJcbiAgICAgIGQuZnggPSBldmVudC54O1xyXG4gICAgICBkLmZ5ID0gZXZlbnQueTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkcmFnZW5kZWQoZXZlbnQsIGQpIHtcclxuICAgICAgaWYgKCFldmVudC5hY3RpdmUpIHNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMCk7XHJcbiAgICAgIGQuZnggPSBudWxsO1xyXG4gICAgICBkLmZ5ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZDNcclxuICAgICAgLmRyYWcoKVxyXG4gICAgICAub24oXCJzdGFydFwiLCBkcmFnc3RhcnRlZClcclxuICAgICAgLm9uKFwiZHJhZ1wiLCBkcmFnZ2VkKVxyXG4gICAgICAub24oXCJlbmRcIiwgZHJhZ2VuZGVkKTtcclxuICB9O1xyXG5cclxuICBub2RlLmNhbGwoZHJhZyhzaW11bGF0aW9uKSk7XHJcblxyXG4gIC8vICAgY29uc3QgcGFjayA9IChkYXRhKSA9PlxyXG4gIC8vICAgICBkMy5wYWNrKCkuc2l6ZShbd2lkdGgsIGhlaWdodF0pLnBhZGRpbmcoMykoXHJcbiAgLy8gICAgICAgZDNcclxuICAvLyAgICAgICAgIC5oaWVyYXJjaHkoZGF0YSlcclxuICAvLyAgICAgICAgIC5zdW0oKGQpID0+IGQudmFsdWUpXHJcbiAgLy8gICAgICAgICAuc29ydCgoYSwgYikgPT4gYi52YWx1ZSAtIGEudmFsdWUpXHJcbiAgLy8gICAgICk7XHJcblxyXG4gIC8vICAgY29uc3Qgcm9vdCA9IHBhY2soaGllcmFyY2h5KTtcclxuXHJcbiAgLy8gICBjb25zdCBzdmcgPSBkM1xyXG4gIC8vICAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgLy8gICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAvLyAgICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gIC8vICAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKVxyXG4gIC8vICAgICAuc3R5bGUoXCJmb250XCIsIFwiMTBweCBzYW5zLXNlcmlmXCIpXHJcbiAgLy8gICAgIC5zdHlsZShcIm92ZXJmbG93XCIsIFwidmlzaWJsZVwiKVxyXG4gIC8vICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpO1xyXG5cclxuICAvLyAgIGNvbnN0IG5vZGUgPSBzdmdcclxuICAvLyAgICAgLmFwcGVuZChcImdcIilcclxuICAvLyAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKVxyXG4gIC8vICAgICAuc2VsZWN0QWxsKFwiZ1wiKVxyXG4gIC8vICAgICAuZGF0YShyb290LmRlc2NlbmRhbnRzKCkpXHJcbiAgLy8gICAgIC5qb2luKFwiZ1wiKVxyXG4gIC8vICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAoZCkgPT4gYHRyYW5zbGF0ZSgke2QueH0sJHtkLnl9KWApO1xyXG5cclxuICAvLyAgIG5vZGVcclxuICAvLyAgICAgLmFwcGVuZChcImNpcmNsZVwiKVxyXG4gIC8vICAgICAuYXR0cihcInJcIiwgKGQpID0+IGQucilcclxuICAvLyAgICAgLmF0dHIoXCJzdHJva2VcIiwgKGQpID0+IChkLmNoaWxkcmVuID8gXCIjYmJiXCIgOiBcIm5vbmVcIikpXHJcbiAgLy8gICAgIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4gKGQuY2hpbGRyZW4gPyBcIm5vbmVcIiA6IFwiI2RkZFwiKSk7XHJcblxyXG4gIC8vICAgY29uc3QgbGVhZiA9IG5vZGUuZmlsdGVyKChkKSA9PiAhZC5jaGlsZHJlbik7XHJcblxyXG4gIC8vICAgbGVhZi5zZWxlY3QoXCJjaXJjbGVcIik7XHJcblxyXG4gIC8vICAgLy8gbGVhZlxyXG4gIC8vICAgLy8gICAuYXBwZW5kKFwiY2xpcFBhdGhcIilcclxuICAvLyAgIC8vICAgLmF0dHIoXCJpZFwiLCAoZCkgPT4gKGQuY2xpcFVpZCA9IERPTS51aWQoXCJjbGlwXCIpKS5pZClcclxuICAvLyAgIC8vICAgLmFwcGVuZChcInVzZVwiKVxyXG4gIC8vICAgLy8gICAuYXR0cihcInhsaW5rOmhyZWZcIiwgKGQpID0+IGQubGVhZlVpZC5ocmVmKTtcclxuXHJcbiAgLy8gICAvLyBsZWFmXHJcbiAgLy8gICAvLyAgIC5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgLy8gICAvLyAgIC5hdHRyKFwiY2xpcC1wYXRoXCIsIChkKSA9PiBkLmNsaXBVaWQpXHJcbiAgLy8gICAvLyAgIC5zZWxlY3RBbGwoXCJ0c3BhblwiKVxyXG4gIC8vICAgLy8gICAuZGF0YSgoZCkgPT4gZC5kYXRhLm5hbWUuc3BsaXQoLyg/PVtBLVpdW15BLVpdKS9nKSlcclxuICAvLyAgIC8vICAgLmpvaW4oXCJ0c3BhblwiKVxyXG4gIC8vICAgLy8gICAuYXR0cihcInhcIiwgMClcclxuICAvLyAgIC8vICAgLmF0dHIoXCJ5XCIsIChkLCBpLCBub2RlcykgPT4gYCR7aSAtIG5vZGVzLmxlbmd0aCAvIDIgKyAwLjh9ZW1gKVxyXG4gIC8vICAgLy8gICAudGV4dCgoZCkgPT4gZCk7XHJcblxyXG4gIC8vICAgbm9kZS5hcHBlbmQoXCJ0aXRsZVwiKS50ZXh0KFxyXG4gIC8vICAgICAoZCkgPT4gYCR7ZFxyXG4gIC8vICAgICAgIC5hbmNlc3RvcnMoKVxyXG4gIC8vICAgICAgIC5tYXAoKGQpID0+IGQuZGF0YS5kYXRhLm5hbWUpXHJcbiAgLy8gICAgICAgLnJldmVyc2UoKVxyXG4gIC8vICAgICAgIC5qb2luKFwiL1wiKX1cclxuICAvLyAke2QudmFsdWUudG9Mb2NhbGVTdHJpbmcoKX1gXHJcbiAgLy8gICApO1xyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBlZGdlQnVuZGxpbmcgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCBmbGF0QWRqID0gZGZzRmxhdEFkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGZsYXRBZGogfSk7XHJcblxyXG4gIGNvbnN0IGhpZXIgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllciB9KTtcclxuXHJcbiAgY29uc3QgUEFERElOR19CVUJCTEUgPSAxNTsgLy8gZGlzdGFuY2UgYmV0d2VlbiBlZGdlIGVuZCBhbmQgYnViYmxlXHJcbiAgY29uc3QgUEFERElOR19MQUJFTCA9IDMwOyAvLyBkaXN0YW5jZSBiZXR3ZWVuIGVkZ2UgZW5kIGFuZCBlbmdpbmVlciBuYW1lXHJcbiAgY29uc3QgQlVCQkxFX1NJWkVfTUlOID0gNDtcclxuICBjb25zdCBCVUJCTEVfU0laRV9NQVggPSAyMDtcclxuXHJcbiAgdmFyIGRpYW1ldGVyID0gNTYwLFxyXG4gICAgcmFkaXVzID0gZGlhbWV0ZXIgLyAyLFxyXG4gICAgaW5uZXJSYWRpdXMgPSByYWRpdXMgLSAxNzA7IC8vIGJldHdlZW4gY2VudGVyIGFuZCBlZGdlIGVuZFxyXG5cclxuICAvLyBUaGUgJ2NsdXN0ZXInIGZ1bmN0aW9uIHRha2VzIDEgYXJndW1lbnQgYXMgaW5wdXQuIEl0IGFsc28gaGFzIG1ldGhvZHMgKD8/KSBsaWtlIGNsdXN0ZXIuc2VwYXJhdGlvbigpLCBjbHVzdGVyLnNpemUoKSBhbmQgY2x1c3Rlci5ub2RlU2l6ZSgpXHJcbiAgdmFyIGNsdXN0ZXIgPSBkMy5jbHVzdGVyKCkuc2l6ZShbMzYwLCBpbm5lclJhZGl1c10pO1xyXG5cclxuICB2YXIgbGluZSA9IGQzXHJcbiAgICAubGluZVJhZGlhbCgpXHJcbiAgICAuY3VydmUoZDMuY3VydmVCdW5kbGUuYmV0YSgwLjg1KSlcclxuICAgIC5yYWRpdXMoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGRbMV07XHJcbiAgICB9KVxyXG4gICAgLmFuZ2xlKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiAoZFswXSAvIDE4MCkgKiBNYXRoLlBJO1xyXG4gICAgfSk7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKVxyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgcmFkaXVzICsgXCIsXCIgKyByYWRpdXMgKyBcIilcIik7XHJcblxyXG4gIHZhciBsaW5rID0gc3ZnLmFwcGVuZChcImdcIikuc2VsZWN0QWxsKFwiLmxpbmtcIiksXHJcbiAgICBsYWJlbCA9IHN2Zy5hcHBlbmQoXCJnXCIpLnNlbGVjdEFsbChcIi5sYWJlbFwiKSxcclxuICAgIGJ1YmJsZSA9IHN2Zy5hcHBlbmQoXCJnXCIpLnNlbGVjdEFsbChcIi5idWJibGVcIik7XHJcblxyXG4gIC8vIEFkZCBhIHNjYWxlIGZvciBidWJibGUgc2l6ZVxyXG4gIHZhciBidWJibGVTaXplU2NhbGUgPSBkM1xyXG4gICAgLnNjYWxlTGluZWFyKClcclxuICAgIC5kb21haW4oWzAsIDEwMF0pXHJcbiAgICAucmFuZ2UoW0JVQkJMRV9TSVpFX01JTiwgQlVCQkxFX1NJWkVfTUFYXSk7XHJcblxyXG4gIC8vIFNjYWxlIGZvciB0aGUgYnViYmxlIHNpemVcclxuXHJcbiAgLy8gSWYgd2FubmEgc2VlIHlvdXIgZGF0YVxyXG4gIC8vIGNvbnNvbGUubG9nKGhpZXJhcmNoaWNhbERhdGEpXHJcblxyXG4gIC8vIFJlZm9ybWF0IHRoZSBkYXRhXHJcbiAgdmFyIHJvb3QgPSBwYWNrYWdlSGllcmFyY2h5KGhpZXIpXHJcbiAgICAvL2RlYnVnZ2VyO1xyXG4gICAgLnN1bShmdW5jdGlvbiAoZCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhkKTtcclxuICAgICAgcmV0dXJuIGQuaGVpZ2h0O1xyXG4gICAgfSk7XHJcblxyXG4gIC8vIGNvbnNvbGUubG9nKHJvb3QpXHJcblxyXG4gIC8vIEJ1aWxkIGFuIG9iamVjdCB0aGF0IGdpdmVzIGZlYXR1cmUgb2YgZWFjaCBsZWF2ZXNcclxuICBjbHVzdGVyKHJvb3QpO1xyXG4gIGNvbnN0IGxlYXZlcyA9IHJvb3QubGVhdmVzKCk7XHJcblxyXG4gIC8vIExlYXZlcyBpcyBhbiBhcnJheSBvZiBPYmplY3RzLiAxIGl0ZW0gPSBvbmUgbGVhZi4gUHJvdmlkZXMgeCBhbmQgeSBmb3IgbGVhZiBwb3NpdGlvbiBpbiB0aGUgc3ZnLiBBbHNvIGdpdmVzIGRldGFpbHMgYWJvdXQgaXRzIHBhcmVudC5cclxuICBjb25zdCBfbGluayA9IGxpbmtcclxuICAgIC5kYXRhKHBhY2thZ2VJbXBvcnRzKGxlYXZlcykpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZChcInBhdGhcIilcclxuICAgIC5lYWNoKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIChkLnNvdXJjZSA9IGRbMF0pLCAoZC50YXJnZXQgPSBkW2QubGVuZ3RoIC0gMV0pO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJsaW5rXCIpXHJcbiAgICAuYXR0cihcImRcIiwgbGluZSlcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiYmxhY2tcIik7XHJcblxyXG4gIGNvbnN0IF9sYWJlbCA9IGxhYmVsXHJcbiAgICAuZGF0YShsZWF2ZXMpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZChcInRleHRcIilcclxuICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJsYWJlbFwiKVxyXG4gICAgLmF0dHIoXCJkeVwiLCBcIjAuMzFlbVwiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBcInJvdGF0ZShcIiArXHJcbiAgICAgICAgKGQueCAtIDkwKSArXHJcbiAgICAgICAgXCIpdHJhbnNsYXRlKFwiICtcclxuICAgICAgICAoZC55ICsgUEFERElOR19MQUJFTCkgK1xyXG4gICAgICAgIFwiLDApXCIgK1xyXG4gICAgICAgIChkLnggPCAxODAgPyBcIlwiIDogXCJyb3RhdGUoMTgwKVwiKVxyXG4gICAgICApO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQueCA8IDE4MCA/IFwic3RhcnRcIiA6IFwiZW5kXCI7XHJcbiAgICB9KVxyXG4gICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQuZGF0YS5rZXk7XHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgX2J1YmJsZSA9IGJ1YmJsZVxyXG4gICAgLmRhdGEobGVhdmVzKVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoXCJjaXJjbGVcIilcclxuICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJidWJibGVcIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgXCJyb3RhdGUoXCIgKyAoZC54IC0gOTApICsgXCIpdHJhbnNsYXRlKFwiICsgKGQueSArIFBBRERJTkdfQlVCQkxFKSArIFwiLDApXCJcclxuICAgICAgKTtcclxuICAgIH0pXHJcbiAgICAuYXR0cihcInJcIiwgKGQpID0+IGJ1YmJsZVNpemVTY2FsZShkLnZhbHVlKSlcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiYmxhY2tcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIiM2OWEzYjJcIilcclxuICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMC4yKTtcclxuXHJcbiAgLy8gTGF6aWx5IGNvbnN0cnVjdCB0aGUgcGFja2FnZSBoaWVyYXJjaHkgZnJvbSBjbGFzcyBuYW1lcy5cclxuICBmdW5jdGlvbiBwYWNrYWdlSGllcmFyY2h5KGNsYXNzZXMpIHtcclxuICAgIHZhciBtYXAgPSB7fTtcclxuXHJcbiAgICBmdW5jdGlvbiBmaW5kKG5hbWUsIGRhdGEpIHtcclxuICAgICAgdmFyIG5vZGUgPSBtYXBbbmFtZV0sXHJcbiAgICAgICAgaTtcclxuICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgbm9kZSA9IG1hcFtuYW1lXSA9IGRhdGEgfHwgeyBuYW1lOiBuYW1lLCBjaGlsZHJlbjogW10gfTtcclxuICAgICAgICBpZiAobmFtZS5sZW5ndGgpIHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIG5vZGUucGFyZW50ID0gZmluZChuYW1lLnN1YnN0cmluZygwLCAoaSA9IG5hbWUubGFzdEluZGV4T2YoXCIuXCIpKSkpO1xyXG4gICAgICAgICAgbm9kZS5wYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTtcclxuICAgICAgICAgIG5vZGUua2V5ID0gbmFtZS5zdWJzdHJpbmcoaSArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICBjbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgZmluZChkLm5hbWUsIGQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGQzLmhpZXJhcmNoeShtYXBbXCJcIl0pO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJuIGEgbGlzdCBvZiBpbXBvcnRzIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2Ygbm9kZXMuXHJcbiAgZnVuY3Rpb24gcGFja2FnZUltcG9ydHMobm9kZXMpIHtcclxuICAgIHZhciBtYXAgPSB7fSxcclxuICAgICAgaW1wb3J0cyA9IFtdO1xyXG5cclxuICAgIC8vIENvbXB1dGUgYSBtYXAgZnJvbSBuYW1lIHRvIG5vZGUuXHJcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIG1hcFtkLmRhdGEubmFtZV0gPSBkO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRm9yIGVhY2ggaW1wb3J0LCBjb25zdHJ1Y3QgYSBsaW5rIGZyb20gdGhlIHNvdXJjZSB0byB0YXJnZXQgbm9kZS5cclxuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgaWYgKGQuZGF0YS5pbXBvcnRzKVxyXG4gICAgICAgIGQuZGF0YS5pbXBvcnRzLmZvckVhY2goZnVuY3Rpb24gKGkpIHtcclxuICAgICAgICAgIGltcG9ydHMucHVzaChtYXBbZC5kYXRhLm5hbWVdLnBhdGgobWFwW2ldKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gaW1wb3J0cztcclxuICB9XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgb3Blbk9yU3dpdGNoIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuaW1wb3J0IHR5cGUgeyBkM05vZGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBncmFwaGxpYlRvRDMsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZvcmNlRGlyZWN0ZWRHID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gbW9kYWwucGx1Z2luO1xyXG4gIGxldCBub2RlVG9HZXRUbyA9IGN1cnJGaWxlLmJhc2VuYW1lO1xyXG4gIGNvbnNvbGUubG9nKHsgbm9kZVRvR2V0VG8gfSk7XHJcblxyXG4gIGNvbnNvbGUudGltZShcIkZpbmQgYWxsIHBhdGhzXCIpO1xyXG4gIC8vIGxldCBwYXRoc0Zyb21Ob2RlVG9HZXRUbyA9IGdyYXBobGliLmFsZy5kaWprc3RyYShncmFwaCwgbm9kZVRvR2V0VG8pO1xyXG4gIGNvbnNvbGUudGltZUVuZChcIkZpbmQgYWxsIHBhdGhzXCIpO1xyXG5cclxuICBjb25zdCBkZWZhdWx0Tm9kZUNvbG91ciA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgIFwiLS10ZXh0LWFjY2VudFwiXHJcbiAgKTtcclxuICBsZXQgY3Vyck5vZGVDb2xvdXIgPSBkZWZhdWx0Tm9kZUNvbG91cjtcclxuXHJcbiAgY29uc3QgY29sb3VyQ2hhbmdlSW5wdXQgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcImlucHV0XCIpXHJcbiAgICAuYXR0cihcInR5cGVcIiwgXCJjb2xvclwiKTtcclxuXHJcbiAgY29sb3VyQ2hhbmdlSW5wdXQub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24gY2hhbmdlQ29sb3IoZWwpIHtcclxuICAgIGN1cnJOb2RlQ29sb3VyID0gZWwudGFyZ2V0LnZhbHVlO1xyXG4gICAgbm9kZVxyXG4gICAgICAudHJhbnNpdGlvbigpXHJcbiAgICAgIC5kdXJhdGlvbigzMDApXHJcbiAgICAgIC5zdHlsZShcImZpbGxcIiwgKGQpID0+IHtcclxuICAgICAgICBpZiAoZC5pbmRleCA9PT0gY3Vyck5vZGVJbmRleCkgcmV0dXJuO1xyXG4gICAgICAgIHJldHVybiBjdXJyTm9kZUNvbG91cjtcclxuICAgICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIC8vIGNvbnN0IHNhdmVMYXlvdXRCdXR0b24gPSBtb2RhbC5jb250ZW50RWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgdGV4dDogJ1NhdmUgTGF5b3V0JyB9KVxyXG4gIC8vICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2F2ZUdyYXBoKVxyXG5cclxuICBjb25zdCBkYXRhID0gZ3JhcGhsaWJUb0QzKGdyYXBoKTtcclxuXHJcbiAgY29uc3QgbGlua3M6IHtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICBzb3VyY2U6IHsgaW5kZXg6IG51bWJlcjsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcclxuICAgIHRhcmdldDogeyBpbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xyXG4gIH1bXSA9IGRhdGEubGlua3MubWFwKChkKSA9PiBPYmplY3QuY3JlYXRlKGQpKTtcclxuXHJcbiAgY29uc3QgY3Vyck5vZGUgPSBkYXRhLm5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUubmFtZSA9PT0gY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGxldCBjdXJyTm9kZUluZGV4OiBudW1iZXI7XHJcbiAgaWYgKCFjdXJyTm9kZSkge1xyXG4gICAgY29uc3QgaWQgPSBkYXRhLm5vZGVzLmxlbmd0aDtcclxuICAgIGRhdGEubm9kZXMucHVzaCh7IGlkLCBuYW1lOiBjdXJyRmlsZS5iYXNlbmFtZSB9KTtcclxuICAgIGN1cnJOb2RlSW5kZXggPSBpZDtcclxuICB9IGVsc2Uge1xyXG4gICAgY3Vyck5vZGVJbmRleCA9IGN1cnJOb2RlLmlkO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgbm9kZXMgPSBkYXRhLm5vZGVzLm1hcCgoZCkgPT4gT2JqZWN0LmNyZWF0ZShkKSk7XHJcblxyXG4gIGNvbnN0IHNpbXVsYXRpb24gPSBkM1xyXG4gICAgLmZvcmNlU2ltdWxhdGlvbihub2RlcylcclxuICAgIC5mb3JjZShcclxuICAgICAgXCJsaW5rXCIsXHJcbiAgICAgIGQzLmZvcmNlTGluayhsaW5rcykuaWQoKGQpID0+IGQuaWQpXHJcbiAgICApXHJcbiAgICAuZm9yY2UoXCJjaGFyZ2VcIiwgZDMuZm9yY2VNYW55Qm9keSgpLnN0cmVuZ3RoKC04KSlcclxuICAgIC5mb3JjZShcImNlbnRlclwiLCBkMy5mb3JjZUNlbnRlcih3aWR0aCAvIDIsIGhlaWdodCAvIDIpLnN0cmVuZ3RoKDAuNSkpO1xyXG5cclxuICBjb25zdCBkcmFnID0gKHNpbXVsYXRpb246IGQzLlNpbXVsYXRpb248YW55LCB1bmRlZmluZWQ+KSA9PiB7XHJcbiAgICBmdW5jdGlvbiBkcmFnc3RhcnRlZChldmVudCwgZCkge1xyXG4gICAgICBpZiAoIWV2ZW50LmFjdGl2ZSkgc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwLjMpLnJlc3RhcnQoKTtcclxuICAgICAgZC5meCA9IGQueDtcclxuICAgICAgZC5meSA9IGQueTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkcmFnZ2VkKGV2ZW50LCBkKSB7XHJcbiAgICAgIGQuZnggPSBldmVudC54O1xyXG4gICAgICBkLmZ5ID0gZXZlbnQueTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkcmFnZW5kZWQoZXZlbnQsIGQpIHtcclxuICAgICAgaWYgKCFldmVudC5hY3RpdmUpIHNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMCk7XHJcbiAgICAgIGQuZnggPSBudWxsO1xyXG4gICAgICBkLmZ5ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZDNcclxuICAgICAgLmRyYWcoKVxyXG4gICAgICAub24oXCJzdGFydFwiLCBkcmFnc3RhcnRlZClcclxuICAgICAgLm9uKFwiZHJhZ1wiLCBkcmFnZ2VkKVxyXG4gICAgICAub24oXCJlbmRcIiwgZHJhZ2VuZGVkKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aClcclxuICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJmb3JjZURpcmVjdGVkR1wiKTtcclxuXHJcbiAgY29uc3QgbGluayA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzg2ODI4MlwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utb3BhY2l0eVwiLCAwLjYpXHJcbiAgICAuc2VsZWN0QWxsKFwibGluZVwiKVxyXG4gICAgLmRhdGEobGlua3MpXHJcbiAgICAuam9pbihcImxpbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDAuOClcclxuICAgIC5hdHRyKFwibWFya2VyLWVuZFwiLCBcInVybCgjZW5kKVwiKTtcclxuXHJcbiAgdmFyIHBhdGggPSBzdmdcclxuICAgIC5hcHBlbmQoXCJzdmc6Z1wiKVxyXG4gICAgLnNlbGVjdEFsbChcInBhdGhcIilcclxuICAgIC5kYXRhKGxpbmtzKVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoXCJzdmc6cGF0aFwiKVxyXG4gICAgLy8gICAgLmF0dHIoXCJjbGFzc1wiLCBmdW5jdGlvbihkKSB7IHJldHVybiBcImxpbmsgXCIgKyBkLnR5cGU7IH0pXHJcbiAgICAuYXR0cihcImNsYXNzXCIsIFwibGlua1wiKVxyXG4gICAgLmF0dHIoXCJtYXJrZXItZW5kXCIsIFwidXJsKCNlbmQpXCIpO1xyXG5cclxuICBjb25zdCBhcnJvd0hlYWQgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJzdmc6ZGVmc1wiKVxyXG4gICAgLnNlbGVjdEFsbChcIm1hcmtlclwiKVxyXG4gICAgLmRhdGEoW1wiZW5kXCJdKSAvLyBEaWZmZXJlbnQgbGluay9wYXRoIHR5cGVzIGNhbiBiZSBkZWZpbmVkIGhlcmVcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKFwic3ZnOm1hcmtlclwiKSAvLyBUaGlzIHNlY3Rpb24gYWRkcyBpbiB0aGUgYXJyb3dzXHJcbiAgICAuYXR0cihcImlkXCIsIFN0cmluZylcclxuICAgIC5hdHRyKFwidmlld0JveFwiLCBcIjAgLTUgMTAgMTBcIilcclxuICAgIC5hdHRyKFwicmVmWFwiLCAyMClcclxuICAgIC5hdHRyKFwicmVmWVwiLCAwLjEpXHJcbiAgICAuYXR0cihcIm1hcmtlcldpZHRoXCIsIDYpXHJcbiAgICAuYXR0cihcIm1hcmtlckhlaWdodFwiLCA2KVxyXG4gICAgLmF0dHIoXCJvcmllbnRcIiwgXCJhdXRvXCIpXHJcbiAgICAvLyAuYXR0cihcInN0cm9rZVwiLCBcIiM4NjgyODJcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDEwKVxyXG4gICAgLmFwcGVuZChcInN2ZzpwYXRoXCIpXHJcbiAgICAuYXR0cihcImRcIiwgXCJNMCwtNUwxMCwwTDAsNVwiKTtcclxuXHJcbiAgY29uc3QgbmFtZUZyb21JbmRleCA9IChkOiB7IGluZGV4OiBudW1iZXIgfSkgPT5cclxuICAgIGRhdGEubm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gZC5pbmRleCkubmFtZTtcclxuXHJcbiAgY29uc3QgaW5kZXhGcm9tTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBudW1iZXIgPT5cclxuICAgIGRhdGEubm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5uYW1lID09PSBuYW1lKS5pZDtcclxuXHJcbiAgY29uc3Qgbm9kZTogZDMuU2VsZWN0aW9uPFxyXG4gICAgZDMuQmFzZVR5cGUgfCBTVkdDaXJjbGVFbGVtZW50LFxyXG4gICAgYW55LFxyXG4gICAgU1ZHR0VsZW1lbnQsXHJcbiAgICB1bmtub3duXHJcbiAgPiA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5zZWxlY3RBbGwoXCJjaXJjbGVcIilcclxuICAgIC5kYXRhKG5vZGVzKVxyXG4gICAgLmpvaW4oXCJjaXJjbGVcIilcclxuXHJcbiAgICAuYXR0cihcInJcIiwgNSlcclxuICAgIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4ge1xyXG4gICAgICBpZiAobmFtZUZyb21JbmRleChkKSA9PT0gY3VyckZpbGUuYmFzZW5hbWUpIHtcclxuICAgICAgICByZXR1cm4gXCIjZmZmZmZmXCI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJOb2RlQ29sb3VyO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLmNhbGwoZHJhZyhzaW11bGF0aW9uKSk7XHJcblxyXG4gIG5vZGUuYXR0cihcImFyaWEtbGFiZWxcIiwgKGQ6IGQzTm9kZSkgPT4gZC5uYW1lKTtcclxuXHJcbiAgY29uc3Qgbm9kZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBkZXN0OiBzdHJpbmcpID0+IHtcclxuICAgIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCk7XHJcbiAgICBtb2RhbC5jbG9zZSgpO1xyXG4gIH07XHJcbiAgbm9kZS5vbihcImNsaWNrXCIsIChldmVudDogTW91c2VFdmVudCwgZDogZDNOb2RlKSA9PiB7XHJcbiAgICBub2RlQ2xpY2soZXZlbnQsIGQubmFtZSk7XHJcbiAgfSk7XHJcblxyXG4gIG5vZGUub24oXCJtb3VzZWRvd25cIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkKSA9PiB7XHJcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyKSB7XHJcbiAgICAgIG5vZGVUb0dldFRvID0gZC5uYW1lO1xyXG5cclxuICAgICAgbm9kZS5zdHlsZShcImZpbGxcIiwgKG4pID0+IHtcclxuICAgICAgICBpZiAobi5uYW1lID09PSBub2RlVG9HZXRUbykge1xyXG4gICAgICAgICAgcmV0dXJuIFwiI2ZmMDAwMFwiO1xyXG4gICAgICAgIH0gZWxzZSByZXR1cm4gY3Vyck5vZGVDb2xvdXI7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gcGF0aHNGcm9tTm9kZVRvR2V0VG8gPSBncmFwaGxpYi5hbGcuZGlqa3N0cmEoZ3JhcGgsIG5vZGVUb0dldFRvKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gbGlua2VkKGE6IG51bWJlciwgYjogbnVtYmVyKSB7XHJcbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XHJcbiAgICBjb25zdCBsaW5rZWRBcnIgPSBsaW5rcy5maW5kKFxyXG4gICAgICAobGluaykgPT5cclxuICAgICAgICAobGluay5zb3VyY2UuaW5kZXggPT09IGEgJiYgbGluay50YXJnZXQuaW5kZXggPT09IGIpIHx8XHJcbiAgICAgICAgKGxpbmsudGFyZ2V0LmluZGV4ID09PSBhICYmIGxpbmsuc291cmNlLmluZGV4ID09PSBiKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gISFsaW5rZWRBcnI7XHJcbiAgfVxyXG5cclxuICAvLyBmdW5jdGlvbiB3YWxrRGlqa3N0cmFQYXRocyhcclxuICAvLyAgIHBhdGhzOiB7IFtub2RlOiBzdHJpbmddOiBncmFwaGxpYi5QYXRoIH0sXHJcbiAgLy8gICBzdGFydE5vZGU6IHN0cmluZ1xyXG4gIC8vICkge1xyXG4gIC8vICAgaWYgKHN0YXJ0Tm9kZSA9PT0gbm9kZVRvR2V0VG8gfHwgcGF0aHNbc3RhcnROb2RlXS5kaXN0YW5jZSA9PT0gSW5maW5pdHkpXHJcbiAgLy8gICAgIHJldHVybiBbXTtcclxuICAvLyAgIGxldCBzdGVwID0gc3RhcnROb2RlO1xyXG5cclxuICAvLyAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gW3N0YXJ0Tm9kZV07XHJcbiAgLy8gICBsZXQgaSA9IDA7XHJcbiAgLy8gICBjb25zdCBNQVggPSAzMDA7XHJcbiAgLy8gICB3aGlsZSAocGF0aHNbc3RlcF0ucHJlZGVjZXNzb3IgIT09IG5vZGVUb0dldFRvICYmIGkgPCBNQVgpIHtcclxuICAvLyAgICAgaSsrO1xyXG4gIC8vICAgICBzdGVwID0gcGF0aHNbc3RlcF0ucHJlZGVjZXNzb3I7XHJcbiAgLy8gICAgIHBhdGgucHVzaChzdGVwKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGlmIChpID49IE1BWCkgcmV0dXJuIFtdO1xyXG4gIC8vICAgcGF0aC5wdXNoKG5vZGVUb0dldFRvKTtcclxuICAvLyAgIHJldHVybiBwYXRoO1xyXG4gIC8vIH1cclxuXHJcbiAgbm9kZVxyXG4gICAgLm9uKFwibW91c2VvdmVyXCIsIChldmVudDogTW91c2VFdmVudCwgZDogeyBpbmRleDogbnVtYmVyIH0pID0+IHtcclxuICAgICAgbm9kZVxyXG4gICAgICAgIC50cmFuc2l0aW9uKClcclxuICAgICAgICAuZHVyYXRpb24oMTUwKVxyXG4gICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgKG8pID0+IHtcclxuICAgICAgICAgIHJldHVybiBsaW5rZWQoZC5pbmRleCwgby5pbmRleCkgPyAxIDogMC4yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICBsaW5rXHJcbiAgICAgICAgLnRyYW5zaXRpb24oKVxyXG4gICAgICAgIC5kdXJhdGlvbigxNTApXHJcbiAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCBmdW5jdGlvbiAobykge1xyXG4gICAgICAgICAgcmV0dXJuIG8uc291cmNlLmluZGV4ID09PSBkLmluZGV4IHx8IG8udGFyZ2V0LmluZGV4ID09PSBkLmluZGV4XHJcbiAgICAgICAgICAgID8gMVxyXG4gICAgICAgICAgICA6IDAuMjtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIC8vIEhpZ2hsaWdodCBwYXRoIGZyb20gaG92ZXJlZCBub2RlIHRvIGN1cnJOb2RlXHJcbiAgICAgIGNvbnN0IGhvdmVyZWROb2RlID0gbmFtZUZyb21JbmRleChkKTtcclxuICAgICAgLy8gY29uc3QgcGF0aCA9IHdhbGtEaWprc3RyYVBhdGhzKHBhdGhzRnJvbU5vZGVUb0dldFRvLCBob3ZlcmVkTm9kZSk7XHJcbiAgICAgIC8vIGlmIChwYXRoLmxlbmd0aCkge1xyXG4gICAgICAvLyAgIGxpbmtcclxuICAgICAgLy8gICAgIC50cmFuc2l0aW9uKClcclxuICAgICAgLy8gICAgIC5kdXJhdGlvbigxNTApXHJcbiAgICAgIC8vICAgICAuc3R5bGUoXCJzdHJva2VcIiwgZnVuY3Rpb24gKGxpbmspIHtcclxuICAgICAgLy8gICAgICAgaWYgKFxyXG4gICAgICAvLyAgICAgICAgIHBhdGguaW5jbHVkZXMobmFtZUZyb21JbmRleChsaW5rLnNvdXJjZSkpICYmXHJcbiAgICAgIC8vICAgICAgICAgcGF0aC5pbmNsdWRlcyhuYW1lRnJvbUluZGV4KGxpbmsudGFyZ2V0KSlcclxuICAgICAgLy8gICAgICAgKVxyXG4gICAgICAvLyAgICAgICAgIHJldHVybiBjdXJyTm9kZUNvbG91cjtcclxuICAgICAgLy8gICAgIH0pXHJcbiAgICAgIC8vICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIGZ1bmN0aW9uIChsaW5rKSB7XHJcbiAgICAgIC8vICAgICAgIGlmIChcclxuICAgICAgLy8gICAgICAgICBwYXRoLmluY2x1ZGVzKG5hbWVGcm9tSW5kZXgobGluay5zb3VyY2UpKSAmJlxyXG4gICAgICAvLyAgICAgICAgIHBhdGguaW5jbHVkZXMobmFtZUZyb21JbmRleChsaW5rLnRhcmdldCkpXHJcbiAgICAgIC8vICAgICAgIClcclxuICAgICAgLy8gICAgICAgICByZXR1cm4gMTtcclxuICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAvLyB9XHJcbiAgICB9KVxyXG4gICAgLm9uKFwibW91c2VvdXRcIiwgdW5mb2N1cyk7XHJcblxyXG4gIGZ1bmN0aW9uIGZvY3VzTmVpZ2hib3VycyhkLCBldmVudDogTW91c2VFdmVudCkgeyB9XHJcblxyXG4gIGZ1bmN0aW9uIHVuZm9jdXMoKSB7XHJcbiAgICAvLyBsYWJlbE5vZGUuYXR0cihcImRpc3BsYXlcIiwgXCJibG9ja1wiKTtcclxuICAgIG5vZGUuc3R5bGUoXCJvcGFjaXR5XCIsIDEpO1xyXG4gICAgbGluay5zdHlsZShcIm9wYWNpdHlcIiwgMSkuc3R5bGUoXCJzdHJva2VcIiwgXCIjODY4MjgyXCIpO1xyXG4gIH1cclxuXHJcbiAgc2ltdWxhdGlvbi5vbihcInRpY2tcIiwgKCkgPT4ge1xyXG4gICAgbGlua1xyXG4gICAgICAuYXR0cihcIngxXCIsIChkKSA9PiBkLnNvdXJjZS54KVxyXG4gICAgICAuYXR0cihcInkxXCIsIChkKSA9PiBkLnNvdXJjZS55KVxyXG4gICAgICAuYXR0cihcIngyXCIsIChkKSA9PiBkLnRhcmdldC54KVxyXG4gICAgICAuYXR0cihcInkyXCIsIChkKSA9PiBkLnRhcmdldC55KTtcclxuXHJcbiAgICBub2RlLmF0dHIoXCJjeFwiLCAoZCkgPT4gZC54KS5hdHRyKFwiY3lcIiwgKGQpID0+IGQueSk7XHJcbiAgfSk7XHJcblxyXG4gIGZ1bmN0aW9uIHpvb21lZCh7IHRyYW5zZm9ybSB9KSB7XHJcbiAgICBub2RlLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICAgIGxpbmsuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gIH1cclxuICBzdmcuY2FsbChcclxuICAgIGQzXHJcbiAgICAgIC56b29tKClcclxuICAgICAgLmV4dGVudChbXHJcbiAgICAgICAgWzAsIDBdLFxyXG4gICAgICAgIFt3aWR0aCwgaGVpZ2h0XSxcclxuICAgICAgXSlcclxuICAgICAgLnNjYWxlRXh0ZW50KFswLjUsIDEwXSlcclxuICAgICAgLm9uKFwiem9vbVwiLCB6b29tZWQpXHJcbiAgKTtcclxuXHJcbiAgZnVuY3Rpb24gc2F2ZUdyYXBoKCkge1xyXG4gICAgY29uc3QgY2xvbmUgPSBzdmcuY2xvbmUodHJ1ZSk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkZER1wiLCBKU09OLnN0cmluZ2lmeShjbG9uZSkpO1xyXG4gIH1cclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRmc0ZsYXRBZGpMaXN0LCBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcblxyXG5leHBvcnQgY29uc3QgaWNpY2xlID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgdmlld0hlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IGZsYXRBZGogPSBkZnNGbGF0QWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgZmxhdEFkaiB9KTtcclxuXHJcbiAgY29uc3QgaGllciA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyIH0pO1xyXG5cclxuICBjb25zdCBmb3JtYXQgPSBkMy5mb3JtYXQoXCIsZFwiKTtcclxuXHJcbiAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoXHJcbiAgICBkMy5xdWFudGl6ZShkMy5pbnRlcnBvbGF0ZVJhaW5ib3csIGhpZXIuY2hpbGRyZW4ubGVuZ3RoICsgMSlcclxuICApO1xyXG5cclxuICBjb25zdCBwYXJ0aXRpb24gPSAoZGF0YSkgPT4ge1xyXG4gICAgY29uc3Qgcm9vdCA9IGQzXHJcbiAgICAgIC5oaWVyYXJjaHkoZGF0YSlcclxuICAgICAgLnN1bSgoZCkgPT4gZC52YWx1ZSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuaGVpZ2h0IC0gYS5oZWlnaHQgfHwgYi52YWx1ZSAtIGEudmFsdWUpO1xyXG4gICAgcmV0dXJuIGQzLnBhcnRpdGlvbigpLnNpemUoW3ZpZXdIZWlnaHQsICgocm9vdC5oZWlnaHQgKyAxKSAqIHdpZHRoKSAvIDNdKShcclxuICAgICAgcm9vdFxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICBjb25zdCByb290ID0gcGFydGl0aW9uKGhpZXIpO1xyXG4gIGxldCBmb2N1cyA9IHJvb3Q7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCB2aWV3SGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aClcclxuICAgIC5zdHlsZShcImZvbnRcIiwgXCIxMHB4IHNhbnMtc2VyaWZcIik7XHJcblxyXG4gIGNvbnN0IGNlbGwgPSBzdmdcclxuICAgIC5zZWxlY3RBbGwoXCJnXCIpXHJcbiAgICAuZGF0YShyb290LmRlc2NlbmRhbnRzKCkpXHJcbiAgICAuam9pbihcImdcIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC55MH0sJHtkLngwfSlgKTtcclxuXHJcbiAgY29uc3QgcmVjdCA9IGNlbGxcclxuICAgIC5hcHBlbmQoXCJyZWN0XCIpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIChkKSA9PiBkLnkxIC0gZC55MCAtIDEpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCAoZCkgPT4gcmVjdEhlaWdodChkKSlcclxuICAgIC5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIDAuNilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4ge1xyXG4gICAgICBpZiAoIWQuZGVwdGgpIHJldHVybiBcIiNjY2NcIjtcclxuICAgICAgd2hpbGUgKGQuZGVwdGggPiAxKSBkID0gZC5wYXJlbnQ7XHJcbiAgICAgIHJldHVybiBjb2xvcihkLmRhdGEuZGF0YS5uYW1lKTtcclxuICAgIH0pXHJcbiAgICAuc3R5bGUoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpXHJcbiAgICAub24oXCJjbGlja1wiLCBjbGlja2VkKTtcclxuXHJcbiAgY29uc3QgdGV4dCA9IGNlbGxcclxuICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgICAuc3R5bGUoXCJ1c2VyLXNlbGVjdFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInhcIiwgNClcclxuICAgIC5hdHRyKFwieVwiLCAxMyk7XHJcbiAgLy8gLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgKGQpID0+ICtsYWJlbFZpc2libGUoZCkpO1xyXG5cclxuICB0ZXh0LmFwcGVuZChcInRzcGFuXCIpLnRleHQoKGQpID0+IGQuZGF0YS5kYXRhLm5hbWUpO1xyXG5cclxuICBjb25zdCB0c3BhbiA9IHRleHRcclxuICAgIC5hcHBlbmQoXCJ0c3BhblwiKVxyXG4gICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgKGQpID0+IChsYWJlbFZpc2libGUoZCkgPyAxIDogMCkgKiAwLjcpXHJcbiAgICAudGV4dCgoZCkgPT4gYCAke2Zvcm1hdChkLnZhbHVlKX1gKTtcclxuXHJcbiAgY2VsbC5hcHBlbmQoXCJ0aXRsZVwiKS50ZXh0KFxyXG4gICAgKGQpID0+XHJcbiAgICAgIGAke2QuYW5jZXN0b3JzKCkubWFwKChkKSA9PiBkLmRhdGEuZGF0YS5uYW1lKVxyXG4gICAgICAvLyAucmV2ZXJzZSgpXHJcbiAgICAgIC8vIC5qb2luKFwiL1wiKX1cXG4ke2Zvcm1hdChkLnZhbHVlKVxyXG4gICAgICB9YFxyXG4gICk7XHJcblxyXG4gIGZ1bmN0aW9uIGNsaWNrZWQoZXZlbnQsIHApIHtcclxuICAgIGNvbnNvbGUubG9nKHsgcCB9KTtcclxuICAgIGZvY3VzID0gZm9jdXMgPT09IHAgPyAocCA9IHAucGFyZW50KSA6IHA7XHJcblxyXG4gICAgcm9vdC5lYWNoKChkKSA9PiB7XHJcbiAgICAgIGQudGFyZ2V0ID0ge1xyXG4gICAgICAgIHgwOiAoKGQueDAgLSBwLngwKSAvIChwLngxIC0gcC54MCkpICogdmlld0hlaWdodCxcclxuICAgICAgICB4MTogKChkLngxIC0gcC54MCkgLyAocC54MSAtIHAueDApKSAqIHZpZXdIZWlnaHQsXHJcbiAgICAgICAgeTA6IGQueTAgLSBwLnkwLFxyXG4gICAgICAgIHkxOiBkLnkxIC0gcC55MCxcclxuICAgICAgfTtcclxuICAgICAgY29uc29sZS5sb2coZC50YXJnZXQueDApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdCA9IGNlbGxcclxuICAgICAgLnRyYW5zaXRpb24oKVxyXG4gICAgICAuZHVyYXRpb24oNzUwKVxyXG4gICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAoZCkgPT4gYHRyYW5zbGF0ZSgke2QudGFyZ2V0LnkwfSwke2QudGFyZ2V0LngwfSlgKTtcclxuXHJcbiAgICByZWN0LnRyYW5zaXRpb24odCkuYXR0cihcImhlaWdodFwiLCAoZCkgPT4gcmVjdEhlaWdodChkLnRhcmdldCkpO1xyXG4gICAgdGV4dC50cmFuc2l0aW9uKHQpLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgKGQpID0+ICtsYWJlbFZpc2libGUoZC50YXJnZXQpKTtcclxuICAgIHRzcGFuXHJcbiAgICAgIC50cmFuc2l0aW9uKHQpXHJcbiAgICAgIC5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIChkKSA9PiAobGFiZWxWaXNpYmxlKGQpID8gMSA6IDApICogMC43KTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHJlY3RIZWlnaHQoZCkge1xyXG4gICAgY29uc29sZS5sb2coeyBkIH0pO1xyXG4gICAgcmV0dXJuIGQueDEgLSBkLngwIC0gTWF0aC5taW4oMSwgKGQueDEgLSBkLngwKSAvIDIpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGFiZWxWaXNpYmxlKGQpIHtcclxuICAgIHJldHVybiBkLnkxIDw9IHdpZHRoICYmIGQueTAgPj0gMCAmJiBkLngxIC0gZC54MCA+IDE2O1xyXG4gIH1cclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRmc0ZsYXRBZGpMaXN0LCBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcblxyXG5leHBvcnQgY29uc3QgcmFkaWFsVHJlZSA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IGZsYXRBZGogPSBkZnNGbGF0QWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgZmxhdEFkaiB9KTtcclxuXHJcbiAgY29uc3QgaGllcmFyY2h5ID0gZDMuc3RyYXRpZnkoKShmbGF0QWRqKTtcclxuICBjb25zb2xlLmxvZyh7IGhpZXJhcmNoeSB9KTtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpO1xyXG5cclxuICBjb25zdCByb290ID0gZDNcclxuICAgIC5oaWVyYXJjaHkoaGllcmFyY2h5LCAoZCkgPT4gZC5jaGlsZHJlbilcclxuICAgIC5zdW0oKGQpID0+IChkLmNoaWxkcmVuID8gMCA6IDEpKVxyXG4gICAgLnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKTtcclxuXHJcbiAgY29uc3Qgb3V0ZXJSYWRpdXMgPSB3aWR0aCAvIDI7XHJcbiAgY29uc3QgaW5uZXJSYWRpdXMgPSBvdXRlclJhZGl1cyAtIDE3MDtcclxuXHJcbiAgY29uc3QgY2x1c3RlciA9IGQzXHJcbiAgICAuY2x1c3RlcigpXHJcbiAgICAuc2l6ZShbMzYwLCBpbm5lclJhZGl1c10pXHJcbiAgICAuc2VwYXJhdGlvbigoYSwgYikgPT4gMSk7XHJcblxyXG4gIGNvbnN0IGNvbG9yID0gZDNcclxuICAgIC5zY2FsZU9yZGluYWwoKVxyXG4gICAgLmRvbWFpbihncmFwaC5ub2RlcygpKVxyXG4gICAgLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApO1xyXG5cclxuICBmdW5jdGlvbiBtYXhMZW5ndGgoZDogZDMuSGllcmFyY2h5Tm9kZTx1bmtub3duPikge1xyXG4gICAgcmV0dXJuIGQuZGF0YS5kYXRhLmRlcHRoICsgKGQuY2hpbGRyZW4gPyBkMy5tYXgoZC5jaGlsZHJlbiwgbWF4TGVuZ3RoKSA6IDApO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gc2V0UmFkaXVzKGQ6IGQzLkhpZXJhcmNoeU5vZGU8dW5rbm93bj4sIHkwOiBudW1iZXIsIGs6IG51bWJlcikge1xyXG4gICAgZC5yYWRpdXMgPSAoeTAgKz0gZC5kYXRhLmRhdGEuZGVwdGgpICogaztcclxuICAgIGlmIChkLmNoaWxkcmVuKSBkLmNoaWxkcmVuLmZvckVhY2goKGQpID0+IHNldFJhZGl1cyhkLCB5MCwgaykpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gc2V0Q29sb3IoZDogZDMuSGllcmFyY2h5Tm9kZTx1bmtub3duPikge1xyXG4gICAgdmFyIG5hbWUgPSBkLmRhdGEuZGF0YS5uYW1lO1xyXG4gICAgZC5jb2xvciA9XHJcbiAgICAgIGNvbG9yLmRvbWFpbigpLmluZGV4T2YobmFtZSkgPj0gMFxyXG4gICAgICAgID8gY29sb3IobmFtZSlcclxuICAgICAgICA6IGQucGFyZW50XHJcbiAgICAgICAgICA/IGQucGFyZW50LmNvbG9yXHJcbiAgICAgICAgICA6IG51bGw7XHJcbiAgICBpZiAoZC5jaGlsZHJlbikgZC5jaGlsZHJlbi5mb3JFYWNoKHNldENvbG9yKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxpbmtWYXJpYWJsZShkKSB7XHJcbiAgICByZXR1cm4gbGlua1N0ZXAoZC5zb3VyY2UueCwgZC5zb3VyY2UucmFkaXVzLCBkLnRhcmdldC54LCBkLnRhcmdldC5yYWRpdXMpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGlua0NvbnN0YW50KGQpIHtcclxuICAgIHJldHVybiBsaW5rU3RlcChkLnNvdXJjZS54LCBkLnNvdXJjZS55LCBkLnRhcmdldC54LCBkLnRhcmdldC55KTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxpbmtFeHRlbnNpb25WYXJpYWJsZShkKSB7XHJcbiAgICByZXR1cm4gbGlua1N0ZXAoZC50YXJnZXQueCwgZC50YXJnZXQucmFkaXVzLCBkLnRhcmdldC54LCBpbm5lclJhZGl1cyk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsaW5rRXh0ZW5zaW9uQ29uc3RhbnQoZCkge1xyXG4gICAgcmV0dXJuIGxpbmtTdGVwKGQudGFyZ2V0LngsIGQudGFyZ2V0LnksIGQudGFyZ2V0LngsIGlubmVyUmFkaXVzKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxpbmtTdGVwKFxyXG4gICAgc3RhcnRBbmdsZTogbnVtYmVyLFxyXG4gICAgc3RhcnRSYWRpdXM6IG51bWJlcixcclxuICAgIGVuZEFuZ2xlOiBudW1iZXIsXHJcbiAgICBlbmRSYWRpdXM6IG51bWJlclxyXG4gICkge1xyXG4gICAgY29uc3QgYzAgPSBNYXRoLmNvcygoc3RhcnRBbmdsZSA9ICgoc3RhcnRBbmdsZSAtIDkwKSAvIDE4MCkgKiBNYXRoLlBJKSk7XHJcbiAgICBjb25zdCBzMCA9IE1hdGguc2luKHN0YXJ0QW5nbGUpO1xyXG4gICAgY29uc3QgYzEgPSBNYXRoLmNvcygoZW5kQW5nbGUgPSAoKGVuZEFuZ2xlIC0gOTApIC8gMTgwKSAqIE1hdGguUEkpKTtcclxuICAgIGNvbnN0IHMxID0gTWF0aC5zaW4oZW5kQW5nbGUpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgXCJNXCIgK1xyXG4gICAgICBzdGFydFJhZGl1cyAqIGMwICtcclxuICAgICAgXCIsXCIgK1xyXG4gICAgICBzdGFydFJhZGl1cyAqIHMwICtcclxuICAgICAgKGVuZEFuZ2xlID09PSBzdGFydEFuZ2xlXHJcbiAgICAgICAgPyBcIlwiXHJcbiAgICAgICAgOiBcIkFcIiArXHJcbiAgICAgICAgc3RhcnRSYWRpdXMgK1xyXG4gICAgICAgIFwiLFwiICtcclxuICAgICAgICBzdGFydFJhZGl1cyArXHJcbiAgICAgICAgXCIgMCAwIFwiICtcclxuICAgICAgICAoZW5kQW5nbGUgPiBzdGFydEFuZ2xlID8gMSA6IDApICtcclxuICAgICAgICBcIiBcIiArXHJcbiAgICAgICAgc3RhcnRSYWRpdXMgKiBjMSArXHJcbiAgICAgICAgXCIsXCIgK1xyXG4gICAgICAgIHN0YXJ0UmFkaXVzICogczEpICtcclxuICAgICAgXCJMXCIgK1xyXG4gICAgICBlbmRSYWRpdXMgKiBjMSArXHJcbiAgICAgIFwiLFwiICtcclxuICAgICAgZW5kUmFkaXVzICogczFcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBsZWdlbmQgPSAoc3ZnKSA9PiB7XHJcbiAgICBjb25zdCBnID0gc3ZnXHJcbiAgICAgIC5zZWxlY3RBbGwoXCJnXCIpXHJcbiAgICAgIC5kYXRhKGNvbG9yLmRvbWFpbigpKVxyXG4gICAgICAuam9pbihcImdcIilcclxuICAgICAgLmF0dHIoXHJcbiAgICAgICAgXCJ0cmFuc2Zvcm1cIixcclxuICAgICAgICAoZCwgaSkgPT4gYHRyYW5zbGF0ZSgkey1vdXRlclJhZGl1c30sJHstb3V0ZXJSYWRpdXMgKyBpICogMjB9KWBcclxuICAgICAgKTtcclxuXHJcbiAgICBnLmFwcGVuZChcInJlY3RcIikuYXR0cihcIndpZHRoXCIsIDE4KS5hdHRyKFwiaGVpZ2h0XCIsIDE4KS5hdHRyKFwiZmlsbFwiLCBjb2xvcik7XHJcblxyXG4gICAgZy5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgICAgIC5hdHRyKFwieFwiLCAyNClcclxuICAgICAgLmF0dHIoXCJ5XCIsIDkpXHJcbiAgICAgIC5hdHRyKFwiZHlcIiwgXCIwLjM1ZW1cIilcclxuICAgICAgLnRleHQoKGQpID0+IGQpO1xyXG4gIH07XHJcblxyXG4gIGNsdXN0ZXIocm9vdCk7XHJcbiAgc2V0UmFkaXVzKHJvb3QsIChyb290LmRhdGEuZGF0YS5kZXB0aCA9IDApLCBpbm5lclJhZGl1cyAvIG1heExlbmd0aChyb290KSk7XHJcbiAgc2V0Q29sb3Iocm9vdCk7XHJcblxyXG4gIHN2Zy5hcHBlbmQoXCJnXCIpLmNhbGwobGVnZW5kKTtcclxuXHJcbiAgc3ZnLmFwcGVuZChcInN0eWxlXCIpLnRleHQoYFxyXG5cclxuLmxpbmstLWFjdGl2ZSB7XHJcbnN0cm9rZTogIzAwMCAhaW1wb3J0YW50O1xyXG5zdHJva2Utd2lkdGg6IDEuNXB4O1xyXG59XHJcblxyXG4ubGluay1leHRlbnNpb24tLWFjdGl2ZSB7XHJcbnN0cm9rZS1vcGFjaXR5OiAuNjtcclxufVxyXG5cclxuLmxhYmVsLS1hY3RpdmUge1xyXG5mb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuYCk7XHJcblxyXG4gIGNvbnN0IGxpbmtFeHRlbnNpb24gPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcIiMwMDBcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLW9wYWNpdHlcIiwgMC4yNSlcclxuICAgIC5zZWxlY3RBbGwoXCJwYXRoXCIpXHJcbiAgICAuZGF0YShyb290LmxpbmtzKCkuZmlsdGVyKChkKSA9PiAhZC50YXJnZXQuY2hpbGRyZW4pKVxyXG4gICAgLmpvaW4oXCJwYXRoXCIpXHJcbiAgICAuZWFjaChmdW5jdGlvbiAoZCkge1xyXG4gICAgICBkLnRhcmdldC5saW5rRXh0ZW5zaW9uTm9kZSA9IHRoaXM7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJkXCIsIGxpbmtFeHRlbnNpb25Db25zdGFudCk7XHJcblxyXG4gIGNvbnN0IGxpbmsgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcIiMwMDBcIilcclxuICAgIC5zZWxlY3RBbGwoXCJwYXRoXCIpXHJcbiAgICAuZGF0YShyb290LmxpbmtzKCkpXHJcbiAgICAuam9pbihcInBhdGhcIilcclxuICAgIC5lYWNoKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIGQudGFyZ2V0LmxpbmtOb2RlID0gdGhpcztcclxuICAgIH0pXHJcbiAgICAuYXR0cihcImRcIiwgbGlua0NvbnN0YW50KVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgKGQpID0+IGQudGFyZ2V0LmNvbG9yKTtcclxuXHJcbiAgY29uc3QgbGFiZWwgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwidGV4dFwiKVxyXG4gICAgLmRhdGEocm9vdC5sZWF2ZXMoKSlcclxuICAgIC5qb2luKFwidGV4dFwiKVxyXG4gICAgLmF0dHIoXCJkeVwiLCBcIi4zMWVtXCIpXHJcbiAgICAuYXR0cihcclxuICAgICAgXCJ0cmFuc2Zvcm1cIixcclxuICAgICAgKGQpID0+XHJcbiAgICAgICAgYHJvdGF0ZSgke2QueCAtIDkwfSkgdHJhbnNsYXRlKCR7aW5uZXJSYWRpdXMgKyA0fSwwKSR7ZC54IDwgMTgwID8gXCJcIiA6IFwiIHJvdGF0ZSgxODApXCJcclxuICAgICAgICB9YFxyXG4gICAgKVxyXG4gICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCAoZCkgPT4gKGQueCA8IDE4MCA/IFwic3RhcnRcIiA6IFwiZW5kXCIpKVxyXG4gICAgLnRleHQoKGQpID0+IGQuZGF0YS5kYXRhLm5hbWUpXHJcbiAgICAub24oXCJtb3VzZW92ZXJcIiwgbW91c2VvdmVyZWQodHJ1ZSkpXHJcbiAgICAub24oXCJtb3VzZW91dFwiLCBtb3VzZW92ZXJlZChmYWxzZSkpO1xyXG5cclxuICAvLyAgIGZ1bmN0aW9uIHVwZGF0ZShjaGVja2VkKSB7XHJcbiAgLy8gICAgIGNvbnN0IHQgPSBkMy50cmFuc2l0aW9uKCkuZHVyYXRpb24oNzUwKTtcclxuICAvLyAgICAgbGlua0V4dGVuc2lvblxyXG4gIC8vICAgICAgIC50cmFuc2l0aW9uKHQpXHJcbiAgLy8gICAgICAgLmF0dHIoXCJkXCIsIGNoZWNrZWQgPyBsaW5rRXh0ZW5zaW9uVmFyaWFibGUgOiBsaW5rRXh0ZW5zaW9uQ29uc3RhbnQpO1xyXG4gIC8vICAgICBsaW5rLnRyYW5zaXRpb24odCkuYXR0cihcImRcIiwgY2hlY2tlZCA/IGxpbmtWYXJpYWJsZSA6IGxpbmtDb25zdGFudCk7XHJcbiAgLy8gICB9XHJcblxyXG4gIGZ1bmN0aW9uIG1vdXNlb3ZlcmVkKGFjdGl2ZSkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgZCkge1xyXG4gICAgICBkMy5zZWxlY3QodGhpcykuY2xhc3NlZChcImxhYmVsLS1hY3RpdmVcIiwgYWN0aXZlKTtcclxuICAgICAgZDMuc2VsZWN0KGQubGlua0V4dGVuc2lvbk5vZGUpXHJcbiAgICAgICAgLmNsYXNzZWQoXCJsaW5rLWV4dGVuc2lvbi0tYWN0aXZlXCIsIGFjdGl2ZSlcclxuICAgICAgICAucmFpc2UoKTtcclxuICAgICAgZG8gZDMuc2VsZWN0KGQubGlua05vZGUpLmNsYXNzZWQoXCJsaW5rLS1hY3RpdmVcIiwgYWN0aXZlKS5yYWlzZSgpO1xyXG4gICAgICB3aGlsZSAoKGQgPSBkLnBhcmVudCkpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHpvb21lZCh7IHRyYW5zZm9ybSB9KSB7XHJcbiAgICBsaW5rRXh0ZW5zaW9uLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICAgIGxpbmsuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gICAgbGFiZWwuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gIH1cclxuICBzdmcuY2FsbChcclxuICAgIGQzXHJcbiAgICAgIC56b29tKClcclxuICAgICAgLmV4dGVudChbXHJcbiAgICAgICAgWzAsIDBdLFxyXG4gICAgICAgIFt3aWR0aCwgaGVpZ2h0XSxcclxuICAgICAgXSlcclxuICAgICAgLnNjYWxlRXh0ZW50KFswLjUsIDhdKVxyXG4gICAgICAub24oXCJ6b29tXCIsIHpvb21lZClcclxuICApO1xyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcbmltcG9ydCB7IGRmc0ZsYXRBZGpMaXN0IH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBzdW5idXJzdCA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IGZsYXRBZGogPSBkZnNGbGF0QWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgZmxhdEFkaiB9KTtcclxuXHJcbiAgY29uc3QgaGllcmFyY2h5ID0gZDMuc3RyYXRpZnkoKShmbGF0QWRqKTtcclxuICBjb25zb2xlLmxvZyh7IGhpZXJhcmNoeSB9KTtcclxuXHJcbiAgdmFyIHJhZGl1cyA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjsgLy8gPCAtLSAyXHJcbiAgdmFyIGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApO1xyXG5cclxuICB2YXIgZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwic3ZnXCIpIC8vIDwtLSAxXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKSAvLyA8LS0gMlxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmFwcGVuZChcImdcIikgLy8gPC0tIDNcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgd2lkdGggLyAyICsgXCIsXCIgKyBoZWlnaHQgLyAyICsgXCIpXCIpOyAvLyA8LS0gNFxyXG5cclxuICB2YXIgZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwic3ZnXCIpIC8vIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIDxzdmc+IGVsZW1lbnRcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpIC8vIHNldHMgdGhlIHdpZHRoIG9mIDxzdmc+IGFuZCB0aGVuIHJldHVybnMgdGhlIDxzdmc+IGVsZW1lbnQgYWdhaW5cclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodCkgLy8gKHNhbWUgYXMgd2lkdGgpXHJcbiAgICAuYXBwZW5kKFwiZ1wiKSAvLyBhZGRzIGEgPGc+IGVsZW1lbnQgdG8gdGhlIDxzdmc+IGVsZW1lbnQuIEl0IHJldHVybnMgdGhlIDxnPiBlbGVtZW50XHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIHdpZHRoIC8gMiArIFwiLFwiICsgaGVpZ2h0IC8gMiArIFwiKVwiKTsgLy8gdGFrZXMgdGhlIDxnPiBlbGVtZW50IGFuZCBtb3ZlcyB0aGUgWzAsMF0gY2VudGVyIG92ZXIgYW5kIGRvd25cclxuXHJcbiAgdmFyIGcgPSBkM1xyXG4gICAgLnNlbGVjdChcInN2Z1wiKSAvLyAtLT4gPHN2Zz48L3N2Zz5cclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpIC8vIC0tPiA8c3ZnIHdpZHRoPVwiNTAwXCI+PC9zdmc+XHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpIC8vIC0tPiA8c3ZnIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiNTAwXCI+PC9zdmc+XHJcbiAgICAuYXBwZW5kKFwiZ1wiKSAvLyAtLT4gPHN2ZyB3aWR0aD1cIjUwMFwiIGhlaWdodD1cIjUwMFwiPjxnPjwvZz48L3N2Zz5cclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgd2lkdGggLyAyICsgXCIsXCIgKyBoZWlnaHQgLyAyICsgXCIpXCIpOyAvLyAtLT4gPHN2ZyB3aWR0aD1cIjUwMFwiIGhlaWdodD1cIjUwMFwiPjxnIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyNTAsMjUwKVwiPjwvZz48L3N2Zz5cclxuXHJcbiAgdmFyIHBhcnRpdGlvbiA9IGQzXHJcbiAgICAucGFydGl0aW9uKCkgLy8gPC0tIDFcclxuICAgIC5zaXplKFsyICogTWF0aC5QSSwgcmFkaXVzXSk7IC8vIDwtLSAyXHJcblxyXG4gIHZhciByb290ID0gZDNcclxuICAgIC5oaWVyYXJjaHkoaGllcmFyY2h5KSAvLyA8LS0gMVxyXG4gICAgLnN1bShmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC5oZWlnaHQ7XHJcbiAgICB9KTsgLy8gPC0tIDJcclxuXHJcbiAgcGFydGl0aW9uKHJvb3QpOyAvLyA8LS0gMVxyXG4gIHZhciBhcmMgPSBkM1xyXG4gICAgLmFyYygpIC8vIDwtLSAyXHJcbiAgICAuc3RhcnRBbmdsZShmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC54MDtcclxuICAgIH0pXHJcbiAgICAuZW5kQW5nbGUoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQueDE7XHJcbiAgICB9KVxyXG4gICAgLmlubmVyUmFkaXVzKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLnkwO1xyXG4gICAgfSlcclxuICAgIC5vdXRlclJhZGl1cyhmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC55MTtcclxuICAgIH0pO1xyXG5cclxuICBnLnNlbGVjdEFsbChcInBhdGhcIikgLy8gPC0tIDFcclxuICAgIC5kYXRhKHJvb3QuZGVzY2VuZGFudHMoKSkgLy8gPC0tIDJcclxuICAgIC5lbnRlcigpIC8vIDwtLSAzXHJcbiAgICAuYXBwZW5kKFwicGF0aFwiKSAvLyA8LS0gNFxyXG4gICAgLmF0dHIoXCJkaXNwbGF5XCIsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLmRlcHRoID8gbnVsbCA6IFwibm9uZVwiO1xyXG4gICAgfSkgLy8gPC0tIDVcclxuICAgIC5hdHRyKFwiZFwiLCBhcmMpIC8vIDwtLSA2XHJcbiAgICAuc3R5bGUoXCJzdHJva2VcIiwgXCIjZmZmXCIpIC8vIDwtLSA3XHJcbiAgICAuc3R5bGUoXCJmaWxsXCIsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBjb2xvcigoZC5jaGlsZHJlbiA/IGQgOiBkLnBhcmVudCkuZGF0YS5uYW1lKTtcclxuICAgIH0pOyAvLyA8LS0gOFxyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgb3Blbk9yU3dpdGNoIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCB0aWR5VHJlZSA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIC8vIGNvbnN0IGFkakxpc3Q6IEFkakxpc3RJdGVtW10gPSBiZnNBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgLy8gY29uc29sZS5sb2coeyBhZGpMaXN0IH0pO1xyXG5cclxuICAvLyBjb25zdCBub0RvdWJsZXMgPSBbLi4uYWRqTGlzdF07XHJcbiAgLy8gbm9Eb3VibGVzLmZvckVhY2goKGEsIGksIGxpc3QpID0+IHtcclxuICAvLyAgIGlmIChsaXN0LnNvbWUoKGIsIGopID0+IGkgIT09IGogJiYgYS5wYXJlbnRJZCA9PT0gYi5wYXJlbnRJZCkpIHtcclxuICAvLyAgICAgbm9Eb3VibGVzLnNwbGljZShpLCAxKTtcclxuICAvLyAgIH1cclxuICAvLyB9KTtcclxuICAvLyBjb25zb2xlLmxvZyh7IG5vRG91YmxlcyB9KTtcclxuXHJcbiAgY29uc3QgdHJlZSA9IChkYXRhKSA9PiB7XHJcbiAgICBjb25zdCByb290ID0gZDMuaGllcmFyY2h5KGRhdGEpO1xyXG4gICAgcm9vdC5keCA9IDEwO1xyXG4gICAgcm9vdC5keSA9IHdpZHRoIC8gKHJvb3QuaGVpZ2h0ICsgMSk7XHJcbiAgICByZXR1cm4gZDMudHJlZSgpLm5vZGVTaXplKFtyb290LmR4LCByb290LmR5XSkocm9vdCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICBjb25zdCByb290ID0gdHJlZShoaWVyYXJjaHkpO1xyXG4gIGNvbnNvbGUubG9nKHJvb3QpO1xyXG5cclxuICBsZXQgeDAgPSBJbmZpbml0eTtcclxuICBsZXQgeDEgPSAteDA7XHJcbiAgcm9vdC5lYWNoKChkKSA9PiB7XHJcbiAgICBpZiAoZC54ID4geDEpIHgxID0gZC54O1xyXG4gICAgaWYgKGQueCA8IHgwKSB4MCA9IGQueDtcclxuICB9KTtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpO1xyXG5cclxuICBjb25zdCBnID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJmb250LWZhbWlseVwiLCBcInNhbnMtc2VyaWZcIilcclxuICAgIC5hdHRyKFwiZm9udC1zaXplXCIsIDEwKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgYHRyYW5zbGF0ZSgke3Jvb3QuZHkgLyAzfSwke3Jvb3QuZHggLSB4MH0pYCk7XHJcblxyXG4gIGNvbnN0IGxpbmsgPSBnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCIjNTU1XCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1vcGFjaXR5XCIsIDAuNClcclxuICAgIC5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDEuNSlcclxuICAgIC5zZWxlY3RBbGwoXCJwYXRoXCIpXHJcbiAgICAuZGF0YShyb290LmxpbmtzKCkpXHJcbiAgICAuam9pbihcInBhdGhcIilcclxuICAgIC5hdHRyKFxyXG4gICAgICBcImRcIixcclxuICAgICAgZDNcclxuICAgICAgICAubGlua0hvcml6b250YWwoKVxyXG4gICAgICAgIC54KChkKSA9PiBkLnkpXHJcbiAgICAgICAgLnkoKGQpID0+IGQueClcclxuICAgICk7XHJcblxyXG4gIGNvbnN0IG5vZGUgPSBnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJzdHJva2UtbGluZWpvaW5cIiwgXCJyb3VuZFwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMTApXHJcbiAgICAuc2VsZWN0QWxsKFwiZ1wiKVxyXG4gICAgLmRhdGEocm9vdC5kZXNjZW5kYW50cygpKVxyXG4gICAgLmpvaW4oXCJnXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAoZCkgPT4gYHRyYW5zbGF0ZSgke2QueX0sJHtkLnh9KWApO1xyXG5cclxuICBub2RlXHJcbiAgICAuYXBwZW5kKFwiY2lyY2xlXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgKGQpID0+IChkLmNoaWxkcmVuID8gXCIjNTU1XCIgOiBcIiM5OTlcIikpXHJcbiAgICAuYXR0cihcInJcIiwgMTApO1xyXG5cclxuICBub2RlLmF0dHIoXCJhcmlhLWxhYmVsXCIsIChkKSA9PiB7XHJcbiAgICBjb25zb2xlLmxvZyhkKTtcclxuICAgIHJldHVybiBkLmRhdGEuZGF0YS5uYW1lO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBub2RlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRlc3Q6IHN0cmluZykgPT4ge1xyXG4gICAgb3Blbk9yU3dpdGNoKGRlc3QsIGV2ZW50KTtcclxuICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgfTtcclxuICBub2RlLm9uKFwiY2xpY2tcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkKSA9PiB7XHJcbiAgICBjb25zb2xlLmxvZyh7IGQgfSk7XHJcbiAgICBub2RlQ2xpY2soZXZlbnQsIGQuZGF0YS5kYXRhLm5hbWUpO1xyXG4gIH0pO1xyXG5cclxuICBub2RlXHJcbiAgICAuYXBwZW5kKFwidGV4dFwiKVxyXG4gICAgLmF0dHIoXCJkeVwiLCBcIjAuMzFlbVwiKVxyXG4gICAgLmF0dHIoXCJ4XCIsIChkKSA9PiAoZC5jaGlsZHJlbiA/IC02IDogNikpXHJcbiAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIChkKSA9PiAoZC5jaGlsZHJlbiA/IFwiZW5kXCIgOiBcInN0YXJ0XCIpKVxyXG4gICAgLnRleHQoKGQpID0+IGQuZGF0YS5kYXRhLm5hbWUpXHJcbiAgICAuY2xvbmUodHJ1ZSlcclxuICAgIC5sb3dlcigpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcIndoaXRlXCIpO1xyXG5cclxuICBmdW5jdGlvbiB6b29tZWQoeyB0cmFuc2Zvcm0gfSkge1xyXG4gICAgc3ZnLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICB9XHJcbiAgc3ZnLmNhbGwoXHJcbiAgICBkM1xyXG4gICAgICAuem9vbSgpXHJcbiAgICAgIC5leHRlbnQoW1xyXG4gICAgICAgIFswLCAwXSxcclxuICAgICAgICBbd2lkdGgsIGhlaWdodF0sXHJcbiAgICAgIF0pXHJcbiAgICAgIC5zY2FsZUV4dGVudChbMC41LCA4XSlcclxuICAgICAgLm9uKFwiem9vbVwiLCB6b29tZWQpXHJcbiAgKTtcclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IG9wZW5PclN3aXRjaCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbmltcG9ydCB0eXBlIHsgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5pbXBvcnQgeyBkZnNGbGF0QWRqTGlzdCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcblxyXG5leHBvcnQgY29uc3QgdHJlZU1hcCA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IGZsYXRBZGogPSBkZnNGbGF0QWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgZmxhdEFkaiB9KTtcclxuXHJcbiAgY29uc3QgaGllcmFyY2h5ID0gZDMuc3RyYXRpZnkoKShmbGF0QWRqKTtcclxuICBjb25zb2xlLmxvZyh7IGhpZXJhcmNoeSB9KTtcclxuXHJcbiAgY29uc3Qgcm9vdCA9IGQzXHJcbiAgICAudHJlZW1hcCgpXHJcbiAgICAudGlsZShkMy50cmVlbWFwQmluYXJ5KVxyXG4gICAgLnNpemUoW3dpZHRoLCBoZWlnaHRdKVxyXG4gICAgLnBhZGRpbmcoMSlcclxuICAgIC5yb3VuZCh0cnVlKShcclxuICAgICAgaGllcmFyY2h5LnN1bSgoZCkgPT4gZC5oZWlnaHQpLnNvcnQoKGEsIGIpID0+IGIuaGVpZ2h0IC0gYS5oZWlnaHQpXHJcbiAgICApO1xyXG5cclxuICAvLyAgIGNvbnN0IHJvb3QgPSB0cmVlbWFwKGRhdGEpO1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aClcclxuICAgIC5zdHlsZShcImZvbnRcIiwgXCIxMHB4IHNhbnMtc2VyaWZcIik7XHJcblxyXG4gIGNvbnN0IGxlYWYgPSBzdmdcclxuICAgIC5zZWxlY3RBbGwoXCJnXCIpXHJcbiAgICAuZGF0YShyb290LmxlYXZlcygpKVxyXG4gICAgLmpvaW4oXCJnXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAoZCkgPT4gYHRyYW5zbGF0ZSgke2QueDB9LCR7ZC55MH0pYCk7XHJcblxyXG4gIGxlYWYuYXR0cihcImFyaWEtbGFiZWxcIiwgKGQpID0+IGQuZGF0YS5uYW1lKTtcclxuXHJcbiAgLy8gICBsZWFmLmFwcGVuZChcInRpdGxlXCIpLnRleHQoXHJcbiAgLy8gICAgIChkKSA9PlxyXG4gIC8vICAgICAgIGAke2RcclxuICAvLyAgICAgICAgIC5hbmNlc3RvcnMoKVxyXG4gIC8vICAgICAgICAgLnJldmVyc2UoKVxyXG4gIC8vICAgICAgICAgLm1hcCgoZCkgPT4gZC5kYXRhLmlkKVxyXG4gIC8vICAgICAgICAgLmpvaW4oXCIvXCIpfVxcbiR7Zm9ybWF0KGQuaGVpZ2h0KX1gXHJcbiAgLy8gICApO1xyXG5cclxuICBjb25zdCBjb2xvciA9IGQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKTtcclxuXHJcbiAgbGVhZlxyXG4gICAgLmFwcGVuZChcInJlY3RcIilcclxuICAgIC8vIC5hdHRyKFwiaWRcIiwgKGQpID0+IChkLmxlYWZVaWQgPSBET00udWlkKFwibGVhZlwiKSkuaWQpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgKGQpID0+IHtcclxuICAgICAgd2hpbGUgKGQuZGVwdGggPiAxKSBkID0gZC5wYXJlbnQ7XHJcbiAgICAgIHJldHVybiBjb2xvcihkLmRhdGEuaWQpO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIDAuNilcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgKGQpID0+IGQueDEgLSBkLngwKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgKGQpID0+IGQueTEgLSBkLnkwKTtcclxuXHJcbiAgbGVhZlxyXG4gICAgLmFwcGVuZChcImNsaXBQYXRoXCIpXHJcbiAgICAvLyAuYXR0cihcImlkXCIsIChkKSA9PiAoZC5jbGlwVWlkID0gRE9NLnVpZChcImNsaXBcIikpLmlkKVxyXG4gICAgLmFwcGVuZChcInVzZVwiKTtcclxuICAvLyAuYXR0cihcInhsaW5rOmhyZWZcIiwgKGQpID0+IGQubGVhZlVpZC5ocmVmKTtcclxuXHJcbiAgLy8gICBsZWFmXHJcbiAgLy8gICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgLy8gICAgIC5hdHRyKFwiY2xpcC1wYXRoXCIsIChkKSA9PiBkLmNsaXBVaWQpXHJcbiAgLy8gICAgIC5zZWxlY3RBbGwoXCJ0c3BhblwiKVxyXG4gIC8vICAgICAuZGF0YSgoZCkgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUubG9nKHsgZCB9KTtcclxuICAvLyAgICAgICByZXR1cm4gZC5kYXRhLm5hbWUuc3BsaXQoLyg/PVtBLVpdW15BLVpdKS9nKS5jb25jYXQoZm9ybWF0KGQuaGVpZ2h0KSk7XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIC5qb2luKFwidHNwYW5cIilcclxuICAvLyAgICAgLmF0dHIoXCJ4XCIsIDMpXHJcbiAgLy8gICAgIC5hdHRyKFxyXG4gIC8vICAgICAgIFwieVwiLFxyXG4gIC8vICAgICAgIChkLCBpLCBub2RlcykgPT4gYCR7KGkgPT09IG5vZGVzLmxlbmd0aCAtIDEpICogMC4zICsgMS4xICsgaSAqIDAuOX1lbWBcclxuICAvLyAgICAgKVxyXG4gIC8vICAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAoZCwgaSwgbm9kZXMpID0+XHJcbiAgLy8gICAgICAgaSA9PT0gbm9kZXMubGVuZ3RoIC0gMSA/IDAuNyA6IG51bGxcclxuICAvLyAgICAgKTtcclxuICAvLyAgIC8vIC50ZXh0KChkKSA9PiBkKTtcclxuXHJcbiAgY29uc3Qgbm9kZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBkZXN0OiBzdHJpbmcpID0+IHtcclxuICAgIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCk7XHJcbiAgICBtb2RhbC5jbG9zZSgpO1xyXG4gIH07XHJcbiAgbGVhZi5vbihcImNsaWNrXCIsIChldmVudDogTW91c2VFdmVudCwgZCkgPT4ge1xyXG4gICAgY29uc29sZS5sb2coeyBkIH0pO1xyXG4gICAgbm9kZUNsaWNrKGV2ZW50LCBkLmRhdGEubmFtZSk7XHJcbiAgfSk7XHJcblxyXG4gIGZ1bmN0aW9uIHpvb21lZCh7IHRyYW5zZm9ybSB9KSB7XHJcbiAgICBzdmcuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gIH1cclxuICBzdmcuY2FsbChcclxuICAgIGQzXHJcbiAgICAgIC56b29tKClcclxuICAgICAgLmV4dGVudChbXHJcbiAgICAgICAgWzAsIDBdLFxyXG4gICAgICAgIFt3aWR0aCwgaGVpZ2h0XSxcclxuICAgICAgXSlcclxuICAgICAgLnNjYWxlRXh0ZW50KFswLjUsIDhdKVxyXG4gICAgICAub24oXCJ6b29tXCIsIHpvb21lZClcclxuICApO1xyXG59O1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7SUFBQSwyQ0FBQSxPQUFBLFNBQUE7QUFDQSxVQUFBLE9BQUEsWUFBQSxZQUFBLE9BQUEsWUFBQTtBQUNBLGdCQUFBLFVBQUEsUUFBQTtlQUNBLE9BQUEsV0FBQSxjQUFBLE9BQUE7QUFDQSxlQUFBLENBQUEsR0FBQSxPQUFBO2VBQ0EsT0FBQSxZQUFBO0FBQ0EsZ0JBQUEsYUFBQSxRQUFBOztBQUVBLGNBQUEsYUFBQSxRQUFBO0lBQ0EsR0FBQyxPQUFBLFNBQUEsY0FB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O1VBQ0EsT0FBQztBQUNELGdCQUFBLFFBQUEsVUFBQSxPQUFBO0FBQ0EsdUJBQUEsU0FBQTtBQUNBLG1CQUFBLFNBQUEsSUFBQSxVQUFBO0FBQ0EsbUJBQUEsSUFBQSxPQUFBLFFBQUE7QUFDQSxxQkFBQTtZQUNBO0FBQ0EsbUJBQUEsU0FBQSxJQUFBO0FBQ0EscUJBQUEsVUFBQSxJQUFBLEtBQUEsSUFBQSxHQUFBLFNBQUEsQ0FBQTtZQUNBO0FBQ0Esa0JBQUEsU0FBQSxJQUFBO0FBQ0EscUJBQUEsVUFBQSxJQUFBLEtBQUE7WUFDQTtVQUNBO0FBRUEsa0JBQUEsVUFBQTtZQUNBLEtBQUE7WUFDQSxLQUFBO1lBQ0E7WUFDQTtZQUNBO1VBQ0E7OztBQzVEQSxjQUFBLGtCQUFBLG9CQUFBLHVEQUFBO0FBQ0EsY0FBQSxZQUFBLG9CQUFBLCtDQUFBO0FBRUEsY0FBQSxXQUFBLGdCQUFBLFVBQUE7QUFDQSxjQUFBLGlCQUFBLE1BQUE7QUFHQSxrQkFBQSxVQUFBLFNBQUEsSUFBQTtBQUNBLG1CQUFBLE9BQUEsVUFBQSxXQUFBLFVBQUEsTUFBQSxlQUFBLGNBQUE7VUFDQTs7O0FDVEEsY0FBQSxRQUFBLG9CQUFBLDJDQUFBO0FBRUEsY0FBQSxjQUFBO0FBRUEsY0FBQSxXQUFBLFNBQUEsU0FBQSxXQUFBO0FBQ0EsZ0JBQUEsUUFBQSxLQUFBLFdBQUEsT0FBQTtBQUNBLG1CQUFBLFNBQUEsV0FBQSxPQUNBLFNBQUEsU0FBQSxRQUNBLE9BQUEsYUFBQSxhQUFBLE1BQUEsU0FBQSxJQUNBLENBQUEsQ0FBQTtVQUNBO0FBRUEsY0FBQSxhQUFBLFNBQUEsWUFBQSxTQUFBLFFBQUE7QUFDQSxtQkFBQSxPQUFBLE1BQUEsRUFBQSxRQUFBLGFBQUEsR0FBQSxFQUFBLFlBQUE7VUFDQTtBQUVBLGNBQUEsT0FBQSxTQUFBLE9BQUEsQ0FBQTtBQUNBLGNBQUEsU0FBQSxTQUFBLFNBQUE7QUFDQSxjQUFBLFdBQUEsU0FBQSxXQUFBO0FBRUEsa0JBQUEsVUFBQTs7O0FDcEJBLGtCQUFBLFVBQUEsU0FBQSxJQUFBO0FBQ0Es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QUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQzFFLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUNoRCxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDaEQsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQ25DLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUN0QixRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFDdEIsUUFBUTtBQUFBLFFBRVIsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQzFCLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7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QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7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YUFBYTtBQUFBLEVBQ2IsZ0JBQWdCO0FBQUEsRUFDaEIsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osY0FBYztBQUFBLEVBQ2QsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsWUFBWTtBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBLEVBQ1YsZUFBZTtBQUFBLEVBQ2YsV0FBVztBQUFBLEVBQ1gsY0FBYztBQUFBLEVBQ2QsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsc0JBQXNCO0FBQUEsRUFDdEIsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsZUFBZTtBQUFBLEVBQ2YsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1Isa0JBQWtCO0FBQUEsRUFDbEIsWUFBWTtBQUFBLEVBQ1osY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsaUJBQWlCO0FBQUEsRUFDakIsbUJBQW1CO0FBQUEsRUFDbkIsaUJBQWlCO0FBQUEsRUFDakIsaUJBQWlCO0FBQUEsRUFDakIsY0FBYztBQUFBLEVBQ2QsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsZUFBZTtBQUFBLEVBQ2YsV0FBVztBQUFBLEVBQ1gsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osUUFBUTtBQUFBLEVBQ1IsZUFBZTtBQUFBLEVBQ2YsS0FBSztBQUFBLEVBQ0wsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsUUFBUTtBQUFBLEVBQ1IsWUFBWTtBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sYUFBYTtBQUFBLEVBQ2IsV0FBVztBQUFBLEVBQ1gsS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1IsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsWUFBWTtBQUFBLEVB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