Files
obsidian_vault/.obsidian/plugins/publish/main.js
T
2025-12-27 11:44:50 +08:00

46252 lines
5.9 MiB
Plaintext

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 __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all2) => {
__markAsModule(target);
for (var name in all2)
__defProp(target, name, { get: all2[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
// node_modules/form-data/lib/browser.js
var require_browser = __commonJS({
"node_modules/form-data/lib/browser.js"(exports, module2) {
"use strict";
module2.exports = typeof self === "object" ? self.FormData : window.FormData;
}
});
// node_modules/proxy-from-env/index.js
var require_proxy_from_env = __commonJS({
"node_modules/proxy-from-env/index.js"(exports) {
"use strict";
var parseUrl = require("url").parse;
var DEFAULT_PORTS = {
ftp: 21,
gopher: 70,
http: 80,
https: 443,
ws: 80,
wss: 443
};
var stringEndsWith = String.prototype.endsWith || function(s) {
return s.length <= this.length && this.indexOf(s, this.length - s.length) !== -1;
};
function getProxyForUrl(url2) {
var parsedUrl = typeof url2 === "string" ? parseUrl(url2) : url2 || {};
var proto = parsedUrl.protocol;
var hostname = parsedUrl.host;
var port = parsedUrl.port;
if (typeof hostname !== "string" || !hostname || typeof proto !== "string") {
return "";
}
proto = proto.split(":", 1)[0];
hostname = hostname.replace(/:\d*$/, "");
port = parseInt(port) || DEFAULT_PORTS[proto] || 0;
if (!shouldProxy(hostname, port)) {
return "";
}
var proxy = getEnv("npm_config_" + proto + "_proxy") || getEnv(proto + "_proxy") || getEnv("npm_config_proxy") || getEnv("all_proxy");
if (proxy && proxy.indexOf("://") === -1) {
proxy = proto + "://" + proxy;
}
return proxy;
}
function shouldProxy(hostname, port) {
var NO_PROXY = (getEnv("npm_config_no_proxy") || getEnv("no_proxy")).toLowerCase();
if (!NO_PROXY) {
return true;
}
if (NO_PROXY === "*") {
return false;
}
return NO_PROXY.split(/[,\s]/).every(function(proxy) {
if (!proxy) {
return true;
}
var parsedProxy = proxy.match(/^(.+):(\d+)$/);
var parsedProxyHostname = parsedProxy ? parsedProxy[1] : proxy;
var parsedProxyPort = parsedProxy ? parseInt(parsedProxy[2]) : 0;
if (parsedProxyPort && parsedProxyPort !== port) {
return true;
}
if (!/^[.*]/.test(parsedProxyHostname)) {
return hostname !== parsedProxyHostname;
}
if (parsedProxyHostname.charAt(0) === "*") {
parsedProxyHostname = parsedProxyHostname.slice(1);
}
return !stringEndsWith.call(hostname, parsedProxyHostname);
});
}
function getEnv(key) {
return process.env[key.toLowerCase()] || process.env[key.toUpperCase()] || "";
}
exports.getProxyForUrl = getProxyForUrl;
}
});
// node_modules/ms/index.js
var require_ms = __commonJS({
"node_modules/ms/index.js"(exports, module2) {
var s = 1e3;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var w = d * 7;
var y = d * 365.25;
module2.exports = function(val, options) {
options = options || {};
var type = typeof val;
if (type === "string" && val.length > 0) {
return parse(val);
} else if (type === "number" && isFinite(val)) {
return options.long ? fmtLong(val) : fmtShort(val);
}
throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
};
function parse(str) {
str = String(str);
if (str.length > 100) {
return;
}
var match2 = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
if (!match2) {
return;
}
var n = parseFloat(match2[1]);
var type = (match2[2] || "ms").toLowerCase();
switch (type) {
case "years":
case "year":
case "yrs":
case "yr":
case "y":
return n * y;
case "weeks":
case "week":
case "w":
return n * w;
case "days":
case "day":
case "d":
return n * d;
case "hours":
case "hour":
case "hrs":
case "hr":
case "h":
return n * h;
case "minutes":
case "minute":
case "mins":
case "min":
case "m":
return n * m;
case "seconds":
case "second":
case "secs":
case "sec":
case "s":
return n * s;
case "milliseconds":
case "millisecond":
case "msecs":
case "msec":
case "ms":
return n;
default:
return void 0;
}
}
function fmtShort(ms) {
var msAbs = Math.abs(ms);
if (msAbs >= d) {
return Math.round(ms / d) + "d";
}
if (msAbs >= h) {
return Math.round(ms / h) + "h";
}
if (msAbs >= m) {
return Math.round(ms / m) + "m";
}
if (msAbs >= s) {
return Math.round(ms / s) + "s";
}
return ms + "ms";
}
function fmtLong(ms) {
var msAbs = Math.abs(ms);
if (msAbs >= d) {
return plural(ms, msAbs, d, "day");
}
if (msAbs >= h) {
return plural(ms, msAbs, h, "hour");
}
if (msAbs >= m) {
return plural(ms, msAbs, m, "minute");
}
if (msAbs >= s) {
return plural(ms, msAbs, s, "second");
}
return ms + " ms";
}
function plural(ms, msAbs, n, name) {
var isPlural = msAbs >= n * 1.5;
return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
}
}
});
// node_modules/debug/src/common.js
var require_common = __commonJS({
"node_modules/debug/src/common.js"(exports, module2) {
function setup(env) {
createDebug.debug = createDebug;
createDebug.default = createDebug;
createDebug.coerce = coerce;
createDebug.disable = disable;
createDebug.enable = enable;
createDebug.enabled = enabled;
createDebug.humanize = require_ms();
createDebug.destroy = destroy;
Object.keys(env).forEach((key) => {
createDebug[key] = env[key];
});
createDebug.names = [];
createDebug.skips = [];
createDebug.formatters = {};
function selectColor(namespace) {
let hash = 0;
for (let i = 0; i < namespace.length; i++) {
hash = (hash << 5) - hash + namespace.charCodeAt(i);
hash |= 0;
}
return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
}
createDebug.selectColor = selectColor;
function createDebug(namespace) {
let prevTime;
let enableOverride = null;
let namespacesCache;
let enabledCache;
function debug(...args) {
if (!debug.enabled) {
return;
}
const self2 = debug;
const curr = Number(new Date());
const ms = curr - (prevTime || curr);
self2.diff = ms;
self2.prev = prevTime;
self2.curr = curr;
prevTime = curr;
args[0] = createDebug.coerce(args[0]);
if (typeof args[0] !== "string") {
args.unshift("%O");
}
let index2 = 0;
args[0] = args[0].replace(/%([a-zA-Z%])/g, (match2, format) => {
if (match2 === "%%") {
return "%";
}
index2++;
const formatter = createDebug.formatters[format];
if (typeof formatter === "function") {
const val = args[index2];
match2 = formatter.call(self2, val);
args.splice(index2, 1);
index2--;
}
return match2;
});
createDebug.formatArgs.call(self2, args);
const logFn = self2.log || createDebug.log;
logFn.apply(self2, args);
}
debug.namespace = namespace;
debug.useColors = createDebug.useColors();
debug.color = createDebug.selectColor(namespace);
debug.extend = extend2;
debug.destroy = createDebug.destroy;
Object.defineProperty(debug, "enabled", {
enumerable: true,
configurable: false,
get: () => {
if (enableOverride !== null) {
return enableOverride;
}
if (namespacesCache !== createDebug.namespaces) {
namespacesCache = createDebug.namespaces;
enabledCache = createDebug.enabled(namespace);
}
return enabledCache;
},
set: (v) => {
enableOverride = v;
}
});
if (typeof createDebug.init === "function") {
createDebug.init(debug);
}
return debug;
}
function extend2(namespace, delimiter) {
const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace);
newDebug.log = this.log;
return newDebug;
}
function enable(namespaces) {
createDebug.save(namespaces);
createDebug.namespaces = namespaces;
createDebug.names = [];
createDebug.skips = [];
const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(/\s+/g, ",").split(",").filter(Boolean);
for (const ns of split) {
if (ns[0] === "-") {
createDebug.skips.push(ns.slice(1));
} else {
createDebug.names.push(ns);
}
}
}
function matchesTemplate(search, template) {
let searchIndex = 0;
let templateIndex = 0;
let starIndex = -1;
let matchIndex = 0;
while (searchIndex < search.length) {
if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === "*")) {
if (template[templateIndex] === "*") {
starIndex = templateIndex;
matchIndex = searchIndex;
templateIndex++;
} else {
searchIndex++;
templateIndex++;
}
} else if (starIndex !== -1) {
templateIndex = starIndex + 1;
matchIndex++;
searchIndex = matchIndex;
} else {
return false;
}
}
while (templateIndex < template.length && template[templateIndex] === "*") {
templateIndex++;
}
return templateIndex === template.length;
}
function disable() {
const namespaces = [
...createDebug.names,
...createDebug.skips.map((namespace) => "-" + namespace)
].join(",");
createDebug.enable("");
return namespaces;
}
function enabled(name) {
for (const skip of createDebug.skips) {
if (matchesTemplate(name, skip)) {
return false;
}
}
for (const ns of createDebug.names) {
if (matchesTemplate(name, ns)) {
return true;
}
}
return false;
}
function coerce(val) {
if (val instanceof Error) {
return val.stack || val.message;
}
return val;
}
function destroy() {
console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
}
createDebug.enable(createDebug.load());
return createDebug;
}
module2.exports = setup;
}
});
// node_modules/debug/src/browser.js
var require_browser2 = __commonJS({
"node_modules/debug/src/browser.js"(exports, module2) {
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();
exports.destroy = (() => {
let warned = false;
return () => {
if (!warned) {
warned = true;
console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");
}
};
})();
exports.colors = [
"#0000CC",
"#0000FF",
"#0033CC",
"#0033FF",
"#0066CC",
"#0066FF",
"#0099CC",
"#0099FF",
"#00CC00",
"#00CC33",
"#00CC66",
"#00CC99",
"#00CCCC",
"#00CCFF",
"#3300CC",
"#3300FF",
"#3333CC",
"#3333FF",
"#3366CC",
"#3366FF",
"#3399CC",
"#3399FF",
"#33CC00",
"#33CC33",
"#33CC66",
"#33CC99",
"#33CCCC",
"#33CCFF",
"#6600CC",
"#6600FF",
"#6633CC",
"#6633FF",
"#66CC00",
"#66CC33",
"#9900CC",
"#9900FF",
"#9933CC",
"#9933FF",
"#99CC00",
"#99CC33",
"#CC0000",
"#CC0033",
"#CC0066",
"#CC0099",
"#CC00CC",
"#CC00FF",
"#CC3300",
"#CC3333",
"#CC3366",
"#CC3399",
"#CC33CC",
"#CC33FF",
"#CC6600",
"#CC6633",
"#CC9900",
"#CC9933",
"#CCCC00",
"#CCCC33",
"#FF0000",
"#FF0033",
"#FF0066",
"#FF0099",
"#FF00CC",
"#FF00FF",
"#FF3300",
"#FF3333",
"#FF3366",
"#FF3399",
"#FF33CC",
"#FF33FF",
"#FF6600",
"#FF6633",
"#FF9900",
"#FF9933",
"#FFCC00",
"#FFCC33"
];
function useColors() {
if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) {
return true;
}
if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
return false;
}
let m;
return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || typeof navigator !== "undefined" && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31 || typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
}
function formatArgs(args) {
args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module2.exports.humanize(this.diff);
if (!this.useColors) {
return;
}
const c = "color: " + this.color;
args.splice(1, 0, c, "color: inherit");
let index2 = 0;
let lastC = 0;
args[0].replace(/%[a-zA-Z%]/g, (match2) => {
if (match2 === "%%") {
return;
}
index2++;
if (match2 === "%c") {
lastC = index2;
}
});
args.splice(lastC, 0, c);
}
exports.log = console.debug || console.log || (() => {
});
function save(namespaces) {
try {
if (namespaces) {
exports.storage.setItem("debug", namespaces);
} else {
exports.storage.removeItem("debug");
}
} catch (error) {
}
}
function load() {
let r;
try {
r = exports.storage.getItem("debug") || exports.storage.getItem("DEBUG");
} catch (error) {
}
if (!r && typeof process !== "undefined" && "env" in process) {
r = process.env.DEBUG;
}
return r;
}
function localstorage() {
try {
return localStorage;
} catch (error) {
}
}
module2.exports = require_common()(exports);
var { formatters } = module2.exports;
formatters.j = function(v) {
try {
return JSON.stringify(v);
} catch (error) {
return "[UnexpectedJSONParseError]: " + error.message;
}
};
}
});
// node_modules/follow-redirects/debug.js
var require_debug = __commonJS({
"node_modules/follow-redirects/debug.js"(exports, module2) {
var debug;
module2.exports = function() {
if (!debug) {
try {
debug = require_browser2()("follow-redirects");
} catch (error) {
}
if (typeof debug !== "function") {
debug = function() {
};
}
}
debug.apply(null, arguments);
};
}
});
// node_modules/follow-redirects/index.js
var require_follow_redirects = __commonJS({
"node_modules/follow-redirects/index.js"(exports, module2) {
var url2 = require("url");
var URL2 = url2.URL;
var http2 = require("http");
var https2 = require("https");
var Writable = require("stream").Writable;
var assert = require("assert");
var debug = require_debug();
(function detectUnsupportedEnvironment() {
var looksLikeNode = typeof process !== "undefined";
var looksLikeBrowser = typeof window !== "undefined" && typeof document !== "undefined";
var looksLikeV8 = isFunction2(Error.captureStackTrace);
if (!looksLikeNode && (looksLikeBrowser || !looksLikeV8)) {
console.warn("The follow-redirects package should be excluded from browser builds.");
}
})();
var useNativeURL = false;
try {
assert(new URL2(""));
} catch (error) {
useNativeURL = error.code === "ERR_INVALID_URL";
}
var preservedUrlFields = [
"auth",
"host",
"hostname",
"href",
"path",
"pathname",
"port",
"protocol",
"query",
"search",
"hash"
];
var events = ["abort", "aborted", "connect", "error", "socket", "timeout"];
var eventHandlers = Object.create(null);
events.forEach(function(event) {
eventHandlers[event] = function(arg1, arg2, arg3) {
this._redirectable.emit(event, arg1, arg2, arg3);
};
});
var InvalidUrlError = createErrorType("ERR_INVALID_URL", "Invalid URL", TypeError);
var RedirectionError = createErrorType("ERR_FR_REDIRECTION_FAILURE", "Redirected request failed");
var TooManyRedirectsError = createErrorType("ERR_FR_TOO_MANY_REDIRECTS", "Maximum number of redirects exceeded", RedirectionError);
var MaxBodyLengthExceededError = createErrorType("ERR_FR_MAX_BODY_LENGTH_EXCEEDED", "Request body larger than maxBodyLength limit");
var WriteAfterEndError = createErrorType("ERR_STREAM_WRITE_AFTER_END", "write after end");
var destroy = Writable.prototype.destroy || noop3;
function RedirectableRequest(options, responseCallback) {
Writable.call(this);
this._sanitizeOptions(options);
this._options = options;
this._ended = false;
this._ending = false;
this._redirectCount = 0;
this._redirects = [];
this._requestBodyLength = 0;
this._requestBodyBuffers = [];
if (responseCallback) {
this.on("response", responseCallback);
}
var self2 = this;
this._onNativeResponse = function(response) {
try {
self2._processResponse(response);
} catch (cause) {
self2.emit("error", cause instanceof RedirectionError ? cause : new RedirectionError({ cause }));
}
};
this._performRequest();
}
RedirectableRequest.prototype = Object.create(Writable.prototype);
RedirectableRequest.prototype.abort = function() {
destroyRequest(this._currentRequest);
this._currentRequest.abort();
this.emit("abort");
};
RedirectableRequest.prototype.destroy = function(error) {
destroyRequest(this._currentRequest, error);
destroy.call(this, error);
return this;
};
RedirectableRequest.prototype.write = function(data, encoding, callback) {
if (this._ending) {
throw new WriteAfterEndError();
}
if (!isString2(data) && !isBuffer2(data)) {
throw new TypeError("data should be a string, Buffer or Uint8Array");
}
if (isFunction2(encoding)) {
callback = encoding;
encoding = null;
}
if (data.length === 0) {
if (callback) {
callback();
}
return;
}
if (this._requestBodyLength + data.length <= this._options.maxBodyLength) {
this._requestBodyLength += data.length;
this._requestBodyBuffers.push({ data, encoding });
this._currentRequest.write(data, encoding, callback);
} else {
this.emit("error", new MaxBodyLengthExceededError());
this.abort();
}
};
RedirectableRequest.prototype.end = function(data, encoding, callback) {
if (isFunction2(data)) {
callback = data;
data = encoding = null;
} else if (isFunction2(encoding)) {
callback = encoding;
encoding = null;
}
if (!data) {
this._ended = this._ending = true;
this._currentRequest.end(null, null, callback);
} else {
var self2 = this;
var currentRequest = this._currentRequest;
this.write(data, encoding, function() {
self2._ended = true;
currentRequest.end(null, null, callback);
});
this._ending = true;
}
};
RedirectableRequest.prototype.setHeader = function(name, value) {
this._options.headers[name] = value;
this._currentRequest.setHeader(name, value);
};
RedirectableRequest.prototype.removeHeader = function(name) {
delete this._options.headers[name];
this._currentRequest.removeHeader(name);
};
RedirectableRequest.prototype.setTimeout = function(msecs, callback) {
var self2 = this;
function destroyOnTimeout(socket) {
socket.setTimeout(msecs);
socket.removeListener("timeout", socket.destroy);
socket.addListener("timeout", socket.destroy);
}
function startTimer(socket) {
if (self2._timeout) {
clearTimeout(self2._timeout);
}
self2._timeout = setTimeout(function() {
self2.emit("timeout");
clearTimer();
}, msecs);
destroyOnTimeout(socket);
}
function clearTimer() {
if (self2._timeout) {
clearTimeout(self2._timeout);
self2._timeout = null;
}
self2.removeListener("abort", clearTimer);
self2.removeListener("error", clearTimer);
self2.removeListener("response", clearTimer);
self2.removeListener("close", clearTimer);
if (callback) {
self2.removeListener("timeout", callback);
}
if (!self2.socket) {
self2._currentRequest.removeListener("socket", startTimer);
}
}
if (callback) {
this.on("timeout", callback);
}
if (this.socket) {
startTimer(this.socket);
} else {
this._currentRequest.once("socket", startTimer);
}
this.on("socket", destroyOnTimeout);
this.on("abort", clearTimer);
this.on("error", clearTimer);
this.on("response", clearTimer);
this.on("close", clearTimer);
return this;
};
[
"flushHeaders",
"getHeader",
"setNoDelay",
"setSocketKeepAlive"
].forEach(function(method) {
RedirectableRequest.prototype[method] = function(a, b) {
return this._currentRequest[method](a, b);
};
});
["aborted", "connection", "socket"].forEach(function(property) {
Object.defineProperty(RedirectableRequest.prototype, property, {
get: function() {
return this._currentRequest[property];
}
});
});
RedirectableRequest.prototype._sanitizeOptions = function(options) {
if (!options.headers) {
options.headers = {};
}
if (options.host) {
if (!options.hostname) {
options.hostname = options.host;
}
delete options.host;
}
if (!options.pathname && options.path) {
var searchPos = options.path.indexOf("?");
if (searchPos < 0) {
options.pathname = options.path;
} else {
options.pathname = options.path.substring(0, searchPos);
options.search = options.path.substring(searchPos);
}
}
};
RedirectableRequest.prototype._performRequest = function() {
var protocol = this._options.protocol;
var nativeProtocol = this._options.nativeProtocols[protocol];
if (!nativeProtocol) {
throw new TypeError("Unsupported protocol " + protocol);
}
if (this._options.agents) {
var scheme = protocol.slice(0, -1);
this._options.agent = this._options.agents[scheme];
}
var request2 = this._currentRequest = nativeProtocol.request(this._options, this._onNativeResponse);
request2._redirectable = this;
for (var event of events) {
request2.on(event, eventHandlers[event]);
}
this._currentUrl = /^\//.test(this._options.path) ? url2.format(this._options) : this._options.path;
if (this._isRedirect) {
var i = 0;
var self2 = this;
var buffers = this._requestBodyBuffers;
(function writeNext(error) {
if (request2 === self2._currentRequest) {
if (error) {
self2.emit("error", error);
} else if (i < buffers.length) {
var buffer = buffers[i++];
if (!request2.finished) {
request2.write(buffer.data, buffer.encoding, writeNext);
}
} else if (self2._ended) {
request2.end();
}
}
})();
}
};
RedirectableRequest.prototype._processResponse = function(response) {
var statusCode = response.statusCode;
if (this._options.trackRedirects) {
this._redirects.push({
url: this._currentUrl,
headers: response.headers,
statusCode
});
}
var location = response.headers.location;
if (!location || this._options.followRedirects === false || statusCode < 300 || statusCode >= 400) {
response.responseUrl = this._currentUrl;
response.redirects = this._redirects;
this.emit("response", response);
this._requestBodyBuffers = [];
return;
}
destroyRequest(this._currentRequest);
response.destroy();
if (++this._redirectCount > this._options.maxRedirects) {
throw new TooManyRedirectsError();
}
var requestHeaders;
var beforeRedirect = this._options.beforeRedirect;
if (beforeRedirect) {
requestHeaders = Object.assign({
Host: response.req.getHeader("host")
}, this._options.headers);
}
var method = this._options.method;
if ((statusCode === 301 || statusCode === 302) && this._options.method === "POST" || statusCode === 303 && !/^(?:GET|HEAD)$/.test(this._options.method)) {
this._options.method = "GET";
this._requestBodyBuffers = [];
removeMatchingHeaders(/^content-/i, this._options.headers);
}
var currentHostHeader = removeMatchingHeaders(/^host$/i, this._options.headers);
var currentUrlParts = parseUrl(this._currentUrl);
var currentHost = currentHostHeader || currentUrlParts.host;
var currentUrl = /^\w+:/.test(location) ? this._currentUrl : url2.format(Object.assign(currentUrlParts, { host: currentHost }));
var redirectUrl = resolveUrl(location, currentUrl);
debug("redirecting to", redirectUrl.href);
this._isRedirect = true;
spreadUrlObject(redirectUrl, this._options);
if (redirectUrl.protocol !== currentUrlParts.protocol && redirectUrl.protocol !== "https:" || redirectUrl.host !== currentHost && !isSubdomain(redirectUrl.host, currentHost)) {
removeMatchingHeaders(/^(?:(?:proxy-)?authorization|cookie)$/i, this._options.headers);
}
if (isFunction2(beforeRedirect)) {
var responseDetails = {
headers: response.headers,
statusCode
};
var requestDetails = {
url: currentUrl,
method,
headers: requestHeaders
};
beforeRedirect(this._options, responseDetails, requestDetails);
this._sanitizeOptions(this._options);
}
this._performRequest();
};
function wrap(protocols) {
var exports2 = {
maxRedirects: 21,
maxBodyLength: 10 * 1024 * 1024
};
var nativeProtocols = {};
Object.keys(protocols).forEach(function(scheme) {
var protocol = scheme + ":";
var nativeProtocol = nativeProtocols[protocol] = protocols[scheme];
var wrappedProtocol = exports2[scheme] = Object.create(nativeProtocol);
function request2(input, options, callback) {
if (isURL(input)) {
input = spreadUrlObject(input);
} else if (isString2(input)) {
input = spreadUrlObject(parseUrl(input));
} else {
callback = options;
options = validateUrl(input);
input = { protocol };
}
if (isFunction2(options)) {
callback = options;
options = null;
}
options = Object.assign({
maxRedirects: exports2.maxRedirects,
maxBodyLength: exports2.maxBodyLength
}, input, options);
options.nativeProtocols = nativeProtocols;
if (!isString2(options.host) && !isString2(options.hostname)) {
options.hostname = "::1";
}
assert.equal(options.protocol, protocol, "protocol mismatch");
debug("options", options);
return new RedirectableRequest(options, callback);
}
function get(input, options, callback) {
var wrappedRequest = wrappedProtocol.request(input, options, callback);
wrappedRequest.end();
return wrappedRequest;
}
Object.defineProperties(wrappedProtocol, {
request: { value: request2, configurable: true, enumerable: true, writable: true },
get: { value: get, configurable: true, enumerable: true, writable: true }
});
});
return exports2;
}
function noop3() {
}
function parseUrl(input) {
var parsed;
if (useNativeURL) {
parsed = new URL2(input);
} else {
parsed = validateUrl(url2.parse(input));
if (!isString2(parsed.protocol)) {
throw new InvalidUrlError({ input });
}
}
return parsed;
}
function resolveUrl(relative, base) {
return useNativeURL ? new URL2(relative, base) : parseUrl(url2.resolve(base, relative));
}
function validateUrl(input) {
if (/^\[/.test(input.hostname) && !/^\[[:0-9a-f]+\]$/i.test(input.hostname)) {
throw new InvalidUrlError({ input: input.href || input });
}
if (/^\[/.test(input.host) && !/^\[[:0-9a-f]+\](:\d+)?$/i.test(input.host)) {
throw new InvalidUrlError({ input: input.href || input });
}
return input;
}
function spreadUrlObject(urlObject, target) {
var spread2 = target || {};
for (var key of preservedUrlFields) {
spread2[key] = urlObject[key];
}
if (spread2.hostname.startsWith("[")) {
spread2.hostname = spread2.hostname.slice(1, -1);
}
if (spread2.port !== "") {
spread2.port = Number(spread2.port);
}
spread2.path = spread2.search ? spread2.pathname + spread2.search : spread2.pathname;
return spread2;
}
function removeMatchingHeaders(regex, headers) {
var lastValue;
for (var header in headers) {
if (regex.test(header)) {
lastValue = headers[header];
delete headers[header];
}
}
return lastValue === null || typeof lastValue === "undefined" ? void 0 : String(lastValue).trim();
}
function createErrorType(code, message, baseClass) {
function CustomError(properties) {
if (isFunction2(Error.captureStackTrace)) {
Error.captureStackTrace(this, this.constructor);
}
Object.assign(this, properties || {});
this.code = code;
this.message = this.cause ? message + ": " + this.cause.message : message;
}
CustomError.prototype = new (baseClass || Error)();
Object.defineProperties(CustomError.prototype, {
constructor: {
value: CustomError,
enumerable: false
},
name: {
value: "Error [" + code + "]",
enumerable: false
}
});
return CustomError;
}
function destroyRequest(request2, error) {
for (var event of events) {
request2.removeListener(event, eventHandlers[event]);
}
request2.on("error", noop3);
request2.destroy(error);
}
function isSubdomain(subdomain, domain) {
assert(isString2(subdomain) && isString2(domain));
var dot = subdomain.length - domain.length - 1;
return dot > 0 && subdomain[dot] === "." && subdomain.endsWith(domain);
}
function isString2(value) {
return typeof value === "string" || value instanceof String;
}
function isFunction2(value) {
return typeof value === "function";
}
function isBuffer2(value) {
return typeof value === "object" && "length" in value;
}
function isURL(value) {
return URL2 && value instanceof URL2;
}
module2.exports = wrap({ http: http2, https: https2 });
module2.exports.wrap = wrap;
}
});
// node_modules/es-errors/type.js
var require_type = __commonJS({
"node_modules/es-errors/type.js"(exports, module2) {
"use strict";
module2.exports = TypeError;
}
});
// node_modules/object-inspect/util.inspect.js
var require_util_inspect = __commonJS({
"node_modules/object-inspect/util.inspect.js"(exports, module2) {
module2.exports = require("util").inspect;
}
});
// node_modules/object-inspect/index.js
var require_object_inspect = __commonJS({
"node_modules/object-inspect/index.js"(exports, module2) {
var hasMap = typeof Map === "function" && Map.prototype;
var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, "size") : null;
var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === "function" ? mapSizeDescriptor.get : null;
var mapForEach = hasMap && Map.prototype.forEach;
var hasSet = typeof Set === "function" && Set.prototype;
var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, "size") : null;
var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === "function" ? setSizeDescriptor.get : null;
var setForEach = hasSet && Set.prototype.forEach;
var hasWeakMap = typeof WeakMap === "function" && WeakMap.prototype;
var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
var hasWeakSet = typeof WeakSet === "function" && WeakSet.prototype;
var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
var hasWeakRef = typeof WeakRef === "function" && WeakRef.prototype;
var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString;
var functionToString = Function.prototype.toString;
var $match = String.prototype.match;
var $slice = String.prototype.slice;
var $replace = String.prototype.replace;
var $toUpperCase = String.prototype.toUpperCase;
var $toLowerCase = String.prototype.toLowerCase;
var $test = RegExp.prototype.test;
var $concat = Array.prototype.concat;
var $join = Array.prototype.join;
var $arrSlice = Array.prototype.slice;
var $floor = Math.floor;
var bigIntValueOf = typeof BigInt === "function" ? BigInt.prototype.valueOf : null;
var gOPS = Object.getOwnPropertySymbols;
var symToString = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? Symbol.prototype.toString : null;
var hasShammedSymbols = typeof Symbol === "function" && typeof Symbol.iterator === "object";
var toStringTag2 = typeof Symbol === "function" && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? "object" : "symbol") ? Symbol.toStringTag : null;
var isEnumerable = Object.prototype.propertyIsEnumerable;
var gPO = (typeof Reflect === "function" ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ([].__proto__ === Array.prototype ? function(O) {
return O.__proto__;
} : null);
function addNumericSeparator(num, str) {
if (num === Infinity || num === -Infinity || num !== num || num && num > -1e3 && num < 1e3 || $test.call(/e/, str)) {
return str;
}
var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
if (typeof num === "number") {
var int = num < 0 ? -$floor(-num) : $floor(num);
if (int !== num) {
var intStr = String(int);
var dec = $slice.call(str, intStr.length + 1);
return $replace.call(intStr, sepRegex, "$&_") + "." + $replace.call($replace.call(dec, /([0-9]{3})/g, "$&_"), /_$/, "");
}
}
return $replace.call(str, sepRegex, "$&_");
}
var utilInspect = require_util_inspect();
var inspectCustom = utilInspect.custom;
var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;
var quotes = {
__proto__: null,
"double": '"',
single: "'"
};
var quoteREs = {
__proto__: null,
"double": /(["\\])/g,
single: /(['\\])/g
};
module2.exports = function inspect_(obj, options, depth, seen) {
var opts = options || {};
if (has(opts, "quoteStyle") && !has(quotes, opts.quoteStyle)) {
throw new TypeError('option "quoteStyle" must be "single" or "double"');
}
if (has(opts, "maxStringLength") && (typeof opts.maxStringLength === "number" ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity : opts.maxStringLength !== null)) {
throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
}
var customInspect = has(opts, "customInspect") ? opts.customInspect : true;
if (typeof customInspect !== "boolean" && customInspect !== "symbol") {
throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");
}
if (has(opts, "indent") && opts.indent !== null && opts.indent !== " " && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)) {
throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
}
if (has(opts, "numericSeparator") && typeof opts.numericSeparator !== "boolean") {
throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
}
var numericSeparator = opts.numericSeparator;
if (typeof obj === "undefined") {
return "undefined";
}
if (obj === null) {
return "null";
}
if (typeof obj === "boolean") {
return obj ? "true" : "false";
}
if (typeof obj === "string") {
return inspectString(obj, opts);
}
if (typeof obj === "number") {
if (obj === 0) {
return Infinity / obj > 0 ? "0" : "-0";
}
var str = String(obj);
return numericSeparator ? addNumericSeparator(obj, str) : str;
}
if (typeof obj === "bigint") {
var bigIntStr = String(obj) + "n";
return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
}
var maxDepth = typeof opts.depth === "undefined" ? 5 : opts.depth;
if (typeof depth === "undefined") {
depth = 0;
}
if (depth >= maxDepth && maxDepth > 0 && typeof obj === "object") {
return isArray3(obj) ? "[Array]" : "[Object]";
}
var indent = getIndent(opts, depth);
if (typeof seen === "undefined") {
seen = [];
} else if (indexOf(seen, obj) >= 0) {
return "[Circular]";
}
function inspect(value, from, noIndent) {
if (from) {
seen = $arrSlice.call(seen);
seen.push(from);
}
if (noIndent) {
var newOpts = {
depth: opts.depth
};
if (has(opts, "quoteStyle")) {
newOpts.quoteStyle = opts.quoteStyle;
}
return inspect_(value, newOpts, depth + 1, seen);
}
return inspect_(value, opts, depth + 1, seen);
}
if (typeof obj === "function" && !isRegExp2(obj)) {
var name = nameOf(obj);
var keys = arrObjKeys(obj, inspect);
return "[Function" + (name ? ": " + name : " (anonymous)") + "]" + (keys.length > 0 ? " { " + $join.call(keys, ", ") + " }" : "");
}
if (isSymbol(obj)) {
var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, "$1") : symToString.call(obj);
return typeof obj === "object" && !hasShammedSymbols ? markBoxed(symString) : symString;
}
if (isElement2(obj)) {
var s = "<" + $toLowerCase.call(String(obj.nodeName));
var attrs = obj.attributes || [];
for (var i = 0; i < attrs.length; i++) {
s += " " + attrs[i].name + "=" + wrapQuotes(quote(attrs[i].value), "double", opts);
}
s += ">";
if (obj.childNodes && obj.childNodes.length) {
s += "...";
}
s += "</" + $toLowerCase.call(String(obj.nodeName)) + ">";
return s;
}
if (isArray3(obj)) {
if (obj.length === 0) {
return "[]";
}
var xs = arrObjKeys(obj, inspect);
if (indent && !singleLineValues(xs)) {
return "[" + indentedJoin(xs, indent) + "]";
}
return "[ " + $join.call(xs, ", ") + " ]";
}
if (isError(obj)) {
var parts = arrObjKeys(obj, inspect);
if (!("cause" in Error.prototype) && "cause" in obj && !isEnumerable.call(obj, "cause")) {
return "{ [" + String(obj) + "] " + $join.call($concat.call("[cause]: " + inspect(obj.cause), parts), ", ") + " }";
}
if (parts.length === 0) {
return "[" + String(obj) + "]";
}
return "{ [" + String(obj) + "] " + $join.call(parts, ", ") + " }";
}
if (typeof obj === "object" && customInspect) {
if (inspectSymbol && typeof obj[inspectSymbol] === "function" && utilInspect) {
return utilInspect(obj, { depth: maxDepth - depth });
} else if (customInspect !== "symbol" && typeof obj.inspect === "function") {
return obj.inspect();
}
}
if (isMap(obj)) {
var mapParts = [];
if (mapForEach) {
mapForEach.call(obj, function(value, key) {
mapParts.push(inspect(key, obj, true) + " => " + inspect(value, obj));
});
}
return collectionOf("Map", mapSize.call(obj), mapParts, indent);
}
if (isSet(obj)) {
var setParts = [];
if (setForEach) {
setForEach.call(obj, function(value) {
setParts.push(inspect(value, obj));
});
}
return collectionOf("Set", setSize.call(obj), setParts, indent);
}
if (isWeakMap(obj)) {
return weakCollectionOf("WeakMap");
}
if (isWeakSet(obj)) {
return weakCollectionOf("WeakSet");
}
if (isWeakRef(obj)) {
return weakCollectionOf("WeakRef");
}
if (isNumber2(obj)) {
return markBoxed(inspect(Number(obj)));
}
if (isBigInt(obj)) {
return markBoxed(inspect(bigIntValueOf.call(obj)));
}
if (isBoolean2(obj)) {
return markBoxed(booleanValueOf.call(obj));
}
if (isString2(obj)) {
return markBoxed(inspect(String(obj)));
}
if (typeof window !== "undefined" && obj === window) {
return "{ [object Window] }";
}
if (typeof globalThis !== "undefined" && obj === globalThis || typeof window !== "undefined" && obj === window) {
return "{ [object globalThis] }";
}
if (!isDate2(obj) && !isRegExp2(obj)) {
var ys = arrObjKeys(obj, inspect);
var isPlainObject2 = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
var protoTag = obj instanceof Object ? "" : "null prototype";
var stringTag = !isPlainObject2 && toStringTag2 && Object(obj) === obj && toStringTag2 in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? "Object" : "";
var constructorTag = isPlainObject2 || typeof obj.constructor !== "function" ? "" : obj.constructor.name ? obj.constructor.name + " " : "";
var tag = constructorTag + (stringTag || protoTag ? "[" + $join.call($concat.call([], stringTag || [], protoTag || []), ": ") + "] " : "");
if (ys.length === 0) {
return tag + "{}";
}
if (indent) {
return tag + "{" + indentedJoin(ys, indent) + "}";
}
return tag + "{ " + $join.call(ys, ", ") + " }";
}
return String(obj);
};
function wrapQuotes(s, defaultStyle, opts) {
var style = opts.quoteStyle || defaultStyle;
var quoteChar = quotes[style];
return quoteChar + s + quoteChar;
}
function quote(s) {
return $replace.call(String(s), /"/g, "&quot;");
}
function canTrustToString(obj) {
return !toStringTag2 || !(typeof obj === "object" && (toStringTag2 in obj || typeof obj[toStringTag2] !== "undefined"));
}
function isArray3(obj) {
return toStr(obj) === "[object Array]" && canTrustToString(obj);
}
function isDate2(obj) {
return toStr(obj) === "[object Date]" && canTrustToString(obj);
}
function isRegExp2(obj) {
return toStr(obj) === "[object RegExp]" && canTrustToString(obj);
}
function isError(obj) {
return toStr(obj) === "[object Error]" && canTrustToString(obj);
}
function isString2(obj) {
return toStr(obj) === "[object String]" && canTrustToString(obj);
}
function isNumber2(obj) {
return toStr(obj) === "[object Number]" && canTrustToString(obj);
}
function isBoolean2(obj) {
return toStr(obj) === "[object Boolean]" && canTrustToString(obj);
}
function isSymbol(obj) {
if (hasShammedSymbols) {
return obj && typeof obj === "object" && obj instanceof Symbol;
}
if (typeof obj === "symbol") {
return true;
}
if (!obj || typeof obj !== "object" || !symToString) {
return false;
}
try {
symToString.call(obj);
return true;
} catch (e) {
}
return false;
}
function isBigInt(obj) {
if (!obj || typeof obj !== "object" || !bigIntValueOf) {
return false;
}
try {
bigIntValueOf.call(obj);
return true;
} catch (e) {
}
return false;
}
var hasOwn = Object.prototype.hasOwnProperty || function(key) {
return key in this;
};
function has(obj, key) {
return hasOwn.call(obj, key);
}
function toStr(obj) {
return objectToString.call(obj);
}
function nameOf(f) {
if (f.name) {
return f.name;
}
var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
if (m) {
return m[1];
}
return null;
}
function indexOf(xs, x) {
if (xs.indexOf) {
return xs.indexOf(x);
}
for (var i = 0, l = xs.length; i < l; i++) {
if (xs[i] === x) {
return i;
}
}
return -1;
}
function isMap(x) {
if (!mapSize || !x || typeof x !== "object") {
return false;
}
try {
mapSize.call(x);
try {
setSize.call(x);
} catch (s) {
return true;
}
return x instanceof Map;
} catch (e) {
}
return false;
}
function isWeakMap(x) {
if (!weakMapHas || !x || typeof x !== "object") {
return false;
}
try {
weakMapHas.call(x, weakMapHas);
try {
weakSetHas.call(x, weakSetHas);
} catch (s) {
return true;
}
return x instanceof WeakMap;
} catch (e) {
}
return false;
}
function isWeakRef(x) {
if (!weakRefDeref || !x || typeof x !== "object") {
return false;
}
try {
weakRefDeref.call(x);
return true;
} catch (e) {
}
return false;
}
function isSet(x) {
if (!setSize || !x || typeof x !== "object") {
return false;
}
try {
setSize.call(x);
try {
mapSize.call(x);
} catch (m) {
return true;
}
return x instanceof Set;
} catch (e) {
}
return false;
}
function isWeakSet(x) {
if (!weakSetHas || !x || typeof x !== "object") {
return false;
}
try {
weakSetHas.call(x, weakSetHas);
try {
weakMapHas.call(x, weakMapHas);
} catch (s) {
return true;
}
return x instanceof WeakSet;
} catch (e) {
}
return false;
}
function isElement2(x) {
if (!x || typeof x !== "object") {
return false;
}
if (typeof HTMLElement !== "undefined" && x instanceof HTMLElement) {
return true;
}
return typeof x.nodeName === "string" && typeof x.getAttribute === "function";
}
function inspectString(str, opts) {
if (str.length > opts.maxStringLength) {
var remaining = str.length - opts.maxStringLength;
var trailer = "... " + remaining + " more character" + (remaining > 1 ? "s" : "");
return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
}
var quoteRE = quoteREs[opts.quoteStyle || "single"];
quoteRE.lastIndex = 0;
var s = $replace.call($replace.call(str, quoteRE, "\\$1"), /[\x00-\x1f]/g, lowbyte);
return wrapQuotes(s, "single", opts);
}
function lowbyte(c) {
var n = c.charCodeAt(0);
var x = {
8: "b",
9: "t",
10: "n",
12: "f",
13: "r"
}[n];
if (x) {
return "\\" + x;
}
return "\\x" + (n < 16 ? "0" : "") + $toUpperCase.call(n.toString(16));
}
function markBoxed(str) {
return "Object(" + str + ")";
}
function weakCollectionOf(type) {
return type + " { ? }";
}
function collectionOf(type, size, entries, indent) {
var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ", ");
return type + " (" + size + ") {" + joinedEntries + "}";
}
function singleLineValues(xs) {
for (var i = 0; i < xs.length; i++) {
if (indexOf(xs[i], "\n") >= 0) {
return false;
}
}
return true;
}
function getIndent(opts, depth) {
var baseIndent;
if (opts.indent === " ") {
baseIndent = " ";
} else if (typeof opts.indent === "number" && opts.indent > 0) {
baseIndent = $join.call(Array(opts.indent + 1), " ");
} else {
return null;
}
return {
base: baseIndent,
prev: $join.call(Array(depth + 1), baseIndent)
};
}
function indentedJoin(xs, indent) {
if (xs.length === 0) {
return "";
}
var lineJoiner = "\n" + indent.prev + indent.base;
return lineJoiner + $join.call(xs, "," + lineJoiner) + "\n" + indent.prev;
}
function arrObjKeys(obj, inspect) {
var isArr = isArray3(obj);
var xs = [];
if (isArr) {
xs.length = obj.length;
for (var i = 0; i < obj.length; i++) {
xs[i] = has(obj, i) ? inspect(obj[i], obj) : "";
}
}
var syms = typeof gOPS === "function" ? gOPS(obj) : [];
var symMap;
if (hasShammedSymbols) {
symMap = {};
for (var k = 0; k < syms.length; k++) {
symMap["$" + syms[k]] = syms[k];
}
}
for (var key in obj) {
if (!has(obj, key)) {
continue;
}
if (isArr && String(Number(key)) === key && key < obj.length) {
continue;
}
if (hasShammedSymbols && symMap["$" + key] instanceof Symbol) {
continue;
} else if ($test.call(/[^\w$]/, key)) {
xs.push(inspect(key, obj) + ": " + inspect(obj[key], obj));
} else {
xs.push(key + ": " + inspect(obj[key], obj));
}
}
if (typeof gOPS === "function") {
for (var j = 0; j < syms.length; j++) {
if (isEnumerable.call(obj, syms[j])) {
xs.push("[" + inspect(syms[j]) + "]: " + inspect(obj[syms[j]], obj));
}
}
}
return xs;
}
}
});
// node_modules/side-channel-list/index.js
var require_side_channel_list = __commonJS({
"node_modules/side-channel-list/index.js"(exports, module2) {
"use strict";
var inspect = require_object_inspect();
var $TypeError = require_type();
var listGetNode = function(list2, key, isDelete) {
var prev = list2;
var curr;
for (; (curr = prev.next) != null; prev = curr) {
if (curr.key === key) {
prev.next = curr.next;
if (!isDelete) {
curr.next = list2.next;
list2.next = curr;
}
return curr;
}
}
};
var listGet = function(objects, key) {
if (!objects) {
return void 0;
}
var node = listGetNode(objects, key);
return node && node.value;
};
var listSet = function(objects, key, value) {
var node = listGetNode(objects, key);
if (node) {
node.value = value;
} else {
objects.next = {
key,
next: objects.next,
value
};
}
};
var listHas = function(objects, key) {
if (!objects) {
return false;
}
return !!listGetNode(objects, key);
};
var listDelete = function(objects, key) {
if (objects) {
return listGetNode(objects, key, true);
}
};
module2.exports = function getSideChannelList() {
var $o;
var channel = {
assert: function(key) {
if (!channel.has(key)) {
throw new $TypeError("Side channel does not contain " + inspect(key));
}
},
"delete": function(key) {
var root = $o && $o.next;
var deletedNode = listDelete($o, key);
if (deletedNode && root && root === deletedNode) {
$o = void 0;
}
return !!deletedNode;
},
get: function(key) {
return listGet($o, key);
},
has: function(key) {
return listHas($o, key);
},
set: function(key, value) {
if (!$o) {
$o = {
next: void 0
};
}
listSet($o, key, value);
}
};
return channel;
};
}
});
// node_modules/es-object-atoms/index.js
var require_es_object_atoms = __commonJS({
"node_modules/es-object-atoms/index.js"(exports, module2) {
"use strict";
module2.exports = Object;
}
});
// node_modules/es-errors/index.js
var require_es_errors = __commonJS({
"node_modules/es-errors/index.js"(exports, module2) {
"use strict";
module2.exports = Error;
}
});
// node_modules/es-errors/eval.js
var require_eval = __commonJS({
"node_modules/es-errors/eval.js"(exports, module2) {
"use strict";
module2.exports = EvalError;
}
});
// node_modules/es-errors/range.js
var require_range = __commonJS({
"node_modules/es-errors/range.js"(exports, module2) {
"use strict";
module2.exports = RangeError;
}
});
// node_modules/es-errors/ref.js
var require_ref = __commonJS({
"node_modules/es-errors/ref.js"(exports, module2) {
"use strict";
module2.exports = ReferenceError;
}
});
// node_modules/es-errors/syntax.js
var require_syntax = __commonJS({
"node_modules/es-errors/syntax.js"(exports, module2) {
"use strict";
module2.exports = SyntaxError;
}
});
// node_modules/es-errors/uri.js
var require_uri = __commonJS({
"node_modules/es-errors/uri.js"(exports, module2) {
"use strict";
module2.exports = URIError;
}
});
// node_modules/math-intrinsics/abs.js
var require_abs = __commonJS({
"node_modules/math-intrinsics/abs.js"(exports, module2) {
"use strict";
module2.exports = Math.abs;
}
});
// node_modules/math-intrinsics/floor.js
var require_floor = __commonJS({
"node_modules/math-intrinsics/floor.js"(exports, module2) {
"use strict";
module2.exports = Math.floor;
}
});
// node_modules/math-intrinsics/max.js
var require_max = __commonJS({
"node_modules/math-intrinsics/max.js"(exports, module2) {
"use strict";
module2.exports = Math.max;
}
});
// node_modules/math-intrinsics/min.js
var require_min = __commonJS({
"node_modules/math-intrinsics/min.js"(exports, module2) {
"use strict";
module2.exports = Math.min;
}
});
// node_modules/math-intrinsics/pow.js
var require_pow = __commonJS({
"node_modules/math-intrinsics/pow.js"(exports, module2) {
"use strict";
module2.exports = Math.pow;
}
});
// node_modules/math-intrinsics/round.js
var require_round = __commonJS({
"node_modules/math-intrinsics/round.js"(exports, module2) {
"use strict";
module2.exports = Math.round;
}
});
// node_modules/math-intrinsics/isNaN.js
var require_isNaN = __commonJS({
"node_modules/math-intrinsics/isNaN.js"(exports, module2) {
"use strict";
module2.exports = Number.isNaN || function isNaN2(a) {
return a !== a;
};
}
});
// node_modules/math-intrinsics/sign.js
var require_sign = __commonJS({
"node_modules/math-intrinsics/sign.js"(exports, module2) {
"use strict";
var $isNaN = require_isNaN();
module2.exports = function sign(number) {
if ($isNaN(number) || number === 0) {
return number;
}
return number < 0 ? -1 : 1;
};
}
});
// node_modules/gopd/gOPD.js
var require_gOPD = __commonJS({
"node_modules/gopd/gOPD.js"(exports, module2) {
"use strict";
module2.exports = Object.getOwnPropertyDescriptor;
}
});
// node_modules/gopd/index.js
var require_gopd = __commonJS({
"node_modules/gopd/index.js"(exports, module2) {
"use strict";
var $gOPD = require_gOPD();
if ($gOPD) {
try {
$gOPD([], "length");
} catch (e) {
$gOPD = null;
}
}
module2.exports = $gOPD;
}
});
// node_modules/es-define-property/index.js
var require_es_define_property = __commonJS({
"node_modules/es-define-property/index.js"(exports, module2) {
"use strict";
var $defineProperty = Object.defineProperty || false;
if ($defineProperty) {
try {
$defineProperty({}, "a", { value: 1 });
} catch (e) {
$defineProperty = false;
}
}
module2.exports = $defineProperty;
}
});
// node_modules/has-symbols/shams.js
var require_shams = __commonJS({
"node_modules/has-symbols/shams.js"(exports, module2) {
"use strict";
module2.exports = function hasSymbols() {
if (typeof Symbol !== "function" || typeof Object.getOwnPropertySymbols !== "function") {
return false;
}
if (typeof Symbol.iterator === "symbol") {
return true;
}
var obj = {};
var sym = Symbol("test");
var symObj = Object(sym);
if (typeof sym === "string") {
return false;
}
if (Object.prototype.toString.call(sym) !== "[object Symbol]") {
return false;
}
if (Object.prototype.toString.call(symObj) !== "[object Symbol]") {
return false;
}
var symVal = 42;
obj[sym] = symVal;
for (var _ in obj) {
return false;
}
if (typeof Object.keys === "function" && Object.keys(obj).length !== 0) {
return false;
}
if (typeof Object.getOwnPropertyNames === "function" && Object.getOwnPropertyNames(obj).length !== 0) {
return false;
}
var syms = Object.getOwnPropertySymbols(obj);
if (syms.length !== 1 || syms[0] !== sym) {
return false;
}
if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) {
return false;
}
if (typeof Object.getOwnPropertyDescriptor === "function") {
var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
if (descriptor.value !== symVal || descriptor.enumerable !== true) {
return false;
}
}
return true;
};
}
});
// node_modules/has-symbols/index.js
var require_has_symbols = __commonJS({
"node_modules/has-symbols/index.js"(exports, module2) {
"use strict";
var origSymbol = typeof Symbol !== "undefined" && Symbol;
var hasSymbolSham = require_shams();
module2.exports = function hasNativeSymbols() {
if (typeof origSymbol !== "function") {
return false;
}
if (typeof Symbol !== "function") {
return false;
}
if (typeof origSymbol("foo") !== "symbol") {
return false;
}
if (typeof Symbol("bar") !== "symbol") {
return false;
}
return hasSymbolSham();
};
}
});
// node_modules/get-proto/Reflect.getPrototypeOf.js
var require_Reflect_getPrototypeOf = __commonJS({
"node_modules/get-proto/Reflect.getPrototypeOf.js"(exports, module2) {
"use strict";
module2.exports = typeof Reflect !== "undefined" && Reflect.getPrototypeOf || null;
}
});
// node_modules/get-proto/Object.getPrototypeOf.js
var require_Object_getPrototypeOf = __commonJS({
"node_modules/get-proto/Object.getPrototypeOf.js"(exports, module2) {
"use strict";
var $Object = require_es_object_atoms();
module2.exports = $Object.getPrototypeOf || null;
}
});
// node_modules/function-bind/implementation.js
var require_implementation = __commonJS({
"node_modules/function-bind/implementation.js"(exports, module2) {
"use strict";
var ERROR_MESSAGE = "Function.prototype.bind called on incompatible ";
var toStr = Object.prototype.toString;
var max = Math.max;
var funcType = "[object Function]";
var concatty = function concatty2(a, b) {
var arr = [];
for (var i = 0; i < a.length; i += 1) {
arr[i] = a[i];
}
for (var j = 0; j < b.length; j += 1) {
arr[j + a.length] = b[j];
}
return arr;
};
var slicy = function slicy2(arrLike, offset) {
var arr = [];
for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {
arr[j] = arrLike[i];
}
return arr;
};
var joiny = function(arr, joiner) {
var str = "";
for (var i = 0; i < arr.length; i += 1) {
str += arr[i];
if (i + 1 < arr.length) {
str += joiner;
}
}
return str;
};
module2.exports = function bind2(that) {
var target = this;
if (typeof target !== "function" || toStr.apply(target) !== funcType) {
throw new TypeError(ERROR_MESSAGE + target);
}
var args = slicy(arguments, 1);
var bound;
var binder = function() {
if (this instanceof bound) {
var result = target.apply(this, concatty(args, arguments));
if (Object(result) === result) {
return result;
}
return this;
}
return target.apply(that, concatty(args, arguments));
};
var boundLength = max(0, target.length - args.length);
var boundArgs = [];
for (var i = 0; i < boundLength; i++) {
boundArgs[i] = "$" + i;
}
bound = Function("binder", "return function (" + joiny(boundArgs, ",") + "){ return binder.apply(this,arguments); }")(binder);
if (target.prototype) {
var Empty2 = function Empty3() {
};
Empty2.prototype = target.prototype;
bound.prototype = new Empty2();
Empty2.prototype = null;
}
return bound;
};
}
});
// node_modules/function-bind/index.js
var require_function_bind = __commonJS({
"node_modules/function-bind/index.js"(exports, module2) {
"use strict";
var implementation = require_implementation();
module2.exports = Function.prototype.bind || implementation;
}
});
// node_modules/call-bind-apply-helpers/functionCall.js
var require_functionCall = __commonJS({
"node_modules/call-bind-apply-helpers/functionCall.js"(exports, module2) {
"use strict";
module2.exports = Function.prototype.call;
}
});
// node_modules/call-bind-apply-helpers/functionApply.js
var require_functionApply = __commonJS({
"node_modules/call-bind-apply-helpers/functionApply.js"(exports, module2) {
"use strict";
module2.exports = Function.prototype.apply;
}
});
// node_modules/call-bind-apply-helpers/reflectApply.js
var require_reflectApply = __commonJS({
"node_modules/call-bind-apply-helpers/reflectApply.js"(exports, module2) {
"use strict";
module2.exports = typeof Reflect !== "undefined" && Reflect && Reflect.apply;
}
});
// node_modules/call-bind-apply-helpers/actualApply.js
var require_actualApply = __commonJS({
"node_modules/call-bind-apply-helpers/actualApply.js"(exports, module2) {
"use strict";
var bind2 = require_function_bind();
var $apply = require_functionApply();
var $call = require_functionCall();
var $reflectApply = require_reflectApply();
module2.exports = $reflectApply || bind2.call($call, $apply);
}
});
// node_modules/call-bind-apply-helpers/index.js
var require_call_bind_apply_helpers = __commonJS({
"node_modules/call-bind-apply-helpers/index.js"(exports, module2) {
"use strict";
var bind2 = require_function_bind();
var $TypeError = require_type();
var $call = require_functionCall();
var $actualApply = require_actualApply();
module2.exports = function callBindBasic(args) {
if (args.length < 1 || typeof args[0] !== "function") {
throw new $TypeError("a function is required");
}
return $actualApply(bind2, $call, args);
};
}
});
// node_modules/dunder-proto/get.js
var require_get = __commonJS({
"node_modules/dunder-proto/get.js"(exports, module2) {
"use strict";
var callBind = require_call_bind_apply_helpers();
var gOPD = require_gopd();
var hasProtoAccessor;
try {
hasProtoAccessor = [].__proto__ === Array.prototype;
} catch (e) {
if (!e || typeof e !== "object" || !("code" in e) || e.code !== "ERR_PROTO_ACCESS") {
throw e;
}
}
var desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, "__proto__");
var $Object = Object;
var $getPrototypeOf = $Object.getPrototypeOf;
module2.exports = desc && typeof desc.get === "function" ? callBind([desc.get]) : typeof $getPrototypeOf === "function" ? function getDunder(value) {
return $getPrototypeOf(value == null ? value : $Object(value));
} : false;
}
});
// node_modules/get-proto/index.js
var require_get_proto = __commonJS({
"node_modules/get-proto/index.js"(exports, module2) {
"use strict";
var reflectGetProto = require_Reflect_getPrototypeOf();
var originalGetProto = require_Object_getPrototypeOf();
var getDunderProto = require_get();
module2.exports = reflectGetProto ? function getProto(O) {
return reflectGetProto(O);
} : originalGetProto ? function getProto(O) {
if (!O || typeof O !== "object" && typeof O !== "function") {
throw new TypeError("getProto: not an object");
}
return originalGetProto(O);
} : getDunderProto ? function getProto(O) {
return getDunderProto(O);
} : null;
}
});
// node_modules/hasown/index.js
var require_hasown = __commonJS({
"node_modules/hasown/index.js"(exports, module2) {
"use strict";
var call = Function.prototype.call;
var $hasOwn = Object.prototype.hasOwnProperty;
var bind2 = require_function_bind();
module2.exports = bind2.call(call, $hasOwn);
}
});
// node_modules/get-intrinsic/index.js
var require_get_intrinsic = __commonJS({
"node_modules/get-intrinsic/index.js"(exports, module2) {
"use strict";
var undefined2;
var $Object = require_es_object_atoms();
var $Error = require_es_errors();
var $EvalError = require_eval();
var $RangeError = require_range();
var $ReferenceError = require_ref();
var $SyntaxError = require_syntax();
var $TypeError = require_type();
var $URIError = require_uri();
var abs = require_abs();
var floor = require_floor();
var max = require_max();
var min = require_min();
var pow = require_pow();
var round = require_round();
var sign = require_sign();
var $Function = Function;
var getEvalledConstructor = function(expressionSyntax) {
try {
return $Function('"use strict"; return (' + expressionSyntax + ").constructor;")();
} catch (e) {
}
};
var $gOPD = require_gopd();
var $defineProperty = require_es_define_property();
var throwTypeError = function() {
throw new $TypeError();
};
var ThrowTypeError = $gOPD ? function() {
try {
arguments.callee;
return throwTypeError;
} catch (calleeThrows) {
try {
return $gOPD(arguments, "callee").get;
} catch (gOPDthrows) {
return throwTypeError;
}
}
}() : throwTypeError;
var hasSymbols = require_has_symbols()();
var getProto = require_get_proto();
var $ObjectGPO = require_Object_getPrototypeOf();
var $ReflectGPO = require_Reflect_getPrototypeOf();
var $apply = require_functionApply();
var $call = require_functionCall();
var needsEval = {};
var TypedArray = typeof Uint8Array === "undefined" || !getProto ? undefined2 : getProto(Uint8Array);
var INTRINSICS = {
__proto__: null,
"%AggregateError%": typeof AggregateError === "undefined" ? undefined2 : AggregateError,
"%Array%": Array,
"%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined2 : ArrayBuffer,
"%ArrayIteratorPrototype%": hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined2,
"%AsyncFromSyncIteratorPrototype%": undefined2,
"%AsyncFunction%": needsEval,
"%AsyncGenerator%": needsEval,
"%AsyncGeneratorFunction%": needsEval,
"%AsyncIteratorPrototype%": needsEval,
"%Atomics%": typeof Atomics === "undefined" ? undefined2 : Atomics,
"%BigInt%": typeof BigInt === "undefined" ? undefined2 : BigInt,
"%BigInt64Array%": typeof BigInt64Array === "undefined" ? undefined2 : BigInt64Array,
"%BigUint64Array%": typeof BigUint64Array === "undefined" ? undefined2 : BigUint64Array,
"%Boolean%": Boolean,
"%DataView%": typeof DataView === "undefined" ? undefined2 : DataView,
"%Date%": Date,
"%decodeURI%": decodeURI,
"%decodeURIComponent%": decodeURIComponent,
"%encodeURI%": encodeURI,
"%encodeURIComponent%": encodeURIComponent,
"%Error%": $Error,
"%eval%": eval,
"%EvalError%": $EvalError,
"%Float16Array%": typeof Float16Array === "undefined" ? undefined2 : Float16Array,
"%Float32Array%": typeof Float32Array === "undefined" ? undefined2 : Float32Array,
"%Float64Array%": typeof Float64Array === "undefined" ? undefined2 : Float64Array,
"%FinalizationRegistry%": typeof FinalizationRegistry === "undefined" ? undefined2 : FinalizationRegistry,
"%Function%": $Function,
"%GeneratorFunction%": needsEval,
"%Int8Array%": typeof Int8Array === "undefined" ? undefined2 : Int8Array,
"%Int16Array%": typeof Int16Array === "undefined" ? undefined2 : Int16Array,
"%Int32Array%": typeof Int32Array === "undefined" ? undefined2 : Int32Array,
"%isFinite%": isFinite,
"%isNaN%": isNaN,
"%IteratorPrototype%": hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined2,
"%JSON%": typeof JSON === "object" ? JSON : undefined2,
"%Map%": typeof Map === "undefined" ? undefined2 : Map,
"%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto(new Map()[Symbol.iterator]()),
"%Math%": Math,
"%Number%": Number,
"%Object%": $Object,
"%Object.getOwnPropertyDescriptor%": $gOPD,
"%parseFloat%": parseFloat,
"%parseInt%": parseInt,
"%Promise%": typeof Promise === "undefined" ? undefined2 : Promise,
"%Proxy%": typeof Proxy === "undefined" ? undefined2 : Proxy,
"%RangeError%": $RangeError,
"%ReferenceError%": $ReferenceError,
"%Reflect%": typeof Reflect === "undefined" ? undefined2 : Reflect,
"%RegExp%": RegExp,
"%Set%": typeof Set === "undefined" ? undefined2 : Set,
"%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto(new Set()[Symbol.iterator]()),
"%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined2 : SharedArrayBuffer,
"%String%": String,
"%StringIteratorPrototype%": hasSymbols && getProto ? getProto(""[Symbol.iterator]()) : undefined2,
"%Symbol%": hasSymbols ? Symbol : undefined2,
"%SyntaxError%": $SyntaxError,
"%ThrowTypeError%": ThrowTypeError,
"%TypedArray%": TypedArray,
"%TypeError%": $TypeError,
"%Uint8Array%": typeof Uint8Array === "undefined" ? undefined2 : Uint8Array,
"%Uint8ClampedArray%": typeof Uint8ClampedArray === "undefined" ? undefined2 : Uint8ClampedArray,
"%Uint16Array%": typeof Uint16Array === "undefined" ? undefined2 : Uint16Array,
"%Uint32Array%": typeof Uint32Array === "undefined" ? undefined2 : Uint32Array,
"%URIError%": $URIError,
"%WeakMap%": typeof WeakMap === "undefined" ? undefined2 : WeakMap,
"%WeakRef%": typeof WeakRef === "undefined" ? undefined2 : WeakRef,
"%WeakSet%": typeof WeakSet === "undefined" ? undefined2 : WeakSet,
"%Function.prototype.call%": $call,
"%Function.prototype.apply%": $apply,
"%Object.defineProperty%": $defineProperty,
"%Object.getPrototypeOf%": $ObjectGPO,
"%Math.abs%": abs,
"%Math.floor%": floor,
"%Math.max%": max,
"%Math.min%": min,
"%Math.pow%": pow,
"%Math.round%": round,
"%Math.sign%": sign,
"%Reflect.getPrototypeOf%": $ReflectGPO
};
if (getProto) {
try {
null.error;
} catch (e) {
errorProto = getProto(getProto(e));
INTRINSICS["%Error.prototype%"] = errorProto;
}
}
var errorProto;
var doEval = function doEval2(name) {
var value;
if (name === "%AsyncFunction%") {
value = getEvalledConstructor("async function () {}");
} else if (name === "%GeneratorFunction%") {
value = getEvalledConstructor("function* () {}");
} else if (name === "%AsyncGeneratorFunction%") {
value = getEvalledConstructor("async function* () {}");
} else if (name === "%AsyncGenerator%") {
var fn = doEval2("%AsyncGeneratorFunction%");
if (fn) {
value = fn.prototype;
}
} else if (name === "%AsyncIteratorPrototype%") {
var gen = doEval2("%AsyncGenerator%");
if (gen && getProto) {
value = getProto(gen.prototype);
}
}
INTRINSICS[name] = value;
return value;
};
var LEGACY_ALIASES = {
__proto__: null,
"%ArrayBufferPrototype%": ["ArrayBuffer", "prototype"],
"%ArrayPrototype%": ["Array", "prototype"],
"%ArrayProto_entries%": ["Array", "prototype", "entries"],
"%ArrayProto_forEach%": ["Array", "prototype", "forEach"],
"%ArrayProto_keys%": ["Array", "prototype", "keys"],
"%ArrayProto_values%": ["Array", "prototype", "values"],
"%AsyncFunctionPrototype%": ["AsyncFunction", "prototype"],
"%AsyncGenerator%": ["AsyncGeneratorFunction", "prototype"],
"%AsyncGeneratorPrototype%": ["AsyncGeneratorFunction", "prototype", "prototype"],
"%BooleanPrototype%": ["Boolean", "prototype"],
"%DataViewPrototype%": ["DataView", "prototype"],
"%DatePrototype%": ["Date", "prototype"],
"%ErrorPrototype%": ["Error", "prototype"],
"%EvalErrorPrototype%": ["EvalError", "prototype"],
"%Float32ArrayPrototype%": ["Float32Array", "prototype"],
"%Float64ArrayPrototype%": ["Float64Array", "prototype"],
"%FunctionPrototype%": ["Function", "prototype"],
"%Generator%": ["GeneratorFunction", "prototype"],
"%GeneratorPrototype%": ["GeneratorFunction", "prototype", "prototype"],
"%Int8ArrayPrototype%": ["Int8Array", "prototype"],
"%Int16ArrayPrototype%": ["Int16Array", "prototype"],
"%Int32ArrayPrototype%": ["Int32Array", "prototype"],
"%JSONParse%": ["JSON", "parse"],
"%JSONStringify%": ["JSON", "stringify"],
"%MapPrototype%": ["Map", "prototype"],
"%NumberPrototype%": ["Number", "prototype"],
"%ObjectPrototype%": ["Object", "prototype"],
"%ObjProto_toString%": ["Object", "prototype", "toString"],
"%ObjProto_valueOf%": ["Object", "prototype", "valueOf"],
"%PromisePrototype%": ["Promise", "prototype"],
"%PromiseProto_then%": ["Promise", "prototype", "then"],
"%Promise_all%": ["Promise", "all"],
"%Promise_reject%": ["Promise", "reject"],
"%Promise_resolve%": ["Promise", "resolve"],
"%RangeErrorPrototype%": ["RangeError", "prototype"],
"%ReferenceErrorPrototype%": ["ReferenceError", "prototype"],
"%RegExpPrototype%": ["RegExp", "prototype"],
"%SetPrototype%": ["Set", "prototype"],
"%SharedArrayBufferPrototype%": ["SharedArrayBuffer", "prototype"],
"%StringPrototype%": ["String", "prototype"],
"%SymbolPrototype%": ["Symbol", "prototype"],
"%SyntaxErrorPrototype%": ["SyntaxError", "prototype"],
"%TypedArrayPrototype%": ["TypedArray", "prototype"],
"%TypeErrorPrototype%": ["TypeError", "prototype"],
"%Uint8ArrayPrototype%": ["Uint8Array", "prototype"],
"%Uint8ClampedArrayPrototype%": ["Uint8ClampedArray", "prototype"],
"%Uint16ArrayPrototype%": ["Uint16Array", "prototype"],
"%Uint32ArrayPrototype%": ["Uint32Array", "prototype"],
"%URIErrorPrototype%": ["URIError", "prototype"],
"%WeakMapPrototype%": ["WeakMap", "prototype"],
"%WeakSetPrototype%": ["WeakSet", "prototype"]
};
var bind2 = require_function_bind();
var hasOwn = require_hasown();
var $concat = bind2.call($call, Array.prototype.concat);
var $spliceApply = bind2.call($apply, Array.prototype.splice);
var $replace = bind2.call($call, String.prototype.replace);
var $strSlice = bind2.call($call, String.prototype.slice);
var $exec = bind2.call($call, RegExp.prototype.exec);
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g;
var stringToPath = function stringToPath2(string) {
var first = $strSlice(string, 0, 1);
var last = $strSlice(string, -1);
if (first === "%" && last !== "%") {
throw new $SyntaxError("invalid intrinsic syntax, expected closing `%`");
} else if (last === "%" && first !== "%") {
throw new $SyntaxError("invalid intrinsic syntax, expected opening `%`");
}
var result = [];
$replace(string, rePropName, function(match2, number, quote, subString) {
result[result.length] = quote ? $replace(subString, reEscapeChar, "$1") : number || match2;
});
return result;
};
var getBaseIntrinsic = function getBaseIntrinsic2(name, allowMissing) {
var intrinsicName = name;
var alias;
if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
alias = LEGACY_ALIASES[intrinsicName];
intrinsicName = "%" + alias[0] + "%";
}
if (hasOwn(INTRINSICS, intrinsicName)) {
var value = INTRINSICS[intrinsicName];
if (value === needsEval) {
value = doEval(intrinsicName);
}
if (typeof value === "undefined" && !allowMissing) {
throw new $TypeError("intrinsic " + name + " exists, but is not available. Please file an issue!");
}
return {
alias,
name: intrinsicName,
value
};
}
throw new $SyntaxError("intrinsic " + name + " does not exist!");
};
module2.exports = function GetIntrinsic(name, allowMissing) {
if (typeof name !== "string" || name.length === 0) {
throw new $TypeError("intrinsic name must be a non-empty string");
}
if (arguments.length > 1 && typeof allowMissing !== "boolean") {
throw new $TypeError('"allowMissing" argument must be a boolean');
}
if ($exec(/^%?[^%]*%?$/, name) === null) {
throw new $SyntaxError("`%` may not be present anywhere but at the beginning and end of the intrinsic name");
}
var parts = stringToPath(name);
var intrinsicBaseName = parts.length > 0 ? parts[0] : "";
var intrinsic = getBaseIntrinsic("%" + intrinsicBaseName + "%", allowMissing);
var intrinsicRealName = intrinsic.name;
var value = intrinsic.value;
var skipFurtherCaching = false;
var alias = intrinsic.alias;
if (alias) {
intrinsicBaseName = alias[0];
$spliceApply(parts, $concat([0, 1], alias));
}
for (var i = 1, isOwn = true; i < parts.length; i += 1) {
var part = parts[i];
var first = $strSlice(part, 0, 1);
var last = $strSlice(part, -1);
if ((first === '"' || first === "'" || first === "`" || (last === '"' || last === "'" || last === "`")) && first !== last) {
throw new $SyntaxError("property names with quotes must have matching quotes");
}
if (part === "constructor" || !isOwn) {
skipFurtherCaching = true;
}
intrinsicBaseName += "." + part;
intrinsicRealName = "%" + intrinsicBaseName + "%";
if (hasOwn(INTRINSICS, intrinsicRealName)) {
value = INTRINSICS[intrinsicRealName];
} else if (value != null) {
if (!(part in value)) {
if (!allowMissing) {
throw new $TypeError("base intrinsic for " + name + " exists, but the property is not available.");
}
return void 0;
}
if ($gOPD && i + 1 >= parts.length) {
var desc = $gOPD(value, part);
isOwn = !!desc;
if (isOwn && "get" in desc && !("originalValue" in desc.get)) {
value = desc.get;
} else {
value = value[part];
}
} else {
isOwn = hasOwn(value, part);
value = value[part];
}
if (isOwn && !skipFurtherCaching) {
INTRINSICS[intrinsicRealName] = value;
}
}
}
return value;
};
}
});
// node_modules/call-bound/index.js
var require_call_bound = __commonJS({
"node_modules/call-bound/index.js"(exports, module2) {
"use strict";
var GetIntrinsic = require_get_intrinsic();
var callBindBasic = require_call_bind_apply_helpers();
var $indexOf = callBindBasic([GetIntrinsic("%String.prototype.indexOf%")]);
module2.exports = function callBoundIntrinsic(name, allowMissing) {
var intrinsic = GetIntrinsic(name, !!allowMissing);
if (typeof intrinsic === "function" && $indexOf(name, ".prototype.") > -1) {
return callBindBasic([intrinsic]);
}
return intrinsic;
};
}
});
// node_modules/side-channel-map/index.js
var require_side_channel_map = __commonJS({
"node_modules/side-channel-map/index.js"(exports, module2) {
"use strict";
var GetIntrinsic = require_get_intrinsic();
var callBound = require_call_bound();
var inspect = require_object_inspect();
var $TypeError = require_type();
var $Map = GetIntrinsic("%Map%", true);
var $mapGet = callBound("Map.prototype.get", true);
var $mapSet = callBound("Map.prototype.set", true);
var $mapHas = callBound("Map.prototype.has", true);
var $mapDelete = callBound("Map.prototype.delete", true);
var $mapSize = callBound("Map.prototype.size", true);
module2.exports = !!$Map && function getSideChannelMap() {
var $m;
var channel = {
assert: function(key) {
if (!channel.has(key)) {
throw new $TypeError("Side channel does not contain " + inspect(key));
}
},
"delete": function(key) {
if ($m) {
var result = $mapDelete($m, key);
if ($mapSize($m) === 0) {
$m = void 0;
}
return result;
}
return false;
},
get: function(key) {
if ($m) {
return $mapGet($m, key);
}
},
has: function(key) {
if ($m) {
return $mapHas($m, key);
}
return false;
},
set: function(key, value) {
if (!$m) {
$m = new $Map();
}
$mapSet($m, key, value);
}
};
return channel;
};
}
});
// node_modules/side-channel-weakmap/index.js
var require_side_channel_weakmap = __commonJS({
"node_modules/side-channel-weakmap/index.js"(exports, module2) {
"use strict";
var GetIntrinsic = require_get_intrinsic();
var callBound = require_call_bound();
var inspect = require_object_inspect();
var getSideChannelMap = require_side_channel_map();
var $TypeError = require_type();
var $WeakMap = GetIntrinsic("%WeakMap%", true);
var $weakMapGet = callBound("WeakMap.prototype.get", true);
var $weakMapSet = callBound("WeakMap.prototype.set", true);
var $weakMapHas = callBound("WeakMap.prototype.has", true);
var $weakMapDelete = callBound("WeakMap.prototype.delete", true);
module2.exports = $WeakMap ? function getSideChannelWeakMap() {
var $wm;
var $m;
var channel = {
assert: function(key) {
if (!channel.has(key)) {
throw new $TypeError("Side channel does not contain " + inspect(key));
}
},
"delete": function(key) {
if ($WeakMap && key && (typeof key === "object" || typeof key === "function")) {
if ($wm) {
return $weakMapDelete($wm, key);
}
} else if (getSideChannelMap) {
if ($m) {
return $m["delete"](key);
}
}
return false;
},
get: function(key) {
if ($WeakMap && key && (typeof key === "object" || typeof key === "function")) {
if ($wm) {
return $weakMapGet($wm, key);
}
}
return $m && $m.get(key);
},
has: function(key) {
if ($WeakMap && key && (typeof key === "object" || typeof key === "function")) {
if ($wm) {
return $weakMapHas($wm, key);
}
}
return !!$m && $m.has(key);
},
set: function(key, value) {
if ($WeakMap && key && (typeof key === "object" || typeof key === "function")) {
if (!$wm) {
$wm = new $WeakMap();
}
$weakMapSet($wm, key, value);
} else if (getSideChannelMap) {
if (!$m) {
$m = getSideChannelMap();
}
$m.set(key, value);
}
}
};
return channel;
} : getSideChannelMap;
}
});
// node_modules/side-channel/index.js
var require_side_channel = __commonJS({
"node_modules/side-channel/index.js"(exports, module2) {
"use strict";
var $TypeError = require_type();
var inspect = require_object_inspect();
var getSideChannelList = require_side_channel_list();
var getSideChannelMap = require_side_channel_map();
var getSideChannelWeakMap = require_side_channel_weakmap();
var makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList;
module2.exports = function getSideChannel() {
var $channelData;
var channel = {
assert: function(key) {
if (!channel.has(key)) {
throw new $TypeError("Side channel does not contain " + inspect(key));
}
},
"delete": function(key) {
return !!$channelData && $channelData["delete"](key);
},
get: function(key) {
return $channelData && $channelData.get(key);
},
has: function(key) {
return !!$channelData && $channelData.has(key);
},
set: function(key, value) {
if (!$channelData) {
$channelData = makeChannel();
}
$channelData.set(key, value);
}
};
return channel;
};
}
});
// node_modules/qs/lib/formats.js
var require_formats = __commonJS({
"node_modules/qs/lib/formats.js"(exports, module2) {
"use strict";
var replace = String.prototype.replace;
var percentTwenties = /%20/g;
var Format = {
RFC1738: "RFC1738",
RFC3986: "RFC3986"
};
module2.exports = {
"default": Format.RFC3986,
formatters: {
RFC1738: function(value) {
return replace.call(value, percentTwenties, "+");
},
RFC3986: function(value) {
return String(value);
}
},
RFC1738: Format.RFC1738,
RFC3986: Format.RFC3986
};
}
});
// node_modules/qs/lib/utils.js
var require_utils = __commonJS({
"node_modules/qs/lib/utils.js"(exports, module2) {
"use strict";
var formats = require_formats();
var has = Object.prototype.hasOwnProperty;
var isArray3 = Array.isArray;
var hexTable = function() {
var array = [];
for (var i = 0; i < 256; ++i) {
array.push("%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase());
}
return array;
}();
var compactQueue = function compactQueue2(queue) {
while (queue.length > 1) {
var item = queue.pop();
var obj = item.obj[item.prop];
if (isArray3(obj)) {
var compacted = [];
for (var j = 0; j < obj.length; ++j) {
if (typeof obj[j] !== "undefined") {
compacted.push(obj[j]);
}
}
item.obj[item.prop] = compacted;
}
}
};
var arrayToObject2 = function arrayToObject3(source, options) {
var obj = options && options.plainObjects ? { __proto__: null } : {};
for (var i = 0; i < source.length; ++i) {
if (typeof source[i] !== "undefined") {
obj[i] = source[i];
}
}
return obj;
};
var merge2 = function merge3(target, source, options) {
if (!source) {
return target;
}
if (typeof source !== "object" && typeof source !== "function") {
if (isArray3(target)) {
target.push(source);
} else if (target && typeof target === "object") {
if (options && (options.plainObjects || options.allowPrototypes) || !has.call(Object.prototype, source)) {
target[source] = true;
}
} else {
return [target, source];
}
return target;
}
if (!target || typeof target !== "object") {
return [target].concat(source);
}
var mergeTarget = target;
if (isArray3(target) && !isArray3(source)) {
mergeTarget = arrayToObject2(target, options);
}
if (isArray3(target) && isArray3(source)) {
source.forEach(function(item, i) {
if (has.call(target, i)) {
var targetItem = target[i];
if (targetItem && typeof targetItem === "object" && item && typeof item === "object") {
target[i] = merge3(targetItem, item, options);
} else {
target.push(item);
}
} else {
target[i] = item;
}
});
return target;
}
return Object.keys(source).reduce(function(acc, key) {
var value = source[key];
if (has.call(acc, key)) {
acc[key] = merge3(acc[key], value, options);
} else {
acc[key] = value;
}
return acc;
}, mergeTarget);
};
var assign2 = function assignSingleSource(target, source) {
return Object.keys(source).reduce(function(acc, key) {
acc[key] = source[key];
return acc;
}, target);
};
var decode = function(str, defaultDecoder, charset) {
var strWithoutPlus = str.replace(/\+/g, " ");
if (charset === "iso-8859-1") {
return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
}
try {
return decodeURIComponent(strWithoutPlus);
} catch (e) {
return strWithoutPlus;
}
};
var limit = 1024;
var encode3 = function encode4(str, defaultEncoder, charset, kind, format) {
if (str.length === 0) {
return str;
}
var string = str;
if (typeof str === "symbol") {
string = Symbol.prototype.toString.call(str);
} else if (typeof str !== "string") {
string = String(str);
}
if (charset === "iso-8859-1") {
return escape(string).replace(/%u[0-9a-f]{4}/gi, function($0) {
return "%26%23" + parseInt($0.slice(2), 16) + "%3B";
});
}
var out = "";
for (var j = 0; j < string.length; j += limit) {
var segment = string.length >= limit ? string.slice(j, j + limit) : string;
var arr = [];
for (var i = 0; i < segment.length; ++i) {
var c = segment.charCodeAt(i);
if (c === 45 || c === 46 || c === 95 || c === 126 || c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122 || format === formats.RFC1738 && (c === 40 || c === 41)) {
arr[arr.length] = segment.charAt(i);
continue;
}
if (c < 128) {
arr[arr.length] = hexTable[c];
continue;
}
if (c < 2048) {
arr[arr.length] = hexTable[192 | c >> 6] + hexTable[128 | c & 63];
continue;
}
if (c < 55296 || c >= 57344) {
arr[arr.length] = hexTable[224 | c >> 12] + hexTable[128 | c >> 6 & 63] + hexTable[128 | c & 63];
continue;
}
i += 1;
c = 65536 + ((c & 1023) << 10 | segment.charCodeAt(i) & 1023);
arr[arr.length] = hexTable[240 | c >> 18] + hexTable[128 | c >> 12 & 63] + hexTable[128 | c >> 6 & 63] + hexTable[128 | c & 63];
}
out += arr.join("");
}
return out;
};
var compact = function compact2(value) {
var queue = [{ obj: { o: value }, prop: "o" }];
var refs = [];
for (var i = 0; i < queue.length; ++i) {
var item = queue[i];
var obj = item.obj[item.prop];
var keys = Object.keys(obj);
for (var j = 0; j < keys.length; ++j) {
var key = keys[j];
var val = obj[key];
if (typeof val === "object" && val !== null && refs.indexOf(val) === -1) {
queue.push({ obj, prop: key });
refs.push(val);
}
}
}
compactQueue(queue);
return value;
};
var isRegExp2 = function isRegExp3(obj) {
return Object.prototype.toString.call(obj) === "[object RegExp]";
};
var isBuffer2 = function isBuffer3(obj) {
if (!obj || typeof obj !== "object") {
return false;
}
return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};
var combine = function combine2(a, b) {
return [].concat(a, b);
};
var maybeMap = function maybeMap2(val, fn) {
if (isArray3(val)) {
var mapped = [];
for (var i = 0; i < val.length; i += 1) {
mapped.push(fn(val[i]));
}
return mapped;
}
return fn(val);
};
module2.exports = {
arrayToObject: arrayToObject2,
assign: assign2,
combine,
compact,
decode,
encode: encode3,
isBuffer: isBuffer2,
isRegExp: isRegExp2,
maybeMap,
merge: merge2
};
}
});
// node_modules/qs/lib/stringify.js
var require_stringify = __commonJS({
"node_modules/qs/lib/stringify.js"(exports, module2) {
"use strict";
var getSideChannel = require_side_channel();
var utils = require_utils();
var formats = require_formats();
var has = Object.prototype.hasOwnProperty;
var arrayPrefixGenerators = {
brackets: function brackets(prefix2) {
return prefix2 + "[]";
},
comma: "comma",
indices: function indices(prefix2, key) {
return prefix2 + "[" + key + "]";
},
repeat: function repeat(prefix2) {
return prefix2;
}
};
var isArray3 = Array.isArray;
var push = Array.prototype.push;
var pushToArray = function(arr, valueOrArray) {
push.apply(arr, isArray3(valueOrArray) ? valueOrArray : [valueOrArray]);
};
var toISO = Date.prototype.toISOString;
var defaultFormat = formats["default"];
var defaults2 = {
addQueryPrefix: false,
allowDots: false,
allowEmptyArrays: false,
arrayFormat: "indices",
charset: "utf-8",
charsetSentinel: false,
commaRoundTrip: false,
delimiter: "&",
encode: true,
encodeDotInKeys: false,
encoder: utils.encode,
encodeValuesOnly: false,
filter: void 0,
format: defaultFormat,
formatter: formats.formatters[defaultFormat],
indices: false,
serializeDate: function serializeDate(date) {
return toISO.call(date);
},
skipNulls: false,
strictNullHandling: false
};
var isNonNullishPrimitive = function isNonNullishPrimitive2(v) {
return typeof v === "string" || typeof v === "number" || typeof v === "boolean" || typeof v === "symbol" || typeof v === "bigint";
};
var sentinel = {};
var stringify = function stringify2(object, prefix2, generateArrayPrefix, commaRoundTrip, allowEmptyArrays, strictNullHandling, skipNulls, encodeDotInKeys, encoder, filter2, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, sideChannel) {
var obj = object;
var tmpSc = sideChannel;
var step = 0;
var findFlag = false;
while ((tmpSc = tmpSc.get(sentinel)) !== void 0 && !findFlag) {
var pos = tmpSc.get(object);
step += 1;
if (typeof pos !== "undefined") {
if (pos === step) {
throw new RangeError("Cyclic object value");
} else {
findFlag = true;
}
}
if (typeof tmpSc.get(sentinel) === "undefined") {
step = 0;
}
}
if (typeof filter2 === "function") {
obj = filter2(prefix2, obj);
} else if (obj instanceof Date) {
obj = serializeDate(obj);
} else if (generateArrayPrefix === "comma" && isArray3(obj)) {
obj = utils.maybeMap(obj, function(value2) {
if (value2 instanceof Date) {
return serializeDate(value2);
}
return value2;
});
}
if (obj === null) {
if (strictNullHandling) {
return encoder && !encodeValuesOnly ? encoder(prefix2, defaults2.encoder, charset, "key", format) : prefix2;
}
obj = "";
}
if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
if (encoder) {
var keyValue = encodeValuesOnly ? prefix2 : encoder(prefix2, defaults2.encoder, charset, "key", format);
return [formatter(keyValue) + "=" + formatter(encoder(obj, defaults2.encoder, charset, "value", format))];
}
return [formatter(prefix2) + "=" + formatter(String(obj))];
}
var values = [];
if (typeof obj === "undefined") {
return values;
}
var objKeys;
if (generateArrayPrefix === "comma" && isArray3(obj)) {
if (encodeValuesOnly && encoder) {
obj = utils.maybeMap(obj, encoder);
}
objKeys = [{ value: obj.length > 0 ? obj.join(",") || null : void 0 }];
} else if (isArray3(filter2)) {
objKeys = filter2;
} else {
var keys = Object.keys(obj);
objKeys = sort ? keys.sort(sort) : keys;
}
var encodedPrefix = encodeDotInKeys ? String(prefix2).replace(/\./g, "%2E") : String(prefix2);
var adjustedPrefix = commaRoundTrip && isArray3(obj) && obj.length === 1 ? encodedPrefix + "[]" : encodedPrefix;
if (allowEmptyArrays && isArray3(obj) && obj.length === 0) {
return adjustedPrefix + "[]";
}
for (var j = 0; j < objKeys.length; ++j) {
var key = objKeys[j];
var value = typeof key === "object" && key && typeof key.value !== "undefined" ? key.value : obj[key];
if (skipNulls && value === null) {
continue;
}
var encodedKey = allowDots && encodeDotInKeys ? String(key).replace(/\./g, "%2E") : String(key);
var keyPrefix = isArray3(obj) ? typeof generateArrayPrefix === "function" ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix : adjustedPrefix + (allowDots ? "." + encodedKey : "[" + encodedKey + "]");
sideChannel.set(object, step);
var valueSideChannel = getSideChannel();
valueSideChannel.set(sentinel, sideChannel);
pushToArray(values, stringify2(value, keyPrefix, generateArrayPrefix, commaRoundTrip, allowEmptyArrays, strictNullHandling, skipNulls, encodeDotInKeys, generateArrayPrefix === "comma" && encodeValuesOnly && isArray3(obj) ? null : encoder, filter2, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, valueSideChannel));
}
return values;
};
var normalizeStringifyOptions = function normalizeStringifyOptions2(opts) {
if (!opts) {
return defaults2;
}
if (typeof opts.allowEmptyArrays !== "undefined" && typeof opts.allowEmptyArrays !== "boolean") {
throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");
}
if (typeof opts.encodeDotInKeys !== "undefined" && typeof opts.encodeDotInKeys !== "boolean") {
throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");
}
if (opts.encoder !== null && typeof opts.encoder !== "undefined" && typeof opts.encoder !== "function") {
throw new TypeError("Encoder has to be a function.");
}
var charset = opts.charset || defaults2.charset;
if (typeof opts.charset !== "undefined" && opts.charset !== "utf-8" && opts.charset !== "iso-8859-1") {
throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");
}
var format = formats["default"];
if (typeof opts.format !== "undefined") {
if (!has.call(formats.formatters, opts.format)) {
throw new TypeError("Unknown format option provided.");
}
format = opts.format;
}
var formatter = formats.formatters[format];
var filter2 = defaults2.filter;
if (typeof opts.filter === "function" || isArray3(opts.filter)) {
filter2 = opts.filter;
}
var arrayFormat;
if (opts.arrayFormat in arrayPrefixGenerators) {
arrayFormat = opts.arrayFormat;
} else if ("indices" in opts) {
arrayFormat = opts.indices ? "indices" : "repeat";
} else {
arrayFormat = defaults2.arrayFormat;
}
if ("commaRoundTrip" in opts && typeof opts.commaRoundTrip !== "boolean") {
throw new TypeError("`commaRoundTrip` must be a boolean, or absent");
}
var allowDots = typeof opts.allowDots === "undefined" ? opts.encodeDotInKeys === true ? true : defaults2.allowDots : !!opts.allowDots;
return {
addQueryPrefix: typeof opts.addQueryPrefix === "boolean" ? opts.addQueryPrefix : defaults2.addQueryPrefix,
allowDots,
allowEmptyArrays: typeof opts.allowEmptyArrays === "boolean" ? !!opts.allowEmptyArrays : defaults2.allowEmptyArrays,
arrayFormat,
charset,
charsetSentinel: typeof opts.charsetSentinel === "boolean" ? opts.charsetSentinel : defaults2.charsetSentinel,
commaRoundTrip: !!opts.commaRoundTrip,
delimiter: typeof opts.delimiter === "undefined" ? defaults2.delimiter : opts.delimiter,
encode: typeof opts.encode === "boolean" ? opts.encode : defaults2.encode,
encodeDotInKeys: typeof opts.encodeDotInKeys === "boolean" ? opts.encodeDotInKeys : defaults2.encodeDotInKeys,
encoder: typeof opts.encoder === "function" ? opts.encoder : defaults2.encoder,
encodeValuesOnly: typeof opts.encodeValuesOnly === "boolean" ? opts.encodeValuesOnly : defaults2.encodeValuesOnly,
filter: filter2,
format,
formatter,
serializeDate: typeof opts.serializeDate === "function" ? opts.serializeDate : defaults2.serializeDate,
skipNulls: typeof opts.skipNulls === "boolean" ? opts.skipNulls : defaults2.skipNulls,
sort: typeof opts.sort === "function" ? opts.sort : null,
strictNullHandling: typeof opts.strictNullHandling === "boolean" ? opts.strictNullHandling : defaults2.strictNullHandling
};
};
module2.exports = function(object, opts) {
var obj = object;
var options = normalizeStringifyOptions(opts);
var objKeys;
var filter2;
if (typeof options.filter === "function") {
filter2 = options.filter;
obj = filter2("", obj);
} else if (isArray3(options.filter)) {
filter2 = options.filter;
objKeys = filter2;
}
var keys = [];
if (typeof obj !== "object" || obj === null) {
return "";
}
var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat];
var commaRoundTrip = generateArrayPrefix === "comma" && options.commaRoundTrip;
if (!objKeys) {
objKeys = Object.keys(obj);
}
if (options.sort) {
objKeys.sort(options.sort);
}
var sideChannel = getSideChannel();
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
var value = obj[key];
if (options.skipNulls && value === null) {
continue;
}
pushToArray(keys, stringify(value, key, generateArrayPrefix, commaRoundTrip, options.allowEmptyArrays, options.strictNullHandling, options.skipNulls, options.encodeDotInKeys, options.encode ? options.encoder : null, options.filter, options.sort, options.allowDots, options.serializeDate, options.format, options.formatter, options.encodeValuesOnly, options.charset, sideChannel));
}
var joined = keys.join(options.delimiter);
var prefix2 = options.addQueryPrefix === true ? "?" : "";
if (options.charsetSentinel) {
if (options.charset === "iso-8859-1") {
prefix2 += "utf8=%26%2310003%3B&";
} else {
prefix2 += "utf8=%E2%9C%93&";
}
}
return joined.length > 0 ? prefix2 + joined : "";
};
}
});
// node_modules/qs/lib/parse.js
var require_parse = __commonJS({
"node_modules/qs/lib/parse.js"(exports, module2) {
"use strict";
var utils = require_utils();
var has = Object.prototype.hasOwnProperty;
var isArray3 = Array.isArray;
var defaults2 = {
allowDots: false,
allowEmptyArrays: false,
allowPrototypes: false,
allowSparse: false,
arrayLimit: 20,
charset: "utf-8",
charsetSentinel: false,
comma: false,
decodeDotInKeys: false,
decoder: utils.decode,
delimiter: "&",
depth: 5,
duplicates: "combine",
ignoreQueryPrefix: false,
interpretNumericEntities: false,
parameterLimit: 1e3,
parseArrays: true,
plainObjects: false,
strictDepth: false,
strictNullHandling: false,
throwOnLimitExceeded: false
};
var interpretNumericEntities = function(str) {
return str.replace(/&#(\d+);/g, function($0, numberStr) {
return String.fromCharCode(parseInt(numberStr, 10));
});
};
var parseArrayValue = function(val, options, currentArrayLength) {
if (val && typeof val === "string" && options.comma && val.indexOf(",") > -1) {
return val.split(",");
}
if (options.throwOnLimitExceeded && currentArrayLength >= options.arrayLimit) {
throw new RangeError("Array limit exceeded. Only " + options.arrayLimit + " element" + (options.arrayLimit === 1 ? "" : "s") + " allowed in an array.");
}
return val;
};
var isoSentinel = "utf8=%26%2310003%3B";
var charsetSentinel = "utf8=%E2%9C%93";
var parseValues = function parseQueryStringValues(str, options) {
var obj = { __proto__: null };
var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, "") : str;
cleanStr = cleanStr.replace(/%5B/gi, "[").replace(/%5D/gi, "]");
var limit = options.parameterLimit === Infinity ? void 0 : options.parameterLimit;
var parts = cleanStr.split(options.delimiter, options.throwOnLimitExceeded ? limit + 1 : limit);
if (options.throwOnLimitExceeded && parts.length > limit) {
throw new RangeError("Parameter limit exceeded. Only " + limit + " parameter" + (limit === 1 ? "" : "s") + " allowed.");
}
var skipIndex = -1;
var i;
var charset = options.charset;
if (options.charsetSentinel) {
for (i = 0; i < parts.length; ++i) {
if (parts[i].indexOf("utf8=") === 0) {
if (parts[i] === charsetSentinel) {
charset = "utf-8";
} else if (parts[i] === isoSentinel) {
charset = "iso-8859-1";
}
skipIndex = i;
i = parts.length;
}
}
}
for (i = 0; i < parts.length; ++i) {
if (i === skipIndex) {
continue;
}
var part = parts[i];
var bracketEqualsPos = part.indexOf("]=");
var pos = bracketEqualsPos === -1 ? part.indexOf("=") : bracketEqualsPos + 1;
var key;
var val;
if (pos === -1) {
key = options.decoder(part, defaults2.decoder, charset, "key");
val = options.strictNullHandling ? null : "";
} else {
key = options.decoder(part.slice(0, pos), defaults2.decoder, charset, "key");
val = utils.maybeMap(parseArrayValue(part.slice(pos + 1), options, isArray3(obj[key]) ? obj[key].length : 0), function(encodedVal) {
return options.decoder(encodedVal, defaults2.decoder, charset, "value");
});
}
if (val && options.interpretNumericEntities && charset === "iso-8859-1") {
val = interpretNumericEntities(String(val));
}
if (part.indexOf("[]=") > -1) {
val = isArray3(val) ? [val] : val;
}
var existing = has.call(obj, key);
if (existing && options.duplicates === "combine") {
obj[key] = utils.combine(obj[key], val);
} else if (!existing || options.duplicates === "last") {
obj[key] = val;
}
}
return obj;
};
var parseObject = function(chain, val, options, valuesParsed) {
var currentArrayLength = 0;
if (chain.length > 0 && chain[chain.length - 1] === "[]") {
var parentKey = chain.slice(0, -1).join("");
currentArrayLength = Array.isArray(val) && val[parentKey] ? val[parentKey].length : 0;
}
var leaf = valuesParsed ? val : parseArrayValue(val, options, currentArrayLength);
for (var i = chain.length - 1; i >= 0; --i) {
var obj;
var root = chain[i];
if (root === "[]" && options.parseArrays) {
obj = options.allowEmptyArrays && (leaf === "" || options.strictNullHandling && leaf === null) ? [] : utils.combine([], leaf);
} else {
obj = options.plainObjects ? { __proto__: null } : {};
var cleanRoot = root.charAt(0) === "[" && root.charAt(root.length - 1) === "]" ? root.slice(1, -1) : root;
var decodedRoot = options.decodeDotInKeys ? cleanRoot.replace(/%2E/g, ".") : cleanRoot;
var index2 = parseInt(decodedRoot, 10);
if (!options.parseArrays && decodedRoot === "") {
obj = { 0: leaf };
} else if (!isNaN(index2) && root !== decodedRoot && String(index2) === decodedRoot && index2 >= 0 && (options.parseArrays && index2 <= options.arrayLimit)) {
obj = [];
obj[index2] = leaf;
} else if (decodedRoot !== "__proto__") {
obj[decodedRoot] = leaf;
}
}
leaf = obj;
}
return leaf;
};
var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
if (!givenKey) {
return;
}
var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, "[$1]") : givenKey;
var brackets = /(\[[^[\]]*])/;
var child = /(\[[^[\]]*])/g;
var segment = options.depth > 0 && brackets.exec(key);
var parent = segment ? key.slice(0, segment.index) : key;
var keys = [];
if (parent) {
if (!options.plainObjects && has.call(Object.prototype, parent)) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(parent);
}
var i = 0;
while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
i += 1;
if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(segment[1]);
}
if (segment) {
if (options.strictDepth === true) {
throw new RangeError("Input depth exceeded depth option of " + options.depth + " and strictDepth is true");
}
keys.push("[" + key.slice(segment.index) + "]");
}
return parseObject(keys, val, options, valuesParsed);
};
var normalizeParseOptions = function normalizeParseOptions2(opts) {
if (!opts) {
return defaults2;
}
if (typeof opts.allowEmptyArrays !== "undefined" && typeof opts.allowEmptyArrays !== "boolean") {
throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");
}
if (typeof opts.decodeDotInKeys !== "undefined" && typeof opts.decodeDotInKeys !== "boolean") {
throw new TypeError("`decodeDotInKeys` option can only be `true` or `false`, when provided");
}
if (opts.decoder !== null && typeof opts.decoder !== "undefined" && typeof opts.decoder !== "function") {
throw new TypeError("Decoder has to be a function.");
}
if (typeof opts.charset !== "undefined" && opts.charset !== "utf-8" && opts.charset !== "iso-8859-1") {
throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");
}
if (typeof opts.throwOnLimitExceeded !== "undefined" && typeof opts.throwOnLimitExceeded !== "boolean") {
throw new TypeError("`throwOnLimitExceeded` option must be a boolean");
}
var charset = typeof opts.charset === "undefined" ? defaults2.charset : opts.charset;
var duplicates = typeof opts.duplicates === "undefined" ? defaults2.duplicates : opts.duplicates;
if (duplicates !== "combine" && duplicates !== "first" && duplicates !== "last") {
throw new TypeError("The duplicates option must be either combine, first, or last");
}
var allowDots = typeof opts.allowDots === "undefined" ? opts.decodeDotInKeys === true ? true : defaults2.allowDots : !!opts.allowDots;
return {
allowDots,
allowEmptyArrays: typeof opts.allowEmptyArrays === "boolean" ? !!opts.allowEmptyArrays : defaults2.allowEmptyArrays,
allowPrototypes: typeof opts.allowPrototypes === "boolean" ? opts.allowPrototypes : defaults2.allowPrototypes,
allowSparse: typeof opts.allowSparse === "boolean" ? opts.allowSparse : defaults2.allowSparse,
arrayLimit: typeof opts.arrayLimit === "number" ? opts.arrayLimit : defaults2.arrayLimit,
charset,
charsetSentinel: typeof opts.charsetSentinel === "boolean" ? opts.charsetSentinel : defaults2.charsetSentinel,
comma: typeof opts.comma === "boolean" ? opts.comma : defaults2.comma,
decodeDotInKeys: typeof opts.decodeDotInKeys === "boolean" ? opts.decodeDotInKeys : defaults2.decodeDotInKeys,
decoder: typeof opts.decoder === "function" ? opts.decoder : defaults2.decoder,
delimiter: typeof opts.delimiter === "string" || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults2.delimiter,
depth: typeof opts.depth === "number" || opts.depth === false ? +opts.depth : defaults2.depth,
duplicates,
ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
interpretNumericEntities: typeof opts.interpretNumericEntities === "boolean" ? opts.interpretNumericEntities : defaults2.interpretNumericEntities,
parameterLimit: typeof opts.parameterLimit === "number" ? opts.parameterLimit : defaults2.parameterLimit,
parseArrays: opts.parseArrays !== false,
plainObjects: typeof opts.plainObjects === "boolean" ? opts.plainObjects : defaults2.plainObjects,
strictDepth: typeof opts.strictDepth === "boolean" ? !!opts.strictDepth : defaults2.strictDepth,
strictNullHandling: typeof opts.strictNullHandling === "boolean" ? opts.strictNullHandling : defaults2.strictNullHandling,
throwOnLimitExceeded: typeof opts.throwOnLimitExceeded === "boolean" ? opts.throwOnLimitExceeded : false
};
};
module2.exports = function(str, opts) {
var options = normalizeParseOptions(opts);
if (str === "" || str === null || typeof str === "undefined") {
return options.plainObjects ? { __proto__: null } : {};
}
var tempObj = typeof str === "string" ? parseValues(str, options) : str;
var obj = options.plainObjects ? { __proto__: null } : {};
var keys = Object.keys(tempObj);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var newObj = parseKeys(key, tempObj[key], options, typeof str === "string");
obj = utils.merge(obj, newObj, options);
}
if (options.allowSparse === true) {
return obj;
}
return utils.compact(obj);
};
}
});
// node_modules/qs/lib/index.js
var require_lib = __commonJS({
"node_modules/qs/lib/index.js"(exports, module2) {
"use strict";
var stringify = require_stringify();
var parse = require_parse();
var formats = require_formats();
module2.exports = {
formats,
parse,
stringify
};
}
});
// manifest.json
var require_manifest = __commonJS({
"manifest.json"(exports, module2) {
module2.exports = {
id: "publish",
name: "Publish",
version: "0.0.1",
minAppVersion: "0.15.0",
description: "Publish your note to the web",
author: "Spaceship",
authorUrl: "https://",
fundingUrl: "https://"
};
}
});
// node_modules/react/cjs/react.development.js
var require_react_development = __commonJS({
"node_modules/react/cjs/react.development.js"(exports, module2) {
"use strict";
if (true) {
(function() {
"use strict";
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") {
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
}
var ReactVersion = "18.2.0";
var REACT_ELEMENT_TYPE = Symbol.for("react.element");
var REACT_PORTAL_TYPE = Symbol.for("react.portal");
var REACT_FRAGMENT_TYPE2 = Symbol.for("react.fragment");
var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode");
var REACT_PROFILER_TYPE = Symbol.for("react.profiler");
var REACT_PROVIDER_TYPE = Symbol.for("react.provider");
var REACT_CONTEXT_TYPE = Symbol.for("react.context");
var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref");
var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense");
var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list");
var REACT_MEMO_TYPE = Symbol.for("react.memo");
var REACT_LAZY_TYPE = Symbol.for("react.lazy");
var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen");
var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
var FAUX_ITERATOR_SYMBOL = "@@iterator";
function getIteratorFn(maybeIterable) {
if (maybeIterable === null || typeof maybeIterable !== "object") {
return null;
}
var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
if (typeof maybeIterator === "function") {
return maybeIterator;
}
return null;
}
var ReactCurrentDispatcher = {
current: null
};
var ReactCurrentBatchConfig = {
transition: null
};
var ReactCurrentActQueue = {
current: null,
isBatchingLegacy: false,
didScheduleLegacyUpdate: false
};
var ReactCurrentOwner = {
current: null
};
var ReactDebugCurrentFrame = {};
var currentExtraStackFrame = null;
function setExtraStackFrame(stack) {
{
currentExtraStackFrame = stack;
}
}
{
ReactDebugCurrentFrame.setExtraStackFrame = function(stack) {
{
currentExtraStackFrame = stack;
}
};
ReactDebugCurrentFrame.getCurrentStack = null;
ReactDebugCurrentFrame.getStackAddendum = function() {
var stack = "";
if (currentExtraStackFrame) {
stack += currentExtraStackFrame;
}
var impl = ReactDebugCurrentFrame.getCurrentStack;
if (impl) {
stack += impl() || "";
}
return stack;
};
}
var enableScopeAPI = false;
var enableCacheElement = false;
var enableTransitionTracing = false;
var enableLegacyHidden = false;
var enableDebugTracing = false;
var ReactSharedInternals = {
ReactCurrentDispatcher,
ReactCurrentBatchConfig,
ReactCurrentOwner
};
{
ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame;
ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue;
}
function warn(format) {
{
{
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
printWarning("warn", format, args);
}
}
}
function error(format) {
{
{
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}
printWarning("error", format, args);
}
}
}
function printWarning(level, format, args) {
{
var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame;
var stack = ReactDebugCurrentFrame2.getStackAddendum();
if (stack !== "") {
format += "%s";
args = args.concat([stack]);
}
var argsWithFormat = args.map(function(item) {
return String(item);
});
argsWithFormat.unshift("Warning: " + format);
Function.prototype.apply.call(console[level], console, argsWithFormat);
}
}
var didWarnStateUpdateForUnmountedComponent = {};
function warnNoop(publicInstance, callerName) {
{
var _constructor = publicInstance.constructor;
var componentName = _constructor && (_constructor.displayName || _constructor.name) || "ReactClass";
var warningKey = componentName + "." + callerName;
if (didWarnStateUpdateForUnmountedComponent[warningKey]) {
return;
}
error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", callerName, componentName);
didWarnStateUpdateForUnmountedComponent[warningKey] = true;
}
}
var ReactNoopUpdateQueue = {
isMounted: function(publicInstance) {
return false;
},
enqueueForceUpdate: function(publicInstance, callback, callerName) {
warnNoop(publicInstance, "forceUpdate");
},
enqueueReplaceState: function(publicInstance, completeState, callback, callerName) {
warnNoop(publicInstance, "replaceState");
},
enqueueSetState: function(publicInstance, partialState, callback, callerName) {
warnNoop(publicInstance, "setState");
}
};
var assign2 = Object.assign;
var emptyObject = {};
{
Object.freeze(emptyObject);
}
function Component4(props, context, updater) {
this.props = props;
this.context = context;
this.refs = emptyObject;
this.updater = updater || ReactNoopUpdateQueue;
}
Component4.prototype.isReactComponent = {};
Component4.prototype.setState = function(partialState, callback) {
if (typeof partialState !== "object" && typeof partialState !== "function" && partialState != null) {
throw new Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");
}
this.updater.enqueueSetState(this, partialState, callback, "setState");
};
Component4.prototype.forceUpdate = function(callback) {
this.updater.enqueueForceUpdate(this, callback, "forceUpdate");
};
{
var deprecatedAPIs = {
isMounted: ["isMounted", "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],
replaceState: ["replaceState", "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]
};
var defineDeprecationWarning = function(methodName, info) {
Object.defineProperty(Component4.prototype, methodName, {
get: function() {
warn("%s(...) is deprecated in plain JavaScript React classes. %s", info[0], info[1]);
return void 0;
}
});
};
for (var fnName in deprecatedAPIs) {
if (deprecatedAPIs.hasOwnProperty(fnName)) {
defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
}
}
}
function ComponentDummy() {
}
ComponentDummy.prototype = Component4.prototype;
function PureComponent17(props, context, updater) {
this.props = props;
this.context = context;
this.refs = emptyObject;
this.updater = updater || ReactNoopUpdateQueue;
}
var pureComponentPrototype = PureComponent17.prototype = new ComponentDummy();
pureComponentPrototype.constructor = PureComponent17;
assign2(pureComponentPrototype, Component4.prototype);
pureComponentPrototype.isPureReactComponent = true;
function createRef3() {
var refObject = {
current: null
};
{
Object.seal(refObject);
}
return refObject;
}
var isArrayImpl = Array.isArray;
function isArray3(a) {
return isArrayImpl(a);
}
function typeName(value) {
{
var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag;
var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object";
return type;
}
}
function willCoercionThrow(value) {
{
try {
testStringCoercion(value);
return false;
} catch (e) {
return true;
}
}
}
function testStringCoercion(value) {
return "" + value;
}
function checkKeyStringCoercion(value) {
{
if (willCoercionThrow(value)) {
error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value));
return testStringCoercion(value);
}
}
}
function getWrappedName(outerType, innerType, wrapperName) {
var displayName = outerType.displayName;
if (displayName) {
return displayName;
}
var functionName = innerType.displayName || innerType.name || "";
return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName;
}
function getContextName(type) {
return type.displayName || "Context";
}
function getComponentNameFromType(type) {
if (type == null) {
return null;
}
{
if (typeof type.tag === "number") {
error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.");
}
}
if (typeof type === "function") {
return type.displayName || type.name || null;
}
if (typeof type === "string") {
return type;
}
switch (type) {
case REACT_FRAGMENT_TYPE2:
return "Fragment";
case REACT_PORTAL_TYPE:
return "Portal";
case REACT_PROFILER_TYPE:
return "Profiler";
case REACT_STRICT_MODE_TYPE:
return "StrictMode";
case REACT_SUSPENSE_TYPE:
return "Suspense";
case REACT_SUSPENSE_LIST_TYPE:
return "SuspenseList";
}
if (typeof type === "object") {
switch (type.$$typeof) {
case REACT_CONTEXT_TYPE:
var context = type;
return getContextName(context) + ".Consumer";
case REACT_PROVIDER_TYPE:
var provider = type;
return getContextName(provider._context) + ".Provider";
case REACT_FORWARD_REF_TYPE:
return getWrappedName(type, type.render, "ForwardRef");
case REACT_MEMO_TYPE:
var outerName = type.displayName || null;
if (outerName !== null) {
return outerName;
}
return getComponentNameFromType(type.type) || "Memo";
case REACT_LAZY_TYPE: {
var lazyComponent = type;
var payload = lazyComponent._payload;
var init = lazyComponent._init;
try {
return getComponentNameFromType(init(payload));
} catch (x) {
return null;
}
}
}
}
return null;
}
var hasOwnProperty4 = Object.prototype.hasOwnProperty;
var RESERVED_PROPS = {
key: true,
ref: true,
__self: true,
__source: true
};
var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;
{
didWarnAboutStringRefs = {};
}
function hasValidRef(config) {
{
if (hasOwnProperty4.call(config, "ref")) {
var getter = Object.getOwnPropertyDescriptor(config, "ref").get;
if (getter && getter.isReactWarning) {
return false;
}
}
}
return config.ref !== void 0;
}
function hasValidKey(config) {
{
if (hasOwnProperty4.call(config, "key")) {
var getter = Object.getOwnPropertyDescriptor(config, "key").get;
if (getter && getter.isReactWarning) {
return false;
}
}
}
return config.key !== void 0;
}
function defineKeyPropWarningGetter(props, displayName) {
var warnAboutAccessingKey = function() {
{
if (!specialPropKeyWarningShown) {
specialPropKeyWarningShown = true;
error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName);
}
}
};
warnAboutAccessingKey.isReactWarning = true;
Object.defineProperty(props, "key", {
get: warnAboutAccessingKey,
configurable: true
});
}
function defineRefPropWarningGetter(props, displayName) {
var warnAboutAccessingRef = function() {
{
if (!specialPropRefWarningShown) {
specialPropRefWarningShown = true;
error("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName);
}
}
};
warnAboutAccessingRef.isReactWarning = true;
Object.defineProperty(props, "ref", {
get: warnAboutAccessingRef,
configurable: true
});
}
function warnIfStringRefCannotBeAutoConverted(config) {
{
if (typeof config.ref === "string" && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {
var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);
if (!didWarnAboutStringRefs[componentName]) {
error('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref);
didWarnAboutStringRefs[componentName] = true;
}
}
}
}
var ReactElement = function(type, key, ref, self2, source, owner, props) {
var element = {
$$typeof: REACT_ELEMENT_TYPE,
type,
key,
ref,
props,
_owner: owner
};
{
element._store = {};
Object.defineProperty(element._store, "validated", {
configurable: false,
enumerable: false,
writable: true,
value: false
});
Object.defineProperty(element, "_self", {
configurable: false,
enumerable: false,
writable: false,
value: self2
});
Object.defineProperty(element, "_source", {
configurable: false,
enumerable: false,
writable: false,
value: source
});
if (Object.freeze) {
Object.freeze(element.props);
Object.freeze(element);
}
}
return element;
};
function createElement25(type, config, children) {
var propName;
var props = {};
var key = null;
var ref = null;
var self2 = null;
var source = null;
if (config != null) {
if (hasValidRef(config)) {
ref = config.ref;
{
warnIfStringRefCannotBeAutoConverted(config);
}
}
if (hasValidKey(config)) {
{
checkKeyStringCoercion(config.key);
}
key = "" + config.key;
}
self2 = config.__self === void 0 ? null : config.__self;
source = config.__source === void 0 ? null : config.__source;
for (propName in config) {
if (hasOwnProperty4.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
props[propName] = config[propName];
}
}
}
var childrenLength = arguments.length - 2;
if (childrenLength === 1) {
props.children = children;
} else if (childrenLength > 1) {
var childArray = Array(childrenLength);
for (var i = 0; i < childrenLength; i++) {
childArray[i] = arguments[i + 2];
}
{
if (Object.freeze) {
Object.freeze(childArray);
}
}
props.children = childArray;
}
if (type && type.defaultProps) {
var defaultProps = type.defaultProps;
for (propName in defaultProps) {
if (props[propName] === void 0) {
props[propName] = defaultProps[propName];
}
}
}
{
if (key || ref) {
var displayName = typeof type === "function" ? type.displayName || type.name || "Unknown" : type;
if (key) {
defineKeyPropWarningGetter(props, displayName);
}
if (ref) {
defineRefPropWarningGetter(props, displayName);
}
}
}
return ReactElement(type, key, ref, self2, source, ReactCurrentOwner.current, props);
}
function cloneAndReplaceKey(oldElement, newKey) {
var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
return newElement;
}
function cloneElement2(element, config, children) {
if (element === null || element === void 0) {
throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + ".");
}
var propName;
var props = assign2({}, element.props);
var key = element.key;
var ref = element.ref;
var self2 = element._self;
var source = element._source;
var owner = element._owner;
if (config != null) {
if (hasValidRef(config)) {
ref = config.ref;
owner = ReactCurrentOwner.current;
}
if (hasValidKey(config)) {
{
checkKeyStringCoercion(config.key);
}
key = "" + config.key;
}
var defaultProps;
if (element.type && element.type.defaultProps) {
defaultProps = element.type.defaultProps;
}
for (propName in config) {
if (hasOwnProperty4.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
if (config[propName] === void 0 && defaultProps !== void 0) {
props[propName] = defaultProps[propName];
} else {
props[propName] = config[propName];
}
}
}
}
var childrenLength = arguments.length - 2;
if (childrenLength === 1) {
props.children = children;
} else if (childrenLength > 1) {
var childArray = Array(childrenLength);
for (var i = 0; i < childrenLength; i++) {
childArray[i] = arguments[i + 2];
}
props.children = childArray;
}
return ReactElement(element.type, key, ref, self2, source, owner, props);
}
function isValidElement4(object) {
return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
}
var SEPARATOR = ".";
var SUBSEPARATOR = ":";
function escape2(key) {
var escapeRegex = /[=:]/g;
var escaperLookup = {
"=": "=0",
":": "=2"
};
var escapedString = key.replace(escapeRegex, function(match2) {
return escaperLookup[match2];
});
return "$" + escapedString;
}
var didWarnAboutMaps = false;
var userProvidedKeyEscapeRegex = /\/+/g;
function escapeUserProvidedKey(text) {
return text.replace(userProvidedKeyEscapeRegex, "$&/");
}
function getElementKey(element, index2) {
if (typeof element === "object" && element !== null && element.key != null) {
{
checkKeyStringCoercion(element.key);
}
return escape2("" + element.key);
}
return index2.toString(36);
}
function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {
var type = typeof children;
if (type === "undefined" || type === "boolean") {
children = null;
}
var invokeCallback = false;
if (children === null) {
invokeCallback = true;
} else {
switch (type) {
case "string":
case "number":
invokeCallback = true;
break;
case "object":
switch (children.$$typeof) {
case REACT_ELEMENT_TYPE:
case REACT_PORTAL_TYPE:
invokeCallback = true;
}
}
}
if (invokeCallback) {
var _child = children;
var mappedChild = callback(_child);
var childKey = nameSoFar === "" ? SEPARATOR + getElementKey(_child, 0) : nameSoFar;
if (isArray3(mappedChild)) {
var escapedChildKey = "";
if (childKey != null) {
escapedChildKey = escapeUserProvidedKey(childKey) + "/";
}
mapIntoArray(mappedChild, array, escapedChildKey, "", function(c) {
return c;
});
} else if (mappedChild != null) {
if (isValidElement4(mappedChild)) {
{
if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) {
checkKeyStringCoercion(mappedChild.key);
}
}
mappedChild = cloneAndReplaceKey(mappedChild, escapedPrefix + (mappedChild.key && (!_child || _child.key !== mappedChild.key) ? escapeUserProvidedKey("" + mappedChild.key) + "/" : "") + childKey);
}
array.push(mappedChild);
}
return 1;
}
var child;
var nextName;
var subtreeCount = 0;
var nextNamePrefix = nameSoFar === "" ? SEPARATOR : nameSoFar + SUBSEPARATOR;
if (isArray3(children)) {
for (var i = 0; i < children.length; i++) {
child = children[i];
nextName = nextNamePrefix + getElementKey(child, i);
subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);
}
} else {
var iteratorFn = getIteratorFn(children);
if (typeof iteratorFn === "function") {
var iterableChildren = children;
{
if (iteratorFn === iterableChildren.entries) {
if (!didWarnAboutMaps) {
warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead.");
}
didWarnAboutMaps = true;
}
}
var iterator2 = iteratorFn.call(iterableChildren);
var step;
var ii = 0;
while (!(step = iterator2.next()).done) {
child = step.value;
nextName = nextNamePrefix + getElementKey(child, ii++);
subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);
}
} else if (type === "object") {
var childrenString = String(children);
throw new Error("Objects are not valid as a React child (found: " + (childrenString === "[object Object]" ? "object with keys {" + Object.keys(children).join(", ") + "}" : childrenString) + "). If you meant to render a collection of children, use an array instead.");
}
}
return subtreeCount;
}
function mapChildren(children, func, context) {
if (children == null) {
return children;
}
var result = [];
var count = 0;
mapIntoArray(children, result, "", "", function(child) {
return func.call(context, child, count++);
});
return result;
}
function countChildren(children) {
var n = 0;
mapChildren(children, function() {
n++;
});
return n;
}
function forEachChildren(children, forEachFunc, forEachContext) {
mapChildren(children, function() {
forEachFunc.apply(this, arguments);
}, forEachContext);
}
function toArray2(children) {
return mapChildren(children, function(child) {
return child;
}) || [];
}
function onlyChild(children) {
if (!isValidElement4(children)) {
throw new Error("React.Children.only expected to receive a single React element child.");
}
return children;
}
function createContext(defaultValue) {
var context = {
$$typeof: REACT_CONTEXT_TYPE,
_currentValue: defaultValue,
_currentValue2: defaultValue,
_threadCount: 0,
Provider: null,
Consumer: null,
_defaultValue: null,
_globalName: null
};
context.Provider = {
$$typeof: REACT_PROVIDER_TYPE,
_context: context
};
var hasWarnedAboutUsingNestedContextConsumers = false;
var hasWarnedAboutUsingConsumerProvider = false;
var hasWarnedAboutDisplayNameOnConsumer = false;
{
var Consumer = {
$$typeof: REACT_CONTEXT_TYPE,
_context: context
};
Object.defineProperties(Consumer, {
Provider: {
get: function() {
if (!hasWarnedAboutUsingConsumerProvider) {
hasWarnedAboutUsingConsumerProvider = true;
error("Rendering <Context.Consumer.Provider> is not supported and will be removed in a future major release. Did you mean to render <Context.Provider> instead?");
}
return context.Provider;
},
set: function(_Provider) {
context.Provider = _Provider;
}
},
_currentValue: {
get: function() {
return context._currentValue;
},
set: function(_currentValue) {
context._currentValue = _currentValue;
}
},
_currentValue2: {
get: function() {
return context._currentValue2;
},
set: function(_currentValue2) {
context._currentValue2 = _currentValue2;
}
},
_threadCount: {
get: function() {
return context._threadCount;
},
set: function(_threadCount) {
context._threadCount = _threadCount;
}
},
Consumer: {
get: function() {
if (!hasWarnedAboutUsingNestedContextConsumers) {
hasWarnedAboutUsingNestedContextConsumers = true;
error("Rendering <Context.Consumer.Consumer> is not supported and will be removed in a future major release. Did you mean to render <Context.Consumer> instead?");
}
return context.Consumer;
}
},
displayName: {
get: function() {
return context.displayName;
},
set: function(displayName) {
if (!hasWarnedAboutDisplayNameOnConsumer) {
warn("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.", displayName);
hasWarnedAboutDisplayNameOnConsumer = true;
}
}
}
});
context.Consumer = Consumer;
}
{
context._currentRenderer = null;
context._currentRenderer2 = null;
}
return context;
}
var Uninitialized = -1;
var Pending = 0;
var Resolved = 1;
var Rejected = 2;
function lazyInitializer(payload) {
if (payload._status === Uninitialized) {
var ctor = payload._result;
var thenable = ctor();
thenable.then(function(moduleObject2) {
if (payload._status === Pending || payload._status === Uninitialized) {
var resolved = payload;
resolved._status = Resolved;
resolved._result = moduleObject2;
}
}, function(error2) {
if (payload._status === Pending || payload._status === Uninitialized) {
var rejected = payload;
rejected._status = Rejected;
rejected._result = error2;
}
});
if (payload._status === Uninitialized) {
var pending = payload;
pending._status = Pending;
pending._result = thenable;
}
}
if (payload._status === Resolved) {
var moduleObject = payload._result;
{
if (moduleObject === void 0) {
error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?", moduleObject);
}
}
{
if (!("default" in moduleObject)) {
error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))", moduleObject);
}
}
return moduleObject.default;
} else {
throw payload._result;
}
}
function lazy(ctor) {
var payload = {
_status: Uninitialized,
_result: ctor
};
var lazyType = {
$$typeof: REACT_LAZY_TYPE,
_payload: payload,
_init: lazyInitializer
};
{
var defaultProps;
var propTypes;
Object.defineProperties(lazyType, {
defaultProps: {
configurable: true,
get: function() {
return defaultProps;
},
set: function(newDefaultProps) {
error("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it.");
defaultProps = newDefaultProps;
Object.defineProperty(lazyType, "defaultProps", {
enumerable: true
});
}
},
propTypes: {
configurable: true,
get: function() {
return propTypes;
},
set: function(newPropTypes) {
error("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it.");
propTypes = newPropTypes;
Object.defineProperty(lazyType, "propTypes", {
enumerable: true
});
}
}
});
}
return lazyType;
}
function forwardRef2(render) {
{
if (render != null && render.$$typeof === REACT_MEMO_TYPE) {
error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...)).");
} else if (typeof render !== "function") {
error("forwardRef requires a render function but was given %s.", render === null ? "null" : typeof render);
} else {
if (render.length !== 0 && render.length !== 2) {
error("forwardRef render functions accept exactly two parameters: props and ref. %s", render.length === 1 ? "Did you forget to use the ref parameter?" : "Any additional parameter will be undefined.");
}
}
if (render != null) {
if (render.defaultProps != null || render.propTypes != null) {
error("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?");
}
}
}
var elementType = {
$$typeof: REACT_FORWARD_REF_TYPE,
render
};
{
var ownName;
Object.defineProperty(elementType, "displayName", {
enumerable: false,
configurable: true,
get: function() {
return ownName;
},
set: function(name) {
ownName = name;
if (!render.name && !render.displayName) {
render.displayName = name;
}
}
});
}
return elementType;
}
var REACT_MODULE_REFERENCE;
{
REACT_MODULE_REFERENCE = Symbol.for("react.module.reference");
}
function isValidElementType(type) {
if (typeof type === "string" || typeof type === "function") {
return true;
}
if (type === REACT_FRAGMENT_TYPE2 || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) {
return true;
}
if (typeof type === "object" && type !== null) {
if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== void 0) {
return true;
}
}
return false;
}
function memo(type, compare) {
{
if (!isValidElementType(type)) {
error("memo: The first argument must be a component. Instead received: %s", type === null ? "null" : typeof type);
}
}
var elementType = {
$$typeof: REACT_MEMO_TYPE,
type,
compare: compare === void 0 ? null : compare
};
{
var ownName;
Object.defineProperty(elementType, "displayName", {
enumerable: false,
configurable: true,
get: function() {
return ownName;
},
set: function(name) {
ownName = name;
if (!type.name && !type.displayName) {
type.displayName = name;
}
}
});
}
return elementType;
}
function resolveDispatcher() {
var dispatcher = ReactCurrentDispatcher.current;
{
if (dispatcher === null) {
error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.");
}
}
return dispatcher;
}
function useContext(Context) {
var dispatcher = resolveDispatcher();
{
if (Context._context !== void 0) {
var realContext = Context._context;
if (realContext.Consumer === Context) {
error("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?");
} else if (realContext.Provider === Context) {
error("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?");
}
}
}
return dispatcher.useContext(Context);
}
function useState3(initialState) {
var dispatcher = resolveDispatcher();
return dispatcher.useState(initialState);
}
function useReducer(reducer, initialArg, init) {
var dispatcher = resolveDispatcher();
return dispatcher.useReducer(reducer, initialArg, init);
}
function useRef2(initialValue) {
var dispatcher = resolveDispatcher();
return dispatcher.useRef(initialValue);
}
function useEffect3(create2, deps) {
var dispatcher = resolveDispatcher();
return dispatcher.useEffect(create2, deps);
}
function useInsertionEffect(create2, deps) {
var dispatcher = resolveDispatcher();
return dispatcher.useInsertionEffect(create2, deps);
}
function useLayoutEffect(create2, deps) {
var dispatcher = resolveDispatcher();
return dispatcher.useLayoutEffect(create2, deps);
}
function useCallback2(callback, deps) {
var dispatcher = resolveDispatcher();
return dispatcher.useCallback(callback, deps);
}
function useMemo2(create2, deps) {
var dispatcher = resolveDispatcher();
return dispatcher.useMemo(create2, deps);
}
function useImperativeHandle2(ref, create2, deps) {
var dispatcher = resolveDispatcher();
return dispatcher.useImperativeHandle(ref, create2, deps);
}
function useDebugValue(value, formatterFn) {
{
var dispatcher = resolveDispatcher();
return dispatcher.useDebugValue(value, formatterFn);
}
}
function useTransition() {
var dispatcher = resolveDispatcher();
return dispatcher.useTransition();
}
function useDeferredValue(value) {
var dispatcher = resolveDispatcher();
return dispatcher.useDeferredValue(value);
}
function useId() {
var dispatcher = resolveDispatcher();
return dispatcher.useId();
}
function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
var dispatcher = resolveDispatcher();
return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
}
var disabledDepth = 0;
var prevLog;
var prevInfo;
var prevWarn;
var prevError;
var prevGroup;
var prevGroupCollapsed;
var prevGroupEnd;
function disabledLog() {
}
disabledLog.__reactDisabledLog = true;
function disableLogs() {
{
if (disabledDepth === 0) {
prevLog = console.log;
prevInfo = console.info;
prevWarn = console.warn;
prevError = console.error;
prevGroup = console.group;
prevGroupCollapsed = console.groupCollapsed;
prevGroupEnd = console.groupEnd;
var props = {
configurable: true,
enumerable: true,
value: disabledLog,
writable: true
};
Object.defineProperties(console, {
info: props,
log: props,
warn: props,
error: props,
group: props,
groupCollapsed: props,
groupEnd: props
});
}
disabledDepth++;
}
}
function reenableLogs() {
{
disabledDepth--;
if (disabledDepth === 0) {
var props = {
configurable: true,
enumerable: true,
writable: true
};
Object.defineProperties(console, {
log: assign2({}, props, {
value: prevLog
}),
info: assign2({}, props, {
value: prevInfo
}),
warn: assign2({}, props, {
value: prevWarn
}),
error: assign2({}, props, {
value: prevError
}),
group: assign2({}, props, {
value: prevGroup
}),
groupCollapsed: assign2({}, props, {
value: prevGroupCollapsed
}),
groupEnd: assign2({}, props, {
value: prevGroupEnd
})
});
}
if (disabledDepth < 0) {
error("disabledDepth fell below zero. This is a bug in React. Please file an issue.");
}
}
}
var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
var prefix2;
function describeBuiltInComponentFrame(name, source, ownerFn) {
{
if (prefix2 === void 0) {
try {
throw Error();
} catch (x) {
var match2 = x.stack.trim().match(/\n( *(at )?)/);
prefix2 = match2 && match2[1] || "";
}
}
return "\n" + prefix2 + name;
}
}
var reentry = false;
var componentFrameCache;
{
var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map;
componentFrameCache = new PossiblyWeakMap();
}
function describeNativeComponentFrame(fn, construct) {
if (!fn || reentry) {
return "";
}
{
var frame = componentFrameCache.get(fn);
if (frame !== void 0) {
return frame;
}
}
var control;
reentry = true;
var previousPrepareStackTrace = Error.prepareStackTrace;
Error.prepareStackTrace = void 0;
var previousDispatcher;
{
previousDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = null;
disableLogs();
}
try {
if (construct) {
var Fake = function() {
throw Error();
};
Object.defineProperty(Fake.prototype, "props", {
set: function() {
throw Error();
}
});
if (typeof Reflect === "object" && Reflect.construct) {
try {
Reflect.construct(Fake, []);
} catch (x) {
control = x;
}
Reflect.construct(fn, [], Fake);
} else {
try {
Fake.call();
} catch (x) {
control = x;
}
fn.call(Fake.prototype);
}
} else {
try {
throw Error();
} catch (x) {
control = x;
}
fn();
}
} catch (sample) {
if (sample && control && typeof sample.stack === "string") {
var sampleLines = sample.stack.split("\n");
var controlLines = control.stack.split("\n");
var s = sampleLines.length - 1;
var c = controlLines.length - 1;
while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
c--;
}
for (; s >= 1 && c >= 0; s--, c--) {
if (sampleLines[s] !== controlLines[c]) {
if (s !== 1 || c !== 1) {
do {
s--;
c--;
if (c < 0 || sampleLines[s] !== controlLines[c]) {
var _frame = "\n" + sampleLines[s].replace(" at new ", " at ");
if (fn.displayName && _frame.includes("<anonymous>")) {
_frame = _frame.replace("<anonymous>", fn.displayName);
}
{
if (typeof fn === "function") {
componentFrameCache.set(fn, _frame);
}
}
return _frame;
}
} while (s >= 1 && c >= 0);
}
break;
}
}
}
} finally {
reentry = false;
{
ReactCurrentDispatcher$1.current = previousDispatcher;
reenableLogs();
}
Error.prepareStackTrace = previousPrepareStackTrace;
}
var name = fn ? fn.displayName || fn.name : "";
var syntheticFrame = name ? describeBuiltInComponentFrame(name) : "";
{
if (typeof fn === "function") {
componentFrameCache.set(fn, syntheticFrame);
}
}
return syntheticFrame;
}
function describeFunctionComponentFrame(fn, source, ownerFn) {
{
return describeNativeComponentFrame(fn, false);
}
}
function shouldConstruct(Component5) {
var prototype3 = Component5.prototype;
return !!(prototype3 && prototype3.isReactComponent);
}
function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
if (type == null) {
return "";
}
if (typeof type === "function") {
{
return describeNativeComponentFrame(type, shouldConstruct(type));
}
}
if (typeof type === "string") {
return describeBuiltInComponentFrame(type);
}
switch (type) {
case REACT_SUSPENSE_TYPE:
return describeBuiltInComponentFrame("Suspense");
case REACT_SUSPENSE_LIST_TYPE:
return describeBuiltInComponentFrame("SuspenseList");
}
if (typeof type === "object") {
switch (type.$$typeof) {
case REACT_FORWARD_REF_TYPE:
return describeFunctionComponentFrame(type.render);
case REACT_MEMO_TYPE:
return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
case REACT_LAZY_TYPE: {
var lazyComponent = type;
var payload = lazyComponent._payload;
var init = lazyComponent._init;
try {
return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
} catch (x) {
}
}
}
}
return "";
}
var loggedTypeFailures = {};
var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
function setCurrentlyValidatingElement(element) {
{
if (element) {
var owner = element._owner;
var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
ReactDebugCurrentFrame$1.setExtraStackFrame(stack);
} else {
ReactDebugCurrentFrame$1.setExtraStackFrame(null);
}
}
}
function checkPropTypes(typeSpecs, values, location, componentName, element) {
{
var has = Function.call.bind(hasOwnProperty4);
for (var typeSpecName in typeSpecs) {
if (has(typeSpecs, typeSpecName)) {
var error$1 = void 0;
try {
if (typeof typeSpecs[typeSpecName] !== "function") {
var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");
err.name = "Invariant Violation";
throw err;
}
error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED");
} catch (ex) {
error$1 = ex;
}
if (error$1 && !(error$1 instanceof Error)) {
setCurrentlyValidatingElement(element);
error("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error$1);
setCurrentlyValidatingElement(null);
}
if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
loggedTypeFailures[error$1.message] = true;
setCurrentlyValidatingElement(element);
error("Failed %s type: %s", location, error$1.message);
setCurrentlyValidatingElement(null);
}
}
}
}
}
function setCurrentlyValidatingElement$1(element) {
{
if (element) {
var owner = element._owner;
var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
setExtraStackFrame(stack);
} else {
setExtraStackFrame(null);
}
}
}
var propTypesMisspellWarningShown;
{
propTypesMisspellWarningShown = false;
}
function getDeclarationErrorAddendum() {
if (ReactCurrentOwner.current) {
var name = getComponentNameFromType(ReactCurrentOwner.current.type);
if (name) {
return "\n\nCheck the render method of `" + name + "`.";
}
}
return "";
}
function getSourceInfoErrorAddendum(source) {
if (source !== void 0) {
var fileName = source.fileName.replace(/^.*[\\\/]/, "");
var lineNumber = source.lineNumber;
return "\n\nCheck your code at " + fileName + ":" + lineNumber + ".";
}
return "";
}
function getSourceInfoErrorAddendumForProps(elementProps) {
if (elementProps !== null && elementProps !== void 0) {
return getSourceInfoErrorAddendum(elementProps.__source);
}
return "";
}
var ownerHasKeyUseWarning = {};
function getCurrentComponentErrorInfo(parentType) {
var info = getDeclarationErrorAddendum();
if (!info) {
var parentName = typeof parentType === "string" ? parentType : parentType.displayName || parentType.name;
if (parentName) {
info = "\n\nCheck the top-level render call using <" + parentName + ">.";
}
}
return info;
}
function validateExplicitKey(element, parentType) {
if (!element._store || element._store.validated || element.key != null) {
return;
}
element._store.validated = true;
var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
return;
}
ownerHasKeyUseWarning[currentComponentErrorInfo] = true;
var childOwner = "";
if (element && element._owner && element._owner !== ReactCurrentOwner.current) {
childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + ".";
}
{
setCurrentlyValidatingElement$1(element);
error('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);
setCurrentlyValidatingElement$1(null);
}
}
function validateChildKeys(node, parentType) {
if (typeof node !== "object") {
return;
}
if (isArray3(node)) {
for (var i = 0; i < node.length; i++) {
var child = node[i];
if (isValidElement4(child)) {
validateExplicitKey(child, parentType);
}
}
} else if (isValidElement4(node)) {
if (node._store) {
node._store.validated = true;
}
} else if (node) {
var iteratorFn = getIteratorFn(node);
if (typeof iteratorFn === "function") {
if (iteratorFn !== node.entries) {
var iterator2 = iteratorFn.call(node);
var step;
while (!(step = iterator2.next()).done) {
if (isValidElement4(step.value)) {
validateExplicitKey(step.value, parentType);
}
}
}
}
}
}
function validatePropTypes(element) {
{
var type = element.type;
if (type === null || type === void 0 || typeof type === "string") {
return;
}
var propTypes;
if (typeof type === "function") {
propTypes = type.propTypes;
} else if (typeof type === "object" && (type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_MEMO_TYPE)) {
propTypes = type.propTypes;
} else {
return;
}
if (propTypes) {
var name = getComponentNameFromType(type);
checkPropTypes(propTypes, element.props, "prop", name, element);
} else if (type.PropTypes !== void 0 && !propTypesMisspellWarningShown) {
propTypesMisspellWarningShown = true;
var _name = getComponentNameFromType(type);
error("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", _name || "Unknown");
}
if (typeof type.getDefaultProps === "function" && !type.getDefaultProps.isReactClassApproved) {
error("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.");
}
}
}
function validateFragmentProps(fragment) {
{
var keys = Object.keys(fragment.props);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (key !== "children" && key !== "key") {
setCurrentlyValidatingElement$1(fragment);
error("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", key);
setCurrentlyValidatingElement$1(null);
break;
}
}
if (fragment.ref !== null) {
setCurrentlyValidatingElement$1(fragment);
error("Invalid attribute `ref` supplied to `React.Fragment`.");
setCurrentlyValidatingElement$1(null);
}
}
}
function createElementWithValidation(type, props, children) {
var validType = isValidElementType(type);
if (!validType) {
var info = "";
if (type === void 0 || typeof type === "object" && type !== null && Object.keys(type).length === 0) {
info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.";
}
var sourceInfo = getSourceInfoErrorAddendumForProps(props);
if (sourceInfo) {
info += sourceInfo;
} else {
info += getDeclarationErrorAddendum();
}
var typeString;
if (type === null) {
typeString = "null";
} else if (isArray3(type)) {
typeString = "array";
} else if (type !== void 0 && type.$$typeof === REACT_ELEMENT_TYPE) {
typeString = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />";
info = " Did you accidentally export a JSX literal instead of a component?";
} else {
typeString = typeof type;
}
{
error("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", typeString, info);
}
}
var element = createElement25.apply(this, arguments);
if (element == null) {
return element;
}
if (validType) {
for (var i = 2; i < arguments.length; i++) {
validateChildKeys(arguments[i], type);
}
}
if (type === REACT_FRAGMENT_TYPE2) {
validateFragmentProps(element);
} else {
validatePropTypes(element);
}
return element;
}
var didWarnAboutDeprecatedCreateFactory = false;
function createFactoryWithValidation(type) {
var validatedFactory = createElementWithValidation.bind(null, type);
validatedFactory.type = type;
{
if (!didWarnAboutDeprecatedCreateFactory) {
didWarnAboutDeprecatedCreateFactory = true;
warn("React.createFactory() is deprecated and will be removed in a future major release. Consider using JSX or use React.createElement() directly instead.");
}
Object.defineProperty(validatedFactory, "type", {
enumerable: false,
get: function() {
warn("Factory.type is deprecated. Access the class directly before passing it to createFactory.");
Object.defineProperty(this, "type", {
value: type
});
return type;
}
});
}
return validatedFactory;
}
function cloneElementWithValidation(element, props, children) {
var newElement = cloneElement2.apply(this, arguments);
for (var i = 2; i < arguments.length; i++) {
validateChildKeys(arguments[i], newElement.type);
}
validatePropTypes(newElement);
return newElement;
}
function startTransition(scope, options) {
var prevTransition = ReactCurrentBatchConfig.transition;
ReactCurrentBatchConfig.transition = {};
var currentTransition = ReactCurrentBatchConfig.transition;
{
ReactCurrentBatchConfig.transition._updatedFibers = new Set();
}
try {
scope();
} finally {
ReactCurrentBatchConfig.transition = prevTransition;
{
if (prevTransition === null && currentTransition._updatedFibers) {
var updatedFibersCount = currentTransition._updatedFibers.size;
if (updatedFibersCount > 10) {
warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.");
}
currentTransition._updatedFibers.clear();
}
}
}
}
var didWarnAboutMessageChannel = false;
var enqueueTaskImpl = null;
function enqueueTask(task) {
if (enqueueTaskImpl === null) {
try {
var requireString = ("require" + Math.random()).slice(0, 7);
var nodeRequire = module2 && module2[requireString];
enqueueTaskImpl = nodeRequire.call(module2, "timers").setImmediate;
} catch (_err) {
enqueueTaskImpl = function(callback) {
{
if (didWarnAboutMessageChannel === false) {
didWarnAboutMessageChannel = true;
if (typeof MessageChannel === "undefined") {
error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning.");
}
}
}
var channel = new MessageChannel();
channel.port1.onmessage = callback;
channel.port2.postMessage(void 0);
};
}
}
return enqueueTaskImpl(task);
}
var actScopeDepth = 0;
var didWarnNoAwaitAct = false;
function act(callback) {
{
var prevActScopeDepth = actScopeDepth;
actScopeDepth++;
if (ReactCurrentActQueue.current === null) {
ReactCurrentActQueue.current = [];
}
var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy;
var result;
try {
ReactCurrentActQueue.isBatchingLegacy = true;
result = callback();
if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) {
var queue = ReactCurrentActQueue.current;
if (queue !== null) {
ReactCurrentActQueue.didScheduleLegacyUpdate = false;
flushActQueue(queue);
}
}
} catch (error2) {
popActScope(prevActScopeDepth);
throw error2;
} finally {
ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy;
}
if (result !== null && typeof result === "object" && typeof result.then === "function") {
var thenableResult = result;
var wasAwaited = false;
var thenable = {
then: function(resolve, reject) {
wasAwaited = true;
thenableResult.then(function(returnValue2) {
popActScope(prevActScopeDepth);
if (actScopeDepth === 0) {
recursivelyFlushAsyncActWork(returnValue2, resolve, reject);
} else {
resolve(returnValue2);
}
}, function(error2) {
popActScope(prevActScopeDepth);
reject(error2);
});
}
};
{
if (!didWarnNoAwaitAct && typeof Promise !== "undefined") {
Promise.resolve().then(function() {
}).then(function() {
if (!wasAwaited) {
didWarnNoAwaitAct = true;
error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);");
}
});
}
}
return thenable;
} else {
var returnValue = result;
popActScope(prevActScopeDepth);
if (actScopeDepth === 0) {
var _queue = ReactCurrentActQueue.current;
if (_queue !== null) {
flushActQueue(_queue);
ReactCurrentActQueue.current = null;
}
var _thenable = {
then: function(resolve, reject) {
if (ReactCurrentActQueue.current === null) {
ReactCurrentActQueue.current = [];
recursivelyFlushAsyncActWork(returnValue, resolve, reject);
} else {
resolve(returnValue);
}
}
};
return _thenable;
} else {
var _thenable2 = {
then: function(resolve, reject) {
resolve(returnValue);
}
};
return _thenable2;
}
}
}
}
function popActScope(prevActScopeDepth) {
{
if (prevActScopeDepth !== actScopeDepth - 1) {
error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. ");
}
actScopeDepth = prevActScopeDepth;
}
}
function recursivelyFlushAsyncActWork(returnValue, resolve, reject) {
{
var queue = ReactCurrentActQueue.current;
if (queue !== null) {
try {
flushActQueue(queue);
enqueueTask(function() {
if (queue.length === 0) {
ReactCurrentActQueue.current = null;
resolve(returnValue);
} else {
recursivelyFlushAsyncActWork(returnValue, resolve, reject);
}
});
} catch (error2) {
reject(error2);
}
} else {
resolve(returnValue);
}
}
}
var isFlushing = false;
function flushActQueue(queue) {
{
if (!isFlushing) {
isFlushing = true;
var i = 0;
try {
for (; i < queue.length; i++) {
var callback = queue[i];
do {
callback = callback(true);
} while (callback !== null);
}
queue.length = 0;
} catch (error2) {
queue = queue.slice(i + 1);
throw error2;
} finally {
isFlushing = false;
}
}
}
}
var createElement$1 = createElementWithValidation;
var cloneElement$1 = cloneElementWithValidation;
var createFactory = createFactoryWithValidation;
var Children = {
map: mapChildren,
forEach: forEachChildren,
count: countChildren,
toArray: toArray2,
only: onlyChild
};
exports.Children = Children;
exports.Component = Component4;
exports.Fragment = REACT_FRAGMENT_TYPE2;
exports.Profiler = REACT_PROFILER_TYPE;
exports.PureComponent = PureComponent17;
exports.StrictMode = REACT_STRICT_MODE_TYPE;
exports.Suspense = REACT_SUSPENSE_TYPE;
exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals;
exports.cloneElement = cloneElement$1;
exports.createContext = createContext;
exports.createElement = createElement$1;
exports.createFactory = createFactory;
exports.createRef = createRef3;
exports.forwardRef = forwardRef2;
exports.isValidElement = isValidElement4;
exports.lazy = lazy;
exports.memo = memo;
exports.startTransition = startTransition;
exports.unstable_act = act;
exports.useCallback = useCallback2;
exports.useContext = useContext;
exports.useDebugValue = useDebugValue;
exports.useDeferredValue = useDeferredValue;
exports.useEffect = useEffect3;
exports.useId = useId;
exports.useImperativeHandle = useImperativeHandle2;
exports.useInsertionEffect = useInsertionEffect;
exports.useLayoutEffect = useLayoutEffect;
exports.useMemo = useMemo2;
exports.useReducer = useReducer;
exports.useRef = useRef2;
exports.useState = useState3;
exports.useSyncExternalStore = useSyncExternalStore;
exports.useTransition = useTransition;
exports.version = ReactVersion;
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") {
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
}
})();
}
}
});
// node_modules/react/index.js
var require_react = __commonJS({
"node_modules/react/index.js"(exports, module2) {
"use strict";
if (false) {
module2.exports = null;
} else {
module2.exports = require_react_development();
}
}
});
// node_modules/scheduler/cjs/scheduler.development.js
var require_scheduler_development = __commonJS({
"node_modules/scheduler/cjs/scheduler.development.js"(exports) {
"use strict";
if (true) {
(function() {
"use strict";
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") {
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
}
var enableSchedulerDebugging = false;
var enableProfiling = false;
var frameYieldMs = 5;
function push(heap, node) {
var index2 = heap.length;
heap.push(node);
siftUp(heap, node, index2);
}
function peek(heap) {
return heap.length === 0 ? null : heap[0];
}
function pop(heap) {
if (heap.length === 0) {
return null;
}
var first = heap[0];
var last = heap.pop();
if (last !== first) {
heap[0] = last;
siftDown(heap, last, 0);
}
return first;
}
function siftUp(heap, node, i) {
var index2 = i;
while (index2 > 0) {
var parentIndex = index2 - 1 >>> 1;
var parent = heap[parentIndex];
if (compare(parent, node) > 0) {
heap[parentIndex] = node;
heap[index2] = parent;
index2 = parentIndex;
} else {
return;
}
}
}
function siftDown(heap, node, i) {
var index2 = i;
var length = heap.length;
var halfLength = length >>> 1;
while (index2 < halfLength) {
var leftIndex = (index2 + 1) * 2 - 1;
var left = heap[leftIndex];
var rightIndex = leftIndex + 1;
var right = heap[rightIndex];
if (compare(left, node) < 0) {
if (rightIndex < length && compare(right, left) < 0) {
heap[index2] = right;
heap[rightIndex] = node;
index2 = rightIndex;
} else {
heap[index2] = left;
heap[leftIndex] = node;
index2 = leftIndex;
}
} else if (rightIndex < length && compare(right, node) < 0) {
heap[index2] = right;
heap[rightIndex] = node;
index2 = rightIndex;
} else {
return;
}
}
}
function compare(a, b) {
var diff = a.sortIndex - b.sortIndex;
return diff !== 0 ? diff : a.id - b.id;
}
var ImmediatePriority = 1;
var UserBlockingPriority = 2;
var NormalPriority = 3;
var LowPriority = 4;
var IdlePriority = 5;
function markTaskErrored(task, ms) {
}
var hasPerformanceNow = typeof performance === "object" && typeof performance.now === "function";
if (hasPerformanceNow) {
var localPerformance = performance;
exports.unstable_now = function() {
return localPerformance.now();
};
} else {
var localDate = Date;
var initialTime = localDate.now();
exports.unstable_now = function() {
return localDate.now() - initialTime;
};
}
var maxSigned31BitInt = 1073741823;
var IMMEDIATE_PRIORITY_TIMEOUT = -1;
var USER_BLOCKING_PRIORITY_TIMEOUT = 250;
var NORMAL_PRIORITY_TIMEOUT = 5e3;
var LOW_PRIORITY_TIMEOUT = 1e4;
var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt;
var taskQueue = [];
var timerQueue = [];
var taskIdCounter = 1;
var currentTask = null;
var currentPriorityLevel = NormalPriority;
var isPerformingWork = false;
var isHostCallbackScheduled = false;
var isHostTimeoutScheduled = false;
var localSetTimeout = typeof setTimeout === "function" ? setTimeout : null;
var localClearTimeout = typeof clearTimeout === "function" ? clearTimeout : null;
var localSetImmediate = typeof setImmediate !== "undefined" ? setImmediate : null;
var isInputPending = typeof navigator !== "undefined" && navigator.scheduling !== void 0 && navigator.scheduling.isInputPending !== void 0 ? navigator.scheduling.isInputPending.bind(navigator.scheduling) : null;
function advanceTimers(currentTime) {
var timer = peek(timerQueue);
while (timer !== null) {
if (timer.callback === null) {
pop(timerQueue);
} else if (timer.startTime <= currentTime) {
pop(timerQueue);
timer.sortIndex = timer.expirationTime;
push(taskQueue, timer);
} else {
return;
}
timer = peek(timerQueue);
}
}
function handleTimeout(currentTime) {
isHostTimeoutScheduled = false;
advanceTimers(currentTime);
if (!isHostCallbackScheduled) {
if (peek(taskQueue) !== null) {
isHostCallbackScheduled = true;
requestHostCallback(flushWork);
} else {
var firstTimer = peek(timerQueue);
if (firstTimer !== null) {
requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
}
}
}
}
function flushWork(hasTimeRemaining, initialTime2) {
isHostCallbackScheduled = false;
if (isHostTimeoutScheduled) {
isHostTimeoutScheduled = false;
cancelHostTimeout();
}
isPerformingWork = true;
var previousPriorityLevel = currentPriorityLevel;
try {
if (enableProfiling) {
try {
return workLoop(hasTimeRemaining, initialTime2);
} catch (error) {
if (currentTask !== null) {
var currentTime = exports.unstable_now();
markTaskErrored(currentTask, currentTime);
currentTask.isQueued = false;
}
throw error;
}
} else {
return workLoop(hasTimeRemaining, initialTime2);
}
} finally {
currentTask = null;
currentPriorityLevel = previousPriorityLevel;
isPerformingWork = false;
}
}
function workLoop(hasTimeRemaining, initialTime2) {
var currentTime = initialTime2;
advanceTimers(currentTime);
currentTask = peek(taskQueue);
while (currentTask !== null && !enableSchedulerDebugging) {
if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {
break;
}
var callback = currentTask.callback;
if (typeof callback === "function") {
currentTask.callback = null;
currentPriorityLevel = currentTask.priorityLevel;
var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;
var continuationCallback = callback(didUserCallbackTimeout);
currentTime = exports.unstable_now();
if (typeof continuationCallback === "function") {
currentTask.callback = continuationCallback;
} else {
if (currentTask === peek(taskQueue)) {
pop(taskQueue);
}
}
advanceTimers(currentTime);
} else {
pop(taskQueue);
}
currentTask = peek(taskQueue);
}
if (currentTask !== null) {
return true;
} else {
var firstTimer = peek(timerQueue);
if (firstTimer !== null) {
requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
}
return false;
}
}
function unstable_runWithPriority(priorityLevel, eventHandler) {
switch (priorityLevel) {
case ImmediatePriority:
case UserBlockingPriority:
case NormalPriority:
case LowPriority:
case IdlePriority:
break;
default:
priorityLevel = NormalPriority;
}
var previousPriorityLevel = currentPriorityLevel;
currentPriorityLevel = priorityLevel;
try {
return eventHandler();
} finally {
currentPriorityLevel = previousPriorityLevel;
}
}
function unstable_next(eventHandler) {
var priorityLevel;
switch (currentPriorityLevel) {
case ImmediatePriority:
case UserBlockingPriority:
case NormalPriority:
priorityLevel = NormalPriority;
break;
default:
priorityLevel = currentPriorityLevel;
break;
}
var previousPriorityLevel = currentPriorityLevel;
currentPriorityLevel = priorityLevel;
try {
return eventHandler();
} finally {
currentPriorityLevel = previousPriorityLevel;
}
}
function unstable_wrapCallback(callback) {
var parentPriorityLevel = currentPriorityLevel;
return function() {
var previousPriorityLevel = currentPriorityLevel;
currentPriorityLevel = parentPriorityLevel;
try {
return callback.apply(this, arguments);
} finally {
currentPriorityLevel = previousPriorityLevel;
}
};
}
function unstable_scheduleCallback(priorityLevel, callback, options) {
var currentTime = exports.unstable_now();
var startTime2;
if (typeof options === "object" && options !== null) {
var delay = options.delay;
if (typeof delay === "number" && delay > 0) {
startTime2 = currentTime + delay;
} else {
startTime2 = currentTime;
}
} else {
startTime2 = currentTime;
}
var timeout;
switch (priorityLevel) {
case ImmediatePriority:
timeout = IMMEDIATE_PRIORITY_TIMEOUT;
break;
case UserBlockingPriority:
timeout = USER_BLOCKING_PRIORITY_TIMEOUT;
break;
case IdlePriority:
timeout = IDLE_PRIORITY_TIMEOUT;
break;
case LowPriority:
timeout = LOW_PRIORITY_TIMEOUT;
break;
case NormalPriority:
default:
timeout = NORMAL_PRIORITY_TIMEOUT;
break;
}
var expirationTime = startTime2 + timeout;
var newTask = {
id: taskIdCounter++,
callback,
priorityLevel,
startTime: startTime2,
expirationTime,
sortIndex: -1
};
if (startTime2 > currentTime) {
newTask.sortIndex = startTime2;
push(timerQueue, newTask);
if (peek(taskQueue) === null && newTask === peek(timerQueue)) {
if (isHostTimeoutScheduled) {
cancelHostTimeout();
} else {
isHostTimeoutScheduled = true;
}
requestHostTimeout(handleTimeout, startTime2 - currentTime);
}
} else {
newTask.sortIndex = expirationTime;
push(taskQueue, newTask);
if (!isHostCallbackScheduled && !isPerformingWork) {
isHostCallbackScheduled = true;
requestHostCallback(flushWork);
}
}
return newTask;
}
function unstable_pauseExecution() {
}
function unstable_continueExecution() {
if (!isHostCallbackScheduled && !isPerformingWork) {
isHostCallbackScheduled = true;
requestHostCallback(flushWork);
}
}
function unstable_getFirstCallbackNode() {
return peek(taskQueue);
}
function unstable_cancelCallback(task) {
task.callback = null;
}
function unstable_getCurrentPriorityLevel() {
return currentPriorityLevel;
}
var isMessageLoopRunning = false;
var scheduledHostCallback = null;
var taskTimeoutID = -1;
var frameInterval = frameYieldMs;
var startTime = -1;
function shouldYieldToHost() {
var timeElapsed = exports.unstable_now() - startTime;
if (timeElapsed < frameInterval) {
return false;
}
return true;
}
function requestPaint() {
}
function forceFrameRate(fps) {
if (fps < 0 || fps > 125) {
console["error"]("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported");
return;
}
if (fps > 0) {
frameInterval = Math.floor(1e3 / fps);
} else {
frameInterval = frameYieldMs;
}
}
var performWorkUntilDeadline = function() {
if (scheduledHostCallback !== null) {
var currentTime = exports.unstable_now();
startTime = currentTime;
var hasTimeRemaining = true;
var hasMoreWork = true;
try {
hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime);
} finally {
if (hasMoreWork) {
schedulePerformWorkUntilDeadline();
} else {
isMessageLoopRunning = false;
scheduledHostCallback = null;
}
}
} else {
isMessageLoopRunning = false;
}
};
var schedulePerformWorkUntilDeadline;
if (typeof localSetImmediate === "function") {
schedulePerformWorkUntilDeadline = function() {
localSetImmediate(performWorkUntilDeadline);
};
} else if (typeof MessageChannel !== "undefined") {
var channel = new MessageChannel();
var port = channel.port2;
channel.port1.onmessage = performWorkUntilDeadline;
schedulePerformWorkUntilDeadline = function() {
port.postMessage(null);
};
} else {
schedulePerformWorkUntilDeadline = function() {
localSetTimeout(performWorkUntilDeadline, 0);
};
}
function requestHostCallback(callback) {
scheduledHostCallback = callback;
if (!isMessageLoopRunning) {
isMessageLoopRunning = true;
schedulePerformWorkUntilDeadline();
}
}
function requestHostTimeout(callback, ms) {
taskTimeoutID = localSetTimeout(function() {
callback(exports.unstable_now());
}, ms);
}
function cancelHostTimeout() {
localClearTimeout(taskTimeoutID);
taskTimeoutID = -1;
}
var unstable_requestPaint = requestPaint;
var unstable_Profiling = null;
exports.unstable_IdlePriority = IdlePriority;
exports.unstable_ImmediatePriority = ImmediatePriority;
exports.unstable_LowPriority = LowPriority;
exports.unstable_NormalPriority = NormalPriority;
exports.unstable_Profiling = unstable_Profiling;
exports.unstable_UserBlockingPriority = UserBlockingPriority;
exports.unstable_cancelCallback = unstable_cancelCallback;
exports.unstable_continueExecution = unstable_continueExecution;
exports.unstable_forceFrameRate = forceFrameRate;
exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode;
exports.unstable_next = unstable_next;
exports.unstable_pauseExecution = unstable_pauseExecution;
exports.unstable_requestPaint = unstable_requestPaint;
exports.unstable_runWithPriority = unstable_runWithPriority;
exports.unstable_scheduleCallback = unstable_scheduleCallback;
exports.unstable_shouldYield = shouldYieldToHost;
exports.unstable_wrapCallback = unstable_wrapCallback;
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") {
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
}
})();
}
}
});
// node_modules/scheduler/index.js
var require_scheduler = __commonJS({
"node_modules/scheduler/index.js"(exports, module2) {
"use strict";
if (false) {
module2.exports = null;
} else {
module2.exports = require_scheduler_development();
}
}
});
// node_modules/react-dom/cjs/react-dom.development.js
var require_react_dom_development = __commonJS({
"node_modules/react-dom/cjs/react-dom.development.js"(exports) {
"use strict";
if (true) {
(function() {
"use strict";
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") {
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
}
var React85 = require_react();
var Scheduler = require_scheduler();
var ReactSharedInternals = React85.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
var suppressWarning = false;
function setSuppressWarning(newSuppressWarning) {
{
suppressWarning = newSuppressWarning;
}
}
function warn(format) {
{
if (!suppressWarning) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
printWarning("warn", format, args);
}
}
}
function error(format) {
{
if (!suppressWarning) {
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}
printWarning("error", format, args);
}
}
}
function printWarning(level, format, args) {
{
var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame;
var stack = ReactDebugCurrentFrame2.getStackAddendum();
if (stack !== "") {
format += "%s";
args = args.concat([stack]);
}
var argsWithFormat = args.map(function(item) {
return String(item);
});
argsWithFormat.unshift("Warning: " + format);
Function.prototype.apply.call(console[level], console, argsWithFormat);
}
}
var FunctionComponent = 0;
var ClassComponent = 1;
var IndeterminateComponent = 2;
var HostRoot = 3;
var HostPortal = 4;
var HostComponent = 5;
var HostText = 6;
var Fragment = 7;
var Mode = 8;
var ContextConsumer = 9;
var ContextProvider = 10;
var ForwardRef = 11;
var Profiler = 12;
var SuspenseComponent = 13;
var MemoComponent = 14;
var SimpleMemoComponent = 15;
var LazyComponent = 16;
var IncompleteClassComponent = 17;
var DehydratedFragment = 18;
var SuspenseListComponent = 19;
var ScopeComponent = 21;
var OffscreenComponent = 22;
var LegacyHiddenComponent = 23;
var CacheComponent = 24;
var TracingMarkerComponent = 25;
var enableClientRenderFallbackOnTextMismatch = true;
var enableNewReconciler = false;
var enableLazyContextPropagation = false;
var enableLegacyHidden = false;
var enableSuspenseAvoidThisFallback = false;
var disableCommentsAsDOMContainers = true;
var enableCustomElementPropertySupport = false;
var warnAboutStringRefs = false;
var enableSchedulingProfiler = true;
var enableProfilerTimer = true;
var enableProfilerCommitHooks = true;
var allNativeEvents = new Set();
var registrationNameDependencies = {};
var possibleRegistrationNames = {};
function registerTwoPhaseEvent(registrationName, dependencies) {
registerDirectEvent(registrationName, dependencies);
registerDirectEvent(registrationName + "Capture", dependencies);
}
function registerDirectEvent(registrationName, dependencies) {
{
if (registrationNameDependencies[registrationName]) {
error("EventRegistry: More than one plugin attempted to publish the same registration name, `%s`.", registrationName);
}
}
registrationNameDependencies[registrationName] = dependencies;
{
var lowerCasedName = registrationName.toLowerCase();
possibleRegistrationNames[lowerCasedName] = registrationName;
if (registrationName === "onDoubleClick") {
possibleRegistrationNames.ondblclick = registrationName;
}
}
for (var i = 0; i < dependencies.length; i++) {
allNativeEvents.add(dependencies[i]);
}
}
var canUseDOM = !!(typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined");
var hasOwnProperty4 = Object.prototype.hasOwnProperty;
function typeName(value) {
{
var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag;
var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object";
return type;
}
}
function willCoercionThrow(value) {
{
try {
testStringCoercion(value);
return false;
} catch (e) {
return true;
}
}
}
function testStringCoercion(value) {
return "" + value;
}
function checkAttributeStringCoercion(value, attributeName) {
{
if (willCoercionThrow(value)) {
error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before before using it here.", attributeName, typeName(value));
return testStringCoercion(value);
}
}
}
function checkKeyStringCoercion(value) {
{
if (willCoercionThrow(value)) {
error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value));
return testStringCoercion(value);
}
}
}
function checkPropStringCoercion(value, propName) {
{
if (willCoercionThrow(value)) {
error("The provided `%s` prop is an unsupported type %s. This value must be coerced to a string before before using it here.", propName, typeName(value));
return testStringCoercion(value);
}
}
}
function checkCSSPropertyStringCoercion(value, propName) {
{
if (willCoercionThrow(value)) {
error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before before using it here.", propName, typeName(value));
return testStringCoercion(value);
}
}
}
function checkHtmlStringCoercion(value) {
{
if (willCoercionThrow(value)) {
error("The provided HTML markup uses a value of unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value));
return testStringCoercion(value);
}
}
}
function checkFormFieldValueStringCoercion(value) {
{
if (willCoercionThrow(value)) {
error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before before using it here.", typeName(value));
return testStringCoercion(value);
}
}
}
var RESERVED = 0;
var STRING = 1;
var BOOLEANISH_STRING = 2;
var BOOLEAN = 3;
var OVERLOADED_BOOLEAN = 4;
var NUMERIC = 5;
var POSITIVE_NUMERIC = 6;
var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
var VALID_ATTRIBUTE_NAME_REGEX = new RegExp("^[" + ATTRIBUTE_NAME_START_CHAR + "][" + ATTRIBUTE_NAME_CHAR + "]*$");
var illegalAttributeNameCache = {};
var validatedAttributeNameCache = {};
function isAttributeNameSafe(attributeName) {
if (hasOwnProperty4.call(validatedAttributeNameCache, attributeName)) {
return true;
}
if (hasOwnProperty4.call(illegalAttributeNameCache, attributeName)) {
return false;
}
if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
validatedAttributeNameCache[attributeName] = true;
return true;
}
illegalAttributeNameCache[attributeName] = true;
{
error("Invalid attribute name: `%s`", attributeName);
}
return false;
}
function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {
if (propertyInfo !== null) {
return propertyInfo.type === RESERVED;
}
if (isCustomComponentTag) {
return false;
}
if (name.length > 2 && (name[0] === "o" || name[0] === "O") && (name[1] === "n" || name[1] === "N")) {
return true;
}
return false;
}
function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
if (propertyInfo !== null && propertyInfo.type === RESERVED) {
return false;
}
switch (typeof value) {
case "function":
case "symbol":
return true;
case "boolean": {
if (isCustomComponentTag) {
return false;
}
if (propertyInfo !== null) {
return !propertyInfo.acceptsBooleans;
} else {
var prefix3 = name.toLowerCase().slice(0, 5);
return prefix3 !== "data-" && prefix3 !== "aria-";
}
}
default:
return false;
}
}
function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {
if (value === null || typeof value === "undefined") {
return true;
}
if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {
return true;
}
if (isCustomComponentTag) {
return false;
}
if (propertyInfo !== null) {
switch (propertyInfo.type) {
case BOOLEAN:
return !value;
case OVERLOADED_BOOLEAN:
return value === false;
case NUMERIC:
return isNaN(value);
case POSITIVE_NUMERIC:
return isNaN(value) || value < 1;
}
}
return false;
}
function getPropertyInfo(name) {
return properties.hasOwnProperty(name) ? properties[name] : null;
}
function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL2, removeEmptyString) {
this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
this.attributeName = attributeName;
this.attributeNamespace = attributeNamespace;
this.mustUseProperty = mustUseProperty;
this.propertyName = name;
this.type = type;
this.sanitizeURL = sanitizeURL2;
this.removeEmptyString = removeEmptyString;
}
var properties = {};
var reservedProps = [
"children",
"dangerouslySetInnerHTML",
"defaultValue",
"defaultChecked",
"innerHTML",
"suppressContentEditableWarning",
"suppressHydrationWarning",
"style"
];
reservedProps.forEach(function(name) {
properties[name] = new PropertyInfoRecord(name, RESERVED, false, name, null, false, false);
});
[["acceptCharset", "accept-charset"], ["className", "class"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"]].forEach(function(_ref) {
var name = _ref[0], attributeName = _ref[1];
properties[name] = new PropertyInfoRecord(name, STRING, false, attributeName, null, false, false);
});
["contentEditable", "draggable", "spellCheck", "value"].forEach(function(name) {
properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, name.toLowerCase(), null, false, false);
});
["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(name) {
properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, name, null, false, false);
});
[
"allowFullScreen",
"async",
"autoFocus",
"autoPlay",
"controls",
"default",
"defer",
"disabled",
"disablePictureInPicture",
"disableRemotePlayback",
"formNoValidate",
"hidden",
"loop",
"noModule",
"noValidate",
"open",
"playsInline",
"readOnly",
"required",
"reversed",
"scoped",
"seamless",
"itemScope"
].forEach(function(name) {
properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, name.toLowerCase(), null, false, false);
});
[
"checked",
"multiple",
"muted",
"selected"
].forEach(function(name) {
properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, name, null, false, false);
});
[
"capture",
"download"
].forEach(function(name) {
properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, name, null, false, false);
});
[
"cols",
"rows",
"size",
"span"
].forEach(function(name) {
properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, name, null, false, false);
});
["rowSpan", "start"].forEach(function(name) {
properties[name] = new PropertyInfoRecord(name, NUMERIC, false, name.toLowerCase(), null, false, false);
});
var CAMELIZE = /[\-\:]([a-z])/g;
var capitalize = function(token) {
return token[1].toUpperCase();
};
[
"accent-height",
"alignment-baseline",
"arabic-form",
"baseline-shift",
"cap-height",
"clip-path",
"clip-rule",
"color-interpolation",
"color-interpolation-filters",
"color-profile",
"color-rendering",
"dominant-baseline",
"enable-background",
"fill-opacity",
"fill-rule",
"flood-color",
"flood-opacity",
"font-family",
"font-size",
"font-size-adjust",
"font-stretch",
"font-style",
"font-variant",
"font-weight",
"glyph-name",
"glyph-orientation-horizontal",
"glyph-orientation-vertical",
"horiz-adv-x",
"horiz-origin-x",
"image-rendering",
"letter-spacing",
"lighting-color",
"marker-end",
"marker-mid",
"marker-start",
"overline-position",
"overline-thickness",
"paint-order",
"panose-1",
"pointer-events",
"rendering-intent",
"shape-rendering",
"stop-color",
"stop-opacity",
"strikethrough-position",
"strikethrough-thickness",
"stroke-dasharray",
"stroke-dashoffset",
"stroke-linecap",
"stroke-linejoin",
"stroke-miterlimit",
"stroke-opacity",
"stroke-width",
"text-anchor",
"text-decoration",
"text-rendering",
"underline-position",
"underline-thickness",
"unicode-bidi",
"unicode-range",
"units-per-em",
"v-alphabetic",
"v-hanging",
"v-ideographic",
"v-mathematical",
"vector-effect",
"vert-adv-y",
"vert-origin-x",
"vert-origin-y",
"word-spacing",
"writing-mode",
"xmlns:xlink",
"x-height"
].forEach(function(attributeName) {
var name = attributeName.replace(CAMELIZE, capitalize);
properties[name] = new PropertyInfoRecord(name, STRING, false, attributeName, null, false, false);
});
[
"xlink:actuate",
"xlink:arcrole",
"xlink:role",
"xlink:show",
"xlink:title",
"xlink:type"
].forEach(function(attributeName) {
var name = attributeName.replace(CAMELIZE, capitalize);
properties[name] = new PropertyInfoRecord(name, STRING, false, attributeName, "http://www.w3.org/1999/xlink", false, false);
});
[
"xml:base",
"xml:lang",
"xml:space"
].forEach(function(attributeName) {
var name = attributeName.replace(CAMELIZE, capitalize);
properties[name] = new PropertyInfoRecord(name, STRING, false, attributeName, "http://www.w3.org/XML/1998/namespace", false, false);
});
["tabIndex", "crossOrigin"].forEach(function(attributeName) {
properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, attributeName.toLowerCase(), null, false, false);
});
var xlinkHref = "xlinkHref";
properties[xlinkHref] = new PropertyInfoRecord("xlinkHref", STRING, false, "xlink:href", "http://www.w3.org/1999/xlink", true, false);
["src", "href", "action", "formAction"].forEach(function(attributeName) {
properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, attributeName.toLowerCase(), null, true, true);
});
var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;
var didWarn = false;
function sanitizeURL(url2) {
{
if (!didWarn && isJavaScriptProtocol.test(url2)) {
didWarn = true;
error("A future version of React will block javascript: URLs as a security precaution. Use event handlers instead if you can. If you need to generate unsafe HTML try using dangerouslySetInnerHTML instead. React was passed %s.", JSON.stringify(url2));
}
}
}
function getValueForProperty(node, name, expected, propertyInfo) {
{
if (propertyInfo.mustUseProperty) {
var propertyName = propertyInfo.propertyName;
return node[propertyName];
} else {
{
checkAttributeStringCoercion(expected, name);
}
if (propertyInfo.sanitizeURL) {
sanitizeURL("" + expected);
}
var attributeName = propertyInfo.attributeName;
var stringValue = null;
if (propertyInfo.type === OVERLOADED_BOOLEAN) {
if (node.hasAttribute(attributeName)) {
var value = node.getAttribute(attributeName);
if (value === "") {
return true;
}
if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
return value;
}
if (value === "" + expected) {
return expected;
}
return value;
}
} else if (node.hasAttribute(attributeName)) {
if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
return node.getAttribute(attributeName);
}
if (propertyInfo.type === BOOLEAN) {
return expected;
}
stringValue = node.getAttribute(attributeName);
}
if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
return stringValue === null ? expected : stringValue;
} else if (stringValue === "" + expected) {
return expected;
} else {
return stringValue;
}
}
}
}
function getValueForAttribute(node, name, expected, isCustomComponentTag) {
{
if (!isAttributeNameSafe(name)) {
return;
}
if (!node.hasAttribute(name)) {
return expected === void 0 ? void 0 : null;
}
var value = node.getAttribute(name);
{
checkAttributeStringCoercion(expected, name);
}
if (value === "" + expected) {
return expected;
}
return value;
}
}
function setValueForProperty(node, name, value, isCustomComponentTag) {
var propertyInfo = getPropertyInfo(name);
if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {
return;
}
if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {
value = null;
}
if (isCustomComponentTag || propertyInfo === null) {
if (isAttributeNameSafe(name)) {
var _attributeName = name;
if (value === null) {
node.removeAttribute(_attributeName);
} else {
{
checkAttributeStringCoercion(value, name);
}
node.setAttribute(_attributeName, "" + value);
}
}
return;
}
var mustUseProperty = propertyInfo.mustUseProperty;
if (mustUseProperty) {
var propertyName = propertyInfo.propertyName;
if (value === null) {
var type = propertyInfo.type;
node[propertyName] = type === BOOLEAN ? false : "";
} else {
node[propertyName] = value;
}
return;
}
var attributeName = propertyInfo.attributeName, attributeNamespace = propertyInfo.attributeNamespace;
if (value === null) {
node.removeAttribute(attributeName);
} else {
var _type = propertyInfo.type;
var attributeValue;
if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {
attributeValue = "";
} else {
{
{
checkAttributeStringCoercion(value, attributeName);
}
attributeValue = "" + value;
}
if (propertyInfo.sanitizeURL) {
sanitizeURL(attributeValue.toString());
}
}
if (attributeNamespace) {
node.setAttributeNS(attributeNamespace, attributeName, attributeValue);
} else {
node.setAttribute(attributeName, attributeValue);
}
}
}
var REACT_ELEMENT_TYPE = Symbol.for("react.element");
var REACT_PORTAL_TYPE = Symbol.for("react.portal");
var REACT_FRAGMENT_TYPE2 = Symbol.for("react.fragment");
var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode");
var REACT_PROFILER_TYPE = Symbol.for("react.profiler");
var REACT_PROVIDER_TYPE = Symbol.for("react.provider");
var REACT_CONTEXT_TYPE = Symbol.for("react.context");
var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref");
var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense");
var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list");
var REACT_MEMO_TYPE = Symbol.for("react.memo");
var REACT_LAZY_TYPE = Symbol.for("react.lazy");
var REACT_SCOPE_TYPE = Symbol.for("react.scope");
var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode");
var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen");
var REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden");
var REACT_CACHE_TYPE = Symbol.for("react.cache");
var REACT_TRACING_MARKER_TYPE = Symbol.for("react.tracing_marker");
var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
var FAUX_ITERATOR_SYMBOL = "@@iterator";
function getIteratorFn(maybeIterable) {
if (maybeIterable === null || typeof maybeIterable !== "object") {
return null;
}
var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
if (typeof maybeIterator === "function") {
return maybeIterator;
}
return null;
}
var assign2 = Object.assign;
var disabledDepth = 0;
var prevLog;
var prevInfo;
var prevWarn;
var prevError;
var prevGroup;
var prevGroupCollapsed;
var prevGroupEnd;
function disabledLog() {
}
disabledLog.__reactDisabledLog = true;
function disableLogs() {
{
if (disabledDepth === 0) {
prevLog = console.log;
prevInfo = console.info;
prevWarn = console.warn;
prevError = console.error;
prevGroup = console.group;
prevGroupCollapsed = console.groupCollapsed;
prevGroupEnd = console.groupEnd;
var props = {
configurable: true,
enumerable: true,
value: disabledLog,
writable: true
};
Object.defineProperties(console, {
info: props,
log: props,
warn: props,
error: props,
group: props,
groupCollapsed: props,
groupEnd: props
});
}
disabledDepth++;
}
}
function reenableLogs() {
{
disabledDepth--;
if (disabledDepth === 0) {
var props = {
configurable: true,
enumerable: true,
writable: true
};
Object.defineProperties(console, {
log: assign2({}, props, {
value: prevLog
}),
info: assign2({}, props, {
value: prevInfo
}),
warn: assign2({}, props, {
value: prevWarn
}),
error: assign2({}, props, {
value: prevError
}),
group: assign2({}, props, {
value: prevGroup
}),
groupCollapsed: assign2({}, props, {
value: prevGroupCollapsed
}),
groupEnd: assign2({}, props, {
value: prevGroupEnd
})
});
}
if (disabledDepth < 0) {
error("disabledDepth fell below zero. This is a bug in React. Please file an issue.");
}
}
}
var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
var prefix2;
function describeBuiltInComponentFrame(name, source, ownerFn) {
{
if (prefix2 === void 0) {
try {
throw Error();
} catch (x) {
var match2 = x.stack.trim().match(/\n( *(at )?)/);
prefix2 = match2 && match2[1] || "";
}
}
return "\n" + prefix2 + name;
}
}
var reentry = false;
var componentFrameCache;
{
var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map;
componentFrameCache = new PossiblyWeakMap();
}
function describeNativeComponentFrame(fn, construct) {
if (!fn || reentry) {
return "";
}
{
var frame = componentFrameCache.get(fn);
if (frame !== void 0) {
return frame;
}
}
var control;
reentry = true;
var previousPrepareStackTrace = Error.prepareStackTrace;
Error.prepareStackTrace = void 0;
var previousDispatcher;
{
previousDispatcher = ReactCurrentDispatcher.current;
ReactCurrentDispatcher.current = null;
disableLogs();
}
try {
if (construct) {
var Fake = function() {
throw Error();
};
Object.defineProperty(Fake.prototype, "props", {
set: function() {
throw Error();
}
});
if (typeof Reflect === "object" && Reflect.construct) {
try {
Reflect.construct(Fake, []);
} catch (x) {
control = x;
}
Reflect.construct(fn, [], Fake);
} else {
try {
Fake.call();
} catch (x) {
control = x;
}
fn.call(Fake.prototype);
}
} else {
try {
throw Error();
} catch (x) {
control = x;
}
fn();
}
} catch (sample) {
if (sample && control && typeof sample.stack === "string") {
var sampleLines = sample.stack.split("\n");
var controlLines = control.stack.split("\n");
var s = sampleLines.length - 1;
var c = controlLines.length - 1;
while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
c--;
}
for (; s >= 1 && c >= 0; s--, c--) {
if (sampleLines[s] !== controlLines[c]) {
if (s !== 1 || c !== 1) {
do {
s--;
c--;
if (c < 0 || sampleLines[s] !== controlLines[c]) {
var _frame = "\n" + sampleLines[s].replace(" at new ", " at ");
if (fn.displayName && _frame.includes("<anonymous>")) {
_frame = _frame.replace("<anonymous>", fn.displayName);
}
{
if (typeof fn === "function") {
componentFrameCache.set(fn, _frame);
}
}
return _frame;
}
} while (s >= 1 && c >= 0);
}
break;
}
}
}
} finally {
reentry = false;
{
ReactCurrentDispatcher.current = previousDispatcher;
reenableLogs();
}
Error.prepareStackTrace = previousPrepareStackTrace;
}
var name = fn ? fn.displayName || fn.name : "";
var syntheticFrame = name ? describeBuiltInComponentFrame(name) : "";
{
if (typeof fn === "function") {
componentFrameCache.set(fn, syntheticFrame);
}
}
return syntheticFrame;
}
function describeClassComponentFrame(ctor, source, ownerFn) {
{
return describeNativeComponentFrame(ctor, true);
}
}
function describeFunctionComponentFrame(fn, source, ownerFn) {
{
return describeNativeComponentFrame(fn, false);
}
}
function shouldConstruct(Component4) {
var prototype3 = Component4.prototype;
return !!(prototype3 && prototype3.isReactComponent);
}
function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
if (type == null) {
return "";
}
if (typeof type === "function") {
{
return describeNativeComponentFrame(type, shouldConstruct(type));
}
}
if (typeof type === "string") {
return describeBuiltInComponentFrame(type);
}
switch (type) {
case REACT_SUSPENSE_TYPE:
return describeBuiltInComponentFrame("Suspense");
case REACT_SUSPENSE_LIST_TYPE:
return describeBuiltInComponentFrame("SuspenseList");
}
if (typeof type === "object") {
switch (type.$$typeof) {
case REACT_FORWARD_REF_TYPE:
return describeFunctionComponentFrame(type.render);
case REACT_MEMO_TYPE:
return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
case REACT_LAZY_TYPE: {
var lazyComponent = type;
var payload = lazyComponent._payload;
var init = lazyComponent._init;
try {
return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
} catch (x) {
}
}
}
}
return "";
}
function describeFiber(fiber) {
var owner = fiber._debugOwner ? fiber._debugOwner.type : null;
var source = fiber._debugSource;
switch (fiber.tag) {
case HostComponent:
return describeBuiltInComponentFrame(fiber.type);
case LazyComponent:
return describeBuiltInComponentFrame("Lazy");
case SuspenseComponent:
return describeBuiltInComponentFrame("Suspense");
case SuspenseListComponent:
return describeBuiltInComponentFrame("SuspenseList");
case FunctionComponent:
case IndeterminateComponent:
case SimpleMemoComponent:
return describeFunctionComponentFrame(fiber.type);
case ForwardRef:
return describeFunctionComponentFrame(fiber.type.render);
case ClassComponent:
return describeClassComponentFrame(fiber.type);
default:
return "";
}
}
function getStackByFiberInDevAndProd(workInProgress2) {
try {
var info = "";
var node = workInProgress2;
do {
info += describeFiber(node);
node = node.return;
} while (node);
return info;
} catch (x) {
return "\nError generating stack: " + x.message + "\n" + x.stack;
}
}
function getWrappedName(outerType, innerType, wrapperName) {
var displayName = outerType.displayName;
if (displayName) {
return displayName;
}
var functionName = innerType.displayName || innerType.name || "";
return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName;
}
function getContextName(type) {
return type.displayName || "Context";
}
function getComponentNameFromType(type) {
if (type == null) {
return null;
}
{
if (typeof type.tag === "number") {
error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.");
}
}
if (typeof type === "function") {
return type.displayName || type.name || null;
}
if (typeof type === "string") {
return type;
}
switch (type) {
case REACT_FRAGMENT_TYPE2:
return "Fragment";
case REACT_PORTAL_TYPE:
return "Portal";
case REACT_PROFILER_TYPE:
return "Profiler";
case REACT_STRICT_MODE_TYPE:
return "StrictMode";
case REACT_SUSPENSE_TYPE:
return "Suspense";
case REACT_SUSPENSE_LIST_TYPE:
return "SuspenseList";
}
if (typeof type === "object") {
switch (type.$$typeof) {
case REACT_CONTEXT_TYPE:
var context = type;
return getContextName(context) + ".Consumer";
case REACT_PROVIDER_TYPE:
var provider = type;
return getContextName(provider._context) + ".Provider";
case REACT_FORWARD_REF_TYPE:
return getWrappedName(type, type.render, "ForwardRef");
case REACT_MEMO_TYPE:
var outerName = type.displayName || null;
if (outerName !== null) {
return outerName;
}
return getComponentNameFromType(type.type) || "Memo";
case REACT_LAZY_TYPE: {
var lazyComponent = type;
var payload = lazyComponent._payload;
var init = lazyComponent._init;
try {
return getComponentNameFromType(init(payload));
} catch (x) {
return null;
}
}
}
}
return null;
}
function getWrappedName$1(outerType, innerType, wrapperName) {
var functionName = innerType.displayName || innerType.name || "";
return outerType.displayName || (functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName);
}
function getContextName$1(type) {
return type.displayName || "Context";
}
function getComponentNameFromFiber(fiber) {
var tag = fiber.tag, type = fiber.type;
switch (tag) {
case CacheComponent:
return "Cache";
case ContextConsumer:
var context = type;
return getContextName$1(context) + ".Consumer";
case ContextProvider:
var provider = type;
return getContextName$1(provider._context) + ".Provider";
case DehydratedFragment:
return "DehydratedFragment";
case ForwardRef:
return getWrappedName$1(type, type.render, "ForwardRef");
case Fragment:
return "Fragment";
case HostComponent:
return type;
case HostPortal:
return "Portal";
case HostRoot:
return "Root";
case HostText:
return "Text";
case LazyComponent:
return getComponentNameFromType(type);
case Mode:
if (type === REACT_STRICT_MODE_TYPE) {
return "StrictMode";
}
return "Mode";
case OffscreenComponent:
return "Offscreen";
case Profiler:
return "Profiler";
case ScopeComponent:
return "Scope";
case SuspenseComponent:
return "Suspense";
case SuspenseListComponent:
return "SuspenseList";
case TracingMarkerComponent:
return "TracingMarker";
case ClassComponent:
case FunctionComponent:
case IncompleteClassComponent:
case IndeterminateComponent:
case MemoComponent:
case SimpleMemoComponent:
if (typeof type === "function") {
return type.displayName || type.name || null;
}
if (typeof type === "string") {
return type;
}
break;
}
return null;
}
var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
var current = null;
var isRendering = false;
function getCurrentFiberOwnerNameInDevOrNull() {
{
if (current === null) {
return null;
}
var owner = current._debugOwner;
if (owner !== null && typeof owner !== "undefined") {
return getComponentNameFromFiber(owner);
}
}
return null;
}
function getCurrentFiberStackInDev() {
{
if (current === null) {
return "";
}
return getStackByFiberInDevAndProd(current);
}
}
function resetCurrentFiber() {
{
ReactDebugCurrentFrame.getCurrentStack = null;
current = null;
isRendering = false;
}
}
function setCurrentFiber(fiber) {
{
ReactDebugCurrentFrame.getCurrentStack = fiber === null ? null : getCurrentFiberStackInDev;
current = fiber;
isRendering = false;
}
}
function getCurrentFiber() {
{
return current;
}
}
function setIsRendering(rendering) {
{
isRendering = rendering;
}
}
function toString3(value) {
return "" + value;
}
function getToStringValue(value) {
switch (typeof value) {
case "boolean":
case "number":
case "string":
case "undefined":
return value;
case "object":
{
checkFormFieldValueStringCoercion(value);
}
return value;
default:
return "";
}
}
var hasReadOnlyValue = {
button: true,
checkbox: true,
image: true,
hidden: true,
radio: true,
reset: true,
submit: true
};
function checkControlledValueProps(tagName, props) {
{
if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) {
error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.");
}
if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) {
error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.");
}
}
}
function isCheckable(elem) {
var type = elem.type;
var nodeName = elem.nodeName;
return nodeName && nodeName.toLowerCase() === "input" && (type === "checkbox" || type === "radio");
}
function getTracker(node) {
return node._valueTracker;
}
function detachTracker(node) {
node._valueTracker = null;
}
function getValueFromNode(node) {
var value = "";
if (!node) {
return value;
}
if (isCheckable(node)) {
value = node.checked ? "true" : "false";
} else {
value = node.value;
}
return value;
}
function trackValueOnNode(node) {
var valueField = isCheckable(node) ? "checked" : "value";
var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
{
checkFormFieldValueStringCoercion(node[valueField]);
}
var currentValue = "" + node[valueField];
if (node.hasOwnProperty(valueField) || typeof descriptor === "undefined" || typeof descriptor.get !== "function" || typeof descriptor.set !== "function") {
return;
}
var get2 = descriptor.get, set2 = descriptor.set;
Object.defineProperty(node, valueField, {
configurable: true,
get: function() {
return get2.call(this);
},
set: function(value) {
{
checkFormFieldValueStringCoercion(value);
}
currentValue = "" + value;
set2.call(this, value);
}
});
Object.defineProperty(node, valueField, {
enumerable: descriptor.enumerable
});
var tracker = {
getValue: function() {
return currentValue;
},
setValue: function(value) {
{
checkFormFieldValueStringCoercion(value);
}
currentValue = "" + value;
},
stopTracking: function() {
detachTracker(node);
delete node[valueField];
}
};
return tracker;
}
function track(node) {
if (getTracker(node)) {
return;
}
node._valueTracker = trackValueOnNode(node);
}
function updateValueIfChanged(node) {
if (!node) {
return false;
}
var tracker = getTracker(node);
if (!tracker) {
return true;
}
var lastValue = tracker.getValue();
var nextValue = getValueFromNode(node);
if (nextValue !== lastValue) {
tracker.setValue(nextValue);
return true;
}
return false;
}
function getActiveElement2(doc) {
doc = doc || (typeof document !== "undefined" ? document : void 0);
if (typeof doc === "undefined") {
return null;
}
try {
return doc.activeElement || doc.body;
} catch (e) {
return doc.body;
}
}
var didWarnValueDefaultValue = false;
var didWarnCheckedDefaultChecked = false;
var didWarnControlledToUncontrolled = false;
var didWarnUncontrolledToControlled = false;
function isControlled(props) {
var usesChecked = props.type === "checkbox" || props.type === "radio";
return usesChecked ? props.checked != null : props.value != null;
}
function getHostProps(element, props) {
var node = element;
var checked = props.checked;
var hostProps = assign2({}, props, {
defaultChecked: void 0,
defaultValue: void 0,
value: void 0,
checked: checked != null ? checked : node._wrapperState.initialChecked
});
return hostProps;
}
function initWrapperState(element, props) {
{
checkControlledValueProps("input", props);
if (props.checked !== void 0 && props.defaultChecked !== void 0 && !didWarnCheckedDefaultChecked) {
error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://reactjs.org/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type);
didWarnCheckedDefaultChecked = true;
}
if (props.value !== void 0 && props.defaultValue !== void 0 && !didWarnValueDefaultValue) {
error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://reactjs.org/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type);
didWarnValueDefaultValue = true;
}
}
var node = element;
var defaultValue = props.defaultValue == null ? "" : props.defaultValue;
node._wrapperState = {
initialChecked: props.checked != null ? props.checked : props.defaultChecked,
initialValue: getToStringValue(props.value != null ? props.value : defaultValue),
controlled: isControlled(props)
};
}
function updateChecked(element, props) {
var node = element;
var checked = props.checked;
if (checked != null) {
setValueForProperty(node, "checked", checked, false);
}
}
function updateWrapper(element, props) {
var node = element;
{
var controlled = isControlled(props);
if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {
error("A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components");
didWarnUncontrolledToControlled = true;
}
if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {
error("A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components");
didWarnControlledToUncontrolled = true;
}
}
updateChecked(element, props);
var value = getToStringValue(props.value);
var type = props.type;
if (value != null) {
if (type === "number") {
if (value === 0 && node.value === "" || node.value != value) {
node.value = toString3(value);
}
} else if (node.value !== toString3(value)) {
node.value = toString3(value);
}
} else if (type === "submit" || type === "reset") {
node.removeAttribute("value");
return;
}
{
if (props.hasOwnProperty("value")) {
setDefaultValue(node, props.type, value);
} else if (props.hasOwnProperty("defaultValue")) {
setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
}
}
{
if (props.checked == null && props.defaultChecked != null) {
node.defaultChecked = !!props.defaultChecked;
}
}
}
function postMountWrapper(element, props, isHydrating2) {
var node = element;
if (props.hasOwnProperty("value") || props.hasOwnProperty("defaultValue")) {
var type = props.type;
var isButton = type === "submit" || type === "reset";
if (isButton && (props.value === void 0 || props.value === null)) {
return;
}
var initialValue = toString3(node._wrapperState.initialValue);
if (!isHydrating2) {
{
if (initialValue !== node.value) {
node.value = initialValue;
}
}
}
{
node.defaultValue = initialValue;
}
}
var name = node.name;
if (name !== "") {
node.name = "";
}
{
node.defaultChecked = !node.defaultChecked;
node.defaultChecked = !!node._wrapperState.initialChecked;
}
if (name !== "") {
node.name = name;
}
}
function restoreControlledState(element, props) {
var node = element;
updateWrapper(node, props);
updateNamedCousins(node, props);
}
function updateNamedCousins(rootNode, props) {
var name = props.name;
if (props.type === "radio" && name != null) {
var queryRoot = rootNode;
while (queryRoot.parentNode) {
queryRoot = queryRoot.parentNode;
}
{
checkAttributeStringCoercion(name, "name");
}
var group = queryRoot.querySelectorAll("input[name=" + JSON.stringify("" + name) + '][type="radio"]');
for (var i = 0; i < group.length; i++) {
var otherNode = group[i];
if (otherNode === rootNode || otherNode.form !== rootNode.form) {
continue;
}
var otherProps = getFiberCurrentPropsFromNode(otherNode);
if (!otherProps) {
throw new Error("ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.");
}
updateValueIfChanged(otherNode);
updateWrapper(otherNode, otherProps);
}
}
}
function setDefaultValue(node, type, value) {
if (type !== "number" || getActiveElement2(node.ownerDocument) !== node) {
if (value == null) {
node.defaultValue = toString3(node._wrapperState.initialValue);
} else if (node.defaultValue !== toString3(value)) {
node.defaultValue = toString3(value);
}
}
}
var didWarnSelectedSetOnOption = false;
var didWarnInvalidChild = false;
var didWarnInvalidInnerHTML = false;
function validateProps(element, props) {
{
if (props.value == null) {
if (typeof props.children === "object" && props.children !== null) {
React85.Children.forEach(props.children, function(child) {
if (child == null) {
return;
}
if (typeof child === "string" || typeof child === "number") {
return;
}
if (!didWarnInvalidChild) {
didWarnInvalidChild = true;
error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to <option>.");
}
});
} else if (props.dangerouslySetInnerHTML != null) {
if (!didWarnInvalidInnerHTML) {
didWarnInvalidInnerHTML = true;
error("Pass a `value` prop if you set dangerouslyInnerHTML so React knows which value should be selected.");
}
}
}
if (props.selected != null && !didWarnSelectedSetOnOption) {
error("Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>.");
didWarnSelectedSetOnOption = true;
}
}
}
function postMountWrapper$1(element, props) {
if (props.value != null) {
element.setAttribute("value", toString3(getToStringValue(props.value)));
}
}
var isArrayImpl = Array.isArray;
function isArray3(a) {
return isArrayImpl(a);
}
var didWarnValueDefaultValue$1;
{
didWarnValueDefaultValue$1 = false;
}
function getDeclarationErrorAddendum() {
var ownerName = getCurrentFiberOwnerNameInDevOrNull();
if (ownerName) {
return "\n\nCheck the render method of `" + ownerName + "`.";
}
return "";
}
var valuePropNames = ["value", "defaultValue"];
function checkSelectPropTypes(props) {
{
checkControlledValueProps("select", props);
for (var i = 0; i < valuePropNames.length; i++) {
var propName = valuePropNames[i];
if (props[propName] == null) {
continue;
}
var propNameIsArray = isArray3(props[propName]);
if (props.multiple && !propNameIsArray) {
error("The `%s` prop supplied to <select> must be an array if `multiple` is true.%s", propName, getDeclarationErrorAddendum());
} else if (!props.multiple && propNameIsArray) {
error("The `%s` prop supplied to <select> must be a scalar value if `multiple` is false.%s", propName, getDeclarationErrorAddendum());
}
}
}
}
function updateOptions(node, multiple, propValue, setDefaultSelected) {
var options2 = node.options;
if (multiple) {
var selectedValues = propValue;
var selectedValue = {};
for (var i = 0; i < selectedValues.length; i++) {
selectedValue["$" + selectedValues[i]] = true;
}
for (var _i = 0; _i < options2.length; _i++) {
var selected = selectedValue.hasOwnProperty("$" + options2[_i].value);
if (options2[_i].selected !== selected) {
options2[_i].selected = selected;
}
if (selected && setDefaultSelected) {
options2[_i].defaultSelected = true;
}
}
} else {
var _selectedValue = toString3(getToStringValue(propValue));
var defaultSelected = null;
for (var _i2 = 0; _i2 < options2.length; _i2++) {
if (options2[_i2].value === _selectedValue) {
options2[_i2].selected = true;
if (setDefaultSelected) {
options2[_i2].defaultSelected = true;
}
return;
}
if (defaultSelected === null && !options2[_i2].disabled) {
defaultSelected = options2[_i2];
}
}
if (defaultSelected !== null) {
defaultSelected.selected = true;
}
}
}
function getHostProps$1(element, props) {
return assign2({}, props, {
value: void 0
});
}
function initWrapperState$1(element, props) {
var node = element;
{
checkSelectPropTypes(props);
}
node._wrapperState = {
wasMultiple: !!props.multiple
};
{
if (props.value !== void 0 && props.defaultValue !== void 0 && !didWarnValueDefaultValue$1) {
error("Select elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled select element and remove one of these props. More info: https://reactjs.org/link/controlled-components");
didWarnValueDefaultValue$1 = true;
}
}
}
function postMountWrapper$2(element, props) {
var node = element;
node.multiple = !!props.multiple;
var value = props.value;
if (value != null) {
updateOptions(node, !!props.multiple, value, false);
} else if (props.defaultValue != null) {
updateOptions(node, !!props.multiple, props.defaultValue, true);
}
}
function postUpdateWrapper(element, props) {
var node = element;
var wasMultiple = node._wrapperState.wasMultiple;
node._wrapperState.wasMultiple = !!props.multiple;
var value = props.value;
if (value != null) {
updateOptions(node, !!props.multiple, value, false);
} else if (wasMultiple !== !!props.multiple) {
if (props.defaultValue != null) {
updateOptions(node, !!props.multiple, props.defaultValue, true);
} else {
updateOptions(node, !!props.multiple, props.multiple ? [] : "", false);
}
}
}
function restoreControlledState$1(element, props) {
var node = element;
var value = props.value;
if (value != null) {
updateOptions(node, !!props.multiple, value, false);
}
}
var didWarnValDefaultVal = false;
function getHostProps$2(element, props) {
var node = element;
if (props.dangerouslySetInnerHTML != null) {
throw new Error("`dangerouslySetInnerHTML` does not make sense on <textarea>.");
}
var hostProps = assign2({}, props, {
value: void 0,
defaultValue: void 0,
children: toString3(node._wrapperState.initialValue)
});
return hostProps;
}
function initWrapperState$2(element, props) {
var node = element;
{
checkControlledValueProps("textarea", props);
if (props.value !== void 0 && props.defaultValue !== void 0 && !didWarnValDefaultVal) {
error("%s contains a textarea with both value and defaultValue props. Textarea elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled textarea and remove one of these props. More info: https://reactjs.org/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component");
didWarnValDefaultVal = true;
}
}
var initialValue = props.value;
if (initialValue == null) {
var children = props.children, defaultValue = props.defaultValue;
if (children != null) {
{
error("Use the `defaultValue` or `value` props instead of setting children on <textarea>.");
}
{
if (defaultValue != null) {
throw new Error("If you supply `defaultValue` on a <textarea>, do not pass children.");
}
if (isArray3(children)) {
if (children.length > 1) {
throw new Error("<textarea> can only have at most one child.");
}
children = children[0];
}
defaultValue = children;
}
}
if (defaultValue == null) {
defaultValue = "";
}
initialValue = defaultValue;
}
node._wrapperState = {
initialValue: getToStringValue(initialValue)
};
}
function updateWrapper$1(element, props) {
var node = element;
var value = getToStringValue(props.value);
var defaultValue = getToStringValue(props.defaultValue);
if (value != null) {
var newValue = toString3(value);
if (newValue !== node.value) {
node.value = newValue;
}
if (props.defaultValue == null && node.defaultValue !== newValue) {
node.defaultValue = newValue;
}
}
if (defaultValue != null) {
node.defaultValue = toString3(defaultValue);
}
}
function postMountWrapper$3(element, props) {
var node = element;
var textContent = node.textContent;
if (textContent === node._wrapperState.initialValue) {
if (textContent !== "" && textContent !== null) {
node.value = textContent;
}
}
}
function restoreControlledState$2(element, props) {
updateWrapper$1(element, props);
}
var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
var MATH_NAMESPACE = "http://www.w3.org/1998/Math/MathML";
var SVG_NAMESPACE = "http://www.w3.org/2000/svg";
function getIntrinsicNamespace(type) {
switch (type) {
case "svg":
return SVG_NAMESPACE;
case "math":
return MATH_NAMESPACE;
default:
return HTML_NAMESPACE;
}
}
function getChildNamespace(parentNamespace, type) {
if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {
return getIntrinsicNamespace(type);
}
if (parentNamespace === SVG_NAMESPACE && type === "foreignObject") {
return HTML_NAMESPACE;
}
return parentNamespace;
}
var createMicrosoftUnsafeLocalFunction = function(func) {
if (typeof MSApp !== "undefined" && MSApp.execUnsafeLocalFunction) {
return function(arg0, arg1, arg2, arg3) {
MSApp.execUnsafeLocalFunction(function() {
return func(arg0, arg1, arg2, arg3);
});
};
} else {
return func;
}
};
var reusableSVGContainer;
var setInnerHTML = createMicrosoftUnsafeLocalFunction(function(node, html) {
if (node.namespaceURI === SVG_NAMESPACE) {
if (!("innerHTML" in node)) {
reusableSVGContainer = reusableSVGContainer || document.createElement("div");
reusableSVGContainer.innerHTML = "<svg>" + html.valueOf().toString() + "</svg>";
var svgNode = reusableSVGContainer.firstChild;
while (node.firstChild) {
node.removeChild(node.firstChild);
}
while (svgNode.firstChild) {
node.appendChild(svgNode.firstChild);
}
return;
}
}
node.innerHTML = html;
});
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var COMMENT_NODE = 8;
var DOCUMENT_NODE = 9;
var DOCUMENT_FRAGMENT_NODE = 11;
var setTextContent = function(node, text) {
if (text) {
var firstChild = node.firstChild;
if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {
firstChild.nodeValue = text;
return;
}
}
node.textContent = text;
};
var shorthandToLonghand = {
animation: ["animationDelay", "animationDirection", "animationDuration", "animationFillMode", "animationIterationCount", "animationName", "animationPlayState", "animationTimingFunction"],
background: ["backgroundAttachment", "backgroundClip", "backgroundColor", "backgroundImage", "backgroundOrigin", "backgroundPositionX", "backgroundPositionY", "backgroundRepeat", "backgroundSize"],
backgroundPosition: ["backgroundPositionX", "backgroundPositionY"],
border: ["borderBottomColor", "borderBottomStyle", "borderBottomWidth", "borderImageOutset", "borderImageRepeat", "borderImageSlice", "borderImageSource", "borderImageWidth", "borderLeftColor", "borderLeftStyle", "borderLeftWidth", "borderRightColor", "borderRightStyle", "borderRightWidth", "borderTopColor", "borderTopStyle", "borderTopWidth"],
borderBlockEnd: ["borderBlockEndColor", "borderBlockEndStyle", "borderBlockEndWidth"],
borderBlockStart: ["borderBlockStartColor", "borderBlockStartStyle", "borderBlockStartWidth"],
borderBottom: ["borderBottomColor", "borderBottomStyle", "borderBottomWidth"],
borderColor: ["borderBottomColor", "borderLeftColor", "borderRightColor", "borderTopColor"],
borderImage: ["borderImageOutset", "borderImageRepeat", "borderImageSlice", "borderImageSource", "borderImageWidth"],
borderInlineEnd: ["borderInlineEndColor", "borderInlineEndStyle", "borderInlineEndWidth"],
borderInlineStart: ["borderInlineStartColor", "borderInlineStartStyle", "borderInlineStartWidth"],
borderLeft: ["borderLeftColor", "borderLeftStyle", "borderLeftWidth"],
borderRadius: ["borderBottomLeftRadius", "borderBottomRightRadius", "borderTopLeftRadius", "borderTopRightRadius"],
borderRight: ["borderRightColor", "borderRightStyle", "borderRightWidth"],
borderStyle: ["borderBottomStyle", "borderLeftStyle", "borderRightStyle", "borderTopStyle"],
borderTop: ["borderTopColor", "borderTopStyle", "borderTopWidth"],
borderWidth: ["borderBottomWidth", "borderLeftWidth", "borderRightWidth", "borderTopWidth"],
columnRule: ["columnRuleColor", "columnRuleStyle", "columnRuleWidth"],
columns: ["columnCount", "columnWidth"],
flex: ["flexBasis", "flexGrow", "flexShrink"],
flexFlow: ["flexDirection", "flexWrap"],
font: ["fontFamily", "fontFeatureSettings", "fontKerning", "fontLanguageOverride", "fontSize", "fontSizeAdjust", "fontStretch", "fontStyle", "fontVariant", "fontVariantAlternates", "fontVariantCaps", "fontVariantEastAsian", "fontVariantLigatures", "fontVariantNumeric", "fontVariantPosition", "fontWeight", "lineHeight"],
fontVariant: ["fontVariantAlternates", "fontVariantCaps", "fontVariantEastAsian", "fontVariantLigatures", "fontVariantNumeric", "fontVariantPosition"],
gap: ["columnGap", "rowGap"],
grid: ["gridAutoColumns", "gridAutoFlow", "gridAutoRows", "gridTemplateAreas", "gridTemplateColumns", "gridTemplateRows"],
gridArea: ["gridColumnEnd", "gridColumnStart", "gridRowEnd", "gridRowStart"],
gridColumn: ["gridColumnEnd", "gridColumnStart"],
gridColumnGap: ["columnGap"],
gridGap: ["columnGap", "rowGap"],
gridRow: ["gridRowEnd", "gridRowStart"],
gridRowGap: ["rowGap"],
gridTemplate: ["gridTemplateAreas", "gridTemplateColumns", "gridTemplateRows"],
listStyle: ["listStyleImage", "listStylePosition", "listStyleType"],
margin: ["marginBottom", "marginLeft", "marginRight", "marginTop"],
marker: ["markerEnd", "markerMid", "markerStart"],
mask: ["maskClip", "maskComposite", "maskImage", "maskMode", "maskOrigin", "maskPositionX", "maskPositionY", "maskRepeat", "maskSize"],
maskPosition: ["maskPositionX", "maskPositionY"],
outline: ["outlineColor", "outlineStyle", "outlineWidth"],
overflow: ["overflowX", "overflowY"],
padding: ["paddingBottom", "paddingLeft", "paddingRight", "paddingTop"],
placeContent: ["alignContent", "justifyContent"],
placeItems: ["alignItems", "justifyItems"],
placeSelf: ["alignSelf", "justifySelf"],
textDecoration: ["textDecorationColor", "textDecorationLine", "textDecorationStyle"],
textEmphasis: ["textEmphasisColor", "textEmphasisStyle"],
transition: ["transitionDelay", "transitionDuration", "transitionProperty", "transitionTimingFunction"],
wordWrap: ["overflowWrap"]
};
var isUnitlessNumber = {
animationIterationCount: true,
aspectRatio: true,
borderImageOutset: true,
borderImageSlice: true,
borderImageWidth: true,
boxFlex: true,
boxFlexGroup: true,
boxOrdinalGroup: true,
columnCount: true,
columns: true,
flex: true,
flexGrow: true,
flexPositive: true,
flexShrink: true,
flexNegative: true,
flexOrder: true,
gridArea: true,
gridRow: true,
gridRowEnd: true,
gridRowSpan: true,
gridRowStart: true,
gridColumn: true,
gridColumnEnd: true,
gridColumnSpan: true,
gridColumnStart: true,
fontWeight: true,
lineClamp: true,
lineHeight: true,
opacity: true,
order: true,
orphans: true,
tabSize: true,
widows: true,
zIndex: true,
zoom: true,
fillOpacity: true,
floodOpacity: true,
stopOpacity: true,
strokeDasharray: true,
strokeDashoffset: true,
strokeMiterlimit: true,
strokeOpacity: true,
strokeWidth: true
};
function prefixKey(prefix3, key) {
return prefix3 + key.charAt(0).toUpperCase() + key.substring(1);
}
var prefixes = ["Webkit", "ms", "Moz", "O"];
Object.keys(isUnitlessNumber).forEach(function(prop) {
prefixes.forEach(function(prefix3) {
isUnitlessNumber[prefixKey(prefix3, prop)] = isUnitlessNumber[prop];
});
});
function dangerousStyleValue(name, value, isCustomProperty) {
var isEmpty = value == null || typeof value === "boolean" || value === "";
if (isEmpty) {
return "";
}
if (!isCustomProperty && typeof value === "number" && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
return value + "px";
}
{
checkCSSPropertyStringCoercion(value, name);
}
return ("" + value).trim();
}
var uppercasePattern = /([A-Z])/g;
var msPattern = /^ms-/;
function hyphenateStyleName(name) {
return name.replace(uppercasePattern, "-$1").toLowerCase().replace(msPattern, "-ms-");
}
var warnValidStyle = function() {
};
{
var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
var msPattern$1 = /^-ms-/;
var hyphenPattern = /-(.)/g;
var badStyleValueWithSemicolonPattern = /;\s*$/;
var warnedStyleNames = {};
var warnedStyleValues = {};
var warnedForNaNValue = false;
var warnedForInfinityValue = false;
var camelize = function(string) {
return string.replace(hyphenPattern, function(_, character) {
return character.toUpperCase();
});
};
var warnHyphenatedStyleName = function(name) {
if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
return;
}
warnedStyleNames[name] = true;
error("Unsupported style property %s. Did you mean %s?", name, camelize(name.replace(msPattern$1, "ms-")));
};
var warnBadVendoredStyleName = function(name) {
if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
return;
}
warnedStyleNames[name] = true;
error("Unsupported vendor-prefixed style property %s. Did you mean %s?", name, name.charAt(0).toUpperCase() + name.slice(1));
};
var warnStyleValueWithSemicolon = function(name, value) {
if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
return;
}
warnedStyleValues[value] = true;
error(`Style property values shouldn't contain a semicolon. Try "%s: %s" instead.`, name, value.replace(badStyleValueWithSemicolonPattern, ""));
};
var warnStyleValueIsNaN = function(name, value) {
if (warnedForNaNValue) {
return;
}
warnedForNaNValue = true;
error("`NaN` is an invalid value for the `%s` css style property.", name);
};
var warnStyleValueIsInfinity = function(name, value) {
if (warnedForInfinityValue) {
return;
}
warnedForInfinityValue = true;
error("`Infinity` is an invalid value for the `%s` css style property.", name);
};
warnValidStyle = function(name, value) {
if (name.indexOf("-") > -1) {
warnHyphenatedStyleName(name);
} else if (badVendoredStyleNamePattern.test(name)) {
warnBadVendoredStyleName(name);
} else if (badStyleValueWithSemicolonPattern.test(value)) {
warnStyleValueWithSemicolon(name, value);
}
if (typeof value === "number") {
if (isNaN(value)) {
warnStyleValueIsNaN(name, value);
} else if (!isFinite(value)) {
warnStyleValueIsInfinity(name, value);
}
}
};
}
var warnValidStyle$1 = warnValidStyle;
function createDangerousStringForStyles(styles) {
{
var serialized = "";
var delimiter = "";
for (var styleName in styles) {
if (!styles.hasOwnProperty(styleName)) {
continue;
}
var styleValue = styles[styleName];
if (styleValue != null) {
var isCustomProperty = styleName.indexOf("--") === 0;
serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ":";
serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);
delimiter = ";";
}
}
return serialized || null;
}
}
function setValueForStyles(node, styles) {
var style2 = node.style;
for (var styleName in styles) {
if (!styles.hasOwnProperty(styleName)) {
continue;
}
var isCustomProperty = styleName.indexOf("--") === 0;
{
if (!isCustomProperty) {
warnValidStyle$1(styleName, styles[styleName]);
}
}
var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);
if (styleName === "float") {
styleName = "cssFloat";
}
if (isCustomProperty) {
style2.setProperty(styleName, styleValue);
} else {
style2[styleName] = styleValue;
}
}
}
function isValueEmpty(value) {
return value == null || typeof value === "boolean" || value === "";
}
function expandShorthandMap(styles) {
var expanded = {};
for (var key in styles) {
var longhands = shorthandToLonghand[key] || [key];
for (var i = 0; i < longhands.length; i++) {
expanded[longhands[i]] = key;
}
}
return expanded;
}
function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {
{
if (!nextStyles) {
return;
}
var expandedUpdates = expandShorthandMap(styleUpdates);
var expandedStyles = expandShorthandMap(nextStyles);
var warnedAbout = {};
for (var key in expandedUpdates) {
var originalKey = expandedUpdates[key];
var correctOriginalKey = expandedStyles[key];
if (correctOriginalKey && originalKey !== correctOriginalKey) {
var warningKey = originalKey + "," + correctOriginalKey;
if (warnedAbout[warningKey]) {
continue;
}
warnedAbout[warningKey] = true;
error("%s a style property during rerender (%s) when a conflicting property is set (%s) can lead to styling bugs. To avoid this, don't mix shorthand and non-shorthand properties for the same value; instead, replace the shorthand with separate values.", isValueEmpty(styleUpdates[originalKey]) ? "Removing" : "Updating", originalKey, correctOriginalKey);
}
}
}
}
var omittedCloseTags = {
area: true,
base: true,
br: true,
col: true,
embed: true,
hr: true,
img: true,
input: true,
keygen: true,
link: true,
meta: true,
param: true,
source: true,
track: true,
wbr: true
};
var voidElementTags = assign2({
menuitem: true
}, omittedCloseTags);
var HTML = "__html";
function assertValidProps(tag, props) {
if (!props) {
return;
}
if (voidElementTags[tag]) {
if (props.children != null || props.dangerouslySetInnerHTML != null) {
throw new Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.");
}
}
if (props.dangerouslySetInnerHTML != null) {
if (props.children != null) {
throw new Error("Can only set one of `children` or `props.dangerouslySetInnerHTML`.");
}
if (typeof props.dangerouslySetInnerHTML !== "object" || !(HTML in props.dangerouslySetInnerHTML)) {
throw new Error("`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://reactjs.org/link/dangerously-set-inner-html for more information.");
}
}
{
if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {
error("A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.");
}
}
if (props.style != null && typeof props.style !== "object") {
throw new Error("The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.");
}
}
function isCustomComponent(tagName, props) {
if (tagName.indexOf("-") === -1) {
return typeof props.is === "string";
}
switch (tagName) {
case "annotation-xml":
case "color-profile":
case "font-face":
case "font-face-src":
case "font-face-uri":
case "font-face-format":
case "font-face-name":
case "missing-glyph":
return false;
default:
return true;
}
}
var possibleStandardNames = {
accept: "accept",
acceptcharset: "acceptCharset",
"accept-charset": "acceptCharset",
accesskey: "accessKey",
action: "action",
allowfullscreen: "allowFullScreen",
alt: "alt",
as: "as",
async: "async",
autocapitalize: "autoCapitalize",
autocomplete: "autoComplete",
autocorrect: "autoCorrect",
autofocus: "autoFocus",
autoplay: "autoPlay",
autosave: "autoSave",
capture: "capture",
cellpadding: "cellPadding",
cellspacing: "cellSpacing",
challenge: "challenge",
charset: "charSet",
checked: "checked",
children: "children",
cite: "cite",
class: "className",
classid: "classID",
classname: "className",
cols: "cols",
colspan: "colSpan",
content: "content",
contenteditable: "contentEditable",
contextmenu: "contextMenu",
controls: "controls",
controlslist: "controlsList",
coords: "coords",
crossorigin: "crossOrigin",
dangerouslysetinnerhtml: "dangerouslySetInnerHTML",
data: "data",
datetime: "dateTime",
default: "default",
defaultchecked: "defaultChecked",
defaultvalue: "defaultValue",
defer: "defer",
dir: "dir",
disabled: "disabled",
disablepictureinpicture: "disablePictureInPicture",
disableremoteplayback: "disableRemotePlayback",
download: "download",
draggable: "draggable",
enctype: "encType",
enterkeyhint: "enterKeyHint",
for: "htmlFor",
form: "form",
formmethod: "formMethod",
formaction: "formAction",
formenctype: "formEncType",
formnovalidate: "formNoValidate",
formtarget: "formTarget",
frameborder: "frameBorder",
headers: "headers",
height: "height",
hidden: "hidden",
high: "high",
href: "href",
hreflang: "hrefLang",
htmlfor: "htmlFor",
httpequiv: "httpEquiv",
"http-equiv": "httpEquiv",
icon: "icon",
id: "id",
imagesizes: "imageSizes",
imagesrcset: "imageSrcSet",
innerhtml: "innerHTML",
inputmode: "inputMode",
integrity: "integrity",
is: "is",
itemid: "itemID",
itemprop: "itemProp",
itemref: "itemRef",
itemscope: "itemScope",
itemtype: "itemType",
keyparams: "keyParams",
keytype: "keyType",
kind: "kind",
label: "label",
lang: "lang",
list: "list",
loop: "loop",
low: "low",
manifest: "manifest",
marginwidth: "marginWidth",
marginheight: "marginHeight",
max: "max",
maxlength: "maxLength",
media: "media",
mediagroup: "mediaGroup",
method: "method",
min: "min",
minlength: "minLength",
multiple: "multiple",
muted: "muted",
name: "name",
nomodule: "noModule",
nonce: "nonce",
novalidate: "noValidate",
open: "open",
optimum: "optimum",
pattern: "pattern",
placeholder: "placeholder",
playsinline: "playsInline",
poster: "poster",
preload: "preload",
profile: "profile",
radiogroup: "radioGroup",
readonly: "readOnly",
referrerpolicy: "referrerPolicy",
rel: "rel",
required: "required",
reversed: "reversed",
role: "role",
rows: "rows",
rowspan: "rowSpan",
sandbox: "sandbox",
scope: "scope",
scoped: "scoped",
scrolling: "scrolling",
seamless: "seamless",
selected: "selected",
shape: "shape",
size: "size",
sizes: "sizes",
span: "span",
spellcheck: "spellCheck",
src: "src",
srcdoc: "srcDoc",
srclang: "srcLang",
srcset: "srcSet",
start: "start",
step: "step",
style: "style",
summary: "summary",
tabindex: "tabIndex",
target: "target",
title: "title",
type: "type",
usemap: "useMap",
value: "value",
width: "width",
wmode: "wmode",
wrap: "wrap",
about: "about",
accentheight: "accentHeight",
"accent-height": "accentHeight",
accumulate: "accumulate",
additive: "additive",
alignmentbaseline: "alignmentBaseline",
"alignment-baseline": "alignmentBaseline",
allowreorder: "allowReorder",
alphabetic: "alphabetic",
amplitude: "amplitude",
arabicform: "arabicForm",
"arabic-form": "arabicForm",
ascent: "ascent",
attributename: "attributeName",
attributetype: "attributeType",
autoreverse: "autoReverse",
azimuth: "azimuth",
basefrequency: "baseFrequency",
baselineshift: "baselineShift",
"baseline-shift": "baselineShift",
baseprofile: "baseProfile",
bbox: "bbox",
begin: "begin",
bias: "bias",
by: "by",
calcmode: "calcMode",
capheight: "capHeight",
"cap-height": "capHeight",
clip: "clip",
clippath: "clipPath",
"clip-path": "clipPath",
clippathunits: "clipPathUnits",
cliprule: "clipRule",
"clip-rule": "clipRule",
color: "color",
colorinterpolation: "colorInterpolation",
"color-interpolation": "colorInterpolation",
colorinterpolationfilters: "colorInterpolationFilters",
"color-interpolation-filters": "colorInterpolationFilters",
colorprofile: "colorProfile",
"color-profile": "colorProfile",
colorrendering: "colorRendering",
"color-rendering": "colorRendering",
contentscripttype: "contentScriptType",
contentstyletype: "contentStyleType",
cursor: "cursor",
cx: "cx",
cy: "cy",
d: "d",
datatype: "datatype",
decelerate: "decelerate",
descent: "descent",
diffuseconstant: "diffuseConstant",
direction: "direction",
display: "display",
divisor: "divisor",
dominantbaseline: "dominantBaseline",
"dominant-baseline": "dominantBaseline",
dur: "dur",
dx: "dx",
dy: "dy",
edgemode: "edgeMode",
elevation: "elevation",
enablebackground: "enableBackground",
"enable-background": "enableBackground",
end: "end",
exponent: "exponent",
externalresourcesrequired: "externalResourcesRequired",
fill: "fill",
fillopacity: "fillOpacity",
"fill-opacity": "fillOpacity",
fillrule: "fillRule",
"fill-rule": "fillRule",
filter: "filter",
filterres: "filterRes",
filterunits: "filterUnits",
floodopacity: "floodOpacity",
"flood-opacity": "floodOpacity",
floodcolor: "floodColor",
"flood-color": "floodColor",
focusable: "focusable",
fontfamily: "fontFamily",
"font-family": "fontFamily",
fontsize: "fontSize",
"font-size": "fontSize",
fontsizeadjust: "fontSizeAdjust",
"font-size-adjust": "fontSizeAdjust",
fontstretch: "fontStretch",
"font-stretch": "fontStretch",
fontstyle: "fontStyle",
"font-style": "fontStyle",
fontvariant: "fontVariant",
"font-variant": "fontVariant",
fontweight: "fontWeight",
"font-weight": "fontWeight",
format: "format",
from: "from",
fx: "fx",
fy: "fy",
g1: "g1",
g2: "g2",
glyphname: "glyphName",
"glyph-name": "glyphName",
glyphorientationhorizontal: "glyphOrientationHorizontal",
"glyph-orientation-horizontal": "glyphOrientationHorizontal",
glyphorientationvertical: "glyphOrientationVertical",
"glyph-orientation-vertical": "glyphOrientationVertical",
glyphref: "glyphRef",
gradienttransform: "gradientTransform",
gradientunits: "gradientUnits",
hanging: "hanging",
horizadvx: "horizAdvX",
"horiz-adv-x": "horizAdvX",
horizoriginx: "horizOriginX",
"horiz-origin-x": "horizOriginX",
ideographic: "ideographic",
imagerendering: "imageRendering",
"image-rendering": "imageRendering",
in2: "in2",
in: "in",
inlist: "inlist",
intercept: "intercept",
k1: "k1",
k2: "k2",
k3: "k3",
k4: "k4",
k: "k",
kernelmatrix: "kernelMatrix",
kernelunitlength: "kernelUnitLength",
kerning: "kerning",
keypoints: "keyPoints",
keysplines: "keySplines",
keytimes: "keyTimes",
lengthadjust: "lengthAdjust",
letterspacing: "letterSpacing",
"letter-spacing": "letterSpacing",
lightingcolor: "lightingColor",
"lighting-color": "lightingColor",
limitingconeangle: "limitingConeAngle",
local: "local",
markerend: "markerEnd",
"marker-end": "markerEnd",
markerheight: "markerHeight",
markermid: "markerMid",
"marker-mid": "markerMid",
markerstart: "markerStart",
"marker-start": "markerStart",
markerunits: "markerUnits",
markerwidth: "markerWidth",
mask: "mask",
maskcontentunits: "maskContentUnits",
maskunits: "maskUnits",
mathematical: "mathematical",
mode: "mode",
numoctaves: "numOctaves",
offset: "offset",
opacity: "opacity",
operator: "operator",
order: "order",
orient: "orient",
orientation: "orientation",
origin: "origin",
overflow: "overflow",
overlineposition: "overlinePosition",
"overline-position": "overlinePosition",
overlinethickness: "overlineThickness",
"overline-thickness": "overlineThickness",
paintorder: "paintOrder",
"paint-order": "paintOrder",
panose1: "panose1",
"panose-1": "panose1",
pathlength: "pathLength",
patterncontentunits: "patternContentUnits",
patterntransform: "patternTransform",
patternunits: "patternUnits",
pointerevents: "pointerEvents",
"pointer-events": "pointerEvents",
points: "points",
pointsatx: "pointsAtX",
pointsaty: "pointsAtY",
pointsatz: "pointsAtZ",
prefix: "prefix",
preservealpha: "preserveAlpha",
preserveaspectratio: "preserveAspectRatio",
primitiveunits: "primitiveUnits",
property: "property",
r: "r",
radius: "radius",
refx: "refX",
refy: "refY",
renderingintent: "renderingIntent",
"rendering-intent": "renderingIntent",
repeatcount: "repeatCount",
repeatdur: "repeatDur",
requiredextensions: "requiredExtensions",
requiredfeatures: "requiredFeatures",
resource: "resource",
restart: "restart",
result: "result",
results: "results",
rotate: "rotate",
rx: "rx",
ry: "ry",
scale: "scale",
security: "security",
seed: "seed",
shaperendering: "shapeRendering",
"shape-rendering": "shapeRendering",
slope: "slope",
spacing: "spacing",
specularconstant: "specularConstant",
specularexponent: "specularExponent",
speed: "speed",
spreadmethod: "spreadMethod",
startoffset: "startOffset",
stddeviation: "stdDeviation",
stemh: "stemh",
stemv: "stemv",
stitchtiles: "stitchTiles",
stopcolor: "stopColor",
"stop-color": "stopColor",
stopopacity: "stopOpacity",
"stop-opacity": "stopOpacity",
strikethroughposition: "strikethroughPosition",
"strikethrough-position": "strikethroughPosition",
strikethroughthickness: "strikethroughThickness",
"strikethrough-thickness": "strikethroughThickness",
string: "string",
stroke: "stroke",
strokedasharray: "strokeDasharray",
"stroke-dasharray": "strokeDasharray",
strokedashoffset: "strokeDashoffset",
"stroke-dashoffset": "strokeDashoffset",
strokelinecap: "strokeLinecap",
"stroke-linecap": "strokeLinecap",
strokelinejoin: "strokeLinejoin",
"stroke-linejoin": "strokeLinejoin",
strokemiterlimit: "strokeMiterlimit",
"stroke-miterlimit": "strokeMiterlimit",
strokewidth: "strokeWidth",
"stroke-width": "strokeWidth",
strokeopacity: "strokeOpacity",
"stroke-opacity": "strokeOpacity",
suppresscontenteditablewarning: "suppressContentEditableWarning",
suppresshydrationwarning: "suppressHydrationWarning",
surfacescale: "surfaceScale",
systemlanguage: "systemLanguage",
tablevalues: "tableValues",
targetx: "targetX",
targety: "targetY",
textanchor: "textAnchor",
"text-anchor": "textAnchor",
textdecoration: "textDecoration",
"text-decoration": "textDecoration",
textlength: "textLength",
textrendering: "textRendering",
"text-rendering": "textRendering",
to: "to",
transform: "transform",
typeof: "typeof",
u1: "u1",
u2: "u2",
underlineposition: "underlinePosition",
"underline-position": "underlinePosition",
underlinethickness: "underlineThickness",
"underline-thickness": "underlineThickness",
unicode: "unicode",
unicodebidi: "unicodeBidi",
"unicode-bidi": "unicodeBidi",
unicoderange: "unicodeRange",
"unicode-range": "unicodeRange",
unitsperem: "unitsPerEm",
"units-per-em": "unitsPerEm",
unselectable: "unselectable",
valphabetic: "vAlphabetic",
"v-alphabetic": "vAlphabetic",
values: "values",
vectoreffect: "vectorEffect",
"vector-effect": "vectorEffect",
version: "version",
vertadvy: "vertAdvY",
"vert-adv-y": "vertAdvY",
vertoriginx: "vertOriginX",
"vert-origin-x": "vertOriginX",
vertoriginy: "vertOriginY",
"vert-origin-y": "vertOriginY",
vhanging: "vHanging",
"v-hanging": "vHanging",
videographic: "vIdeographic",
"v-ideographic": "vIdeographic",
viewbox: "viewBox",
viewtarget: "viewTarget",
visibility: "visibility",
vmathematical: "vMathematical",
"v-mathematical": "vMathematical",
vocab: "vocab",
widths: "widths",
wordspacing: "wordSpacing",
"word-spacing": "wordSpacing",
writingmode: "writingMode",
"writing-mode": "writingMode",
x1: "x1",
x2: "x2",
x: "x",
xchannelselector: "xChannelSelector",
xheight: "xHeight",
"x-height": "xHeight",
xlinkactuate: "xlinkActuate",
"xlink:actuate": "xlinkActuate",
xlinkarcrole: "xlinkArcrole",
"xlink:arcrole": "xlinkArcrole",
xlinkhref: "xlinkHref",
"xlink:href": "xlinkHref",
xlinkrole: "xlinkRole",
"xlink:role": "xlinkRole",
xlinkshow: "xlinkShow",
"xlink:show": "xlinkShow",
xlinktitle: "xlinkTitle",
"xlink:title": "xlinkTitle",
xlinktype: "xlinkType",
"xlink:type": "xlinkType",
xmlbase: "xmlBase",
"xml:base": "xmlBase",
xmllang: "xmlLang",
"xml:lang": "xmlLang",
xmlns: "xmlns",
"xml:space": "xmlSpace",
xmlnsxlink: "xmlnsXlink",
"xmlns:xlink": "xmlnsXlink",
xmlspace: "xmlSpace",
y1: "y1",
y2: "y2",
y: "y",
ychannelselector: "yChannelSelector",
z: "z",
zoomandpan: "zoomAndPan"
};
var ariaProperties = {
"aria-current": 0,
"aria-description": 0,
"aria-details": 0,
"aria-disabled": 0,
"aria-hidden": 0,
"aria-invalid": 0,
"aria-keyshortcuts": 0,
"aria-label": 0,
"aria-roledescription": 0,
"aria-autocomplete": 0,
"aria-checked": 0,
"aria-expanded": 0,
"aria-haspopup": 0,
"aria-level": 0,
"aria-modal": 0,
"aria-multiline": 0,
"aria-multiselectable": 0,
"aria-orientation": 0,
"aria-placeholder": 0,
"aria-pressed": 0,
"aria-readonly": 0,
"aria-required": 0,
"aria-selected": 0,
"aria-sort": 0,
"aria-valuemax": 0,
"aria-valuemin": 0,
"aria-valuenow": 0,
"aria-valuetext": 0,
"aria-atomic": 0,
"aria-busy": 0,
"aria-live": 0,
"aria-relevant": 0,
"aria-dropeffect": 0,
"aria-grabbed": 0,
"aria-activedescendant": 0,
"aria-colcount": 0,
"aria-colindex": 0,
"aria-colspan": 0,
"aria-controls": 0,
"aria-describedby": 0,
"aria-errormessage": 0,
"aria-flowto": 0,
"aria-labelledby": 0,
"aria-owns": 0,
"aria-posinset": 0,
"aria-rowcount": 0,
"aria-rowindex": 0,
"aria-rowspan": 0,
"aria-setsize": 0
};
var warnedProperties = {};
var rARIA = new RegExp("^(aria)-[" + ATTRIBUTE_NAME_CHAR + "]*$");
var rARIACamel = new RegExp("^(aria)[A-Z][" + ATTRIBUTE_NAME_CHAR + "]*$");
function validateProperty(tagName, name) {
{
if (hasOwnProperty4.call(warnedProperties, name) && warnedProperties[name]) {
return true;
}
if (rARIACamel.test(name)) {
var ariaName = "aria-" + name.slice(4).toLowerCase();
var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null;
if (correctName == null) {
error("Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.", name);
warnedProperties[name] = true;
return true;
}
if (name !== correctName) {
error("Invalid ARIA attribute `%s`. Did you mean `%s`?", name, correctName);
warnedProperties[name] = true;
return true;
}
}
if (rARIA.test(name)) {
var lowerCasedName = name.toLowerCase();
var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null;
if (standardName == null) {
warnedProperties[name] = true;
return false;
}
if (name !== standardName) {
error("Unknown ARIA attribute `%s`. Did you mean `%s`?", name, standardName);
warnedProperties[name] = true;
return true;
}
}
}
return true;
}
function warnInvalidARIAProps(type, props) {
{
var invalidProps = [];
for (var key in props) {
var isValid = validateProperty(type, key);
if (!isValid) {
invalidProps.push(key);
}
}
var unknownPropString = invalidProps.map(function(prop) {
return "`" + prop + "`";
}).join(", ");
if (invalidProps.length === 1) {
error("Invalid aria prop %s on <%s> tag. For details, see https://reactjs.org/link/invalid-aria-props", unknownPropString, type);
} else if (invalidProps.length > 1) {
error("Invalid aria props %s on <%s> tag. For details, see https://reactjs.org/link/invalid-aria-props", unknownPropString, type);
}
}
}
function validateProperties(type, props) {
if (isCustomComponent(type, props)) {
return;
}
warnInvalidARIAProps(type, props);
}
var didWarnValueNull = false;
function validateProperties$1(type, props) {
{
if (type !== "input" && type !== "textarea" && type !== "select") {
return;
}
if (props != null && props.value === null && !didWarnValueNull) {
didWarnValueNull = true;
if (type === "select" && props.multiple) {
error("`value` prop on `%s` should not be null. Consider using an empty array when `multiple` is set to `true` to clear the component or `undefined` for uncontrolled components.", type);
} else {
error("`value` prop on `%s` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components.", type);
}
}
}
}
var validateProperty$1 = function() {
};
{
var warnedProperties$1 = {};
var EVENT_NAME_REGEX = /^on./;
var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
var rARIA$1 = new RegExp("^(aria)-[" + ATTRIBUTE_NAME_CHAR + "]*$");
var rARIACamel$1 = new RegExp("^(aria)[A-Z][" + ATTRIBUTE_NAME_CHAR + "]*$");
validateProperty$1 = function(tagName, name, value, eventRegistry) {
if (hasOwnProperty4.call(warnedProperties$1, name) && warnedProperties$1[name]) {
return true;
}
var lowerCasedName = name.toLowerCase();
if (lowerCasedName === "onfocusin" || lowerCasedName === "onfocusout") {
error("React uses onFocus and onBlur instead of onFocusIn and onFocusOut. All React events are normalized to bubble, so onFocusIn and onFocusOut are not needed/supported by React.");
warnedProperties$1[name] = true;
return true;
}
if (eventRegistry != null) {
var registrationNameDependencies2 = eventRegistry.registrationNameDependencies, possibleRegistrationNames2 = eventRegistry.possibleRegistrationNames;
if (registrationNameDependencies2.hasOwnProperty(name)) {
return true;
}
var registrationName = possibleRegistrationNames2.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames2[lowerCasedName] : null;
if (registrationName != null) {
error("Invalid event handler property `%s`. Did you mean `%s`?", name, registrationName);
warnedProperties$1[name] = true;
return true;
}
if (EVENT_NAME_REGEX.test(name)) {
error("Unknown event handler property `%s`. It will be ignored.", name);
warnedProperties$1[name] = true;
return true;
}
} else if (EVENT_NAME_REGEX.test(name)) {
if (INVALID_EVENT_NAME_REGEX.test(name)) {
error("Invalid event handler property `%s`. React events use the camelCase naming convention, for example `onClick`.", name);
}
warnedProperties$1[name] = true;
return true;
}
if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
return true;
}
if (lowerCasedName === "innerhtml") {
error("Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`.");
warnedProperties$1[name] = true;
return true;
}
if (lowerCasedName === "aria") {
error("The `aria` attribute is reserved for future use in React. Pass individual `aria-` attributes instead.");
warnedProperties$1[name] = true;
return true;
}
if (lowerCasedName === "is" && value !== null && value !== void 0 && typeof value !== "string") {
error("Received a `%s` for a string attribute `is`. If this is expected, cast the value to a string.", typeof value);
warnedProperties$1[name] = true;
return true;
}
if (typeof value === "number" && isNaN(value)) {
error("Received NaN for the `%s` attribute. If this is expected, cast the value to a string.", name);
warnedProperties$1[name] = true;
return true;
}
var propertyInfo = getPropertyInfo(name);
var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED;
if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
var standardName = possibleStandardNames[lowerCasedName];
if (standardName !== name) {
error("Invalid DOM property `%s`. Did you mean `%s`?", name, standardName);
warnedProperties$1[name] = true;
return true;
}
} else if (!isReserved && name !== lowerCasedName) {
error("React does not recognize the `%s` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `%s` instead. If you accidentally passed it from a parent component, remove it from the DOM element.", name, lowerCasedName);
warnedProperties$1[name] = true;
return true;
}
if (typeof value === "boolean" && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
if (value) {
error('Received `%s` for a non-boolean attribute `%s`.\n\nIf you want to write it to the DOM, pass a string instead: %s="%s" or %s={value.toString()}.', value, name, name, value, name);
} else {
error('Received `%s` for a non-boolean attribute `%s`.\n\nIf you want to write it to the DOM, pass a string instead: %s="%s" or %s={value.toString()}.\n\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);
}
warnedProperties$1[name] = true;
return true;
}
if (isReserved) {
return true;
}
if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
warnedProperties$1[name] = true;
return false;
}
if ((value === "false" || value === "true") && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
error("Received the string `%s` for the boolean attribute `%s`. %s Did you mean %s={%s}?", value, name, value === "false" ? "The browser will interpret it as a truthy value." : 'Although this works, it will not work as expected if you pass the string "false".', name, value);
warnedProperties$1[name] = true;
return true;
}
return true;
};
}
var warnUnknownProperties = function(type, props, eventRegistry) {
{
var unknownProps = [];
for (var key in props) {
var isValid = validateProperty$1(type, key, props[key], eventRegistry);
if (!isValid) {
unknownProps.push(key);
}
}
var unknownPropString = unknownProps.map(function(prop) {
return "`" + prop + "`";
}).join(", ");
if (unknownProps.length === 1) {
error("Invalid value for prop %s on <%s> tag. Either remove it from the element, or pass a string or number value to keep it in the DOM. For details, see https://reactjs.org/link/attribute-behavior ", unknownPropString, type);
} else if (unknownProps.length > 1) {
error("Invalid values for props %s on <%s> tag. Either remove them from the element, or pass a string or number value to keep them in the DOM. For details, see https://reactjs.org/link/attribute-behavior ", unknownPropString, type);
}
}
};
function validateProperties$2(type, props, eventRegistry) {
if (isCustomComponent(type, props)) {
return;
}
warnUnknownProperties(type, props, eventRegistry);
}
var IS_EVENT_HANDLE_NON_MANAGED_NODE = 1;
var IS_NON_DELEGATED = 1 << 1;
var IS_CAPTURE_PHASE = 1 << 2;
var SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS = IS_EVENT_HANDLE_NON_MANAGED_NODE | IS_NON_DELEGATED | IS_CAPTURE_PHASE;
var currentReplayingEvent = null;
function setReplayingEvent(event) {
{
if (currentReplayingEvent !== null) {
error("Expected currently replaying event to be null. This error is likely caused by a bug in React. Please file an issue.");
}
}
currentReplayingEvent = event;
}
function resetReplayingEvent() {
{
if (currentReplayingEvent === null) {
error("Expected currently replaying event to not be null. This error is likely caused by a bug in React. Please file an issue.");
}
}
currentReplayingEvent = null;
}
function isReplayingEvent(event) {
return event === currentReplayingEvent;
}
function getEventTarget(nativeEvent) {
var target = nativeEvent.target || nativeEvent.srcElement || window;
if (target.correspondingUseElement) {
target = target.correspondingUseElement;
}
return target.nodeType === TEXT_NODE ? target.parentNode : target;
}
var restoreImpl = null;
var restoreTarget = null;
var restoreQueue = null;
function restoreStateOfTarget(target) {
var internalInstance = getInstanceFromNode(target);
if (!internalInstance) {
return;
}
if (typeof restoreImpl !== "function") {
throw new Error("setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.");
}
var stateNode = internalInstance.stateNode;
if (stateNode) {
var _props = getFiberCurrentPropsFromNode(stateNode);
restoreImpl(internalInstance.stateNode, internalInstance.type, _props);
}
}
function setRestoreImplementation(impl) {
restoreImpl = impl;
}
function enqueueStateRestore(target) {
if (restoreTarget) {
if (restoreQueue) {
restoreQueue.push(target);
} else {
restoreQueue = [target];
}
} else {
restoreTarget = target;
}
}
function needsStateRestore() {
return restoreTarget !== null || restoreQueue !== null;
}
function restoreStateIfNeeded() {
if (!restoreTarget) {
return;
}
var target = restoreTarget;
var queuedTargets = restoreQueue;
restoreTarget = null;
restoreQueue = null;
restoreStateOfTarget(target);
if (queuedTargets) {
for (var i = 0; i < queuedTargets.length; i++) {
restoreStateOfTarget(queuedTargets[i]);
}
}
}
var batchedUpdatesImpl = function(fn, bookkeeping) {
return fn(bookkeeping);
};
var flushSyncImpl = function() {
};
var isInsideEventHandler = false;
function finishEventHandler() {
var controlledComponentsHavePendingUpdates = needsStateRestore();
if (controlledComponentsHavePendingUpdates) {
flushSyncImpl();
restoreStateIfNeeded();
}
}
function batchedUpdates(fn, a, b) {
if (isInsideEventHandler) {
return fn(a, b);
}
isInsideEventHandler = true;
try {
return batchedUpdatesImpl(fn, a, b);
} finally {
isInsideEventHandler = false;
finishEventHandler();
}
}
function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushSyncImpl) {
batchedUpdatesImpl = _batchedUpdatesImpl;
flushSyncImpl = _flushSyncImpl;
}
function isInteractive(tag) {
return tag === "button" || tag === "input" || tag === "select" || tag === "textarea";
}
function shouldPreventMouseEvent(name, type, props) {
switch (name) {
case "onClick":
case "onClickCapture":
case "onDoubleClick":
case "onDoubleClickCapture":
case "onMouseDown":
case "onMouseDownCapture":
case "onMouseMove":
case "onMouseMoveCapture":
case "onMouseUp":
case "onMouseUpCapture":
case "onMouseEnter":
return !!(props.disabled && isInteractive(type));
default:
return false;
}
}
function getListener(inst, registrationName) {
var stateNode = inst.stateNode;
if (stateNode === null) {
return null;
}
var props = getFiberCurrentPropsFromNode(stateNode);
if (props === null) {
return null;
}
var listener = props[registrationName];
if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
return null;
}
if (listener && typeof listener !== "function") {
throw new Error("Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type.");
}
return listener;
}
var passiveBrowserEventsSupported = false;
if (canUseDOM) {
try {
var options = {};
Object.defineProperty(options, "passive", {
get: function() {
passiveBrowserEventsSupported = true;
}
});
window.addEventListener("test", options, options);
window.removeEventListener("test", options, options);
} catch (e) {
passiveBrowserEventsSupported = false;
}
}
function invokeGuardedCallbackProd(name, func, context, a, b, c, d, e, f) {
var funcArgs = Array.prototype.slice.call(arguments, 3);
try {
func.apply(context, funcArgs);
} catch (error2) {
this.onError(error2);
}
}
var invokeGuardedCallbackImpl = invokeGuardedCallbackProd;
{
if (typeof window !== "undefined" && typeof window.dispatchEvent === "function" && typeof document !== "undefined" && typeof document.createEvent === "function") {
var fakeNode = document.createElement("react");
invokeGuardedCallbackImpl = function invokeGuardedCallbackDev(name, func, context, a, b, c, d, e, f) {
if (typeof document === "undefined" || document === null) {
throw new Error("The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.");
}
var evt = document.createEvent("Event");
var didCall = false;
var didError = true;
var windowEvent = window.event;
var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, "event");
function restoreAfterDispatch() {
fakeNode.removeEventListener(evtType, callCallback2, false);
if (typeof window.event !== "undefined" && window.hasOwnProperty("event")) {
window.event = windowEvent;
}
}
var funcArgs = Array.prototype.slice.call(arguments, 3);
function callCallback2() {
didCall = true;
restoreAfterDispatch();
func.apply(context, funcArgs);
didError = false;
}
var error2;
var didSetError = false;
var isCrossOriginError = false;
function handleWindowError(event) {
error2 = event.error;
didSetError = true;
if (error2 === null && event.colno === 0 && event.lineno === 0) {
isCrossOriginError = true;
}
if (event.defaultPrevented) {
if (error2 != null && typeof error2 === "object") {
try {
error2._suppressLogging = true;
} catch (inner) {
}
}
}
}
var evtType = "react-" + (name ? name : "invokeguardedcallback");
window.addEventListener("error", handleWindowError);
fakeNode.addEventListener(evtType, callCallback2, false);
evt.initEvent(evtType, false, false);
fakeNode.dispatchEvent(evt);
if (windowEventDescriptor) {
Object.defineProperty(window, "event", windowEventDescriptor);
}
if (didCall && didError) {
if (!didSetError) {
error2 = new Error(`An error was thrown inside one of your components, but React doesn't know what it was. This is likely due to browser flakiness. React does its best to preserve the "Pause on exceptions" behavior of the DevTools, which requires some DEV-mode only tricks. It's possible that these don't work in your browser. Try triggering the error in production mode, or switching to a modern browser. If you suspect that this is actually an issue with React, please file an issue.`);
} else if (isCrossOriginError) {
error2 = new Error("A cross-origin error was thrown. React doesn't have access to the actual error object in development. See https://reactjs.org/link/crossorigin-error for more information.");
}
this.onError(error2);
}
window.removeEventListener("error", handleWindowError);
if (!didCall) {
restoreAfterDispatch();
return invokeGuardedCallbackProd.apply(this, arguments);
}
};
}
}
var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;
var hasError = false;
var caughtError = null;
var hasRethrowError = false;
var rethrowError = null;
var reporter = {
onError: function(error2) {
hasError = true;
caughtError = error2;
}
};
function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
hasError = false;
caughtError = null;
invokeGuardedCallbackImpl$1.apply(reporter, arguments);
}
function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {
invokeGuardedCallback.apply(this, arguments);
if (hasError) {
var error2 = clearCaughtError();
if (!hasRethrowError) {
hasRethrowError = true;
rethrowError = error2;
}
}
}
function rethrowCaughtError() {
if (hasRethrowError) {
var error2 = rethrowError;
hasRethrowError = false;
rethrowError = null;
throw error2;
}
}
function hasCaughtError() {
return hasError;
}
function clearCaughtError() {
if (hasError) {
var error2 = caughtError;
hasError = false;
caughtError = null;
return error2;
} else {
throw new Error("clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.");
}
}
function get(key) {
return key._reactInternals;
}
function has(key) {
return key._reactInternals !== void 0;
}
function set(key, value) {
key._reactInternals = value;
}
var NoFlags = 0;
var PerformedWork = 1;
var Placement = 2;
var Update = 4;
var ChildDeletion = 16;
var ContentReset = 32;
var Callback = 64;
var DidCapture = 128;
var ForceClientRender = 256;
var Ref2 = 512;
var Snapshot = 1024;
var Passive = 2048;
var Hydrating = 4096;
var Visibility = 8192;
var StoreConsistency = 16384;
var LifecycleEffectMask = Passive | Update | Callback | Ref2 | Snapshot | StoreConsistency;
var HostEffectMask = 32767;
var Incomplete = 32768;
var ShouldCapture = 65536;
var ForceUpdateForLegacySuspense = 131072;
var Forked = 1048576;
var RefStatic = 2097152;
var LayoutStatic = 4194304;
var PassiveStatic = 8388608;
var MountLayoutDev = 16777216;
var MountPassiveDev = 33554432;
var BeforeMutationMask = Update | Snapshot | 0;
var MutationMask = Placement | Update | ChildDeletion | ContentReset | Ref2 | Hydrating | Visibility;
var LayoutMask = Update | Callback | Ref2 | Visibility;
var PassiveMask = Passive | ChildDeletion;
var StaticMask = LayoutStatic | PassiveStatic | RefStatic;
var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
function getNearestMountedFiber(fiber) {
var node = fiber;
var nearestMounted = fiber;
if (!fiber.alternate) {
var nextNode = node;
do {
node = nextNode;
if ((node.flags & (Placement | Hydrating)) !== NoFlags) {
nearestMounted = node.return;
}
nextNode = node.return;
} while (nextNode);
} else {
while (node.return) {
node = node.return;
}
}
if (node.tag === HostRoot) {
return nearestMounted;
}
return null;
}
function getSuspenseInstanceFromFiber(fiber) {
if (fiber.tag === SuspenseComponent) {
var suspenseState = fiber.memoizedState;
if (suspenseState === null) {
var current2 = fiber.alternate;
if (current2 !== null) {
suspenseState = current2.memoizedState;
}
}
if (suspenseState !== null) {
return suspenseState.dehydrated;
}
}
return null;
}
function getContainerFromFiber(fiber) {
return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;
}
function isFiberMounted(fiber) {
return getNearestMountedFiber(fiber) === fiber;
}
function isMounted(component) {
{
var owner = ReactCurrentOwner.current;
if (owner !== null && owner.tag === ClassComponent) {
var ownerFiber = owner;
var instance = ownerFiber.stateNode;
if (!instance._warnedAboutRefsInRender) {
error("%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", getComponentNameFromFiber(ownerFiber) || "A component");
}
instance._warnedAboutRefsInRender = true;
}
}
var fiber = get(component);
if (!fiber) {
return false;
}
return getNearestMountedFiber(fiber) === fiber;
}
function assertIsMounted(fiber) {
if (getNearestMountedFiber(fiber) !== fiber) {
throw new Error("Unable to find node on an unmounted component.");
}
}
function findCurrentFiberUsingSlowPath(fiber) {
var alternate = fiber.alternate;
if (!alternate) {
var nearestMounted = getNearestMountedFiber(fiber);
if (nearestMounted === null) {
throw new Error("Unable to find node on an unmounted component.");
}
if (nearestMounted !== fiber) {
return null;
}
return fiber;
}
var a = fiber;
var b = alternate;
while (true) {
var parentA = a.return;
if (parentA === null) {
break;
}
var parentB = parentA.alternate;
if (parentB === null) {
var nextParent = parentA.return;
if (nextParent !== null) {
a = b = nextParent;
continue;
}
break;
}
if (parentA.child === parentB.child) {
var child = parentA.child;
while (child) {
if (child === a) {
assertIsMounted(parentA);
return fiber;
}
if (child === b) {
assertIsMounted(parentA);
return alternate;
}
child = child.sibling;
}
throw new Error("Unable to find node on an unmounted component.");
}
if (a.return !== b.return) {
a = parentA;
b = parentB;
} else {
var didFindChild = false;
var _child = parentA.child;
while (_child) {
if (_child === a) {
didFindChild = true;
a = parentA;
b = parentB;
break;
}
if (_child === b) {
didFindChild = true;
b = parentA;
a = parentB;
break;
}
_child = _child.sibling;
}
if (!didFindChild) {
_child = parentB.child;
while (_child) {
if (_child === a) {
didFindChild = true;
a = parentB;
b = parentA;
break;
}
if (_child === b) {
didFindChild = true;
b = parentB;
a = parentA;
break;
}
_child = _child.sibling;
}
if (!didFindChild) {
throw new Error("Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.");
}
}
}
if (a.alternate !== b) {
throw new Error("Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.");
}
}
if (a.tag !== HostRoot) {
throw new Error("Unable to find node on an unmounted component.");
}
if (a.stateNode.current === a) {
return fiber;
}
return alternate;
}
function findCurrentHostFiber(parent) {
var currentParent = findCurrentFiberUsingSlowPath(parent);
return currentParent !== null ? findCurrentHostFiberImpl(currentParent) : null;
}
function findCurrentHostFiberImpl(node) {
if (node.tag === HostComponent || node.tag === HostText) {
return node;
}
var child = node.child;
while (child !== null) {
var match2 = findCurrentHostFiberImpl(child);
if (match2 !== null) {
return match2;
}
child = child.sibling;
}
return null;
}
function findCurrentHostFiberWithNoPortals(parent) {
var currentParent = findCurrentFiberUsingSlowPath(parent);
return currentParent !== null ? findCurrentHostFiberWithNoPortalsImpl(currentParent) : null;
}
function findCurrentHostFiberWithNoPortalsImpl(node) {
if (node.tag === HostComponent || node.tag === HostText) {
return node;
}
var child = node.child;
while (child !== null) {
if (child.tag !== HostPortal) {
var match2 = findCurrentHostFiberWithNoPortalsImpl(child);
if (match2 !== null) {
return match2;
}
}
child = child.sibling;
}
return null;
}
var scheduleCallback = Scheduler.unstable_scheduleCallback;
var cancelCallback = Scheduler.unstable_cancelCallback;
var shouldYield = Scheduler.unstable_shouldYield;
var requestPaint = Scheduler.unstable_requestPaint;
var now = Scheduler.unstable_now;
var getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel;
var ImmediatePriority = Scheduler.unstable_ImmediatePriority;
var UserBlockingPriority = Scheduler.unstable_UserBlockingPriority;
var NormalPriority = Scheduler.unstable_NormalPriority;
var LowPriority = Scheduler.unstable_LowPriority;
var IdlePriority = Scheduler.unstable_IdlePriority;
var unstable_yieldValue = Scheduler.unstable_yieldValue;
var unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue;
var rendererID = null;
var injectedHook = null;
var injectedProfilingHooks = null;
var hasLoggedError = false;
var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined";
function injectInternals(internals) {
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined") {
return false;
}
var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
if (hook.isDisabled) {
return true;
}
if (!hook.supportsFiber) {
{
error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://reactjs.org/link/react-devtools");
}
return true;
}
try {
if (enableSchedulingProfiler) {
internals = assign2({}, internals, {
getLaneLabelMap,
injectProfilingHooks
});
}
rendererID = hook.inject(internals);
injectedHook = hook;
} catch (err) {
{
error("React instrumentation encountered an error: %s.", err);
}
}
if (hook.checkDCE) {
return true;
} else {
return false;
}
}
function onScheduleRoot(root2, children) {
{
if (injectedHook && typeof injectedHook.onScheduleFiberRoot === "function") {
try {
injectedHook.onScheduleFiberRoot(rendererID, root2, children);
} catch (err) {
if (!hasLoggedError) {
hasLoggedError = true;
error("React instrumentation encountered an error: %s", err);
}
}
}
}
}
function onCommitRoot(root2, eventPriority) {
if (injectedHook && typeof injectedHook.onCommitFiberRoot === "function") {
try {
var didError = (root2.current.flags & DidCapture) === DidCapture;
if (enableProfilerTimer) {
var schedulerPriority;
switch (eventPriority) {
case DiscreteEventPriority:
schedulerPriority = ImmediatePriority;
break;
case ContinuousEventPriority:
schedulerPriority = UserBlockingPriority;
break;
case DefaultEventPriority:
schedulerPriority = NormalPriority;
break;
case IdleEventPriority:
schedulerPriority = IdlePriority;
break;
default:
schedulerPriority = NormalPriority;
break;
}
injectedHook.onCommitFiberRoot(rendererID, root2, schedulerPriority, didError);
} else {
injectedHook.onCommitFiberRoot(rendererID, root2, void 0, didError);
}
} catch (err) {
{
if (!hasLoggedError) {
hasLoggedError = true;
error("React instrumentation encountered an error: %s", err);
}
}
}
}
}
function onPostCommitRoot(root2) {
if (injectedHook && typeof injectedHook.onPostCommitFiberRoot === "function") {
try {
injectedHook.onPostCommitFiberRoot(rendererID, root2);
} catch (err) {
{
if (!hasLoggedError) {
hasLoggedError = true;
error("React instrumentation encountered an error: %s", err);
}
}
}
}
}
function onCommitUnmount(fiber) {
if (injectedHook && typeof injectedHook.onCommitFiberUnmount === "function") {
try {
injectedHook.onCommitFiberUnmount(rendererID, fiber);
} catch (err) {
{
if (!hasLoggedError) {
hasLoggedError = true;
error("React instrumentation encountered an error: %s", err);
}
}
}
}
}
function setIsStrictModeForDevtools(newIsStrictMode) {
{
if (typeof unstable_yieldValue === "function") {
unstable_setDisableYieldValue(newIsStrictMode);
setSuppressWarning(newIsStrictMode);
}
if (injectedHook && typeof injectedHook.setStrictMode === "function") {
try {
injectedHook.setStrictMode(rendererID, newIsStrictMode);
} catch (err) {
{
if (!hasLoggedError) {
hasLoggedError = true;
error("React instrumentation encountered an error: %s", err);
}
}
}
}
}
}
function injectProfilingHooks(profilingHooks) {
injectedProfilingHooks = profilingHooks;
}
function getLaneLabelMap() {
{
var map = new Map();
var lane = 1;
for (var index3 = 0; index3 < TotalLanes; index3++) {
var label = getLabelForLane(lane);
map.set(lane, label);
lane *= 2;
}
return map;
}
}
function markCommitStarted(lanes) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStarted === "function") {
injectedProfilingHooks.markCommitStarted(lanes);
}
}
}
function markCommitStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStopped === "function") {
injectedProfilingHooks.markCommitStopped();
}
}
}
function markComponentRenderStarted(fiber) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStarted === "function") {
injectedProfilingHooks.markComponentRenderStarted(fiber);
}
}
}
function markComponentRenderStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStopped === "function") {
injectedProfilingHooks.markComponentRenderStopped();
}
}
}
function markComponentPassiveEffectMountStarted(fiber) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStarted === "function") {
injectedProfilingHooks.markComponentPassiveEffectMountStarted(fiber);
}
}
}
function markComponentPassiveEffectMountStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStopped === "function") {
injectedProfilingHooks.markComponentPassiveEffectMountStopped();
}
}
}
function markComponentPassiveEffectUnmountStarted(fiber) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStarted === "function") {
injectedProfilingHooks.markComponentPassiveEffectUnmountStarted(fiber);
}
}
}
function markComponentPassiveEffectUnmountStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStopped === "function") {
injectedProfilingHooks.markComponentPassiveEffectUnmountStopped();
}
}
}
function markComponentLayoutEffectMountStarted(fiber) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStarted === "function") {
injectedProfilingHooks.markComponentLayoutEffectMountStarted(fiber);
}
}
}
function markComponentLayoutEffectMountStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStopped === "function") {
injectedProfilingHooks.markComponentLayoutEffectMountStopped();
}
}
}
function markComponentLayoutEffectUnmountStarted(fiber) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStarted === "function") {
injectedProfilingHooks.markComponentLayoutEffectUnmountStarted(fiber);
}
}
}
function markComponentLayoutEffectUnmountStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStopped === "function") {
injectedProfilingHooks.markComponentLayoutEffectUnmountStopped();
}
}
}
function markComponentErrored(fiber, thrownValue, lanes) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentErrored === "function") {
injectedProfilingHooks.markComponentErrored(fiber, thrownValue, lanes);
}
}
}
function markComponentSuspended(fiber, wakeable, lanes) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentSuspended === "function") {
injectedProfilingHooks.markComponentSuspended(fiber, wakeable, lanes);
}
}
}
function markLayoutEffectsStarted(lanes) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStarted === "function") {
injectedProfilingHooks.markLayoutEffectsStarted(lanes);
}
}
}
function markLayoutEffectsStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStopped === "function") {
injectedProfilingHooks.markLayoutEffectsStopped();
}
}
}
function markPassiveEffectsStarted(lanes) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStarted === "function") {
injectedProfilingHooks.markPassiveEffectsStarted(lanes);
}
}
}
function markPassiveEffectsStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStopped === "function") {
injectedProfilingHooks.markPassiveEffectsStopped();
}
}
}
function markRenderStarted(lanes) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStarted === "function") {
injectedProfilingHooks.markRenderStarted(lanes);
}
}
}
function markRenderYielded() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderYielded === "function") {
injectedProfilingHooks.markRenderYielded();
}
}
}
function markRenderStopped() {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStopped === "function") {
injectedProfilingHooks.markRenderStopped();
}
}
}
function markRenderScheduled(lane) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderScheduled === "function") {
injectedProfilingHooks.markRenderScheduled(lane);
}
}
}
function markForceUpdateScheduled(fiber, lane) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markForceUpdateScheduled === "function") {
injectedProfilingHooks.markForceUpdateScheduled(fiber, lane);
}
}
}
function markStateUpdateScheduled(fiber, lane) {
{
if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markStateUpdateScheduled === "function") {
injectedProfilingHooks.markStateUpdateScheduled(fiber, lane);
}
}
}
var NoMode = 0;
var ConcurrentMode = 1;
var ProfileMode = 2;
var StrictLegacyMode = 8;
var StrictEffectsMode = 16;
var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback;
var log2 = Math.log;
var LN2 = Math.LN2;
function clz32Fallback(x) {
var asUint = x >>> 0;
if (asUint === 0) {
return 32;
}
return 31 - (log2(asUint) / LN2 | 0) | 0;
}
var TotalLanes = 31;
var NoLanes = 0;
var NoLane = 0;
var SyncLane = 1;
var InputContinuousHydrationLane = 2;
var InputContinuousLane = 4;
var DefaultHydrationLane = 8;
var DefaultLane = 16;
var TransitionHydrationLane = 32;
var TransitionLanes = 4194240;
var TransitionLane1 = 64;
var TransitionLane2 = 128;
var TransitionLane3 = 256;
var TransitionLane4 = 512;
var TransitionLane5 = 1024;
var TransitionLane6 = 2048;
var TransitionLane7 = 4096;
var TransitionLane8 = 8192;
var TransitionLane9 = 16384;
var TransitionLane10 = 32768;
var TransitionLane11 = 65536;
var TransitionLane12 = 131072;
var TransitionLane13 = 262144;
var TransitionLane14 = 524288;
var TransitionLane15 = 1048576;
var TransitionLane16 = 2097152;
var RetryLanes = 130023424;
var RetryLane1 = 4194304;
var RetryLane2 = 8388608;
var RetryLane3 = 16777216;
var RetryLane4 = 33554432;
var RetryLane5 = 67108864;
var SomeRetryLane = RetryLane1;
var SelectiveHydrationLane = 134217728;
var NonIdleLanes = 268435455;
var IdleHydrationLane = 268435456;
var IdleLane = 536870912;
var OffscreenLane = 1073741824;
function getLabelForLane(lane) {
{
if (lane & SyncLane) {
return "Sync";
}
if (lane & InputContinuousHydrationLane) {
return "InputContinuousHydration";
}
if (lane & InputContinuousLane) {
return "InputContinuous";
}
if (lane & DefaultHydrationLane) {
return "DefaultHydration";
}
if (lane & DefaultLane) {
return "Default";
}
if (lane & TransitionHydrationLane) {
return "TransitionHydration";
}
if (lane & TransitionLanes) {
return "Transition";
}
if (lane & RetryLanes) {
return "Retry";
}
if (lane & SelectiveHydrationLane) {
return "SelectiveHydration";
}
if (lane & IdleHydrationLane) {
return "IdleHydration";
}
if (lane & IdleLane) {
return "Idle";
}
if (lane & OffscreenLane) {
return "Offscreen";
}
}
}
var NoTimestamp = -1;
var nextTransitionLane = TransitionLane1;
var nextRetryLane = RetryLane1;
function getHighestPriorityLanes(lanes) {
switch (getHighestPriorityLane(lanes)) {
case SyncLane:
return SyncLane;
case InputContinuousHydrationLane:
return InputContinuousHydrationLane;
case InputContinuousLane:
return InputContinuousLane;
case DefaultHydrationLane:
return DefaultHydrationLane;
case DefaultLane:
return DefaultLane;
case TransitionHydrationLane:
return TransitionHydrationLane;
case TransitionLane1:
case TransitionLane2:
case TransitionLane3:
case TransitionLane4:
case TransitionLane5:
case TransitionLane6:
case TransitionLane7:
case TransitionLane8:
case TransitionLane9:
case TransitionLane10:
case TransitionLane11:
case TransitionLane12:
case TransitionLane13:
case TransitionLane14:
case TransitionLane15:
case TransitionLane16:
return lanes & TransitionLanes;
case RetryLane1:
case RetryLane2:
case RetryLane3:
case RetryLane4:
case RetryLane5:
return lanes & RetryLanes;
case SelectiveHydrationLane:
return SelectiveHydrationLane;
case IdleHydrationLane:
return IdleHydrationLane;
case IdleLane:
return IdleLane;
case OffscreenLane:
return OffscreenLane;
default:
{
error("Should have found matching lanes. This is a bug in React.");
}
return lanes;
}
}
function getNextLanes(root2, wipLanes) {
var pendingLanes = root2.pendingLanes;
if (pendingLanes === NoLanes) {
return NoLanes;
}
var nextLanes = NoLanes;
var suspendedLanes = root2.suspendedLanes;
var pingedLanes = root2.pingedLanes;
var nonIdlePendingLanes = pendingLanes & NonIdleLanes;
if (nonIdlePendingLanes !== NoLanes) {
var nonIdleUnblockedLanes = nonIdlePendingLanes & ~suspendedLanes;
if (nonIdleUnblockedLanes !== NoLanes) {
nextLanes = getHighestPriorityLanes(nonIdleUnblockedLanes);
} else {
var nonIdlePingedLanes = nonIdlePendingLanes & pingedLanes;
if (nonIdlePingedLanes !== NoLanes) {
nextLanes = getHighestPriorityLanes(nonIdlePingedLanes);
}
}
} else {
var unblockedLanes = pendingLanes & ~suspendedLanes;
if (unblockedLanes !== NoLanes) {
nextLanes = getHighestPriorityLanes(unblockedLanes);
} else {
if (pingedLanes !== NoLanes) {
nextLanes = getHighestPriorityLanes(pingedLanes);
}
}
}
if (nextLanes === NoLanes) {
return NoLanes;
}
if (wipLanes !== NoLanes && wipLanes !== nextLanes && (wipLanes & suspendedLanes) === NoLanes) {
var nextLane = getHighestPriorityLane(nextLanes);
var wipLane = getHighestPriorityLane(wipLanes);
if (nextLane >= wipLane || nextLane === DefaultLane && (wipLane & TransitionLanes) !== NoLanes) {
return wipLanes;
}
}
if ((nextLanes & InputContinuousLane) !== NoLanes) {
nextLanes |= pendingLanes & DefaultLane;
}
var entangledLanes = root2.entangledLanes;
if (entangledLanes !== NoLanes) {
var entanglements = root2.entanglements;
var lanes = nextLanes & entangledLanes;
while (lanes > 0) {
var index3 = pickArbitraryLaneIndex(lanes);
var lane = 1 << index3;
nextLanes |= entanglements[index3];
lanes &= ~lane;
}
}
return nextLanes;
}
function getMostRecentEventTime(root2, lanes) {
var eventTimes = root2.eventTimes;
var mostRecentEventTime = NoTimestamp;
while (lanes > 0) {
var index3 = pickArbitraryLaneIndex(lanes);
var lane = 1 << index3;
var eventTime = eventTimes[index3];
if (eventTime > mostRecentEventTime) {
mostRecentEventTime = eventTime;
}
lanes &= ~lane;
}
return mostRecentEventTime;
}
function computeExpirationTime(lane, currentTime) {
switch (lane) {
case SyncLane:
case InputContinuousHydrationLane:
case InputContinuousLane:
return currentTime + 250;
case DefaultHydrationLane:
case DefaultLane:
case TransitionHydrationLane:
case TransitionLane1:
case TransitionLane2:
case TransitionLane3:
case TransitionLane4:
case TransitionLane5:
case TransitionLane6:
case TransitionLane7:
case TransitionLane8:
case TransitionLane9:
case TransitionLane10:
case TransitionLane11:
case TransitionLane12:
case TransitionLane13:
case TransitionLane14:
case TransitionLane15:
case TransitionLane16:
return currentTime + 5e3;
case RetryLane1:
case RetryLane2:
case RetryLane3:
case RetryLane4:
case RetryLane5:
return NoTimestamp;
case SelectiveHydrationLane:
case IdleHydrationLane:
case IdleLane:
case OffscreenLane:
return NoTimestamp;
default:
{
error("Should have found matching lanes. This is a bug in React.");
}
return NoTimestamp;
}
}
function markStarvedLanesAsExpired(root2, currentTime) {
var pendingLanes = root2.pendingLanes;
var suspendedLanes = root2.suspendedLanes;
var pingedLanes = root2.pingedLanes;
var expirationTimes = root2.expirationTimes;
var lanes = pendingLanes;
while (lanes > 0) {
var index3 = pickArbitraryLaneIndex(lanes);
var lane = 1 << index3;
var expirationTime = expirationTimes[index3];
if (expirationTime === NoTimestamp) {
if ((lane & suspendedLanes) === NoLanes || (lane & pingedLanes) !== NoLanes) {
expirationTimes[index3] = computeExpirationTime(lane, currentTime);
}
} else if (expirationTime <= currentTime) {
root2.expiredLanes |= lane;
}
lanes &= ~lane;
}
}
function getHighestPriorityPendingLanes(root2) {
return getHighestPriorityLanes(root2.pendingLanes);
}
function getLanesToRetrySynchronouslyOnError(root2) {
var everythingButOffscreen = root2.pendingLanes & ~OffscreenLane;
if (everythingButOffscreen !== NoLanes) {
return everythingButOffscreen;
}
if (everythingButOffscreen & OffscreenLane) {
return OffscreenLane;
}
return NoLanes;
}
function includesSyncLane(lanes) {
return (lanes & SyncLane) !== NoLanes;
}
function includesNonIdleWork(lanes) {
return (lanes & NonIdleLanes) !== NoLanes;
}
function includesOnlyRetries(lanes) {
return (lanes & RetryLanes) === lanes;
}
function includesOnlyNonUrgentLanes(lanes) {
var UrgentLanes = SyncLane | InputContinuousLane | DefaultLane;
return (lanes & UrgentLanes) === NoLanes;
}
function includesOnlyTransitions(lanes) {
return (lanes & TransitionLanes) === lanes;
}
function includesBlockingLane(root2, lanes) {
var SyncDefaultLanes = InputContinuousHydrationLane | InputContinuousLane | DefaultHydrationLane | DefaultLane;
return (lanes & SyncDefaultLanes) !== NoLanes;
}
function includesExpiredLane(root2, lanes) {
return (lanes & root2.expiredLanes) !== NoLanes;
}
function isTransitionLane(lane) {
return (lane & TransitionLanes) !== NoLanes;
}
function claimNextTransitionLane() {
var lane = nextTransitionLane;
nextTransitionLane <<= 1;
if ((nextTransitionLane & TransitionLanes) === NoLanes) {
nextTransitionLane = TransitionLane1;
}
return lane;
}
function claimNextRetryLane() {
var lane = nextRetryLane;
nextRetryLane <<= 1;
if ((nextRetryLane & RetryLanes) === NoLanes) {
nextRetryLane = RetryLane1;
}
return lane;
}
function getHighestPriorityLane(lanes) {
return lanes & -lanes;
}
function pickArbitraryLane(lanes) {
return getHighestPriorityLane(lanes);
}
function pickArbitraryLaneIndex(lanes) {
return 31 - clz32(lanes);
}
function laneToIndex(lane) {
return pickArbitraryLaneIndex(lane);
}
function includesSomeLane(a, b) {
return (a & b) !== NoLanes;
}
function isSubsetOfLanes(set2, subset) {
return (set2 & subset) === subset;
}
function mergeLanes(a, b) {
return a | b;
}
function removeLanes(set2, subset) {
return set2 & ~subset;
}
function intersectLanes(a, b) {
return a & b;
}
function laneToLanes(lane) {
return lane;
}
function higherPriorityLane(a, b) {
return a !== NoLane && a < b ? a : b;
}
function createLaneMap(initial) {
var laneMap = [];
for (var i = 0; i < TotalLanes; i++) {
laneMap.push(initial);
}
return laneMap;
}
function markRootUpdated(root2, updateLane, eventTime) {
root2.pendingLanes |= updateLane;
if (updateLane !== IdleLane) {
root2.suspendedLanes = NoLanes;
root2.pingedLanes = NoLanes;
}
var eventTimes = root2.eventTimes;
var index3 = laneToIndex(updateLane);
eventTimes[index3] = eventTime;
}
function markRootSuspended(root2, suspendedLanes) {
root2.suspendedLanes |= suspendedLanes;
root2.pingedLanes &= ~suspendedLanes;
var expirationTimes = root2.expirationTimes;
var lanes = suspendedLanes;
while (lanes > 0) {
var index3 = pickArbitraryLaneIndex(lanes);
var lane = 1 << index3;
expirationTimes[index3] = NoTimestamp;
lanes &= ~lane;
}
}
function markRootPinged(root2, pingedLanes, eventTime) {
root2.pingedLanes |= root2.suspendedLanes & pingedLanes;
}
function markRootFinished(root2, remainingLanes) {
var noLongerPendingLanes = root2.pendingLanes & ~remainingLanes;
root2.pendingLanes = remainingLanes;
root2.suspendedLanes = NoLanes;
root2.pingedLanes = NoLanes;
root2.expiredLanes &= remainingLanes;
root2.mutableReadLanes &= remainingLanes;
root2.entangledLanes &= remainingLanes;
var entanglements = root2.entanglements;
var eventTimes = root2.eventTimes;
var expirationTimes = root2.expirationTimes;
var lanes = noLongerPendingLanes;
while (lanes > 0) {
var index3 = pickArbitraryLaneIndex(lanes);
var lane = 1 << index3;
entanglements[index3] = NoLanes;
eventTimes[index3] = NoTimestamp;
expirationTimes[index3] = NoTimestamp;
lanes &= ~lane;
}
}
function markRootEntangled(root2, entangledLanes) {
var rootEntangledLanes = root2.entangledLanes |= entangledLanes;
var entanglements = root2.entanglements;
var lanes = rootEntangledLanes;
while (lanes) {
var index3 = pickArbitraryLaneIndex(lanes);
var lane = 1 << index3;
if (lane & entangledLanes | entanglements[index3] & entangledLanes) {
entanglements[index3] |= entangledLanes;
}
lanes &= ~lane;
}
}
function getBumpedLaneForHydration(root2, renderLanes2) {
var renderLane = getHighestPriorityLane(renderLanes2);
var lane;
switch (renderLane) {
case InputContinuousLane:
lane = InputContinuousHydrationLane;
break;
case DefaultLane:
lane = DefaultHydrationLane;
break;
case TransitionLane1:
case TransitionLane2:
case TransitionLane3:
case TransitionLane4:
case TransitionLane5:
case TransitionLane6:
case TransitionLane7:
case TransitionLane8:
case TransitionLane9:
case TransitionLane10:
case TransitionLane11:
case TransitionLane12:
case TransitionLane13:
case TransitionLane14:
case TransitionLane15:
case TransitionLane16:
case RetryLane1:
case RetryLane2:
case RetryLane3:
case RetryLane4:
case RetryLane5:
lane = TransitionHydrationLane;
break;
case IdleLane:
lane = IdleHydrationLane;
break;
default:
lane = NoLane;
break;
}
if ((lane & (root2.suspendedLanes | renderLanes2)) !== NoLane) {
return NoLane;
}
return lane;
}
function addFiberToLanesMap(root2, fiber, lanes) {
if (!isDevToolsPresent) {
return;
}
var pendingUpdatersLaneMap = root2.pendingUpdatersLaneMap;
while (lanes > 0) {
var index3 = laneToIndex(lanes);
var lane = 1 << index3;
var updaters = pendingUpdatersLaneMap[index3];
updaters.add(fiber);
lanes &= ~lane;
}
}
function movePendingFibersToMemoized(root2, lanes) {
if (!isDevToolsPresent) {
return;
}
var pendingUpdatersLaneMap = root2.pendingUpdatersLaneMap;
var memoizedUpdaters = root2.memoizedUpdaters;
while (lanes > 0) {
var index3 = laneToIndex(lanes);
var lane = 1 << index3;
var updaters = pendingUpdatersLaneMap[index3];
if (updaters.size > 0) {
updaters.forEach(function(fiber) {
var alternate = fiber.alternate;
if (alternate === null || !memoizedUpdaters.has(alternate)) {
memoizedUpdaters.add(fiber);
}
});
updaters.clear();
}
lanes &= ~lane;
}
}
function getTransitionsForLanes(root2, lanes) {
{
return null;
}
}
var DiscreteEventPriority = SyncLane;
var ContinuousEventPriority = InputContinuousLane;
var DefaultEventPriority = DefaultLane;
var IdleEventPriority = IdleLane;
var currentUpdatePriority = NoLane;
function getCurrentUpdatePriority() {
return currentUpdatePriority;
}
function setCurrentUpdatePriority(newPriority) {
currentUpdatePriority = newPriority;
}
function runWithPriority(priority, fn) {
var previousPriority = currentUpdatePriority;
try {
currentUpdatePriority = priority;
return fn();
} finally {
currentUpdatePriority = previousPriority;
}
}
function higherEventPriority(a, b) {
return a !== 0 && a < b ? a : b;
}
function lowerEventPriority(a, b) {
return a === 0 || a > b ? a : b;
}
function isHigherEventPriority(a, b) {
return a !== 0 && a < b;
}
function lanesToEventPriority(lanes) {
var lane = getHighestPriorityLane(lanes);
if (!isHigherEventPriority(DiscreteEventPriority, lane)) {
return DiscreteEventPriority;
}
if (!isHigherEventPriority(ContinuousEventPriority, lane)) {
return ContinuousEventPriority;
}
if (includesNonIdleWork(lane)) {
return DefaultEventPriority;
}
return IdleEventPriority;
}
function isRootDehydrated(root2) {
var currentState = root2.current.memoizedState;
return currentState.isDehydrated;
}
var _attemptSynchronousHydration;
function setAttemptSynchronousHydration(fn) {
_attemptSynchronousHydration = fn;
}
function attemptSynchronousHydration(fiber) {
_attemptSynchronousHydration(fiber);
}
var attemptContinuousHydration;
function setAttemptContinuousHydration(fn) {
attemptContinuousHydration = fn;
}
var attemptHydrationAtCurrentPriority;
function setAttemptHydrationAtCurrentPriority(fn) {
attemptHydrationAtCurrentPriority = fn;
}
var getCurrentUpdatePriority$1;
function setGetCurrentUpdatePriority(fn) {
getCurrentUpdatePriority$1 = fn;
}
var attemptHydrationAtPriority;
function setAttemptHydrationAtPriority(fn) {
attemptHydrationAtPriority = fn;
}
var hasScheduledReplayAttempt = false;
var queuedDiscreteEvents = [];
var queuedFocus = null;
var queuedDrag = null;
var queuedMouse = null;
var queuedPointers = new Map();
var queuedPointerCaptures = new Map();
var queuedExplicitHydrationTargets = [];
var discreteReplayableEvents = [
"mousedown",
"mouseup",
"touchcancel",
"touchend",
"touchstart",
"auxclick",
"dblclick",
"pointercancel",
"pointerdown",
"pointerup",
"dragend",
"dragstart",
"drop",
"compositionend",
"compositionstart",
"keydown",
"keypress",
"keyup",
"input",
"textInput",
"copy",
"cut",
"paste",
"click",
"change",
"contextmenu",
"reset",
"submit"
];
function isDiscreteEventThatRequiresHydration(eventType) {
return discreteReplayableEvents.indexOf(eventType) > -1;
}
function createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
return {
blockedOn,
domEventName,
eventSystemFlags,
nativeEvent,
targetContainers: [targetContainer]
};
}
function clearIfContinuousEvent(domEventName, nativeEvent) {
switch (domEventName) {
case "focusin":
case "focusout":
queuedFocus = null;
break;
case "dragenter":
case "dragleave":
queuedDrag = null;
break;
case "mouseover":
case "mouseout":
queuedMouse = null;
break;
case "pointerover":
case "pointerout": {
var pointerId = nativeEvent.pointerId;
queuedPointers.delete(pointerId);
break;
}
case "gotpointercapture":
case "lostpointercapture": {
var _pointerId = nativeEvent.pointerId;
queuedPointerCaptures.delete(_pointerId);
break;
}
}
}
function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {
var queuedEvent = createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent);
if (blockedOn !== null) {
var _fiber2 = getInstanceFromNode(blockedOn);
if (_fiber2 !== null) {
attemptContinuousHydration(_fiber2);
}
}
return queuedEvent;
}
existingQueuedEvent.eventSystemFlags |= eventSystemFlags;
var targetContainers = existingQueuedEvent.targetContainers;
if (targetContainer !== null && targetContainers.indexOf(targetContainer) === -1) {
targetContainers.push(targetContainer);
}
return existingQueuedEvent;
}
function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
switch (domEventName) {
case "focusin": {
var focusEvent = nativeEvent;
queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, focusEvent);
return true;
}
case "dragenter": {
var dragEvent = nativeEvent;
queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, dragEvent);
return true;
}
case "mouseover": {
var mouseEvent = nativeEvent;
queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, mouseEvent);
return true;
}
case "pointerover": {
var pointerEvent = nativeEvent;
var pointerId = pointerEvent.pointerId;
queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, pointerEvent));
return true;
}
case "gotpointercapture": {
var _pointerEvent = nativeEvent;
var _pointerId2 = _pointerEvent.pointerId;
queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, _pointerEvent));
return true;
}
}
return false;
}
function attemptExplicitHydrationTarget(queuedTarget) {
var targetInst = getClosestInstanceFromNode(queuedTarget.target);
if (targetInst !== null) {
var nearestMounted = getNearestMountedFiber(targetInst);
if (nearestMounted !== null) {
var tag = nearestMounted.tag;
if (tag === SuspenseComponent) {
var instance = getSuspenseInstanceFromFiber(nearestMounted);
if (instance !== null) {
queuedTarget.blockedOn = instance;
attemptHydrationAtPriority(queuedTarget.priority, function() {
attemptHydrationAtCurrentPriority(nearestMounted);
});
return;
}
} else if (tag === HostRoot) {
var root2 = nearestMounted.stateNode;
if (isRootDehydrated(root2)) {
queuedTarget.blockedOn = getContainerFromFiber(nearestMounted);
return;
}
}
}
}
queuedTarget.blockedOn = null;
}
function queueExplicitHydrationTarget(target) {
var updatePriority = getCurrentUpdatePriority$1();
var queuedTarget = {
blockedOn: null,
target,
priority: updatePriority
};
var i = 0;
for (; i < queuedExplicitHydrationTargets.length; i++) {
if (!isHigherEventPriority(updatePriority, queuedExplicitHydrationTargets[i].priority)) {
break;
}
}
queuedExplicitHydrationTargets.splice(i, 0, queuedTarget);
if (i === 0) {
attemptExplicitHydrationTarget(queuedTarget);
}
}
function attemptReplayContinuousQueuedEvent(queuedEvent) {
if (queuedEvent.blockedOn !== null) {
return false;
}
var targetContainers = queuedEvent.targetContainers;
while (targetContainers.length > 0) {
var targetContainer = targetContainers[0];
var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.domEventName, queuedEvent.eventSystemFlags, targetContainer, queuedEvent.nativeEvent);
if (nextBlockedOn === null) {
{
var nativeEvent = queuedEvent.nativeEvent;
var nativeEventClone = new nativeEvent.constructor(nativeEvent.type, nativeEvent);
setReplayingEvent(nativeEventClone);
nativeEvent.target.dispatchEvent(nativeEventClone);
resetReplayingEvent();
}
} else {
var _fiber3 = getInstanceFromNode(nextBlockedOn);
if (_fiber3 !== null) {
attemptContinuousHydration(_fiber3);
}
queuedEvent.blockedOn = nextBlockedOn;
return false;
}
targetContainers.shift();
}
return true;
}
function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {
if (attemptReplayContinuousQueuedEvent(queuedEvent)) {
map.delete(key);
}
}
function replayUnblockedEvents() {
hasScheduledReplayAttempt = false;
if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {
queuedFocus = null;
}
if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {
queuedDrag = null;
}
if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {
queuedMouse = null;
}
queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);
queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);
}
function scheduleCallbackIfUnblocked(queuedEvent, unblocked) {
if (queuedEvent.blockedOn === unblocked) {
queuedEvent.blockedOn = null;
if (!hasScheduledReplayAttempt) {
hasScheduledReplayAttempt = true;
Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, replayUnblockedEvents);
}
}
}
function retryIfBlockedOn(unblocked) {
if (queuedDiscreteEvents.length > 0) {
scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked);
for (var i = 1; i < queuedDiscreteEvents.length; i++) {
var queuedEvent = queuedDiscreteEvents[i];
if (queuedEvent.blockedOn === unblocked) {
queuedEvent.blockedOn = null;
}
}
}
if (queuedFocus !== null) {
scheduleCallbackIfUnblocked(queuedFocus, unblocked);
}
if (queuedDrag !== null) {
scheduleCallbackIfUnblocked(queuedDrag, unblocked);
}
if (queuedMouse !== null) {
scheduleCallbackIfUnblocked(queuedMouse, unblocked);
}
var unblock = function(queuedEvent2) {
return scheduleCallbackIfUnblocked(queuedEvent2, unblocked);
};
queuedPointers.forEach(unblock);
queuedPointerCaptures.forEach(unblock);
for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {
var queuedTarget = queuedExplicitHydrationTargets[_i];
if (queuedTarget.blockedOn === unblocked) {
queuedTarget.blockedOn = null;
}
}
while (queuedExplicitHydrationTargets.length > 0) {
var nextExplicitTarget = queuedExplicitHydrationTargets[0];
if (nextExplicitTarget.blockedOn !== null) {
break;
} else {
attemptExplicitHydrationTarget(nextExplicitTarget);
if (nextExplicitTarget.blockedOn === null) {
queuedExplicitHydrationTargets.shift();
}
}
}
}
var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig;
var _enabled = true;
function setEnabled(enabled) {
_enabled = !!enabled;
}
function isEnabled() {
return _enabled;
}
function createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags) {
var eventPriority = getEventPriority(domEventName);
var listenerWrapper;
switch (eventPriority) {
case DiscreteEventPriority:
listenerWrapper = dispatchDiscreteEvent;
break;
case ContinuousEventPriority:
listenerWrapper = dispatchContinuousEvent;
break;
case DefaultEventPriority:
default:
listenerWrapper = dispatchEvent;
break;
}
return listenerWrapper.bind(null, domEventName, eventSystemFlags, targetContainer);
}
function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) {
var previousPriority = getCurrentUpdatePriority();
var prevTransition = ReactCurrentBatchConfig.transition;
ReactCurrentBatchConfig.transition = null;
try {
setCurrentUpdatePriority(DiscreteEventPriority);
dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
} finally {
setCurrentUpdatePriority(previousPriority);
ReactCurrentBatchConfig.transition = prevTransition;
}
}
function dispatchContinuousEvent(domEventName, eventSystemFlags, container, nativeEvent) {
var previousPriority = getCurrentUpdatePriority();
var prevTransition = ReactCurrentBatchConfig.transition;
ReactCurrentBatchConfig.transition = null;
try {
setCurrentUpdatePriority(ContinuousEventPriority);
dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
} finally {
setCurrentUpdatePriority(previousPriority);
ReactCurrentBatchConfig.transition = prevTransition;
}
}
function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
if (!_enabled) {
return;
}
{
dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay(domEventName, eventSystemFlags, targetContainer, nativeEvent);
}
}
function dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
var blockedOn = findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent);
if (blockedOn === null) {
dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
clearIfContinuousEvent(domEventName, nativeEvent);
return;
}
if (queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)) {
nativeEvent.stopPropagation();
return;
}
clearIfContinuousEvent(domEventName, nativeEvent);
if (eventSystemFlags & IS_CAPTURE_PHASE && isDiscreteEventThatRequiresHydration(domEventName)) {
while (blockedOn !== null) {
var fiber = getInstanceFromNode(blockedOn);
if (fiber !== null) {
attemptSynchronousHydration(fiber);
}
var nextBlockedOn = findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent);
if (nextBlockedOn === null) {
dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
}
if (nextBlockedOn === blockedOn) {
break;
}
blockedOn = nextBlockedOn;
}
if (blockedOn !== null) {
nativeEvent.stopPropagation();
}
return;
}
dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, null, targetContainer);
}
var return_targetInst = null;
function findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
return_targetInst = null;
var nativeEventTarget = getEventTarget(nativeEvent);
var targetInst = getClosestInstanceFromNode(nativeEventTarget);
if (targetInst !== null) {
var nearestMounted = getNearestMountedFiber(targetInst);
if (nearestMounted === null) {
targetInst = null;
} else {
var tag = nearestMounted.tag;
if (tag === SuspenseComponent) {
var instance = getSuspenseInstanceFromFiber(nearestMounted);
if (instance !== null) {
return instance;
}
targetInst = null;
} else if (tag === HostRoot) {
var root2 = nearestMounted.stateNode;
if (isRootDehydrated(root2)) {
return getContainerFromFiber(nearestMounted);
}
targetInst = null;
} else if (nearestMounted !== targetInst) {
targetInst = null;
}
}
}
return_targetInst = targetInst;
return null;
}
function getEventPriority(domEventName) {
switch (domEventName) {
case "cancel":
case "click":
case "close":
case "contextmenu":
case "copy":
case "cut":
case "auxclick":
case "dblclick":
case "dragend":
case "dragstart":
case "drop":
case "focusin":
case "focusout":
case "input":
case "invalid":
case "keydown":
case "keypress":
case "keyup":
case "mousedown":
case "mouseup":
case "paste":
case "pause":
case "play":
case "pointercancel":
case "pointerdown":
case "pointerup":
case "ratechange":
case "reset":
case "resize":
case "seeked":
case "submit":
case "touchcancel":
case "touchend":
case "touchstart":
case "volumechange":
case "change":
case "selectionchange":
case "textInput":
case "compositionstart":
case "compositionend":
case "compositionupdate":
case "beforeblur":
case "afterblur":
case "beforeinput":
case "blur":
case "fullscreenchange":
case "focus":
case "hashchange":
case "popstate":
case "select":
case "selectstart":
return DiscreteEventPriority;
case "drag":
case "dragenter":
case "dragexit":
case "dragleave":
case "dragover":
case "mousemove":
case "mouseout":
case "mouseover":
case "pointermove":
case "pointerout":
case "pointerover":
case "scroll":
case "toggle":
case "touchmove":
case "wheel":
case "mouseenter":
case "mouseleave":
case "pointerenter":
case "pointerleave":
return ContinuousEventPriority;
case "message": {
var schedulerPriority = getCurrentPriorityLevel();
switch (schedulerPriority) {
case ImmediatePriority:
return DiscreteEventPriority;
case UserBlockingPriority:
return ContinuousEventPriority;
case NormalPriority:
case LowPriority:
return DefaultEventPriority;
case IdlePriority:
return IdleEventPriority;
default:
return DefaultEventPriority;
}
}
default:
return DefaultEventPriority;
}
}
function addEventBubbleListener(target, eventType, listener) {
target.addEventListener(eventType, listener, false);
return listener;
}
function addEventCaptureListener(target, eventType, listener) {
target.addEventListener(eventType, listener, true);
return listener;
}
function addEventCaptureListenerWithPassiveFlag(target, eventType, listener, passive) {
target.addEventListener(eventType, listener, {
capture: true,
passive
});
return listener;
}
function addEventBubbleListenerWithPassiveFlag(target, eventType, listener, passive) {
target.addEventListener(eventType, listener, {
passive
});
return listener;
}
var root = null;
var startText = null;
var fallbackText = null;
function initialize(nativeEventTarget) {
root = nativeEventTarget;
startText = getText();
return true;
}
function reset() {
root = null;
startText = null;
fallbackText = null;
}
function getData() {
if (fallbackText) {
return fallbackText;
}
var start;
var startValue = startText;
var startLength = startValue.length;
var end;
var endValue = getText();
var endLength = endValue.length;
for (start = 0; start < startLength; start++) {
if (startValue[start] !== endValue[start]) {
break;
}
}
var minEnd = startLength - start;
for (end = 1; end <= minEnd; end++) {
if (startValue[startLength - end] !== endValue[endLength - end]) {
break;
}
}
var sliceTail = end > 1 ? 1 - end : void 0;
fallbackText = endValue.slice(start, sliceTail);
return fallbackText;
}
function getText() {
if ("value" in root) {
return root.value;
}
return root.textContent;
}
function getEventCharCode(nativeEvent) {
var charCode;
var keyCode = nativeEvent.keyCode;
if ("charCode" in nativeEvent) {
charCode = nativeEvent.charCode;
if (charCode === 0 && keyCode === 13) {
charCode = 13;
}
} else {
charCode = keyCode;
}
if (charCode === 10) {
charCode = 13;
}
if (charCode >= 32 || charCode === 13) {
return charCode;
}
return 0;
}
function functionThatReturnsTrue() {
return true;
}
function functionThatReturnsFalse() {
return false;
}
function createSyntheticEvent(Interface) {
function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) {
this._reactName = reactName;
this._targetInst = targetInst;
this.type = reactEventType;
this.nativeEvent = nativeEvent;
this.target = nativeEventTarget;
this.currentTarget = null;
for (var _propName in Interface) {
if (!Interface.hasOwnProperty(_propName)) {
continue;
}
var normalize = Interface[_propName];
if (normalize) {
this[_propName] = normalize(nativeEvent);
} else {
this[_propName] = nativeEvent[_propName];
}
}
var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
if (defaultPrevented) {
this.isDefaultPrevented = functionThatReturnsTrue;
} else {
this.isDefaultPrevented = functionThatReturnsFalse;
}
this.isPropagationStopped = functionThatReturnsFalse;
return this;
}
assign2(SyntheticBaseEvent.prototype, {
preventDefault: function() {
this.defaultPrevented = true;
var event = this.nativeEvent;
if (!event) {
return;
}
if (event.preventDefault) {
event.preventDefault();
} else if (typeof event.returnValue !== "unknown") {
event.returnValue = false;
}
this.isDefaultPrevented = functionThatReturnsTrue;
},
stopPropagation: function() {
var event = this.nativeEvent;
if (!event) {
return;
}
if (event.stopPropagation) {
event.stopPropagation();
} else if (typeof event.cancelBubble !== "unknown") {
event.cancelBubble = true;
}
this.isPropagationStopped = functionThatReturnsTrue;
},
persist: function() {
},
isPersistent: functionThatReturnsTrue
});
return SyntheticBaseEvent;
}
var EventInterface = {
eventPhase: 0,
bubbles: 0,
cancelable: 0,
timeStamp: function(event) {
return event.timeStamp || Date.now();
},
defaultPrevented: 0,
isTrusted: 0
};
var SyntheticEvent = createSyntheticEvent(EventInterface);
var UIEventInterface = assign2({}, EventInterface, {
view: 0,
detail: 0
});
var SyntheticUIEvent = createSyntheticEvent(UIEventInterface);
var lastMovementX;
var lastMovementY;
var lastMouseEvent;
function updateMouseMovementPolyfillState(event) {
if (event !== lastMouseEvent) {
if (lastMouseEvent && event.type === "mousemove") {
lastMovementX = event.screenX - lastMouseEvent.screenX;
lastMovementY = event.screenY - lastMouseEvent.screenY;
} else {
lastMovementX = 0;
lastMovementY = 0;
}
lastMouseEvent = event;
}
}
var MouseEventInterface = assign2({}, UIEventInterface, {
screenX: 0,
screenY: 0,
clientX: 0,
clientY: 0,
pageX: 0,
pageY: 0,
ctrlKey: 0,
shiftKey: 0,
altKey: 0,
metaKey: 0,
getModifierState: getEventModifierState,
button: 0,
buttons: 0,
relatedTarget: function(event) {
if (event.relatedTarget === void 0)
return event.fromElement === event.srcElement ? event.toElement : event.fromElement;
return event.relatedTarget;
},
movementX: function(event) {
if ("movementX" in event) {
return event.movementX;
}
updateMouseMovementPolyfillState(event);
return lastMovementX;
},
movementY: function(event) {
if ("movementY" in event) {
return event.movementY;
}
return lastMovementY;
}
});
var SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface);
var DragEventInterface = assign2({}, MouseEventInterface, {
dataTransfer: 0
});
var SyntheticDragEvent = createSyntheticEvent(DragEventInterface);
var FocusEventInterface = assign2({}, UIEventInterface, {
relatedTarget: 0
});
var SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface);
var AnimationEventInterface = assign2({}, EventInterface, {
animationName: 0,
elapsedTime: 0,
pseudoElement: 0
});
var SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface);
var ClipboardEventInterface = assign2({}, EventInterface, {
clipboardData: function(event) {
return "clipboardData" in event ? event.clipboardData : window.clipboardData;
}
});
var SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface);
var CompositionEventInterface = assign2({}, EventInterface, {
data: 0
});
var SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface);
var SyntheticInputEvent = SyntheticCompositionEvent;
var normalizeKey = {
Esc: "Escape",
Spacebar: " ",
Left: "ArrowLeft",
Up: "ArrowUp",
Right: "ArrowRight",
Down: "ArrowDown",
Del: "Delete",
Win: "OS",
Menu: "ContextMenu",
Apps: "ContextMenu",
Scroll: "ScrollLock",
MozPrintableKey: "Unidentified"
};
var translateToKey = {
"8": "Backspace",
"9": "Tab",
"12": "Clear",
"13": "Enter",
"16": "Shift",
"17": "Control",
"18": "Alt",
"19": "Pause",
"20": "CapsLock",
"27": "Escape",
"32": " ",
"33": "PageUp",
"34": "PageDown",
"35": "End",
"36": "Home",
"37": "ArrowLeft",
"38": "ArrowUp",
"39": "ArrowRight",
"40": "ArrowDown",
"45": "Insert",
"46": "Delete",
"112": "F1",
"113": "F2",
"114": "F3",
"115": "F4",
"116": "F5",
"117": "F6",
"118": "F7",
"119": "F8",
"120": "F9",
"121": "F10",
"122": "F11",
"123": "F12",
"144": "NumLock",
"145": "ScrollLock",
"224": "Meta"
};
function getEventKey(nativeEvent) {
if (nativeEvent.key) {
var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
if (key !== "Unidentified") {
return key;
}
}
if (nativeEvent.type === "keypress") {
var charCode = getEventCharCode(nativeEvent);
return charCode === 13 ? "Enter" : String.fromCharCode(charCode);
}
if (nativeEvent.type === "keydown" || nativeEvent.type === "keyup") {
return translateToKey[nativeEvent.keyCode] || "Unidentified";
}
return "";
}
var modifierKeyToProp = {
Alt: "altKey",
Control: "ctrlKey",
Meta: "metaKey",
Shift: "shiftKey"
};
function modifierStateGetter(keyArg) {
var syntheticEvent = this;
var nativeEvent = syntheticEvent.nativeEvent;
if (nativeEvent.getModifierState) {
return nativeEvent.getModifierState(keyArg);
}
var keyProp = modifierKeyToProp[keyArg];
return keyProp ? !!nativeEvent[keyProp] : false;
}
function getEventModifierState(nativeEvent) {
return modifierStateGetter;
}
var KeyboardEventInterface = assign2({}, UIEventInterface, {
key: getEventKey,
code: 0,
location: 0,
ctrlKey: 0,
shiftKey: 0,
altKey: 0,
metaKey: 0,
repeat: 0,
locale: 0,
getModifierState: getEventModifierState,
charCode: function(event) {
if (event.type === "keypress") {
return getEventCharCode(event);
}
return 0;
},
keyCode: function(event) {
if (event.type === "keydown" || event.type === "keyup") {
return event.keyCode;
}
return 0;
},
which: function(event) {
if (event.type === "keypress") {
return getEventCharCode(event);
}
if (event.type === "keydown" || event.type === "keyup") {
return event.keyCode;
}
return 0;
}
});
var SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface);
var PointerEventInterface = assign2({}, MouseEventInterface, {
pointerId: 0,
width: 0,
height: 0,
pressure: 0,
tangentialPressure: 0,
tiltX: 0,
tiltY: 0,
twist: 0,
pointerType: 0,
isPrimary: 0
});
var SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface);
var TouchEventInterface = assign2({}, UIEventInterface, {
touches: 0,
targetTouches: 0,
changedTouches: 0,
altKey: 0,
metaKey: 0,
ctrlKey: 0,
shiftKey: 0,
getModifierState: getEventModifierState
});
var SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface);
var TransitionEventInterface = assign2({}, EventInterface, {
propertyName: 0,
elapsedTime: 0,
pseudoElement: 0
});
var SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface);
var WheelEventInterface = assign2({}, MouseEventInterface, {
deltaX: function(event) {
return "deltaX" in event ? event.deltaX : "wheelDeltaX" in event ? -event.wheelDeltaX : 0;
},
deltaY: function(event) {
return "deltaY" in event ? event.deltaY : "wheelDeltaY" in event ? -event.wheelDeltaY : "wheelDelta" in event ? -event.wheelDelta : 0;
},
deltaZ: 0,
deltaMode: 0
});
var SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface);
var END_KEYCODES = [9, 13, 27, 32];
var START_KEYCODE = 229;
var canUseCompositionEvent = canUseDOM && "CompositionEvent" in window;
var documentMode = null;
if (canUseDOM && "documentMode" in document) {
documentMode = document.documentMode;
}
var canUseTextInputEvent = canUseDOM && "TextEvent" in window && !documentMode;
var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
var SPACEBAR_CODE = 32;
var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
function registerEvents() {
registerTwoPhaseEvent("onBeforeInput", ["compositionend", "keypress", "textInput", "paste"]);
registerTwoPhaseEvent("onCompositionEnd", ["compositionend", "focusout", "keydown", "keypress", "keyup", "mousedown"]);
registerTwoPhaseEvent("onCompositionStart", ["compositionstart", "focusout", "keydown", "keypress", "keyup", "mousedown"]);
registerTwoPhaseEvent("onCompositionUpdate", ["compositionupdate", "focusout", "keydown", "keypress", "keyup", "mousedown"]);
}
var hasSpaceKeypress = false;
function isKeypressCommand(nativeEvent) {
return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && !(nativeEvent.ctrlKey && nativeEvent.altKey);
}
function getCompositionEventType(domEventName) {
switch (domEventName) {
case "compositionstart":
return "onCompositionStart";
case "compositionend":
return "onCompositionEnd";
case "compositionupdate":
return "onCompositionUpdate";
}
}
function isFallbackCompositionStart(domEventName, nativeEvent) {
return domEventName === "keydown" && nativeEvent.keyCode === START_KEYCODE;
}
function isFallbackCompositionEnd(domEventName, nativeEvent) {
switch (domEventName) {
case "keyup":
return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
case "keydown":
return nativeEvent.keyCode !== START_KEYCODE;
case "keypress":
case "mousedown":
case "focusout":
return true;
default:
return false;
}
}
function getDataFromCustomEvent(nativeEvent) {
var detail = nativeEvent.detail;
if (typeof detail === "object" && "data" in detail) {
return detail.data;
}
return null;
}
function isUsingKoreanIME(nativeEvent) {
return nativeEvent.locale === "ko";
}
var isComposing = false;
function extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) {
var eventType;
var fallbackData;
if (canUseCompositionEvent) {
eventType = getCompositionEventType(domEventName);
} else if (!isComposing) {
if (isFallbackCompositionStart(domEventName, nativeEvent)) {
eventType = "onCompositionStart";
}
} else if (isFallbackCompositionEnd(domEventName, nativeEvent)) {
eventType = "onCompositionEnd";
}
if (!eventType) {
return null;
}
if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {
if (!isComposing && eventType === "onCompositionStart") {
isComposing = initialize(nativeEventTarget);
} else if (eventType === "onCompositionEnd") {
if (isComposing) {
fallbackData = getData();
}
}
}
var listeners = accumulateTwoPhaseListeners(targetInst, eventType);
if (listeners.length > 0) {
var event = new SyntheticCompositionEvent(eventType, domEventName, null, nativeEvent, nativeEventTarget);
dispatchQueue.push({
event,
listeners
});
if (fallbackData) {
event.data = fallbackData;
} else {
var customData = getDataFromCustomEvent(nativeEvent);
if (customData !== null) {
event.data = customData;
}
}
}
}
function getNativeBeforeInputChars(domEventName, nativeEvent) {
switch (domEventName) {
case "compositionend":
return getDataFromCustomEvent(nativeEvent);
case "keypress":
var which = nativeEvent.which;
if (which !== SPACEBAR_CODE) {
return null;
}
hasSpaceKeypress = true;
return SPACEBAR_CHAR;
case "textInput":
var chars = nativeEvent.data;
if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
return null;
}
return chars;
default:
return null;
}
}
function getFallbackBeforeInputChars(domEventName, nativeEvent) {
if (isComposing) {
if (domEventName === "compositionend" || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent)) {
var chars = getData();
reset();
isComposing = false;
return chars;
}
return null;
}
switch (domEventName) {
case "paste":
return null;
case "keypress":
if (!isKeypressCommand(nativeEvent)) {
if (nativeEvent.char && nativeEvent.char.length > 1) {
return nativeEvent.char;
} else if (nativeEvent.which) {
return String.fromCharCode(nativeEvent.which);
}
}
return null;
case "compositionend":
return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;
default:
return null;
}
}
function extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) {
var chars;
if (canUseTextInputEvent) {
chars = getNativeBeforeInputChars(domEventName, nativeEvent);
} else {
chars = getFallbackBeforeInputChars(domEventName, nativeEvent);
}
if (!chars) {
return null;
}
var listeners = accumulateTwoPhaseListeners(targetInst, "onBeforeInput");
if (listeners.length > 0) {
var event = new SyntheticInputEvent("onBeforeInput", "beforeinput", null, nativeEvent, nativeEventTarget);
dispatchQueue.push({
event,
listeners
});
event.data = chars;
}
}
function extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
}
var supportedInputTypes = {
color: true,
date: true,
datetime: true,
"datetime-local": true,
email: true,
month: true,
number: true,
password: true,
range: true,
search: true,
tel: true,
text: true,
time: true,
url: true,
week: true
};
function isTextInputElement(elem) {
var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
if (nodeName === "input") {
return !!supportedInputTypes[elem.type];
}
if (nodeName === "textarea") {
return true;
}
return false;
}
function isEventSupported(eventNameSuffix) {
if (!canUseDOM) {
return false;
}
var eventName = "on" + eventNameSuffix;
var isSupported = eventName in document;
if (!isSupported) {
var element = document.createElement("div");
element.setAttribute(eventName, "return;");
isSupported = typeof element[eventName] === "function";
}
return isSupported;
}
function registerEvents$1() {
registerTwoPhaseEvent("onChange", ["change", "click", "focusin", "focusout", "input", "keydown", "keyup", "selectionchange"]);
}
function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) {
enqueueStateRestore(target);
var listeners = accumulateTwoPhaseListeners(inst, "onChange");
if (listeners.length > 0) {
var event = new SyntheticEvent("onChange", "change", null, nativeEvent, target);
dispatchQueue.push({
event,
listeners
});
}
}
var activeElement = null;
var activeElementInst = null;
function shouldUseChangeEvent(elem) {
var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
return nodeName === "select" || nodeName === "input" && elem.type === "file";
}
function manualDispatchChangeEvent(nativeEvent) {
var dispatchQueue = [];
createAndAccumulateChangeEvent(dispatchQueue, activeElementInst, nativeEvent, getEventTarget(nativeEvent));
batchedUpdates(runEventInBatch, dispatchQueue);
}
function runEventInBatch(dispatchQueue) {
processDispatchQueue(dispatchQueue, 0);
}
function getInstIfValueChanged(targetInst) {
var targetNode = getNodeFromInstance(targetInst);
if (updateValueIfChanged(targetNode)) {
return targetInst;
}
}
function getTargetInstForChangeEvent(domEventName, targetInst) {
if (domEventName === "change") {
return targetInst;
}
}
var isInputEventSupported = false;
if (canUseDOM) {
isInputEventSupported = isEventSupported("input") && (!document.documentMode || document.documentMode > 9);
}
function startWatchingForValueChange(target, targetInst) {
activeElement = target;
activeElementInst = targetInst;
activeElement.attachEvent("onpropertychange", handlePropertyChange);
}
function stopWatchingForValueChange() {
if (!activeElement) {
return;
}
activeElement.detachEvent("onpropertychange", handlePropertyChange);
activeElement = null;
activeElementInst = null;
}
function handlePropertyChange(nativeEvent) {
if (nativeEvent.propertyName !== "value") {
return;
}
if (getInstIfValueChanged(activeElementInst)) {
manualDispatchChangeEvent(nativeEvent);
}
}
function handleEventsForInputEventPolyfill(domEventName, target, targetInst) {
if (domEventName === "focusin") {
stopWatchingForValueChange();
startWatchingForValueChange(target, targetInst);
} else if (domEventName === "focusout") {
stopWatchingForValueChange();
}
}
function getTargetInstForInputEventPolyfill(domEventName, targetInst) {
if (domEventName === "selectionchange" || domEventName === "keyup" || domEventName === "keydown") {
return getInstIfValueChanged(activeElementInst);
}
}
function shouldUseClickEvent(elem) {
var nodeName = elem.nodeName;
return nodeName && nodeName.toLowerCase() === "input" && (elem.type === "checkbox" || elem.type === "radio");
}
function getTargetInstForClickEvent(domEventName, targetInst) {
if (domEventName === "click") {
return getInstIfValueChanged(targetInst);
}
}
function getTargetInstForInputOrChangeEvent(domEventName, targetInst) {
if (domEventName === "input" || domEventName === "change") {
return getInstIfValueChanged(targetInst);
}
}
function handleControlledInputBlur(node) {
var state = node._wrapperState;
if (!state || !state.controlled || node.type !== "number") {
return;
}
{
setDefaultValue(node, "number", node.value);
}
}
function extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
var targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
var getTargetInstFunc, handleEventFunc;
if (shouldUseChangeEvent(targetNode)) {
getTargetInstFunc = getTargetInstForChangeEvent;
} else if (isTextInputElement(targetNode)) {
if (isInputEventSupported) {
getTargetInstFunc = getTargetInstForInputOrChangeEvent;
} else {
getTargetInstFunc = getTargetInstForInputEventPolyfill;
handleEventFunc = handleEventsForInputEventPolyfill;
}
} else if (shouldUseClickEvent(targetNode)) {
getTargetInstFunc = getTargetInstForClickEvent;
}
if (getTargetInstFunc) {
var inst = getTargetInstFunc(domEventName, targetInst);
if (inst) {
createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, nativeEventTarget);
return;
}
}
if (handleEventFunc) {
handleEventFunc(domEventName, targetNode, targetInst);
}
if (domEventName === "focusout") {
handleControlledInputBlur(targetNode);
}
}
function registerEvents$2() {
registerDirectEvent("onMouseEnter", ["mouseout", "mouseover"]);
registerDirectEvent("onMouseLeave", ["mouseout", "mouseover"]);
registerDirectEvent("onPointerEnter", ["pointerout", "pointerover"]);
registerDirectEvent("onPointerLeave", ["pointerout", "pointerover"]);
}
function extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
var isOverEvent = domEventName === "mouseover" || domEventName === "pointerover";
var isOutEvent = domEventName === "mouseout" || domEventName === "pointerout";
if (isOverEvent && !isReplayingEvent(nativeEvent)) {
var related = nativeEvent.relatedTarget || nativeEvent.fromElement;
if (related) {
if (getClosestInstanceFromNode(related) || isContainerMarkedAsRoot(related)) {
return;
}
}
}
if (!isOutEvent && !isOverEvent) {
return;
}
var win;
if (nativeEventTarget.window === nativeEventTarget) {
win = nativeEventTarget;
} else {
var doc = nativeEventTarget.ownerDocument;
if (doc) {
win = doc.defaultView || doc.parentWindow;
} else {
win = window;
}
}
var from;
var to;
if (isOutEvent) {
var _related = nativeEvent.relatedTarget || nativeEvent.toElement;
from = targetInst;
to = _related ? getClosestInstanceFromNode(_related) : null;
if (to !== null) {
var nearestMounted = getNearestMountedFiber(to);
if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {
to = null;
}
}
} else {
from = null;
to = targetInst;
}
if (from === to) {
return;
}
var SyntheticEventCtor = SyntheticMouseEvent;
var leaveEventType = "onMouseLeave";
var enterEventType = "onMouseEnter";
var eventTypePrefix = "mouse";
if (domEventName === "pointerout" || domEventName === "pointerover") {
SyntheticEventCtor = SyntheticPointerEvent;
leaveEventType = "onPointerLeave";
enterEventType = "onPointerEnter";
eventTypePrefix = "pointer";
}
var fromNode = from == null ? win : getNodeFromInstance(from);
var toNode = to == null ? win : getNodeFromInstance(to);
var leave = new SyntheticEventCtor(leaveEventType, eventTypePrefix + "leave", from, nativeEvent, nativeEventTarget);
leave.target = fromNode;
leave.relatedTarget = toNode;
var enter = null;
var nativeTargetInst = getClosestInstanceFromNode(nativeEventTarget);
if (nativeTargetInst === targetInst) {
var enterEvent = new SyntheticEventCtor(enterEventType, eventTypePrefix + "enter", to, nativeEvent, nativeEventTarget);
enterEvent.target = toNode;
enterEvent.relatedTarget = fromNode;
enter = enterEvent;
}
accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leave, enter, from, to);
}
function is(x, y) {
return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y;
}
var objectIs = typeof Object.is === "function" ? Object.is : is;
function shallowEqual(objA, objB) {
if (objectIs(objA, objB)) {
return true;
}
if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
return false;
}
var keysA = Object.keys(objA);
var keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
for (var i = 0; i < keysA.length; i++) {
var currentKey = keysA[i];
if (!hasOwnProperty4.call(objB, currentKey) || !objectIs(objA[currentKey], objB[currentKey])) {
return false;
}
}
return true;
}
function getLeafNode(node) {
while (node && node.firstChild) {
node = node.firstChild;
}
return node;
}
function getSiblingNode(node) {
while (node) {
if (node.nextSibling) {
return node.nextSibling;
}
node = node.parentNode;
}
}
function getNodeForCharacterOffset(root2, offset) {
var node = getLeafNode(root2);
var nodeStart = 0;
var nodeEnd = 0;
while (node) {
if (node.nodeType === TEXT_NODE) {
nodeEnd = nodeStart + node.textContent.length;
if (nodeStart <= offset && nodeEnd >= offset) {
return {
node,
offset: offset - nodeStart
};
}
nodeStart = nodeEnd;
}
node = getLeafNode(getSiblingNode(node));
}
}
function getOffsets(outerNode) {
var ownerDocument = outerNode.ownerDocument;
var win = ownerDocument && ownerDocument.defaultView || window;
var selection = win.getSelection && win.getSelection();
if (!selection || selection.rangeCount === 0) {
return null;
}
var anchorNode = selection.anchorNode, anchorOffset = selection.anchorOffset, focusNode = selection.focusNode, focusOffset = selection.focusOffset;
try {
anchorNode.nodeType;
focusNode.nodeType;
} catch (e) {
return null;
}
return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);
}
function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {
var length = 0;
var start = -1;
var end = -1;
var indexWithinAnchor = 0;
var indexWithinFocus = 0;
var node = outerNode;
var parentNode = null;
outer:
while (true) {
var next = null;
while (true) {
if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {
start = length + anchorOffset;
}
if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {
end = length + focusOffset;
}
if (node.nodeType === TEXT_NODE) {
length += node.nodeValue.length;
}
if ((next = node.firstChild) === null) {
break;
}
parentNode = node;
node = next;
}
while (true) {
if (node === outerNode) {
break outer;
}
if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {
start = length;
}
if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {
end = length;
}
if ((next = node.nextSibling) !== null) {
break;
}
node = parentNode;
parentNode = node.parentNode;
}
node = next;
}
if (start === -1 || end === -1) {
return null;
}
return {
start,
end
};
}
function setOffsets(node, offsets) {
var doc = node.ownerDocument || document;
var win = doc && doc.defaultView || window;
if (!win.getSelection) {
return;
}
var selection = win.getSelection();
var length = node.textContent.length;
var start = Math.min(offsets.start, length);
var end = offsets.end === void 0 ? start : Math.min(offsets.end, length);
if (!selection.extend && start > end) {
var temp = end;
end = start;
start = temp;
}
var startMarker = getNodeForCharacterOffset(node, start);
var endMarker = getNodeForCharacterOffset(node, end);
if (startMarker && endMarker) {
if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {
return;
}
var range = doc.createRange();
range.setStart(startMarker.node, startMarker.offset);
selection.removeAllRanges();
if (start > end) {
selection.addRange(range);
selection.extend(endMarker.node, endMarker.offset);
} else {
range.setEnd(endMarker.node, endMarker.offset);
selection.addRange(range);
}
}
}
function isTextNode(node) {
return node && node.nodeType === TEXT_NODE;
}
function containsNode(outerNode, innerNode) {
if (!outerNode || !innerNode) {
return false;
} else if (outerNode === innerNode) {
return true;
} else if (isTextNode(outerNode)) {
return false;
} else if (isTextNode(innerNode)) {
return containsNode(outerNode, innerNode.parentNode);
} else if ("contains" in outerNode) {
return outerNode.contains(innerNode);
} else if (outerNode.compareDocumentPosition) {
return !!(outerNode.compareDocumentPosition(innerNode) & 16);
} else {
return false;
}
}
function isInDocument(node) {
return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);
}
function isSameOriginFrame(iframe) {
try {
return typeof iframe.contentWindow.location.href === "string";
} catch (err) {
return false;
}
}
function getActiveElementDeep() {
var win = window;
var element = getActiveElement2();
while (element instanceof win.HTMLIFrameElement) {
if (isSameOriginFrame(element)) {
win = element.contentWindow;
} else {
return element;
}
element = getActiveElement2(win.document);
}
return element;
}
function hasSelectionCapabilities(elem) {
var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
return nodeName && (nodeName === "input" && (elem.type === "text" || elem.type === "search" || elem.type === "tel" || elem.type === "url" || elem.type === "password") || nodeName === "textarea" || elem.contentEditable === "true");
}
function getSelectionInformation() {
var focusedElem = getActiveElementDeep();
return {
focusedElem,
selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null
};
}
function restoreSelection(priorSelectionInformation) {
var curFocusedElem = getActiveElementDeep();
var priorFocusedElem = priorSelectionInformation.focusedElem;
var priorSelectionRange = priorSelectionInformation.selectionRange;
if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {
setSelection(priorFocusedElem, priorSelectionRange);
}
var ancestors = [];
var ancestor = priorFocusedElem;
while (ancestor = ancestor.parentNode) {
if (ancestor.nodeType === ELEMENT_NODE) {
ancestors.push({
element: ancestor,
left: ancestor.scrollLeft,
top: ancestor.scrollTop
});
}
}
if (typeof priorFocusedElem.focus === "function") {
priorFocusedElem.focus();
}
for (var i = 0; i < ancestors.length; i++) {
var info = ancestors[i];
info.element.scrollLeft = info.left;
info.element.scrollTop = info.top;
}
}
}
function getSelection(input) {
var selection;
if ("selectionStart" in input) {
selection = {
start: input.selectionStart,
end: input.selectionEnd
};
} else {
selection = getOffsets(input);
}
return selection || {
start: 0,
end: 0
};
}
function setSelection(input, offsets) {
var start = offsets.start;
var end = offsets.end;
if (end === void 0) {
end = start;
}
if ("selectionStart" in input) {
input.selectionStart = start;
input.selectionEnd = Math.min(end, input.value.length);
} else {
setOffsets(input, offsets);
}
}
var skipSelectionChangeEvent = canUseDOM && "documentMode" in document && document.documentMode <= 11;
function registerEvents$3() {
registerTwoPhaseEvent("onSelect", ["focusout", "contextmenu", "dragend", "focusin", "keydown", "keyup", "mousedown", "mouseup", "selectionchange"]);
}
var activeElement$1 = null;
var activeElementInst$1 = null;
var lastSelection = null;
var mouseDown = false;
function getSelection$1(node) {
if ("selectionStart" in node && hasSelectionCapabilities(node)) {
return {
start: node.selectionStart,
end: node.selectionEnd
};
} else {
var win = node.ownerDocument && node.ownerDocument.defaultView || window;
var selection = win.getSelection();
return {
anchorNode: selection.anchorNode,
anchorOffset: selection.anchorOffset,
focusNode: selection.focusNode,
focusOffset: selection.focusOffset
};
}
}
function getEventTargetDocument(eventTarget) {
return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;
}
function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {
var doc = getEventTargetDocument(nativeEventTarget);
if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement2(doc)) {
return;
}
var currentSelection = getSelection$1(activeElement$1);
if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
lastSelection = currentSelection;
var listeners = accumulateTwoPhaseListeners(activeElementInst$1, "onSelect");
if (listeners.length > 0) {
var event = new SyntheticEvent("onSelect", "select", null, nativeEvent, nativeEventTarget);
dispatchQueue.push({
event,
listeners
});
event.target = activeElement$1;
}
}
}
function extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
var targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
switch (domEventName) {
case "focusin":
if (isTextInputElement(targetNode) || targetNode.contentEditable === "true") {
activeElement$1 = targetNode;
activeElementInst$1 = targetInst;
lastSelection = null;
}
break;
case "focusout":
activeElement$1 = null;
activeElementInst$1 = null;
lastSelection = null;
break;
case "mousedown":
mouseDown = true;
break;
case "contextmenu":
case "mouseup":
case "dragend":
mouseDown = false;
constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
break;
case "selectionchange":
if (skipSelectionChangeEvent) {
break;
}
case "keydown":
case "keyup":
constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
}
}
function makePrefixMap(styleProp, eventName) {
var prefixes2 = {};
prefixes2[styleProp.toLowerCase()] = eventName.toLowerCase();
prefixes2["Webkit" + styleProp] = "webkit" + eventName;
prefixes2["Moz" + styleProp] = "moz" + eventName;
return prefixes2;
}
var vendorPrefixes = {
animationend: makePrefixMap("Animation", "AnimationEnd"),
animationiteration: makePrefixMap("Animation", "AnimationIteration"),
animationstart: makePrefixMap("Animation", "AnimationStart"),
transitionend: makePrefixMap("Transition", "TransitionEnd")
};
var prefixedEventNames = {};
var style = {};
if (canUseDOM) {
style = document.createElement("div").style;
if (!("AnimationEvent" in window)) {
delete vendorPrefixes.animationend.animation;
delete vendorPrefixes.animationiteration.animation;
delete vendorPrefixes.animationstart.animation;
}
if (!("TransitionEvent" in window)) {
delete vendorPrefixes.transitionend.transition;
}
}
function getVendorPrefixedEventName(eventName) {
if (prefixedEventNames[eventName]) {
return prefixedEventNames[eventName];
} else if (!vendorPrefixes[eventName]) {
return eventName;
}
var prefixMap = vendorPrefixes[eventName];
for (var styleProp in prefixMap) {
if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
return prefixedEventNames[eventName] = prefixMap[styleProp];
}
}
return eventName;
}
var ANIMATION_END = getVendorPrefixedEventName("animationend");
var ANIMATION_ITERATION = getVendorPrefixedEventName("animationiteration");
var ANIMATION_START = getVendorPrefixedEventName("animationstart");
var TRANSITION_END = getVendorPrefixedEventName("transitionend");
var topLevelEventsToReactNames = new Map();
var simpleEventPluginEvents = ["abort", "auxClick", "cancel", "canPlay", "canPlayThrough", "click", "close", "contextMenu", "copy", "cut", "drag", "dragEnd", "dragEnter", "dragExit", "dragLeave", "dragOver", "dragStart", "drop", "durationChange", "emptied", "encrypted", "ended", "error", "gotPointerCapture", "input", "invalid", "keyDown", "keyPress", "keyUp", "load", "loadedData", "loadedMetadata", "loadStart", "lostPointerCapture", "mouseDown", "mouseMove", "mouseOut", "mouseOver", "mouseUp", "paste", "pause", "play", "playing", "pointerCancel", "pointerDown", "pointerMove", "pointerOut", "pointerOver", "pointerUp", "progress", "rateChange", "reset", "resize", "seeked", "seeking", "stalled", "submit", "suspend", "timeUpdate", "touchCancel", "touchEnd", "touchStart", "volumeChange", "scroll", "toggle", "touchMove", "waiting", "wheel"];
function registerSimpleEvent(domEventName, reactName) {
topLevelEventsToReactNames.set(domEventName, reactName);
registerTwoPhaseEvent(reactName, [domEventName]);
}
function registerSimpleEvents() {
for (var i = 0; i < simpleEventPluginEvents.length; i++) {
var eventName = simpleEventPluginEvents[i];
var domEventName = eventName.toLowerCase();
var capitalizedEvent = eventName[0].toUpperCase() + eventName.slice(1);
registerSimpleEvent(domEventName, "on" + capitalizedEvent);
}
registerSimpleEvent(ANIMATION_END, "onAnimationEnd");
registerSimpleEvent(ANIMATION_ITERATION, "onAnimationIteration");
registerSimpleEvent(ANIMATION_START, "onAnimationStart");
registerSimpleEvent("dblclick", "onDoubleClick");
registerSimpleEvent("focusin", "onFocus");
registerSimpleEvent("focusout", "onBlur");
registerSimpleEvent(TRANSITION_END, "onTransitionEnd");
}
function extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
var reactName = topLevelEventsToReactNames.get(domEventName);
if (reactName === void 0) {
return;
}
var SyntheticEventCtor = SyntheticEvent;
var reactEventType = domEventName;
switch (domEventName) {
case "keypress":
if (getEventCharCode(nativeEvent) === 0) {
return;
}
case "keydown":
case "keyup":
SyntheticEventCtor = SyntheticKeyboardEvent;
break;
case "focusin":
reactEventType = "focus";
SyntheticEventCtor = SyntheticFocusEvent;
break;
case "focusout":
reactEventType = "blur";
SyntheticEventCtor = SyntheticFocusEvent;
break;
case "beforeblur":
case "afterblur":
SyntheticEventCtor = SyntheticFocusEvent;
break;
case "click":
if (nativeEvent.button === 2) {
return;
}
case "auxclick":
case "dblclick":
case "mousedown":
case "mousemove":
case "mouseup":
case "mouseout":
case "mouseover":
case "contextmenu":
SyntheticEventCtor = SyntheticMouseEvent;
break;
case "drag":
case "dragend":
case "dragenter":
case "dragexit":
case "dragleave":
case "dragover":
case "dragstart":
case "drop":
SyntheticEventCtor = SyntheticDragEvent;
break;
case "touchcancel":
case "touchend":
case "touchmove":
case "touchstart":
SyntheticEventCtor = SyntheticTouchEvent;
break;
case ANIMATION_END:
case ANIMATION_ITERATION:
case ANIMATION_START:
SyntheticEventCtor = SyntheticAnimationEvent;
break;
case TRANSITION_END:
SyntheticEventCtor = SyntheticTransitionEvent;
break;
case "scroll":
SyntheticEventCtor = SyntheticUIEvent;
break;
case "wheel":
SyntheticEventCtor = SyntheticWheelEvent;
break;
case "copy":
case "cut":
case "paste":
SyntheticEventCtor = SyntheticClipboardEvent;
break;
case "gotpointercapture":
case "lostpointercapture":
case "pointercancel":
case "pointerdown":
case "pointermove":
case "pointerout":
case "pointerover":
case "pointerup":
SyntheticEventCtor = SyntheticPointerEvent;
break;
}
var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
{
var accumulateTargetOnly = !inCapturePhase && domEventName === "scroll";
var _listeners = accumulateSinglePhaseListeners(targetInst, reactName, nativeEvent.type, inCapturePhase, accumulateTargetOnly);
if (_listeners.length > 0) {
var _event = new SyntheticEventCtor(reactName, reactEventType, null, nativeEvent, nativeEventTarget);
dispatchQueue.push({
event: _event,
listeners: _listeners
});
}
}
}
registerSimpleEvents();
registerEvents$2();
registerEvents$1();
registerEvents$3();
registerEvents();
function extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
var shouldProcessPolyfillPlugins = (eventSystemFlags & SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS) === 0;
if (shouldProcessPolyfillPlugins) {
extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
}
}
var mediaEventTypes = ["abort", "canplay", "canplaythrough", "durationchange", "emptied", "encrypted", "ended", "error", "loadeddata", "loadedmetadata", "loadstart", "pause", "play", "playing", "progress", "ratechange", "resize", "seeked", "seeking", "stalled", "suspend", "timeupdate", "volumechange", "waiting"];
var nonDelegatedEvents = new Set(["cancel", "close", "invalid", "load", "scroll", "toggle"].concat(mediaEventTypes));
function executeDispatch(event, listener, currentTarget) {
var type = event.type || "unknown-event";
event.currentTarget = currentTarget;
invokeGuardedCallbackAndCatchFirstError(type, listener, void 0, event);
event.currentTarget = null;
}
function processDispatchQueueItemsInOrder(event, dispatchListeners, inCapturePhase) {
var previousInstance;
if (inCapturePhase) {
for (var i = dispatchListeners.length - 1; i >= 0; i--) {
var _dispatchListeners$i = dispatchListeners[i], instance = _dispatchListeners$i.instance, currentTarget = _dispatchListeners$i.currentTarget, listener = _dispatchListeners$i.listener;
if (instance !== previousInstance && event.isPropagationStopped()) {
return;
}
executeDispatch(event, listener, currentTarget);
previousInstance = instance;
}
} else {
for (var _i = 0; _i < dispatchListeners.length; _i++) {
var _dispatchListeners$_i = dispatchListeners[_i], _instance = _dispatchListeners$_i.instance, _currentTarget = _dispatchListeners$_i.currentTarget, _listener = _dispatchListeners$_i.listener;
if (_instance !== previousInstance && event.isPropagationStopped()) {
return;
}
executeDispatch(event, _listener, _currentTarget);
previousInstance = _instance;
}
}
}
function processDispatchQueue(dispatchQueue, eventSystemFlags) {
var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
for (var i = 0; i < dispatchQueue.length; i++) {
var _dispatchQueue$i = dispatchQueue[i], event = _dispatchQueue$i.event, listeners = _dispatchQueue$i.listeners;
processDispatchQueueItemsInOrder(event, listeners, inCapturePhase);
}
rethrowCaughtError();
}
function dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) {
var nativeEventTarget = getEventTarget(nativeEvent);
var dispatchQueue = [];
extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
processDispatchQueue(dispatchQueue, eventSystemFlags);
}
function listenToNonDelegatedEvent(domEventName, targetElement) {
{
if (!nonDelegatedEvents.has(domEventName)) {
error('Did not expect a listenToNonDelegatedEvent() call for "%s". This is a bug in React. Please file an issue.', domEventName);
}
}
var isCapturePhaseListener = false;
var listenerSet = getEventListenerSet(targetElement);
var listenerSetKey = getListenerSetKey(domEventName, isCapturePhaseListener);
if (!listenerSet.has(listenerSetKey)) {
addTrappedEventListener(targetElement, domEventName, IS_NON_DELEGATED, isCapturePhaseListener);
listenerSet.add(listenerSetKey);
}
}
function listenToNativeEvent(domEventName, isCapturePhaseListener, target) {
{
if (nonDelegatedEvents.has(domEventName) && !isCapturePhaseListener) {
error('Did not expect a listenToNativeEvent() call for "%s" in the bubble phase. This is a bug in React. Please file an issue.', domEventName);
}
}
var eventSystemFlags = 0;
if (isCapturePhaseListener) {
eventSystemFlags |= IS_CAPTURE_PHASE;
}
addTrappedEventListener(target, domEventName, eventSystemFlags, isCapturePhaseListener);
}
var listeningMarker = "_reactListening" + Math.random().toString(36).slice(2);
function listenToAllSupportedEvents(rootContainerElement) {
if (!rootContainerElement[listeningMarker]) {
rootContainerElement[listeningMarker] = true;
allNativeEvents.forEach(function(domEventName) {
if (domEventName !== "selectionchange") {
if (!nonDelegatedEvents.has(domEventName)) {
listenToNativeEvent(domEventName, false, rootContainerElement);
}
listenToNativeEvent(domEventName, true, rootContainerElement);
}
});
var ownerDocument = rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
if (ownerDocument !== null) {
if (!ownerDocument[listeningMarker]) {
ownerDocument[listeningMarker] = true;
listenToNativeEvent("selectionchange", false, ownerDocument);
}
}
}
}
function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener, isDeferredListenerForLegacyFBSupport) {
var listener = createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags);
var isPassiveListener = void 0;
if (passiveBrowserEventsSupported) {
if (domEventName === "touchstart" || domEventName === "touchmove" || domEventName === "wheel") {
isPassiveListener = true;
}
}
targetContainer = targetContainer;
var unsubscribeListener;
if (isCapturePhaseListener) {
if (isPassiveListener !== void 0) {
unsubscribeListener = addEventCaptureListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener);
} else {
unsubscribeListener = addEventCaptureListener(targetContainer, domEventName, listener);
}
} else {
if (isPassiveListener !== void 0) {
unsubscribeListener = addEventBubbleListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener);
} else {
unsubscribeListener = addEventBubbleListener(targetContainer, domEventName, listener);
}
}
}
function isMatchingRootContainer(grandContainer, targetContainer) {
return grandContainer === targetContainer || grandContainer.nodeType === COMMENT_NODE && grandContainer.parentNode === targetContainer;
}
function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) {
var ancestorInst = targetInst;
if ((eventSystemFlags & IS_EVENT_HANDLE_NON_MANAGED_NODE) === 0 && (eventSystemFlags & IS_NON_DELEGATED) === 0) {
var targetContainerNode = targetContainer;
if (targetInst !== null) {
var node = targetInst;
mainLoop:
while (true) {
if (node === null) {
return;
}
var nodeTag = node.tag;
if (nodeTag === HostRoot || nodeTag === HostPortal) {
var container = node.stateNode.containerInfo;
if (isMatchingRootContainer(container, targetContainerNode)) {
break;
}
if (nodeTag === HostPortal) {
var grandNode = node.return;
while (grandNode !== null) {
var grandTag = grandNode.tag;
if (grandTag === HostRoot || grandTag === HostPortal) {
var grandContainer = grandNode.stateNode.containerInfo;
if (isMatchingRootContainer(grandContainer, targetContainerNode)) {
return;
}
}
grandNode = grandNode.return;
}
}
while (container !== null) {
var parentNode = getClosestInstanceFromNode(container);
if (parentNode === null) {
return;
}
var parentTag = parentNode.tag;
if (parentTag === HostComponent || parentTag === HostText) {
node = ancestorInst = parentNode;
continue mainLoop;
}
container = container.parentNode;
}
}
node = node.return;
}
}
}
batchedUpdates(function() {
return dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, ancestorInst);
});
}
function createDispatchListener(instance, listener, currentTarget) {
return {
instance,
listener,
currentTarget
};
}
function accumulateSinglePhaseListeners(targetFiber, reactName, nativeEventType, inCapturePhase, accumulateTargetOnly, nativeEvent) {
var captureName = reactName !== null ? reactName + "Capture" : null;
var reactEventName = inCapturePhase ? captureName : reactName;
var listeners = [];
var instance = targetFiber;
var lastHostComponent = null;
while (instance !== null) {
var _instance2 = instance, stateNode = _instance2.stateNode, tag = _instance2.tag;
if (tag === HostComponent && stateNode !== null) {
lastHostComponent = stateNode;
if (reactEventName !== null) {
var listener = getListener(instance, reactEventName);
if (listener != null) {
listeners.push(createDispatchListener(instance, listener, lastHostComponent));
}
}
}
if (accumulateTargetOnly) {
break;
}
instance = instance.return;
}
return listeners;
}
function accumulateTwoPhaseListeners(targetFiber, reactName) {
var captureName = reactName + "Capture";
var listeners = [];
var instance = targetFiber;
while (instance !== null) {
var _instance3 = instance, stateNode = _instance3.stateNode, tag = _instance3.tag;
if (tag === HostComponent && stateNode !== null) {
var currentTarget = stateNode;
var captureListener = getListener(instance, captureName);
if (captureListener != null) {
listeners.unshift(createDispatchListener(instance, captureListener, currentTarget));
}
var bubbleListener = getListener(instance, reactName);
if (bubbleListener != null) {
listeners.push(createDispatchListener(instance, bubbleListener, currentTarget));
}
}
instance = instance.return;
}
return listeners;
}
function getParent(inst) {
if (inst === null) {
return null;
}
do {
inst = inst.return;
} while (inst && inst.tag !== HostComponent);
if (inst) {
return inst;
}
return null;
}
function getLowestCommonAncestor(instA, instB) {
var nodeA = instA;
var nodeB = instB;
var depthA = 0;
for (var tempA = nodeA; tempA; tempA = getParent(tempA)) {
depthA++;
}
var depthB = 0;
for (var tempB = nodeB; tempB; tempB = getParent(tempB)) {
depthB++;
}
while (depthA - depthB > 0) {
nodeA = getParent(nodeA);
depthA--;
}
while (depthB - depthA > 0) {
nodeB = getParent(nodeB);
depthB--;
}
var depth = depthA;
while (depth--) {
if (nodeA === nodeB || nodeB !== null && nodeA === nodeB.alternate) {
return nodeA;
}
nodeA = getParent(nodeA);
nodeB = getParent(nodeB);
}
return null;
}
function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) {
var registrationName = event._reactName;
var listeners = [];
var instance = target;
while (instance !== null) {
if (instance === common) {
break;
}
var _instance4 = instance, alternate = _instance4.alternate, stateNode = _instance4.stateNode, tag = _instance4.tag;
if (alternate !== null && alternate === common) {
break;
}
if (tag === HostComponent && stateNode !== null) {
var currentTarget = stateNode;
if (inCapturePhase) {
var captureListener = getListener(instance, registrationName);
if (captureListener != null) {
listeners.unshift(createDispatchListener(instance, captureListener, currentTarget));
}
} else if (!inCapturePhase) {
var bubbleListener = getListener(instance, registrationName);
if (bubbleListener != null) {
listeners.push(createDispatchListener(instance, bubbleListener, currentTarget));
}
}
}
instance = instance.return;
}
if (listeners.length !== 0) {
dispatchQueue.push({
event,
listeners
});
}
}
function accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leaveEvent, enterEvent, from, to) {
var common = from && to ? getLowestCommonAncestor(from, to) : null;
if (from !== null) {
accumulateEnterLeaveListenersForEvent(dispatchQueue, leaveEvent, from, common, false);
}
if (to !== null && enterEvent !== null) {
accumulateEnterLeaveListenersForEvent(dispatchQueue, enterEvent, to, common, true);
}
}
function getListenerSetKey(domEventName, capture) {
return domEventName + "__" + (capture ? "capture" : "bubble");
}
var didWarnInvalidHydration = false;
var DANGEROUSLY_SET_INNER_HTML = "dangerouslySetInnerHTML";
var SUPPRESS_CONTENT_EDITABLE_WARNING = "suppressContentEditableWarning";
var SUPPRESS_HYDRATION_WARNING = "suppressHydrationWarning";
var AUTOFOCUS = "autoFocus";
var CHILDREN = "children";
var STYLE = "style";
var HTML$1 = "__html";
var warnedUnknownTags;
var validatePropertiesInDevelopment;
var warnForPropDifference;
var warnForExtraAttributes;
var warnForInvalidEventListener;
var canDiffStyleForHydrationWarning;
var normalizeHTML;
{
warnedUnknownTags = {
dialog: true,
webview: true
};
validatePropertiesInDevelopment = function(type, props) {
validateProperties(type, props);
validateProperties$1(type, props);
validateProperties$2(type, props, {
registrationNameDependencies,
possibleRegistrationNames
});
};
canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode;
warnForPropDifference = function(propName, serverValue, clientValue) {
if (didWarnInvalidHydration) {
return;
}
var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);
var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);
if (normalizedServerValue === normalizedClientValue) {
return;
}
didWarnInvalidHydration = true;
error("Prop `%s` did not match. Server: %s Client: %s", propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));
};
warnForExtraAttributes = function(attributeNames) {
if (didWarnInvalidHydration) {
return;
}
didWarnInvalidHydration = true;
var names = [];
attributeNames.forEach(function(name) {
names.push(name);
});
error("Extra attributes from the server: %s", names);
};
warnForInvalidEventListener = function(registrationName, listener) {
if (listener === false) {
error("Expected `%s` listener to be a function, instead got `false`.\n\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.", registrationName, registrationName, registrationName);
} else {
error("Expected `%s` listener to be a function, instead got a value of `%s` type.", registrationName, typeof listener);
}
};
normalizeHTML = function(parent, html) {
var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);
testElement.innerHTML = html;
return testElement.innerHTML;
};
}
var NORMALIZE_NEWLINES_REGEX = /\r\n?/g;
var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g;
function normalizeMarkupForTextOrAttribute(markup) {
{
checkHtmlStringCoercion(markup);
}
var markupString = typeof markup === "string" ? markup : "" + markup;
return markupString.replace(NORMALIZE_NEWLINES_REGEX, "\n").replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, "");
}
function checkForUnmatchedText(serverText, clientText, isConcurrentMode, shouldWarnDev) {
var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);
var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);
if (normalizedServerText === normalizedClientText) {
return;
}
if (shouldWarnDev) {
{
if (!didWarnInvalidHydration) {
didWarnInvalidHydration = true;
error('Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText);
}
}
}
if (isConcurrentMode && enableClientRenderFallbackOnTextMismatch) {
throw new Error("Text content does not match server-rendered HTML.");
}
}
function getOwnerDocumentFromRootContainer(rootContainerElement) {
return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
}
function noop3() {
}
function trapClickOnNonInteractiveElement(node) {
node.onclick = noop3;
}
function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {
for (var propKey in nextProps) {
if (!nextProps.hasOwnProperty(propKey)) {
continue;
}
var nextProp = nextProps[propKey];
if (propKey === STYLE) {
{
if (nextProp) {
Object.freeze(nextProp);
}
}
setValueForStyles(domElement, nextProp);
} else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
var nextHtml = nextProp ? nextProp[HTML$1] : void 0;
if (nextHtml != null) {
setInnerHTML(domElement, nextHtml);
}
} else if (propKey === CHILDREN) {
if (typeof nextProp === "string") {
var canSetTextContent = tag !== "textarea" || nextProp !== "";
if (canSetTextContent) {
setTextContent(domElement, nextProp);
}
} else if (typeof nextProp === "number") {
setTextContent(domElement, "" + nextProp);
}
} else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING)
;
else if (propKey === AUTOFOCUS)
;
else if (registrationNameDependencies.hasOwnProperty(propKey)) {
if (nextProp != null) {
if (typeof nextProp !== "function") {
warnForInvalidEventListener(propKey, nextProp);
}
if (propKey === "onScroll") {
listenToNonDelegatedEvent("scroll", domElement);
}
}
} else if (nextProp != null) {
setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);
}
}
}
function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {
for (var i = 0; i < updatePayload.length; i += 2) {
var propKey = updatePayload[i];
var propValue = updatePayload[i + 1];
if (propKey === STYLE) {
setValueForStyles(domElement, propValue);
} else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
setInnerHTML(domElement, propValue);
} else if (propKey === CHILDREN) {
setTextContent(domElement, propValue);
} else {
setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);
}
}
}
function createElement25(type, props, rootContainerElement, parentNamespace) {
var isCustomComponentTag;
var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);
var domElement;
var namespaceURI = parentNamespace;
if (namespaceURI === HTML_NAMESPACE) {
namespaceURI = getIntrinsicNamespace(type);
}
if (namespaceURI === HTML_NAMESPACE) {
{
isCustomComponentTag = isCustomComponent(type, props);
if (!isCustomComponentTag && type !== type.toLowerCase()) {
error("<%s /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements.", type);
}
}
if (type === "script") {
var div = ownerDocument.createElement("div");
div.innerHTML = "<script><\/script>";
var firstChild = div.firstChild;
domElement = div.removeChild(firstChild);
} else if (typeof props.is === "string") {
domElement = ownerDocument.createElement(type, {
is: props.is
});
} else {
domElement = ownerDocument.createElement(type);
if (type === "select") {
var node = domElement;
if (props.multiple) {
node.multiple = true;
} else if (props.size) {
node.size = props.size;
}
}
}
} else {
domElement = ownerDocument.createElementNS(namespaceURI, type);
}
{
if (namespaceURI === HTML_NAMESPACE) {
if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === "[object HTMLUnknownElement]" && !hasOwnProperty4.call(warnedUnknownTags, type)) {
warnedUnknownTags[type] = true;
error("The tag <%s> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.", type);
}
}
}
return domElement;
}
function createTextNode(text, rootContainerElement) {
return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
}
function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
var isCustomComponentTag = isCustomComponent(tag, rawProps);
{
validatePropertiesInDevelopment(tag, rawProps);
}
var props;
switch (tag) {
case "dialog":
listenToNonDelegatedEvent("cancel", domElement);
listenToNonDelegatedEvent("close", domElement);
props = rawProps;
break;
case "iframe":
case "object":
case "embed":
listenToNonDelegatedEvent("load", domElement);
props = rawProps;
break;
case "video":
case "audio":
for (var i = 0; i < mediaEventTypes.length; i++) {
listenToNonDelegatedEvent(mediaEventTypes[i], domElement);
}
props = rawProps;
break;
case "source":
listenToNonDelegatedEvent("error", domElement);
props = rawProps;
break;
case "img":
case "image":
case "link":
listenToNonDelegatedEvent("error", domElement);
listenToNonDelegatedEvent("load", domElement);
props = rawProps;
break;
case "details":
listenToNonDelegatedEvent("toggle", domElement);
props = rawProps;
break;
case "input":
initWrapperState(domElement, rawProps);
props = getHostProps(domElement, rawProps);
listenToNonDelegatedEvent("invalid", domElement);
break;
case "option":
validateProps(domElement, rawProps);
props = rawProps;
break;
case "select":
initWrapperState$1(domElement, rawProps);
props = getHostProps$1(domElement, rawProps);
listenToNonDelegatedEvent("invalid", domElement);
break;
case "textarea":
initWrapperState$2(domElement, rawProps);
props = getHostProps$2(domElement, rawProps);
listenToNonDelegatedEvent("invalid", domElement);
break;
default:
props = rawProps;
}
assertValidProps(tag, props);
setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
switch (tag) {
case "input":
track(domElement);
postMountWrapper(domElement, rawProps, false);
break;
case "textarea":
track(domElement);
postMountWrapper$3(domElement);
break;
case "option":
postMountWrapper$1(domElement, rawProps);
break;
case "select":
postMountWrapper$2(domElement, rawProps);
break;
default:
if (typeof props.onClick === "function") {
trapClickOnNonInteractiveElement(domElement);
}
break;
}
}
function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
{
validatePropertiesInDevelopment(tag, nextRawProps);
}
var updatePayload = null;
var lastProps;
var nextProps;
switch (tag) {
case "input":
lastProps = getHostProps(domElement, lastRawProps);
nextProps = getHostProps(domElement, nextRawProps);
updatePayload = [];
break;
case "select":
lastProps = getHostProps$1(domElement, lastRawProps);
nextProps = getHostProps$1(domElement, nextRawProps);
updatePayload = [];
break;
case "textarea":
lastProps = getHostProps$2(domElement, lastRawProps);
nextProps = getHostProps$2(domElement, nextRawProps);
updatePayload = [];
break;
default:
lastProps = lastRawProps;
nextProps = nextRawProps;
if (typeof lastProps.onClick !== "function" && typeof nextProps.onClick === "function") {
trapClickOnNonInteractiveElement(domElement);
}
break;
}
assertValidProps(tag, nextProps);
var propKey;
var styleName;
var styleUpdates = null;
for (propKey in lastProps) {
if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
continue;
}
if (propKey === STYLE) {
var lastStyle = lastProps[propKey];
for (styleName in lastStyle) {
if (lastStyle.hasOwnProperty(styleName)) {
if (!styleUpdates) {
styleUpdates = {};
}
styleUpdates[styleName] = "";
}
}
} else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN)
;
else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING)
;
else if (propKey === AUTOFOCUS)
;
else if (registrationNameDependencies.hasOwnProperty(propKey)) {
if (!updatePayload) {
updatePayload = [];
}
} else {
(updatePayload = updatePayload || []).push(propKey, null);
}
}
for (propKey in nextProps) {
var nextProp = nextProps[propKey];
var lastProp = lastProps != null ? lastProps[propKey] : void 0;
if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
continue;
}
if (propKey === STYLE) {
{
if (nextProp) {
Object.freeze(nextProp);
}
}
if (lastProp) {
for (styleName in lastProp) {
if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
if (!styleUpdates) {
styleUpdates = {};
}
styleUpdates[styleName] = "";
}
}
for (styleName in nextProp) {
if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
if (!styleUpdates) {
styleUpdates = {};
}
styleUpdates[styleName] = nextProp[styleName];
}
}
} else {
if (!styleUpdates) {
if (!updatePayload) {
updatePayload = [];
}
updatePayload.push(propKey, styleUpdates);
}
styleUpdates = nextProp;
}
} else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
var nextHtml = nextProp ? nextProp[HTML$1] : void 0;
var lastHtml = lastProp ? lastProp[HTML$1] : void 0;
if (nextHtml != null) {
if (lastHtml !== nextHtml) {
(updatePayload = updatePayload || []).push(propKey, nextHtml);
}
}
} else if (propKey === CHILDREN) {
if (typeof nextProp === "string" || typeof nextProp === "number") {
(updatePayload = updatePayload || []).push(propKey, "" + nextProp);
}
} else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING)
;
else if (registrationNameDependencies.hasOwnProperty(propKey)) {
if (nextProp != null) {
if (typeof nextProp !== "function") {
warnForInvalidEventListener(propKey, nextProp);
}
if (propKey === "onScroll") {
listenToNonDelegatedEvent("scroll", domElement);
}
}
if (!updatePayload && lastProp !== nextProp) {
updatePayload = [];
}
} else {
(updatePayload = updatePayload || []).push(propKey, nextProp);
}
}
if (styleUpdates) {
{
validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);
}
(updatePayload = updatePayload || []).push(STYLE, styleUpdates);
}
return updatePayload;
}
function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
if (tag === "input" && nextRawProps.type === "radio" && nextRawProps.name != null) {
updateChecked(domElement, nextRawProps);
}
var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
var isCustomComponentTag = isCustomComponent(tag, nextRawProps);
updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag);
switch (tag) {
case "input":
updateWrapper(domElement, nextRawProps);
break;
case "textarea":
updateWrapper$1(domElement, nextRawProps);
break;
case "select":
postUpdateWrapper(domElement, nextRawProps);
break;
}
}
function getPossibleStandardName(propName) {
{
var lowerCasedName = propName.toLowerCase();
if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
return null;
}
return possibleStandardNames[lowerCasedName] || null;
}
}
function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement, isConcurrentMode, shouldWarnDev) {
var isCustomComponentTag;
var extraAttributeNames;
{
isCustomComponentTag = isCustomComponent(tag, rawProps);
validatePropertiesInDevelopment(tag, rawProps);
}
switch (tag) {
case "dialog":
listenToNonDelegatedEvent("cancel", domElement);
listenToNonDelegatedEvent("close", domElement);
break;
case "iframe":
case "object":
case "embed":
listenToNonDelegatedEvent("load", domElement);
break;
case "video":
case "audio":
for (var i = 0; i < mediaEventTypes.length; i++) {
listenToNonDelegatedEvent(mediaEventTypes[i], domElement);
}
break;
case "source":
listenToNonDelegatedEvent("error", domElement);
break;
case "img":
case "image":
case "link":
listenToNonDelegatedEvent("error", domElement);
listenToNonDelegatedEvent("load", domElement);
break;
case "details":
listenToNonDelegatedEvent("toggle", domElement);
break;
case "input":
initWrapperState(domElement, rawProps);
listenToNonDelegatedEvent("invalid", domElement);
break;
case "option":
validateProps(domElement, rawProps);
break;
case "select":
initWrapperState$1(domElement, rawProps);
listenToNonDelegatedEvent("invalid", domElement);
break;
case "textarea":
initWrapperState$2(domElement, rawProps);
listenToNonDelegatedEvent("invalid", domElement);
break;
}
assertValidProps(tag, rawProps);
{
extraAttributeNames = new Set();
var attributes = domElement.attributes;
for (var _i = 0; _i < attributes.length; _i++) {
var name = attributes[_i].name.toLowerCase();
switch (name) {
case "value":
break;
case "checked":
break;
case "selected":
break;
default:
extraAttributeNames.add(attributes[_i].name);
}
}
}
var updatePayload = null;
for (var propKey in rawProps) {
if (!rawProps.hasOwnProperty(propKey)) {
continue;
}
var nextProp = rawProps[propKey];
if (propKey === CHILDREN) {
if (typeof nextProp === "string") {
if (domElement.textContent !== nextProp) {
if (rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
checkForUnmatchedText(domElement.textContent, nextProp, isConcurrentMode, shouldWarnDev);
}
updatePayload = [CHILDREN, nextProp];
}
} else if (typeof nextProp === "number") {
if (domElement.textContent !== "" + nextProp) {
if (rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
checkForUnmatchedText(domElement.textContent, nextProp, isConcurrentMode, shouldWarnDev);
}
updatePayload = [CHILDREN, "" + nextProp];
}
}
} else if (registrationNameDependencies.hasOwnProperty(propKey)) {
if (nextProp != null) {
if (typeof nextProp !== "function") {
warnForInvalidEventListener(propKey, nextProp);
}
if (propKey === "onScroll") {
listenToNonDelegatedEvent("scroll", domElement);
}
}
} else if (shouldWarnDev && true && typeof isCustomComponentTag === "boolean") {
var serverValue = void 0;
var propertyInfo = isCustomComponentTag && enableCustomElementPropertySupport ? null : getPropertyInfo(propKey);
if (rawProps[SUPPRESS_HYDRATION_WARNING] === true)
;
else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || propKey === "value" || propKey === "checked" || propKey === "selected")
;
else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
var serverHTML = domElement.innerHTML;
var nextHtml = nextProp ? nextProp[HTML$1] : void 0;
if (nextHtml != null) {
var expectedHTML = normalizeHTML(domElement, nextHtml);
if (expectedHTML !== serverHTML) {
warnForPropDifference(propKey, serverHTML, expectedHTML);
}
}
} else if (propKey === STYLE) {
extraAttributeNames.delete(propKey);
if (canDiffStyleForHydrationWarning) {
var expectedStyle = createDangerousStringForStyles(nextProp);
serverValue = domElement.getAttribute("style");
if (expectedStyle !== serverValue) {
warnForPropDifference(propKey, serverValue, expectedStyle);
}
}
} else if (isCustomComponentTag && !enableCustomElementPropertySupport) {
extraAttributeNames.delete(propKey.toLowerCase());
serverValue = getValueForAttribute(domElement, propKey, nextProp);
if (nextProp !== serverValue) {
warnForPropDifference(propKey, serverValue, nextProp);
}
} else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
var isMismatchDueToBadCasing = false;
if (propertyInfo !== null) {
extraAttributeNames.delete(propertyInfo.attributeName);
serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
} else {
var ownNamespace = parentNamespace;
if (ownNamespace === HTML_NAMESPACE) {
ownNamespace = getIntrinsicNamespace(tag);
}
if (ownNamespace === HTML_NAMESPACE) {
extraAttributeNames.delete(propKey.toLowerCase());
} else {
var standardName = getPossibleStandardName(propKey);
if (standardName !== null && standardName !== propKey) {
isMismatchDueToBadCasing = true;
extraAttributeNames.delete(standardName);
}
extraAttributeNames.delete(propKey);
}
serverValue = getValueForAttribute(domElement, propKey, nextProp);
}
var dontWarnCustomElement = enableCustomElementPropertySupport;
if (!dontWarnCustomElement && nextProp !== serverValue && !isMismatchDueToBadCasing) {
warnForPropDifference(propKey, serverValue, nextProp);
}
}
}
}
{
if (shouldWarnDev) {
if (extraAttributeNames.size > 0 && rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
warnForExtraAttributes(extraAttributeNames);
}
}
}
switch (tag) {
case "input":
track(domElement);
postMountWrapper(domElement, rawProps, true);
break;
case "textarea":
track(domElement);
postMountWrapper$3(domElement);
break;
case "select":
case "option":
break;
default:
if (typeof rawProps.onClick === "function") {
trapClickOnNonInteractiveElement(domElement);
}
break;
}
return updatePayload;
}
function diffHydratedText(textNode, text, isConcurrentMode) {
var isDifferent = textNode.nodeValue !== text;
return isDifferent;
}
function warnForDeletedHydratableElement(parentNode, child) {
{
if (didWarnInvalidHydration) {
return;
}
didWarnInvalidHydration = true;
error("Did not expect server HTML to contain a <%s> in <%s>.", child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
}
}
function warnForDeletedHydratableText(parentNode, child) {
{
if (didWarnInvalidHydration) {
return;
}
didWarnInvalidHydration = true;
error('Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
}
}
function warnForInsertedHydratedElement(parentNode, tag, props) {
{
if (didWarnInvalidHydration) {
return;
}
didWarnInvalidHydration = true;
error("Expected server HTML to contain a matching <%s> in <%s>.", tag, parentNode.nodeName.toLowerCase());
}
}
function warnForInsertedHydratedText(parentNode, text) {
{
if (text === "") {
return;
}
if (didWarnInvalidHydration) {
return;
}
didWarnInvalidHydration = true;
error('Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
}
}
function restoreControlledState$3(domElement, tag, props) {
switch (tag) {
case "input":
restoreControlledState(domElement, props);
return;
case "textarea":
restoreControlledState$2(domElement, props);
return;
case "select":
restoreControlledState$1(domElement, props);
return;
}
}
var validateDOMNesting = function() {
};
var updatedAncestorInfo = function() {
};
{
var specialTags = ["address", "applet", "area", "article", "aside", "base", "basefont", "bgsound", "blockquote", "body", "br", "button", "caption", "center", "col", "colgroup", "dd", "details", "dir", "div", "dl", "dt", "embed", "fieldset", "figcaption", "figure", "footer", "form", "frame", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "iframe", "img", "input", "isindex", "li", "link", "listing", "main", "marquee", "menu", "menuitem", "meta", "nav", "noembed", "noframes", "noscript", "object", "ol", "p", "param", "plaintext", "pre", "script", "section", "select", "source", "style", "summary", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "title", "tr", "track", "ul", "wbr", "xmp"];
var inScopeTags = [
"applet",
"caption",
"html",
"table",
"td",
"th",
"marquee",
"object",
"template",
"foreignObject",
"desc",
"title"
];
var buttonScopeTags = inScopeTags.concat(["button"]);
var impliedEndTags = ["dd", "dt", "li", "option", "optgroup", "p", "rp", "rt"];
var emptyAncestorInfo = {
current: null,
formTag: null,
aTagInScope: null,
buttonTagInScope: null,
nobrTagInScope: null,
pTagInButtonScope: null,
listItemTagAutoclosing: null,
dlItemTagAutoclosing: null
};
updatedAncestorInfo = function(oldInfo, tag) {
var ancestorInfo = assign2({}, oldInfo || emptyAncestorInfo);
var info = {
tag
};
if (inScopeTags.indexOf(tag) !== -1) {
ancestorInfo.aTagInScope = null;
ancestorInfo.buttonTagInScope = null;
ancestorInfo.nobrTagInScope = null;
}
if (buttonScopeTags.indexOf(tag) !== -1) {
ancestorInfo.pTagInButtonScope = null;
}
if (specialTags.indexOf(tag) !== -1 && tag !== "address" && tag !== "div" && tag !== "p") {
ancestorInfo.listItemTagAutoclosing = null;
ancestorInfo.dlItemTagAutoclosing = null;
}
ancestorInfo.current = info;
if (tag === "form") {
ancestorInfo.formTag = info;
}
if (tag === "a") {
ancestorInfo.aTagInScope = info;
}
if (tag === "button") {
ancestorInfo.buttonTagInScope = info;
}
if (tag === "nobr") {
ancestorInfo.nobrTagInScope = info;
}
if (tag === "p") {
ancestorInfo.pTagInButtonScope = info;
}
if (tag === "li") {
ancestorInfo.listItemTagAutoclosing = info;
}
if (tag === "dd" || tag === "dt") {
ancestorInfo.dlItemTagAutoclosing = info;
}
return ancestorInfo;
};
var isTagValidWithParent = function(tag, parentTag) {
switch (parentTag) {
case "select":
return tag === "option" || tag === "optgroup" || tag === "#text";
case "optgroup":
return tag === "option" || tag === "#text";
case "option":
return tag === "#text";
case "tr":
return tag === "th" || tag === "td" || tag === "style" || tag === "script" || tag === "template";
case "tbody":
case "thead":
case "tfoot":
return tag === "tr" || tag === "style" || tag === "script" || tag === "template";
case "colgroup":
return tag === "col" || tag === "template";
case "table":
return tag === "caption" || tag === "colgroup" || tag === "tbody" || tag === "tfoot" || tag === "thead" || tag === "style" || tag === "script" || tag === "template";
case "head":
return tag === "base" || tag === "basefont" || tag === "bgsound" || tag === "link" || tag === "meta" || tag === "title" || tag === "noscript" || tag === "noframes" || tag === "style" || tag === "script" || tag === "template";
case "html":
return tag === "head" || tag === "body" || tag === "frameset";
case "frameset":
return tag === "frame";
case "#document":
return tag === "html";
}
switch (tag) {
case "h1":
case "h2":
case "h3":
case "h4":
case "h5":
case "h6":
return parentTag !== "h1" && parentTag !== "h2" && parentTag !== "h3" && parentTag !== "h4" && parentTag !== "h5" && parentTag !== "h6";
case "rp":
case "rt":
return impliedEndTags.indexOf(parentTag) === -1;
case "body":
case "caption":
case "col":
case "colgroup":
case "frameset":
case "frame":
case "head":
case "html":
case "tbody":
case "td":
case "tfoot":
case "th":
case "thead":
case "tr":
return parentTag == null;
}
return true;
};
var findInvalidAncestorForTag = function(tag, ancestorInfo) {
switch (tag) {
case "address":
case "article":
case "aside":
case "blockquote":
case "center":
case "details":
case "dialog":
case "dir":
case "div":
case "dl":
case "fieldset":
case "figcaption":
case "figure":
case "footer":
case "header":
case "hgroup":
case "main":
case "menu":
case "nav":
case "ol":
case "p":
case "section":
case "summary":
case "ul":
case "pre":
case "listing":
case "table":
case "hr":
case "xmp":
case "h1":
case "h2":
case "h3":
case "h4":
case "h5":
case "h6":
return ancestorInfo.pTagInButtonScope;
case "form":
return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
case "li":
return ancestorInfo.listItemTagAutoclosing;
case "dd":
case "dt":
return ancestorInfo.dlItemTagAutoclosing;
case "button":
return ancestorInfo.buttonTagInScope;
case "a":
return ancestorInfo.aTagInScope;
case "nobr":
return ancestorInfo.nobrTagInScope;
}
return null;
};
var didWarn$1 = {};
validateDOMNesting = function(childTag, childText, ancestorInfo) {
ancestorInfo = ancestorInfo || emptyAncestorInfo;
var parentInfo = ancestorInfo.current;
var parentTag = parentInfo && parentInfo.tag;
if (childText != null) {
if (childTag != null) {
error("validateDOMNesting: when childText is passed, childTag should be null");
}
childTag = "#text";
}
var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
var invalidParentOrAncestor = invalidParent || invalidAncestor;
if (!invalidParentOrAncestor) {
return;
}
var ancestorTag = invalidParentOrAncestor.tag;
var warnKey = !!invalidParent + "|" + childTag + "|" + ancestorTag;
if (didWarn$1[warnKey]) {
return;
}
didWarn$1[warnKey] = true;
var tagDisplayName = childTag;
var whitespaceInfo = "";
if (childTag === "#text") {
if (/\S/.test(childText)) {
tagDisplayName = "Text nodes";
} else {
tagDisplayName = "Whitespace text nodes";
whitespaceInfo = " Make sure you don't have any extra whitespace between tags on each line of your source code.";
}
} else {
tagDisplayName = "<" + childTag + ">";
}
if (invalidParent) {
var info = "";
if (ancestorTag === "table" && childTag === "tr") {
info += " Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by the browser.";
}
error("validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s", tagDisplayName, ancestorTag, whitespaceInfo, info);
} else {
error("validateDOMNesting(...): %s cannot appear as a descendant of <%s>.", tagDisplayName, ancestorTag);
}
};
}
var SUPPRESS_HYDRATION_WARNING$1 = "suppressHydrationWarning";
var SUSPENSE_START_DATA = "$";
var SUSPENSE_END_DATA = "/$";
var SUSPENSE_PENDING_START_DATA = "$?";
var SUSPENSE_FALLBACK_START_DATA = "$!";
var STYLE$1 = "style";
var eventsEnabled = null;
var selectionInformation = null;
function getRootHostContext(rootContainerInstance) {
var type;
var namespace;
var nodeType = rootContainerInstance.nodeType;
switch (nodeType) {
case DOCUMENT_NODE:
case DOCUMENT_FRAGMENT_NODE: {
type = nodeType === DOCUMENT_NODE ? "#document" : "#fragment";
var root2 = rootContainerInstance.documentElement;
namespace = root2 ? root2.namespaceURI : getChildNamespace(null, "");
break;
}
default: {
var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
var ownNamespace = container.namespaceURI || null;
type = container.tagName;
namespace = getChildNamespace(ownNamespace, type);
break;
}
}
{
var validatedTag = type.toLowerCase();
var ancestorInfo = updatedAncestorInfo(null, validatedTag);
return {
namespace,
ancestorInfo
};
}
}
function getChildHostContext(parentHostContext, type, rootContainerInstance) {
{
var parentHostContextDev = parentHostContext;
var namespace = getChildNamespace(parentHostContextDev.namespace, type);
var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
return {
namespace,
ancestorInfo
};
}
}
function getPublicInstance(instance) {
return instance;
}
function prepareForCommit(containerInfo) {
eventsEnabled = isEnabled();
selectionInformation = getSelectionInformation();
var activeInstance = null;
setEnabled(false);
return activeInstance;
}
function resetAfterCommit(containerInfo) {
restoreSelection(selectionInformation);
setEnabled(eventsEnabled);
eventsEnabled = null;
selectionInformation = null;
}
function createInstance2(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
var parentNamespace;
{
var hostContextDev = hostContext;
validateDOMNesting(type, null, hostContextDev.ancestorInfo);
if (typeof props.children === "string" || typeof props.children === "number") {
var string = "" + props.children;
var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
validateDOMNesting(null, string, ownAncestorInfo);
}
parentNamespace = hostContextDev.namespace;
}
var domElement = createElement25(type, props, rootContainerInstance, parentNamespace);
precacheFiberNode(internalInstanceHandle, domElement);
updateFiberProps(domElement, props);
return domElement;
}
function appendInitialChild(parentInstance, child) {
parentInstance.appendChild(child);
}
function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
setInitialProperties(domElement, type, props, rootContainerInstance);
switch (type) {
case "button":
case "input":
case "select":
case "textarea":
return !!props.autoFocus;
case "img":
return true;
default:
return false;
}
}
function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
{
var hostContextDev = hostContext;
if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === "string" || typeof newProps.children === "number")) {
var string = "" + newProps.children;
var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
validateDOMNesting(null, string, ownAncestorInfo);
}
}
return diffProperties(domElement, type, oldProps, newProps);
}
function shouldSetTextContent(type, props) {
return type === "textarea" || type === "noscript" || typeof props.children === "string" || typeof props.children === "number" || typeof props.dangerouslySetInnerHTML === "object" && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;
}
function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
{
var hostContextDev = hostContext;
validateDOMNesting(null, text, hostContextDev.ancestorInfo);
}
var textNode = createTextNode(text, rootContainerInstance);
precacheFiberNode(internalInstanceHandle, textNode);
return textNode;
}
function getCurrentEventPriority() {
var currentEvent = window.event;
if (currentEvent === void 0) {
return DefaultEventPriority;
}
return getEventPriority(currentEvent.type);
}
var scheduleTimeout = typeof setTimeout === "function" ? setTimeout : void 0;
var cancelTimeout = typeof clearTimeout === "function" ? clearTimeout : void 0;
var noTimeout = -1;
var localPromise = typeof Promise === "function" ? Promise : void 0;
var scheduleMicrotask = typeof queueMicrotask === "function" ? queueMicrotask : typeof localPromise !== "undefined" ? function(callback) {
return localPromise.resolve(null).then(callback).catch(handleErrorInNextTick);
} : scheduleTimeout;
function handleErrorInNextTick(error2) {
setTimeout(function() {
throw error2;
});
}
function commitMount(domElement, type, newProps, internalInstanceHandle) {
switch (type) {
case "button":
case "input":
case "select":
case "textarea":
if (newProps.autoFocus) {
domElement.focus();
}
return;
case "img": {
if (newProps.src) {
domElement.src = newProps.src;
}
return;
}
}
}
function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
updateProperties(domElement, updatePayload, type, oldProps, newProps);
updateFiberProps(domElement, newProps);
}
function resetTextContent(domElement) {
setTextContent(domElement, "");
}
function commitTextUpdate(textInstance, oldText, newText) {
textInstance.nodeValue = newText;
}
function appendChild(parentInstance, child) {
parentInstance.appendChild(child);
}
function appendChildToContainer(container, child) {
var parentNode;
if (container.nodeType === COMMENT_NODE) {
parentNode = container.parentNode;
parentNode.insertBefore(child, container);
} else {
parentNode = container;
parentNode.appendChild(child);
}
var reactRootContainer = container._reactRootContainer;
if ((reactRootContainer === null || reactRootContainer === void 0) && parentNode.onclick === null) {
trapClickOnNonInteractiveElement(parentNode);
}
}
function insertBefore(parentInstance, child, beforeChild) {
parentInstance.insertBefore(child, beforeChild);
}
function insertInContainerBefore(container, child, beforeChild) {
if (container.nodeType === COMMENT_NODE) {
container.parentNode.insertBefore(child, beforeChild);
} else {
container.insertBefore(child, beforeChild);
}
}
function removeChild(parentInstance, child) {
parentInstance.removeChild(child);
}
function removeChildFromContainer(container, child) {
if (container.nodeType === COMMENT_NODE) {
container.parentNode.removeChild(child);
} else {
container.removeChild(child);
}
}
function clearSuspenseBoundary(parentInstance, suspenseInstance) {
var node = suspenseInstance;
var depth = 0;
do {
var nextNode = node.nextSibling;
parentInstance.removeChild(node);
if (nextNode && nextNode.nodeType === COMMENT_NODE) {
var data = nextNode.data;
if (data === SUSPENSE_END_DATA) {
if (depth === 0) {
parentInstance.removeChild(nextNode);
retryIfBlockedOn(suspenseInstance);
return;
} else {
depth--;
}
} else if (data === SUSPENSE_START_DATA || data === SUSPENSE_PENDING_START_DATA || data === SUSPENSE_FALLBACK_START_DATA) {
depth++;
}
}
node = nextNode;
} while (node);
retryIfBlockedOn(suspenseInstance);
}
function clearSuspenseBoundaryFromContainer(container, suspenseInstance) {
if (container.nodeType === COMMENT_NODE) {
clearSuspenseBoundary(container.parentNode, suspenseInstance);
} else if (container.nodeType === ELEMENT_NODE) {
clearSuspenseBoundary(container, suspenseInstance);
}
retryIfBlockedOn(container);
}
function hideInstance(instance) {
instance = instance;
var style2 = instance.style;
if (typeof style2.setProperty === "function") {
style2.setProperty("display", "none", "important");
} else {
style2.display = "none";
}
}
function hideTextInstance(textInstance) {
textInstance.nodeValue = "";
}
function unhideInstance(instance, props) {
instance = instance;
var styleProp = props[STYLE$1];
var display = styleProp !== void 0 && styleProp !== null && styleProp.hasOwnProperty("display") ? styleProp.display : null;
instance.style.display = dangerousStyleValue("display", display);
}
function unhideTextInstance(textInstance, text) {
textInstance.nodeValue = text;
}
function clearContainer(container) {
if (container.nodeType === ELEMENT_NODE) {
container.textContent = "";
} else if (container.nodeType === DOCUMENT_NODE) {
if (container.documentElement) {
container.removeChild(container.documentElement);
}
}
}
function canHydrateInstance(instance, type, props) {
if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
return null;
}
return instance;
}
function canHydrateTextInstance(instance, text) {
if (text === "" || instance.nodeType !== TEXT_NODE) {
return null;
}
return instance;
}
function canHydrateSuspenseInstance(instance) {
if (instance.nodeType !== COMMENT_NODE) {
return null;
}
return instance;
}
function isSuspenseInstancePending(instance) {
return instance.data === SUSPENSE_PENDING_START_DATA;
}
function isSuspenseInstanceFallback(instance) {
return instance.data === SUSPENSE_FALLBACK_START_DATA;
}
function getSuspenseInstanceFallbackErrorDetails(instance) {
var dataset = instance.nextSibling && instance.nextSibling.dataset;
var digest, message, stack;
if (dataset) {
digest = dataset.dgst;
{
message = dataset.msg;
stack = dataset.stck;
}
}
{
return {
message,
digest,
stack
};
}
}
function registerSuspenseInstanceRetry(instance, callback) {
instance._reactRetry = callback;
}
function getNextHydratable(node) {
for (; node != null; node = node.nextSibling) {
var nodeType = node.nodeType;
if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {
break;
}
if (nodeType === COMMENT_NODE) {
var nodeData = node.data;
if (nodeData === SUSPENSE_START_DATA || nodeData === SUSPENSE_FALLBACK_START_DATA || nodeData === SUSPENSE_PENDING_START_DATA) {
break;
}
if (nodeData === SUSPENSE_END_DATA) {
return null;
}
}
}
return node;
}
function getNextHydratableSibling(instance) {
return getNextHydratable(instance.nextSibling);
}
function getFirstHydratableChild(parentInstance) {
return getNextHydratable(parentInstance.firstChild);
}
function getFirstHydratableChildWithinContainer(parentContainer) {
return getNextHydratable(parentContainer.firstChild);
}
function getFirstHydratableChildWithinSuspenseInstance(parentInstance) {
return getNextHydratable(parentInstance.nextSibling);
}
function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle, shouldWarnDev) {
precacheFiberNode(internalInstanceHandle, instance);
updateFiberProps(instance, props);
var parentNamespace;
{
var hostContextDev = hostContext;
parentNamespace = hostContextDev.namespace;
}
var isConcurrentMode = (internalInstanceHandle.mode & ConcurrentMode) !== NoMode;
return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance, isConcurrentMode, shouldWarnDev);
}
function hydrateTextInstance(textInstance, text, internalInstanceHandle, shouldWarnDev) {
precacheFiberNode(internalInstanceHandle, textInstance);
var isConcurrentMode = (internalInstanceHandle.mode & ConcurrentMode) !== NoMode;
return diffHydratedText(textInstance, text);
}
function hydrateSuspenseInstance(suspenseInstance, internalInstanceHandle) {
precacheFiberNode(internalInstanceHandle, suspenseInstance);
}
function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
var node = suspenseInstance.nextSibling;
var depth = 0;
while (node) {
if (node.nodeType === COMMENT_NODE) {
var data = node.data;
if (data === SUSPENSE_END_DATA) {
if (depth === 0) {
return getNextHydratableSibling(node);
} else {
depth--;
}
} else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
depth++;
}
}
node = node.nextSibling;
}
return null;
}
function getParentSuspenseInstance(targetInstance) {
var node = targetInstance.previousSibling;
var depth = 0;
while (node) {
if (node.nodeType === COMMENT_NODE) {
var data = node.data;
if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
if (depth === 0) {
return node;
} else {
depth--;
}
} else if (data === SUSPENSE_END_DATA) {
depth++;
}
}
node = node.previousSibling;
}
return null;
}
function commitHydratedContainer(container) {
retryIfBlockedOn(container);
}
function commitHydratedSuspenseInstance(suspenseInstance) {
retryIfBlockedOn(suspenseInstance);
}
function shouldDeleteUnhydratedTailInstances(parentType) {
return parentType !== "head" && parentType !== "body";
}
function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text, isConcurrentMode) {
var shouldWarnDev = true;
checkForUnmatchedText(textInstance.nodeValue, text, isConcurrentMode, shouldWarnDev);
}
function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text, isConcurrentMode) {
if (parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
var shouldWarnDev = true;
checkForUnmatchedText(textInstance.nodeValue, text, isConcurrentMode, shouldWarnDev);
}
}
function didNotHydrateInstanceWithinContainer(parentContainer, instance) {
{
if (instance.nodeType === ELEMENT_NODE) {
warnForDeletedHydratableElement(parentContainer, instance);
} else if (instance.nodeType === COMMENT_NODE)
;
else {
warnForDeletedHydratableText(parentContainer, instance);
}
}
}
function didNotHydrateInstanceWithinSuspenseInstance(parentInstance, instance) {
{
var parentNode = parentInstance.parentNode;
if (parentNode !== null) {
if (instance.nodeType === ELEMENT_NODE) {
warnForDeletedHydratableElement(parentNode, instance);
} else if (instance.nodeType === COMMENT_NODE)
;
else {
warnForDeletedHydratableText(parentNode, instance);
}
}
}
}
function didNotHydrateInstance(parentType, parentProps, parentInstance, instance, isConcurrentMode) {
{
if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
if (instance.nodeType === ELEMENT_NODE) {
warnForDeletedHydratableElement(parentInstance, instance);
} else if (instance.nodeType === COMMENT_NODE)
;
else {
warnForDeletedHydratableText(parentInstance, instance);
}
}
}
}
function didNotFindHydratableInstanceWithinContainer(parentContainer, type, props) {
{
warnForInsertedHydratedElement(parentContainer, type);
}
}
function didNotFindHydratableTextInstanceWithinContainer(parentContainer, text) {
{
warnForInsertedHydratedText(parentContainer, text);
}
}
function didNotFindHydratableInstanceWithinSuspenseInstance(parentInstance, type, props) {
{
var parentNode = parentInstance.parentNode;
if (parentNode !== null)
warnForInsertedHydratedElement(parentNode, type);
}
}
function didNotFindHydratableTextInstanceWithinSuspenseInstance(parentInstance, text) {
{
var parentNode = parentInstance.parentNode;
if (parentNode !== null)
warnForInsertedHydratedText(parentNode, text);
}
}
function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props, isConcurrentMode) {
{
if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
warnForInsertedHydratedElement(parentInstance, type);
}
}
}
function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text, isConcurrentMode) {
{
if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
warnForInsertedHydratedText(parentInstance, text);
}
}
}
function errorHydratingContainer(parentContainer) {
{
error("An error occurred during hydration. The server HTML was replaced with client content in <%s>.", parentContainer.nodeName.toLowerCase());
}
}
function preparePortalMount(portalInstance) {
listenToAllSupportedEvents(portalInstance);
}
var randomKey = Math.random().toString(36).slice(2);
var internalInstanceKey = "__reactFiber$" + randomKey;
var internalPropsKey = "__reactProps$" + randomKey;
var internalContainerInstanceKey = "__reactContainer$" + randomKey;
var internalEventHandlersKey = "__reactEvents$" + randomKey;
var internalEventHandlerListenersKey = "__reactListeners$" + randomKey;
var internalEventHandlesSetKey = "__reactHandles$" + randomKey;
function detachDeletedInstance(node) {
delete node[internalInstanceKey];
delete node[internalPropsKey];
delete node[internalEventHandlersKey];
delete node[internalEventHandlerListenersKey];
delete node[internalEventHandlesSetKey];
}
function precacheFiberNode(hostInst, node) {
node[internalInstanceKey] = hostInst;
}
function markContainerAsRoot(hostRoot, node) {
node[internalContainerInstanceKey] = hostRoot;
}
function unmarkContainerAsRoot(node) {
node[internalContainerInstanceKey] = null;
}
function isContainerMarkedAsRoot(node) {
return !!node[internalContainerInstanceKey];
}
function getClosestInstanceFromNode(targetNode) {
var targetInst = targetNode[internalInstanceKey];
if (targetInst) {
return targetInst;
}
var parentNode = targetNode.parentNode;
while (parentNode) {
targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];
if (targetInst) {
var alternate = targetInst.alternate;
if (targetInst.child !== null || alternate !== null && alternate.child !== null) {
var suspenseInstance = getParentSuspenseInstance(targetNode);
while (suspenseInstance !== null) {
var targetSuspenseInst = suspenseInstance[internalInstanceKey];
if (targetSuspenseInst) {
return targetSuspenseInst;
}
suspenseInstance = getParentSuspenseInstance(suspenseInstance);
}
}
return targetInst;
}
targetNode = parentNode;
parentNode = targetNode.parentNode;
}
return null;
}
function getInstanceFromNode(node) {
var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];
if (inst) {
if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {
return inst;
} else {
return null;
}
}
return null;
}
function getNodeFromInstance(inst) {
if (inst.tag === HostComponent || inst.tag === HostText) {
return inst.stateNode;
}
throw new Error("getNodeFromInstance: Invalid argument.");
}
function getFiberCurrentPropsFromNode(node) {
return node[internalPropsKey] || null;
}
function updateFiberProps(node, props) {
node[internalPropsKey] = props;
}
function getEventListenerSet(node) {
var elementListenerSet = node[internalEventHandlersKey];
if (elementListenerSet === void 0) {
elementListenerSet = node[internalEventHandlersKey] = new Set();
}
return elementListenerSet;
}
var loggedTypeFailures = {};
var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
function setCurrentlyValidatingElement(element) {
{
if (element) {
var owner = element._owner;
var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
ReactDebugCurrentFrame$1.setExtraStackFrame(stack);
} else {
ReactDebugCurrentFrame$1.setExtraStackFrame(null);
}
}
}
function checkPropTypes(typeSpecs, values, location, componentName, element) {
{
var has2 = Function.call.bind(hasOwnProperty4);
for (var typeSpecName in typeSpecs) {
if (has2(typeSpecs, typeSpecName)) {
var error$1 = void 0;
try {
if (typeof typeSpecs[typeSpecName] !== "function") {
var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");
err.name = "Invariant Violation";
throw err;
}
error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED");
} catch (ex) {
error$1 = ex;
}
if (error$1 && !(error$1 instanceof Error)) {
setCurrentlyValidatingElement(element);
error("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error$1);
setCurrentlyValidatingElement(null);
}
if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
loggedTypeFailures[error$1.message] = true;
setCurrentlyValidatingElement(element);
error("Failed %s type: %s", location, error$1.message);
setCurrentlyValidatingElement(null);
}
}
}
}
}
var valueStack = [];
var fiberStack;
{
fiberStack = [];
}
var index2 = -1;
function createCursor(defaultValue) {
return {
current: defaultValue
};
}
function pop(cursor, fiber) {
if (index2 < 0) {
{
error("Unexpected pop.");
}
return;
}
{
if (fiber !== fiberStack[index2]) {
error("Unexpected Fiber popped.");
}
}
cursor.current = valueStack[index2];
valueStack[index2] = null;
{
fiberStack[index2] = null;
}
index2--;
}
function push(cursor, value, fiber) {
index2++;
valueStack[index2] = cursor.current;
{
fiberStack[index2] = fiber;
}
cursor.current = value;
}
var warnedAboutMissingGetChildContext;
{
warnedAboutMissingGetChildContext = {};
}
var emptyContextObject = {};
{
Object.freeze(emptyContextObject);
}
var contextStackCursor = createCursor(emptyContextObject);
var didPerformWorkStackCursor = createCursor(false);
var previousContext = emptyContextObject;
function getUnmaskedContext(workInProgress2, Component4, didPushOwnContextIfProvider) {
{
if (didPushOwnContextIfProvider && isContextProvider(Component4)) {
return previousContext;
}
return contextStackCursor.current;
}
}
function cacheContext(workInProgress2, unmaskedContext, maskedContext) {
{
var instance = workInProgress2.stateNode;
instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
}
}
function getMaskedContext(workInProgress2, unmaskedContext) {
{
var type = workInProgress2.type;
var contextTypes = type.contextTypes;
if (!contextTypes) {
return emptyContextObject;
}
var instance = workInProgress2.stateNode;
if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
return instance.__reactInternalMemoizedMaskedChildContext;
}
var context = {};
for (var key in contextTypes) {
context[key] = unmaskedContext[key];
}
{
var name = getComponentNameFromFiber(workInProgress2) || "Unknown";
checkPropTypes(contextTypes, context, "context", name);
}
if (instance) {
cacheContext(workInProgress2, unmaskedContext, context);
}
return context;
}
}
function hasContextChanged() {
{
return didPerformWorkStackCursor.current;
}
}
function isContextProvider(type) {
{
var childContextTypes = type.childContextTypes;
return childContextTypes !== null && childContextTypes !== void 0;
}
}
function popContext(fiber) {
{
pop(didPerformWorkStackCursor, fiber);
pop(contextStackCursor, fiber);
}
}
function popTopLevelContextObject(fiber) {
{
pop(didPerformWorkStackCursor, fiber);
pop(contextStackCursor, fiber);
}
}
function pushTopLevelContextObject(fiber, context, didChange) {
{
if (contextStackCursor.current !== emptyContextObject) {
throw new Error("Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.");
}
push(contextStackCursor, context, fiber);
push(didPerformWorkStackCursor, didChange, fiber);
}
}
function processChildContext(fiber, type, parentContext) {
{
var instance = fiber.stateNode;
var childContextTypes = type.childContextTypes;
if (typeof instance.getChildContext !== "function") {
{
var componentName = getComponentNameFromFiber(fiber) || "Unknown";
if (!warnedAboutMissingGetChildContext[componentName]) {
warnedAboutMissingGetChildContext[componentName] = true;
error("%s.childContextTypes is specified but there is no getChildContext() method on the instance. You can either define getChildContext() on %s or remove childContextTypes from it.", componentName, componentName);
}
}
return parentContext;
}
var childContext = instance.getChildContext();
for (var contextKey in childContext) {
if (!(contextKey in childContextTypes)) {
throw new Error((getComponentNameFromFiber(fiber) || "Unknown") + '.getChildContext(): key "' + contextKey + '" is not defined in childContextTypes.');
}
}
{
var name = getComponentNameFromFiber(fiber) || "Unknown";
checkPropTypes(childContextTypes, childContext, "child context", name);
}
return assign2({}, parentContext, childContext);
}
}
function pushContextProvider(workInProgress2) {
{
var instance = workInProgress2.stateNode;
var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject;
previousContext = contextStackCursor.current;
push(contextStackCursor, memoizedMergedChildContext, workInProgress2);
push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress2);
return true;
}
}
function invalidateContextProvider(workInProgress2, type, didChange) {
{
var instance = workInProgress2.stateNode;
if (!instance) {
throw new Error("Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.");
}
if (didChange) {
var mergedContext = processChildContext(workInProgress2, type, previousContext);
instance.__reactInternalMemoizedMergedChildContext = mergedContext;
pop(didPerformWorkStackCursor, workInProgress2);
pop(contextStackCursor, workInProgress2);
push(contextStackCursor, mergedContext, workInProgress2);
push(didPerformWorkStackCursor, didChange, workInProgress2);
} else {
pop(didPerformWorkStackCursor, workInProgress2);
push(didPerformWorkStackCursor, didChange, workInProgress2);
}
}
}
function findCurrentUnmaskedContext(fiber) {
{
if (!isFiberMounted(fiber) || fiber.tag !== ClassComponent) {
throw new Error("Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.");
}
var node = fiber;
do {
switch (node.tag) {
case HostRoot:
return node.stateNode.context;
case ClassComponent: {
var Component4 = node.type;
if (isContextProvider(Component4)) {
return node.stateNode.__reactInternalMemoizedMergedChildContext;
}
break;
}
}
node = node.return;
} while (node !== null);
throw new Error("Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.");
}
}
var LegacyRoot = 0;
var ConcurrentRoot = 1;
var syncQueue = null;
var includesLegacySyncCallbacks = false;
var isFlushingSyncQueue = false;
function scheduleSyncCallback(callback) {
if (syncQueue === null) {
syncQueue = [callback];
} else {
syncQueue.push(callback);
}
}
function scheduleLegacySyncCallback(callback) {
includesLegacySyncCallbacks = true;
scheduleSyncCallback(callback);
}
function flushSyncCallbacksOnlyInLegacyMode() {
if (includesLegacySyncCallbacks) {
flushSyncCallbacks();
}
}
function flushSyncCallbacks() {
if (!isFlushingSyncQueue && syncQueue !== null) {
isFlushingSyncQueue = true;
var i = 0;
var previousUpdatePriority = getCurrentUpdatePriority();
try {
var isSync = true;
var queue = syncQueue;
setCurrentUpdatePriority(DiscreteEventPriority);
for (; i < queue.length; i++) {
var callback = queue[i];
do {
callback = callback(isSync);
} while (callback !== null);
}
syncQueue = null;
includesLegacySyncCallbacks = false;
} catch (error2) {
if (syncQueue !== null) {
syncQueue = syncQueue.slice(i + 1);
}
scheduleCallback(ImmediatePriority, flushSyncCallbacks);
throw error2;
} finally {
setCurrentUpdatePriority(previousUpdatePriority);
isFlushingSyncQueue = false;
}
}
return null;
}
var forkStack = [];
var forkStackIndex = 0;
var treeForkProvider = null;
var treeForkCount = 0;
var idStack = [];
var idStackIndex = 0;
var treeContextProvider = null;
var treeContextId = 1;
var treeContextOverflow = "";
function isForkedChild(workInProgress2) {
warnIfNotHydrating();
return (workInProgress2.flags & Forked) !== NoFlags;
}
function getForksAtLevel(workInProgress2) {
warnIfNotHydrating();
return treeForkCount;
}
function getTreeId() {
var overflow = treeContextOverflow;
var idWithLeadingBit = treeContextId;
var id = idWithLeadingBit & ~getLeadingBit(idWithLeadingBit);
return id.toString(32) + overflow;
}
function pushTreeFork(workInProgress2, totalChildren) {
warnIfNotHydrating();
forkStack[forkStackIndex++] = treeForkCount;
forkStack[forkStackIndex++] = treeForkProvider;
treeForkProvider = workInProgress2;
treeForkCount = totalChildren;
}
function pushTreeId(workInProgress2, totalChildren, index3) {
warnIfNotHydrating();
idStack[idStackIndex++] = treeContextId;
idStack[idStackIndex++] = treeContextOverflow;
idStack[idStackIndex++] = treeContextProvider;
treeContextProvider = workInProgress2;
var baseIdWithLeadingBit = treeContextId;
var baseOverflow = treeContextOverflow;
var baseLength = getBitLength(baseIdWithLeadingBit) - 1;
var baseId = baseIdWithLeadingBit & ~(1 << baseLength);
var slot = index3 + 1;
var length = getBitLength(totalChildren) + baseLength;
if (length > 30) {
var numberOfOverflowBits = baseLength - baseLength % 5;
var newOverflowBits = (1 << numberOfOverflowBits) - 1;
var newOverflow = (baseId & newOverflowBits).toString(32);
var restOfBaseId = baseId >> numberOfOverflowBits;
var restOfBaseLength = baseLength - numberOfOverflowBits;
var restOfLength = getBitLength(totalChildren) + restOfBaseLength;
var restOfNewBits = slot << restOfBaseLength;
var id = restOfNewBits | restOfBaseId;
var overflow = newOverflow + baseOverflow;
treeContextId = 1 << restOfLength | id;
treeContextOverflow = overflow;
} else {
var newBits = slot << baseLength;
var _id2 = newBits | baseId;
var _overflow = baseOverflow;
treeContextId = 1 << length | _id2;
treeContextOverflow = _overflow;
}
}
function pushMaterializedTreeId(workInProgress2) {
warnIfNotHydrating();
var returnFiber = workInProgress2.return;
if (returnFiber !== null) {
var numberOfForks = 1;
var slotIndex = 0;
pushTreeFork(workInProgress2, numberOfForks);
pushTreeId(workInProgress2, numberOfForks, slotIndex);
}
}
function getBitLength(number) {
return 32 - clz32(number);
}
function getLeadingBit(id) {
return 1 << getBitLength(id) - 1;
}
function popTreeContext(workInProgress2) {
while (workInProgress2 === treeForkProvider) {
treeForkProvider = forkStack[--forkStackIndex];
forkStack[forkStackIndex] = null;
treeForkCount = forkStack[--forkStackIndex];
forkStack[forkStackIndex] = null;
}
while (workInProgress2 === treeContextProvider) {
treeContextProvider = idStack[--idStackIndex];
idStack[idStackIndex] = null;
treeContextOverflow = idStack[--idStackIndex];
idStack[idStackIndex] = null;
treeContextId = idStack[--idStackIndex];
idStack[idStackIndex] = null;
}
}
function getSuspendedTreeContext() {
warnIfNotHydrating();
if (treeContextProvider !== null) {
return {
id: treeContextId,
overflow: treeContextOverflow
};
} else {
return null;
}
}
function restoreSuspendedTreeContext(workInProgress2, suspendedContext) {
warnIfNotHydrating();
idStack[idStackIndex++] = treeContextId;
idStack[idStackIndex++] = treeContextOverflow;
idStack[idStackIndex++] = treeContextProvider;
treeContextId = suspendedContext.id;
treeContextOverflow = suspendedContext.overflow;
treeContextProvider = workInProgress2;
}
function warnIfNotHydrating() {
{
if (!getIsHydrating()) {
error("Expected to be hydrating. This is a bug in React. Please file an issue.");
}
}
}
var hydrationParentFiber = null;
var nextHydratableInstance = null;
var isHydrating = false;
var didSuspendOrErrorDEV = false;
var hydrationErrors = null;
function warnIfHydrating() {
{
if (isHydrating) {
error("We should not be hydrating here. This is a bug in React. Please file a bug.");
}
}
}
function markDidThrowWhileHydratingDEV() {
{
didSuspendOrErrorDEV = true;
}
}
function didSuspendOrErrorWhileHydratingDEV() {
{
return didSuspendOrErrorDEV;
}
}
function enterHydrationState(fiber) {
var parentInstance = fiber.stateNode.containerInfo;
nextHydratableInstance = getFirstHydratableChildWithinContainer(parentInstance);
hydrationParentFiber = fiber;
isHydrating = true;
hydrationErrors = null;
didSuspendOrErrorDEV = false;
return true;
}
function reenterHydrationStateFromDehydratedSuspenseInstance(fiber, suspenseInstance, treeContext) {
nextHydratableInstance = getFirstHydratableChildWithinSuspenseInstance(suspenseInstance);
hydrationParentFiber = fiber;
isHydrating = true;
hydrationErrors = null;
didSuspendOrErrorDEV = false;
if (treeContext !== null) {
restoreSuspendedTreeContext(fiber, treeContext);
}
return true;
}
function warnUnhydratedInstance(returnFiber, instance) {
{
switch (returnFiber.tag) {
case HostRoot: {
didNotHydrateInstanceWithinContainer(returnFiber.stateNode.containerInfo, instance);
break;
}
case HostComponent: {
var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance, isConcurrentMode);
break;
}
case SuspenseComponent: {
var suspenseState = returnFiber.memoizedState;
if (suspenseState.dehydrated !== null)
didNotHydrateInstanceWithinSuspenseInstance(suspenseState.dehydrated, instance);
break;
}
}
}
}
function deleteHydratableInstance(returnFiber, instance) {
warnUnhydratedInstance(returnFiber, instance);
var childToDelete = createFiberFromHostInstanceForDeletion();
childToDelete.stateNode = instance;
childToDelete.return = returnFiber;
var deletions = returnFiber.deletions;
if (deletions === null) {
returnFiber.deletions = [childToDelete];
returnFiber.flags |= ChildDeletion;
} else {
deletions.push(childToDelete);
}
}
function warnNonhydratedInstance(returnFiber, fiber) {
{
if (didSuspendOrErrorDEV) {
return;
}
switch (returnFiber.tag) {
case HostRoot: {
var parentContainer = returnFiber.stateNode.containerInfo;
switch (fiber.tag) {
case HostComponent:
var type = fiber.type;
var props = fiber.pendingProps;
didNotFindHydratableInstanceWithinContainer(parentContainer, type);
break;
case HostText:
var text = fiber.pendingProps;
didNotFindHydratableTextInstanceWithinContainer(parentContainer, text);
break;
}
break;
}
case HostComponent: {
var parentType = returnFiber.type;
var parentProps = returnFiber.memoizedProps;
var parentInstance = returnFiber.stateNode;
switch (fiber.tag) {
case HostComponent: {
var _type = fiber.type;
var _props = fiber.pendingProps;
var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props, isConcurrentMode);
break;
}
case HostText: {
var _text = fiber.pendingProps;
var _isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text, _isConcurrentMode);
break;
}
}
break;
}
case SuspenseComponent: {
var suspenseState = returnFiber.memoizedState;
var _parentInstance = suspenseState.dehydrated;
if (_parentInstance !== null)
switch (fiber.tag) {
case HostComponent:
var _type2 = fiber.type;
var _props2 = fiber.pendingProps;
didNotFindHydratableInstanceWithinSuspenseInstance(_parentInstance, _type2);
break;
case HostText:
var _text2 = fiber.pendingProps;
didNotFindHydratableTextInstanceWithinSuspenseInstance(_parentInstance, _text2);
break;
}
break;
}
default:
return;
}
}
}
function insertNonHydratedInstance(returnFiber, fiber) {
fiber.flags = fiber.flags & ~Hydrating | Placement;
warnNonhydratedInstance(returnFiber, fiber);
}
function tryHydrate(fiber, nextInstance) {
switch (fiber.tag) {
case HostComponent: {
var type = fiber.type;
var props = fiber.pendingProps;
var instance = canHydrateInstance(nextInstance, type);
if (instance !== null) {
fiber.stateNode = instance;
hydrationParentFiber = fiber;
nextHydratableInstance = getFirstHydratableChild(instance);
return true;
}
return false;
}
case HostText: {
var text = fiber.pendingProps;
var textInstance = canHydrateTextInstance(nextInstance, text);
if (textInstance !== null) {
fiber.stateNode = textInstance;
hydrationParentFiber = fiber;
nextHydratableInstance = null;
return true;
}
return false;
}
case SuspenseComponent: {
var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
if (suspenseInstance !== null) {
var suspenseState = {
dehydrated: suspenseInstance,
treeContext: getSuspendedTreeContext(),
retryLane: OffscreenLane
};
fiber.memoizedState = suspenseState;
var dehydratedFragment = createFiberFromDehydratedFragment(suspenseInstance);
dehydratedFragment.return = fiber;
fiber.child = dehydratedFragment;
hydrationParentFiber = fiber;
nextHydratableInstance = null;
return true;
}
return false;
}
default:
return false;
}
}
function shouldClientRenderOnMismatch(fiber) {
return (fiber.mode & ConcurrentMode) !== NoMode && (fiber.flags & DidCapture) === NoFlags;
}
function throwOnHydrationMismatch(fiber) {
throw new Error("Hydration failed because the initial UI does not match what was rendered on the server.");
}
function tryToClaimNextHydratableInstance(fiber) {
if (!isHydrating) {
return;
}
var nextInstance = nextHydratableInstance;
if (!nextInstance) {
if (shouldClientRenderOnMismatch(fiber)) {
warnNonhydratedInstance(hydrationParentFiber, fiber);
throwOnHydrationMismatch();
}
insertNonHydratedInstance(hydrationParentFiber, fiber);
isHydrating = false;
hydrationParentFiber = fiber;
return;
}
var firstAttemptedInstance = nextInstance;
if (!tryHydrate(fiber, nextInstance)) {
if (shouldClientRenderOnMismatch(fiber)) {
warnNonhydratedInstance(hydrationParentFiber, fiber);
throwOnHydrationMismatch();
}
nextInstance = getNextHydratableSibling(firstAttemptedInstance);
var prevHydrationParentFiber = hydrationParentFiber;
if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
insertNonHydratedInstance(hydrationParentFiber, fiber);
isHydrating = false;
hydrationParentFiber = fiber;
return;
}
deleteHydratableInstance(prevHydrationParentFiber, firstAttemptedInstance);
}
}
function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
var instance = fiber.stateNode;
var shouldWarnIfMismatchDev = !didSuspendOrErrorDEV;
var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber, shouldWarnIfMismatchDev);
fiber.updateQueue = updatePayload;
if (updatePayload !== null) {
return true;
}
return false;
}
function prepareToHydrateHostTextInstance(fiber) {
var textInstance = fiber.stateNode;
var textContent = fiber.memoizedProps;
var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
if (shouldUpdate) {
var returnFiber = hydrationParentFiber;
if (returnFiber !== null) {
switch (returnFiber.tag) {
case HostRoot: {
var parentContainer = returnFiber.stateNode.containerInfo;
var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent, isConcurrentMode);
break;
}
case HostComponent: {
var parentType = returnFiber.type;
var parentProps = returnFiber.memoizedProps;
var parentInstance = returnFiber.stateNode;
var _isConcurrentMode2 = (returnFiber.mode & ConcurrentMode) !== NoMode;
didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent, _isConcurrentMode2);
break;
}
}
}
}
return shouldUpdate;
}
function prepareToHydrateHostSuspenseInstance(fiber) {
var suspenseState = fiber.memoizedState;
var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
if (!suspenseInstance) {
throw new Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");
}
hydrateSuspenseInstance(suspenseInstance, fiber);
}
function skipPastDehydratedSuspenseInstance(fiber) {
var suspenseState = fiber.memoizedState;
var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
if (!suspenseInstance) {
throw new Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");
}
return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
}
function popToNextHostParent(fiber) {
var parent = fiber.return;
while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {
parent = parent.return;
}
hydrationParentFiber = parent;
}
function popHydrationState(fiber) {
if (fiber !== hydrationParentFiber) {
return false;
}
if (!isHydrating) {
popToNextHostParent(fiber);
isHydrating = true;
return false;
}
if (fiber.tag !== HostRoot && (fiber.tag !== HostComponent || shouldDeleteUnhydratedTailInstances(fiber.type) && !shouldSetTextContent(fiber.type, fiber.memoizedProps))) {
var nextInstance = nextHydratableInstance;
if (nextInstance) {
if (shouldClientRenderOnMismatch(fiber)) {
warnIfUnhydratedTailNodes(fiber);
throwOnHydrationMismatch();
} else {
while (nextInstance) {
deleteHydratableInstance(fiber, nextInstance);
nextInstance = getNextHydratableSibling(nextInstance);
}
}
}
}
popToNextHostParent(fiber);
if (fiber.tag === SuspenseComponent) {
nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);
} else {
nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
}
return true;
}
function hasUnhydratedTailNodes() {
return isHydrating && nextHydratableInstance !== null;
}
function warnIfUnhydratedTailNodes(fiber) {
var nextInstance = nextHydratableInstance;
while (nextInstance) {
warnUnhydratedInstance(fiber, nextInstance);
nextInstance = getNextHydratableSibling(nextInstance);
}
}
function resetHydrationState() {
hydrationParentFiber = null;
nextHydratableInstance = null;
isHydrating = false;
didSuspendOrErrorDEV = false;
}
function upgradeHydrationErrorsToRecoverable() {
if (hydrationErrors !== null) {
queueRecoverableErrors(hydrationErrors);
hydrationErrors = null;
}
}
function getIsHydrating() {
return isHydrating;
}
function queueHydrationError(error2) {
if (hydrationErrors === null) {
hydrationErrors = [error2];
} else {
hydrationErrors.push(error2);
}
}
var ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;
var NoTransition = null;
function requestCurrentTransition() {
return ReactCurrentBatchConfig$1.transition;
}
var ReactStrictModeWarnings = {
recordUnsafeLifecycleWarnings: function(fiber, instance) {
},
flushPendingUnsafeLifecycleWarnings: function() {
},
recordLegacyContextWarning: function(fiber, instance) {
},
flushLegacyContextWarning: function() {
},
discardPendingWarnings: function() {
}
};
{
var findStrictRoot = function(fiber) {
var maybeStrictRoot = null;
var node = fiber;
while (node !== null) {
if (node.mode & StrictLegacyMode) {
maybeStrictRoot = node;
}
node = node.return;
}
return maybeStrictRoot;
};
var setToSortedString = function(set2) {
var array = [];
set2.forEach(function(value) {
array.push(value);
});
return array.sort().join(", ");
};
var pendingComponentWillMountWarnings = [];
var pendingUNSAFE_ComponentWillMountWarnings = [];
var pendingComponentWillReceivePropsWarnings = [];
var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
var pendingComponentWillUpdateWarnings = [];
var pendingUNSAFE_ComponentWillUpdateWarnings = [];
var didWarnAboutUnsafeLifecycles = new Set();
ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function(fiber, instance) {
if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
return;
}
if (typeof instance.componentWillMount === "function" && instance.componentWillMount.__suppressDeprecationWarning !== true) {
pendingComponentWillMountWarnings.push(fiber);
}
if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillMount === "function") {
pendingUNSAFE_ComponentWillMountWarnings.push(fiber);
}
if (typeof instance.componentWillReceiveProps === "function" && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
pendingComponentWillReceivePropsWarnings.push(fiber);
}
if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillReceiveProps === "function") {
pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);
}
if (typeof instance.componentWillUpdate === "function" && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
pendingComponentWillUpdateWarnings.push(fiber);
}
if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillUpdate === "function") {
pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);
}
};
ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function() {
var componentWillMountUniqueNames = new Set();
if (pendingComponentWillMountWarnings.length > 0) {
pendingComponentWillMountWarnings.forEach(function(fiber) {
componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
didWarnAboutUnsafeLifecycles.add(fiber.type);
});
pendingComponentWillMountWarnings = [];
}
var UNSAFE_componentWillMountUniqueNames = new Set();
if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {
pendingUNSAFE_ComponentWillMountWarnings.forEach(function(fiber) {
UNSAFE_componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
didWarnAboutUnsafeLifecycles.add(fiber.type);
});
pendingUNSAFE_ComponentWillMountWarnings = [];
}
var componentWillReceivePropsUniqueNames = new Set();
if (pendingComponentWillReceivePropsWarnings.length > 0) {
pendingComponentWillReceivePropsWarnings.forEach(function(fiber) {
componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
didWarnAboutUnsafeLifecycles.add(fiber.type);
});
pendingComponentWillReceivePropsWarnings = [];
}
var UNSAFE_componentWillReceivePropsUniqueNames = new Set();
if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {
pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function(fiber) {
UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
didWarnAboutUnsafeLifecycles.add(fiber.type);
});
pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
}
var componentWillUpdateUniqueNames = new Set();
if (pendingComponentWillUpdateWarnings.length > 0) {
pendingComponentWillUpdateWarnings.forEach(function(fiber) {
componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
didWarnAboutUnsafeLifecycles.add(fiber.type);
});
pendingComponentWillUpdateWarnings = [];
}
var UNSAFE_componentWillUpdateUniqueNames = new Set();
if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {
pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function(fiber) {
UNSAFE_componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
didWarnAboutUnsafeLifecycles.add(fiber.type);
});
pendingUNSAFE_ComponentWillUpdateWarnings = [];
}
if (UNSAFE_componentWillMountUniqueNames.size > 0) {
var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);
error("Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move code with side effects to componentDidMount, and set initial state in the constructor.\n\nPlease update the following components: %s", sortedNames);
}
if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {
var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);
error("Using UNSAFE_componentWillReceiveProps in strict mode is not recommended and may indicate bugs in your code. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n\nPlease update the following components: %s", _sortedNames);
}
if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {
var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);
error("Using UNSAFE_componentWillUpdate in strict mode is not recommended and may indicate bugs in your code. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n\nPlease update the following components: %s", _sortedNames2);
}
if (componentWillMountUniqueNames.size > 0) {
var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);
warn("componentWillMount has been renamed, and is not recommended for use. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move code with side effects to componentDidMount, and set initial state in the constructor.\n* Rename componentWillMount to UNSAFE_componentWillMount to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", _sortedNames3);
}
if (componentWillReceivePropsUniqueNames.size > 0) {
var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);
warn("componentWillReceiveProps has been renamed, and is not recommended for use. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", _sortedNames4);
}
if (componentWillUpdateUniqueNames.size > 0) {
var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);
warn("componentWillUpdate has been renamed, and is not recommended for use. See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", _sortedNames5);
}
};
var pendingLegacyContextWarning = new Map();
var didWarnAboutLegacyContext = new Set();
ReactStrictModeWarnings.recordLegacyContextWarning = function(fiber, instance) {
var strictRoot = findStrictRoot(fiber);
if (strictRoot === null) {
error("Expected to find a StrictMode component in a strict mode tree. This error is likely caused by a bug in React. Please file an issue.");
return;
}
if (didWarnAboutLegacyContext.has(fiber.type)) {
return;
}
var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === "function") {
if (warningsForRoot === void 0) {
warningsForRoot = [];
pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
}
warningsForRoot.push(fiber);
}
};
ReactStrictModeWarnings.flushLegacyContextWarning = function() {
pendingLegacyContextWarning.forEach(function(fiberArray, strictRoot) {
if (fiberArray.length === 0) {
return;
}
var firstFiber = fiberArray[0];
var uniqueNames = new Set();
fiberArray.forEach(function(fiber) {
uniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
didWarnAboutLegacyContext.add(fiber.type);
});
var sortedNames = setToSortedString(uniqueNames);
try {
setCurrentFiber(firstFiber);
error("Legacy context API has been detected within a strict-mode tree.\n\nThe old API will be supported in all 16.x releases, but applications using it should migrate to the new version.\n\nPlease update the following components: %s\n\nLearn more about this warning here: https://reactjs.org/link/legacy-context", sortedNames);
} finally {
resetCurrentFiber();
}
});
};
ReactStrictModeWarnings.discardPendingWarnings = function() {
pendingComponentWillMountWarnings = [];
pendingUNSAFE_ComponentWillMountWarnings = [];
pendingComponentWillReceivePropsWarnings = [];
pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
pendingComponentWillUpdateWarnings = [];
pendingUNSAFE_ComponentWillUpdateWarnings = [];
pendingLegacyContextWarning = new Map();
};
}
function resolveDefaultProps(Component4, baseProps) {
if (Component4 && Component4.defaultProps) {
var props = assign2({}, baseProps);
var defaultProps = Component4.defaultProps;
for (var propName in defaultProps) {
if (props[propName] === void 0) {
props[propName] = defaultProps[propName];
}
}
return props;
}
return baseProps;
}
var valueCursor = createCursor(null);
var rendererSigil;
{
rendererSigil = {};
}
var currentlyRenderingFiber = null;
var lastContextDependency = null;
var lastFullyObservedContext = null;
var isDisallowedContextReadInDEV = false;
function resetContextDependencies() {
currentlyRenderingFiber = null;
lastContextDependency = null;
lastFullyObservedContext = null;
{
isDisallowedContextReadInDEV = false;
}
}
function enterDisallowedContextReadInDEV() {
{
isDisallowedContextReadInDEV = true;
}
}
function exitDisallowedContextReadInDEV() {
{
isDisallowedContextReadInDEV = false;
}
}
function pushProvider(providerFiber, context, nextValue) {
{
push(valueCursor, context._currentValue, providerFiber);
context._currentValue = nextValue;
{
if (context._currentRenderer !== void 0 && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {
error("Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported.");
}
context._currentRenderer = rendererSigil;
}
}
}
function popProvider(context, providerFiber) {
var currentValue = valueCursor.current;
pop(valueCursor, providerFiber);
{
{
context._currentValue = currentValue;
}
}
}
function scheduleContextWorkOnParentPath(parent, renderLanes2, propagationRoot) {
var node = parent;
while (node !== null) {
var alternate = node.alternate;
if (!isSubsetOfLanes(node.childLanes, renderLanes2)) {
node.childLanes = mergeLanes(node.childLanes, renderLanes2);
if (alternate !== null) {
alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes2);
}
} else if (alternate !== null && !isSubsetOfLanes(alternate.childLanes, renderLanes2)) {
alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes2);
}
if (node === propagationRoot) {
break;
}
node = node.return;
}
{
if (node !== propagationRoot) {
error("Expected to find the propagation root when scheduling context work. This error is likely caused by a bug in React. Please file an issue.");
}
}
}
function propagateContextChange(workInProgress2, context, renderLanes2) {
{
propagateContextChange_eager(workInProgress2, context, renderLanes2);
}
}
function propagateContextChange_eager(workInProgress2, context, renderLanes2) {
var fiber = workInProgress2.child;
if (fiber !== null) {
fiber.return = workInProgress2;
}
while (fiber !== null) {
var nextFiber = void 0;
var list2 = fiber.dependencies;
if (list2 !== null) {
nextFiber = fiber.child;
var dependency = list2.firstContext;
while (dependency !== null) {
if (dependency.context === context) {
if (fiber.tag === ClassComponent) {
var lane = pickArbitraryLane(renderLanes2);
var update = createUpdate(NoTimestamp, lane);
update.tag = ForceUpdate;
var updateQueue = fiber.updateQueue;
if (updateQueue === null)
;
else {
var sharedQueue = updateQueue.shared;
var pending = sharedQueue.pending;
if (pending === null) {
update.next = update;
} else {
update.next = pending.next;
pending.next = update;
}
sharedQueue.pending = update;
}
}
fiber.lanes = mergeLanes(fiber.lanes, renderLanes2);
var alternate = fiber.alternate;
if (alternate !== null) {
alternate.lanes = mergeLanes(alternate.lanes, renderLanes2);
}
scheduleContextWorkOnParentPath(fiber.return, renderLanes2, workInProgress2);
list2.lanes = mergeLanes(list2.lanes, renderLanes2);
break;
}
dependency = dependency.next;
}
} else if (fiber.tag === ContextProvider) {
nextFiber = fiber.type === workInProgress2.type ? null : fiber.child;
} else if (fiber.tag === DehydratedFragment) {
var parentSuspense = fiber.return;
if (parentSuspense === null) {
throw new Error("We just came from a parent so we must have had a parent. This is a bug in React.");
}
parentSuspense.lanes = mergeLanes(parentSuspense.lanes, renderLanes2);
var _alternate = parentSuspense.alternate;
if (_alternate !== null) {
_alternate.lanes = mergeLanes(_alternate.lanes, renderLanes2);
}
scheduleContextWorkOnParentPath(parentSuspense, renderLanes2, workInProgress2);
nextFiber = fiber.sibling;
} else {
nextFiber = fiber.child;
}
if (nextFiber !== null) {
nextFiber.return = fiber;
} else {
nextFiber = fiber;
while (nextFiber !== null) {
if (nextFiber === workInProgress2) {
nextFiber = null;
break;
}
var sibling = nextFiber.sibling;
if (sibling !== null) {
sibling.return = nextFiber.return;
nextFiber = sibling;
break;
}
nextFiber = nextFiber.return;
}
}
fiber = nextFiber;
}
}
function prepareToReadContext(workInProgress2, renderLanes2) {
currentlyRenderingFiber = workInProgress2;
lastContextDependency = null;
lastFullyObservedContext = null;
var dependencies = workInProgress2.dependencies;
if (dependencies !== null) {
{
var firstContext = dependencies.firstContext;
if (firstContext !== null) {
if (includesSomeLane(dependencies.lanes, renderLanes2)) {
markWorkInProgressReceivedUpdate();
}
dependencies.firstContext = null;
}
}
}
}
function readContext(context) {
{
if (isDisallowedContextReadInDEV) {
error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().");
}
}
var value = context._currentValue;
if (lastFullyObservedContext === context)
;
else {
var contextItem = {
context,
memoizedValue: value,
next: null
};
if (lastContextDependency === null) {
if (currentlyRenderingFiber === null) {
throw new Error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().");
}
lastContextDependency = contextItem;
currentlyRenderingFiber.dependencies = {
lanes: NoLanes,
firstContext: contextItem
};
} else {
lastContextDependency = lastContextDependency.next = contextItem;
}
}
return value;
}
var concurrentQueues = null;
function pushConcurrentUpdateQueue(queue) {
if (concurrentQueues === null) {
concurrentQueues = [queue];
} else {
concurrentQueues.push(queue);
}
}
function finishQueueingConcurrentUpdates() {
if (concurrentQueues !== null) {
for (var i = 0; i < concurrentQueues.length; i++) {
var queue = concurrentQueues[i];
var lastInterleavedUpdate = queue.interleaved;
if (lastInterleavedUpdate !== null) {
queue.interleaved = null;
var firstInterleavedUpdate = lastInterleavedUpdate.next;
var lastPendingUpdate = queue.pending;
if (lastPendingUpdate !== null) {
var firstPendingUpdate = lastPendingUpdate.next;
lastPendingUpdate.next = firstInterleavedUpdate;
lastInterleavedUpdate.next = firstPendingUpdate;
}
queue.pending = lastInterleavedUpdate;
}
}
concurrentQueues = null;
}
}
function enqueueConcurrentHookUpdate(fiber, queue, update, lane) {
var interleaved = queue.interleaved;
if (interleaved === null) {
update.next = update;
pushConcurrentUpdateQueue(queue);
} else {
update.next = interleaved.next;
interleaved.next = update;
}
queue.interleaved = update;
return markUpdateLaneFromFiberToRoot(fiber, lane);
}
function enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane) {
var interleaved = queue.interleaved;
if (interleaved === null) {
update.next = update;
pushConcurrentUpdateQueue(queue);
} else {
update.next = interleaved.next;
interleaved.next = update;
}
queue.interleaved = update;
}
function enqueueConcurrentClassUpdate(fiber, queue, update, lane) {
var interleaved = queue.interleaved;
if (interleaved === null) {
update.next = update;
pushConcurrentUpdateQueue(queue);
} else {
update.next = interleaved.next;
interleaved.next = update;
}
queue.interleaved = update;
return markUpdateLaneFromFiberToRoot(fiber, lane);
}
function enqueueConcurrentRenderForLane(fiber, lane) {
return markUpdateLaneFromFiberToRoot(fiber, lane);
}
var unsafe_markUpdateLaneFromFiberToRoot = markUpdateLaneFromFiberToRoot;
function markUpdateLaneFromFiberToRoot(sourceFiber, lane) {
sourceFiber.lanes = mergeLanes(sourceFiber.lanes, lane);
var alternate = sourceFiber.alternate;
if (alternate !== null) {
alternate.lanes = mergeLanes(alternate.lanes, lane);
}
{
if (alternate === null && (sourceFiber.flags & (Placement | Hydrating)) !== NoFlags) {
warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
}
}
var node = sourceFiber;
var parent = sourceFiber.return;
while (parent !== null) {
parent.childLanes = mergeLanes(parent.childLanes, lane);
alternate = parent.alternate;
if (alternate !== null) {
alternate.childLanes = mergeLanes(alternate.childLanes, lane);
} else {
{
if ((parent.flags & (Placement | Hydrating)) !== NoFlags) {
warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
}
}
}
node = parent;
parent = parent.return;
}
if (node.tag === HostRoot) {
var root2 = node.stateNode;
return root2;
} else {
return null;
}
}
var UpdateState = 0;
var ReplaceState = 1;
var ForceUpdate = 2;
var CaptureUpdate = 3;
var hasForceUpdate = false;
var didWarnUpdateInsideUpdate;
var currentlyProcessingQueue;
{
didWarnUpdateInsideUpdate = false;
currentlyProcessingQueue = null;
}
function initializeUpdateQueue(fiber) {
var queue = {
baseState: fiber.memoizedState,
firstBaseUpdate: null,
lastBaseUpdate: null,
shared: {
pending: null,
interleaved: null,
lanes: NoLanes
},
effects: null
};
fiber.updateQueue = queue;
}
function cloneUpdateQueue(current2, workInProgress2) {
var queue = workInProgress2.updateQueue;
var currentQueue = current2.updateQueue;
if (queue === currentQueue) {
var clone = {
baseState: currentQueue.baseState,
firstBaseUpdate: currentQueue.firstBaseUpdate,
lastBaseUpdate: currentQueue.lastBaseUpdate,
shared: currentQueue.shared,
effects: currentQueue.effects
};
workInProgress2.updateQueue = clone;
}
}
function createUpdate(eventTime, lane) {
var update = {
eventTime,
lane,
tag: UpdateState,
payload: null,
callback: null,
next: null
};
return update;
}
function enqueueUpdate(fiber, update, lane) {
var updateQueue = fiber.updateQueue;
if (updateQueue === null) {
return null;
}
var sharedQueue = updateQueue.shared;
{
if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {
error("An update (setState, replaceState, or forceUpdate) was scheduled from inside an update function. Update functions should be pure, with zero side-effects. Consider using componentDidUpdate or a callback.");
didWarnUpdateInsideUpdate = true;
}
}
if (isUnsafeClassRenderPhaseUpdate()) {
var pending = sharedQueue.pending;
if (pending === null) {
update.next = update;
} else {
update.next = pending.next;
pending.next = update;
}
sharedQueue.pending = update;
return unsafe_markUpdateLaneFromFiberToRoot(fiber, lane);
} else {
return enqueueConcurrentClassUpdate(fiber, sharedQueue, update, lane);
}
}
function entangleTransitions(root2, fiber, lane) {
var updateQueue = fiber.updateQueue;
if (updateQueue === null) {
return;
}
var sharedQueue = updateQueue.shared;
if (isTransitionLane(lane)) {
var queueLanes = sharedQueue.lanes;
queueLanes = intersectLanes(queueLanes, root2.pendingLanes);
var newQueueLanes = mergeLanes(queueLanes, lane);
sharedQueue.lanes = newQueueLanes;
markRootEntangled(root2, newQueueLanes);
}
}
function enqueueCapturedUpdate(workInProgress2, capturedUpdate) {
var queue = workInProgress2.updateQueue;
var current2 = workInProgress2.alternate;
if (current2 !== null) {
var currentQueue = current2.updateQueue;
if (queue === currentQueue) {
var newFirst = null;
var newLast = null;
var firstBaseUpdate = queue.firstBaseUpdate;
if (firstBaseUpdate !== null) {
var update = firstBaseUpdate;
do {
var clone = {
eventTime: update.eventTime,
lane: update.lane,
tag: update.tag,
payload: update.payload,
callback: update.callback,
next: null
};
if (newLast === null) {
newFirst = newLast = clone;
} else {
newLast.next = clone;
newLast = clone;
}
update = update.next;
} while (update !== null);
if (newLast === null) {
newFirst = newLast = capturedUpdate;
} else {
newLast.next = capturedUpdate;
newLast = capturedUpdate;
}
} else {
newFirst = newLast = capturedUpdate;
}
queue = {
baseState: currentQueue.baseState,
firstBaseUpdate: newFirst,
lastBaseUpdate: newLast,
shared: currentQueue.shared,
effects: currentQueue.effects
};
workInProgress2.updateQueue = queue;
return;
}
}
var lastBaseUpdate = queue.lastBaseUpdate;
if (lastBaseUpdate === null) {
queue.firstBaseUpdate = capturedUpdate;
} else {
lastBaseUpdate.next = capturedUpdate;
}
queue.lastBaseUpdate = capturedUpdate;
}
function getStateFromUpdate(workInProgress2, queue, update, prevState, nextProps, instance) {
switch (update.tag) {
case ReplaceState: {
var payload = update.payload;
if (typeof payload === "function") {
{
enterDisallowedContextReadInDEV();
}
var nextState = payload.call(instance, prevState, nextProps);
{
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
payload.call(instance, prevState, nextProps);
} finally {
setIsStrictModeForDevtools(false);
}
}
exitDisallowedContextReadInDEV();
}
return nextState;
}
return payload;
}
case CaptureUpdate: {
workInProgress2.flags = workInProgress2.flags & ~ShouldCapture | DidCapture;
}
case UpdateState: {
var _payload = update.payload;
var partialState;
if (typeof _payload === "function") {
{
enterDisallowedContextReadInDEV();
}
partialState = _payload.call(instance, prevState, nextProps);
{
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
_payload.call(instance, prevState, nextProps);
} finally {
setIsStrictModeForDevtools(false);
}
}
exitDisallowedContextReadInDEV();
}
} else {
partialState = _payload;
}
if (partialState === null || partialState === void 0) {
return prevState;
}
return assign2({}, prevState, partialState);
}
case ForceUpdate: {
hasForceUpdate = true;
return prevState;
}
}
return prevState;
}
function processUpdateQueue(workInProgress2, props, instance, renderLanes2) {
var queue = workInProgress2.updateQueue;
hasForceUpdate = false;
{
currentlyProcessingQueue = queue.shared;
}
var firstBaseUpdate = queue.firstBaseUpdate;
var lastBaseUpdate = queue.lastBaseUpdate;
var pendingQueue = queue.shared.pending;
if (pendingQueue !== null) {
queue.shared.pending = null;
var lastPendingUpdate = pendingQueue;
var firstPendingUpdate = lastPendingUpdate.next;
lastPendingUpdate.next = null;
if (lastBaseUpdate === null) {
firstBaseUpdate = firstPendingUpdate;
} else {
lastBaseUpdate.next = firstPendingUpdate;
}
lastBaseUpdate = lastPendingUpdate;
var current2 = workInProgress2.alternate;
if (current2 !== null) {
var currentQueue = current2.updateQueue;
var currentLastBaseUpdate = currentQueue.lastBaseUpdate;
if (currentLastBaseUpdate !== lastBaseUpdate) {
if (currentLastBaseUpdate === null) {
currentQueue.firstBaseUpdate = firstPendingUpdate;
} else {
currentLastBaseUpdate.next = firstPendingUpdate;
}
currentQueue.lastBaseUpdate = lastPendingUpdate;
}
}
}
if (firstBaseUpdate !== null) {
var newState = queue.baseState;
var newLanes = NoLanes;
var newBaseState = null;
var newFirstBaseUpdate = null;
var newLastBaseUpdate = null;
var update = firstBaseUpdate;
do {
var updateLane = update.lane;
var updateEventTime = update.eventTime;
if (!isSubsetOfLanes(renderLanes2, updateLane)) {
var clone = {
eventTime: updateEventTime,
lane: updateLane,
tag: update.tag,
payload: update.payload,
callback: update.callback,
next: null
};
if (newLastBaseUpdate === null) {
newFirstBaseUpdate = newLastBaseUpdate = clone;
newBaseState = newState;
} else {
newLastBaseUpdate = newLastBaseUpdate.next = clone;
}
newLanes = mergeLanes(newLanes, updateLane);
} else {
if (newLastBaseUpdate !== null) {
var _clone = {
eventTime: updateEventTime,
lane: NoLane,
tag: update.tag,
payload: update.payload,
callback: update.callback,
next: null
};
newLastBaseUpdate = newLastBaseUpdate.next = _clone;
}
newState = getStateFromUpdate(workInProgress2, queue, update, newState, props, instance);
var callback = update.callback;
if (callback !== null && update.lane !== NoLane) {
workInProgress2.flags |= Callback;
var effects = queue.effects;
if (effects === null) {
queue.effects = [update];
} else {
effects.push(update);
}
}
}
update = update.next;
if (update === null) {
pendingQueue = queue.shared.pending;
if (pendingQueue === null) {
break;
} else {
var _lastPendingUpdate = pendingQueue;
var _firstPendingUpdate = _lastPendingUpdate.next;
_lastPendingUpdate.next = null;
update = _firstPendingUpdate;
queue.lastBaseUpdate = _lastPendingUpdate;
queue.shared.pending = null;
}
}
} while (true);
if (newLastBaseUpdate === null) {
newBaseState = newState;
}
queue.baseState = newBaseState;
queue.firstBaseUpdate = newFirstBaseUpdate;
queue.lastBaseUpdate = newLastBaseUpdate;
var lastInterleaved = queue.shared.interleaved;
if (lastInterleaved !== null) {
var interleaved = lastInterleaved;
do {
newLanes = mergeLanes(newLanes, interleaved.lane);
interleaved = interleaved.next;
} while (interleaved !== lastInterleaved);
} else if (firstBaseUpdate === null) {
queue.shared.lanes = NoLanes;
}
markSkippedUpdateLanes(newLanes);
workInProgress2.lanes = newLanes;
workInProgress2.memoizedState = newState;
}
{
currentlyProcessingQueue = null;
}
}
function callCallback(callback, context) {
if (typeof callback !== "function") {
throw new Error("Invalid argument passed as callback. Expected a function. Instead " + ("received: " + callback));
}
callback.call(context);
}
function resetHasForceUpdateBeforeProcessing() {
hasForceUpdate = false;
}
function checkHasForceUpdateAfterProcessing() {
return hasForceUpdate;
}
function commitUpdateQueue(finishedWork, finishedQueue, instance) {
var effects = finishedQueue.effects;
finishedQueue.effects = null;
if (effects !== null) {
for (var i = 0; i < effects.length; i++) {
var effect = effects[i];
var callback = effect.callback;
if (callback !== null) {
effect.callback = null;
callCallback(callback, instance);
}
}
}
}
var fakeInternalInstance = {};
var emptyRefsObject = new React85.Component().refs;
var didWarnAboutStateAssignmentForComponent;
var didWarnAboutUninitializedState;
var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
var didWarnAboutLegacyLifecyclesAndDerivedState;
var didWarnAboutUndefinedDerivedState;
var warnOnUndefinedDerivedState;
var warnOnInvalidCallback;
var didWarnAboutDirectlyAssigningPropsToState;
var didWarnAboutContextTypeAndContextTypes;
var didWarnAboutInvalidateContextType;
{
didWarnAboutStateAssignmentForComponent = new Set();
didWarnAboutUninitializedState = new Set();
didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
didWarnAboutDirectlyAssigningPropsToState = new Set();
didWarnAboutUndefinedDerivedState = new Set();
didWarnAboutContextTypeAndContextTypes = new Set();
didWarnAboutInvalidateContextType = new Set();
var didWarnOnInvalidCallback = new Set();
warnOnInvalidCallback = function(callback, callerName) {
if (callback === null || typeof callback === "function") {
return;
}
var key = callerName + "_" + callback;
if (!didWarnOnInvalidCallback.has(key)) {
didWarnOnInvalidCallback.add(key);
error("%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.", callerName, callback);
}
};
warnOnUndefinedDerivedState = function(type, partialState) {
if (partialState === void 0) {
var componentName = getComponentNameFromType(type) || "Component";
if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
didWarnAboutUndefinedDerivedState.add(componentName);
error("%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. You have returned undefined.", componentName);
}
}
};
Object.defineProperty(fakeInternalInstance, "_processChildContext", {
enumerable: false,
value: function() {
throw new Error("_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).");
}
});
Object.freeze(fakeInternalInstance);
}
function applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, nextProps) {
var prevState = workInProgress2.memoizedState;
var partialState = getDerivedStateFromProps(nextProps, prevState);
{
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
partialState = getDerivedStateFromProps(nextProps, prevState);
} finally {
setIsStrictModeForDevtools(false);
}
}
warnOnUndefinedDerivedState(ctor, partialState);
}
var memoizedState = partialState === null || partialState === void 0 ? prevState : assign2({}, prevState, partialState);
workInProgress2.memoizedState = memoizedState;
if (workInProgress2.lanes === NoLanes) {
var updateQueue = workInProgress2.updateQueue;
updateQueue.baseState = memoizedState;
}
}
var classComponentUpdater = {
isMounted,
enqueueSetState: function(inst, payload, callback) {
var fiber = get(inst);
var eventTime = requestEventTime();
var lane = requestUpdateLane(fiber);
var update = createUpdate(eventTime, lane);
update.payload = payload;
if (callback !== void 0 && callback !== null) {
{
warnOnInvalidCallback(callback, "setState");
}
update.callback = callback;
}
var root2 = enqueueUpdate(fiber, update, lane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, lane, eventTime);
entangleTransitions(root2, fiber, lane);
}
{
markStateUpdateScheduled(fiber, lane);
}
},
enqueueReplaceState: function(inst, payload, callback) {
var fiber = get(inst);
var eventTime = requestEventTime();
var lane = requestUpdateLane(fiber);
var update = createUpdate(eventTime, lane);
update.tag = ReplaceState;
update.payload = payload;
if (callback !== void 0 && callback !== null) {
{
warnOnInvalidCallback(callback, "replaceState");
}
update.callback = callback;
}
var root2 = enqueueUpdate(fiber, update, lane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, lane, eventTime);
entangleTransitions(root2, fiber, lane);
}
{
markStateUpdateScheduled(fiber, lane);
}
},
enqueueForceUpdate: function(inst, callback) {
var fiber = get(inst);
var eventTime = requestEventTime();
var lane = requestUpdateLane(fiber);
var update = createUpdate(eventTime, lane);
update.tag = ForceUpdate;
if (callback !== void 0 && callback !== null) {
{
warnOnInvalidCallback(callback, "forceUpdate");
}
update.callback = callback;
}
var root2 = enqueueUpdate(fiber, update, lane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, lane, eventTime);
entangleTransitions(root2, fiber, lane);
}
{
markForceUpdateScheduled(fiber, lane);
}
}
};
function checkShouldComponentUpdate(workInProgress2, ctor, oldProps, newProps, oldState, newState, nextContext) {
var instance = workInProgress2.stateNode;
if (typeof instance.shouldComponentUpdate === "function") {
var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
{
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
} finally {
setIsStrictModeForDevtools(false);
}
}
if (shouldUpdate === void 0) {
error("%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.", getComponentNameFromType(ctor) || "Component");
}
}
return shouldUpdate;
}
if (ctor.prototype && ctor.prototype.isPureReactComponent) {
return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
}
return true;
}
function checkClassInstance(workInProgress2, ctor, newProps) {
var instance = workInProgress2.stateNode;
{
var name = getComponentNameFromType(ctor) || "Component";
var renderPresent = instance.render;
if (!renderPresent) {
if (ctor.prototype && typeof ctor.prototype.render === "function") {
error("%s(...): No `render` method found on the returned component instance: did you accidentally return an object from the constructor?", name);
} else {
error("%s(...): No `render` method found on the returned component instance: you may have forgotten to define `render`.", name);
}
}
if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {
error("getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?", name);
}
if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {
error("getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.", name);
}
if (instance.propTypes) {
error("propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.", name);
}
if (instance.contextType) {
error("contextType was defined as an instance property on %s. Use a static property to define contextType instead.", name);
}
{
if (instance.contextTypes) {
error("contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.", name);
}
if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
didWarnAboutContextTypeAndContextTypes.add(ctor);
error("%s declares both contextTypes and contextType static properties. The legacy contextTypes property will be ignored.", name);
}
}
if (typeof instance.componentShouldUpdate === "function") {
error("%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", name);
}
if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== "undefined") {
error("%s has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.", getComponentNameFromType(ctor) || "A pure component");
}
if (typeof instance.componentDidUnmount === "function") {
error("%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?", name);
}
if (typeof instance.componentDidReceiveProps === "function") {
error("%s has a method called componentDidReceiveProps(). But there is no such lifecycle method. If you meant to update the state in response to changing props, use componentWillReceiveProps(). If you meant to fetch data or run side-effects or mutations after React has updated the UI, use componentDidUpdate().", name);
}
if (typeof instance.componentWillRecieveProps === "function") {
error("%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?", name);
}
if (typeof instance.UNSAFE_componentWillRecieveProps === "function") {
error("%s has a method called UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?", name);
}
var hasMutatedProps = instance.props !== newProps;
if (instance.props !== void 0 && hasMutatedProps) {
error("%s(...): When calling super() in `%s`, make sure to pass up the same props that your component's constructor was passed.", name, name);
}
if (instance.defaultProps) {
error("Setting defaultProps as an instance property on %s is not supported and will be ignored. Instead, define defaultProps as a static property on %s.", name, name);
}
if (typeof instance.getSnapshotBeforeUpdate === "function" && typeof instance.componentDidUpdate !== "function" && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
error("%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). This component defines getSnapshotBeforeUpdate() only.", getComponentNameFromType(ctor));
}
if (typeof instance.getDerivedStateFromProps === "function") {
error("%s: getDerivedStateFromProps() is defined as an instance method and will be ignored. Instead, declare it as a static method.", name);
}
if (typeof instance.getDerivedStateFromError === "function") {
error("%s: getDerivedStateFromError() is defined as an instance method and will be ignored. Instead, declare it as a static method.", name);
}
if (typeof ctor.getSnapshotBeforeUpdate === "function") {
error("%s: getSnapshotBeforeUpdate() is defined as a static method and will be ignored. Instead, declare it as an instance method.", name);
}
var _state = instance.state;
if (_state && (typeof _state !== "object" || isArray3(_state))) {
error("%s.state: must be set to an object or null", name);
}
if (typeof instance.getChildContext === "function" && typeof ctor.childContextTypes !== "object") {
error("%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().", name);
}
}
}
function adoptClassInstance(workInProgress2, instance) {
instance.updater = classComponentUpdater;
workInProgress2.stateNode = instance;
set(instance, workInProgress2);
{
instance._reactInternalInstance = fakeInternalInstance;
}
}
function constructClassInstance(workInProgress2, ctor, props) {
var isLegacyContextConsumer = false;
var unmaskedContext = emptyContextObject;
var context = emptyContextObject;
var contextType = ctor.contextType;
{
if ("contextType" in ctor) {
var isValid = contextType === null || contextType !== void 0 && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === void 0;
if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {
didWarnAboutInvalidateContextType.add(ctor);
var addendum = "";
if (contextType === void 0) {
addendum = " However, it is set to undefined. This can be caused by a typo or by mixing up named and default imports. This can also happen due to a circular dependency, so try moving the createContext() call to a separate file.";
} else if (typeof contextType !== "object") {
addendum = " However, it is set to a " + typeof contextType + ".";
} else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
addendum = " Did you accidentally pass the Context.Provider instead?";
} else if (contextType._context !== void 0) {
addendum = " Did you accidentally pass the Context.Consumer instead?";
} else {
addendum = " However, it is set to an object with keys {" + Object.keys(contextType).join(", ") + "}.";
}
error("%s defines an invalid contextType. contextType should point to the Context object returned by React.createContext().%s", getComponentNameFromType(ctor) || "Component", addendum);
}
}
}
if (typeof contextType === "object" && contextType !== null) {
context = readContext(contextType);
} else {
unmaskedContext = getUnmaskedContext(workInProgress2, ctor, true);
var contextTypes = ctor.contextTypes;
isLegacyContextConsumer = contextTypes !== null && contextTypes !== void 0;
context = isLegacyContextConsumer ? getMaskedContext(workInProgress2, unmaskedContext) : emptyContextObject;
}
var instance = new ctor(props, context);
{
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
instance = new ctor(props, context);
} finally {
setIsStrictModeForDevtools(false);
}
}
}
var state = workInProgress2.memoizedState = instance.state !== null && instance.state !== void 0 ? instance.state : null;
adoptClassInstance(workInProgress2, instance);
{
if (typeof ctor.getDerivedStateFromProps === "function" && state === null) {
var componentName = getComponentNameFromType(ctor) || "Component";
if (!didWarnAboutUninitializedState.has(componentName)) {
didWarnAboutUninitializedState.add(componentName);
error("`%s` uses `getDerivedStateFromProps` but its initial state is %s. This is not recommended. Instead, define the initial state by assigning an object to `this.state` in the constructor of `%s`. This ensures that `getDerivedStateFromProps` arguments have a consistent shape.", componentName, instance.state === null ? "null" : "undefined", componentName);
}
}
if (typeof ctor.getDerivedStateFromProps === "function" || typeof instance.getSnapshotBeforeUpdate === "function") {
var foundWillMountName = null;
var foundWillReceivePropsName = null;
var foundWillUpdateName = null;
if (typeof instance.componentWillMount === "function" && instance.componentWillMount.__suppressDeprecationWarning !== true) {
foundWillMountName = "componentWillMount";
} else if (typeof instance.UNSAFE_componentWillMount === "function") {
foundWillMountName = "UNSAFE_componentWillMount";
}
if (typeof instance.componentWillReceiveProps === "function" && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
foundWillReceivePropsName = "componentWillReceiveProps";
} else if (typeof instance.UNSAFE_componentWillReceiveProps === "function") {
foundWillReceivePropsName = "UNSAFE_componentWillReceiveProps";
}
if (typeof instance.componentWillUpdate === "function" && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
foundWillUpdateName = "componentWillUpdate";
} else if (typeof instance.UNSAFE_componentWillUpdate === "function") {
foundWillUpdateName = "UNSAFE_componentWillUpdate";
}
if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
var _componentName = getComponentNameFromType(ctor) || "Component";
var newApiName = typeof ctor.getDerivedStateFromProps === "function" ? "getDerivedStateFromProps()" : "getSnapshotBeforeUpdate()";
if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://reactjs.org/link/unsafe-component-lifecycles", _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : "", foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : "", foundWillUpdateName !== null ? "\n " + foundWillUpdateName : "");
}
}
}
}
if (isLegacyContextConsumer) {
cacheContext(workInProgress2, unmaskedContext, context);
}
return instance;
}
function callComponentWillMount(workInProgress2, instance) {
var oldState = instance.state;
if (typeof instance.componentWillMount === "function") {
instance.componentWillMount();
}
if (typeof instance.UNSAFE_componentWillMount === "function") {
instance.UNSAFE_componentWillMount();
}
if (oldState !== instance.state) {
{
error("%s.componentWillMount(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", getComponentNameFromFiber(workInProgress2) || "Component");
}
classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
}
}
function callComponentWillReceiveProps(workInProgress2, instance, newProps, nextContext) {
var oldState = instance.state;
if (typeof instance.componentWillReceiveProps === "function") {
instance.componentWillReceiveProps(newProps, nextContext);
}
if (typeof instance.UNSAFE_componentWillReceiveProps === "function") {
instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
}
if (instance.state !== oldState) {
{
var componentName = getComponentNameFromFiber(workInProgress2) || "Component";
if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
didWarnAboutStateAssignmentForComponent.add(componentName);
error("%s.componentWillReceiveProps(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", componentName);
}
}
classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
}
}
function mountClassInstance(workInProgress2, ctor, newProps, renderLanes2) {
{
checkClassInstance(workInProgress2, ctor, newProps);
}
var instance = workInProgress2.stateNode;
instance.props = newProps;
instance.state = workInProgress2.memoizedState;
instance.refs = emptyRefsObject;
initializeUpdateQueue(workInProgress2);
var contextType = ctor.contextType;
if (typeof contextType === "object" && contextType !== null) {
instance.context = readContext(contextType);
} else {
var unmaskedContext = getUnmaskedContext(workInProgress2, ctor, true);
instance.context = getMaskedContext(workInProgress2, unmaskedContext);
}
{
if (instance.state === newProps) {
var componentName = getComponentNameFromType(ctor) || "Component";
if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
didWarnAboutDirectlyAssigningPropsToState.add(componentName);
error("%s: It is not recommended to assign props directly to state because updates to props won't be reflected in state. In most cases, it is better to use props directly.", componentName);
}
}
if (workInProgress2.mode & StrictLegacyMode) {
ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress2, instance);
}
{
ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress2, instance);
}
}
instance.state = workInProgress2.memoizedState;
var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
if (typeof getDerivedStateFromProps === "function") {
applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, newProps);
instance.state = workInProgress2.memoizedState;
}
if (typeof ctor.getDerivedStateFromProps !== "function" && typeof instance.getSnapshotBeforeUpdate !== "function" && (typeof instance.UNSAFE_componentWillMount === "function" || typeof instance.componentWillMount === "function")) {
callComponentWillMount(workInProgress2, instance);
processUpdateQueue(workInProgress2, newProps, instance, renderLanes2);
instance.state = workInProgress2.memoizedState;
}
if (typeof instance.componentDidMount === "function") {
var fiberFlags = Update;
{
fiberFlags |= LayoutStatic;
}
if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) {
fiberFlags |= MountLayoutDev;
}
workInProgress2.flags |= fiberFlags;
}
}
function resumeMountClassInstance(workInProgress2, ctor, newProps, renderLanes2) {
var instance = workInProgress2.stateNode;
var oldProps = workInProgress2.memoizedProps;
instance.props = oldProps;
var oldContext = instance.context;
var contextType = ctor.contextType;
var nextContext = emptyContextObject;
if (typeof contextType === "object" && contextType !== null) {
nextContext = readContext(contextType);
} else {
var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress2, ctor, true);
nextContext = getMaskedContext(workInProgress2, nextLegacyUnmaskedContext);
}
var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
var hasNewLifecycles = typeof getDerivedStateFromProps === "function" || typeof instance.getSnapshotBeforeUpdate === "function";
if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === "function" || typeof instance.componentWillReceiveProps === "function")) {
if (oldProps !== newProps || oldContext !== nextContext) {
callComponentWillReceiveProps(workInProgress2, instance, newProps, nextContext);
}
}
resetHasForceUpdateBeforeProcessing();
var oldState = workInProgress2.memoizedState;
var newState = instance.state = oldState;
processUpdateQueue(workInProgress2, newProps, instance, renderLanes2);
newState = workInProgress2.memoizedState;
if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
if (typeof instance.componentDidMount === "function") {
var fiberFlags = Update;
{
fiberFlags |= LayoutStatic;
}
if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) {
fiberFlags |= MountLayoutDev;
}
workInProgress2.flags |= fiberFlags;
}
return false;
}
if (typeof getDerivedStateFromProps === "function") {
applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, newProps);
newState = workInProgress2.memoizedState;
}
var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress2, ctor, oldProps, newProps, oldState, newState, nextContext);
if (shouldUpdate) {
if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === "function" || typeof instance.componentWillMount === "function")) {
if (typeof instance.componentWillMount === "function") {
instance.componentWillMount();
}
if (typeof instance.UNSAFE_componentWillMount === "function") {
instance.UNSAFE_componentWillMount();
}
}
if (typeof instance.componentDidMount === "function") {
var _fiberFlags = Update;
{
_fiberFlags |= LayoutStatic;
}
if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) {
_fiberFlags |= MountLayoutDev;
}
workInProgress2.flags |= _fiberFlags;
}
} else {
if (typeof instance.componentDidMount === "function") {
var _fiberFlags2 = Update;
{
_fiberFlags2 |= LayoutStatic;
}
if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) {
_fiberFlags2 |= MountLayoutDev;
}
workInProgress2.flags |= _fiberFlags2;
}
workInProgress2.memoizedProps = newProps;
workInProgress2.memoizedState = newState;
}
instance.props = newProps;
instance.state = newState;
instance.context = nextContext;
return shouldUpdate;
}
function updateClassInstance(current2, workInProgress2, ctor, newProps, renderLanes2) {
var instance = workInProgress2.stateNode;
cloneUpdateQueue(current2, workInProgress2);
var unresolvedOldProps = workInProgress2.memoizedProps;
var oldProps = workInProgress2.type === workInProgress2.elementType ? unresolvedOldProps : resolveDefaultProps(workInProgress2.type, unresolvedOldProps);
instance.props = oldProps;
var unresolvedNewProps = workInProgress2.pendingProps;
var oldContext = instance.context;
var contextType = ctor.contextType;
var nextContext = emptyContextObject;
if (typeof contextType === "object" && contextType !== null) {
nextContext = readContext(contextType);
} else {
var nextUnmaskedContext = getUnmaskedContext(workInProgress2, ctor, true);
nextContext = getMaskedContext(workInProgress2, nextUnmaskedContext);
}
var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
var hasNewLifecycles = typeof getDerivedStateFromProps === "function" || typeof instance.getSnapshotBeforeUpdate === "function";
if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === "function" || typeof instance.componentWillReceiveProps === "function")) {
if (unresolvedOldProps !== unresolvedNewProps || oldContext !== nextContext) {
callComponentWillReceiveProps(workInProgress2, instance, newProps, nextContext);
}
}
resetHasForceUpdateBeforeProcessing();
var oldState = workInProgress2.memoizedState;
var newState = instance.state = oldState;
processUpdateQueue(workInProgress2, newProps, instance, renderLanes2);
newState = workInProgress2.memoizedState;
if (unresolvedOldProps === unresolvedNewProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing() && !enableLazyContextPropagation) {
if (typeof instance.componentDidUpdate === "function") {
if (unresolvedOldProps !== current2.memoizedProps || oldState !== current2.memoizedState) {
workInProgress2.flags |= Update;
}
}
if (typeof instance.getSnapshotBeforeUpdate === "function") {
if (unresolvedOldProps !== current2.memoizedProps || oldState !== current2.memoizedState) {
workInProgress2.flags |= Snapshot;
}
}
return false;
}
if (typeof getDerivedStateFromProps === "function") {
applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, newProps);
newState = workInProgress2.memoizedState;
}
var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress2, ctor, oldProps, newProps, oldState, newState, nextContext) || enableLazyContextPropagation;
if (shouldUpdate) {
if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === "function" || typeof instance.componentWillUpdate === "function")) {
if (typeof instance.componentWillUpdate === "function") {
instance.componentWillUpdate(newProps, newState, nextContext);
}
if (typeof instance.UNSAFE_componentWillUpdate === "function") {
instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
}
}
if (typeof instance.componentDidUpdate === "function") {
workInProgress2.flags |= Update;
}
if (typeof instance.getSnapshotBeforeUpdate === "function") {
workInProgress2.flags |= Snapshot;
}
} else {
if (typeof instance.componentDidUpdate === "function") {
if (unresolvedOldProps !== current2.memoizedProps || oldState !== current2.memoizedState) {
workInProgress2.flags |= Update;
}
}
if (typeof instance.getSnapshotBeforeUpdate === "function") {
if (unresolvedOldProps !== current2.memoizedProps || oldState !== current2.memoizedState) {
workInProgress2.flags |= Snapshot;
}
}
workInProgress2.memoizedProps = newProps;
workInProgress2.memoizedState = newState;
}
instance.props = newProps;
instance.state = newState;
instance.context = nextContext;
return shouldUpdate;
}
var didWarnAboutMaps;
var didWarnAboutGenerators;
var didWarnAboutStringRefs;
var ownerHasKeyUseWarning;
var ownerHasFunctionTypeWarning;
var warnForMissingKey = function(child, returnFiber) {
};
{
didWarnAboutMaps = false;
didWarnAboutGenerators = false;
didWarnAboutStringRefs = {};
ownerHasKeyUseWarning = {};
ownerHasFunctionTypeWarning = {};
warnForMissingKey = function(child, returnFiber) {
if (child === null || typeof child !== "object") {
return;
}
if (!child._store || child._store.validated || child.key != null) {
return;
}
if (typeof child._store !== "object") {
throw new Error("React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.");
}
child._store.validated = true;
var componentName = getComponentNameFromFiber(returnFiber) || "Component";
if (ownerHasKeyUseWarning[componentName]) {
return;
}
ownerHasKeyUseWarning[componentName] = true;
error('Each child in a list should have a unique "key" prop. See https://reactjs.org/link/warning-keys for more information.');
};
}
function coerceRef(returnFiber, current2, element) {
var mixedRef = element.ref;
if (mixedRef !== null && typeof mixedRef !== "function" && typeof mixedRef !== "object") {
{
if ((returnFiber.mode & StrictLegacyMode || warnAboutStringRefs) && !(element._owner && element._self && element._owner.stateNode !== element._self)) {
var componentName = getComponentNameFromFiber(returnFiber) || "Component";
if (!didWarnAboutStringRefs[componentName]) {
{
error('A string ref, "%s", has been found within a strict mode tree. String refs are a source of potential bugs and should be avoided. We recommend using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', mixedRef);
}
didWarnAboutStringRefs[componentName] = true;
}
}
}
if (element._owner) {
var owner = element._owner;
var inst;
if (owner) {
var ownerFiber = owner;
if (ownerFiber.tag !== ClassComponent) {
throw new Error("Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref");
}
inst = ownerFiber.stateNode;
}
if (!inst) {
throw new Error("Missing owner for string ref " + mixedRef + ". This error is likely caused by a bug in React. Please file an issue.");
}
var resolvedInst = inst;
{
checkPropStringCoercion(mixedRef, "ref");
}
var stringRef = "" + mixedRef;
if (current2 !== null && current2.ref !== null && typeof current2.ref === "function" && current2.ref._stringRef === stringRef) {
return current2.ref;
}
var ref = function(value) {
var refs = resolvedInst.refs;
if (refs === emptyRefsObject) {
refs = resolvedInst.refs = {};
}
if (value === null) {
delete refs[stringRef];
} else {
refs[stringRef] = value;
}
};
ref._stringRef = stringRef;
return ref;
} else {
if (typeof mixedRef !== "string") {
throw new Error("Expected ref to be a function, a string, an object returned by React.createRef(), or null.");
}
if (!element._owner) {
throw new Error("Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://reactjs.org/link/refs-must-have-owner for more information.");
}
}
}
return mixedRef;
}
function throwOnInvalidObjectType(returnFiber, newChild) {
var childString = Object.prototype.toString.call(newChild);
throw new Error("Objects are not valid as a React child (found: " + (childString === "[object Object]" ? "object with keys {" + Object.keys(newChild).join(", ") + "}" : childString) + "). If you meant to render a collection of children, use an array instead.");
}
function warnOnFunctionType(returnFiber) {
{
var componentName = getComponentNameFromFiber(returnFiber) || "Component";
if (ownerHasFunctionTypeWarning[componentName]) {
return;
}
ownerHasFunctionTypeWarning[componentName] = true;
error("Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.");
}
}
function resolveLazy(lazyType) {
var payload = lazyType._payload;
var init = lazyType._init;
return init(payload);
}
function ChildReconciler(shouldTrackSideEffects) {
function deleteChild(returnFiber, childToDelete) {
if (!shouldTrackSideEffects) {
return;
}
var deletions = returnFiber.deletions;
if (deletions === null) {
returnFiber.deletions = [childToDelete];
returnFiber.flags |= ChildDeletion;
} else {
deletions.push(childToDelete);
}
}
function deleteRemainingChildren(returnFiber, currentFirstChild) {
if (!shouldTrackSideEffects) {
return null;
}
var childToDelete = currentFirstChild;
while (childToDelete !== null) {
deleteChild(returnFiber, childToDelete);
childToDelete = childToDelete.sibling;
}
return null;
}
function mapRemainingChildren(returnFiber, currentFirstChild) {
var existingChildren = new Map();
var existingChild = currentFirstChild;
while (existingChild !== null) {
if (existingChild.key !== null) {
existingChildren.set(existingChild.key, existingChild);
} else {
existingChildren.set(existingChild.index, existingChild);
}
existingChild = existingChild.sibling;
}
return existingChildren;
}
function useFiber(fiber, pendingProps) {
var clone = createWorkInProgress(fiber, pendingProps);
clone.index = 0;
clone.sibling = null;
return clone;
}
function placeChild(newFiber, lastPlacedIndex, newIndex) {
newFiber.index = newIndex;
if (!shouldTrackSideEffects) {
newFiber.flags |= Forked;
return lastPlacedIndex;
}
var current2 = newFiber.alternate;
if (current2 !== null) {
var oldIndex = current2.index;
if (oldIndex < lastPlacedIndex) {
newFiber.flags |= Placement;
return lastPlacedIndex;
} else {
return oldIndex;
}
} else {
newFiber.flags |= Placement;
return lastPlacedIndex;
}
}
function placeSingleChild(newFiber) {
if (shouldTrackSideEffects && newFiber.alternate === null) {
newFiber.flags |= Placement;
}
return newFiber;
}
function updateTextNode(returnFiber, current2, textContent, lanes) {
if (current2 === null || current2.tag !== HostText) {
var created = createFiberFromText(textContent, returnFiber.mode, lanes);
created.return = returnFiber;
return created;
} else {
var existing = useFiber(current2, textContent);
existing.return = returnFiber;
return existing;
}
}
function updateElement(returnFiber, current2, element, lanes) {
var elementType = element.type;
if (elementType === REACT_FRAGMENT_TYPE2) {
return updateFragment2(returnFiber, current2, element.props.children, lanes, element.key);
}
if (current2 !== null) {
if (current2.elementType === elementType || isCompatibleFamilyForHotReloading(current2, element) || typeof elementType === "object" && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === current2.type) {
var existing = useFiber(current2, element.props);
existing.ref = coerceRef(returnFiber, current2, element);
existing.return = returnFiber;
{
existing._debugSource = element._source;
existing._debugOwner = element._owner;
}
return existing;
}
}
var created = createFiberFromElement(element, returnFiber.mode, lanes);
created.ref = coerceRef(returnFiber, current2, element);
created.return = returnFiber;
return created;
}
function updatePortal(returnFiber, current2, portal, lanes) {
if (current2 === null || current2.tag !== HostPortal || current2.stateNode.containerInfo !== portal.containerInfo || current2.stateNode.implementation !== portal.implementation) {
var created = createFiberFromPortal(portal, returnFiber.mode, lanes);
created.return = returnFiber;
return created;
} else {
var existing = useFiber(current2, portal.children || []);
existing.return = returnFiber;
return existing;
}
}
function updateFragment2(returnFiber, current2, fragment, lanes, key) {
if (current2 === null || current2.tag !== Fragment) {
var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key);
created.return = returnFiber;
return created;
} else {
var existing = useFiber(current2, fragment);
existing.return = returnFiber;
return existing;
}
}
function createChild(returnFiber, newChild, lanes) {
if (typeof newChild === "string" && newChild !== "" || typeof newChild === "number") {
var created = createFiberFromText("" + newChild, returnFiber.mode, lanes);
created.return = returnFiber;
return created;
}
if (typeof newChild === "object" && newChild !== null) {
switch (newChild.$$typeof) {
case REACT_ELEMENT_TYPE: {
var _created = createFiberFromElement(newChild, returnFiber.mode, lanes);
_created.ref = coerceRef(returnFiber, null, newChild);
_created.return = returnFiber;
return _created;
}
case REACT_PORTAL_TYPE: {
var _created2 = createFiberFromPortal(newChild, returnFiber.mode, lanes);
_created2.return = returnFiber;
return _created2;
}
case REACT_LAZY_TYPE: {
var payload = newChild._payload;
var init = newChild._init;
return createChild(returnFiber, init(payload), lanes);
}
}
if (isArray3(newChild) || getIteratorFn(newChild)) {
var _created3 = createFiberFromFragment(newChild, returnFiber.mode, lanes, null);
_created3.return = returnFiber;
return _created3;
}
throwOnInvalidObjectType(returnFiber, newChild);
}
{
if (typeof newChild === "function") {
warnOnFunctionType(returnFiber);
}
}
return null;
}
function updateSlot(returnFiber, oldFiber, newChild, lanes) {
var key = oldFiber !== null ? oldFiber.key : null;
if (typeof newChild === "string" && newChild !== "" || typeof newChild === "number") {
if (key !== null) {
return null;
}
return updateTextNode(returnFiber, oldFiber, "" + newChild, lanes);
}
if (typeof newChild === "object" && newChild !== null) {
switch (newChild.$$typeof) {
case REACT_ELEMENT_TYPE: {
if (newChild.key === key) {
return updateElement(returnFiber, oldFiber, newChild, lanes);
} else {
return null;
}
}
case REACT_PORTAL_TYPE: {
if (newChild.key === key) {
return updatePortal(returnFiber, oldFiber, newChild, lanes);
} else {
return null;
}
}
case REACT_LAZY_TYPE: {
var payload = newChild._payload;
var init = newChild._init;
return updateSlot(returnFiber, oldFiber, init(payload), lanes);
}
}
if (isArray3(newChild) || getIteratorFn(newChild)) {
if (key !== null) {
return null;
}
return updateFragment2(returnFiber, oldFiber, newChild, lanes, null);
}
throwOnInvalidObjectType(returnFiber, newChild);
}
{
if (typeof newChild === "function") {
warnOnFunctionType(returnFiber);
}
}
return null;
}
function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) {
if (typeof newChild === "string" && newChild !== "" || typeof newChild === "number") {
var matchedFiber = existingChildren.get(newIdx) || null;
return updateTextNode(returnFiber, matchedFiber, "" + newChild, lanes);
}
if (typeof newChild === "object" && newChild !== null) {
switch (newChild.$$typeof) {
case REACT_ELEMENT_TYPE: {
var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
return updateElement(returnFiber, _matchedFiber, newChild, lanes);
}
case REACT_PORTAL_TYPE: {
var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
return updatePortal(returnFiber, _matchedFiber2, newChild, lanes);
}
case REACT_LAZY_TYPE:
var payload = newChild._payload;
var init = newChild._init;
return updateFromMap(existingChildren, returnFiber, newIdx, init(payload), lanes);
}
if (isArray3(newChild) || getIteratorFn(newChild)) {
var _matchedFiber3 = existingChildren.get(newIdx) || null;
return updateFragment2(returnFiber, _matchedFiber3, newChild, lanes, null);
}
throwOnInvalidObjectType(returnFiber, newChild);
}
{
if (typeof newChild === "function") {
warnOnFunctionType(returnFiber);
}
}
return null;
}
function warnOnInvalidKey(child, knownKeys, returnFiber) {
{
if (typeof child !== "object" || child === null) {
return knownKeys;
}
switch (child.$$typeof) {
case REACT_ELEMENT_TYPE:
case REACT_PORTAL_TYPE:
warnForMissingKey(child, returnFiber);
var key = child.key;
if (typeof key !== "string") {
break;
}
if (knownKeys === null) {
knownKeys = new Set();
knownKeys.add(key);
break;
}
if (!knownKeys.has(key)) {
knownKeys.add(key);
break;
}
error("Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted \u2014 the behavior is unsupported and could change in a future version.", key);
break;
case REACT_LAZY_TYPE:
var payload = child._payload;
var init = child._init;
warnOnInvalidKey(init(payload), knownKeys, returnFiber);
break;
}
}
return knownKeys;
}
function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) {
{
var knownKeys = null;
for (var i = 0; i < newChildren.length; i++) {
var child = newChildren[i];
knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber);
}
}
var resultingFirstChild = null;
var previousNewFiber = null;
var oldFiber = currentFirstChild;
var lastPlacedIndex = 0;
var newIdx = 0;
var nextOldFiber = null;
for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
if (oldFiber.index > newIdx) {
nextOldFiber = oldFiber;
oldFiber = null;
} else {
nextOldFiber = oldFiber.sibling;
}
var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes);
if (newFiber === null) {
if (oldFiber === null) {
oldFiber = nextOldFiber;
}
break;
}
if (shouldTrackSideEffects) {
if (oldFiber && newFiber.alternate === null) {
deleteChild(returnFiber, oldFiber);
}
}
lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
if (previousNewFiber === null) {
resultingFirstChild = newFiber;
} else {
previousNewFiber.sibling = newFiber;
}
previousNewFiber = newFiber;
oldFiber = nextOldFiber;
}
if (newIdx === newChildren.length) {
deleteRemainingChildren(returnFiber, oldFiber);
if (getIsHydrating()) {
var numberOfForks = newIdx;
pushTreeFork(returnFiber, numberOfForks);
}
return resultingFirstChild;
}
if (oldFiber === null) {
for (; newIdx < newChildren.length; newIdx++) {
var _newFiber = createChild(returnFiber, newChildren[newIdx], lanes);
if (_newFiber === null) {
continue;
}
lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
if (previousNewFiber === null) {
resultingFirstChild = _newFiber;
} else {
previousNewFiber.sibling = _newFiber;
}
previousNewFiber = _newFiber;
}
if (getIsHydrating()) {
var _numberOfForks = newIdx;
pushTreeFork(returnFiber, _numberOfForks);
}
return resultingFirstChild;
}
var existingChildren = mapRemainingChildren(returnFiber, oldFiber);
for (; newIdx < newChildren.length; newIdx++) {
var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], lanes);
if (_newFiber2 !== null) {
if (shouldTrackSideEffects) {
if (_newFiber2.alternate !== null) {
existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
}
}
lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
if (previousNewFiber === null) {
resultingFirstChild = _newFiber2;
} else {
previousNewFiber.sibling = _newFiber2;
}
previousNewFiber = _newFiber2;
}
}
if (shouldTrackSideEffects) {
existingChildren.forEach(function(child2) {
return deleteChild(returnFiber, child2);
});
}
if (getIsHydrating()) {
var _numberOfForks2 = newIdx;
pushTreeFork(returnFiber, _numberOfForks2);
}
return resultingFirstChild;
}
function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, lanes) {
var iteratorFn = getIteratorFn(newChildrenIterable);
if (typeof iteratorFn !== "function") {
throw new Error("An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.");
}
{
if (typeof Symbol === "function" && newChildrenIterable[Symbol.toStringTag] === "Generator") {
if (!didWarnAboutGenerators) {
error("Using Generators as children is unsupported and will likely yield unexpected results because enumerating a generator mutates it. You may convert it to an array with `Array.from()` or the `[...spread]` operator before rendering. Keep in mind you might need to polyfill these features for older browsers.");
}
didWarnAboutGenerators = true;
}
if (newChildrenIterable.entries === iteratorFn) {
if (!didWarnAboutMaps) {
error("Using Maps as children is not supported. Use an array of keyed ReactElements instead.");
}
didWarnAboutMaps = true;
}
var _newChildren = iteratorFn.call(newChildrenIterable);
if (_newChildren) {
var knownKeys = null;
var _step = _newChildren.next();
for (; !_step.done; _step = _newChildren.next()) {
var child = _step.value;
knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber);
}
}
}
var newChildren = iteratorFn.call(newChildrenIterable);
if (newChildren == null) {
throw new Error("An iterable object provided no iterator.");
}
var resultingFirstChild = null;
var previousNewFiber = null;
var oldFiber = currentFirstChild;
var lastPlacedIndex = 0;
var newIdx = 0;
var nextOldFiber = null;
var step = newChildren.next();
for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
if (oldFiber.index > newIdx) {
nextOldFiber = oldFiber;
oldFiber = null;
} else {
nextOldFiber = oldFiber.sibling;
}
var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);
if (newFiber === null) {
if (oldFiber === null) {
oldFiber = nextOldFiber;
}
break;
}
if (shouldTrackSideEffects) {
if (oldFiber && newFiber.alternate === null) {
deleteChild(returnFiber, oldFiber);
}
}
lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
if (previousNewFiber === null) {
resultingFirstChild = newFiber;
} else {
previousNewFiber.sibling = newFiber;
}
previousNewFiber = newFiber;
oldFiber = nextOldFiber;
}
if (step.done) {
deleteRemainingChildren(returnFiber, oldFiber);
if (getIsHydrating()) {
var numberOfForks = newIdx;
pushTreeFork(returnFiber, numberOfForks);
}
return resultingFirstChild;
}
if (oldFiber === null) {
for (; !step.done; newIdx++, step = newChildren.next()) {
var _newFiber3 = createChild(returnFiber, step.value, lanes);
if (_newFiber3 === null) {
continue;
}
lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
if (previousNewFiber === null) {
resultingFirstChild = _newFiber3;
} else {
previousNewFiber.sibling = _newFiber3;
}
previousNewFiber = _newFiber3;
}
if (getIsHydrating()) {
var _numberOfForks3 = newIdx;
pushTreeFork(returnFiber, _numberOfForks3);
}
return resultingFirstChild;
}
var existingChildren = mapRemainingChildren(returnFiber, oldFiber);
for (; !step.done; newIdx++, step = newChildren.next()) {
var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, lanes);
if (_newFiber4 !== null) {
if (shouldTrackSideEffects) {
if (_newFiber4.alternate !== null) {
existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
}
}
lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
if (previousNewFiber === null) {
resultingFirstChild = _newFiber4;
} else {
previousNewFiber.sibling = _newFiber4;
}
previousNewFiber = _newFiber4;
}
}
if (shouldTrackSideEffects) {
existingChildren.forEach(function(child2) {
return deleteChild(returnFiber, child2);
});
}
if (getIsHydrating()) {
var _numberOfForks4 = newIdx;
pushTreeFork(returnFiber, _numberOfForks4);
}
return resultingFirstChild;
}
function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, lanes) {
if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
var existing = useFiber(currentFirstChild, textContent);
existing.return = returnFiber;
return existing;
}
deleteRemainingChildren(returnFiber, currentFirstChild);
var created = createFiberFromText(textContent, returnFiber.mode, lanes);
created.return = returnFiber;
return created;
}
function reconcileSingleElement(returnFiber, currentFirstChild, element, lanes) {
var key = element.key;
var child = currentFirstChild;
while (child !== null) {
if (child.key === key) {
var elementType = element.type;
if (elementType === REACT_FRAGMENT_TYPE2) {
if (child.tag === Fragment) {
deleteRemainingChildren(returnFiber, child.sibling);
var existing = useFiber(child, element.props.children);
existing.return = returnFiber;
{
existing._debugSource = element._source;
existing._debugOwner = element._owner;
}
return existing;
}
} else {
if (child.elementType === elementType || isCompatibleFamilyForHotReloading(child, element) || typeof elementType === "object" && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === child.type) {
deleteRemainingChildren(returnFiber, child.sibling);
var _existing = useFiber(child, element.props);
_existing.ref = coerceRef(returnFiber, child, element);
_existing.return = returnFiber;
{
_existing._debugSource = element._source;
_existing._debugOwner = element._owner;
}
return _existing;
}
}
deleteRemainingChildren(returnFiber, child);
break;
} else {
deleteChild(returnFiber, child);
}
child = child.sibling;
}
if (element.type === REACT_FRAGMENT_TYPE2) {
var created = createFiberFromFragment(element.props.children, returnFiber.mode, lanes, element.key);
created.return = returnFiber;
return created;
} else {
var _created4 = createFiberFromElement(element, returnFiber.mode, lanes);
_created4.ref = coerceRef(returnFiber, currentFirstChild, element);
_created4.return = returnFiber;
return _created4;
}
}
function reconcileSinglePortal(returnFiber, currentFirstChild, portal, lanes) {
var key = portal.key;
var child = currentFirstChild;
while (child !== null) {
if (child.key === key) {
if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
deleteRemainingChildren(returnFiber, child.sibling);
var existing = useFiber(child, portal.children || []);
existing.return = returnFiber;
return existing;
} else {
deleteRemainingChildren(returnFiber, child);
break;
}
} else {
deleteChild(returnFiber, child);
}
child = child.sibling;
}
var created = createFiberFromPortal(portal, returnFiber.mode, lanes);
created.return = returnFiber;
return created;
}
function reconcileChildFibers2(returnFiber, currentFirstChild, newChild, lanes) {
var isUnkeyedTopLevelFragment = typeof newChild === "object" && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE2 && newChild.key === null;
if (isUnkeyedTopLevelFragment) {
newChild = newChild.props.children;
}
if (typeof newChild === "object" && newChild !== null) {
switch (newChild.$$typeof) {
case REACT_ELEMENT_TYPE:
return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, lanes));
case REACT_PORTAL_TYPE:
return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, lanes));
case REACT_LAZY_TYPE:
var payload = newChild._payload;
var init = newChild._init;
return reconcileChildFibers2(returnFiber, currentFirstChild, init(payload), lanes);
}
if (isArray3(newChild)) {
return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes);
}
if (getIteratorFn(newChild)) {
return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, lanes);
}
throwOnInvalidObjectType(returnFiber, newChild);
}
if (typeof newChild === "string" && newChild !== "" || typeof newChild === "number") {
return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, "" + newChild, lanes));
}
{
if (typeof newChild === "function") {
warnOnFunctionType(returnFiber);
}
}
return deleteRemainingChildren(returnFiber, currentFirstChild);
}
return reconcileChildFibers2;
}
var reconcileChildFibers = ChildReconciler(true);
var mountChildFibers = ChildReconciler(false);
function cloneChildFibers(current2, workInProgress2) {
if (current2 !== null && workInProgress2.child !== current2.child) {
throw new Error("Resuming work not yet implemented.");
}
if (workInProgress2.child === null) {
return;
}
var currentChild = workInProgress2.child;
var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);
workInProgress2.child = newChild;
newChild.return = workInProgress2;
while (currentChild.sibling !== null) {
currentChild = currentChild.sibling;
newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);
newChild.return = workInProgress2;
}
newChild.sibling = null;
}
function resetChildFibers(workInProgress2, lanes) {
var child = workInProgress2.child;
while (child !== null) {
resetWorkInProgress(child, lanes);
child = child.sibling;
}
}
var NO_CONTEXT = {};
var contextStackCursor$1 = createCursor(NO_CONTEXT);
var contextFiberStackCursor = createCursor(NO_CONTEXT);
var rootInstanceStackCursor = createCursor(NO_CONTEXT);
function requiredContext(c) {
if (c === NO_CONTEXT) {
throw new Error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.");
}
return c;
}
function getRootHostContainer() {
var rootInstance = requiredContext(rootInstanceStackCursor.current);
return rootInstance;
}
function pushHostContainer(fiber, nextRootInstance) {
push(rootInstanceStackCursor, nextRootInstance, fiber);
push(contextFiberStackCursor, fiber, fiber);
push(contextStackCursor$1, NO_CONTEXT, fiber);
var nextRootContext = getRootHostContext(nextRootInstance);
pop(contextStackCursor$1, fiber);
push(contextStackCursor$1, nextRootContext, fiber);
}
function popHostContainer(fiber) {
pop(contextStackCursor$1, fiber);
pop(contextFiberStackCursor, fiber);
pop(rootInstanceStackCursor, fiber);
}
function getHostContext() {
var context = requiredContext(contextStackCursor$1.current);
return context;
}
function pushHostContext(fiber) {
var rootInstance = requiredContext(rootInstanceStackCursor.current);
var context = requiredContext(contextStackCursor$1.current);
var nextContext = getChildHostContext(context, fiber.type);
if (context === nextContext) {
return;
}
push(contextFiberStackCursor, fiber, fiber);
push(contextStackCursor$1, nextContext, fiber);
}
function popHostContext(fiber) {
if (contextFiberStackCursor.current !== fiber) {
return;
}
pop(contextStackCursor$1, fiber);
pop(contextFiberStackCursor, fiber);
}
var DefaultSuspenseContext = 0;
var SubtreeSuspenseContextMask = 1;
var InvisibleParentSuspenseContext = 1;
var ForceSuspenseFallback = 2;
var suspenseStackCursor = createCursor(DefaultSuspenseContext);
function hasSuspenseContext(parentContext, flag) {
return (parentContext & flag) !== 0;
}
function setDefaultShallowSuspenseContext(parentContext) {
return parentContext & SubtreeSuspenseContextMask;
}
function setShallowSuspenseContext(parentContext, shallowContext) {
return parentContext & SubtreeSuspenseContextMask | shallowContext;
}
function addSubtreeSuspenseContext(parentContext, subtreeContext) {
return parentContext | subtreeContext;
}
function pushSuspenseContext(fiber, newContext) {
push(suspenseStackCursor, newContext, fiber);
}
function popSuspenseContext(fiber) {
pop(suspenseStackCursor, fiber);
}
function shouldCaptureSuspense(workInProgress2, hasInvisibleParent) {
var nextState = workInProgress2.memoizedState;
if (nextState !== null) {
if (nextState.dehydrated !== null) {
return true;
}
return false;
}
var props = workInProgress2.memoizedProps;
{
return true;
}
}
function findFirstSuspended(row) {
var node = row;
while (node !== null) {
if (node.tag === SuspenseComponent) {
var state = node.memoizedState;
if (state !== null) {
var dehydrated = state.dehydrated;
if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {
return node;
}
}
} else if (node.tag === SuspenseListComponent && node.memoizedProps.revealOrder !== void 0) {
var didSuspend = (node.flags & DidCapture) !== NoFlags;
if (didSuspend) {
return node;
}
} else if (node.child !== null) {
node.child.return = node;
node = node.child;
continue;
}
if (node === row) {
return null;
}
while (node.sibling === null) {
if (node.return === null || node.return === row) {
return null;
}
node = node.return;
}
node.sibling.return = node.return;
node = node.sibling;
}
return null;
}
var NoFlags$1 = 0;
var HasEffect = 1;
var Insertion = 2;
var Layout2 = 4;
var Passive$1 = 8;
var workInProgressSources = [];
function resetWorkInProgressVersions() {
for (var i = 0; i < workInProgressSources.length; i++) {
var mutableSource = workInProgressSources[i];
{
mutableSource._workInProgressVersionPrimary = null;
}
}
workInProgressSources.length = 0;
}
function registerMutableSourceForHydration(root2, mutableSource) {
var getVersion = mutableSource._getVersion;
var version = getVersion(mutableSource._source);
if (root2.mutableSourceEagerHydrationData == null) {
root2.mutableSourceEagerHydrationData = [mutableSource, version];
} else {
root2.mutableSourceEagerHydrationData.push(mutableSource, version);
}
}
var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, ReactCurrentBatchConfig$2 = ReactSharedInternals.ReactCurrentBatchConfig;
var didWarnAboutMismatchedHooksForComponent;
var didWarnUncachedGetSnapshot;
{
didWarnAboutMismatchedHooksForComponent = new Set();
}
var renderLanes = NoLanes;
var currentlyRenderingFiber$1 = null;
var currentHook = null;
var workInProgressHook = null;
var didScheduleRenderPhaseUpdate = false;
var didScheduleRenderPhaseUpdateDuringThisPass = false;
var localIdCounter = 0;
var globalClientIdCounter = 0;
var RE_RENDER_LIMIT = 25;
var currentHookNameInDev = null;
var hookTypesDev = null;
var hookTypesUpdateIndexDev = -1;
var ignorePreviousDependencies = false;
function mountHookTypesDev() {
{
var hookName = currentHookNameInDev;
if (hookTypesDev === null) {
hookTypesDev = [hookName];
} else {
hookTypesDev.push(hookName);
}
}
}
function updateHookTypesDev() {
{
var hookName = currentHookNameInDev;
if (hookTypesDev !== null) {
hookTypesUpdateIndexDev++;
if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {
warnOnHookMismatchInDev(hookName);
}
}
}
}
function checkDepsAreArrayDev(deps) {
{
if (deps !== void 0 && deps !== null && !isArray3(deps)) {
error("%s received a final argument that is not an array (instead, received `%s`). When specified, the final argument must be an array.", currentHookNameInDev, typeof deps);
}
}
}
function warnOnHookMismatchInDev(currentHookName) {
{
var componentName = getComponentNameFromFiber(currentlyRenderingFiber$1);
if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
didWarnAboutMismatchedHooksForComponent.add(componentName);
if (hookTypesDev !== null) {
var table = "";
var secondColumnStart = 30;
for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {
var oldHookName = hookTypesDev[i];
var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;
var row = i + 1 + ". " + oldHookName;
while (row.length < secondColumnStart) {
row += " ";
}
row += newHookName + "\n";
table += row;
}
error("React has detected a change in the order of Hooks called by %s. This will lead to bugs and errors if not fixed. For more information, read the Rules of Hooks: https://reactjs.org/link/rules-of-hooks\n\n Previous render Next render\n ------------------------------------------------------\n%s ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", componentName, table);
}
}
}
}
function throwInvalidHookError() {
throw new Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.");
}
function areHookInputsEqual(nextDeps, prevDeps) {
{
if (ignorePreviousDependencies) {
return false;
}
}
if (prevDeps === null) {
{
error("%s received a final argument during this render, but not during the previous render. Even though the final argument is optional, its type cannot change between renders.", currentHookNameInDev);
}
return false;
}
{
if (nextDeps.length !== prevDeps.length) {
error("The final argument passed to %s changed size between renders. The order and size of this array must remain constant.\n\nPrevious: %s\nIncoming: %s", currentHookNameInDev, "[" + prevDeps.join(", ") + "]", "[" + nextDeps.join(", ") + "]");
}
}
for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
if (objectIs(nextDeps[i], prevDeps[i])) {
continue;
}
return false;
}
return true;
}
function renderWithHooks(current2, workInProgress2, Component4, props, secondArg, nextRenderLanes) {
renderLanes = nextRenderLanes;
currentlyRenderingFiber$1 = workInProgress2;
{
hookTypesDev = current2 !== null ? current2._debugHookTypes : null;
hookTypesUpdateIndexDev = -1;
ignorePreviousDependencies = current2 !== null && current2.type !== workInProgress2.type;
}
workInProgress2.memoizedState = null;
workInProgress2.updateQueue = null;
workInProgress2.lanes = NoLanes;
{
if (current2 !== null && current2.memoizedState !== null) {
ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
} else if (hookTypesDev !== null) {
ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV;
} else {
ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV;
}
}
var children = Component4(props, secondArg);
if (didScheduleRenderPhaseUpdateDuringThisPass) {
var numberOfReRenders = 0;
do {
didScheduleRenderPhaseUpdateDuringThisPass = false;
localIdCounter = 0;
if (numberOfReRenders >= RE_RENDER_LIMIT) {
throw new Error("Too many re-renders. React limits the number of renders to prevent an infinite loop.");
}
numberOfReRenders += 1;
{
ignorePreviousDependencies = false;
}
currentHook = null;
workInProgressHook = null;
workInProgress2.updateQueue = null;
{
hookTypesUpdateIndexDev = -1;
}
ReactCurrentDispatcher$1.current = HooksDispatcherOnRerenderInDEV;
children = Component4(props, secondArg);
} while (didScheduleRenderPhaseUpdateDuringThisPass);
}
ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
{
workInProgress2._debugHookTypes = hookTypesDev;
}
var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
renderLanes = NoLanes;
currentlyRenderingFiber$1 = null;
currentHook = null;
workInProgressHook = null;
{
currentHookNameInDev = null;
hookTypesDev = null;
hookTypesUpdateIndexDev = -1;
if (current2 !== null && (current2.flags & StaticMask) !== (workInProgress2.flags & StaticMask) && (current2.mode & ConcurrentMode) !== NoMode) {
error("Internal React error: Expected static flag was missing. Please notify the React team.");
}
}
didScheduleRenderPhaseUpdate = false;
if (didRenderTooFewHooks) {
throw new Error("Rendered fewer hooks than expected. This may be caused by an accidental early return statement.");
}
return children;
}
function checkDidRenderIdHook() {
var didRenderIdHook = localIdCounter !== 0;
localIdCounter = 0;
return didRenderIdHook;
}
function bailoutHooks(current2, workInProgress2, lanes) {
workInProgress2.updateQueue = current2.updateQueue;
if ((workInProgress2.mode & StrictEffectsMode) !== NoMode) {
workInProgress2.flags &= ~(MountPassiveDev | MountLayoutDev | Passive | Update);
} else {
workInProgress2.flags &= ~(Passive | Update);
}
current2.lanes = removeLanes(current2.lanes, lanes);
}
function resetHooksAfterThrow() {
ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
if (didScheduleRenderPhaseUpdate) {
var hook = currentlyRenderingFiber$1.memoizedState;
while (hook !== null) {
var queue = hook.queue;
if (queue !== null) {
queue.pending = null;
}
hook = hook.next;
}
didScheduleRenderPhaseUpdate = false;
}
renderLanes = NoLanes;
currentlyRenderingFiber$1 = null;
currentHook = null;
workInProgressHook = null;
{
hookTypesDev = null;
hookTypesUpdateIndexDev = -1;
currentHookNameInDev = null;
isUpdatingOpaqueValueInRenderPhase = false;
}
didScheduleRenderPhaseUpdateDuringThisPass = false;
localIdCounter = 0;
}
function mountWorkInProgressHook() {
var hook = {
memoizedState: null,
baseState: null,
baseQueue: null,
queue: null,
next: null
};
if (workInProgressHook === null) {
currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;
} else {
workInProgressHook = workInProgressHook.next = hook;
}
return workInProgressHook;
}
function updateWorkInProgressHook() {
var nextCurrentHook;
if (currentHook === null) {
var current2 = currentlyRenderingFiber$1.alternate;
if (current2 !== null) {
nextCurrentHook = current2.memoizedState;
} else {
nextCurrentHook = null;
}
} else {
nextCurrentHook = currentHook.next;
}
var nextWorkInProgressHook;
if (workInProgressHook === null) {
nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;
} else {
nextWorkInProgressHook = workInProgressHook.next;
}
if (nextWorkInProgressHook !== null) {
workInProgressHook = nextWorkInProgressHook;
nextWorkInProgressHook = workInProgressHook.next;
currentHook = nextCurrentHook;
} else {
if (nextCurrentHook === null) {
throw new Error("Rendered more hooks than during the previous render.");
}
currentHook = nextCurrentHook;
var newHook = {
memoizedState: currentHook.memoizedState,
baseState: currentHook.baseState,
baseQueue: currentHook.baseQueue,
queue: currentHook.queue,
next: null
};
if (workInProgressHook === null) {
currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;
} else {
workInProgressHook = workInProgressHook.next = newHook;
}
}
return workInProgressHook;
}
function createFunctionComponentUpdateQueue() {
return {
lastEffect: null,
stores: null
};
}
function basicStateReducer(state, action) {
return typeof action === "function" ? action(state) : action;
}
function mountReducer(reducer, initialArg, init) {
var hook = mountWorkInProgressHook();
var initialState;
if (init !== void 0) {
initialState = init(initialArg);
} else {
initialState = initialArg;
}
hook.memoizedState = hook.baseState = initialState;
var queue = {
pending: null,
interleaved: null,
lanes: NoLanes,
dispatch: null,
lastRenderedReducer: reducer,
lastRenderedState: initialState
};
hook.queue = queue;
var dispatch = queue.dispatch = dispatchReducerAction.bind(null, currentlyRenderingFiber$1, queue);
return [hook.memoizedState, dispatch];
}
function updateReducer(reducer, initialArg, init) {
var hook = updateWorkInProgressHook();
var queue = hook.queue;
if (queue === null) {
throw new Error("Should have a queue. This is likely a bug in React. Please file an issue.");
}
queue.lastRenderedReducer = reducer;
var current2 = currentHook;
var baseQueue = current2.baseQueue;
var pendingQueue = queue.pending;
if (pendingQueue !== null) {
if (baseQueue !== null) {
var baseFirst = baseQueue.next;
var pendingFirst = pendingQueue.next;
baseQueue.next = pendingFirst;
pendingQueue.next = baseFirst;
}
{
if (current2.baseQueue !== baseQueue) {
error("Internal error: Expected work-in-progress queue to be a clone. This is a bug in React.");
}
}
current2.baseQueue = baseQueue = pendingQueue;
queue.pending = null;
}
if (baseQueue !== null) {
var first = baseQueue.next;
var newState = current2.baseState;
var newBaseState = null;
var newBaseQueueFirst = null;
var newBaseQueueLast = null;
var update = first;
do {
var updateLane = update.lane;
if (!isSubsetOfLanes(renderLanes, updateLane)) {
var clone = {
lane: updateLane,
action: update.action,
hasEagerState: update.hasEagerState,
eagerState: update.eagerState,
next: null
};
if (newBaseQueueLast === null) {
newBaseQueueFirst = newBaseQueueLast = clone;
newBaseState = newState;
} else {
newBaseQueueLast = newBaseQueueLast.next = clone;
}
currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, updateLane);
markSkippedUpdateLanes(updateLane);
} else {
if (newBaseQueueLast !== null) {
var _clone = {
lane: NoLane,
action: update.action,
hasEagerState: update.hasEagerState,
eagerState: update.eagerState,
next: null
};
newBaseQueueLast = newBaseQueueLast.next = _clone;
}
if (update.hasEagerState) {
newState = update.eagerState;
} else {
var action = update.action;
newState = reducer(newState, action);
}
}
update = update.next;
} while (update !== null && update !== first);
if (newBaseQueueLast === null) {
newBaseState = newState;
} else {
newBaseQueueLast.next = newBaseQueueFirst;
}
if (!objectIs(newState, hook.memoizedState)) {
markWorkInProgressReceivedUpdate();
}
hook.memoizedState = newState;
hook.baseState = newBaseState;
hook.baseQueue = newBaseQueueLast;
queue.lastRenderedState = newState;
}
var lastInterleaved = queue.interleaved;
if (lastInterleaved !== null) {
var interleaved = lastInterleaved;
do {
var interleavedLane = interleaved.lane;
currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, interleavedLane);
markSkippedUpdateLanes(interleavedLane);
interleaved = interleaved.next;
} while (interleaved !== lastInterleaved);
} else if (baseQueue === null) {
queue.lanes = NoLanes;
}
var dispatch = queue.dispatch;
return [hook.memoizedState, dispatch];
}
function rerenderReducer(reducer, initialArg, init) {
var hook = updateWorkInProgressHook();
var queue = hook.queue;
if (queue === null) {
throw new Error("Should have a queue. This is likely a bug in React. Please file an issue.");
}
queue.lastRenderedReducer = reducer;
var dispatch = queue.dispatch;
var lastRenderPhaseUpdate = queue.pending;
var newState = hook.memoizedState;
if (lastRenderPhaseUpdate !== null) {
queue.pending = null;
var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;
var update = firstRenderPhaseUpdate;
do {
var action = update.action;
newState = reducer(newState, action);
update = update.next;
} while (update !== firstRenderPhaseUpdate);
if (!objectIs(newState, hook.memoizedState)) {
markWorkInProgressReceivedUpdate();
}
hook.memoizedState = newState;
if (hook.baseQueue === null) {
hook.baseState = newState;
}
queue.lastRenderedState = newState;
}
return [newState, dispatch];
}
function mountMutableSource(source, getSnapshot, subscribe) {
{
return void 0;
}
}
function updateMutableSource(source, getSnapshot, subscribe) {
{
return void 0;
}
}
function mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
var fiber = currentlyRenderingFiber$1;
var hook = mountWorkInProgressHook();
var nextSnapshot;
var isHydrating2 = getIsHydrating();
if (isHydrating2) {
if (getServerSnapshot === void 0) {
throw new Error("Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering.");
}
nextSnapshot = getServerSnapshot();
{
if (!didWarnUncachedGetSnapshot) {
if (nextSnapshot !== getServerSnapshot()) {
error("The result of getServerSnapshot should be cached to avoid an infinite loop");
didWarnUncachedGetSnapshot = true;
}
}
}
} else {
nextSnapshot = getSnapshot();
{
if (!didWarnUncachedGetSnapshot) {
var cachedSnapshot = getSnapshot();
if (!objectIs(nextSnapshot, cachedSnapshot)) {
error("The result of getSnapshot should be cached to avoid an infinite loop");
didWarnUncachedGetSnapshot = true;
}
}
}
var root2 = getWorkInProgressRoot();
if (root2 === null) {
throw new Error("Expected a work-in-progress root. This is a bug in React. Please file an issue.");
}
if (!includesBlockingLane(root2, renderLanes)) {
pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
}
}
hook.memoizedState = nextSnapshot;
var inst = {
value: nextSnapshot,
getSnapshot
};
hook.queue = inst;
mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [subscribe]);
fiber.flags |= Passive;
pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), void 0, null);
return nextSnapshot;
}
function updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
var fiber = currentlyRenderingFiber$1;
var hook = updateWorkInProgressHook();
var nextSnapshot = getSnapshot();
{
if (!didWarnUncachedGetSnapshot) {
var cachedSnapshot = getSnapshot();
if (!objectIs(nextSnapshot, cachedSnapshot)) {
error("The result of getSnapshot should be cached to avoid an infinite loop");
didWarnUncachedGetSnapshot = true;
}
}
}
var prevSnapshot = hook.memoizedState;
var snapshotChanged = !objectIs(prevSnapshot, nextSnapshot);
if (snapshotChanged) {
hook.memoizedState = nextSnapshot;
markWorkInProgressReceivedUpdate();
}
var inst = hook.queue;
updateEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [subscribe]);
if (inst.getSnapshot !== getSnapshot || snapshotChanged || workInProgressHook !== null && workInProgressHook.memoizedState.tag & HasEffect) {
fiber.flags |= Passive;
pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), void 0, null);
var root2 = getWorkInProgressRoot();
if (root2 === null) {
throw new Error("Expected a work-in-progress root. This is a bug in React. Please file an issue.");
}
if (!includesBlockingLane(root2, renderLanes)) {
pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
}
}
return nextSnapshot;
}
function pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {
fiber.flags |= StoreConsistency;
var check = {
getSnapshot,
value: renderedSnapshot
};
var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
if (componentUpdateQueue === null) {
componentUpdateQueue = createFunctionComponentUpdateQueue();
currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
componentUpdateQueue.stores = [check];
} else {
var stores = componentUpdateQueue.stores;
if (stores === null) {
componentUpdateQueue.stores = [check];
} else {
stores.push(check);
}
}
}
function updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {
inst.value = nextSnapshot;
inst.getSnapshot = getSnapshot;
if (checkIfSnapshotChanged(inst)) {
forceStoreRerender(fiber);
}
}
function subscribeToStore(fiber, inst, subscribe) {
var handleStoreChange = function() {
if (checkIfSnapshotChanged(inst)) {
forceStoreRerender(fiber);
}
};
return subscribe(handleStoreChange);
}
function checkIfSnapshotChanged(inst) {
var latestGetSnapshot = inst.getSnapshot;
var prevValue = inst.value;
try {
var nextValue = latestGetSnapshot();
return !objectIs(prevValue, nextValue);
} catch (error2) {
return true;
}
}
function forceStoreRerender(fiber) {
var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, SyncLane, NoTimestamp);
}
}
function mountState(initialState) {
var hook = mountWorkInProgressHook();
if (typeof initialState === "function") {
initialState = initialState();
}
hook.memoizedState = hook.baseState = initialState;
var queue = {
pending: null,
interleaved: null,
lanes: NoLanes,
dispatch: null,
lastRenderedReducer: basicStateReducer,
lastRenderedState: initialState
};
hook.queue = queue;
var dispatch = queue.dispatch = dispatchSetState.bind(null, currentlyRenderingFiber$1, queue);
return [hook.memoizedState, dispatch];
}
function updateState(initialState) {
return updateReducer(basicStateReducer);
}
function rerenderState(initialState) {
return rerenderReducer(basicStateReducer);
}
function pushEffect(tag, create2, destroy, deps) {
var effect = {
tag,
create: create2,
destroy,
deps,
next: null
};
var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
if (componentUpdateQueue === null) {
componentUpdateQueue = createFunctionComponentUpdateQueue();
currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
componentUpdateQueue.lastEffect = effect.next = effect;
} else {
var lastEffect = componentUpdateQueue.lastEffect;
if (lastEffect === null) {
componentUpdateQueue.lastEffect = effect.next = effect;
} else {
var firstEffect = lastEffect.next;
lastEffect.next = effect;
effect.next = firstEffect;
componentUpdateQueue.lastEffect = effect;
}
}
return effect;
}
function mountRef(initialValue) {
var hook = mountWorkInProgressHook();
{
var _ref2 = {
current: initialValue
};
hook.memoizedState = _ref2;
return _ref2;
}
}
function updateRef(initialValue) {
var hook = updateWorkInProgressHook();
return hook.memoizedState;
}
function mountEffectImpl(fiberFlags, hookFlags, create2, deps) {
var hook = mountWorkInProgressHook();
var nextDeps = deps === void 0 ? null : deps;
currentlyRenderingFiber$1.flags |= fiberFlags;
hook.memoizedState = pushEffect(HasEffect | hookFlags, create2, void 0, nextDeps);
}
function updateEffectImpl(fiberFlags, hookFlags, create2, deps) {
var hook = updateWorkInProgressHook();
var nextDeps = deps === void 0 ? null : deps;
var destroy = void 0;
if (currentHook !== null) {
var prevEffect = currentHook.memoizedState;
destroy = prevEffect.destroy;
if (nextDeps !== null) {
var prevDeps = prevEffect.deps;
if (areHookInputsEqual(nextDeps, prevDeps)) {
hook.memoizedState = pushEffect(hookFlags, create2, destroy, nextDeps);
return;
}
}
}
currentlyRenderingFiber$1.flags |= fiberFlags;
hook.memoizedState = pushEffect(HasEffect | hookFlags, create2, destroy, nextDeps);
}
function mountEffect(create2, deps) {
if ((currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
return mountEffectImpl(MountPassiveDev | Passive | PassiveStatic, Passive$1, create2, deps);
} else {
return mountEffectImpl(Passive | PassiveStatic, Passive$1, create2, deps);
}
}
function updateEffect(create2, deps) {
return updateEffectImpl(Passive, Passive$1, create2, deps);
}
function mountInsertionEffect(create2, deps) {
return mountEffectImpl(Update, Insertion, create2, deps);
}
function updateInsertionEffect(create2, deps) {
return updateEffectImpl(Update, Insertion, create2, deps);
}
function mountLayoutEffect(create2, deps) {
var fiberFlags = Update;
{
fiberFlags |= LayoutStatic;
}
if ((currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
fiberFlags |= MountLayoutDev;
}
return mountEffectImpl(fiberFlags, Layout2, create2, deps);
}
function updateLayoutEffect(create2, deps) {
return updateEffectImpl(Update, Layout2, create2, deps);
}
function imperativeHandleEffect(create2, ref) {
if (typeof ref === "function") {
var refCallback = ref;
var _inst = create2();
refCallback(_inst);
return function() {
refCallback(null);
};
} else if (ref !== null && ref !== void 0) {
var refObject = ref;
{
if (!refObject.hasOwnProperty("current")) {
error("Expected useImperativeHandle() first argument to either be a ref callback or React.createRef() object. Instead received: %s.", "an object with keys {" + Object.keys(refObject).join(", ") + "}");
}
}
var _inst2 = create2();
refObject.current = _inst2;
return function() {
refObject.current = null;
};
}
}
function mountImperativeHandle(ref, create2, deps) {
{
if (typeof create2 !== "function") {
error("Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.", create2 !== null ? typeof create2 : "null");
}
}
var effectDeps = deps !== null && deps !== void 0 ? deps.concat([ref]) : null;
var fiberFlags = Update;
{
fiberFlags |= LayoutStatic;
}
if ((currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
fiberFlags |= MountLayoutDev;
}
return mountEffectImpl(fiberFlags, Layout2, imperativeHandleEffect.bind(null, create2, ref), effectDeps);
}
function updateImperativeHandle(ref, create2, deps) {
{
if (typeof create2 !== "function") {
error("Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.", create2 !== null ? typeof create2 : "null");
}
}
var effectDeps = deps !== null && deps !== void 0 ? deps.concat([ref]) : null;
return updateEffectImpl(Update, Layout2, imperativeHandleEffect.bind(null, create2, ref), effectDeps);
}
function mountDebugValue(value, formatterFn) {
}
var updateDebugValue = mountDebugValue;
function mountCallback(callback, deps) {
var hook = mountWorkInProgressHook();
var nextDeps = deps === void 0 ? null : deps;
hook.memoizedState = [callback, nextDeps];
return callback;
}
function updateCallback(callback, deps) {
var hook = updateWorkInProgressHook();
var nextDeps = deps === void 0 ? null : deps;
var prevState = hook.memoizedState;
if (prevState !== null) {
if (nextDeps !== null) {
var prevDeps = prevState[1];
if (areHookInputsEqual(nextDeps, prevDeps)) {
return prevState[0];
}
}
}
hook.memoizedState = [callback, nextDeps];
return callback;
}
function mountMemo(nextCreate, deps) {
var hook = mountWorkInProgressHook();
var nextDeps = deps === void 0 ? null : deps;
var nextValue = nextCreate();
hook.memoizedState = [nextValue, nextDeps];
return nextValue;
}
function updateMemo(nextCreate, deps) {
var hook = updateWorkInProgressHook();
var nextDeps = deps === void 0 ? null : deps;
var prevState = hook.memoizedState;
if (prevState !== null) {
if (nextDeps !== null) {
var prevDeps = prevState[1];
if (areHookInputsEqual(nextDeps, prevDeps)) {
return prevState[0];
}
}
}
var nextValue = nextCreate();
hook.memoizedState = [nextValue, nextDeps];
return nextValue;
}
function mountDeferredValue(value) {
var hook = mountWorkInProgressHook();
hook.memoizedState = value;
return value;
}
function updateDeferredValue(value) {
var hook = updateWorkInProgressHook();
var resolvedCurrentHook = currentHook;
var prevValue = resolvedCurrentHook.memoizedState;
return updateDeferredValueImpl(hook, prevValue, value);
}
function rerenderDeferredValue(value) {
var hook = updateWorkInProgressHook();
if (currentHook === null) {
hook.memoizedState = value;
return value;
} else {
var prevValue = currentHook.memoizedState;
return updateDeferredValueImpl(hook, prevValue, value);
}
}
function updateDeferredValueImpl(hook, prevValue, value) {
var shouldDeferValue = !includesOnlyNonUrgentLanes(renderLanes);
if (shouldDeferValue) {
if (!objectIs(value, prevValue)) {
var deferredLane = claimNextTransitionLane();
currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, deferredLane);
markSkippedUpdateLanes(deferredLane);
hook.baseState = true;
}
return prevValue;
} else {
if (hook.baseState) {
hook.baseState = false;
markWorkInProgressReceivedUpdate();
}
hook.memoizedState = value;
return value;
}
}
function startTransition(setPending, callback, options2) {
var previousPriority = getCurrentUpdatePriority();
setCurrentUpdatePriority(higherEventPriority(previousPriority, ContinuousEventPriority));
setPending(true);
var prevTransition = ReactCurrentBatchConfig$2.transition;
ReactCurrentBatchConfig$2.transition = {};
var currentTransition = ReactCurrentBatchConfig$2.transition;
{
ReactCurrentBatchConfig$2.transition._updatedFibers = new Set();
}
try {
setPending(false);
callback();
} finally {
setCurrentUpdatePriority(previousPriority);
ReactCurrentBatchConfig$2.transition = prevTransition;
{
if (prevTransition === null && currentTransition._updatedFibers) {
var updatedFibersCount = currentTransition._updatedFibers.size;
if (updatedFibersCount > 10) {
warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.");
}
currentTransition._updatedFibers.clear();
}
}
}
}
function mountTransition() {
var _mountState = mountState(false), isPending = _mountState[0], setPending = _mountState[1];
var start = startTransition.bind(null, setPending);
var hook = mountWorkInProgressHook();
hook.memoizedState = start;
return [isPending, start];
}
function updateTransition() {
var _updateState = updateState(), isPending = _updateState[0];
var hook = updateWorkInProgressHook();
var start = hook.memoizedState;
return [isPending, start];
}
function rerenderTransition() {
var _rerenderState = rerenderState(), isPending = _rerenderState[0];
var hook = updateWorkInProgressHook();
var start = hook.memoizedState;
return [isPending, start];
}
var isUpdatingOpaqueValueInRenderPhase = false;
function getIsUpdatingOpaqueValueInRenderPhaseInDEV() {
{
return isUpdatingOpaqueValueInRenderPhase;
}
}
function mountId() {
var hook = mountWorkInProgressHook();
var root2 = getWorkInProgressRoot();
var identifierPrefix = root2.identifierPrefix;
var id;
if (getIsHydrating()) {
var treeId = getTreeId();
id = ":" + identifierPrefix + "R" + treeId;
var localId = localIdCounter++;
if (localId > 0) {
id += "H" + localId.toString(32);
}
id += ":";
} else {
var globalClientId = globalClientIdCounter++;
id = ":" + identifierPrefix + "r" + globalClientId.toString(32) + ":";
}
hook.memoizedState = id;
return id;
}
function updateId() {
var hook = updateWorkInProgressHook();
var id = hook.memoizedState;
return id;
}
function dispatchReducerAction(fiber, queue, action) {
{
if (typeof arguments[3] === "function") {
error("State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().");
}
}
var lane = requestUpdateLane(fiber);
var update = {
lane,
action,
hasEagerState: false,
eagerState: null,
next: null
};
if (isRenderPhaseUpdate(fiber)) {
enqueueRenderPhaseUpdate(queue, update);
} else {
var root2 = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
if (root2 !== null) {
var eventTime = requestEventTime();
scheduleUpdateOnFiber(root2, fiber, lane, eventTime);
entangleTransitionUpdate(root2, queue, lane);
}
}
markUpdateInDevTools(fiber, lane);
}
function dispatchSetState(fiber, queue, action) {
{
if (typeof arguments[3] === "function") {
error("State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().");
}
}
var lane = requestUpdateLane(fiber);
var update = {
lane,
action,
hasEagerState: false,
eagerState: null,
next: null
};
if (isRenderPhaseUpdate(fiber)) {
enqueueRenderPhaseUpdate(queue, update);
} else {
var alternate = fiber.alternate;
if (fiber.lanes === NoLanes && (alternate === null || alternate.lanes === NoLanes)) {
var lastRenderedReducer = queue.lastRenderedReducer;
if (lastRenderedReducer !== null) {
var prevDispatcher;
{
prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
}
try {
var currentState = queue.lastRenderedState;
var eagerState = lastRenderedReducer(currentState, action);
update.hasEagerState = true;
update.eagerState = eagerState;
if (objectIs(eagerState, currentState)) {
enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane);
return;
}
} catch (error2) {
} finally {
{
ReactCurrentDispatcher$1.current = prevDispatcher;
}
}
}
}
var root2 = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
if (root2 !== null) {
var eventTime = requestEventTime();
scheduleUpdateOnFiber(root2, fiber, lane, eventTime);
entangleTransitionUpdate(root2, queue, lane);
}
}
markUpdateInDevTools(fiber, lane);
}
function isRenderPhaseUpdate(fiber) {
var alternate = fiber.alternate;
return fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1;
}
function enqueueRenderPhaseUpdate(queue, update) {
didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = true;
var pending = queue.pending;
if (pending === null) {
update.next = update;
} else {
update.next = pending.next;
pending.next = update;
}
queue.pending = update;
}
function entangleTransitionUpdate(root2, queue, lane) {
if (isTransitionLane(lane)) {
var queueLanes = queue.lanes;
queueLanes = intersectLanes(queueLanes, root2.pendingLanes);
var newQueueLanes = mergeLanes(queueLanes, lane);
queue.lanes = newQueueLanes;
markRootEntangled(root2, newQueueLanes);
}
}
function markUpdateInDevTools(fiber, lane, action) {
{
markStateUpdateScheduled(fiber, lane);
}
}
var ContextOnlyDispatcher = {
readContext,
useCallback: throwInvalidHookError,
useContext: throwInvalidHookError,
useEffect: throwInvalidHookError,
useImperativeHandle: throwInvalidHookError,
useInsertionEffect: throwInvalidHookError,
useLayoutEffect: throwInvalidHookError,
useMemo: throwInvalidHookError,
useReducer: throwInvalidHookError,
useRef: throwInvalidHookError,
useState: throwInvalidHookError,
useDebugValue: throwInvalidHookError,
useDeferredValue: throwInvalidHookError,
useTransition: throwInvalidHookError,
useMutableSource: throwInvalidHookError,
useSyncExternalStore: throwInvalidHookError,
useId: throwInvalidHookError,
unstable_isNewReconciler: enableNewReconciler
};
var HooksDispatcherOnMountInDEV = null;
var HooksDispatcherOnMountWithHookTypesInDEV = null;
var HooksDispatcherOnUpdateInDEV = null;
var HooksDispatcherOnRerenderInDEV = null;
var InvalidNestedHooksDispatcherOnMountInDEV = null;
var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
{
var warnInvalidContextAccess = function() {
error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().");
};
var warnInvalidHookAccess = function() {
error("Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. You can only call Hooks at the top level of your React function. For more information, see https://reactjs.org/link/rules-of-hooks");
};
HooksDispatcherOnMountInDEV = {
readContext: function(context) {
return readContext(context);
},
useCallback: function(callback, deps) {
currentHookNameInDev = "useCallback";
mountHookTypesDev();
checkDepsAreArrayDev(deps);
return mountCallback(callback, deps);
},
useContext: function(context) {
currentHookNameInDev = "useContext";
mountHookTypesDev();
return readContext(context);
},
useEffect: function(create2, deps) {
currentHookNameInDev = "useEffect";
mountHookTypesDev();
checkDepsAreArrayDev(deps);
return mountEffect(create2, deps);
},
useImperativeHandle: function(ref, create2, deps) {
currentHookNameInDev = "useImperativeHandle";
mountHookTypesDev();
checkDepsAreArrayDev(deps);
return mountImperativeHandle(ref, create2, deps);
},
useInsertionEffect: function(create2, deps) {
currentHookNameInDev = "useInsertionEffect";
mountHookTypesDev();
checkDepsAreArrayDev(deps);
return mountInsertionEffect(create2, deps);
},
useLayoutEffect: function(create2, deps) {
currentHookNameInDev = "useLayoutEffect";
mountHookTypesDev();
checkDepsAreArrayDev(deps);
return mountLayoutEffect(create2, deps);
},
useMemo: function(create2, deps) {
currentHookNameInDev = "useMemo";
mountHookTypesDev();
checkDepsAreArrayDev(deps);
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountMemo(create2, deps);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useReducer: function(reducer, initialArg, init) {
currentHookNameInDev = "useReducer";
mountHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountReducer(reducer, initialArg, init);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useRef: function(initialValue) {
currentHookNameInDev = "useRef";
mountHookTypesDev();
return mountRef(initialValue);
},
useState: function(initialState) {
currentHookNameInDev = "useState";
mountHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountState(initialState);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useDebugValue: function(value, formatterFn) {
currentHookNameInDev = "useDebugValue";
mountHookTypesDev();
return mountDebugValue();
},
useDeferredValue: function(value) {
currentHookNameInDev = "useDeferredValue";
mountHookTypesDev();
return mountDeferredValue(value);
},
useTransition: function() {
currentHookNameInDev = "useTransition";
mountHookTypesDev();
return mountTransition();
},
useMutableSource: function(source, getSnapshot, subscribe) {
currentHookNameInDev = "useMutableSource";
mountHookTypesDev();
return mountMutableSource();
},
useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
currentHookNameInDev = "useSyncExternalStore";
mountHookTypesDev();
return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
},
useId: function() {
currentHookNameInDev = "useId";
mountHookTypesDev();
return mountId();
},
unstable_isNewReconciler: enableNewReconciler
};
HooksDispatcherOnMountWithHookTypesInDEV = {
readContext: function(context) {
return readContext(context);
},
useCallback: function(callback, deps) {
currentHookNameInDev = "useCallback";
updateHookTypesDev();
return mountCallback(callback, deps);
},
useContext: function(context) {
currentHookNameInDev = "useContext";
updateHookTypesDev();
return readContext(context);
},
useEffect: function(create2, deps) {
currentHookNameInDev = "useEffect";
updateHookTypesDev();
return mountEffect(create2, deps);
},
useImperativeHandle: function(ref, create2, deps) {
currentHookNameInDev = "useImperativeHandle";
updateHookTypesDev();
return mountImperativeHandle(ref, create2, deps);
},
useInsertionEffect: function(create2, deps) {
currentHookNameInDev = "useInsertionEffect";
updateHookTypesDev();
return mountInsertionEffect(create2, deps);
},
useLayoutEffect: function(create2, deps) {
currentHookNameInDev = "useLayoutEffect";
updateHookTypesDev();
return mountLayoutEffect(create2, deps);
},
useMemo: function(create2, deps) {
currentHookNameInDev = "useMemo";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountMemo(create2, deps);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useReducer: function(reducer, initialArg, init) {
currentHookNameInDev = "useReducer";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountReducer(reducer, initialArg, init);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useRef: function(initialValue) {
currentHookNameInDev = "useRef";
updateHookTypesDev();
return mountRef(initialValue);
},
useState: function(initialState) {
currentHookNameInDev = "useState";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountState(initialState);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useDebugValue: function(value, formatterFn) {
currentHookNameInDev = "useDebugValue";
updateHookTypesDev();
return mountDebugValue();
},
useDeferredValue: function(value) {
currentHookNameInDev = "useDeferredValue";
updateHookTypesDev();
return mountDeferredValue(value);
},
useTransition: function() {
currentHookNameInDev = "useTransition";
updateHookTypesDev();
return mountTransition();
},
useMutableSource: function(source, getSnapshot, subscribe) {
currentHookNameInDev = "useMutableSource";
updateHookTypesDev();
return mountMutableSource();
},
useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
currentHookNameInDev = "useSyncExternalStore";
updateHookTypesDev();
return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
},
useId: function() {
currentHookNameInDev = "useId";
updateHookTypesDev();
return mountId();
},
unstable_isNewReconciler: enableNewReconciler
};
HooksDispatcherOnUpdateInDEV = {
readContext: function(context) {
return readContext(context);
},
useCallback: function(callback, deps) {
currentHookNameInDev = "useCallback";
updateHookTypesDev();
return updateCallback(callback, deps);
},
useContext: function(context) {
currentHookNameInDev = "useContext";
updateHookTypesDev();
return readContext(context);
},
useEffect: function(create2, deps) {
currentHookNameInDev = "useEffect";
updateHookTypesDev();
return updateEffect(create2, deps);
},
useImperativeHandle: function(ref, create2, deps) {
currentHookNameInDev = "useImperativeHandle";
updateHookTypesDev();
return updateImperativeHandle(ref, create2, deps);
},
useInsertionEffect: function(create2, deps) {
currentHookNameInDev = "useInsertionEffect";
updateHookTypesDev();
return updateInsertionEffect(create2, deps);
},
useLayoutEffect: function(create2, deps) {
currentHookNameInDev = "useLayoutEffect";
updateHookTypesDev();
return updateLayoutEffect(create2, deps);
},
useMemo: function(create2, deps) {
currentHookNameInDev = "useMemo";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return updateMemo(create2, deps);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useReducer: function(reducer, initialArg, init) {
currentHookNameInDev = "useReducer";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return updateReducer(reducer, initialArg, init);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useRef: function(initialValue) {
currentHookNameInDev = "useRef";
updateHookTypesDev();
return updateRef();
},
useState: function(initialState) {
currentHookNameInDev = "useState";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return updateState(initialState);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useDebugValue: function(value, formatterFn) {
currentHookNameInDev = "useDebugValue";
updateHookTypesDev();
return updateDebugValue();
},
useDeferredValue: function(value) {
currentHookNameInDev = "useDeferredValue";
updateHookTypesDev();
return updateDeferredValue(value);
},
useTransition: function() {
currentHookNameInDev = "useTransition";
updateHookTypesDev();
return updateTransition();
},
useMutableSource: function(source, getSnapshot, subscribe) {
currentHookNameInDev = "useMutableSource";
updateHookTypesDev();
return updateMutableSource();
},
useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
currentHookNameInDev = "useSyncExternalStore";
updateHookTypesDev();
return updateSyncExternalStore(subscribe, getSnapshot);
},
useId: function() {
currentHookNameInDev = "useId";
updateHookTypesDev();
return updateId();
},
unstable_isNewReconciler: enableNewReconciler
};
HooksDispatcherOnRerenderInDEV = {
readContext: function(context) {
return readContext(context);
},
useCallback: function(callback, deps) {
currentHookNameInDev = "useCallback";
updateHookTypesDev();
return updateCallback(callback, deps);
},
useContext: function(context) {
currentHookNameInDev = "useContext";
updateHookTypesDev();
return readContext(context);
},
useEffect: function(create2, deps) {
currentHookNameInDev = "useEffect";
updateHookTypesDev();
return updateEffect(create2, deps);
},
useImperativeHandle: function(ref, create2, deps) {
currentHookNameInDev = "useImperativeHandle";
updateHookTypesDev();
return updateImperativeHandle(ref, create2, deps);
},
useInsertionEffect: function(create2, deps) {
currentHookNameInDev = "useInsertionEffect";
updateHookTypesDev();
return updateInsertionEffect(create2, deps);
},
useLayoutEffect: function(create2, deps) {
currentHookNameInDev = "useLayoutEffect";
updateHookTypesDev();
return updateLayoutEffect(create2, deps);
},
useMemo: function(create2, deps) {
currentHookNameInDev = "useMemo";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
try {
return updateMemo(create2, deps);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useReducer: function(reducer, initialArg, init) {
currentHookNameInDev = "useReducer";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
try {
return rerenderReducer(reducer, initialArg, init);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useRef: function(initialValue) {
currentHookNameInDev = "useRef";
updateHookTypesDev();
return updateRef();
},
useState: function(initialState) {
currentHookNameInDev = "useState";
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
try {
return rerenderState(initialState);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useDebugValue: function(value, formatterFn) {
currentHookNameInDev = "useDebugValue";
updateHookTypesDev();
return updateDebugValue();
},
useDeferredValue: function(value) {
currentHookNameInDev = "useDeferredValue";
updateHookTypesDev();
return rerenderDeferredValue(value);
},
useTransition: function() {
currentHookNameInDev = "useTransition";
updateHookTypesDev();
return rerenderTransition();
},
useMutableSource: function(source, getSnapshot, subscribe) {
currentHookNameInDev = "useMutableSource";
updateHookTypesDev();
return updateMutableSource();
},
useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
currentHookNameInDev = "useSyncExternalStore";
updateHookTypesDev();
return updateSyncExternalStore(subscribe, getSnapshot);
},
useId: function() {
currentHookNameInDev = "useId";
updateHookTypesDev();
return updateId();
},
unstable_isNewReconciler: enableNewReconciler
};
InvalidNestedHooksDispatcherOnMountInDEV = {
readContext: function(context) {
warnInvalidContextAccess();
return readContext(context);
},
useCallback: function(callback, deps) {
currentHookNameInDev = "useCallback";
warnInvalidHookAccess();
mountHookTypesDev();
return mountCallback(callback, deps);
},
useContext: function(context) {
currentHookNameInDev = "useContext";
warnInvalidHookAccess();
mountHookTypesDev();
return readContext(context);
},
useEffect: function(create2, deps) {
currentHookNameInDev = "useEffect";
warnInvalidHookAccess();
mountHookTypesDev();
return mountEffect(create2, deps);
},
useImperativeHandle: function(ref, create2, deps) {
currentHookNameInDev = "useImperativeHandle";
warnInvalidHookAccess();
mountHookTypesDev();
return mountImperativeHandle(ref, create2, deps);
},
useInsertionEffect: function(create2, deps) {
currentHookNameInDev = "useInsertionEffect";
warnInvalidHookAccess();
mountHookTypesDev();
return mountInsertionEffect(create2, deps);
},
useLayoutEffect: function(create2, deps) {
currentHookNameInDev = "useLayoutEffect";
warnInvalidHookAccess();
mountHookTypesDev();
return mountLayoutEffect(create2, deps);
},
useMemo: function(create2, deps) {
currentHookNameInDev = "useMemo";
warnInvalidHookAccess();
mountHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountMemo(create2, deps);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useReducer: function(reducer, initialArg, init) {
currentHookNameInDev = "useReducer";
warnInvalidHookAccess();
mountHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountReducer(reducer, initialArg, init);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useRef: function(initialValue) {
currentHookNameInDev = "useRef";
warnInvalidHookAccess();
mountHookTypesDev();
return mountRef(initialValue);
},
useState: function(initialState) {
currentHookNameInDev = "useState";
warnInvalidHookAccess();
mountHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
try {
return mountState(initialState);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useDebugValue: function(value, formatterFn) {
currentHookNameInDev = "useDebugValue";
warnInvalidHookAccess();
mountHookTypesDev();
return mountDebugValue();
},
useDeferredValue: function(value) {
currentHookNameInDev = "useDeferredValue";
warnInvalidHookAccess();
mountHookTypesDev();
return mountDeferredValue(value);
},
useTransition: function() {
currentHookNameInDev = "useTransition";
warnInvalidHookAccess();
mountHookTypesDev();
return mountTransition();
},
useMutableSource: function(source, getSnapshot, subscribe) {
currentHookNameInDev = "useMutableSource";
warnInvalidHookAccess();
mountHookTypesDev();
return mountMutableSource();
},
useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
currentHookNameInDev = "useSyncExternalStore";
warnInvalidHookAccess();
mountHookTypesDev();
return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
},
useId: function() {
currentHookNameInDev = "useId";
warnInvalidHookAccess();
mountHookTypesDev();
return mountId();
},
unstable_isNewReconciler: enableNewReconciler
};
InvalidNestedHooksDispatcherOnUpdateInDEV = {
readContext: function(context) {
warnInvalidContextAccess();
return readContext(context);
},
useCallback: function(callback, deps) {
currentHookNameInDev = "useCallback";
warnInvalidHookAccess();
updateHookTypesDev();
return updateCallback(callback, deps);
},
useContext: function(context) {
currentHookNameInDev = "useContext";
warnInvalidHookAccess();
updateHookTypesDev();
return readContext(context);
},
useEffect: function(create2, deps) {
currentHookNameInDev = "useEffect";
warnInvalidHookAccess();
updateHookTypesDev();
return updateEffect(create2, deps);
},
useImperativeHandle: function(ref, create2, deps) {
currentHookNameInDev = "useImperativeHandle";
warnInvalidHookAccess();
updateHookTypesDev();
return updateImperativeHandle(ref, create2, deps);
},
useInsertionEffect: function(create2, deps) {
currentHookNameInDev = "useInsertionEffect";
warnInvalidHookAccess();
updateHookTypesDev();
return updateInsertionEffect(create2, deps);
},
useLayoutEffect: function(create2, deps) {
currentHookNameInDev = "useLayoutEffect";
warnInvalidHookAccess();
updateHookTypesDev();
return updateLayoutEffect(create2, deps);
},
useMemo: function(create2, deps) {
currentHookNameInDev = "useMemo";
warnInvalidHookAccess();
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return updateMemo(create2, deps);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useReducer: function(reducer, initialArg, init) {
currentHookNameInDev = "useReducer";
warnInvalidHookAccess();
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return updateReducer(reducer, initialArg, init);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useRef: function(initialValue) {
currentHookNameInDev = "useRef";
warnInvalidHookAccess();
updateHookTypesDev();
return updateRef();
},
useState: function(initialState) {
currentHookNameInDev = "useState";
warnInvalidHookAccess();
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return updateState(initialState);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useDebugValue: function(value, formatterFn) {
currentHookNameInDev = "useDebugValue";
warnInvalidHookAccess();
updateHookTypesDev();
return updateDebugValue();
},
useDeferredValue: function(value) {
currentHookNameInDev = "useDeferredValue";
warnInvalidHookAccess();
updateHookTypesDev();
return updateDeferredValue(value);
},
useTransition: function() {
currentHookNameInDev = "useTransition";
warnInvalidHookAccess();
updateHookTypesDev();
return updateTransition();
},
useMutableSource: function(source, getSnapshot, subscribe) {
currentHookNameInDev = "useMutableSource";
warnInvalidHookAccess();
updateHookTypesDev();
return updateMutableSource();
},
useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
currentHookNameInDev = "useSyncExternalStore";
warnInvalidHookAccess();
updateHookTypesDev();
return updateSyncExternalStore(subscribe, getSnapshot);
},
useId: function() {
currentHookNameInDev = "useId";
warnInvalidHookAccess();
updateHookTypesDev();
return updateId();
},
unstable_isNewReconciler: enableNewReconciler
};
InvalidNestedHooksDispatcherOnRerenderInDEV = {
readContext: function(context) {
warnInvalidContextAccess();
return readContext(context);
},
useCallback: function(callback, deps) {
currentHookNameInDev = "useCallback";
warnInvalidHookAccess();
updateHookTypesDev();
return updateCallback(callback, deps);
},
useContext: function(context) {
currentHookNameInDev = "useContext";
warnInvalidHookAccess();
updateHookTypesDev();
return readContext(context);
},
useEffect: function(create2, deps) {
currentHookNameInDev = "useEffect";
warnInvalidHookAccess();
updateHookTypesDev();
return updateEffect(create2, deps);
},
useImperativeHandle: function(ref, create2, deps) {
currentHookNameInDev = "useImperativeHandle";
warnInvalidHookAccess();
updateHookTypesDev();
return updateImperativeHandle(ref, create2, deps);
},
useInsertionEffect: function(create2, deps) {
currentHookNameInDev = "useInsertionEffect";
warnInvalidHookAccess();
updateHookTypesDev();
return updateInsertionEffect(create2, deps);
},
useLayoutEffect: function(create2, deps) {
currentHookNameInDev = "useLayoutEffect";
warnInvalidHookAccess();
updateHookTypesDev();
return updateLayoutEffect(create2, deps);
},
useMemo: function(create2, deps) {
currentHookNameInDev = "useMemo";
warnInvalidHookAccess();
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return updateMemo(create2, deps);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useReducer: function(reducer, initialArg, init) {
currentHookNameInDev = "useReducer";
warnInvalidHookAccess();
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return rerenderReducer(reducer, initialArg, init);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useRef: function(initialValue) {
currentHookNameInDev = "useRef";
warnInvalidHookAccess();
updateHookTypesDev();
return updateRef();
},
useState: function(initialState) {
currentHookNameInDev = "useState";
warnInvalidHookAccess();
updateHookTypesDev();
var prevDispatcher = ReactCurrentDispatcher$1.current;
ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
try {
return rerenderState(initialState);
} finally {
ReactCurrentDispatcher$1.current = prevDispatcher;
}
},
useDebugValue: function(value, formatterFn) {
currentHookNameInDev = "useDebugValue";
warnInvalidHookAccess();
updateHookTypesDev();
return updateDebugValue();
},
useDeferredValue: function(value) {
currentHookNameInDev = "useDeferredValue";
warnInvalidHookAccess();
updateHookTypesDev();
return rerenderDeferredValue(value);
},
useTransition: function() {
currentHookNameInDev = "useTransition";
warnInvalidHookAccess();
updateHookTypesDev();
return rerenderTransition();
},
useMutableSource: function(source, getSnapshot, subscribe) {
currentHookNameInDev = "useMutableSource";
warnInvalidHookAccess();
updateHookTypesDev();
return updateMutableSource();
},
useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
currentHookNameInDev = "useSyncExternalStore";
warnInvalidHookAccess();
updateHookTypesDev();
return updateSyncExternalStore(subscribe, getSnapshot);
},
useId: function() {
currentHookNameInDev = "useId";
warnInvalidHookAccess();
updateHookTypesDev();
return updateId();
},
unstable_isNewReconciler: enableNewReconciler
};
}
var now$1 = Scheduler.unstable_now;
var commitTime = 0;
var layoutEffectStartTime = -1;
var profilerStartTime = -1;
var passiveEffectStartTime = -1;
var currentUpdateIsNested = false;
var nestedUpdateScheduled = false;
function isCurrentUpdateNested() {
return currentUpdateIsNested;
}
function markNestedUpdateScheduled() {
{
nestedUpdateScheduled = true;
}
}
function resetNestedUpdateFlag() {
{
currentUpdateIsNested = false;
nestedUpdateScheduled = false;
}
}
function syncNestedUpdateFlag() {
{
currentUpdateIsNested = nestedUpdateScheduled;
nestedUpdateScheduled = false;
}
}
function getCommitTime() {
return commitTime;
}
function recordCommitTime() {
commitTime = now$1();
}
function startProfilerTimer(fiber) {
profilerStartTime = now$1();
if (fiber.actualStartTime < 0) {
fiber.actualStartTime = now$1();
}
}
function stopProfilerTimerIfRunning(fiber) {
profilerStartTime = -1;
}
function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
if (profilerStartTime >= 0) {
var elapsedTime = now$1() - profilerStartTime;
fiber.actualDuration += elapsedTime;
if (overrideBaseTime) {
fiber.selfBaseDuration = elapsedTime;
}
profilerStartTime = -1;
}
}
function recordLayoutEffectDuration(fiber) {
if (layoutEffectStartTime >= 0) {
var elapsedTime = now$1() - layoutEffectStartTime;
layoutEffectStartTime = -1;
var parentFiber = fiber.return;
while (parentFiber !== null) {
switch (parentFiber.tag) {
case HostRoot:
var root2 = parentFiber.stateNode;
root2.effectDuration += elapsedTime;
return;
case Profiler:
var parentStateNode = parentFiber.stateNode;
parentStateNode.effectDuration += elapsedTime;
return;
}
parentFiber = parentFiber.return;
}
}
}
function recordPassiveEffectDuration(fiber) {
if (passiveEffectStartTime >= 0) {
var elapsedTime = now$1() - passiveEffectStartTime;
passiveEffectStartTime = -1;
var parentFiber = fiber.return;
while (parentFiber !== null) {
switch (parentFiber.tag) {
case HostRoot:
var root2 = parentFiber.stateNode;
if (root2 !== null) {
root2.passiveEffectDuration += elapsedTime;
}
return;
case Profiler:
var parentStateNode = parentFiber.stateNode;
if (parentStateNode !== null) {
parentStateNode.passiveEffectDuration += elapsedTime;
}
return;
}
parentFiber = parentFiber.return;
}
}
}
function startLayoutEffectTimer() {
layoutEffectStartTime = now$1();
}
function startPassiveEffectTimer() {
passiveEffectStartTime = now$1();
}
function transferActualDuration(fiber) {
var child = fiber.child;
while (child) {
fiber.actualDuration += child.actualDuration;
child = child.sibling;
}
}
function createCapturedValueAtFiber(value, source) {
return {
value,
source,
stack: getStackByFiberInDevAndProd(source),
digest: null
};
}
function createCapturedValue(value, digest, stack) {
return {
value,
source: null,
stack: stack != null ? stack : null,
digest: digest != null ? digest : null
};
}
function showErrorDialog(boundary, errorInfo) {
return true;
}
function logCapturedError(boundary, errorInfo) {
try {
var logError = showErrorDialog(boundary, errorInfo);
if (logError === false) {
return;
}
var error2 = errorInfo.value;
if (true) {
var source = errorInfo.source;
var stack = errorInfo.stack;
var componentStack = stack !== null ? stack : "";
if (error2 != null && error2._suppressLogging) {
if (boundary.tag === ClassComponent) {
return;
}
console["error"](error2);
}
var componentName = source ? getComponentNameFromFiber(source) : null;
var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : "The above error occurred in one of your React components:";
var errorBoundaryMessage;
if (boundary.tag === HostRoot) {
errorBoundaryMessage = "Consider adding an error boundary to your tree to customize error handling behavior.\nVisit https://reactjs.org/link/error-boundaries to learn more about error boundaries.";
} else {
var errorBoundaryName = getComponentNameFromFiber(boundary) || "Anonymous";
errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + ".");
}
var combinedMessage = componentNameMessage + "\n" + componentStack + "\n\n" + ("" + errorBoundaryMessage);
console["error"](combinedMessage);
} else {
console["error"](error2);
}
} catch (e) {
setTimeout(function() {
throw e;
});
}
}
var PossiblyWeakMap$1 = typeof WeakMap === "function" ? WeakMap : Map;
function createRootErrorUpdate(fiber, errorInfo, lane) {
var update = createUpdate(NoTimestamp, lane);
update.tag = CaptureUpdate;
update.payload = {
element: null
};
var error2 = errorInfo.value;
update.callback = function() {
onUncaughtError(error2);
logCapturedError(fiber, errorInfo);
};
return update;
}
function createClassErrorUpdate(fiber, errorInfo, lane) {
var update = createUpdate(NoTimestamp, lane);
update.tag = CaptureUpdate;
var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
if (typeof getDerivedStateFromError === "function") {
var error$1 = errorInfo.value;
update.payload = function() {
return getDerivedStateFromError(error$1);
};
update.callback = function() {
{
markFailedErrorBoundaryForHotReloading(fiber);
}
logCapturedError(fiber, errorInfo);
};
}
var inst = fiber.stateNode;
if (inst !== null && typeof inst.componentDidCatch === "function") {
update.callback = function callback() {
{
markFailedErrorBoundaryForHotReloading(fiber);
}
logCapturedError(fiber, errorInfo);
if (typeof getDerivedStateFromError !== "function") {
markLegacyErrorBoundaryAsFailed(this);
}
var error$12 = errorInfo.value;
var stack = errorInfo.stack;
this.componentDidCatch(error$12, {
componentStack: stack !== null ? stack : ""
});
{
if (typeof getDerivedStateFromError !== "function") {
if (!includesSomeLane(fiber.lanes, SyncLane)) {
error("%s: Error boundaries should implement getDerivedStateFromError(). In that method, return a state update to display an error message or fallback UI.", getComponentNameFromFiber(fiber) || "Unknown");
}
}
}
};
}
return update;
}
function attachPingListener(root2, wakeable, lanes) {
var pingCache = root2.pingCache;
var threadIDs;
if (pingCache === null) {
pingCache = root2.pingCache = new PossiblyWeakMap$1();
threadIDs = new Set();
pingCache.set(wakeable, threadIDs);
} else {
threadIDs = pingCache.get(wakeable);
if (threadIDs === void 0) {
threadIDs = new Set();
pingCache.set(wakeable, threadIDs);
}
}
if (!threadIDs.has(lanes)) {
threadIDs.add(lanes);
var ping = pingSuspendedRoot.bind(null, root2, wakeable, lanes);
{
if (isDevToolsPresent) {
restorePendingUpdaters(root2, lanes);
}
}
wakeable.then(ping, ping);
}
}
function attachRetryListener(suspenseBoundary, root2, wakeable, lanes) {
var wakeables = suspenseBoundary.updateQueue;
if (wakeables === null) {
var updateQueue = new Set();
updateQueue.add(wakeable);
suspenseBoundary.updateQueue = updateQueue;
} else {
wakeables.add(wakeable);
}
}
function resetSuspendedComponent(sourceFiber, rootRenderLanes) {
var tag = sourceFiber.tag;
if ((sourceFiber.mode & ConcurrentMode) === NoMode && (tag === FunctionComponent || tag === ForwardRef || tag === SimpleMemoComponent)) {
var currentSource = sourceFiber.alternate;
if (currentSource) {
sourceFiber.updateQueue = currentSource.updateQueue;
sourceFiber.memoizedState = currentSource.memoizedState;
sourceFiber.lanes = currentSource.lanes;
} else {
sourceFiber.updateQueue = null;
sourceFiber.memoizedState = null;
}
}
}
function getNearestSuspenseBoundaryToCapture(returnFiber) {
var node = returnFiber;
do {
if (node.tag === SuspenseComponent && shouldCaptureSuspense(node)) {
return node;
}
node = node.return;
} while (node !== null);
return null;
}
function markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root2, rootRenderLanes) {
if ((suspenseBoundary.mode & ConcurrentMode) === NoMode) {
if (suspenseBoundary === returnFiber) {
suspenseBoundary.flags |= ShouldCapture;
} else {
suspenseBoundary.flags |= DidCapture;
sourceFiber.flags |= ForceUpdateForLegacySuspense;
sourceFiber.flags &= ~(LifecycleEffectMask | Incomplete);
if (sourceFiber.tag === ClassComponent) {
var currentSourceFiber = sourceFiber.alternate;
if (currentSourceFiber === null) {
sourceFiber.tag = IncompleteClassComponent;
} else {
var update = createUpdate(NoTimestamp, SyncLane);
update.tag = ForceUpdate;
enqueueUpdate(sourceFiber, update, SyncLane);
}
}
sourceFiber.lanes = mergeLanes(sourceFiber.lanes, SyncLane);
}
return suspenseBoundary;
}
suspenseBoundary.flags |= ShouldCapture;
suspenseBoundary.lanes = rootRenderLanes;
return suspenseBoundary;
}
function throwException(root2, returnFiber, sourceFiber, value, rootRenderLanes) {
sourceFiber.flags |= Incomplete;
{
if (isDevToolsPresent) {
restorePendingUpdaters(root2, rootRenderLanes);
}
}
if (value !== null && typeof value === "object" && typeof value.then === "function") {
var wakeable = value;
resetSuspendedComponent(sourceFiber);
{
if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) {
markDidThrowWhileHydratingDEV();
}
}
var suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber);
if (suspenseBoundary !== null) {
suspenseBoundary.flags &= ~ForceClientRender;
markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root2, rootRenderLanes);
if (suspenseBoundary.mode & ConcurrentMode) {
attachPingListener(root2, wakeable, rootRenderLanes);
}
attachRetryListener(suspenseBoundary, root2, wakeable);
return;
} else {
if (!includesSyncLane(rootRenderLanes)) {
attachPingListener(root2, wakeable, rootRenderLanes);
renderDidSuspendDelayIfPossible();
return;
}
var uncaughtSuspenseError = new Error("A component suspended while responding to synchronous input. This will cause the UI to be replaced with a loading indicator. To fix, updates that suspend should be wrapped with startTransition.");
value = uncaughtSuspenseError;
}
} else {
if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) {
markDidThrowWhileHydratingDEV();
var _suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber);
if (_suspenseBoundary !== null) {
if ((_suspenseBoundary.flags & ShouldCapture) === NoFlags) {
_suspenseBoundary.flags |= ForceClientRender;
}
markSuspenseBoundaryShouldCapture(_suspenseBoundary, returnFiber, sourceFiber, root2, rootRenderLanes);
queueHydrationError(createCapturedValueAtFiber(value, sourceFiber));
return;
}
}
}
value = createCapturedValueAtFiber(value, sourceFiber);
renderDidError(value);
var workInProgress2 = returnFiber;
do {
switch (workInProgress2.tag) {
case HostRoot: {
var _errorInfo = value;
workInProgress2.flags |= ShouldCapture;
var lane = pickArbitraryLane(rootRenderLanes);
workInProgress2.lanes = mergeLanes(workInProgress2.lanes, lane);
var update = createRootErrorUpdate(workInProgress2, _errorInfo, lane);
enqueueCapturedUpdate(workInProgress2, update);
return;
}
case ClassComponent:
var errorInfo = value;
var ctor = workInProgress2.type;
var instance = workInProgress2.stateNode;
if ((workInProgress2.flags & DidCapture) === NoFlags && (typeof ctor.getDerivedStateFromError === "function" || instance !== null && typeof instance.componentDidCatch === "function" && !isAlreadyFailedLegacyErrorBoundary(instance))) {
workInProgress2.flags |= ShouldCapture;
var _lane = pickArbitraryLane(rootRenderLanes);
workInProgress2.lanes = mergeLanes(workInProgress2.lanes, _lane);
var _update = createClassErrorUpdate(workInProgress2, errorInfo, _lane);
enqueueCapturedUpdate(workInProgress2, _update);
return;
}
break;
}
workInProgress2 = workInProgress2.return;
} while (workInProgress2 !== null);
}
function getSuspendedCache() {
{
return null;
}
}
var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;
var didReceiveUpdate = false;
var didWarnAboutBadClass;
var didWarnAboutModulePatternComponent;
var didWarnAboutContextTypeOnFunctionComponent;
var didWarnAboutGetDerivedStateOnFunctionComponent;
var didWarnAboutFunctionRefs;
var didWarnAboutReassigningProps;
var didWarnAboutRevealOrder;
var didWarnAboutTailOptions;
{
didWarnAboutBadClass = {};
didWarnAboutModulePatternComponent = {};
didWarnAboutContextTypeOnFunctionComponent = {};
didWarnAboutGetDerivedStateOnFunctionComponent = {};
didWarnAboutFunctionRefs = {};
didWarnAboutReassigningProps = false;
didWarnAboutRevealOrder = {};
didWarnAboutTailOptions = {};
}
function reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2) {
if (current2 === null) {
workInProgress2.child = mountChildFibers(workInProgress2, null, nextChildren, renderLanes2);
} else {
workInProgress2.child = reconcileChildFibers(workInProgress2, current2.child, nextChildren, renderLanes2);
}
}
function forceUnmountCurrentAndReconcile(current2, workInProgress2, nextChildren, renderLanes2) {
workInProgress2.child = reconcileChildFibers(workInProgress2, current2.child, null, renderLanes2);
workInProgress2.child = reconcileChildFibers(workInProgress2, null, nextChildren, renderLanes2);
}
function updateForwardRef(current2, workInProgress2, Component4, nextProps, renderLanes2) {
{
if (workInProgress2.type !== workInProgress2.elementType) {
var innerPropTypes = Component4.propTypes;
if (innerPropTypes) {
checkPropTypes(innerPropTypes, nextProps, "prop", getComponentNameFromType(Component4));
}
}
}
var render2 = Component4.render;
var ref = workInProgress2.ref;
var nextChildren;
var hasId;
prepareToReadContext(workInProgress2, renderLanes2);
{
markComponentRenderStarted(workInProgress2);
}
{
ReactCurrentOwner$1.current = workInProgress2;
setIsRendering(true);
nextChildren = renderWithHooks(current2, workInProgress2, render2, nextProps, ref, renderLanes2);
hasId = checkDidRenderIdHook();
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
nextChildren = renderWithHooks(current2, workInProgress2, render2, nextProps, ref, renderLanes2);
hasId = checkDidRenderIdHook();
} finally {
setIsStrictModeForDevtools(false);
}
}
setIsRendering(false);
}
{
markComponentRenderStopped();
}
if (current2 !== null && !didReceiveUpdate) {
bailoutHooks(current2, workInProgress2, renderLanes2);
return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
}
if (getIsHydrating() && hasId) {
pushMaterializedTreeId(workInProgress2);
}
workInProgress2.flags |= PerformedWork;
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
return workInProgress2.child;
}
function updateMemoComponent(current2, workInProgress2, Component4, nextProps, renderLanes2) {
if (current2 === null) {
var type = Component4.type;
if (isSimpleFunctionComponent(type) && Component4.compare === null && Component4.defaultProps === void 0) {
var resolvedType = type;
{
resolvedType = resolveFunctionForHotReloading(type);
}
workInProgress2.tag = SimpleMemoComponent;
workInProgress2.type = resolvedType;
{
validateFunctionComponentInDev(workInProgress2, type);
}
return updateSimpleMemoComponent(current2, workInProgress2, resolvedType, nextProps, renderLanes2);
}
{
var innerPropTypes = type.propTypes;
if (innerPropTypes) {
checkPropTypes(innerPropTypes, nextProps, "prop", getComponentNameFromType(type));
}
}
var child = createFiberFromTypeAndProps(Component4.type, null, nextProps, workInProgress2, workInProgress2.mode, renderLanes2);
child.ref = workInProgress2.ref;
child.return = workInProgress2;
workInProgress2.child = child;
return child;
}
{
var _type = Component4.type;
var _innerPropTypes = _type.propTypes;
if (_innerPropTypes) {
checkPropTypes(_innerPropTypes, nextProps, "prop", getComponentNameFromType(_type));
}
}
var currentChild = current2.child;
var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current2, renderLanes2);
if (!hasScheduledUpdateOrContext) {
var prevProps = currentChild.memoizedProps;
var compare = Component4.compare;
compare = compare !== null ? compare : shallowEqual;
if (compare(prevProps, nextProps) && current2.ref === workInProgress2.ref) {
return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
}
}
workInProgress2.flags |= PerformedWork;
var newChild = createWorkInProgress(currentChild, nextProps);
newChild.ref = workInProgress2.ref;
newChild.return = workInProgress2;
workInProgress2.child = newChild;
return newChild;
}
function updateSimpleMemoComponent(current2, workInProgress2, Component4, nextProps, renderLanes2) {
{
if (workInProgress2.type !== workInProgress2.elementType) {
var outerMemoType = workInProgress2.elementType;
if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
var lazyComponent = outerMemoType;
var payload = lazyComponent._payload;
var init = lazyComponent._init;
try {
outerMemoType = init(payload);
} catch (x) {
outerMemoType = null;
}
var outerPropTypes = outerMemoType && outerMemoType.propTypes;
if (outerPropTypes) {
checkPropTypes(outerPropTypes, nextProps, "prop", getComponentNameFromType(outerMemoType));
}
}
}
}
if (current2 !== null) {
var prevProps = current2.memoizedProps;
if (shallowEqual(prevProps, nextProps) && current2.ref === workInProgress2.ref && workInProgress2.type === current2.type) {
didReceiveUpdate = false;
workInProgress2.pendingProps = nextProps = prevProps;
if (!checkScheduledUpdateOrContext(current2, renderLanes2)) {
workInProgress2.lanes = current2.lanes;
return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
} else if ((current2.flags & ForceUpdateForLegacySuspense) !== NoFlags) {
didReceiveUpdate = true;
}
}
}
return updateFunctionComponent(current2, workInProgress2, Component4, nextProps, renderLanes2);
}
function updateOffscreenComponent(current2, workInProgress2, renderLanes2) {
var nextProps = workInProgress2.pendingProps;
var nextChildren = nextProps.children;
var prevState = current2 !== null ? current2.memoizedState : null;
if (nextProps.mode === "hidden" || enableLegacyHidden) {
if ((workInProgress2.mode & ConcurrentMode) === NoMode) {
var nextState = {
baseLanes: NoLanes,
cachePool: null,
transitions: null
};
workInProgress2.memoizedState = nextState;
pushRenderLanes(workInProgress2, renderLanes2);
} else if (!includesSomeLane(renderLanes2, OffscreenLane)) {
var spawnedCachePool = null;
var nextBaseLanes;
if (prevState !== null) {
var prevBaseLanes = prevState.baseLanes;
nextBaseLanes = mergeLanes(prevBaseLanes, renderLanes2);
} else {
nextBaseLanes = renderLanes2;
}
workInProgress2.lanes = workInProgress2.childLanes = laneToLanes(OffscreenLane);
var _nextState = {
baseLanes: nextBaseLanes,
cachePool: spawnedCachePool,
transitions: null
};
workInProgress2.memoizedState = _nextState;
workInProgress2.updateQueue = null;
pushRenderLanes(workInProgress2, nextBaseLanes);
return null;
} else {
var _nextState2 = {
baseLanes: NoLanes,
cachePool: null,
transitions: null
};
workInProgress2.memoizedState = _nextState2;
var subtreeRenderLanes2 = prevState !== null ? prevState.baseLanes : renderLanes2;
pushRenderLanes(workInProgress2, subtreeRenderLanes2);
}
} else {
var _subtreeRenderLanes;
if (prevState !== null) {
_subtreeRenderLanes = mergeLanes(prevState.baseLanes, renderLanes2);
workInProgress2.memoizedState = null;
} else {
_subtreeRenderLanes = renderLanes2;
}
pushRenderLanes(workInProgress2, _subtreeRenderLanes);
}
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
return workInProgress2.child;
}
function updateFragment(current2, workInProgress2, renderLanes2) {
var nextChildren = workInProgress2.pendingProps;
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
return workInProgress2.child;
}
function updateMode(current2, workInProgress2, renderLanes2) {
var nextChildren = workInProgress2.pendingProps.children;
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
return workInProgress2.child;
}
function updateProfiler(current2, workInProgress2, renderLanes2) {
{
workInProgress2.flags |= Update;
{
var stateNode = workInProgress2.stateNode;
stateNode.effectDuration = 0;
stateNode.passiveEffectDuration = 0;
}
}
var nextProps = workInProgress2.pendingProps;
var nextChildren = nextProps.children;
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
return workInProgress2.child;
}
function markRef(current2, workInProgress2) {
var ref = workInProgress2.ref;
if (current2 === null && ref !== null || current2 !== null && current2.ref !== ref) {
workInProgress2.flags |= Ref2;
{
workInProgress2.flags |= RefStatic;
}
}
}
function updateFunctionComponent(current2, workInProgress2, Component4, nextProps, renderLanes2) {
{
if (workInProgress2.type !== workInProgress2.elementType) {
var innerPropTypes = Component4.propTypes;
if (innerPropTypes) {
checkPropTypes(innerPropTypes, nextProps, "prop", getComponentNameFromType(Component4));
}
}
}
var context;
{
var unmaskedContext = getUnmaskedContext(workInProgress2, Component4, true);
context = getMaskedContext(workInProgress2, unmaskedContext);
}
var nextChildren;
var hasId;
prepareToReadContext(workInProgress2, renderLanes2);
{
markComponentRenderStarted(workInProgress2);
}
{
ReactCurrentOwner$1.current = workInProgress2;
setIsRendering(true);
nextChildren = renderWithHooks(current2, workInProgress2, Component4, nextProps, context, renderLanes2);
hasId = checkDidRenderIdHook();
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
nextChildren = renderWithHooks(current2, workInProgress2, Component4, nextProps, context, renderLanes2);
hasId = checkDidRenderIdHook();
} finally {
setIsStrictModeForDevtools(false);
}
}
setIsRendering(false);
}
{
markComponentRenderStopped();
}
if (current2 !== null && !didReceiveUpdate) {
bailoutHooks(current2, workInProgress2, renderLanes2);
return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
}
if (getIsHydrating() && hasId) {
pushMaterializedTreeId(workInProgress2);
}
workInProgress2.flags |= PerformedWork;
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
return workInProgress2.child;
}
function updateClassComponent(current2, workInProgress2, Component4, nextProps, renderLanes2) {
{
switch (shouldError(workInProgress2)) {
case false: {
var _instance = workInProgress2.stateNode;
var ctor = workInProgress2.type;
var tempInstance = new ctor(workInProgress2.memoizedProps, _instance.context);
var state = tempInstance.state;
_instance.updater.enqueueSetState(_instance, state, null);
break;
}
case true: {
workInProgress2.flags |= DidCapture;
workInProgress2.flags |= ShouldCapture;
var error$1 = new Error("Simulated error coming from DevTools");
var lane = pickArbitraryLane(renderLanes2);
workInProgress2.lanes = mergeLanes(workInProgress2.lanes, lane);
var update = createClassErrorUpdate(workInProgress2, createCapturedValueAtFiber(error$1, workInProgress2), lane);
enqueueCapturedUpdate(workInProgress2, update);
break;
}
}
if (workInProgress2.type !== workInProgress2.elementType) {
var innerPropTypes = Component4.propTypes;
if (innerPropTypes) {
checkPropTypes(innerPropTypes, nextProps, "prop", getComponentNameFromType(Component4));
}
}
}
var hasContext;
if (isContextProvider(Component4)) {
hasContext = true;
pushContextProvider(workInProgress2);
} else {
hasContext = false;
}
prepareToReadContext(workInProgress2, renderLanes2);
var instance = workInProgress2.stateNode;
var shouldUpdate;
if (instance === null) {
resetSuspendedCurrentOnMountInLegacyMode(current2, workInProgress2);
constructClassInstance(workInProgress2, Component4, nextProps);
mountClassInstance(workInProgress2, Component4, nextProps, renderLanes2);
shouldUpdate = true;
} else if (current2 === null) {
shouldUpdate = resumeMountClassInstance(workInProgress2, Component4, nextProps, renderLanes2);
} else {
shouldUpdate = updateClassInstance(current2, workInProgress2, Component4, nextProps, renderLanes2);
}
var nextUnitOfWork = finishClassComponent(current2, workInProgress2, Component4, shouldUpdate, hasContext, renderLanes2);
{
var inst = workInProgress2.stateNode;
if (shouldUpdate && inst.props !== nextProps) {
if (!didWarnAboutReassigningProps) {
error("It looks like %s is reassigning its own `this.props` while rendering. This is not supported and can lead to confusing bugs.", getComponentNameFromFiber(workInProgress2) || "a component");
}
didWarnAboutReassigningProps = true;
}
}
return nextUnitOfWork;
}
function finishClassComponent(current2, workInProgress2, Component4, shouldUpdate, hasContext, renderLanes2) {
markRef(current2, workInProgress2);
var didCaptureError = (workInProgress2.flags & DidCapture) !== NoFlags;
if (!shouldUpdate && !didCaptureError) {
if (hasContext) {
invalidateContextProvider(workInProgress2, Component4, false);
}
return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
}
var instance = workInProgress2.stateNode;
ReactCurrentOwner$1.current = workInProgress2;
var nextChildren;
if (didCaptureError && typeof Component4.getDerivedStateFromError !== "function") {
nextChildren = null;
{
stopProfilerTimerIfRunning();
}
} else {
{
markComponentRenderStarted(workInProgress2);
}
{
setIsRendering(true);
nextChildren = instance.render();
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
instance.render();
} finally {
setIsStrictModeForDevtools(false);
}
}
setIsRendering(false);
}
{
markComponentRenderStopped();
}
}
workInProgress2.flags |= PerformedWork;
if (current2 !== null && didCaptureError) {
forceUnmountCurrentAndReconcile(current2, workInProgress2, nextChildren, renderLanes2);
} else {
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
}
workInProgress2.memoizedState = instance.state;
if (hasContext) {
invalidateContextProvider(workInProgress2, Component4, true);
}
return workInProgress2.child;
}
function pushHostRootContext(workInProgress2) {
var root2 = workInProgress2.stateNode;
if (root2.pendingContext) {
pushTopLevelContextObject(workInProgress2, root2.pendingContext, root2.pendingContext !== root2.context);
} else if (root2.context) {
pushTopLevelContextObject(workInProgress2, root2.context, false);
}
pushHostContainer(workInProgress2, root2.containerInfo);
}
function updateHostRoot(current2, workInProgress2, renderLanes2) {
pushHostRootContext(workInProgress2);
if (current2 === null) {
throw new Error("Should have a current fiber. This is a bug in React.");
}
var nextProps = workInProgress2.pendingProps;
var prevState = workInProgress2.memoizedState;
var prevChildren = prevState.element;
cloneUpdateQueue(current2, workInProgress2);
processUpdateQueue(workInProgress2, nextProps, null, renderLanes2);
var nextState = workInProgress2.memoizedState;
var root2 = workInProgress2.stateNode;
var nextChildren = nextState.element;
if (prevState.isDehydrated) {
var overrideState = {
element: nextChildren,
isDehydrated: false,
cache: nextState.cache,
pendingSuspenseBoundaries: nextState.pendingSuspenseBoundaries,
transitions: nextState.transitions
};
var updateQueue = workInProgress2.updateQueue;
updateQueue.baseState = overrideState;
workInProgress2.memoizedState = overrideState;
if (workInProgress2.flags & ForceClientRender) {
var recoverableError = createCapturedValueAtFiber(new Error("There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering."), workInProgress2);
return mountHostRootWithoutHydrating(current2, workInProgress2, nextChildren, renderLanes2, recoverableError);
} else if (nextChildren !== prevChildren) {
var _recoverableError = createCapturedValueAtFiber(new Error("This root received an early update, before anything was able hydrate. Switched the entire root to client rendering."), workInProgress2);
return mountHostRootWithoutHydrating(current2, workInProgress2, nextChildren, renderLanes2, _recoverableError);
} else {
enterHydrationState(workInProgress2);
var child = mountChildFibers(workInProgress2, null, nextChildren, renderLanes2);
workInProgress2.child = child;
var node = child;
while (node) {
node.flags = node.flags & ~Placement | Hydrating;
node = node.sibling;
}
}
} else {
resetHydrationState();
if (nextChildren === prevChildren) {
return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
}
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
}
return workInProgress2.child;
}
function mountHostRootWithoutHydrating(current2, workInProgress2, nextChildren, renderLanes2, recoverableError) {
resetHydrationState();
queueHydrationError(recoverableError);
workInProgress2.flags |= ForceClientRender;
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
return workInProgress2.child;
}
function updateHostComponent(current2, workInProgress2, renderLanes2) {
pushHostContext(workInProgress2);
if (current2 === null) {
tryToClaimNextHydratableInstance(workInProgress2);
}
var type = workInProgress2.type;
var nextProps = workInProgress2.pendingProps;
var prevProps = current2 !== null ? current2.memoizedProps : null;
var nextChildren = nextProps.children;
var isDirectTextChild = shouldSetTextContent(type, nextProps);
if (isDirectTextChild) {
nextChildren = null;
} else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
workInProgress2.flags |= ContentReset;
}
markRef(current2, workInProgress2);
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
return workInProgress2.child;
}
function updateHostText(current2, workInProgress2) {
if (current2 === null) {
tryToClaimNextHydratableInstance(workInProgress2);
}
return null;
}
function mountLazyComponent(_current, workInProgress2, elementType, renderLanes2) {
resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress2);
var props = workInProgress2.pendingProps;
var lazyComponent = elementType;
var payload = lazyComponent._payload;
var init = lazyComponent._init;
var Component4 = init(payload);
workInProgress2.type = Component4;
var resolvedTag = workInProgress2.tag = resolveLazyComponentTag(Component4);
var resolvedProps = resolveDefaultProps(Component4, props);
var child;
switch (resolvedTag) {
case FunctionComponent: {
{
validateFunctionComponentInDev(workInProgress2, Component4);
workInProgress2.type = Component4 = resolveFunctionForHotReloading(Component4);
}
child = updateFunctionComponent(null, workInProgress2, Component4, resolvedProps, renderLanes2);
return child;
}
case ClassComponent: {
{
workInProgress2.type = Component4 = resolveClassForHotReloading(Component4);
}
child = updateClassComponent(null, workInProgress2, Component4, resolvedProps, renderLanes2);
return child;
}
case ForwardRef: {
{
workInProgress2.type = Component4 = resolveForwardRefForHotReloading(Component4);
}
child = updateForwardRef(null, workInProgress2, Component4, resolvedProps, renderLanes2);
return child;
}
case MemoComponent: {
{
if (workInProgress2.type !== workInProgress2.elementType) {
var outerPropTypes = Component4.propTypes;
if (outerPropTypes) {
checkPropTypes(outerPropTypes, resolvedProps, "prop", getComponentNameFromType(Component4));
}
}
}
child = updateMemoComponent(null, workInProgress2, Component4, resolveDefaultProps(Component4.type, resolvedProps), renderLanes2);
return child;
}
}
var hint = "";
{
if (Component4 !== null && typeof Component4 === "object" && Component4.$$typeof === REACT_LAZY_TYPE) {
hint = " Did you wrap a component in React.lazy() more than once?";
}
}
throw new Error("Element type is invalid. Received a promise that resolves to: " + Component4 + ". " + ("Lazy element type must resolve to a class or function." + hint));
}
function mountIncompleteClassComponent(_current, workInProgress2, Component4, nextProps, renderLanes2) {
resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress2);
workInProgress2.tag = ClassComponent;
var hasContext;
if (isContextProvider(Component4)) {
hasContext = true;
pushContextProvider(workInProgress2);
} else {
hasContext = false;
}
prepareToReadContext(workInProgress2, renderLanes2);
constructClassInstance(workInProgress2, Component4, nextProps);
mountClassInstance(workInProgress2, Component4, nextProps, renderLanes2);
return finishClassComponent(null, workInProgress2, Component4, true, hasContext, renderLanes2);
}
function mountIndeterminateComponent(_current, workInProgress2, Component4, renderLanes2) {
resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress2);
var props = workInProgress2.pendingProps;
var context;
{
var unmaskedContext = getUnmaskedContext(workInProgress2, Component4, false);
context = getMaskedContext(workInProgress2, unmaskedContext);
}
prepareToReadContext(workInProgress2, renderLanes2);
var value;
var hasId;
{
markComponentRenderStarted(workInProgress2);
}
{
if (Component4.prototype && typeof Component4.prototype.render === "function") {
var componentName = getComponentNameFromType(Component4) || "Unknown";
if (!didWarnAboutBadClass[componentName]) {
error("The <%s /> component appears to have a render method, but doesn't extend React.Component. This is likely to cause errors. Change %s to extend React.Component instead.", componentName, componentName);
didWarnAboutBadClass[componentName] = true;
}
}
if (workInProgress2.mode & StrictLegacyMode) {
ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress2, null);
}
setIsRendering(true);
ReactCurrentOwner$1.current = workInProgress2;
value = renderWithHooks(null, workInProgress2, Component4, props, context, renderLanes2);
hasId = checkDidRenderIdHook();
setIsRendering(false);
}
{
markComponentRenderStopped();
}
workInProgress2.flags |= PerformedWork;
{
if (typeof value === "object" && value !== null && typeof value.render === "function" && value.$$typeof === void 0) {
var _componentName = getComponentNameFromType(Component4) || "Unknown";
if (!didWarnAboutModulePatternComponent[_componentName]) {
error("The <%s /> component appears to be a function component that returns a class instance. Change %s to a class that extends React.Component instead. If you can't use a class try assigning the prototype on the function as a workaround. `%s.prototype = React.Component.prototype`. Don't use an arrow function since it cannot be called with `new` by React.", _componentName, _componentName, _componentName);
didWarnAboutModulePatternComponent[_componentName] = true;
}
}
}
if (typeof value === "object" && value !== null && typeof value.render === "function" && value.$$typeof === void 0) {
{
var _componentName2 = getComponentNameFromType(Component4) || "Unknown";
if (!didWarnAboutModulePatternComponent[_componentName2]) {
error("The <%s /> component appears to be a function component that returns a class instance. Change %s to a class that extends React.Component instead. If you can't use a class try assigning the prototype on the function as a workaround. `%s.prototype = React.Component.prototype`. Don't use an arrow function since it cannot be called with `new` by React.", _componentName2, _componentName2, _componentName2);
didWarnAboutModulePatternComponent[_componentName2] = true;
}
}
workInProgress2.tag = ClassComponent;
workInProgress2.memoizedState = null;
workInProgress2.updateQueue = null;
var hasContext = false;
if (isContextProvider(Component4)) {
hasContext = true;
pushContextProvider(workInProgress2);
} else {
hasContext = false;
}
workInProgress2.memoizedState = value.state !== null && value.state !== void 0 ? value.state : null;
initializeUpdateQueue(workInProgress2);
adoptClassInstance(workInProgress2, value);
mountClassInstance(workInProgress2, Component4, props, renderLanes2);
return finishClassComponent(null, workInProgress2, Component4, true, hasContext, renderLanes2);
} else {
workInProgress2.tag = FunctionComponent;
{
if (workInProgress2.mode & StrictLegacyMode) {
setIsStrictModeForDevtools(true);
try {
value = renderWithHooks(null, workInProgress2, Component4, props, context, renderLanes2);
hasId = checkDidRenderIdHook();
} finally {
setIsStrictModeForDevtools(false);
}
}
}
if (getIsHydrating() && hasId) {
pushMaterializedTreeId(workInProgress2);
}
reconcileChildren(null, workInProgress2, value, renderLanes2);
{
validateFunctionComponentInDev(workInProgress2, Component4);
}
return workInProgress2.child;
}
}
function validateFunctionComponentInDev(workInProgress2, Component4) {
{
if (Component4) {
if (Component4.childContextTypes) {
error("%s(...): childContextTypes cannot be defined on a function component.", Component4.displayName || Component4.name || "Component");
}
}
if (workInProgress2.ref !== null) {
var info = "";
var ownerName = getCurrentFiberOwnerNameInDevOrNull();
if (ownerName) {
info += "\n\nCheck the render method of `" + ownerName + "`.";
}
var warningKey = ownerName || "";
var debugSource = workInProgress2._debugSource;
if (debugSource) {
warningKey = debugSource.fileName + ":" + debugSource.lineNumber;
}
if (!didWarnAboutFunctionRefs[warningKey]) {
didWarnAboutFunctionRefs[warningKey] = true;
error("Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?%s", info);
}
}
if (typeof Component4.getDerivedStateFromProps === "function") {
var _componentName3 = getComponentNameFromType(Component4) || "Unknown";
if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) {
error("%s: Function components do not support getDerivedStateFromProps.", _componentName3);
didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true;
}
}
if (typeof Component4.contextType === "object" && Component4.contextType !== null) {
var _componentName4 = getComponentNameFromType(Component4) || "Unknown";
if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) {
error("%s: Function components do not support contextType.", _componentName4);
didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true;
}
}
}
}
var SUSPENDED_MARKER = {
dehydrated: null,
treeContext: null,
retryLane: NoLane
};
function mountSuspenseOffscreenState(renderLanes2) {
return {
baseLanes: renderLanes2,
cachePool: getSuspendedCache(),
transitions: null
};
}
function updateSuspenseOffscreenState(prevOffscreenState, renderLanes2) {
var cachePool = null;
return {
baseLanes: mergeLanes(prevOffscreenState.baseLanes, renderLanes2),
cachePool,
transitions: prevOffscreenState.transitions
};
}
function shouldRemainOnFallback(suspenseContext, current2, workInProgress2, renderLanes2) {
if (current2 !== null) {
var suspenseState = current2.memoizedState;
if (suspenseState === null) {
return false;
}
}
return hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
}
function getRemainingWorkInPrimaryTree(current2, renderLanes2) {
return removeLanes(current2.childLanes, renderLanes2);
}
function updateSuspenseComponent(current2, workInProgress2, renderLanes2) {
var nextProps = workInProgress2.pendingProps;
{
if (shouldSuspend(workInProgress2)) {
workInProgress2.flags |= DidCapture;
}
}
var suspenseContext = suspenseStackCursor.current;
var showFallback = false;
var didSuspend = (workInProgress2.flags & DidCapture) !== NoFlags;
if (didSuspend || shouldRemainOnFallback(suspenseContext, current2)) {
showFallback = true;
workInProgress2.flags &= ~DidCapture;
} else {
if (current2 === null || current2.memoizedState !== null) {
{
suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);
}
}
}
suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
pushSuspenseContext(workInProgress2, suspenseContext);
if (current2 === null) {
tryToClaimNextHydratableInstance(workInProgress2);
var suspenseState = workInProgress2.memoizedState;
if (suspenseState !== null) {
var dehydrated = suspenseState.dehydrated;
if (dehydrated !== null) {
return mountDehydratedSuspenseComponent(workInProgress2, dehydrated);
}
}
var nextPrimaryChildren = nextProps.children;
var nextFallbackChildren = nextProps.fallback;
if (showFallback) {
var fallbackFragment = mountSuspenseFallbackChildren(workInProgress2, nextPrimaryChildren, nextFallbackChildren, renderLanes2);
var primaryChildFragment = workInProgress2.child;
primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes2);
workInProgress2.memoizedState = SUSPENDED_MARKER;
return fallbackFragment;
} else {
return mountSuspensePrimaryChildren(workInProgress2, nextPrimaryChildren);
}
} else {
var prevState = current2.memoizedState;
if (prevState !== null) {
var _dehydrated = prevState.dehydrated;
if (_dehydrated !== null) {
return updateDehydratedSuspenseComponent(current2, workInProgress2, didSuspend, nextProps, _dehydrated, prevState, renderLanes2);
}
}
if (showFallback) {
var _nextFallbackChildren = nextProps.fallback;
var _nextPrimaryChildren = nextProps.children;
var fallbackChildFragment = updateSuspenseFallbackChildren(current2, workInProgress2, _nextPrimaryChildren, _nextFallbackChildren, renderLanes2);
var _primaryChildFragment2 = workInProgress2.child;
var prevOffscreenState = current2.child.memoizedState;
_primaryChildFragment2.memoizedState = prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes2) : updateSuspenseOffscreenState(prevOffscreenState, renderLanes2);
_primaryChildFragment2.childLanes = getRemainingWorkInPrimaryTree(current2, renderLanes2);
workInProgress2.memoizedState = SUSPENDED_MARKER;
return fallbackChildFragment;
} else {
var _nextPrimaryChildren2 = nextProps.children;
var _primaryChildFragment3 = updateSuspensePrimaryChildren(current2, workInProgress2, _nextPrimaryChildren2, renderLanes2);
workInProgress2.memoizedState = null;
return _primaryChildFragment3;
}
}
}
function mountSuspensePrimaryChildren(workInProgress2, primaryChildren, renderLanes2) {
var mode = workInProgress2.mode;
var primaryChildProps = {
mode: "visible",
children: primaryChildren
};
var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode);
primaryChildFragment.return = workInProgress2;
workInProgress2.child = primaryChildFragment;
return primaryChildFragment;
}
function mountSuspenseFallbackChildren(workInProgress2, primaryChildren, fallbackChildren, renderLanes2) {
var mode = workInProgress2.mode;
var progressedPrimaryFragment = workInProgress2.child;
var primaryChildProps = {
mode: "hidden",
children: primaryChildren
};
var primaryChildFragment;
var fallbackChildFragment;
if ((mode & ConcurrentMode) === NoMode && progressedPrimaryFragment !== null) {
primaryChildFragment = progressedPrimaryFragment;
primaryChildFragment.childLanes = NoLanes;
primaryChildFragment.pendingProps = primaryChildProps;
if (workInProgress2.mode & ProfileMode) {
primaryChildFragment.actualDuration = 0;
primaryChildFragment.actualStartTime = -1;
primaryChildFragment.selfBaseDuration = 0;
primaryChildFragment.treeBaseDuration = 0;
}
fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes2, null);
} else {
primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode);
fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes2, null);
}
primaryChildFragment.return = workInProgress2;
fallbackChildFragment.return = workInProgress2;
primaryChildFragment.sibling = fallbackChildFragment;
workInProgress2.child = primaryChildFragment;
return fallbackChildFragment;
}
function mountWorkInProgressOffscreenFiber(offscreenProps, mode, renderLanes2) {
return createFiberFromOffscreen(offscreenProps, mode, NoLanes, null);
}
function updateWorkInProgressOffscreenFiber(current2, offscreenProps) {
return createWorkInProgress(current2, offscreenProps);
}
function updateSuspensePrimaryChildren(current2, workInProgress2, primaryChildren, renderLanes2) {
var currentPrimaryChildFragment = current2.child;
var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
var primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, {
mode: "visible",
children: primaryChildren
});
if ((workInProgress2.mode & ConcurrentMode) === NoMode) {
primaryChildFragment.lanes = renderLanes2;
}
primaryChildFragment.return = workInProgress2;
primaryChildFragment.sibling = null;
if (currentFallbackChildFragment !== null) {
var deletions = workInProgress2.deletions;
if (deletions === null) {
workInProgress2.deletions = [currentFallbackChildFragment];
workInProgress2.flags |= ChildDeletion;
} else {
deletions.push(currentFallbackChildFragment);
}
}
workInProgress2.child = primaryChildFragment;
return primaryChildFragment;
}
function updateSuspenseFallbackChildren(current2, workInProgress2, primaryChildren, fallbackChildren, renderLanes2) {
var mode = workInProgress2.mode;
var currentPrimaryChildFragment = current2.child;
var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
var primaryChildProps = {
mode: "hidden",
children: primaryChildren
};
var primaryChildFragment;
if ((mode & ConcurrentMode) === NoMode && workInProgress2.child !== currentPrimaryChildFragment) {
var progressedPrimaryFragment = workInProgress2.child;
primaryChildFragment = progressedPrimaryFragment;
primaryChildFragment.childLanes = NoLanes;
primaryChildFragment.pendingProps = primaryChildProps;
if (workInProgress2.mode & ProfileMode) {
primaryChildFragment.actualDuration = 0;
primaryChildFragment.actualStartTime = -1;
primaryChildFragment.selfBaseDuration = currentPrimaryChildFragment.selfBaseDuration;
primaryChildFragment.treeBaseDuration = currentPrimaryChildFragment.treeBaseDuration;
}
workInProgress2.deletions = null;
} else {
primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, primaryChildProps);
primaryChildFragment.subtreeFlags = currentPrimaryChildFragment.subtreeFlags & StaticMask;
}
var fallbackChildFragment;
if (currentFallbackChildFragment !== null) {
fallbackChildFragment = createWorkInProgress(currentFallbackChildFragment, fallbackChildren);
} else {
fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes2, null);
fallbackChildFragment.flags |= Placement;
}
fallbackChildFragment.return = workInProgress2;
primaryChildFragment.return = workInProgress2;
primaryChildFragment.sibling = fallbackChildFragment;
workInProgress2.child = primaryChildFragment;
return fallbackChildFragment;
}
function retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, recoverableError) {
if (recoverableError !== null) {
queueHydrationError(recoverableError);
}
reconcileChildFibers(workInProgress2, current2.child, null, renderLanes2);
var nextProps = workInProgress2.pendingProps;
var primaryChildren = nextProps.children;
var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress2, primaryChildren);
primaryChildFragment.flags |= Placement;
workInProgress2.memoizedState = null;
return primaryChildFragment;
}
function mountSuspenseFallbackAfterRetryWithoutHydrating(current2, workInProgress2, primaryChildren, fallbackChildren, renderLanes2) {
var fiberMode = workInProgress2.mode;
var primaryChildProps = {
mode: "visible",
children: primaryChildren
};
var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, fiberMode);
var fallbackChildFragment = createFiberFromFragment(fallbackChildren, fiberMode, renderLanes2, null);
fallbackChildFragment.flags |= Placement;
primaryChildFragment.return = workInProgress2;
fallbackChildFragment.return = workInProgress2;
primaryChildFragment.sibling = fallbackChildFragment;
workInProgress2.child = primaryChildFragment;
if ((workInProgress2.mode & ConcurrentMode) !== NoMode) {
reconcileChildFibers(workInProgress2, current2.child, null, renderLanes2);
}
return fallbackChildFragment;
}
function mountDehydratedSuspenseComponent(workInProgress2, suspenseInstance, renderLanes2) {
if ((workInProgress2.mode & ConcurrentMode) === NoMode) {
{
error("Cannot hydrate Suspense in legacy mode. Switch from ReactDOM.hydrate(element, container) to ReactDOMClient.hydrateRoot(container, <App />).render(element) or remove the Suspense components from the server rendered components.");
}
workInProgress2.lanes = laneToLanes(SyncLane);
} else if (isSuspenseInstanceFallback(suspenseInstance)) {
workInProgress2.lanes = laneToLanes(DefaultHydrationLane);
} else {
workInProgress2.lanes = laneToLanes(OffscreenLane);
}
return null;
}
function updateDehydratedSuspenseComponent(current2, workInProgress2, didSuspend, nextProps, suspenseInstance, suspenseState, renderLanes2) {
if (!didSuspend) {
warnIfHydrating();
if ((workInProgress2.mode & ConcurrentMode) === NoMode) {
return retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, null);
}
if (isSuspenseInstanceFallback(suspenseInstance)) {
var digest, message, stack;
{
var _getSuspenseInstanceF = getSuspenseInstanceFallbackErrorDetails(suspenseInstance);
digest = _getSuspenseInstanceF.digest;
message = _getSuspenseInstanceF.message;
stack = _getSuspenseInstanceF.stack;
}
var error2;
if (message) {
error2 = new Error(message);
} else {
error2 = new Error("The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering.");
}
var capturedValue = createCapturedValue(error2, digest, stack);
return retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, capturedValue);
}
var hasContextChanged2 = includesSomeLane(renderLanes2, current2.childLanes);
if (didReceiveUpdate || hasContextChanged2) {
var root2 = getWorkInProgressRoot();
if (root2 !== null) {
var attemptHydrationAtLane = getBumpedLaneForHydration(root2, renderLanes2);
if (attemptHydrationAtLane !== NoLane && attemptHydrationAtLane !== suspenseState.retryLane) {
suspenseState.retryLane = attemptHydrationAtLane;
var eventTime = NoTimestamp;
enqueueConcurrentRenderForLane(current2, attemptHydrationAtLane);
scheduleUpdateOnFiber(root2, current2, attemptHydrationAtLane, eventTime);
}
}
renderDidSuspendDelayIfPossible();
var _capturedValue = createCapturedValue(new Error("This Suspense boundary received an update before it finished hydrating. This caused the boundary to switch to client rendering. The usual way to fix this is to wrap the original update in startTransition."));
return retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, _capturedValue);
} else if (isSuspenseInstancePending(suspenseInstance)) {
workInProgress2.flags |= DidCapture;
workInProgress2.child = current2.child;
var retry = retryDehydratedSuspenseBoundary.bind(null, current2);
registerSuspenseInstanceRetry(suspenseInstance, retry);
return null;
} else {
reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress2, suspenseInstance, suspenseState.treeContext);
var primaryChildren = nextProps.children;
var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress2, primaryChildren);
primaryChildFragment.flags |= Hydrating;
return primaryChildFragment;
}
} else {
if (workInProgress2.flags & ForceClientRender) {
workInProgress2.flags &= ~ForceClientRender;
var _capturedValue2 = createCapturedValue(new Error("There was an error while hydrating this Suspense boundary. Switched to client rendering."));
return retrySuspenseComponentWithoutHydrating(current2, workInProgress2, renderLanes2, _capturedValue2);
} else if (workInProgress2.memoizedState !== null) {
workInProgress2.child = current2.child;
workInProgress2.flags |= DidCapture;
return null;
} else {
var nextPrimaryChildren = nextProps.children;
var nextFallbackChildren = nextProps.fallback;
var fallbackChildFragment = mountSuspenseFallbackAfterRetryWithoutHydrating(current2, workInProgress2, nextPrimaryChildren, nextFallbackChildren, renderLanes2);
var _primaryChildFragment4 = workInProgress2.child;
_primaryChildFragment4.memoizedState = mountSuspenseOffscreenState(renderLanes2);
workInProgress2.memoizedState = SUSPENDED_MARKER;
return fallbackChildFragment;
}
}
}
function scheduleSuspenseWorkOnFiber(fiber, renderLanes2, propagationRoot) {
fiber.lanes = mergeLanes(fiber.lanes, renderLanes2);
var alternate = fiber.alternate;
if (alternate !== null) {
alternate.lanes = mergeLanes(alternate.lanes, renderLanes2);
}
scheduleContextWorkOnParentPath(fiber.return, renderLanes2, propagationRoot);
}
function propagateSuspenseContextChange(workInProgress2, firstChild, renderLanes2) {
var node = firstChild;
while (node !== null) {
if (node.tag === SuspenseComponent) {
var state = node.memoizedState;
if (state !== null) {
scheduleSuspenseWorkOnFiber(node, renderLanes2, workInProgress2);
}
} else if (node.tag === SuspenseListComponent) {
scheduleSuspenseWorkOnFiber(node, renderLanes2, workInProgress2);
} else if (node.child !== null) {
node.child.return = node;
node = node.child;
continue;
}
if (node === workInProgress2) {
return;
}
while (node.sibling === null) {
if (node.return === null || node.return === workInProgress2) {
return;
}
node = node.return;
}
node.sibling.return = node.return;
node = node.sibling;
}
}
function findLastContentRow(firstChild) {
var row = firstChild;
var lastContentRow = null;
while (row !== null) {
var currentRow = row.alternate;
if (currentRow !== null && findFirstSuspended(currentRow) === null) {
lastContentRow = row;
}
row = row.sibling;
}
return lastContentRow;
}
function validateRevealOrder(revealOrder) {
{
if (revealOrder !== void 0 && revealOrder !== "forwards" && revealOrder !== "backwards" && revealOrder !== "together" && !didWarnAboutRevealOrder[revealOrder]) {
didWarnAboutRevealOrder[revealOrder] = true;
if (typeof revealOrder === "string") {
switch (revealOrder.toLowerCase()) {
case "together":
case "forwards":
case "backwards": {
error('"%s" is not a valid value for revealOrder on <SuspenseList />. Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase());
break;
}
case "forward":
case "backward": {
error('"%s" is not a valid value for revealOrder on <SuspenseList />. React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase());
break;
}
default:
error('"%s" is not a supported revealOrder on <SuspenseList />. Did you mean "together", "forwards" or "backwards"?', revealOrder);
break;
}
} else {
error('%s is not a supported value for revealOrder on <SuspenseList />. Did you mean "together", "forwards" or "backwards"?', revealOrder);
}
}
}
}
function validateTailOptions(tailMode, revealOrder) {
{
if (tailMode !== void 0 && !didWarnAboutTailOptions[tailMode]) {
if (tailMode !== "collapsed" && tailMode !== "hidden") {
didWarnAboutTailOptions[tailMode] = true;
error('"%s" is not a supported value for tail on <SuspenseList />. Did you mean "collapsed" or "hidden"?', tailMode);
} else if (revealOrder !== "forwards" && revealOrder !== "backwards") {
didWarnAboutTailOptions[tailMode] = true;
error('<SuspenseList tail="%s" /> is only valid if revealOrder is "forwards" or "backwards". Did you mean to specify revealOrder="forwards"?', tailMode);
}
}
}
}
function validateSuspenseListNestedChild(childSlot, index3) {
{
var isAnArray = isArray3(childSlot);
var isIterable2 = !isAnArray && typeof getIteratorFn(childSlot) === "function";
if (isAnArray || isIterable2) {
var type = isAnArray ? "array" : "iterable";
error("A nested %s was passed to row #%s in <SuspenseList />. Wrap it in an additional SuspenseList to configure its revealOrder: <SuspenseList revealOrder=...> ... <SuspenseList revealOrder=...>{%s}</SuspenseList> ... </SuspenseList>", type, index3, type);
return false;
}
}
return true;
}
function validateSuspenseListChildren(children, revealOrder) {
{
if ((revealOrder === "forwards" || revealOrder === "backwards") && children !== void 0 && children !== null && children !== false) {
if (isArray3(children)) {
for (var i = 0; i < children.length; i++) {
if (!validateSuspenseListNestedChild(children[i], i)) {
return;
}
}
} else {
var iteratorFn = getIteratorFn(children);
if (typeof iteratorFn === "function") {
var childrenIterator = iteratorFn.call(children);
if (childrenIterator) {
var step = childrenIterator.next();
var _i = 0;
for (; !step.done; step = childrenIterator.next()) {
if (!validateSuspenseListNestedChild(step.value, _i)) {
return;
}
_i++;
}
}
} else {
error('A single row was passed to a <SuspenseList revealOrder="%s" />. This is not useful since it needs multiple rows. Did you mean to pass multiple children or an array?', revealOrder);
}
}
}
}
}
function initSuspenseListRenderState(workInProgress2, isBackwards, tail, lastContentRow, tailMode) {
var renderState = workInProgress2.memoizedState;
if (renderState === null) {
workInProgress2.memoizedState = {
isBackwards,
rendering: null,
renderingStartTime: 0,
last: lastContentRow,
tail,
tailMode
};
} else {
renderState.isBackwards = isBackwards;
renderState.rendering = null;
renderState.renderingStartTime = 0;
renderState.last = lastContentRow;
renderState.tail = tail;
renderState.tailMode = tailMode;
}
}
function updateSuspenseListComponent(current2, workInProgress2, renderLanes2) {
var nextProps = workInProgress2.pendingProps;
var revealOrder = nextProps.revealOrder;
var tailMode = nextProps.tail;
var newChildren = nextProps.children;
validateRevealOrder(revealOrder);
validateTailOptions(tailMode, revealOrder);
validateSuspenseListChildren(newChildren, revealOrder);
reconcileChildren(current2, workInProgress2, newChildren, renderLanes2);
var suspenseContext = suspenseStackCursor.current;
var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
if (shouldForceFallback) {
suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
workInProgress2.flags |= DidCapture;
} else {
var didSuspendBefore = current2 !== null && (current2.flags & DidCapture) !== NoFlags;
if (didSuspendBefore) {
propagateSuspenseContextChange(workInProgress2, workInProgress2.child, renderLanes2);
}
suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
}
pushSuspenseContext(workInProgress2, suspenseContext);
if ((workInProgress2.mode & ConcurrentMode) === NoMode) {
workInProgress2.memoizedState = null;
} else {
switch (revealOrder) {
case "forwards": {
var lastContentRow = findLastContentRow(workInProgress2.child);
var tail;
if (lastContentRow === null) {
tail = workInProgress2.child;
workInProgress2.child = null;
} else {
tail = lastContentRow.sibling;
lastContentRow.sibling = null;
}
initSuspenseListRenderState(workInProgress2, false, tail, lastContentRow, tailMode);
break;
}
case "backwards": {
var _tail = null;
var row = workInProgress2.child;
workInProgress2.child = null;
while (row !== null) {
var currentRow = row.alternate;
if (currentRow !== null && findFirstSuspended(currentRow) === null) {
workInProgress2.child = row;
break;
}
var nextRow = row.sibling;
row.sibling = _tail;
_tail = row;
row = nextRow;
}
initSuspenseListRenderState(workInProgress2, true, _tail, null, tailMode);
break;
}
case "together": {
initSuspenseListRenderState(workInProgress2, false, null, null, void 0);
break;
}
default: {
workInProgress2.memoizedState = null;
}
}
}
return workInProgress2.child;
}
function updatePortalComponent(current2, workInProgress2, renderLanes2) {
pushHostContainer(workInProgress2, workInProgress2.stateNode.containerInfo);
var nextChildren = workInProgress2.pendingProps;
if (current2 === null) {
workInProgress2.child = reconcileChildFibers(workInProgress2, null, nextChildren, renderLanes2);
} else {
reconcileChildren(current2, workInProgress2, nextChildren, renderLanes2);
}
return workInProgress2.child;
}
var hasWarnedAboutUsingNoValuePropOnContextProvider = false;
function updateContextProvider(current2, workInProgress2, renderLanes2) {
var providerType = workInProgress2.type;
var context = providerType._context;
var newProps = workInProgress2.pendingProps;
var oldProps = workInProgress2.memoizedProps;
var newValue = newProps.value;
{
if (!("value" in newProps)) {
if (!hasWarnedAboutUsingNoValuePropOnContextProvider) {
hasWarnedAboutUsingNoValuePropOnContextProvider = true;
error("The `value` prop is required for the `<Context.Provider>`. Did you misspell it or forget to pass it?");
}
}
var providerPropTypes = workInProgress2.type.propTypes;
if (providerPropTypes) {
checkPropTypes(providerPropTypes, newProps, "prop", "Context.Provider");
}
}
pushProvider(workInProgress2, context, newValue);
{
if (oldProps !== null) {
var oldValue = oldProps.value;
if (objectIs(oldValue, newValue)) {
if (oldProps.children === newProps.children && !hasContextChanged()) {
return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
}
} else {
propagateContextChange(workInProgress2, context, renderLanes2);
}
}
}
var newChildren = newProps.children;
reconcileChildren(current2, workInProgress2, newChildren, renderLanes2);
return workInProgress2.child;
}
var hasWarnedAboutUsingContextAsConsumer = false;
function updateContextConsumer(current2, workInProgress2, renderLanes2) {
var context = workInProgress2.type;
{
if (context._context === void 0) {
if (context !== context.Consumer) {
if (!hasWarnedAboutUsingContextAsConsumer) {
hasWarnedAboutUsingContextAsConsumer = true;
error("Rendering <Context> directly is not supported and will be removed in a future major release. Did you mean to render <Context.Consumer> instead?");
}
}
} else {
context = context._context;
}
}
var newProps = workInProgress2.pendingProps;
var render2 = newProps.children;
{
if (typeof render2 !== "function") {
error("A context consumer was rendered with multiple children, or a child that isn't a function. A context consumer expects a single child that is a function. If you did pass a function, make sure there is no trailing or leading whitespace around it.");
}
}
prepareToReadContext(workInProgress2, renderLanes2);
var newValue = readContext(context);
{
markComponentRenderStarted(workInProgress2);
}
var newChildren;
{
ReactCurrentOwner$1.current = workInProgress2;
setIsRendering(true);
newChildren = render2(newValue);
setIsRendering(false);
}
{
markComponentRenderStopped();
}
workInProgress2.flags |= PerformedWork;
reconcileChildren(current2, workInProgress2, newChildren, renderLanes2);
return workInProgress2.child;
}
function markWorkInProgressReceivedUpdate() {
didReceiveUpdate = true;
}
function resetSuspendedCurrentOnMountInLegacyMode(current2, workInProgress2) {
if ((workInProgress2.mode & ConcurrentMode) === NoMode) {
if (current2 !== null) {
current2.alternate = null;
workInProgress2.alternate = null;
workInProgress2.flags |= Placement;
}
}
}
function bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2) {
if (current2 !== null) {
workInProgress2.dependencies = current2.dependencies;
}
{
stopProfilerTimerIfRunning();
}
markSkippedUpdateLanes(workInProgress2.lanes);
if (!includesSomeLane(renderLanes2, workInProgress2.childLanes)) {
{
return null;
}
}
cloneChildFibers(current2, workInProgress2);
return workInProgress2.child;
}
function remountFiber(current2, oldWorkInProgress, newWorkInProgress) {
{
var returnFiber = oldWorkInProgress.return;
if (returnFiber === null) {
throw new Error("Cannot swap the root fiber.");
}
current2.alternate = null;
oldWorkInProgress.alternate = null;
newWorkInProgress.index = oldWorkInProgress.index;
newWorkInProgress.sibling = oldWorkInProgress.sibling;
newWorkInProgress.return = oldWorkInProgress.return;
newWorkInProgress.ref = oldWorkInProgress.ref;
if (oldWorkInProgress === returnFiber.child) {
returnFiber.child = newWorkInProgress;
} else {
var prevSibling = returnFiber.child;
if (prevSibling === null) {
throw new Error("Expected parent to have a child.");
}
while (prevSibling.sibling !== oldWorkInProgress) {
prevSibling = prevSibling.sibling;
if (prevSibling === null) {
throw new Error("Expected to find the previous sibling.");
}
}
prevSibling.sibling = newWorkInProgress;
}
var deletions = returnFiber.deletions;
if (deletions === null) {
returnFiber.deletions = [current2];
returnFiber.flags |= ChildDeletion;
} else {
deletions.push(current2);
}
newWorkInProgress.flags |= Placement;
return newWorkInProgress;
}
}
function checkScheduledUpdateOrContext(current2, renderLanes2) {
var updateLanes = current2.lanes;
if (includesSomeLane(updateLanes, renderLanes2)) {
return true;
}
return false;
}
function attemptEarlyBailoutIfNoScheduledUpdate(current2, workInProgress2, renderLanes2) {
switch (workInProgress2.tag) {
case HostRoot:
pushHostRootContext(workInProgress2);
var root2 = workInProgress2.stateNode;
resetHydrationState();
break;
case HostComponent:
pushHostContext(workInProgress2);
break;
case ClassComponent: {
var Component4 = workInProgress2.type;
if (isContextProvider(Component4)) {
pushContextProvider(workInProgress2);
}
break;
}
case HostPortal:
pushHostContainer(workInProgress2, workInProgress2.stateNode.containerInfo);
break;
case ContextProvider: {
var newValue = workInProgress2.memoizedProps.value;
var context = workInProgress2.type._context;
pushProvider(workInProgress2, context, newValue);
break;
}
case Profiler:
{
var hasChildWork = includesSomeLane(renderLanes2, workInProgress2.childLanes);
if (hasChildWork) {
workInProgress2.flags |= Update;
}
{
var stateNode = workInProgress2.stateNode;
stateNode.effectDuration = 0;
stateNode.passiveEffectDuration = 0;
}
}
break;
case SuspenseComponent: {
var state = workInProgress2.memoizedState;
if (state !== null) {
if (state.dehydrated !== null) {
pushSuspenseContext(workInProgress2, setDefaultShallowSuspenseContext(suspenseStackCursor.current));
workInProgress2.flags |= DidCapture;
return null;
}
var primaryChildFragment = workInProgress2.child;
var primaryChildLanes = primaryChildFragment.childLanes;
if (includesSomeLane(renderLanes2, primaryChildLanes)) {
return updateSuspenseComponent(current2, workInProgress2, renderLanes2);
} else {
pushSuspenseContext(workInProgress2, setDefaultShallowSuspenseContext(suspenseStackCursor.current));
var child = bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
if (child !== null) {
return child.sibling;
} else {
return null;
}
}
} else {
pushSuspenseContext(workInProgress2, setDefaultShallowSuspenseContext(suspenseStackCursor.current));
}
break;
}
case SuspenseListComponent: {
var didSuspendBefore = (current2.flags & DidCapture) !== NoFlags;
var _hasChildWork = includesSomeLane(renderLanes2, workInProgress2.childLanes);
if (didSuspendBefore) {
if (_hasChildWork) {
return updateSuspenseListComponent(current2, workInProgress2, renderLanes2);
}
workInProgress2.flags |= DidCapture;
}
var renderState = workInProgress2.memoizedState;
if (renderState !== null) {
renderState.rendering = null;
renderState.tail = null;
renderState.lastEffect = null;
}
pushSuspenseContext(workInProgress2, suspenseStackCursor.current);
if (_hasChildWork) {
break;
} else {
return null;
}
}
case OffscreenComponent:
case LegacyHiddenComponent: {
workInProgress2.lanes = NoLanes;
return updateOffscreenComponent(current2, workInProgress2, renderLanes2);
}
}
return bailoutOnAlreadyFinishedWork(current2, workInProgress2, renderLanes2);
}
function beginWork(current2, workInProgress2, renderLanes2) {
{
if (workInProgress2._debugNeedsRemount && current2 !== null) {
return remountFiber(current2, workInProgress2, createFiberFromTypeAndProps(workInProgress2.type, workInProgress2.key, workInProgress2.pendingProps, workInProgress2._debugOwner || null, workInProgress2.mode, workInProgress2.lanes));
}
}
if (current2 !== null) {
var oldProps = current2.memoizedProps;
var newProps = workInProgress2.pendingProps;
if (oldProps !== newProps || hasContextChanged() || workInProgress2.type !== current2.type) {
didReceiveUpdate = true;
} else {
var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current2, renderLanes2);
if (!hasScheduledUpdateOrContext && (workInProgress2.flags & DidCapture) === NoFlags) {
didReceiveUpdate = false;
return attemptEarlyBailoutIfNoScheduledUpdate(current2, workInProgress2, renderLanes2);
}
if ((current2.flags & ForceUpdateForLegacySuspense) !== NoFlags) {
didReceiveUpdate = true;
} else {
didReceiveUpdate = false;
}
}
} else {
didReceiveUpdate = false;
if (getIsHydrating() && isForkedChild(workInProgress2)) {
var slotIndex = workInProgress2.index;
var numberOfForks = getForksAtLevel();
pushTreeId(workInProgress2, numberOfForks, slotIndex);
}
}
workInProgress2.lanes = NoLanes;
switch (workInProgress2.tag) {
case IndeterminateComponent: {
return mountIndeterminateComponent(current2, workInProgress2, workInProgress2.type, renderLanes2);
}
case LazyComponent: {
var elementType = workInProgress2.elementType;
return mountLazyComponent(current2, workInProgress2, elementType, renderLanes2);
}
case FunctionComponent: {
var Component4 = workInProgress2.type;
var unresolvedProps = workInProgress2.pendingProps;
var resolvedProps = workInProgress2.elementType === Component4 ? unresolvedProps : resolveDefaultProps(Component4, unresolvedProps);
return updateFunctionComponent(current2, workInProgress2, Component4, resolvedProps, renderLanes2);
}
case ClassComponent: {
var _Component = workInProgress2.type;
var _unresolvedProps = workInProgress2.pendingProps;
var _resolvedProps = workInProgress2.elementType === _Component ? _unresolvedProps : resolveDefaultProps(_Component, _unresolvedProps);
return updateClassComponent(current2, workInProgress2, _Component, _resolvedProps, renderLanes2);
}
case HostRoot:
return updateHostRoot(current2, workInProgress2, renderLanes2);
case HostComponent:
return updateHostComponent(current2, workInProgress2, renderLanes2);
case HostText:
return updateHostText(current2, workInProgress2);
case SuspenseComponent:
return updateSuspenseComponent(current2, workInProgress2, renderLanes2);
case HostPortal:
return updatePortalComponent(current2, workInProgress2, renderLanes2);
case ForwardRef: {
var type = workInProgress2.type;
var _unresolvedProps2 = workInProgress2.pendingProps;
var _resolvedProps2 = workInProgress2.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
return updateForwardRef(current2, workInProgress2, type, _resolvedProps2, renderLanes2);
}
case Fragment:
return updateFragment(current2, workInProgress2, renderLanes2);
case Mode:
return updateMode(current2, workInProgress2, renderLanes2);
case Profiler:
return updateProfiler(current2, workInProgress2, renderLanes2);
case ContextProvider:
return updateContextProvider(current2, workInProgress2, renderLanes2);
case ContextConsumer:
return updateContextConsumer(current2, workInProgress2, renderLanes2);
case MemoComponent: {
var _type2 = workInProgress2.type;
var _unresolvedProps3 = workInProgress2.pendingProps;
var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
{
if (workInProgress2.type !== workInProgress2.elementType) {
var outerPropTypes = _type2.propTypes;
if (outerPropTypes) {
checkPropTypes(outerPropTypes, _resolvedProps3, "prop", getComponentNameFromType(_type2));
}
}
}
_resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
return updateMemoComponent(current2, workInProgress2, _type2, _resolvedProps3, renderLanes2);
}
case SimpleMemoComponent: {
return updateSimpleMemoComponent(current2, workInProgress2, workInProgress2.type, workInProgress2.pendingProps, renderLanes2);
}
case IncompleteClassComponent: {
var _Component2 = workInProgress2.type;
var _unresolvedProps4 = workInProgress2.pendingProps;
var _resolvedProps4 = workInProgress2.elementType === _Component2 ? _unresolvedProps4 : resolveDefaultProps(_Component2, _unresolvedProps4);
return mountIncompleteClassComponent(current2, workInProgress2, _Component2, _resolvedProps4, renderLanes2);
}
case SuspenseListComponent: {
return updateSuspenseListComponent(current2, workInProgress2, renderLanes2);
}
case ScopeComponent: {
break;
}
case OffscreenComponent: {
return updateOffscreenComponent(current2, workInProgress2, renderLanes2);
}
}
throw new Error("Unknown unit of work tag (" + workInProgress2.tag + "). This error is likely caused by a bug in React. Please file an issue.");
}
function markUpdate(workInProgress2) {
workInProgress2.flags |= Update;
}
function markRef$1(workInProgress2) {
workInProgress2.flags |= Ref2;
{
workInProgress2.flags |= RefStatic;
}
}
var appendAllChildren;
var updateHostContainer;
var updateHostComponent$1;
var updateHostText$1;
{
appendAllChildren = function(parent, workInProgress2, needsVisibilityToggle, isHidden) {
var node = workInProgress2.child;
while (node !== null) {
if (node.tag === HostComponent || node.tag === HostText) {
appendInitialChild(parent, node.stateNode);
} else if (node.tag === HostPortal)
;
else if (node.child !== null) {
node.child.return = node;
node = node.child;
continue;
}
if (node === workInProgress2) {
return;
}
while (node.sibling === null) {
if (node.return === null || node.return === workInProgress2) {
return;
}
node = node.return;
}
node.sibling.return = node.return;
node = node.sibling;
}
};
updateHostContainer = function(current2, workInProgress2) {
};
updateHostComponent$1 = function(current2, workInProgress2, type, newProps, rootContainerInstance) {
var oldProps = current2.memoizedProps;
if (oldProps === newProps) {
return;
}
var instance = workInProgress2.stateNode;
var currentHostContext = getHostContext();
var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
workInProgress2.updateQueue = updatePayload;
if (updatePayload) {
markUpdate(workInProgress2);
}
};
updateHostText$1 = function(current2, workInProgress2, oldText, newText) {
if (oldText !== newText) {
markUpdate(workInProgress2);
}
};
}
function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {
if (getIsHydrating()) {
return;
}
switch (renderState.tailMode) {
case "hidden": {
var tailNode = renderState.tail;
var lastTailNode = null;
while (tailNode !== null) {
if (tailNode.alternate !== null) {
lastTailNode = tailNode;
}
tailNode = tailNode.sibling;
}
if (lastTailNode === null) {
renderState.tail = null;
} else {
lastTailNode.sibling = null;
}
break;
}
case "collapsed": {
var _tailNode = renderState.tail;
var _lastTailNode = null;
while (_tailNode !== null) {
if (_tailNode.alternate !== null) {
_lastTailNode = _tailNode;
}
_tailNode = _tailNode.sibling;
}
if (_lastTailNode === null) {
if (!hasRenderedATailFallback && renderState.tail !== null) {
renderState.tail.sibling = null;
} else {
renderState.tail = null;
}
} else {
_lastTailNode.sibling = null;
}
break;
}
}
}
function bubbleProperties(completedWork) {
var didBailout = completedWork.alternate !== null && completedWork.alternate.child === completedWork.child;
var newChildLanes = NoLanes;
var subtreeFlags = NoFlags;
if (!didBailout) {
if ((completedWork.mode & ProfileMode) !== NoMode) {
var actualDuration = completedWork.actualDuration;
var treeBaseDuration = completedWork.selfBaseDuration;
var child = completedWork.child;
while (child !== null) {
newChildLanes = mergeLanes(newChildLanes, mergeLanes(child.lanes, child.childLanes));
subtreeFlags |= child.subtreeFlags;
subtreeFlags |= child.flags;
actualDuration += child.actualDuration;
treeBaseDuration += child.treeBaseDuration;
child = child.sibling;
}
completedWork.actualDuration = actualDuration;
completedWork.treeBaseDuration = treeBaseDuration;
} else {
var _child = completedWork.child;
while (_child !== null) {
newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child.lanes, _child.childLanes));
subtreeFlags |= _child.subtreeFlags;
subtreeFlags |= _child.flags;
_child.return = completedWork;
_child = _child.sibling;
}
}
completedWork.subtreeFlags |= subtreeFlags;
} else {
if ((completedWork.mode & ProfileMode) !== NoMode) {
var _treeBaseDuration = completedWork.selfBaseDuration;
var _child2 = completedWork.child;
while (_child2 !== null) {
newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child2.lanes, _child2.childLanes));
subtreeFlags |= _child2.subtreeFlags & StaticMask;
subtreeFlags |= _child2.flags & StaticMask;
_treeBaseDuration += _child2.treeBaseDuration;
_child2 = _child2.sibling;
}
completedWork.treeBaseDuration = _treeBaseDuration;
} else {
var _child3 = completedWork.child;
while (_child3 !== null) {
newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child3.lanes, _child3.childLanes));
subtreeFlags |= _child3.subtreeFlags & StaticMask;
subtreeFlags |= _child3.flags & StaticMask;
_child3.return = completedWork;
_child3 = _child3.sibling;
}
}
completedWork.subtreeFlags |= subtreeFlags;
}
completedWork.childLanes = newChildLanes;
return didBailout;
}
function completeDehydratedSuspenseBoundary(current2, workInProgress2, nextState) {
if (hasUnhydratedTailNodes() && (workInProgress2.mode & ConcurrentMode) !== NoMode && (workInProgress2.flags & DidCapture) === NoFlags) {
warnIfUnhydratedTailNodes(workInProgress2);
resetHydrationState();
workInProgress2.flags |= ForceClientRender | Incomplete | ShouldCapture;
return false;
}
var wasHydrated = popHydrationState(workInProgress2);
if (nextState !== null && nextState.dehydrated !== null) {
if (current2 === null) {
if (!wasHydrated) {
throw new Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");
}
prepareToHydrateHostSuspenseInstance(workInProgress2);
bubbleProperties(workInProgress2);
{
if ((workInProgress2.mode & ProfileMode) !== NoMode) {
var isTimedOutSuspense = nextState !== null;
if (isTimedOutSuspense) {
var primaryChildFragment = workInProgress2.child;
if (primaryChildFragment !== null) {
workInProgress2.treeBaseDuration -= primaryChildFragment.treeBaseDuration;
}
}
}
}
return false;
} else {
resetHydrationState();
if ((workInProgress2.flags & DidCapture) === NoFlags) {
workInProgress2.memoizedState = null;
}
workInProgress2.flags |= Update;
bubbleProperties(workInProgress2);
{
if ((workInProgress2.mode & ProfileMode) !== NoMode) {
var _isTimedOutSuspense = nextState !== null;
if (_isTimedOutSuspense) {
var _primaryChildFragment = workInProgress2.child;
if (_primaryChildFragment !== null) {
workInProgress2.treeBaseDuration -= _primaryChildFragment.treeBaseDuration;
}
}
}
}
return false;
}
} else {
upgradeHydrationErrorsToRecoverable();
return true;
}
}
function completeWork(current2, workInProgress2, renderLanes2) {
var newProps = workInProgress2.pendingProps;
popTreeContext(workInProgress2);
switch (workInProgress2.tag) {
case IndeterminateComponent:
case LazyComponent:
case SimpleMemoComponent:
case FunctionComponent:
case ForwardRef:
case Fragment:
case Mode:
case Profiler:
case ContextConsumer:
case MemoComponent:
bubbleProperties(workInProgress2);
return null;
case ClassComponent: {
var Component4 = workInProgress2.type;
if (isContextProvider(Component4)) {
popContext(workInProgress2);
}
bubbleProperties(workInProgress2);
return null;
}
case HostRoot: {
var fiberRoot = workInProgress2.stateNode;
popHostContainer(workInProgress2);
popTopLevelContextObject(workInProgress2);
resetWorkInProgressVersions();
if (fiberRoot.pendingContext) {
fiberRoot.context = fiberRoot.pendingContext;
fiberRoot.pendingContext = null;
}
if (current2 === null || current2.child === null) {
var wasHydrated = popHydrationState(workInProgress2);
if (wasHydrated) {
markUpdate(workInProgress2);
} else {
if (current2 !== null) {
var prevState = current2.memoizedState;
if (!prevState.isDehydrated || (workInProgress2.flags & ForceClientRender) !== NoFlags) {
workInProgress2.flags |= Snapshot;
upgradeHydrationErrorsToRecoverable();
}
}
}
}
updateHostContainer(current2, workInProgress2);
bubbleProperties(workInProgress2);
return null;
}
case HostComponent: {
popHostContext(workInProgress2);
var rootContainerInstance = getRootHostContainer();
var type = workInProgress2.type;
if (current2 !== null && workInProgress2.stateNode != null) {
updateHostComponent$1(current2, workInProgress2, type, newProps, rootContainerInstance);
if (current2.ref !== workInProgress2.ref) {
markRef$1(workInProgress2);
}
} else {
if (!newProps) {
if (workInProgress2.stateNode === null) {
throw new Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");
}
bubbleProperties(workInProgress2);
return null;
}
var currentHostContext = getHostContext();
var _wasHydrated = popHydrationState(workInProgress2);
if (_wasHydrated) {
if (prepareToHydrateHostInstance(workInProgress2, rootContainerInstance, currentHostContext)) {
markUpdate(workInProgress2);
}
} else {
var instance = createInstance2(type, newProps, rootContainerInstance, currentHostContext, workInProgress2);
appendAllChildren(instance, workInProgress2, false, false);
workInProgress2.stateNode = instance;
if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {
markUpdate(workInProgress2);
}
}
if (workInProgress2.ref !== null) {
markRef$1(workInProgress2);
}
}
bubbleProperties(workInProgress2);
return null;
}
case HostText: {
var newText = newProps;
if (current2 && workInProgress2.stateNode != null) {
var oldText = current2.memoizedProps;
updateHostText$1(current2, workInProgress2, oldText, newText);
} else {
if (typeof newText !== "string") {
if (workInProgress2.stateNode === null) {
throw new Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");
}
}
var _rootContainerInstance = getRootHostContainer();
var _currentHostContext = getHostContext();
var _wasHydrated2 = popHydrationState(workInProgress2);
if (_wasHydrated2) {
if (prepareToHydrateHostTextInstance(workInProgress2)) {
markUpdate(workInProgress2);
}
} else {
workInProgress2.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress2);
}
}
bubbleProperties(workInProgress2);
return null;
}
case SuspenseComponent: {
popSuspenseContext(workInProgress2);
var nextState = workInProgress2.memoizedState;
if (current2 === null || current2.memoizedState !== null && current2.memoizedState.dehydrated !== null) {
var fallthroughToNormalSuspensePath = completeDehydratedSuspenseBoundary(current2, workInProgress2, nextState);
if (!fallthroughToNormalSuspensePath) {
if (workInProgress2.flags & ShouldCapture) {
return workInProgress2;
} else {
return null;
}
}
}
if ((workInProgress2.flags & DidCapture) !== NoFlags) {
workInProgress2.lanes = renderLanes2;
if ((workInProgress2.mode & ProfileMode) !== NoMode) {
transferActualDuration(workInProgress2);
}
return workInProgress2;
}
var nextDidTimeout = nextState !== null;
var prevDidTimeout = current2 !== null && current2.memoizedState !== null;
if (nextDidTimeout !== prevDidTimeout) {
if (nextDidTimeout) {
var _offscreenFiber2 = workInProgress2.child;
_offscreenFiber2.flags |= Visibility;
if ((workInProgress2.mode & ConcurrentMode) !== NoMode) {
var hasInvisibleChildContext = current2 === null && (workInProgress2.memoizedProps.unstable_avoidThisFallback !== true || !enableSuspenseAvoidThisFallback);
if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {
renderDidSuspend();
} else {
renderDidSuspendDelayIfPossible();
}
}
}
}
var wakeables = workInProgress2.updateQueue;
if (wakeables !== null) {
workInProgress2.flags |= Update;
}
bubbleProperties(workInProgress2);
{
if ((workInProgress2.mode & ProfileMode) !== NoMode) {
if (nextDidTimeout) {
var primaryChildFragment = workInProgress2.child;
if (primaryChildFragment !== null) {
workInProgress2.treeBaseDuration -= primaryChildFragment.treeBaseDuration;
}
}
}
}
return null;
}
case HostPortal:
popHostContainer(workInProgress2);
updateHostContainer(current2, workInProgress2);
if (current2 === null) {
preparePortalMount(workInProgress2.stateNode.containerInfo);
}
bubbleProperties(workInProgress2);
return null;
case ContextProvider:
var context = workInProgress2.type._context;
popProvider(context, workInProgress2);
bubbleProperties(workInProgress2);
return null;
case IncompleteClassComponent: {
var _Component = workInProgress2.type;
if (isContextProvider(_Component)) {
popContext(workInProgress2);
}
bubbleProperties(workInProgress2);
return null;
}
case SuspenseListComponent: {
popSuspenseContext(workInProgress2);
var renderState = workInProgress2.memoizedState;
if (renderState === null) {
bubbleProperties(workInProgress2);
return null;
}
var didSuspendAlready = (workInProgress2.flags & DidCapture) !== NoFlags;
var renderedTail = renderState.rendering;
if (renderedTail === null) {
if (!didSuspendAlready) {
var cannotBeSuspended = renderHasNotSuspendedYet() && (current2 === null || (current2.flags & DidCapture) === NoFlags);
if (!cannotBeSuspended) {
var row = workInProgress2.child;
while (row !== null) {
var suspended = findFirstSuspended(row);
if (suspended !== null) {
didSuspendAlready = true;
workInProgress2.flags |= DidCapture;
cutOffTailIfNeeded(renderState, false);
var newThenables = suspended.updateQueue;
if (newThenables !== null) {
workInProgress2.updateQueue = newThenables;
workInProgress2.flags |= Update;
}
workInProgress2.subtreeFlags = NoFlags;
resetChildFibers(workInProgress2, renderLanes2);
pushSuspenseContext(workInProgress2, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback));
return workInProgress2.child;
}
row = row.sibling;
}
}
if (renderState.tail !== null && now() > getRenderTargetTime()) {
workInProgress2.flags |= DidCapture;
didSuspendAlready = true;
cutOffTailIfNeeded(renderState, false);
workInProgress2.lanes = SomeRetryLane;
}
} else {
cutOffTailIfNeeded(renderState, false);
}
} else {
if (!didSuspendAlready) {
var _suspended = findFirstSuspended(renderedTail);
if (_suspended !== null) {
workInProgress2.flags |= DidCapture;
didSuspendAlready = true;
var _newThenables = _suspended.updateQueue;
if (_newThenables !== null) {
workInProgress2.updateQueue = _newThenables;
workInProgress2.flags |= Update;
}
cutOffTailIfNeeded(renderState, true);
if (renderState.tail === null && renderState.tailMode === "hidden" && !renderedTail.alternate && !getIsHydrating()) {
bubbleProperties(workInProgress2);
return null;
}
} else if (now() * 2 - renderState.renderingStartTime > getRenderTargetTime() && renderLanes2 !== OffscreenLane) {
workInProgress2.flags |= DidCapture;
didSuspendAlready = true;
cutOffTailIfNeeded(renderState, false);
workInProgress2.lanes = SomeRetryLane;
}
}
if (renderState.isBackwards) {
renderedTail.sibling = workInProgress2.child;
workInProgress2.child = renderedTail;
} else {
var previousSibling = renderState.last;
if (previousSibling !== null) {
previousSibling.sibling = renderedTail;
} else {
workInProgress2.child = renderedTail;
}
renderState.last = renderedTail;
}
}
if (renderState.tail !== null) {
var next = renderState.tail;
renderState.rendering = next;
renderState.tail = next.sibling;
renderState.renderingStartTime = now();
next.sibling = null;
var suspenseContext = suspenseStackCursor.current;
if (didSuspendAlready) {
suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
} else {
suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
}
pushSuspenseContext(workInProgress2, suspenseContext);
return next;
}
bubbleProperties(workInProgress2);
return null;
}
case ScopeComponent: {
break;
}
case OffscreenComponent:
case LegacyHiddenComponent: {
popRenderLanes(workInProgress2);
var _nextState = workInProgress2.memoizedState;
var nextIsHidden = _nextState !== null;
if (current2 !== null) {
var _prevState = current2.memoizedState;
var prevIsHidden = _prevState !== null;
if (prevIsHidden !== nextIsHidden && !enableLegacyHidden) {
workInProgress2.flags |= Visibility;
}
}
if (!nextIsHidden || (workInProgress2.mode & ConcurrentMode) === NoMode) {
bubbleProperties(workInProgress2);
} else {
if (includesSomeLane(subtreeRenderLanes, OffscreenLane)) {
bubbleProperties(workInProgress2);
{
if (workInProgress2.subtreeFlags & (Placement | Update)) {
workInProgress2.flags |= Visibility;
}
}
}
}
return null;
}
case CacheComponent: {
return null;
}
case TracingMarkerComponent: {
return null;
}
}
throw new Error("Unknown unit of work tag (" + workInProgress2.tag + "). This error is likely caused by a bug in React. Please file an issue.");
}
function unwindWork(current2, workInProgress2, renderLanes2) {
popTreeContext(workInProgress2);
switch (workInProgress2.tag) {
case ClassComponent: {
var Component4 = workInProgress2.type;
if (isContextProvider(Component4)) {
popContext(workInProgress2);
}
var flags = workInProgress2.flags;
if (flags & ShouldCapture) {
workInProgress2.flags = flags & ~ShouldCapture | DidCapture;
if ((workInProgress2.mode & ProfileMode) !== NoMode) {
transferActualDuration(workInProgress2);
}
return workInProgress2;
}
return null;
}
case HostRoot: {
var root2 = workInProgress2.stateNode;
popHostContainer(workInProgress2);
popTopLevelContextObject(workInProgress2);
resetWorkInProgressVersions();
var _flags = workInProgress2.flags;
if ((_flags & ShouldCapture) !== NoFlags && (_flags & DidCapture) === NoFlags) {
workInProgress2.flags = _flags & ~ShouldCapture | DidCapture;
return workInProgress2;
}
return null;
}
case HostComponent: {
popHostContext(workInProgress2);
return null;
}
case SuspenseComponent: {
popSuspenseContext(workInProgress2);
var suspenseState = workInProgress2.memoizedState;
if (suspenseState !== null && suspenseState.dehydrated !== null) {
if (workInProgress2.alternate === null) {
throw new Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");
}
resetHydrationState();
}
var _flags2 = workInProgress2.flags;
if (_flags2 & ShouldCapture) {
workInProgress2.flags = _flags2 & ~ShouldCapture | DidCapture;
if ((workInProgress2.mode & ProfileMode) !== NoMode) {
transferActualDuration(workInProgress2);
}
return workInProgress2;
}
return null;
}
case SuspenseListComponent: {
popSuspenseContext(workInProgress2);
return null;
}
case HostPortal:
popHostContainer(workInProgress2);
return null;
case ContextProvider:
var context = workInProgress2.type._context;
popProvider(context, workInProgress2);
return null;
case OffscreenComponent:
case LegacyHiddenComponent:
popRenderLanes(workInProgress2);
return null;
case CacheComponent:
return null;
default:
return null;
}
}
function unwindInterruptedWork(current2, interruptedWork, renderLanes2) {
popTreeContext(interruptedWork);
switch (interruptedWork.tag) {
case ClassComponent: {
var childContextTypes = interruptedWork.type.childContextTypes;
if (childContextTypes !== null && childContextTypes !== void 0) {
popContext(interruptedWork);
}
break;
}
case HostRoot: {
var root2 = interruptedWork.stateNode;
popHostContainer(interruptedWork);
popTopLevelContextObject(interruptedWork);
resetWorkInProgressVersions();
break;
}
case HostComponent: {
popHostContext(interruptedWork);
break;
}
case HostPortal:
popHostContainer(interruptedWork);
break;
case SuspenseComponent:
popSuspenseContext(interruptedWork);
break;
case SuspenseListComponent:
popSuspenseContext(interruptedWork);
break;
case ContextProvider:
var context = interruptedWork.type._context;
popProvider(context, interruptedWork);
break;
case OffscreenComponent:
case LegacyHiddenComponent:
popRenderLanes(interruptedWork);
break;
}
}
var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
{
didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
}
var offscreenSubtreeIsHidden = false;
var offscreenSubtreeWasHidden = false;
var PossiblyWeakSet = typeof WeakSet === "function" ? WeakSet : Set;
var nextEffect = null;
var inProgressLanes = null;
var inProgressRoot = null;
function reportUncaughtErrorInDEV(error2) {
{
invokeGuardedCallback(null, function() {
throw error2;
});
clearCaughtError();
}
}
var callComponentWillUnmountWithTimer = function(current2, instance) {
instance.props = current2.memoizedProps;
instance.state = current2.memoizedState;
if (current2.mode & ProfileMode) {
try {
startLayoutEffectTimer();
instance.componentWillUnmount();
} finally {
recordLayoutEffectDuration(current2);
}
} else {
instance.componentWillUnmount();
}
};
function safelyCallCommitHookLayoutEffectListMount(current2, nearestMountedAncestor) {
try {
commitHookEffectListMount(Layout2, current2);
} catch (error2) {
captureCommitPhaseError(current2, nearestMountedAncestor, error2);
}
}
function safelyCallComponentWillUnmount(current2, nearestMountedAncestor, instance) {
try {
callComponentWillUnmountWithTimer(current2, instance);
} catch (error2) {
captureCommitPhaseError(current2, nearestMountedAncestor, error2);
}
}
function safelyCallComponentDidMount(current2, nearestMountedAncestor, instance) {
try {
instance.componentDidMount();
} catch (error2) {
captureCommitPhaseError(current2, nearestMountedAncestor, error2);
}
}
function safelyAttachRef(current2, nearestMountedAncestor) {
try {
commitAttachRef(current2);
} catch (error2) {
captureCommitPhaseError(current2, nearestMountedAncestor, error2);
}
}
function safelyDetachRef(current2, nearestMountedAncestor) {
var ref = current2.ref;
if (ref !== null) {
if (typeof ref === "function") {
var retVal;
try {
if (enableProfilerTimer && enableProfilerCommitHooks && current2.mode & ProfileMode) {
try {
startLayoutEffectTimer();
retVal = ref(null);
} finally {
recordLayoutEffectDuration(current2);
}
} else {
retVal = ref(null);
}
} catch (error2) {
captureCommitPhaseError(current2, nearestMountedAncestor, error2);
}
{
if (typeof retVal === "function") {
error("Unexpected return value from a callback ref in %s. A callback ref should not return a function.", getComponentNameFromFiber(current2));
}
}
} else {
ref.current = null;
}
}
}
function safelyCallDestroy(current2, nearestMountedAncestor, destroy) {
try {
destroy();
} catch (error2) {
captureCommitPhaseError(current2, nearestMountedAncestor, error2);
}
}
var focusedInstanceHandle = null;
var shouldFireAfterActiveInstanceBlur = false;
function commitBeforeMutationEffects(root2, firstChild) {
focusedInstanceHandle = prepareForCommit(root2.containerInfo);
nextEffect = firstChild;
commitBeforeMutationEffects_begin();
var shouldFire = shouldFireAfterActiveInstanceBlur;
shouldFireAfterActiveInstanceBlur = false;
focusedInstanceHandle = null;
return shouldFire;
}
function commitBeforeMutationEffects_begin() {
while (nextEffect !== null) {
var fiber = nextEffect;
var child = fiber.child;
if ((fiber.subtreeFlags & BeforeMutationMask) !== NoFlags && child !== null) {
child.return = fiber;
nextEffect = child;
} else {
commitBeforeMutationEffects_complete();
}
}
}
function commitBeforeMutationEffects_complete() {
while (nextEffect !== null) {
var fiber = nextEffect;
setCurrentFiber(fiber);
try {
commitBeforeMutationEffectsOnFiber(fiber);
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
resetCurrentFiber();
var sibling = fiber.sibling;
if (sibling !== null) {
sibling.return = fiber.return;
nextEffect = sibling;
return;
}
nextEffect = fiber.return;
}
}
function commitBeforeMutationEffectsOnFiber(finishedWork) {
var current2 = finishedWork.alternate;
var flags = finishedWork.flags;
if ((flags & Snapshot) !== NoFlags) {
setCurrentFiber(finishedWork);
switch (finishedWork.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
break;
}
case ClassComponent: {
if (current2 !== null) {
var prevProps = current2.memoizedProps;
var prevState = current2.memoizedState;
var instance = finishedWork.stateNode;
{
if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
if (instance.props !== finishedWork.memoizedProps) {
error("Expected %s props to match memoized props before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance");
}
if (instance.state !== finishedWork.memoizedState) {
error("Expected %s state to match memoized state before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance");
}
}
}
var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
{
var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
if (snapshot === void 0 && !didWarnSet.has(finishedWork.type)) {
didWarnSet.add(finishedWork.type);
error("%s.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.", getComponentNameFromFiber(finishedWork));
}
}
instance.__reactInternalSnapshotBeforeUpdate = snapshot;
}
break;
}
case HostRoot: {
{
var root2 = finishedWork.stateNode;
clearContainer(root2.containerInfo);
}
break;
}
case HostComponent:
case HostText:
case HostPortal:
case IncompleteClassComponent:
break;
default: {
throw new Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
}
}
resetCurrentFiber();
}
}
function commitHookEffectListUnmount(flags, finishedWork, nearestMountedAncestor) {
var updateQueue = finishedWork.updateQueue;
var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
if (lastEffect !== null) {
var firstEffect = lastEffect.next;
var effect = firstEffect;
do {
if ((effect.tag & flags) === flags) {
var destroy = effect.destroy;
effect.destroy = void 0;
if (destroy !== void 0) {
{
if ((flags & Passive$1) !== NoFlags$1) {
markComponentPassiveEffectUnmountStarted(finishedWork);
} else if ((flags & Layout2) !== NoFlags$1) {
markComponentLayoutEffectUnmountStarted(finishedWork);
}
}
{
if ((flags & Insertion) !== NoFlags$1) {
setIsRunningInsertionEffect(true);
}
}
safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy);
{
if ((flags & Insertion) !== NoFlags$1) {
setIsRunningInsertionEffect(false);
}
}
{
if ((flags & Passive$1) !== NoFlags$1) {
markComponentPassiveEffectUnmountStopped();
} else if ((flags & Layout2) !== NoFlags$1) {
markComponentLayoutEffectUnmountStopped();
}
}
}
}
effect = effect.next;
} while (effect !== firstEffect);
}
}
function commitHookEffectListMount(flags, finishedWork) {
var updateQueue = finishedWork.updateQueue;
var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
if (lastEffect !== null) {
var firstEffect = lastEffect.next;
var effect = firstEffect;
do {
if ((effect.tag & flags) === flags) {
{
if ((flags & Passive$1) !== NoFlags$1) {
markComponentPassiveEffectMountStarted(finishedWork);
} else if ((flags & Layout2) !== NoFlags$1) {
markComponentLayoutEffectMountStarted(finishedWork);
}
}
var create2 = effect.create;
{
if ((flags & Insertion) !== NoFlags$1) {
setIsRunningInsertionEffect(true);
}
}
effect.destroy = create2();
{
if ((flags & Insertion) !== NoFlags$1) {
setIsRunningInsertionEffect(false);
}
}
{
if ((flags & Passive$1) !== NoFlags$1) {
markComponentPassiveEffectMountStopped();
} else if ((flags & Layout2) !== NoFlags$1) {
markComponentLayoutEffectMountStopped();
}
}
{
var destroy = effect.destroy;
if (destroy !== void 0 && typeof destroy !== "function") {
var hookName = void 0;
if ((effect.tag & Layout2) !== NoFlags) {
hookName = "useLayoutEffect";
} else if ((effect.tag & Insertion) !== NoFlags) {
hookName = "useInsertionEffect";
} else {
hookName = "useEffect";
}
var addendum = void 0;
if (destroy === null) {
addendum = " You returned null. If your effect does not require clean up, return undefined (or nothing).";
} else if (typeof destroy.then === "function") {
addendum = "\n\nIt looks like you wrote " + hookName + "(async () => ...) or returned a Promise. Instead, write the async function inside your effect and call it immediately:\n\n" + hookName + "(() => {\n async function fetchData() {\n // You can await here\n const response = await MyAPI.getData(someId);\n // ...\n }\n fetchData();\n}, [someId]); // Or [] if effect doesn't need props or state\n\nLearn more about data fetching with Hooks: https://reactjs.org/link/hooks-data-fetching";
} else {
addendum = " You returned: " + destroy;
}
error("%s must not return anything besides a function, which is used for clean-up.%s", hookName, addendum);
}
}
}
effect = effect.next;
} while (effect !== firstEffect);
}
}
function commitPassiveEffectDurations(finishedRoot, finishedWork) {
{
if ((finishedWork.flags & Update) !== NoFlags) {
switch (finishedWork.tag) {
case Profiler: {
var passiveEffectDuration = finishedWork.stateNode.passiveEffectDuration;
var _finishedWork$memoize = finishedWork.memoizedProps, id = _finishedWork$memoize.id, onPostCommit = _finishedWork$memoize.onPostCommit;
var commitTime2 = getCommitTime();
var phase = finishedWork.alternate === null ? "mount" : "update";
{
if (isCurrentUpdateNested()) {
phase = "nested-update";
}
}
if (typeof onPostCommit === "function") {
onPostCommit(id, phase, passiveEffectDuration, commitTime2);
}
var parentFiber = finishedWork.return;
outer:
while (parentFiber !== null) {
switch (parentFiber.tag) {
case HostRoot:
var root2 = parentFiber.stateNode;
root2.passiveEffectDuration += passiveEffectDuration;
break outer;
case Profiler:
var parentStateNode = parentFiber.stateNode;
parentStateNode.passiveEffectDuration += passiveEffectDuration;
break outer;
}
parentFiber = parentFiber.return;
}
break;
}
}
}
}
}
function commitLayoutEffectOnFiber(finishedRoot, current2, finishedWork, committedLanes) {
if ((finishedWork.flags & LayoutMask) !== NoFlags) {
switch (finishedWork.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
if (!offscreenSubtreeWasHidden) {
if (finishedWork.mode & ProfileMode) {
try {
startLayoutEffectTimer();
commitHookEffectListMount(Layout2 | HasEffect, finishedWork);
} finally {
recordLayoutEffectDuration(finishedWork);
}
} else {
commitHookEffectListMount(Layout2 | HasEffect, finishedWork);
}
}
break;
}
case ClassComponent: {
var instance = finishedWork.stateNode;
if (finishedWork.flags & Update) {
if (!offscreenSubtreeWasHidden) {
if (current2 === null) {
{
if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
if (instance.props !== finishedWork.memoizedProps) {
error("Expected %s props to match memoized props before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance");
}
if (instance.state !== finishedWork.memoizedState) {
error("Expected %s state to match memoized state before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance");
}
}
}
if (finishedWork.mode & ProfileMode) {
try {
startLayoutEffectTimer();
instance.componentDidMount();
} finally {
recordLayoutEffectDuration(finishedWork);
}
} else {
instance.componentDidMount();
}
} else {
var prevProps = finishedWork.elementType === finishedWork.type ? current2.memoizedProps : resolveDefaultProps(finishedWork.type, current2.memoizedProps);
var prevState = current2.memoizedState;
{
if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
if (instance.props !== finishedWork.memoizedProps) {
error("Expected %s props to match memoized props before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance");
}
if (instance.state !== finishedWork.memoizedState) {
error("Expected %s state to match memoized state before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance");
}
}
}
if (finishedWork.mode & ProfileMode) {
try {
startLayoutEffectTimer();
instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
} finally {
recordLayoutEffectDuration(finishedWork);
}
} else {
instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
}
}
}
}
var updateQueue = finishedWork.updateQueue;
if (updateQueue !== null) {
{
if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
if (instance.props !== finishedWork.memoizedProps) {
error("Expected %s props to match memoized props before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance");
}
if (instance.state !== finishedWork.memoizedState) {
error("Expected %s state to match memoized state before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance");
}
}
}
commitUpdateQueue(finishedWork, updateQueue, instance);
}
break;
}
case HostRoot: {
var _updateQueue = finishedWork.updateQueue;
if (_updateQueue !== null) {
var _instance = null;
if (finishedWork.child !== null) {
switch (finishedWork.child.tag) {
case HostComponent:
_instance = getPublicInstance(finishedWork.child.stateNode);
break;
case ClassComponent:
_instance = finishedWork.child.stateNode;
break;
}
}
commitUpdateQueue(finishedWork, _updateQueue, _instance);
}
break;
}
case HostComponent: {
var _instance2 = finishedWork.stateNode;
if (current2 === null && finishedWork.flags & Update) {
var type = finishedWork.type;
var props = finishedWork.memoizedProps;
commitMount(_instance2, type, props);
}
break;
}
case HostText: {
break;
}
case HostPortal: {
break;
}
case Profiler: {
{
var _finishedWork$memoize2 = finishedWork.memoizedProps, onCommit = _finishedWork$memoize2.onCommit, onRender = _finishedWork$memoize2.onRender;
var effectDuration = finishedWork.stateNode.effectDuration;
var commitTime2 = getCommitTime();
var phase = current2 === null ? "mount" : "update";
{
if (isCurrentUpdateNested()) {
phase = "nested-update";
}
}
if (typeof onRender === "function") {
onRender(finishedWork.memoizedProps.id, phase, finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitTime2);
}
{
if (typeof onCommit === "function") {
onCommit(finishedWork.memoizedProps.id, phase, effectDuration, commitTime2);
}
enqueuePendingPassiveProfilerEffect(finishedWork);
var parentFiber = finishedWork.return;
outer:
while (parentFiber !== null) {
switch (parentFiber.tag) {
case HostRoot:
var root2 = parentFiber.stateNode;
root2.effectDuration += effectDuration;
break outer;
case Profiler:
var parentStateNode = parentFiber.stateNode;
parentStateNode.effectDuration += effectDuration;
break outer;
}
parentFiber = parentFiber.return;
}
}
}
break;
}
case SuspenseComponent: {
commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);
break;
}
case SuspenseListComponent:
case IncompleteClassComponent:
case ScopeComponent:
case OffscreenComponent:
case LegacyHiddenComponent:
case TracingMarkerComponent: {
break;
}
default:
throw new Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
}
}
if (!offscreenSubtreeWasHidden) {
{
if (finishedWork.flags & Ref2) {
commitAttachRef(finishedWork);
}
}
}
}
function reappearLayoutEffectsOnFiber(node) {
switch (node.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
if (node.mode & ProfileMode) {
try {
startLayoutEffectTimer();
safelyCallCommitHookLayoutEffectListMount(node, node.return);
} finally {
recordLayoutEffectDuration(node);
}
} else {
safelyCallCommitHookLayoutEffectListMount(node, node.return);
}
break;
}
case ClassComponent: {
var instance = node.stateNode;
if (typeof instance.componentDidMount === "function") {
safelyCallComponentDidMount(node, node.return, instance);
}
safelyAttachRef(node, node.return);
break;
}
case HostComponent: {
safelyAttachRef(node, node.return);
break;
}
}
}
function hideOrUnhideAllChildren(finishedWork, isHidden) {
var hostSubtreeRoot = null;
{
var node = finishedWork;
while (true) {
if (node.tag === HostComponent) {
if (hostSubtreeRoot === null) {
hostSubtreeRoot = node;
try {
var instance = node.stateNode;
if (isHidden) {
hideInstance(instance);
} else {
unhideInstance(node.stateNode, node.memoizedProps);
}
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
}
} else if (node.tag === HostText) {
if (hostSubtreeRoot === null) {
try {
var _instance3 = node.stateNode;
if (isHidden) {
hideTextInstance(_instance3);
} else {
unhideTextInstance(_instance3, node.memoizedProps);
}
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
}
} else if ((node.tag === OffscreenComponent || node.tag === LegacyHiddenComponent) && node.memoizedState !== null && node !== finishedWork)
;
else if (node.child !== null) {
node.child.return = node;
node = node.child;
continue;
}
if (node === finishedWork) {
return;
}
while (node.sibling === null) {
if (node.return === null || node.return === finishedWork) {
return;
}
if (hostSubtreeRoot === node) {
hostSubtreeRoot = null;
}
node = node.return;
}
if (hostSubtreeRoot === node) {
hostSubtreeRoot = null;
}
node.sibling.return = node.return;
node = node.sibling;
}
}
}
function commitAttachRef(finishedWork) {
var ref = finishedWork.ref;
if (ref !== null) {
var instance = finishedWork.stateNode;
var instanceToUse;
switch (finishedWork.tag) {
case HostComponent:
instanceToUse = getPublicInstance(instance);
break;
default:
instanceToUse = instance;
}
if (typeof ref === "function") {
var retVal;
if (finishedWork.mode & ProfileMode) {
try {
startLayoutEffectTimer();
retVal = ref(instanceToUse);
} finally {
recordLayoutEffectDuration(finishedWork);
}
} else {
retVal = ref(instanceToUse);
}
{
if (typeof retVal === "function") {
error("Unexpected return value from a callback ref in %s. A callback ref should not return a function.", getComponentNameFromFiber(finishedWork));
}
}
} else {
{
if (!ref.hasOwnProperty("current")) {
error("Unexpected ref object provided for %s. Use either a ref-setter function or React.createRef().", getComponentNameFromFiber(finishedWork));
}
}
ref.current = instanceToUse;
}
}
}
function detachFiberMutation(fiber) {
var alternate = fiber.alternate;
if (alternate !== null) {
alternate.return = null;
}
fiber.return = null;
}
function detachFiberAfterEffects(fiber) {
var alternate = fiber.alternate;
if (alternate !== null) {
fiber.alternate = null;
detachFiberAfterEffects(alternate);
}
{
fiber.child = null;
fiber.deletions = null;
fiber.sibling = null;
if (fiber.tag === HostComponent) {
var hostInstance = fiber.stateNode;
if (hostInstance !== null) {
detachDeletedInstance(hostInstance);
}
}
fiber.stateNode = null;
{
fiber._debugOwner = null;
}
{
fiber.return = null;
fiber.dependencies = null;
fiber.memoizedProps = null;
fiber.memoizedState = null;
fiber.pendingProps = null;
fiber.stateNode = null;
fiber.updateQueue = null;
}
}
}
function getHostParentFiber(fiber) {
var parent = fiber.return;
while (parent !== null) {
if (isHostParent(parent)) {
return parent;
}
parent = parent.return;
}
throw new Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");
}
function isHostParent(fiber) {
return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
}
function getHostSibling(fiber) {
var node = fiber;
siblings:
while (true) {
while (node.sibling === null) {
if (node.return === null || isHostParent(node.return)) {
return null;
}
node = node.return;
}
node.sibling.return = node.return;
node = node.sibling;
while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {
if (node.flags & Placement) {
continue siblings;
}
if (node.child === null || node.tag === HostPortal) {
continue siblings;
} else {
node.child.return = node;
node = node.child;
}
}
if (!(node.flags & Placement)) {
return node.stateNode;
}
}
}
function commitPlacement(finishedWork) {
var parentFiber = getHostParentFiber(finishedWork);
switch (parentFiber.tag) {
case HostComponent: {
var parent = parentFiber.stateNode;
if (parentFiber.flags & ContentReset) {
resetTextContent(parent);
parentFiber.flags &= ~ContentReset;
}
var before = getHostSibling(finishedWork);
insertOrAppendPlacementNode(finishedWork, before, parent);
break;
}
case HostRoot:
case HostPortal: {
var _parent = parentFiber.stateNode.containerInfo;
var _before = getHostSibling(finishedWork);
insertOrAppendPlacementNodeIntoContainer(finishedWork, _before, _parent);
break;
}
default:
throw new Error("Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.");
}
}
function insertOrAppendPlacementNodeIntoContainer(node, before, parent) {
var tag = node.tag;
var isHost = tag === HostComponent || tag === HostText;
if (isHost) {
var stateNode = node.stateNode;
if (before) {
insertInContainerBefore(parent, stateNode, before);
} else {
appendChildToContainer(parent, stateNode);
}
} else if (tag === HostPortal)
;
else {
var child = node.child;
if (child !== null) {
insertOrAppendPlacementNodeIntoContainer(child, before, parent);
var sibling = child.sibling;
while (sibling !== null) {
insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);
sibling = sibling.sibling;
}
}
}
}
function insertOrAppendPlacementNode(node, before, parent) {
var tag = node.tag;
var isHost = tag === HostComponent || tag === HostText;
if (isHost) {
var stateNode = node.stateNode;
if (before) {
insertBefore(parent, stateNode, before);
} else {
appendChild(parent, stateNode);
}
} else if (tag === HostPortal)
;
else {
var child = node.child;
if (child !== null) {
insertOrAppendPlacementNode(child, before, parent);
var sibling = child.sibling;
while (sibling !== null) {
insertOrAppendPlacementNode(sibling, before, parent);
sibling = sibling.sibling;
}
}
}
}
var hostParent = null;
var hostParentIsContainer = false;
function commitDeletionEffects(root2, returnFiber, deletedFiber) {
{
var parent = returnFiber;
findParent:
while (parent !== null) {
switch (parent.tag) {
case HostComponent: {
hostParent = parent.stateNode;
hostParentIsContainer = false;
break findParent;
}
case HostRoot: {
hostParent = parent.stateNode.containerInfo;
hostParentIsContainer = true;
break findParent;
}
case HostPortal: {
hostParent = parent.stateNode.containerInfo;
hostParentIsContainer = true;
break findParent;
}
}
parent = parent.return;
}
if (hostParent === null) {
throw new Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");
}
commitDeletionEffectsOnFiber(root2, returnFiber, deletedFiber);
hostParent = null;
hostParentIsContainer = false;
}
detachFiberMutation(deletedFiber);
}
function recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, parent) {
var child = parent.child;
while (child !== null) {
commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, child);
child = child.sibling;
}
}
function commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, deletedFiber) {
onCommitUnmount(deletedFiber);
switch (deletedFiber.tag) {
case HostComponent: {
if (!offscreenSubtreeWasHidden) {
safelyDetachRef(deletedFiber, nearestMountedAncestor);
}
}
case HostText: {
{
var prevHostParent = hostParent;
var prevHostParentIsContainer = hostParentIsContainer;
hostParent = null;
recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
hostParent = prevHostParent;
hostParentIsContainer = prevHostParentIsContainer;
if (hostParent !== null) {
if (hostParentIsContainer) {
removeChildFromContainer(hostParent, deletedFiber.stateNode);
} else {
removeChild(hostParent, deletedFiber.stateNode);
}
}
}
return;
}
case DehydratedFragment: {
{
if (hostParent !== null) {
if (hostParentIsContainer) {
clearSuspenseBoundaryFromContainer(hostParent, deletedFiber.stateNode);
} else {
clearSuspenseBoundary(hostParent, deletedFiber.stateNode);
}
}
}
return;
}
case HostPortal: {
{
var _prevHostParent = hostParent;
var _prevHostParentIsContainer = hostParentIsContainer;
hostParent = deletedFiber.stateNode.containerInfo;
hostParentIsContainer = true;
recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
hostParent = _prevHostParent;
hostParentIsContainer = _prevHostParentIsContainer;
}
return;
}
case FunctionComponent:
case ForwardRef:
case MemoComponent:
case SimpleMemoComponent: {
if (!offscreenSubtreeWasHidden) {
var updateQueue = deletedFiber.updateQueue;
if (updateQueue !== null) {
var lastEffect = updateQueue.lastEffect;
if (lastEffect !== null) {
var firstEffect = lastEffect.next;
var effect = firstEffect;
do {
var _effect = effect, destroy = _effect.destroy, tag = _effect.tag;
if (destroy !== void 0) {
if ((tag & Insertion) !== NoFlags$1) {
safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
} else if ((tag & Layout2) !== NoFlags$1) {
{
markComponentLayoutEffectUnmountStarted(deletedFiber);
}
if (deletedFiber.mode & ProfileMode) {
startLayoutEffectTimer();
safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
recordLayoutEffectDuration(deletedFiber);
} else {
safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
}
{
markComponentLayoutEffectUnmountStopped();
}
}
}
effect = effect.next;
} while (effect !== firstEffect);
}
}
}
recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
return;
}
case ClassComponent: {
if (!offscreenSubtreeWasHidden) {
safelyDetachRef(deletedFiber, nearestMountedAncestor);
var instance = deletedFiber.stateNode;
if (typeof instance.componentWillUnmount === "function") {
safelyCallComponentWillUnmount(deletedFiber, nearestMountedAncestor, instance);
}
}
recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
return;
}
case ScopeComponent: {
recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
return;
}
case OffscreenComponent: {
if (deletedFiber.mode & ConcurrentMode) {
var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || deletedFiber.memoizedState !== null;
recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
} else {
recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
}
break;
}
default: {
recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
return;
}
}
}
function commitSuspenseCallback(finishedWork) {
var newState = finishedWork.memoizedState;
}
function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {
var newState = finishedWork.memoizedState;
if (newState === null) {
var current2 = finishedWork.alternate;
if (current2 !== null) {
var prevState = current2.memoizedState;
if (prevState !== null) {
var suspenseInstance = prevState.dehydrated;
if (suspenseInstance !== null) {
commitHydratedSuspenseInstance(suspenseInstance);
}
}
}
}
}
function attachSuspenseRetryListeners(finishedWork) {
var wakeables = finishedWork.updateQueue;
if (wakeables !== null) {
finishedWork.updateQueue = null;
var retryCache = finishedWork.stateNode;
if (retryCache === null) {
retryCache = finishedWork.stateNode = new PossiblyWeakSet();
}
wakeables.forEach(function(wakeable) {
var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable);
if (!retryCache.has(wakeable)) {
retryCache.add(wakeable);
{
if (isDevToolsPresent) {
if (inProgressLanes !== null && inProgressRoot !== null) {
restorePendingUpdaters(inProgressRoot, inProgressLanes);
} else {
throw Error("Expected finished root and lanes to be set. This is a bug in React.");
}
}
}
wakeable.then(retry, retry);
}
});
}
}
function commitMutationEffects(root2, finishedWork, committedLanes) {
inProgressLanes = committedLanes;
inProgressRoot = root2;
setCurrentFiber(finishedWork);
commitMutationEffectsOnFiber(finishedWork, root2);
setCurrentFiber(finishedWork);
inProgressLanes = null;
inProgressRoot = null;
}
function recursivelyTraverseMutationEffects(root2, parentFiber, lanes) {
var deletions = parentFiber.deletions;
if (deletions !== null) {
for (var i = 0; i < deletions.length; i++) {
var childToDelete = deletions[i];
try {
commitDeletionEffects(root2, parentFiber, childToDelete);
} catch (error2) {
captureCommitPhaseError(childToDelete, parentFiber, error2);
}
}
}
var prevDebugFiber = getCurrentFiber();
if (parentFiber.subtreeFlags & MutationMask) {
var child = parentFiber.child;
while (child !== null) {
setCurrentFiber(child);
commitMutationEffectsOnFiber(child, root2);
child = child.sibling;
}
}
setCurrentFiber(prevDebugFiber);
}
function commitMutationEffectsOnFiber(finishedWork, root2, lanes) {
var current2 = finishedWork.alternate;
var flags = finishedWork.flags;
switch (finishedWork.tag) {
case FunctionComponent:
case ForwardRef:
case MemoComponent:
case SimpleMemoComponent: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
if (flags & Update) {
try {
commitHookEffectListUnmount(Insertion | HasEffect, finishedWork, finishedWork.return);
commitHookEffectListMount(Insertion | HasEffect, finishedWork);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
if (finishedWork.mode & ProfileMode) {
try {
startLayoutEffectTimer();
commitHookEffectListUnmount(Layout2 | HasEffect, finishedWork, finishedWork.return);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
recordLayoutEffectDuration(finishedWork);
} else {
try {
commitHookEffectListUnmount(Layout2 | HasEffect, finishedWork, finishedWork.return);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
}
}
return;
}
case ClassComponent: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
if (flags & Ref2) {
if (current2 !== null) {
safelyDetachRef(current2, current2.return);
}
}
return;
}
case HostComponent: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
if (flags & Ref2) {
if (current2 !== null) {
safelyDetachRef(current2, current2.return);
}
}
{
if (finishedWork.flags & ContentReset) {
var instance = finishedWork.stateNode;
try {
resetTextContent(instance);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
}
if (flags & Update) {
var _instance4 = finishedWork.stateNode;
if (_instance4 != null) {
var newProps = finishedWork.memoizedProps;
var oldProps = current2 !== null ? current2.memoizedProps : newProps;
var type = finishedWork.type;
var updatePayload = finishedWork.updateQueue;
finishedWork.updateQueue = null;
if (updatePayload !== null) {
try {
commitUpdate(_instance4, updatePayload, type, oldProps, newProps, finishedWork);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
}
}
}
}
return;
}
case HostText: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
if (flags & Update) {
{
if (finishedWork.stateNode === null) {
throw new Error("This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.");
}
var textInstance = finishedWork.stateNode;
var newText = finishedWork.memoizedProps;
var oldText = current2 !== null ? current2.memoizedProps : newText;
try {
commitTextUpdate(textInstance, oldText, newText);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
}
}
return;
}
case HostRoot: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
if (flags & Update) {
{
if (current2 !== null) {
var prevRootState = current2.memoizedState;
if (prevRootState.isDehydrated) {
try {
commitHydratedContainer(root2.containerInfo);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
}
}
}
}
return;
}
case HostPortal: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
return;
}
case SuspenseComponent: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
var offscreenFiber = finishedWork.child;
if (offscreenFiber.flags & Visibility) {
var offscreenInstance = offscreenFiber.stateNode;
var newState = offscreenFiber.memoizedState;
var isHidden = newState !== null;
offscreenInstance.isHidden = isHidden;
if (isHidden) {
var wasHidden = offscreenFiber.alternate !== null && offscreenFiber.alternate.memoizedState !== null;
if (!wasHidden) {
markCommitTimeOfFallback();
}
}
}
if (flags & Update) {
try {
commitSuspenseCallback(finishedWork);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
attachSuspenseRetryListeners(finishedWork);
}
return;
}
case OffscreenComponent: {
var _wasHidden = current2 !== null && current2.memoizedState !== null;
if (finishedWork.mode & ConcurrentMode) {
var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || _wasHidden;
recursivelyTraverseMutationEffects(root2, finishedWork);
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
} else {
recursivelyTraverseMutationEffects(root2, finishedWork);
}
commitReconciliationEffects(finishedWork);
if (flags & Visibility) {
var _offscreenInstance = finishedWork.stateNode;
var _newState = finishedWork.memoizedState;
var _isHidden = _newState !== null;
var offscreenBoundary = finishedWork;
_offscreenInstance.isHidden = _isHidden;
{
if (_isHidden) {
if (!_wasHidden) {
if ((offscreenBoundary.mode & ConcurrentMode) !== NoMode) {
nextEffect = offscreenBoundary;
var offscreenChild = offscreenBoundary.child;
while (offscreenChild !== null) {
nextEffect = offscreenChild;
disappearLayoutEffects_begin(offscreenChild);
offscreenChild = offscreenChild.sibling;
}
}
}
}
}
{
hideOrUnhideAllChildren(offscreenBoundary, _isHidden);
}
}
return;
}
case SuspenseListComponent: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
if (flags & Update) {
attachSuspenseRetryListeners(finishedWork);
}
return;
}
case ScopeComponent: {
return;
}
default: {
recursivelyTraverseMutationEffects(root2, finishedWork);
commitReconciliationEffects(finishedWork);
return;
}
}
}
function commitReconciliationEffects(finishedWork) {
var flags = finishedWork.flags;
if (flags & Placement) {
try {
commitPlacement(finishedWork);
} catch (error2) {
captureCommitPhaseError(finishedWork, finishedWork.return, error2);
}
finishedWork.flags &= ~Placement;
}
if (flags & Hydrating) {
finishedWork.flags &= ~Hydrating;
}
}
function commitLayoutEffects(finishedWork, root2, committedLanes) {
inProgressLanes = committedLanes;
inProgressRoot = root2;
nextEffect = finishedWork;
commitLayoutEffects_begin(finishedWork, root2, committedLanes);
inProgressLanes = null;
inProgressRoot = null;
}
function commitLayoutEffects_begin(subtreeRoot, root2, committedLanes) {
var isModernRoot = (subtreeRoot.mode & ConcurrentMode) !== NoMode;
while (nextEffect !== null) {
var fiber = nextEffect;
var firstChild = fiber.child;
if (fiber.tag === OffscreenComponent && isModernRoot) {
var isHidden = fiber.memoizedState !== null;
var newOffscreenSubtreeIsHidden = isHidden || offscreenSubtreeIsHidden;
if (newOffscreenSubtreeIsHidden) {
commitLayoutMountEffects_complete(subtreeRoot, root2, committedLanes);
continue;
} else {
var current2 = fiber.alternate;
var wasHidden = current2 !== null && current2.memoizedState !== null;
var newOffscreenSubtreeWasHidden = wasHidden || offscreenSubtreeWasHidden;
var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden;
var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
offscreenSubtreeIsHidden = newOffscreenSubtreeIsHidden;
offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden;
if (offscreenSubtreeWasHidden && !prevOffscreenSubtreeWasHidden) {
nextEffect = fiber;
reappearLayoutEffects_begin(fiber);
}
var child = firstChild;
while (child !== null) {
nextEffect = child;
commitLayoutEffects_begin(child, root2, committedLanes);
child = child.sibling;
}
nextEffect = fiber;
offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
commitLayoutMountEffects_complete(subtreeRoot, root2, committedLanes);
continue;
}
}
if ((fiber.subtreeFlags & LayoutMask) !== NoFlags && firstChild !== null) {
firstChild.return = fiber;
nextEffect = firstChild;
} else {
commitLayoutMountEffects_complete(subtreeRoot, root2, committedLanes);
}
}
}
function commitLayoutMountEffects_complete(subtreeRoot, root2, committedLanes) {
while (nextEffect !== null) {
var fiber = nextEffect;
if ((fiber.flags & LayoutMask) !== NoFlags) {
var current2 = fiber.alternate;
setCurrentFiber(fiber);
try {
commitLayoutEffectOnFiber(root2, current2, fiber, committedLanes);
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
resetCurrentFiber();
}
if (fiber === subtreeRoot) {
nextEffect = null;
return;
}
var sibling = fiber.sibling;
if (sibling !== null) {
sibling.return = fiber.return;
nextEffect = sibling;
return;
}
nextEffect = fiber.return;
}
}
function disappearLayoutEffects_begin(subtreeRoot) {
while (nextEffect !== null) {
var fiber = nextEffect;
var firstChild = fiber.child;
switch (fiber.tag) {
case FunctionComponent:
case ForwardRef:
case MemoComponent:
case SimpleMemoComponent: {
if (fiber.mode & ProfileMode) {
try {
startLayoutEffectTimer();
commitHookEffectListUnmount(Layout2, fiber, fiber.return);
} finally {
recordLayoutEffectDuration(fiber);
}
} else {
commitHookEffectListUnmount(Layout2, fiber, fiber.return);
}
break;
}
case ClassComponent: {
safelyDetachRef(fiber, fiber.return);
var instance = fiber.stateNode;
if (typeof instance.componentWillUnmount === "function") {
safelyCallComponentWillUnmount(fiber, fiber.return, instance);
}
break;
}
case HostComponent: {
safelyDetachRef(fiber, fiber.return);
break;
}
case OffscreenComponent: {
var isHidden = fiber.memoizedState !== null;
if (isHidden) {
disappearLayoutEffects_complete(subtreeRoot);
continue;
}
break;
}
}
if (firstChild !== null) {
firstChild.return = fiber;
nextEffect = firstChild;
} else {
disappearLayoutEffects_complete(subtreeRoot);
}
}
}
function disappearLayoutEffects_complete(subtreeRoot) {
while (nextEffect !== null) {
var fiber = nextEffect;
if (fiber === subtreeRoot) {
nextEffect = null;
return;
}
var sibling = fiber.sibling;
if (sibling !== null) {
sibling.return = fiber.return;
nextEffect = sibling;
return;
}
nextEffect = fiber.return;
}
}
function reappearLayoutEffects_begin(subtreeRoot) {
while (nextEffect !== null) {
var fiber = nextEffect;
var firstChild = fiber.child;
if (fiber.tag === OffscreenComponent) {
var isHidden = fiber.memoizedState !== null;
if (isHidden) {
reappearLayoutEffects_complete(subtreeRoot);
continue;
}
}
if (firstChild !== null) {
firstChild.return = fiber;
nextEffect = firstChild;
} else {
reappearLayoutEffects_complete(subtreeRoot);
}
}
}
function reappearLayoutEffects_complete(subtreeRoot) {
while (nextEffect !== null) {
var fiber = nextEffect;
setCurrentFiber(fiber);
try {
reappearLayoutEffectsOnFiber(fiber);
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
resetCurrentFiber();
if (fiber === subtreeRoot) {
nextEffect = null;
return;
}
var sibling = fiber.sibling;
if (sibling !== null) {
sibling.return = fiber.return;
nextEffect = sibling;
return;
}
nextEffect = fiber.return;
}
}
function commitPassiveMountEffects(root2, finishedWork, committedLanes, committedTransitions) {
nextEffect = finishedWork;
commitPassiveMountEffects_begin(finishedWork, root2, committedLanes, committedTransitions);
}
function commitPassiveMountEffects_begin(subtreeRoot, root2, committedLanes, committedTransitions) {
while (nextEffect !== null) {
var fiber = nextEffect;
var firstChild = fiber.child;
if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && firstChild !== null) {
firstChild.return = fiber;
nextEffect = firstChild;
} else {
commitPassiveMountEffects_complete(subtreeRoot, root2, committedLanes, committedTransitions);
}
}
}
function commitPassiveMountEffects_complete(subtreeRoot, root2, committedLanes, committedTransitions) {
while (nextEffect !== null) {
var fiber = nextEffect;
if ((fiber.flags & Passive) !== NoFlags) {
setCurrentFiber(fiber);
try {
commitPassiveMountOnFiber(root2, fiber, committedLanes, committedTransitions);
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
resetCurrentFiber();
}
if (fiber === subtreeRoot) {
nextEffect = null;
return;
}
var sibling = fiber.sibling;
if (sibling !== null) {
sibling.return = fiber.return;
nextEffect = sibling;
return;
}
nextEffect = fiber.return;
}
}
function commitPassiveMountOnFiber(finishedRoot, finishedWork, committedLanes, committedTransitions) {
switch (finishedWork.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
if (finishedWork.mode & ProfileMode) {
startPassiveEffectTimer();
try {
commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
} finally {
recordPassiveEffectDuration(finishedWork);
}
} else {
commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
}
break;
}
}
}
function commitPassiveUnmountEffects(firstChild) {
nextEffect = firstChild;
commitPassiveUnmountEffects_begin();
}
function commitPassiveUnmountEffects_begin() {
while (nextEffect !== null) {
var fiber = nextEffect;
var child = fiber.child;
if ((nextEffect.flags & ChildDeletion) !== NoFlags) {
var deletions = fiber.deletions;
if (deletions !== null) {
for (var i = 0; i < deletions.length; i++) {
var fiberToDelete = deletions[i];
nextEffect = fiberToDelete;
commitPassiveUnmountEffectsInsideOfDeletedTree_begin(fiberToDelete, fiber);
}
{
var previousFiber = fiber.alternate;
if (previousFiber !== null) {
var detachedChild = previousFiber.child;
if (detachedChild !== null) {
previousFiber.child = null;
do {
var detachedSibling = detachedChild.sibling;
detachedChild.sibling = null;
detachedChild = detachedSibling;
} while (detachedChild !== null);
}
}
}
nextEffect = fiber;
}
}
if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && child !== null) {
child.return = fiber;
nextEffect = child;
} else {
commitPassiveUnmountEffects_complete();
}
}
}
function commitPassiveUnmountEffects_complete() {
while (nextEffect !== null) {
var fiber = nextEffect;
if ((fiber.flags & Passive) !== NoFlags) {
setCurrentFiber(fiber);
commitPassiveUnmountOnFiber(fiber);
resetCurrentFiber();
}
var sibling = fiber.sibling;
if (sibling !== null) {
sibling.return = fiber.return;
nextEffect = sibling;
return;
}
nextEffect = fiber.return;
}
}
function commitPassiveUnmountOnFiber(finishedWork) {
switch (finishedWork.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
if (finishedWork.mode & ProfileMode) {
startPassiveEffectTimer();
commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return);
recordPassiveEffectDuration(finishedWork);
} else {
commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return);
}
break;
}
}
}
function commitPassiveUnmountEffectsInsideOfDeletedTree_begin(deletedSubtreeRoot, nearestMountedAncestor) {
while (nextEffect !== null) {
var fiber = nextEffect;
setCurrentFiber(fiber);
commitPassiveUnmountInsideDeletedTreeOnFiber(fiber, nearestMountedAncestor);
resetCurrentFiber();
var child = fiber.child;
if (child !== null) {
child.return = fiber;
nextEffect = child;
} else {
commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot);
}
}
}
function commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot) {
while (nextEffect !== null) {
var fiber = nextEffect;
var sibling = fiber.sibling;
var returnFiber = fiber.return;
{
detachFiberAfterEffects(fiber);
if (fiber === deletedSubtreeRoot) {
nextEffect = null;
return;
}
}
if (sibling !== null) {
sibling.return = returnFiber;
nextEffect = sibling;
return;
}
nextEffect = returnFiber;
}
}
function commitPassiveUnmountInsideDeletedTreeOnFiber(current2, nearestMountedAncestor) {
switch (current2.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
if (current2.mode & ProfileMode) {
startPassiveEffectTimer();
commitHookEffectListUnmount(Passive$1, current2, nearestMountedAncestor);
recordPassiveEffectDuration(current2);
} else {
commitHookEffectListUnmount(Passive$1, current2, nearestMountedAncestor);
}
break;
}
}
}
function invokeLayoutEffectMountInDEV(fiber) {
{
switch (fiber.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
try {
commitHookEffectListMount(Layout2 | HasEffect, fiber);
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
break;
}
case ClassComponent: {
var instance = fiber.stateNode;
try {
instance.componentDidMount();
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
break;
}
}
}
}
function invokePassiveEffectMountInDEV(fiber) {
{
switch (fiber.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
try {
commitHookEffectListMount(Passive$1 | HasEffect, fiber);
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
break;
}
}
}
}
function invokeLayoutEffectUnmountInDEV(fiber) {
{
switch (fiber.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
try {
commitHookEffectListUnmount(Layout2 | HasEffect, fiber, fiber.return);
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
break;
}
case ClassComponent: {
var instance = fiber.stateNode;
if (typeof instance.componentWillUnmount === "function") {
safelyCallComponentWillUnmount(fiber, fiber.return, instance);
}
break;
}
}
}
}
function invokePassiveEffectUnmountInDEV(fiber) {
{
switch (fiber.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
try {
commitHookEffectListUnmount(Passive$1 | HasEffect, fiber, fiber.return);
} catch (error2) {
captureCommitPhaseError(fiber, fiber.return, error2);
}
}
}
}
}
var COMPONENT_TYPE = 0;
var HAS_PSEUDO_CLASS_TYPE = 1;
var ROLE_TYPE = 2;
var TEST_NAME_TYPE = 3;
var TEXT_TYPE = 4;
if (typeof Symbol === "function" && Symbol.for) {
var symbolFor = Symbol.for;
COMPONENT_TYPE = symbolFor("selector.component");
HAS_PSEUDO_CLASS_TYPE = symbolFor("selector.has_pseudo_class");
ROLE_TYPE = symbolFor("selector.role");
TEST_NAME_TYPE = symbolFor("selector.test_id");
TEXT_TYPE = symbolFor("selector.text");
}
var commitHooks = [];
function onCommitRoot$1() {
{
commitHooks.forEach(function(commitHook) {
return commitHook();
});
}
}
var ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue;
function isLegacyActEnvironment(fiber) {
{
var isReactActEnvironmentGlobal = typeof IS_REACT_ACT_ENVIRONMENT !== "undefined" ? IS_REACT_ACT_ENVIRONMENT : void 0;
var jestIsDefined = typeof jest !== "undefined";
return jestIsDefined && isReactActEnvironmentGlobal !== false;
}
}
function isConcurrentActEnvironment() {
{
var isReactActEnvironmentGlobal = typeof IS_REACT_ACT_ENVIRONMENT !== "undefined" ? IS_REACT_ACT_ENVIRONMENT : void 0;
if (!isReactActEnvironmentGlobal && ReactCurrentActQueue.current !== null) {
error("The current testing environment is not configured to support act(...)");
}
return isReactActEnvironmentGlobal;
}
}
var ceil = Math.ceil;
var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher, ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner, ReactCurrentBatchConfig$3 = ReactSharedInternals.ReactCurrentBatchConfig, ReactCurrentActQueue$1 = ReactSharedInternals.ReactCurrentActQueue;
var NoContext = 0;
var BatchedContext = 1;
var RenderContext = 2;
var CommitContext = 4;
var RootInProgress = 0;
var RootFatalErrored = 1;
var RootErrored = 2;
var RootSuspended = 3;
var RootSuspendedWithDelay = 4;
var RootCompleted = 5;
var RootDidNotComplete = 6;
var executionContext = NoContext;
var workInProgressRoot = null;
var workInProgress = null;
var workInProgressRootRenderLanes = NoLanes;
var subtreeRenderLanes = NoLanes;
var subtreeRenderLanesCursor = createCursor(NoLanes);
var workInProgressRootExitStatus = RootInProgress;
var workInProgressRootFatalError = null;
var workInProgressRootIncludedLanes = NoLanes;
var workInProgressRootSkippedLanes = NoLanes;
var workInProgressRootInterleavedUpdatedLanes = NoLanes;
var workInProgressRootPingedLanes = NoLanes;
var workInProgressRootConcurrentErrors = null;
var workInProgressRootRecoverableErrors = null;
var globalMostRecentFallbackTime = 0;
var FALLBACK_THROTTLE_MS = 500;
var workInProgressRootRenderTargetTime = Infinity;
var RENDER_TIMEOUT_MS = 500;
var workInProgressTransitions = null;
function resetRenderTimer() {
workInProgressRootRenderTargetTime = now() + RENDER_TIMEOUT_MS;
}
function getRenderTargetTime() {
return workInProgressRootRenderTargetTime;
}
var hasUncaughtError = false;
var firstUncaughtError = null;
var legacyErrorBoundariesThatAlreadyFailed = null;
var rootDoesHavePassiveEffects = false;
var rootWithPendingPassiveEffects = null;
var pendingPassiveEffectsLanes = NoLanes;
var pendingPassiveProfilerEffects = [];
var pendingPassiveTransitions = null;
var NESTED_UPDATE_LIMIT = 50;
var nestedUpdateCount = 0;
var rootWithNestedUpdates = null;
var isFlushingPassiveEffects = false;
var didScheduleUpdateDuringPassiveEffects = false;
var NESTED_PASSIVE_UPDATE_LIMIT = 50;
var nestedPassiveUpdateCount = 0;
var rootWithPassiveNestedUpdates = null;
var currentEventTime = NoTimestamp;
var currentEventTransitionLane = NoLanes;
var isRunningInsertionEffect = false;
function getWorkInProgressRoot() {
return workInProgressRoot;
}
function requestEventTime() {
if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
return now();
}
if (currentEventTime !== NoTimestamp) {
return currentEventTime;
}
currentEventTime = now();
return currentEventTime;
}
function requestUpdateLane(fiber) {
var mode = fiber.mode;
if ((mode & ConcurrentMode) === NoMode) {
return SyncLane;
} else if ((executionContext & RenderContext) !== NoContext && workInProgressRootRenderLanes !== NoLanes) {
return pickArbitraryLane(workInProgressRootRenderLanes);
}
var isTransition = requestCurrentTransition() !== NoTransition;
if (isTransition) {
if (ReactCurrentBatchConfig$3.transition !== null) {
var transition = ReactCurrentBatchConfig$3.transition;
if (!transition._updatedFibers) {
transition._updatedFibers = new Set();
}
transition._updatedFibers.add(fiber);
}
if (currentEventTransitionLane === NoLane) {
currentEventTransitionLane = claimNextTransitionLane();
}
return currentEventTransitionLane;
}
var updateLane = getCurrentUpdatePriority();
if (updateLane !== NoLane) {
return updateLane;
}
var eventLane = getCurrentEventPriority();
return eventLane;
}
function requestRetryLane(fiber) {
var mode = fiber.mode;
if ((mode & ConcurrentMode) === NoMode) {
return SyncLane;
}
return claimNextRetryLane();
}
function scheduleUpdateOnFiber(root2, fiber, lane, eventTime) {
checkForNestedUpdates();
{
if (isRunningInsertionEffect) {
error("useInsertionEffect must not schedule updates.");
}
}
{
if (isFlushingPassiveEffects) {
didScheduleUpdateDuringPassiveEffects = true;
}
}
markRootUpdated(root2, lane, eventTime);
if ((executionContext & RenderContext) !== NoLanes && root2 === workInProgressRoot) {
warnAboutRenderPhaseUpdatesInDEV(fiber);
} else {
{
if (isDevToolsPresent) {
addFiberToLanesMap(root2, fiber, lane);
}
}
warnIfUpdatesNotWrappedWithActDEV(fiber);
if (root2 === workInProgressRoot) {
if ((executionContext & RenderContext) === NoContext) {
workInProgressRootInterleavedUpdatedLanes = mergeLanes(workInProgressRootInterleavedUpdatedLanes, lane);
}
if (workInProgressRootExitStatus === RootSuspendedWithDelay) {
markRootSuspended$1(root2, workInProgressRootRenderLanes);
}
}
ensureRootIsScheduled(root2, eventTime);
if (lane === SyncLane && executionContext === NoContext && (fiber.mode & ConcurrentMode) === NoMode && !ReactCurrentActQueue$1.isBatchingLegacy) {
resetRenderTimer();
flushSyncCallbacksOnlyInLegacyMode();
}
}
}
function scheduleInitialHydrationOnRoot(root2, lane, eventTime) {
var current2 = root2.current;
current2.lanes = lane;
markRootUpdated(root2, lane, eventTime);
ensureRootIsScheduled(root2, eventTime);
}
function isUnsafeClassRenderPhaseUpdate(fiber) {
return (executionContext & RenderContext) !== NoContext;
}
function ensureRootIsScheduled(root2, currentTime) {
var existingCallbackNode = root2.callbackNode;
markStarvedLanesAsExpired(root2, currentTime);
var nextLanes = getNextLanes(root2, root2 === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);
if (nextLanes === NoLanes) {
if (existingCallbackNode !== null) {
cancelCallback$1(existingCallbackNode);
}
root2.callbackNode = null;
root2.callbackPriority = NoLane;
return;
}
var newCallbackPriority = getHighestPriorityLane(nextLanes);
var existingCallbackPriority = root2.callbackPriority;
if (existingCallbackPriority === newCallbackPriority && !(ReactCurrentActQueue$1.current !== null && existingCallbackNode !== fakeActCallbackNode)) {
{
if (existingCallbackNode == null && existingCallbackPriority !== SyncLane) {
error("Expected scheduled callback to exist. This error is likely caused by a bug in React. Please file an issue.");
}
}
return;
}
if (existingCallbackNode != null) {
cancelCallback$1(existingCallbackNode);
}
var newCallbackNode;
if (newCallbackPriority === SyncLane) {
if (root2.tag === LegacyRoot) {
if (ReactCurrentActQueue$1.isBatchingLegacy !== null) {
ReactCurrentActQueue$1.didScheduleLegacyUpdate = true;
}
scheduleLegacySyncCallback(performSyncWorkOnRoot.bind(null, root2));
} else {
scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root2));
}
{
if (ReactCurrentActQueue$1.current !== null) {
ReactCurrentActQueue$1.current.push(flushSyncCallbacks);
} else {
scheduleMicrotask(function() {
if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
flushSyncCallbacks();
}
});
}
}
newCallbackNode = null;
} else {
var schedulerPriorityLevel;
switch (lanesToEventPriority(nextLanes)) {
case DiscreteEventPriority:
schedulerPriorityLevel = ImmediatePriority;
break;
case ContinuousEventPriority:
schedulerPriorityLevel = UserBlockingPriority;
break;
case DefaultEventPriority:
schedulerPriorityLevel = NormalPriority;
break;
case IdleEventPriority:
schedulerPriorityLevel = IdlePriority;
break;
default:
schedulerPriorityLevel = NormalPriority;
break;
}
newCallbackNode = scheduleCallback$1(schedulerPriorityLevel, performConcurrentWorkOnRoot.bind(null, root2));
}
root2.callbackPriority = newCallbackPriority;
root2.callbackNode = newCallbackNode;
}
function performConcurrentWorkOnRoot(root2, didTimeout) {
{
resetNestedUpdateFlag();
}
currentEventTime = NoTimestamp;
currentEventTransitionLane = NoLanes;
if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
throw new Error("Should not already be working.");
}
var originalCallbackNode = root2.callbackNode;
var didFlushPassiveEffects = flushPassiveEffects();
if (didFlushPassiveEffects) {
if (root2.callbackNode !== originalCallbackNode) {
return null;
}
}
var lanes = getNextLanes(root2, root2 === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);
if (lanes === NoLanes) {
return null;
}
var shouldTimeSlice = !includesBlockingLane(root2, lanes) && !includesExpiredLane(root2, lanes) && !didTimeout;
var exitStatus = shouldTimeSlice ? renderRootConcurrent(root2, lanes) : renderRootSync(root2, lanes);
if (exitStatus !== RootInProgress) {
if (exitStatus === RootErrored) {
var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root2);
if (errorRetryLanes !== NoLanes) {
lanes = errorRetryLanes;
exitStatus = recoverFromConcurrentError(root2, errorRetryLanes);
}
}
if (exitStatus === RootFatalErrored) {
var fatalError = workInProgressRootFatalError;
prepareFreshStack(root2, NoLanes);
markRootSuspended$1(root2, lanes);
ensureRootIsScheduled(root2, now());
throw fatalError;
}
if (exitStatus === RootDidNotComplete) {
markRootSuspended$1(root2, lanes);
} else {
var renderWasConcurrent = !includesBlockingLane(root2, lanes);
var finishedWork = root2.current.alternate;
if (renderWasConcurrent && !isRenderConsistentWithExternalStores(finishedWork)) {
exitStatus = renderRootSync(root2, lanes);
if (exitStatus === RootErrored) {
var _errorRetryLanes = getLanesToRetrySynchronouslyOnError(root2);
if (_errorRetryLanes !== NoLanes) {
lanes = _errorRetryLanes;
exitStatus = recoverFromConcurrentError(root2, _errorRetryLanes);
}
}
if (exitStatus === RootFatalErrored) {
var _fatalError = workInProgressRootFatalError;
prepareFreshStack(root2, NoLanes);
markRootSuspended$1(root2, lanes);
ensureRootIsScheduled(root2, now());
throw _fatalError;
}
}
root2.finishedWork = finishedWork;
root2.finishedLanes = lanes;
finishConcurrentRender(root2, exitStatus, lanes);
}
}
ensureRootIsScheduled(root2, now());
if (root2.callbackNode === originalCallbackNode) {
return performConcurrentWorkOnRoot.bind(null, root2);
}
return null;
}
function recoverFromConcurrentError(root2, errorRetryLanes) {
var errorsFromFirstAttempt = workInProgressRootConcurrentErrors;
if (isRootDehydrated(root2)) {
var rootWorkInProgress = prepareFreshStack(root2, errorRetryLanes);
rootWorkInProgress.flags |= ForceClientRender;
{
errorHydratingContainer(root2.containerInfo);
}
}
var exitStatus = renderRootSync(root2, errorRetryLanes);
if (exitStatus !== RootErrored) {
var errorsFromSecondAttempt = workInProgressRootRecoverableErrors;
workInProgressRootRecoverableErrors = errorsFromFirstAttempt;
if (errorsFromSecondAttempt !== null) {
queueRecoverableErrors(errorsFromSecondAttempt);
}
}
return exitStatus;
}
function queueRecoverableErrors(errors) {
if (workInProgressRootRecoverableErrors === null) {
workInProgressRootRecoverableErrors = errors;
} else {
workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, errors);
}
}
function finishConcurrentRender(root2, exitStatus, lanes) {
switch (exitStatus) {
case RootInProgress:
case RootFatalErrored: {
throw new Error("Root did not complete. This is a bug in React.");
}
case RootErrored: {
commitRoot(root2, workInProgressRootRecoverableErrors, workInProgressTransitions);
break;
}
case RootSuspended: {
markRootSuspended$1(root2, lanes);
if (includesOnlyRetries(lanes) && !shouldForceFlushFallbacksInDEV()) {
var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now();
if (msUntilTimeout > 10) {
var nextLanes = getNextLanes(root2, NoLanes);
if (nextLanes !== NoLanes) {
break;
}
var suspendedLanes = root2.suspendedLanes;
if (!isSubsetOfLanes(suspendedLanes, lanes)) {
var eventTime = requestEventTime();
markRootPinged(root2, suspendedLanes);
break;
}
root2.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root2, workInProgressRootRecoverableErrors, workInProgressTransitions), msUntilTimeout);
break;
}
}
commitRoot(root2, workInProgressRootRecoverableErrors, workInProgressTransitions);
break;
}
case RootSuspendedWithDelay: {
markRootSuspended$1(root2, lanes);
if (includesOnlyTransitions(lanes)) {
break;
}
if (!shouldForceFlushFallbacksInDEV()) {
var mostRecentEventTime = getMostRecentEventTime(root2, lanes);
var eventTimeMs = mostRecentEventTime;
var timeElapsedMs = now() - eventTimeMs;
var _msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs;
if (_msUntilTimeout > 10) {
root2.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root2, workInProgressRootRecoverableErrors, workInProgressTransitions), _msUntilTimeout);
break;
}
}
commitRoot(root2, workInProgressRootRecoverableErrors, workInProgressTransitions);
break;
}
case RootCompleted: {
commitRoot(root2, workInProgressRootRecoverableErrors, workInProgressTransitions);
break;
}
default: {
throw new Error("Unknown root exit status.");
}
}
}
function isRenderConsistentWithExternalStores(finishedWork) {
var node = finishedWork;
while (true) {
if (node.flags & StoreConsistency) {
var updateQueue = node.updateQueue;
if (updateQueue !== null) {
var checks = updateQueue.stores;
if (checks !== null) {
for (var i = 0; i < checks.length; i++) {
var check = checks[i];
var getSnapshot = check.getSnapshot;
var renderedValue = check.value;
try {
if (!objectIs(getSnapshot(), renderedValue)) {
return false;
}
} catch (error2) {
return false;
}
}
}
}
}
var child = node.child;
if (node.subtreeFlags & StoreConsistency && child !== null) {
child.return = node;
node = child;
continue;
}
if (node === finishedWork) {
return true;
}
while (node.sibling === null) {
if (node.return === null || node.return === finishedWork) {
return true;
}
node = node.return;
}
node.sibling.return = node.return;
node = node.sibling;
}
return true;
}
function markRootSuspended$1(root2, suspendedLanes) {
suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes);
suspendedLanes = removeLanes(suspendedLanes, workInProgressRootInterleavedUpdatedLanes);
markRootSuspended(root2, suspendedLanes);
}
function performSyncWorkOnRoot(root2) {
{
syncNestedUpdateFlag();
}
if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
throw new Error("Should not already be working.");
}
flushPassiveEffects();
var lanes = getNextLanes(root2, NoLanes);
if (!includesSomeLane(lanes, SyncLane)) {
ensureRootIsScheduled(root2, now());
return null;
}
var exitStatus = renderRootSync(root2, lanes);
if (root2.tag !== LegacyRoot && exitStatus === RootErrored) {
var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root2);
if (errorRetryLanes !== NoLanes) {
lanes = errorRetryLanes;
exitStatus = recoverFromConcurrentError(root2, errorRetryLanes);
}
}
if (exitStatus === RootFatalErrored) {
var fatalError = workInProgressRootFatalError;
prepareFreshStack(root2, NoLanes);
markRootSuspended$1(root2, lanes);
ensureRootIsScheduled(root2, now());
throw fatalError;
}
if (exitStatus === RootDidNotComplete) {
throw new Error("Root did not complete. This is a bug in React.");
}
var finishedWork = root2.current.alternate;
root2.finishedWork = finishedWork;
root2.finishedLanes = lanes;
commitRoot(root2, workInProgressRootRecoverableErrors, workInProgressTransitions);
ensureRootIsScheduled(root2, now());
return null;
}
function flushRoot(root2, lanes) {
if (lanes !== NoLanes) {
markRootEntangled(root2, mergeLanes(lanes, SyncLane));
ensureRootIsScheduled(root2, now());
if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
resetRenderTimer();
flushSyncCallbacks();
}
}
}
function batchedUpdates$1(fn, a) {
var prevExecutionContext = executionContext;
executionContext |= BatchedContext;
try {
return fn(a);
} finally {
executionContext = prevExecutionContext;
if (executionContext === NoContext && !ReactCurrentActQueue$1.isBatchingLegacy) {
resetRenderTimer();
flushSyncCallbacksOnlyInLegacyMode();
}
}
}
function discreteUpdates(fn, a, b, c, d) {
var previousPriority = getCurrentUpdatePriority();
var prevTransition = ReactCurrentBatchConfig$3.transition;
try {
ReactCurrentBatchConfig$3.transition = null;
setCurrentUpdatePriority(DiscreteEventPriority);
return fn(a, b, c, d);
} finally {
setCurrentUpdatePriority(previousPriority);
ReactCurrentBatchConfig$3.transition = prevTransition;
if (executionContext === NoContext) {
resetRenderTimer();
}
}
}
function flushSync(fn) {
if (rootWithPendingPassiveEffects !== null && rootWithPendingPassiveEffects.tag === LegacyRoot && (executionContext & (RenderContext | CommitContext)) === NoContext) {
flushPassiveEffects();
}
var prevExecutionContext = executionContext;
executionContext |= BatchedContext;
var prevTransition = ReactCurrentBatchConfig$3.transition;
var previousPriority = getCurrentUpdatePriority();
try {
ReactCurrentBatchConfig$3.transition = null;
setCurrentUpdatePriority(DiscreteEventPriority);
if (fn) {
return fn();
} else {
return void 0;
}
} finally {
setCurrentUpdatePriority(previousPriority);
ReactCurrentBatchConfig$3.transition = prevTransition;
executionContext = prevExecutionContext;
if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
flushSyncCallbacks();
}
}
}
function isAlreadyRendering() {
return (executionContext & (RenderContext | CommitContext)) !== NoContext;
}
function pushRenderLanes(fiber, lanes) {
push(subtreeRenderLanesCursor, subtreeRenderLanes, fiber);
subtreeRenderLanes = mergeLanes(subtreeRenderLanes, lanes);
workInProgressRootIncludedLanes = mergeLanes(workInProgressRootIncludedLanes, lanes);
}
function popRenderLanes(fiber) {
subtreeRenderLanes = subtreeRenderLanesCursor.current;
pop(subtreeRenderLanesCursor, fiber);
}
function prepareFreshStack(root2, lanes) {
root2.finishedWork = null;
root2.finishedLanes = NoLanes;
var timeoutHandle = root2.timeoutHandle;
if (timeoutHandle !== noTimeout) {
root2.timeoutHandle = noTimeout;
cancelTimeout(timeoutHandle);
}
if (workInProgress !== null) {
var interruptedWork = workInProgress.return;
while (interruptedWork !== null) {
var current2 = interruptedWork.alternate;
unwindInterruptedWork(current2, interruptedWork);
interruptedWork = interruptedWork.return;
}
}
workInProgressRoot = root2;
var rootWorkInProgress = createWorkInProgress(root2.current, null);
workInProgress = rootWorkInProgress;
workInProgressRootRenderLanes = subtreeRenderLanes = workInProgressRootIncludedLanes = lanes;
workInProgressRootExitStatus = RootInProgress;
workInProgressRootFatalError = null;
workInProgressRootSkippedLanes = NoLanes;
workInProgressRootInterleavedUpdatedLanes = NoLanes;
workInProgressRootPingedLanes = NoLanes;
workInProgressRootConcurrentErrors = null;
workInProgressRootRecoverableErrors = null;
finishQueueingConcurrentUpdates();
{
ReactStrictModeWarnings.discardPendingWarnings();
}
return rootWorkInProgress;
}
function handleError(root2, thrownValue) {
do {
var erroredWork = workInProgress;
try {
resetContextDependencies();
resetHooksAfterThrow();
resetCurrentFiber();
ReactCurrentOwner$2.current = null;
if (erroredWork === null || erroredWork.return === null) {
workInProgressRootExitStatus = RootFatalErrored;
workInProgressRootFatalError = thrownValue;
workInProgress = null;
return;
}
if (enableProfilerTimer && erroredWork.mode & ProfileMode) {
stopProfilerTimerIfRunningAndRecordDelta(erroredWork, true);
}
if (enableSchedulingProfiler) {
markComponentRenderStopped();
if (thrownValue !== null && typeof thrownValue === "object" && typeof thrownValue.then === "function") {
var wakeable = thrownValue;
markComponentSuspended(erroredWork, wakeable, workInProgressRootRenderLanes);
} else {
markComponentErrored(erroredWork, thrownValue, workInProgressRootRenderLanes);
}
}
throwException(root2, erroredWork.return, erroredWork, thrownValue, workInProgressRootRenderLanes);
completeUnitOfWork(erroredWork);
} catch (yetAnotherThrownValue) {
thrownValue = yetAnotherThrownValue;
if (workInProgress === erroredWork && erroredWork !== null) {
erroredWork = erroredWork.return;
workInProgress = erroredWork;
} else {
erroredWork = workInProgress;
}
continue;
}
return;
} while (true);
}
function pushDispatcher() {
var prevDispatcher = ReactCurrentDispatcher$2.current;
ReactCurrentDispatcher$2.current = ContextOnlyDispatcher;
if (prevDispatcher === null) {
return ContextOnlyDispatcher;
} else {
return prevDispatcher;
}
}
function popDispatcher(prevDispatcher) {
ReactCurrentDispatcher$2.current = prevDispatcher;
}
function markCommitTimeOfFallback() {
globalMostRecentFallbackTime = now();
}
function markSkippedUpdateLanes(lane) {
workInProgressRootSkippedLanes = mergeLanes(lane, workInProgressRootSkippedLanes);
}
function renderDidSuspend() {
if (workInProgressRootExitStatus === RootInProgress) {
workInProgressRootExitStatus = RootSuspended;
}
}
function renderDidSuspendDelayIfPossible() {
if (workInProgressRootExitStatus === RootInProgress || workInProgressRootExitStatus === RootSuspended || workInProgressRootExitStatus === RootErrored) {
workInProgressRootExitStatus = RootSuspendedWithDelay;
}
if (workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || includesNonIdleWork(workInProgressRootInterleavedUpdatedLanes))) {
markRootSuspended$1(workInProgressRoot, workInProgressRootRenderLanes);
}
}
function renderDidError(error2) {
if (workInProgressRootExitStatus !== RootSuspendedWithDelay) {
workInProgressRootExitStatus = RootErrored;
}
if (workInProgressRootConcurrentErrors === null) {
workInProgressRootConcurrentErrors = [error2];
} else {
workInProgressRootConcurrentErrors.push(error2);
}
}
function renderHasNotSuspendedYet() {
return workInProgressRootExitStatus === RootInProgress;
}
function renderRootSync(root2, lanes) {
var prevExecutionContext = executionContext;
executionContext |= RenderContext;
var prevDispatcher = pushDispatcher();
if (workInProgressRoot !== root2 || workInProgressRootRenderLanes !== lanes) {
{
if (isDevToolsPresent) {
var memoizedUpdaters = root2.memoizedUpdaters;
if (memoizedUpdaters.size > 0) {
restorePendingUpdaters(root2, workInProgressRootRenderLanes);
memoizedUpdaters.clear();
}
movePendingFibersToMemoized(root2, lanes);
}
}
workInProgressTransitions = getTransitionsForLanes();
prepareFreshStack(root2, lanes);
}
{
markRenderStarted(lanes);
}
do {
try {
workLoopSync();
break;
} catch (thrownValue) {
handleError(root2, thrownValue);
}
} while (true);
resetContextDependencies();
executionContext = prevExecutionContext;
popDispatcher(prevDispatcher);
if (workInProgress !== null) {
throw new Error("Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.");
}
{
markRenderStopped();
}
workInProgressRoot = null;
workInProgressRootRenderLanes = NoLanes;
return workInProgressRootExitStatus;
}
function workLoopSync() {
while (workInProgress !== null) {
performUnitOfWork(workInProgress);
}
}
function renderRootConcurrent(root2, lanes) {
var prevExecutionContext = executionContext;
executionContext |= RenderContext;
var prevDispatcher = pushDispatcher();
if (workInProgressRoot !== root2 || workInProgressRootRenderLanes !== lanes) {
{
if (isDevToolsPresent) {
var memoizedUpdaters = root2.memoizedUpdaters;
if (memoizedUpdaters.size > 0) {
restorePendingUpdaters(root2, workInProgressRootRenderLanes);
memoizedUpdaters.clear();
}
movePendingFibersToMemoized(root2, lanes);
}
}
workInProgressTransitions = getTransitionsForLanes();
resetRenderTimer();
prepareFreshStack(root2, lanes);
}
{
markRenderStarted(lanes);
}
do {
try {
workLoopConcurrent();
break;
} catch (thrownValue) {
handleError(root2, thrownValue);
}
} while (true);
resetContextDependencies();
popDispatcher(prevDispatcher);
executionContext = prevExecutionContext;
if (workInProgress !== null) {
{
markRenderYielded();
}
return RootInProgress;
} else {
{
markRenderStopped();
}
workInProgressRoot = null;
workInProgressRootRenderLanes = NoLanes;
return workInProgressRootExitStatus;
}
}
function workLoopConcurrent() {
while (workInProgress !== null && !shouldYield()) {
performUnitOfWork(workInProgress);
}
}
function performUnitOfWork(unitOfWork) {
var current2 = unitOfWork.alternate;
setCurrentFiber(unitOfWork);
var next;
if ((unitOfWork.mode & ProfileMode) !== NoMode) {
startProfilerTimer(unitOfWork);
next = beginWork$1(current2, unitOfWork, subtreeRenderLanes);
stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);
} else {
next = beginWork$1(current2, unitOfWork, subtreeRenderLanes);
}
resetCurrentFiber();
unitOfWork.memoizedProps = unitOfWork.pendingProps;
if (next === null) {
completeUnitOfWork(unitOfWork);
} else {
workInProgress = next;
}
ReactCurrentOwner$2.current = null;
}
function completeUnitOfWork(unitOfWork) {
var completedWork = unitOfWork;
do {
var current2 = completedWork.alternate;
var returnFiber = completedWork.return;
if ((completedWork.flags & Incomplete) === NoFlags) {
setCurrentFiber(completedWork);
var next = void 0;
if ((completedWork.mode & ProfileMode) === NoMode) {
next = completeWork(current2, completedWork, subtreeRenderLanes);
} else {
startProfilerTimer(completedWork);
next = completeWork(current2, completedWork, subtreeRenderLanes);
stopProfilerTimerIfRunningAndRecordDelta(completedWork, false);
}
resetCurrentFiber();
if (next !== null) {
workInProgress = next;
return;
}
} else {
var _next = unwindWork(current2, completedWork);
if (_next !== null) {
_next.flags &= HostEffectMask;
workInProgress = _next;
return;
}
if ((completedWork.mode & ProfileMode) !== NoMode) {
stopProfilerTimerIfRunningAndRecordDelta(completedWork, false);
var actualDuration = completedWork.actualDuration;
var child = completedWork.child;
while (child !== null) {
actualDuration += child.actualDuration;
child = child.sibling;
}
completedWork.actualDuration = actualDuration;
}
if (returnFiber !== null) {
returnFiber.flags |= Incomplete;
returnFiber.subtreeFlags = NoFlags;
returnFiber.deletions = null;
} else {
workInProgressRootExitStatus = RootDidNotComplete;
workInProgress = null;
return;
}
}
var siblingFiber = completedWork.sibling;
if (siblingFiber !== null) {
workInProgress = siblingFiber;
return;
}
completedWork = returnFiber;
workInProgress = completedWork;
} while (completedWork !== null);
if (workInProgressRootExitStatus === RootInProgress) {
workInProgressRootExitStatus = RootCompleted;
}
}
function commitRoot(root2, recoverableErrors, transitions) {
var previousUpdateLanePriority = getCurrentUpdatePriority();
var prevTransition = ReactCurrentBatchConfig$3.transition;
try {
ReactCurrentBatchConfig$3.transition = null;
setCurrentUpdatePriority(DiscreteEventPriority);
commitRootImpl(root2, recoverableErrors, transitions, previousUpdateLanePriority);
} finally {
ReactCurrentBatchConfig$3.transition = prevTransition;
setCurrentUpdatePriority(previousUpdateLanePriority);
}
return null;
}
function commitRootImpl(root2, recoverableErrors, transitions, renderPriorityLevel) {
do {
flushPassiveEffects();
} while (rootWithPendingPassiveEffects !== null);
flushRenderPhaseStrictModeWarningsInDEV();
if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
throw new Error("Should not already be working.");
}
var finishedWork = root2.finishedWork;
var lanes = root2.finishedLanes;
{
markCommitStarted(lanes);
}
if (finishedWork === null) {
{
markCommitStopped();
}
return null;
} else {
{
if (lanes === NoLanes) {
error("root.finishedLanes should not be empty during a commit. This is a bug in React.");
}
}
}
root2.finishedWork = null;
root2.finishedLanes = NoLanes;
if (finishedWork === root2.current) {
throw new Error("Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.");
}
root2.callbackNode = null;
root2.callbackPriority = NoLane;
var remainingLanes = mergeLanes(finishedWork.lanes, finishedWork.childLanes);
markRootFinished(root2, remainingLanes);
if (root2 === workInProgressRoot) {
workInProgressRoot = null;
workInProgress = null;
workInProgressRootRenderLanes = NoLanes;
}
if ((finishedWork.subtreeFlags & PassiveMask) !== NoFlags || (finishedWork.flags & PassiveMask) !== NoFlags) {
if (!rootDoesHavePassiveEffects) {
rootDoesHavePassiveEffects = true;
pendingPassiveTransitions = transitions;
scheduleCallback$1(NormalPriority, function() {
flushPassiveEffects();
return null;
});
}
}
var subtreeHasEffects = (finishedWork.subtreeFlags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags;
var rootHasEffect = (finishedWork.flags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags;
if (subtreeHasEffects || rootHasEffect) {
var prevTransition = ReactCurrentBatchConfig$3.transition;
ReactCurrentBatchConfig$3.transition = null;
var previousPriority = getCurrentUpdatePriority();
setCurrentUpdatePriority(DiscreteEventPriority);
var prevExecutionContext = executionContext;
executionContext |= CommitContext;
ReactCurrentOwner$2.current = null;
var shouldFireAfterActiveInstanceBlur2 = commitBeforeMutationEffects(root2, finishedWork);
{
recordCommitTime();
}
commitMutationEffects(root2, finishedWork, lanes);
resetAfterCommit(root2.containerInfo);
root2.current = finishedWork;
{
markLayoutEffectsStarted(lanes);
}
commitLayoutEffects(finishedWork, root2, lanes);
{
markLayoutEffectsStopped();
}
requestPaint();
executionContext = prevExecutionContext;
setCurrentUpdatePriority(previousPriority);
ReactCurrentBatchConfig$3.transition = prevTransition;
} else {
root2.current = finishedWork;
{
recordCommitTime();
}
}
var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;
if (rootDoesHavePassiveEffects) {
rootDoesHavePassiveEffects = false;
rootWithPendingPassiveEffects = root2;
pendingPassiveEffectsLanes = lanes;
} else {
{
nestedPassiveUpdateCount = 0;
rootWithPassiveNestedUpdates = null;
}
}
remainingLanes = root2.pendingLanes;
if (remainingLanes === NoLanes) {
legacyErrorBoundariesThatAlreadyFailed = null;
}
{
if (!rootDidHavePassiveEffects) {
commitDoubleInvokeEffectsInDEV(root2.current, false);
}
}
onCommitRoot(finishedWork.stateNode, renderPriorityLevel);
{
if (isDevToolsPresent) {
root2.memoizedUpdaters.clear();
}
}
{
onCommitRoot$1();
}
ensureRootIsScheduled(root2, now());
if (recoverableErrors !== null) {
var onRecoverableError = root2.onRecoverableError;
for (var i = 0; i < recoverableErrors.length; i++) {
var recoverableError = recoverableErrors[i];
var componentStack = recoverableError.stack;
var digest = recoverableError.digest;
onRecoverableError(recoverableError.value, {
componentStack,
digest
});
}
}
if (hasUncaughtError) {
hasUncaughtError = false;
var error$1 = firstUncaughtError;
firstUncaughtError = null;
throw error$1;
}
if (includesSomeLane(pendingPassiveEffectsLanes, SyncLane) && root2.tag !== LegacyRoot) {
flushPassiveEffects();
}
remainingLanes = root2.pendingLanes;
if (includesSomeLane(remainingLanes, SyncLane)) {
{
markNestedUpdateScheduled();
}
if (root2 === rootWithNestedUpdates) {
nestedUpdateCount++;
} else {
nestedUpdateCount = 0;
rootWithNestedUpdates = root2;
}
} else {
nestedUpdateCount = 0;
}
flushSyncCallbacks();
{
markCommitStopped();
}
return null;
}
function flushPassiveEffects() {
if (rootWithPendingPassiveEffects !== null) {
var renderPriority = lanesToEventPriority(pendingPassiveEffectsLanes);
var priority = lowerEventPriority(DefaultEventPriority, renderPriority);
var prevTransition = ReactCurrentBatchConfig$3.transition;
var previousPriority = getCurrentUpdatePriority();
try {
ReactCurrentBatchConfig$3.transition = null;
setCurrentUpdatePriority(priority);
return flushPassiveEffectsImpl();
} finally {
setCurrentUpdatePriority(previousPriority);
ReactCurrentBatchConfig$3.transition = prevTransition;
}
}
return false;
}
function enqueuePendingPassiveProfilerEffect(fiber) {
{
pendingPassiveProfilerEffects.push(fiber);
if (!rootDoesHavePassiveEffects) {
rootDoesHavePassiveEffects = true;
scheduleCallback$1(NormalPriority, function() {
flushPassiveEffects();
return null;
});
}
}
}
function flushPassiveEffectsImpl() {
if (rootWithPendingPassiveEffects === null) {
return false;
}
var transitions = pendingPassiveTransitions;
pendingPassiveTransitions = null;
var root2 = rootWithPendingPassiveEffects;
var lanes = pendingPassiveEffectsLanes;
rootWithPendingPassiveEffects = null;
pendingPassiveEffectsLanes = NoLanes;
if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
throw new Error("Cannot flush passive effects while already rendering.");
}
{
isFlushingPassiveEffects = true;
didScheduleUpdateDuringPassiveEffects = false;
}
{
markPassiveEffectsStarted(lanes);
}
var prevExecutionContext = executionContext;
executionContext |= CommitContext;
commitPassiveUnmountEffects(root2.current);
commitPassiveMountEffects(root2, root2.current, lanes, transitions);
{
var profilerEffects = pendingPassiveProfilerEffects;
pendingPassiveProfilerEffects = [];
for (var i = 0; i < profilerEffects.length; i++) {
var _fiber = profilerEffects[i];
commitPassiveEffectDurations(root2, _fiber);
}
}
{
markPassiveEffectsStopped();
}
{
commitDoubleInvokeEffectsInDEV(root2.current, true);
}
executionContext = prevExecutionContext;
flushSyncCallbacks();
{
if (didScheduleUpdateDuringPassiveEffects) {
if (root2 === rootWithPassiveNestedUpdates) {
nestedPassiveUpdateCount++;
} else {
nestedPassiveUpdateCount = 0;
rootWithPassiveNestedUpdates = root2;
}
} else {
nestedPassiveUpdateCount = 0;
}
isFlushingPassiveEffects = false;
didScheduleUpdateDuringPassiveEffects = false;
}
onPostCommitRoot(root2);
{
var stateNode = root2.current.stateNode;
stateNode.effectDuration = 0;
stateNode.passiveEffectDuration = 0;
}
return true;
}
function isAlreadyFailedLegacyErrorBoundary(instance) {
return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
}
function markLegacyErrorBoundaryAsFailed(instance) {
if (legacyErrorBoundariesThatAlreadyFailed === null) {
legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
} else {
legacyErrorBoundariesThatAlreadyFailed.add(instance);
}
}
function prepareToThrowUncaughtError(error2) {
if (!hasUncaughtError) {
hasUncaughtError = true;
firstUncaughtError = error2;
}
}
var onUncaughtError = prepareToThrowUncaughtError;
function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error2) {
var errorInfo = createCapturedValueAtFiber(error2, sourceFiber);
var update = createRootErrorUpdate(rootFiber, errorInfo, SyncLane);
var root2 = enqueueUpdate(rootFiber, update, SyncLane);
var eventTime = requestEventTime();
if (root2 !== null) {
markRootUpdated(root2, SyncLane, eventTime);
ensureRootIsScheduled(root2, eventTime);
}
}
function captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error$1) {
{
reportUncaughtErrorInDEV(error$1);
setIsRunningInsertionEffect(false);
}
if (sourceFiber.tag === HostRoot) {
captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error$1);
return;
}
var fiber = null;
{
fiber = nearestMountedAncestor;
}
while (fiber !== null) {
if (fiber.tag === HostRoot) {
captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error$1);
return;
} else if (fiber.tag === ClassComponent) {
var ctor = fiber.type;
var instance = fiber.stateNode;
if (typeof ctor.getDerivedStateFromError === "function" || typeof instance.componentDidCatch === "function" && !isAlreadyFailedLegacyErrorBoundary(instance)) {
var errorInfo = createCapturedValueAtFiber(error$1, sourceFiber);
var update = createClassErrorUpdate(fiber, errorInfo, SyncLane);
var root2 = enqueueUpdate(fiber, update, SyncLane);
var eventTime = requestEventTime();
if (root2 !== null) {
markRootUpdated(root2, SyncLane, eventTime);
ensureRootIsScheduled(root2, eventTime);
}
return;
}
}
fiber = fiber.return;
}
{
error("Internal React error: Attempted to capture a commit phase error inside a detached tree. This indicates a bug in React. Likely causes include deleting the same fiber more than once, committing an already-finished tree, or an inconsistent return pointer.\n\nError message:\n\n%s", error$1);
}
}
function pingSuspendedRoot(root2, wakeable, pingedLanes) {
var pingCache = root2.pingCache;
if (pingCache !== null) {
pingCache.delete(wakeable);
}
var eventTime = requestEventTime();
markRootPinged(root2, pingedLanes);
warnIfSuspenseResolutionNotWrappedWithActDEV(root2);
if (workInProgressRoot === root2 && isSubsetOfLanes(workInProgressRootRenderLanes, pingedLanes)) {
if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && includesOnlyRetries(workInProgressRootRenderLanes) && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {
prepareFreshStack(root2, NoLanes);
} else {
workInProgressRootPingedLanes = mergeLanes(workInProgressRootPingedLanes, pingedLanes);
}
}
ensureRootIsScheduled(root2, eventTime);
}
function retryTimedOutBoundary(boundaryFiber, retryLane) {
if (retryLane === NoLane) {
retryLane = requestRetryLane(boundaryFiber);
}
var eventTime = requestEventTime();
var root2 = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);
if (root2 !== null) {
markRootUpdated(root2, retryLane, eventTime);
ensureRootIsScheduled(root2, eventTime);
}
}
function retryDehydratedSuspenseBoundary(boundaryFiber) {
var suspenseState = boundaryFiber.memoizedState;
var retryLane = NoLane;
if (suspenseState !== null) {
retryLane = suspenseState.retryLane;
}
retryTimedOutBoundary(boundaryFiber, retryLane);
}
function resolveRetryWakeable(boundaryFiber, wakeable) {
var retryLane = NoLane;
var retryCache;
switch (boundaryFiber.tag) {
case SuspenseComponent:
retryCache = boundaryFiber.stateNode;
var suspenseState = boundaryFiber.memoizedState;
if (suspenseState !== null) {
retryLane = suspenseState.retryLane;
}
break;
case SuspenseListComponent:
retryCache = boundaryFiber.stateNode;
break;
default:
throw new Error("Pinged unknown suspense boundary type. This is probably a bug in React.");
}
if (retryCache !== null) {
retryCache.delete(wakeable);
}
retryTimedOutBoundary(boundaryFiber, retryLane);
}
function jnd(timeElapsed) {
return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3e3 ? 3e3 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;
}
function checkForNestedUpdates() {
if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
nestedUpdateCount = 0;
rootWithNestedUpdates = null;
throw new Error("Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.");
}
{
if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {
nestedPassiveUpdateCount = 0;
rootWithPassiveNestedUpdates = null;
error("Maximum update depth exceeded. This can happen when a component calls setState inside useEffect, but useEffect either doesn't have a dependency array, or one of the dependencies changes on every render.");
}
}
}
function flushRenderPhaseStrictModeWarningsInDEV() {
{
ReactStrictModeWarnings.flushLegacyContextWarning();
{
ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
}
}
}
function commitDoubleInvokeEffectsInDEV(fiber, hasPassiveEffects) {
{
setCurrentFiber(fiber);
invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectUnmountInDEV);
if (hasPassiveEffects) {
invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectUnmountInDEV);
}
invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectMountInDEV);
if (hasPassiveEffects) {
invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectMountInDEV);
}
resetCurrentFiber();
}
}
function invokeEffectsInDev(firstChild, fiberFlags, invokeEffectFn) {
{
var current2 = firstChild;
var subtreeRoot = null;
while (current2 !== null) {
var primarySubtreeFlag = current2.subtreeFlags & fiberFlags;
if (current2 !== subtreeRoot && current2.child !== null && primarySubtreeFlag !== NoFlags) {
current2 = current2.child;
} else {
if ((current2.flags & fiberFlags) !== NoFlags) {
invokeEffectFn(current2);
}
if (current2.sibling !== null) {
current2 = current2.sibling;
} else {
current2 = subtreeRoot = current2.return;
}
}
}
}
}
var didWarnStateUpdateForNotYetMountedComponent = null;
function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) {
{
if ((executionContext & RenderContext) !== NoContext) {
return;
}
if (!(fiber.mode & ConcurrentMode)) {
return;
}
var tag = fiber.tag;
if (tag !== IndeterminateComponent && tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent) {
return;
}
var componentName = getComponentNameFromFiber(fiber) || "ReactComponent";
if (didWarnStateUpdateForNotYetMountedComponent !== null) {
if (didWarnStateUpdateForNotYetMountedComponent.has(componentName)) {
return;
}
didWarnStateUpdateForNotYetMountedComponent.add(componentName);
} else {
didWarnStateUpdateForNotYetMountedComponent = new Set([componentName]);
}
var previousFiber = current;
try {
setCurrentFiber(fiber);
error("Can't perform a React state update on a component that hasn't mounted yet. This indicates that you have a side-effect in your render function that asynchronously later calls tries to update the component. Move this work to useEffect instead.");
} finally {
if (previousFiber) {
setCurrentFiber(fiber);
} else {
resetCurrentFiber();
}
}
}
}
var beginWork$1;
{
var dummyFiber = null;
beginWork$1 = function(current2, unitOfWork, lanes) {
var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);
try {
return beginWork(current2, unitOfWork, lanes);
} catch (originalError) {
if (didSuspendOrErrorWhileHydratingDEV() || originalError !== null && typeof originalError === "object" && typeof originalError.then === "function") {
throw originalError;
}
resetContextDependencies();
resetHooksAfterThrow();
unwindInterruptedWork(current2, unitOfWork);
assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);
if (unitOfWork.mode & ProfileMode) {
startProfilerTimer(unitOfWork);
}
invokeGuardedCallback(null, beginWork, null, current2, unitOfWork, lanes);
if (hasCaughtError()) {
var replayError = clearCaughtError();
if (typeof replayError === "object" && replayError !== null && replayError._suppressLogging && typeof originalError === "object" && originalError !== null && !originalError._suppressLogging) {
originalError._suppressLogging = true;
}
}
throw originalError;
}
};
}
var didWarnAboutUpdateInRender = false;
var didWarnAboutUpdateInRenderForAnotherComponent;
{
didWarnAboutUpdateInRenderForAnotherComponent = new Set();
}
function warnAboutRenderPhaseUpdatesInDEV(fiber) {
{
if (isRendering && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) {
switch (fiber.tag) {
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
var renderingComponentName = workInProgress && getComponentNameFromFiber(workInProgress) || "Unknown";
var dedupeKey = renderingComponentName;
if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {
didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);
var setStateComponentName = getComponentNameFromFiber(fiber) || "Unknown";
error("Cannot update a component (`%s`) while rendering a different component (`%s`). To locate the bad setState() call inside `%s`, follow the stack trace as described in https://reactjs.org/link/setstate-in-render", setStateComponentName, renderingComponentName, renderingComponentName);
}
break;
}
case ClassComponent: {
if (!didWarnAboutUpdateInRender) {
error("Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state.");
didWarnAboutUpdateInRender = true;
}
break;
}
}
}
}
}
function restorePendingUpdaters(root2, lanes) {
{
if (isDevToolsPresent) {
var memoizedUpdaters = root2.memoizedUpdaters;
memoizedUpdaters.forEach(function(schedulingFiber) {
addFiberToLanesMap(root2, schedulingFiber, lanes);
});
}
}
}
var fakeActCallbackNode = {};
function scheduleCallback$1(priorityLevel, callback) {
{
var actQueue = ReactCurrentActQueue$1.current;
if (actQueue !== null) {
actQueue.push(callback);
return fakeActCallbackNode;
} else {
return scheduleCallback(priorityLevel, callback);
}
}
}
function cancelCallback$1(callbackNode) {
if (callbackNode === fakeActCallbackNode) {
return;
}
return cancelCallback(callbackNode);
}
function shouldForceFlushFallbacksInDEV() {
return ReactCurrentActQueue$1.current !== null;
}
function warnIfUpdatesNotWrappedWithActDEV(fiber) {
{
if (fiber.mode & ConcurrentMode) {
if (!isConcurrentActEnvironment()) {
return;
}
} else {
if (!isLegacyActEnvironment()) {
return;
}
if (executionContext !== NoContext) {
return;
}
if (fiber.tag !== FunctionComponent && fiber.tag !== ForwardRef && fiber.tag !== SimpleMemoComponent) {
return;
}
}
if (ReactCurrentActQueue$1.current === null) {
var previousFiber = current;
try {
setCurrentFiber(fiber);
error("An update to %s inside a test was not wrapped in act(...).\n\nWhen testing, code that causes React state updates should be wrapped into act(...):\n\nact(() => {\n /* fire events that update state */\n});\n/* assert on the output */\n\nThis ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act", getComponentNameFromFiber(fiber));
} finally {
if (previousFiber) {
setCurrentFiber(fiber);
} else {
resetCurrentFiber();
}
}
}
}
}
function warnIfSuspenseResolutionNotWrappedWithActDEV(root2) {
{
if (root2.tag !== LegacyRoot && isConcurrentActEnvironment() && ReactCurrentActQueue$1.current === null) {
error("A suspended resource finished loading inside a test, but the event was not wrapped in act(...).\n\nWhen testing, code that resolves suspended data should be wrapped into act(...):\n\nact(() => {\n /* finish loading suspended data */\n});\n/* assert on the output */\n\nThis ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act");
}
}
}
function setIsRunningInsertionEffect(isRunning) {
{
isRunningInsertionEffect = isRunning;
}
}
var resolveFamily2 = null;
var failedBoundaries = null;
var setRefreshHandler = function(handler) {
{
resolveFamily2 = handler;
}
};
function resolveFunctionForHotReloading(type) {
{
if (resolveFamily2 === null) {
return type;
}
var family = resolveFamily2(type);
if (family === void 0) {
return type;
}
return family.current;
}
}
function resolveClassForHotReloading(type) {
return resolveFunctionForHotReloading(type);
}
function resolveForwardRefForHotReloading(type) {
{
if (resolveFamily2 === null) {
return type;
}
var family = resolveFamily2(type);
if (family === void 0) {
if (type !== null && type !== void 0 && typeof type.render === "function") {
var currentRender = resolveFunctionForHotReloading(type.render);
if (type.render !== currentRender) {
var syntheticType = {
$$typeof: REACT_FORWARD_REF_TYPE,
render: currentRender
};
if (type.displayName !== void 0) {
syntheticType.displayName = type.displayName;
}
return syntheticType;
}
}
return type;
}
return family.current;
}
}
function isCompatibleFamilyForHotReloading(fiber, element) {
{
if (resolveFamily2 === null) {
return false;
}
var prevType = fiber.elementType;
var nextType = element.type;
var needsCompareFamilies = false;
var $$typeofNextType = typeof nextType === "object" && nextType !== null ? nextType.$$typeof : null;
switch (fiber.tag) {
case ClassComponent: {
if (typeof nextType === "function") {
needsCompareFamilies = true;
}
break;
}
case FunctionComponent: {
if (typeof nextType === "function") {
needsCompareFamilies = true;
} else if ($$typeofNextType === REACT_LAZY_TYPE) {
needsCompareFamilies = true;
}
break;
}
case ForwardRef: {
if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {
needsCompareFamilies = true;
} else if ($$typeofNextType === REACT_LAZY_TYPE) {
needsCompareFamilies = true;
}
break;
}
case MemoComponent:
case SimpleMemoComponent: {
if ($$typeofNextType === REACT_MEMO_TYPE) {
needsCompareFamilies = true;
} else if ($$typeofNextType === REACT_LAZY_TYPE) {
needsCompareFamilies = true;
}
break;
}
default:
return false;
}
if (needsCompareFamilies) {
var prevFamily = resolveFamily2(prevType);
if (prevFamily !== void 0 && prevFamily === resolveFamily2(nextType)) {
return true;
}
}
return false;
}
}
function markFailedErrorBoundaryForHotReloading(fiber) {
{
if (resolveFamily2 === null) {
return;
}
if (typeof WeakSet !== "function") {
return;
}
if (failedBoundaries === null) {
failedBoundaries = new WeakSet();
}
failedBoundaries.add(fiber);
}
}
var scheduleRefresh = function(root2, update) {
{
if (resolveFamily2 === null) {
return;
}
var staleFamilies = update.staleFamilies, updatedFamilies = update.updatedFamilies;
flushPassiveEffects();
flushSync(function() {
scheduleFibersWithFamiliesRecursively(root2.current, updatedFamilies, staleFamilies);
});
}
};
var scheduleRoot = function(root2, element) {
{
if (root2.context !== emptyContextObject) {
return;
}
flushPassiveEffects();
flushSync(function() {
updateContainer(element, root2, null, null);
});
}
};
function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {
{
var alternate = fiber.alternate, child = fiber.child, sibling = fiber.sibling, tag = fiber.tag, type = fiber.type;
var candidateType = null;
switch (tag) {
case FunctionComponent:
case SimpleMemoComponent:
case ClassComponent:
candidateType = type;
break;
case ForwardRef:
candidateType = type.render;
break;
}
if (resolveFamily2 === null) {
throw new Error("Expected resolveFamily to be set during hot reload.");
}
var needsRender = false;
var needsRemount = false;
if (candidateType !== null) {
var family = resolveFamily2(candidateType);
if (family !== void 0) {
if (staleFamilies.has(family)) {
needsRemount = true;
} else if (updatedFamilies.has(family)) {
if (tag === ClassComponent) {
needsRemount = true;
} else {
needsRender = true;
}
}
}
}
if (failedBoundaries !== null) {
if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {
needsRemount = true;
}
}
if (needsRemount) {
fiber._debugNeedsRemount = true;
}
if (needsRemount || needsRender) {
var _root = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (_root !== null) {
scheduleUpdateOnFiber(_root, fiber, SyncLane, NoTimestamp);
}
}
if (child !== null && !needsRemount) {
scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);
}
if (sibling !== null) {
scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);
}
}
}
var findHostInstancesForRefresh = function(root2, families) {
{
var hostInstances = new Set();
var types = new Set(families.map(function(family) {
return family.current;
}));
findHostInstancesForMatchingFibersRecursively(root2.current, types, hostInstances);
return hostInstances;
}
};
function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {
{
var child = fiber.child, sibling = fiber.sibling, tag = fiber.tag, type = fiber.type;
var candidateType = null;
switch (tag) {
case FunctionComponent:
case SimpleMemoComponent:
case ClassComponent:
candidateType = type;
break;
case ForwardRef:
candidateType = type.render;
break;
}
var didMatch = false;
if (candidateType !== null) {
if (types.has(candidateType)) {
didMatch = true;
}
}
if (didMatch) {
findHostInstancesForFiberShallowly(fiber, hostInstances);
} else {
if (child !== null) {
findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);
}
}
if (sibling !== null) {
findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);
}
}
}
function findHostInstancesForFiberShallowly(fiber, hostInstances) {
{
var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);
if (foundHostInstances) {
return;
}
var node = fiber;
while (true) {
switch (node.tag) {
case HostComponent:
hostInstances.add(node.stateNode);
return;
case HostPortal:
hostInstances.add(node.stateNode.containerInfo);
return;
case HostRoot:
hostInstances.add(node.stateNode.containerInfo);
return;
}
if (node.return === null) {
throw new Error("Expected to reach root first.");
}
node = node.return;
}
}
}
function findChildHostInstancesForFiberShallowly(fiber, hostInstances) {
{
var node = fiber;
var foundHostInstances = false;
while (true) {
if (node.tag === HostComponent) {
foundHostInstances = true;
hostInstances.add(node.stateNode);
} else if (node.child !== null) {
node.child.return = node;
node = node.child;
continue;
}
if (node === fiber) {
return foundHostInstances;
}
while (node.sibling === null) {
if (node.return === null || node.return === fiber) {
return foundHostInstances;
}
node = node.return;
}
node.sibling.return = node.return;
node = node.sibling;
}
}
return false;
}
var hasBadMapPolyfill;
{
hasBadMapPolyfill = false;
try {
var nonExtensibleObject = Object.preventExtensions({});
new Map([[nonExtensibleObject, null]]);
new Set([nonExtensibleObject]);
} catch (e) {
hasBadMapPolyfill = true;
}
}
function FiberNode(tag, pendingProps, key, mode) {
this.tag = tag;
this.key = key;
this.elementType = null;
this.type = null;
this.stateNode = null;
this.return = null;
this.child = null;
this.sibling = null;
this.index = 0;
this.ref = null;
this.pendingProps = pendingProps;
this.memoizedProps = null;
this.updateQueue = null;
this.memoizedState = null;
this.dependencies = null;
this.mode = mode;
this.flags = NoFlags;
this.subtreeFlags = NoFlags;
this.deletions = null;
this.lanes = NoLanes;
this.childLanes = NoLanes;
this.alternate = null;
{
this.actualDuration = Number.NaN;
this.actualStartTime = Number.NaN;
this.selfBaseDuration = Number.NaN;
this.treeBaseDuration = Number.NaN;
this.actualDuration = 0;
this.actualStartTime = -1;
this.selfBaseDuration = 0;
this.treeBaseDuration = 0;
}
{
this._debugSource = null;
this._debugOwner = null;
this._debugNeedsRemount = false;
this._debugHookTypes = null;
if (!hasBadMapPolyfill && typeof Object.preventExtensions === "function") {
Object.preventExtensions(this);
}
}
}
var createFiber = function(tag, pendingProps, key, mode) {
return new FiberNode(tag, pendingProps, key, mode);
};
function shouldConstruct$1(Component4) {
var prototype3 = Component4.prototype;
return !!(prototype3 && prototype3.isReactComponent);
}
function isSimpleFunctionComponent(type) {
return typeof type === "function" && !shouldConstruct$1(type) && type.defaultProps === void 0;
}
function resolveLazyComponentTag(Component4) {
if (typeof Component4 === "function") {
return shouldConstruct$1(Component4) ? ClassComponent : FunctionComponent;
} else if (Component4 !== void 0 && Component4 !== null) {
var $$typeof = Component4.$$typeof;
if ($$typeof === REACT_FORWARD_REF_TYPE) {
return ForwardRef;
}
if ($$typeof === REACT_MEMO_TYPE) {
return MemoComponent;
}
}
return IndeterminateComponent;
}
function createWorkInProgress(current2, pendingProps) {
var workInProgress2 = current2.alternate;
if (workInProgress2 === null) {
workInProgress2 = createFiber(current2.tag, pendingProps, current2.key, current2.mode);
workInProgress2.elementType = current2.elementType;
workInProgress2.type = current2.type;
workInProgress2.stateNode = current2.stateNode;
{
workInProgress2._debugSource = current2._debugSource;
workInProgress2._debugOwner = current2._debugOwner;
workInProgress2._debugHookTypes = current2._debugHookTypes;
}
workInProgress2.alternate = current2;
current2.alternate = workInProgress2;
} else {
workInProgress2.pendingProps = pendingProps;
workInProgress2.type = current2.type;
workInProgress2.flags = NoFlags;
workInProgress2.subtreeFlags = NoFlags;
workInProgress2.deletions = null;
{
workInProgress2.actualDuration = 0;
workInProgress2.actualStartTime = -1;
}
}
workInProgress2.flags = current2.flags & StaticMask;
workInProgress2.childLanes = current2.childLanes;
workInProgress2.lanes = current2.lanes;
workInProgress2.child = current2.child;
workInProgress2.memoizedProps = current2.memoizedProps;
workInProgress2.memoizedState = current2.memoizedState;
workInProgress2.updateQueue = current2.updateQueue;
var currentDependencies = current2.dependencies;
workInProgress2.dependencies = currentDependencies === null ? null : {
lanes: currentDependencies.lanes,
firstContext: currentDependencies.firstContext
};
workInProgress2.sibling = current2.sibling;
workInProgress2.index = current2.index;
workInProgress2.ref = current2.ref;
{
workInProgress2.selfBaseDuration = current2.selfBaseDuration;
workInProgress2.treeBaseDuration = current2.treeBaseDuration;
}
{
workInProgress2._debugNeedsRemount = current2._debugNeedsRemount;
switch (workInProgress2.tag) {
case IndeterminateComponent:
case FunctionComponent:
case SimpleMemoComponent:
workInProgress2.type = resolveFunctionForHotReloading(current2.type);
break;
case ClassComponent:
workInProgress2.type = resolveClassForHotReloading(current2.type);
break;
case ForwardRef:
workInProgress2.type = resolveForwardRefForHotReloading(current2.type);
break;
}
}
return workInProgress2;
}
function resetWorkInProgress(workInProgress2, renderLanes2) {
workInProgress2.flags &= StaticMask | Placement;
var current2 = workInProgress2.alternate;
if (current2 === null) {
workInProgress2.childLanes = NoLanes;
workInProgress2.lanes = renderLanes2;
workInProgress2.child = null;
workInProgress2.subtreeFlags = NoFlags;
workInProgress2.memoizedProps = null;
workInProgress2.memoizedState = null;
workInProgress2.updateQueue = null;
workInProgress2.dependencies = null;
workInProgress2.stateNode = null;
{
workInProgress2.selfBaseDuration = 0;
workInProgress2.treeBaseDuration = 0;
}
} else {
workInProgress2.childLanes = current2.childLanes;
workInProgress2.lanes = current2.lanes;
workInProgress2.child = current2.child;
workInProgress2.subtreeFlags = NoFlags;
workInProgress2.deletions = null;
workInProgress2.memoizedProps = current2.memoizedProps;
workInProgress2.memoizedState = current2.memoizedState;
workInProgress2.updateQueue = current2.updateQueue;
workInProgress2.type = current2.type;
var currentDependencies = current2.dependencies;
workInProgress2.dependencies = currentDependencies === null ? null : {
lanes: currentDependencies.lanes,
firstContext: currentDependencies.firstContext
};
{
workInProgress2.selfBaseDuration = current2.selfBaseDuration;
workInProgress2.treeBaseDuration = current2.treeBaseDuration;
}
}
return workInProgress2;
}
function createHostRootFiber(tag, isStrictMode, concurrentUpdatesByDefaultOverride) {
var mode;
if (tag === ConcurrentRoot) {
mode = ConcurrentMode;
if (isStrictMode === true) {
mode |= StrictLegacyMode;
{
mode |= StrictEffectsMode;
}
}
} else {
mode = NoMode;
}
if (isDevToolsPresent) {
mode |= ProfileMode;
}
return createFiber(HostRoot, null, null, mode);
}
function createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes) {
var fiberTag = IndeterminateComponent;
var resolvedType = type;
if (typeof type === "function") {
if (shouldConstruct$1(type)) {
fiberTag = ClassComponent;
{
resolvedType = resolveClassForHotReloading(resolvedType);
}
} else {
{
resolvedType = resolveFunctionForHotReloading(resolvedType);
}
}
} else if (typeof type === "string") {
fiberTag = HostComponent;
} else {
getTag:
switch (type) {
case REACT_FRAGMENT_TYPE2:
return createFiberFromFragment(pendingProps.children, mode, lanes, key);
case REACT_STRICT_MODE_TYPE:
fiberTag = Mode;
mode |= StrictLegacyMode;
if ((mode & ConcurrentMode) !== NoMode) {
mode |= StrictEffectsMode;
}
break;
case REACT_PROFILER_TYPE:
return createFiberFromProfiler(pendingProps, mode, lanes, key);
case REACT_SUSPENSE_TYPE:
return createFiberFromSuspense(pendingProps, mode, lanes, key);
case REACT_SUSPENSE_LIST_TYPE:
return createFiberFromSuspenseList(pendingProps, mode, lanes, key);
case REACT_OFFSCREEN_TYPE:
return createFiberFromOffscreen(pendingProps, mode, lanes, key);
case REACT_LEGACY_HIDDEN_TYPE:
case REACT_SCOPE_TYPE:
case REACT_CACHE_TYPE:
case REACT_TRACING_MARKER_TYPE:
case REACT_DEBUG_TRACING_MODE_TYPE:
default: {
if (typeof type === "object" && type !== null) {
switch (type.$$typeof) {
case REACT_PROVIDER_TYPE:
fiberTag = ContextProvider;
break getTag;
case REACT_CONTEXT_TYPE:
fiberTag = ContextConsumer;
break getTag;
case REACT_FORWARD_REF_TYPE:
fiberTag = ForwardRef;
{
resolvedType = resolveForwardRefForHotReloading(resolvedType);
}
break getTag;
case REACT_MEMO_TYPE:
fiberTag = MemoComponent;
break getTag;
case REACT_LAZY_TYPE:
fiberTag = LazyComponent;
resolvedType = null;
break getTag;
}
}
var info = "";
{
if (type === void 0 || typeof type === "object" && type !== null && Object.keys(type).length === 0) {
info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.";
}
var ownerName = owner ? getComponentNameFromFiber(owner) : null;
if (ownerName) {
info += "\n\nCheck the render method of `" + ownerName + "`.";
}
}
throw new Error("Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) " + ("but got: " + (type == null ? type : typeof type) + "." + info));
}
}
}
var fiber = createFiber(fiberTag, pendingProps, key, mode);
fiber.elementType = type;
fiber.type = resolvedType;
fiber.lanes = lanes;
{
fiber._debugOwner = owner;
}
return fiber;
}
function createFiberFromElement(element, mode, lanes) {
var owner = null;
{
owner = element._owner;
}
var type = element.type;
var key = element.key;
var pendingProps = element.props;
var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes);
{
fiber._debugSource = element._source;
fiber._debugOwner = element._owner;
}
return fiber;
}
function createFiberFromFragment(elements, mode, lanes, key) {
var fiber = createFiber(Fragment, elements, key, mode);
fiber.lanes = lanes;
return fiber;
}
function createFiberFromProfiler(pendingProps, mode, lanes, key) {
{
if (typeof pendingProps.id !== "string") {
error('Profiler must specify an "id" of type `string` as a prop. Received the type `%s` instead.', typeof pendingProps.id);
}
}
var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode);
fiber.elementType = REACT_PROFILER_TYPE;
fiber.lanes = lanes;
{
fiber.stateNode = {
effectDuration: 0,
passiveEffectDuration: 0
};
}
return fiber;
}
function createFiberFromSuspense(pendingProps, mode, lanes, key) {
var fiber = createFiber(SuspenseComponent, pendingProps, key, mode);
fiber.elementType = REACT_SUSPENSE_TYPE;
fiber.lanes = lanes;
return fiber;
}
function createFiberFromSuspenseList(pendingProps, mode, lanes, key) {
var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);
fiber.elementType = REACT_SUSPENSE_LIST_TYPE;
fiber.lanes = lanes;
return fiber;
}
function createFiberFromOffscreen(pendingProps, mode, lanes, key) {
var fiber = createFiber(OffscreenComponent, pendingProps, key, mode);
fiber.elementType = REACT_OFFSCREEN_TYPE;
fiber.lanes = lanes;
var primaryChildInstance = {
isHidden: false
};
fiber.stateNode = primaryChildInstance;
return fiber;
}
function createFiberFromText(content, mode, lanes) {
var fiber = createFiber(HostText, content, null, mode);
fiber.lanes = lanes;
return fiber;
}
function createFiberFromHostInstanceForDeletion() {
var fiber = createFiber(HostComponent, null, null, NoMode);
fiber.elementType = "DELETED";
return fiber;
}
function createFiberFromDehydratedFragment(dehydratedNode) {
var fiber = createFiber(DehydratedFragment, null, null, NoMode);
fiber.stateNode = dehydratedNode;
return fiber;
}
function createFiberFromPortal(portal, mode, lanes) {
var pendingProps = portal.children !== null ? portal.children : [];
var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
fiber.lanes = lanes;
fiber.stateNode = {
containerInfo: portal.containerInfo,
pendingChildren: null,
implementation: portal.implementation
};
return fiber;
}
function assignFiberPropertiesInDEV(target, source) {
if (target === null) {
target = createFiber(IndeterminateComponent, null, null, NoMode);
}
target.tag = source.tag;
target.key = source.key;
target.elementType = source.elementType;
target.type = source.type;
target.stateNode = source.stateNode;
target.return = source.return;
target.child = source.child;
target.sibling = source.sibling;
target.index = source.index;
target.ref = source.ref;
target.pendingProps = source.pendingProps;
target.memoizedProps = source.memoizedProps;
target.updateQueue = source.updateQueue;
target.memoizedState = source.memoizedState;
target.dependencies = source.dependencies;
target.mode = source.mode;
target.flags = source.flags;
target.subtreeFlags = source.subtreeFlags;
target.deletions = source.deletions;
target.lanes = source.lanes;
target.childLanes = source.childLanes;
target.alternate = source.alternate;
{
target.actualDuration = source.actualDuration;
target.actualStartTime = source.actualStartTime;
target.selfBaseDuration = source.selfBaseDuration;
target.treeBaseDuration = source.treeBaseDuration;
}
target._debugSource = source._debugSource;
target._debugOwner = source._debugOwner;
target._debugNeedsRemount = source._debugNeedsRemount;
target._debugHookTypes = source._debugHookTypes;
return target;
}
function FiberRootNode(containerInfo, tag, hydrate2, identifierPrefix, onRecoverableError) {
this.tag = tag;
this.containerInfo = containerInfo;
this.pendingChildren = null;
this.current = null;
this.pingCache = null;
this.finishedWork = null;
this.timeoutHandle = noTimeout;
this.context = null;
this.pendingContext = null;
this.callbackNode = null;
this.callbackPriority = NoLane;
this.eventTimes = createLaneMap(NoLanes);
this.expirationTimes = createLaneMap(NoTimestamp);
this.pendingLanes = NoLanes;
this.suspendedLanes = NoLanes;
this.pingedLanes = NoLanes;
this.expiredLanes = NoLanes;
this.mutableReadLanes = NoLanes;
this.finishedLanes = NoLanes;
this.entangledLanes = NoLanes;
this.entanglements = createLaneMap(NoLanes);
this.identifierPrefix = identifierPrefix;
this.onRecoverableError = onRecoverableError;
{
this.mutableSourceEagerHydrationData = null;
}
{
this.effectDuration = 0;
this.passiveEffectDuration = 0;
}
{
this.memoizedUpdaters = new Set();
var pendingUpdatersLaneMap = this.pendingUpdatersLaneMap = [];
for (var _i = 0; _i < TotalLanes; _i++) {
pendingUpdatersLaneMap.push(new Set());
}
}
{
switch (tag) {
case ConcurrentRoot:
this._debugRootType = hydrate2 ? "hydrateRoot()" : "createRoot()";
break;
case LegacyRoot:
this._debugRootType = hydrate2 ? "hydrate()" : "render()";
break;
}
}
}
function createFiberRoot(containerInfo, tag, hydrate2, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
var root2 = new FiberRootNode(containerInfo, tag, hydrate2, identifierPrefix, onRecoverableError);
var uninitializedFiber = createHostRootFiber(tag, isStrictMode);
root2.current = uninitializedFiber;
uninitializedFiber.stateNode = root2;
{
var _initialState = {
element: initialChildren,
isDehydrated: hydrate2,
cache: null,
transitions: null,
pendingSuspenseBoundaries: null
};
uninitializedFiber.memoizedState = _initialState;
}
initializeUpdateQueue(uninitializedFiber);
return root2;
}
var ReactVersion = "18.2.0";
function createPortal2(children, containerInfo, implementation) {
var key = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : null;
{
checkKeyStringCoercion(key);
}
return {
$$typeof: REACT_PORTAL_TYPE,
key: key == null ? null : "" + key,
children,
containerInfo,
implementation
};
}
var didWarnAboutNestedUpdates;
var didWarnAboutFindNodeInStrictMode;
{
didWarnAboutNestedUpdates = false;
didWarnAboutFindNodeInStrictMode = {};
}
function getContextForSubtree(parentComponent) {
if (!parentComponent) {
return emptyContextObject;
}
var fiber = get(parentComponent);
var parentContext = findCurrentUnmaskedContext(fiber);
if (fiber.tag === ClassComponent) {
var Component4 = fiber.type;
if (isContextProvider(Component4)) {
return processChildContext(fiber, Component4, parentContext);
}
}
return parentContext;
}
function findHostInstanceWithWarning(component, methodName) {
{
var fiber = get(component);
if (fiber === void 0) {
if (typeof component.render === "function") {
throw new Error("Unable to find node on an unmounted component.");
} else {
var keys = Object.keys(component).join(",");
throw new Error("Argument appears to not be a ReactComponent. Keys: " + keys);
}
}
var hostFiber = findCurrentHostFiber(fiber);
if (hostFiber === null) {
return null;
}
if (hostFiber.mode & StrictLegacyMode) {
var componentName = getComponentNameFromFiber(fiber) || "Component";
if (!didWarnAboutFindNodeInStrictMode[componentName]) {
didWarnAboutFindNodeInStrictMode[componentName] = true;
var previousFiber = current;
try {
setCurrentFiber(hostFiber);
if (fiber.mode & StrictLegacyMode) {
error("%s is deprecated in StrictMode. %s was passed an instance of %s which is inside StrictMode. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-find-node", methodName, methodName, componentName);
} else {
error("%s is deprecated in StrictMode. %s was passed an instance of %s which renders StrictMode children. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-find-node", methodName, methodName, componentName);
}
} finally {
if (previousFiber) {
setCurrentFiber(previousFiber);
} else {
resetCurrentFiber();
}
}
}
}
return hostFiber.stateNode;
}
}
function createContainer(containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
var hydrate2 = false;
var initialChildren = null;
return createFiberRoot(containerInfo, tag, hydrate2, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
}
function createHydrationContainer(initialChildren, callback, containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
var hydrate2 = true;
var root2 = createFiberRoot(containerInfo, tag, hydrate2, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
root2.context = getContextForSubtree(null);
var current2 = root2.current;
var eventTime = requestEventTime();
var lane = requestUpdateLane(current2);
var update = createUpdate(eventTime, lane);
update.callback = callback !== void 0 && callback !== null ? callback : null;
enqueueUpdate(current2, update, lane);
scheduleInitialHydrationOnRoot(root2, lane, eventTime);
return root2;
}
function updateContainer(element, container, parentComponent, callback) {
{
onScheduleRoot(container, element);
}
var current$1 = container.current;
var eventTime = requestEventTime();
var lane = requestUpdateLane(current$1);
{
markRenderScheduled(lane);
}
var context = getContextForSubtree(parentComponent);
if (container.context === null) {
container.context = context;
} else {
container.pendingContext = context;
}
{
if (isRendering && current !== null && !didWarnAboutNestedUpdates) {
didWarnAboutNestedUpdates = true;
error("Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\n\nCheck the render method of %s.", getComponentNameFromFiber(current) || "Unknown");
}
}
var update = createUpdate(eventTime, lane);
update.payload = {
element
};
callback = callback === void 0 ? null : callback;
if (callback !== null) {
{
if (typeof callback !== "function") {
error("render(...): Expected the last optional `callback` argument to be a function. Instead received: %s.", callback);
}
}
update.callback = callback;
}
var root2 = enqueueUpdate(current$1, update, lane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, current$1, lane, eventTime);
entangleTransitions(root2, current$1, lane);
}
return lane;
}
function getPublicRootInstance(container) {
var containerFiber = container.current;
if (!containerFiber.child) {
return null;
}
switch (containerFiber.child.tag) {
case HostComponent:
return getPublicInstance(containerFiber.child.stateNode);
default:
return containerFiber.child.stateNode;
}
}
function attemptSynchronousHydration$1(fiber) {
switch (fiber.tag) {
case HostRoot: {
var root2 = fiber.stateNode;
if (isRootDehydrated(root2)) {
var lanes = getHighestPriorityPendingLanes(root2);
flushRoot(root2, lanes);
}
break;
}
case SuspenseComponent: {
flushSync(function() {
var root3 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root3 !== null) {
var eventTime = requestEventTime();
scheduleUpdateOnFiber(root3, fiber, SyncLane, eventTime);
}
});
var retryLane = SyncLane;
markRetryLaneIfNotHydrated(fiber, retryLane);
break;
}
}
}
function markRetryLaneImpl(fiber, retryLane) {
var suspenseState = fiber.memoizedState;
if (suspenseState !== null && suspenseState.dehydrated !== null) {
suspenseState.retryLane = higherPriorityLane(suspenseState.retryLane, retryLane);
}
}
function markRetryLaneIfNotHydrated(fiber, retryLane) {
markRetryLaneImpl(fiber, retryLane);
var alternate = fiber.alternate;
if (alternate) {
markRetryLaneImpl(alternate, retryLane);
}
}
function attemptContinuousHydration$1(fiber) {
if (fiber.tag !== SuspenseComponent) {
return;
}
var lane = SelectiveHydrationLane;
var root2 = enqueueConcurrentRenderForLane(fiber, lane);
if (root2 !== null) {
var eventTime = requestEventTime();
scheduleUpdateOnFiber(root2, fiber, lane, eventTime);
}
markRetryLaneIfNotHydrated(fiber, lane);
}
function attemptHydrationAtCurrentPriority$1(fiber) {
if (fiber.tag !== SuspenseComponent) {
return;
}
var lane = requestUpdateLane(fiber);
var root2 = enqueueConcurrentRenderForLane(fiber, lane);
if (root2 !== null) {
var eventTime = requestEventTime();
scheduleUpdateOnFiber(root2, fiber, lane, eventTime);
}
markRetryLaneIfNotHydrated(fiber, lane);
}
function findHostInstanceWithNoPortals(fiber) {
var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
if (hostFiber === null) {
return null;
}
return hostFiber.stateNode;
}
var shouldErrorImpl = function(fiber) {
return null;
};
function shouldError(fiber) {
return shouldErrorImpl(fiber);
}
var shouldSuspendImpl = function(fiber) {
return false;
};
function shouldSuspend(fiber) {
return shouldSuspendImpl(fiber);
}
var overrideHookState = null;
var overrideHookStateDeletePath = null;
var overrideHookStateRenamePath = null;
var overrideProps = null;
var overridePropsDeletePath = null;
var overridePropsRenamePath = null;
var scheduleUpdate = null;
var setErrorHandler = null;
var setSuspenseHandler = null;
{
var copyWithDeleteImpl = function(obj, path, index3) {
var key = path[index3];
var updated = isArray3(obj) ? obj.slice() : assign2({}, obj);
if (index3 + 1 === path.length) {
if (isArray3(updated)) {
updated.splice(key, 1);
} else {
delete updated[key];
}
return updated;
}
updated[key] = copyWithDeleteImpl(obj[key], path, index3 + 1);
return updated;
};
var copyWithDelete = function(obj, path) {
return copyWithDeleteImpl(obj, path, 0);
};
var copyWithRenameImpl = function(obj, oldPath, newPath, index3) {
var oldKey = oldPath[index3];
var updated = isArray3(obj) ? obj.slice() : assign2({}, obj);
if (index3 + 1 === oldPath.length) {
var newKey = newPath[index3];
updated[newKey] = updated[oldKey];
if (isArray3(updated)) {
updated.splice(oldKey, 1);
} else {
delete updated[oldKey];
}
} else {
updated[oldKey] = copyWithRenameImpl(obj[oldKey], oldPath, newPath, index3 + 1);
}
return updated;
};
var copyWithRename = function(obj, oldPath, newPath) {
if (oldPath.length !== newPath.length) {
warn("copyWithRename() expects paths of the same length");
return;
} else {
for (var i = 0; i < newPath.length - 1; i++) {
if (oldPath[i] !== newPath[i]) {
warn("copyWithRename() expects paths to be the same except for the deepest key");
return;
}
}
}
return copyWithRenameImpl(obj, oldPath, newPath, 0);
};
var copyWithSetImpl = function(obj, path, index3, value) {
if (index3 >= path.length) {
return value;
}
var key = path[index3];
var updated = isArray3(obj) ? obj.slice() : assign2({}, obj);
updated[key] = copyWithSetImpl(obj[key], path, index3 + 1, value);
return updated;
};
var copyWithSet = function(obj, path, value) {
return copyWithSetImpl(obj, path, 0, value);
};
var findHook = function(fiber, id) {
var currentHook2 = fiber.memoizedState;
while (currentHook2 !== null && id > 0) {
currentHook2 = currentHook2.next;
id--;
}
return currentHook2;
};
overrideHookState = function(fiber, id, path, value) {
var hook = findHook(fiber, id);
if (hook !== null) {
var newState = copyWithSet(hook.memoizedState, path, value);
hook.memoizedState = newState;
hook.baseState = newState;
fiber.memoizedProps = assign2({}, fiber.memoizedProps);
var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, SyncLane, NoTimestamp);
}
}
};
overrideHookStateDeletePath = function(fiber, id, path) {
var hook = findHook(fiber, id);
if (hook !== null) {
var newState = copyWithDelete(hook.memoizedState, path);
hook.memoizedState = newState;
hook.baseState = newState;
fiber.memoizedProps = assign2({}, fiber.memoizedProps);
var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, SyncLane, NoTimestamp);
}
}
};
overrideHookStateRenamePath = function(fiber, id, oldPath, newPath) {
var hook = findHook(fiber, id);
if (hook !== null) {
var newState = copyWithRename(hook.memoizedState, oldPath, newPath);
hook.memoizedState = newState;
hook.baseState = newState;
fiber.memoizedProps = assign2({}, fiber.memoizedProps);
var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, SyncLane, NoTimestamp);
}
}
};
overrideProps = function(fiber, path, value) {
fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
if (fiber.alternate) {
fiber.alternate.pendingProps = fiber.pendingProps;
}
var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, SyncLane, NoTimestamp);
}
};
overridePropsDeletePath = function(fiber, path) {
fiber.pendingProps = copyWithDelete(fiber.memoizedProps, path);
if (fiber.alternate) {
fiber.alternate.pendingProps = fiber.pendingProps;
}
var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, SyncLane, NoTimestamp);
}
};
overridePropsRenamePath = function(fiber, oldPath, newPath) {
fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath);
if (fiber.alternate) {
fiber.alternate.pendingProps = fiber.pendingProps;
}
var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, SyncLane, NoTimestamp);
}
};
scheduleUpdate = function(fiber) {
var root2 = enqueueConcurrentRenderForLane(fiber, SyncLane);
if (root2 !== null) {
scheduleUpdateOnFiber(root2, fiber, SyncLane, NoTimestamp);
}
};
setErrorHandler = function(newShouldErrorImpl) {
shouldErrorImpl = newShouldErrorImpl;
};
setSuspenseHandler = function(newShouldSuspendImpl) {
shouldSuspendImpl = newShouldSuspendImpl;
};
}
function findHostInstanceByFiber(fiber) {
var hostFiber = findCurrentHostFiber(fiber);
if (hostFiber === null) {
return null;
}
return hostFiber.stateNode;
}
function emptyFindFiberByHostInstance(instance) {
return null;
}
function getCurrentFiberForDevTools() {
return current;
}
function injectIntoDevTools(devToolsConfig) {
var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
var ReactCurrentDispatcher2 = ReactSharedInternals.ReactCurrentDispatcher;
return injectInternals({
bundleType: devToolsConfig.bundleType,
version: devToolsConfig.version,
rendererPackageName: devToolsConfig.rendererPackageName,
rendererConfig: devToolsConfig.rendererConfig,
overrideHookState,
overrideHookStateDeletePath,
overrideHookStateRenamePath,
overrideProps,
overridePropsDeletePath,
overridePropsRenamePath,
setErrorHandler,
setSuspenseHandler,
scheduleUpdate,
currentDispatcherRef: ReactCurrentDispatcher2,
findHostInstanceByFiber,
findFiberByHostInstance: findFiberByHostInstance || emptyFindFiberByHostInstance,
findHostInstancesForRefresh,
scheduleRefresh,
scheduleRoot,
setRefreshHandler,
getCurrentFiber: getCurrentFiberForDevTools,
reconcilerVersion: ReactVersion
});
}
var defaultOnRecoverableError = typeof reportError === "function" ? reportError : function(error2) {
console["error"](error2);
};
function ReactDOMRoot(internalRoot) {
this._internalRoot = internalRoot;
}
ReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render = function(children) {
var root2 = this._internalRoot;
if (root2 === null) {
throw new Error("Cannot update an unmounted root.");
}
{
if (typeof arguments[1] === "function") {
error("render(...): does not support the second callback argument. To execute a side effect after rendering, declare it in a component body with useEffect().");
} else if (isValidContainer(arguments[1])) {
error("You passed a container to the second argument of root.render(...). You don't need to pass it again since you already passed it to create the root.");
} else if (typeof arguments[1] !== "undefined") {
error("You passed a second argument to root.render(...) but it only accepts one argument.");
}
var container = root2.containerInfo;
if (container.nodeType !== COMMENT_NODE) {
var hostInstance = findHostInstanceWithNoPortals(root2.current);
if (hostInstance) {
if (hostInstance.parentNode !== container) {
error("render(...): It looks like the React-rendered content of the root container was removed without using React. This is not supported and will cause errors. Instead, call root.unmount() to empty a root's container.");
}
}
}
}
updateContainer(children, root2, null, null);
};
ReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount = function() {
{
if (typeof arguments[0] === "function") {
error("unmount(...): does not support a callback argument. To execute a side effect after rendering, declare it in a component body with useEffect().");
}
}
var root2 = this._internalRoot;
if (root2 !== null) {
this._internalRoot = null;
var container = root2.containerInfo;
{
if (isAlreadyRendering()) {
error("Attempted to synchronously unmount a root while React was already rendering. React cannot finish unmounting the root until the current render has completed, which may lead to a race condition.");
}
}
flushSync(function() {
updateContainer(null, root2, null, null);
});
unmarkContainerAsRoot(container);
}
};
function createRoot2(container, options2) {
if (!isValidContainer(container)) {
throw new Error("createRoot(...): Target container is not a DOM element.");
}
warnIfReactDOMContainerInDEV(container);
var isStrictMode = false;
var concurrentUpdatesByDefaultOverride = false;
var identifierPrefix = "";
var onRecoverableError = defaultOnRecoverableError;
var transitionCallbacks = null;
if (options2 !== null && options2 !== void 0) {
{
if (options2.hydrate) {
warn("hydrate through createRoot is deprecated. Use ReactDOMClient.hydrateRoot(container, <App />) instead.");
} else {
if (typeof options2 === "object" && options2 !== null && options2.$$typeof === REACT_ELEMENT_TYPE) {
error("You passed a JSX element to createRoot. You probably meant to call root.render instead. Example usage:\n\n let root = createRoot(domContainer);\n root.render(<App />);");
}
}
}
if (options2.unstable_strictMode === true) {
isStrictMode = true;
}
if (options2.identifierPrefix !== void 0) {
identifierPrefix = options2.identifierPrefix;
}
if (options2.onRecoverableError !== void 0) {
onRecoverableError = options2.onRecoverableError;
}
if (options2.transitionCallbacks !== void 0) {
transitionCallbacks = options2.transitionCallbacks;
}
}
var root2 = createContainer(container, ConcurrentRoot, null, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
markContainerAsRoot(root2.current, container);
var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
listenToAllSupportedEvents(rootContainerElement);
return new ReactDOMRoot(root2);
}
function ReactDOMHydrationRoot(internalRoot) {
this._internalRoot = internalRoot;
}
function scheduleHydration(target) {
if (target) {
queueExplicitHydrationTarget(target);
}
}
ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = scheduleHydration;
function hydrateRoot(container, initialChildren, options2) {
if (!isValidContainer(container)) {
throw new Error("hydrateRoot(...): Target container is not a DOM element.");
}
warnIfReactDOMContainerInDEV(container);
{
if (initialChildren === void 0) {
error("Must provide initial children as second argument to hydrateRoot. Example usage: hydrateRoot(domContainer, <App />)");
}
}
var hydrationCallbacks = options2 != null ? options2 : null;
var mutableSources = options2 != null && options2.hydratedSources || null;
var isStrictMode = false;
var concurrentUpdatesByDefaultOverride = false;
var identifierPrefix = "";
var onRecoverableError = defaultOnRecoverableError;
if (options2 !== null && options2 !== void 0) {
if (options2.unstable_strictMode === true) {
isStrictMode = true;
}
if (options2.identifierPrefix !== void 0) {
identifierPrefix = options2.identifierPrefix;
}
if (options2.onRecoverableError !== void 0) {
onRecoverableError = options2.onRecoverableError;
}
}
var root2 = createHydrationContainer(initialChildren, null, container, ConcurrentRoot, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
markContainerAsRoot(root2.current, container);
listenToAllSupportedEvents(container);
if (mutableSources) {
for (var i = 0; i < mutableSources.length; i++) {
var mutableSource = mutableSources[i];
registerMutableSourceForHydration(root2, mutableSource);
}
}
return new ReactDOMHydrationRoot(root2);
}
function isValidContainer(node) {
return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || !disableCommentsAsDOMContainers));
}
function isValidContainerLegacy(node) {
return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === " react-mount-point-unstable "));
}
function warnIfReactDOMContainerInDEV(container) {
{
if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === "BODY") {
error("createRoot(): Creating roots directly with document.body is discouraged, since its children are often manipulated by third-party scripts and browser extensions. This may lead to subtle reconciliation issues. Try using a container element created for your app.");
}
if (isContainerMarkedAsRoot(container)) {
if (container._reactRootContainer) {
error("You are calling ReactDOMClient.createRoot() on a container that was previously passed to ReactDOM.render(). This is not supported.");
} else {
error("You are calling ReactDOMClient.createRoot() on a container that has already been passed to createRoot() before. Instead, call root.render() on the existing root instead if you want to update it.");
}
}
}
}
var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
var topLevelUpdateWarnings;
{
topLevelUpdateWarnings = function(container) {
if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer.current);
if (hostInstance) {
if (hostInstance.parentNode !== container) {
error("render(...): It looks like the React-rendered content of this container was removed without using React. This is not supported and will cause errors. Instead, call ReactDOM.unmountComponentAtNode to empty a container.");
}
}
}
var isRootRenderedBySomeReact = !!container._reactRootContainer;
var rootEl = getReactRootElementInContainer(container);
var hasNonRootReactChild = !!(rootEl && getInstanceFromNode(rootEl));
if (hasNonRootReactChild && !isRootRenderedBySomeReact) {
error("render(...): Replacing React-rendered children with a new root component. If you intended to update the children of this node, you should instead have the existing children update their state and render the new components instead of calling ReactDOM.render.");
}
if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === "BODY") {
error("render(): Rendering components directly into document.body is discouraged, since its children are often manipulated by third-party scripts and browser extensions. This may lead to subtle reconciliation issues. Try rendering into a container element created for your app.");
}
};
}
function getReactRootElementInContainer(container) {
if (!container) {
return null;
}
if (container.nodeType === DOCUMENT_NODE) {
return container.documentElement;
} else {
return container.firstChild;
}
}
function noopOnRecoverableError() {
}
function legacyCreateRootFromDOMContainer(container, initialChildren, parentComponent, callback, isHydrationContainer) {
if (isHydrationContainer) {
if (typeof callback === "function") {
var originalCallback = callback;
callback = function() {
var instance = getPublicRootInstance(root2);
originalCallback.call(instance);
};
}
var root2 = createHydrationContainer(initialChildren, callback, container, LegacyRoot, null, false, false, "", noopOnRecoverableError);
container._reactRootContainer = root2;
markContainerAsRoot(root2.current, container);
var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
listenToAllSupportedEvents(rootContainerElement);
flushSync();
return root2;
} else {
var rootSibling;
while (rootSibling = container.lastChild) {
container.removeChild(rootSibling);
}
if (typeof callback === "function") {
var _originalCallback = callback;
callback = function() {
var instance = getPublicRootInstance(_root);
_originalCallback.call(instance);
};
}
var _root = createContainer(container, LegacyRoot, null, false, false, "", noopOnRecoverableError);
container._reactRootContainer = _root;
markContainerAsRoot(_root.current, container);
var _rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
listenToAllSupportedEvents(_rootContainerElement);
flushSync(function() {
updateContainer(initialChildren, _root, parentComponent, callback);
});
return _root;
}
}
function warnOnInvalidCallback$1(callback, callerName) {
{
if (callback !== null && typeof callback !== "function") {
error("%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.", callerName, callback);
}
}
}
function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
{
topLevelUpdateWarnings(container);
warnOnInvalidCallback$1(callback === void 0 ? null : callback, "render");
}
var maybeRoot = container._reactRootContainer;
var root2;
if (!maybeRoot) {
root2 = legacyCreateRootFromDOMContainer(container, children, parentComponent, callback, forceHydrate);
} else {
root2 = maybeRoot;
if (typeof callback === "function") {
var originalCallback = callback;
callback = function() {
var instance = getPublicRootInstance(root2);
originalCallback.call(instance);
};
}
updateContainer(children, root2, parentComponent, callback);
}
return getPublicRootInstance(root2);
}
function findDOMNode3(componentOrElement) {
{
var owner = ReactCurrentOwner$3.current;
if (owner !== null && owner.stateNode !== null) {
var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
if (!warnedAboutRefsInRender) {
error("%s is accessing findDOMNode inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", getComponentNameFromType(owner.type) || "A component");
}
owner.stateNode._warnedAboutRefsInRender = true;
}
}
if (componentOrElement == null) {
return null;
}
if (componentOrElement.nodeType === ELEMENT_NODE) {
return componentOrElement;
}
{
return findHostInstanceWithWarning(componentOrElement, "findDOMNode");
}
}
function hydrate(element, container, callback) {
{
error("ReactDOM.hydrate is no longer supported in React 18. Use hydrateRoot instead. Until you switch to the new API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot");
}
if (!isValidContainerLegacy(container)) {
throw new Error("Target container is not a DOM element.");
}
{
var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === void 0;
if (isModernRoot) {
error("You are calling ReactDOM.hydrate() on a container that was previously passed to ReactDOMClient.createRoot(). This is not supported. Did you mean to call hydrateRoot(container, element)?");
}
}
return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
}
function render(element, container, callback) {
{
error("ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot");
}
if (!isValidContainerLegacy(container)) {
throw new Error("Target container is not a DOM element.");
}
{
var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === void 0;
if (isModernRoot) {
error("You are calling ReactDOM.render() on a container that was previously passed to ReactDOMClient.createRoot(). This is not supported. Did you mean to call root.render(element)?");
}
}
return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
}
function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
{
error("ReactDOM.unstable_renderSubtreeIntoContainer() is no longer supported in React 18. Consider using a portal instead. Until you switch to the createRoot API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot");
}
if (!isValidContainerLegacy(containerNode)) {
throw new Error("Target container is not a DOM element.");
}
if (parentComponent == null || !has(parentComponent)) {
throw new Error("parentComponent must be a valid React Component");
}
return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
}
function unmountComponentAtNode(container) {
if (!isValidContainerLegacy(container)) {
throw new Error("unmountComponentAtNode(...): Target container is not a DOM element.");
}
{
var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === void 0;
if (isModernRoot) {
error("You are calling ReactDOM.unmountComponentAtNode() on a container that was previously passed to ReactDOMClient.createRoot(). This is not supported. Did you mean to call root.unmount()?");
}
}
if (container._reactRootContainer) {
{
var rootEl = getReactRootElementInContainer(container);
var renderedByDifferentReact = rootEl && !getInstanceFromNode(rootEl);
if (renderedByDifferentReact) {
error("unmountComponentAtNode(): The node you're attempting to unmount was rendered by another copy of React.");
}
}
flushSync(function() {
legacyRenderSubtreeIntoContainer(null, null, container, false, function() {
container._reactRootContainer = null;
unmarkContainerAsRoot(container);
});
});
return true;
} else {
{
var _rootEl = getReactRootElementInContainer(container);
var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode(_rootEl));
var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainerLegacy(container.parentNode) && !!container.parentNode._reactRootContainer;
if (hasNonRootReactChild) {
error("unmountComponentAtNode(): The node you're attempting to unmount was rendered by React and is not a top-level container. %s", isContainerReactRoot ? "You may have accidentally passed in a React root node instead of its container." : "Instead, have the parent component update its state and rerender in order to remove this component.");
}
}
return false;
}
}
setAttemptSynchronousHydration(attemptSynchronousHydration$1);
setAttemptContinuousHydration(attemptContinuousHydration$1);
setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);
setGetCurrentUpdatePriority(getCurrentUpdatePriority);
setAttemptHydrationAtPriority(runWithPriority);
{
if (typeof Map !== "function" || Map.prototype == null || typeof Map.prototype.forEach !== "function" || typeof Set !== "function" || Set.prototype == null || typeof Set.prototype.clear !== "function" || typeof Set.prototype.forEach !== "function") {
error("React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");
}
}
setRestoreImplementation(restoreControlledState$3);
setBatchingImplementation(batchedUpdates$1, discreteUpdates, flushSync);
function createPortal$1(children, container) {
var key = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
if (!isValidContainer(container)) {
throw new Error("Target container is not a DOM element.");
}
return createPortal2(children, container, null, key);
}
function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);
}
var Internals = {
usingClientEntryPoint: false,
Events: [getInstanceFromNode, getNodeFromInstance, getFiberCurrentPropsFromNode, enqueueStateRestore, restoreStateIfNeeded, batchedUpdates$1]
};
function createRoot$1(container, options2) {
{
if (!Internals.usingClientEntryPoint && true) {
error('You are importing createRoot from "react-dom" which is not supported. You should instead import it from "react-dom/client".');
}
}
return createRoot2(container, options2);
}
function hydrateRoot$1(container, initialChildren, options2) {
{
if (!Internals.usingClientEntryPoint && true) {
error('You are importing hydrateRoot from "react-dom" which is not supported. You should instead import it from "react-dom/client".');
}
}
return hydrateRoot(container, initialChildren, options2);
}
function flushSync$1(fn) {
{
if (isAlreadyRendering()) {
error("flushSync was called from inside a lifecycle method. React cannot flush when React is already rendering. Consider moving this call to a scheduler task or micro task.");
}
}
return flushSync(fn);
}
var foundDevTools = injectIntoDevTools({
findFiberByHostInstance: getClosestInstanceFromNode,
bundleType: 1,
version: ReactVersion,
rendererPackageName: "react-dom"
});
{
if (!foundDevTools && canUseDOM && window.top === window.self) {
if (navigator.userAgent.indexOf("Chrome") > -1 && navigator.userAgent.indexOf("Edge") === -1 || navigator.userAgent.indexOf("Firefox") > -1) {
var protocol = window.location.protocol;
if (/^(https?|file):$/.test(protocol)) {
console.info("%cDownload the React DevTools for a better development experience: https://reactjs.org/link/react-devtools" + (protocol === "file:" ? "\nYou might need to use a local HTTP server (instead of file://): https://reactjs.org/link/react-devtools-faq" : ""), "font-weight:bold");
}
}
}
}
exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;
exports.createPortal = createPortal$1;
exports.createRoot = createRoot$1;
exports.findDOMNode = findDOMNode3;
exports.flushSync = flushSync$1;
exports.hydrate = hydrate;
exports.hydrateRoot = hydrateRoot$1;
exports.render = render;
exports.unmountComponentAtNode = unmountComponentAtNode;
exports.unstable_batchedUpdates = batchedUpdates$1;
exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;
exports.version = ReactVersion;
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") {
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
}
})();
}
}
});
// node_modules/react-dom/index.js
var require_react_dom = __commonJS({
"node_modules/react-dom/index.js"(exports, module2) {
"use strict";
if (false) {
checkDCE();
module2.exports = null;
} else {
module2.exports = require_react_dom_development();
}
}
});
// node_modules/react-dom/client.js
var require_client = __commonJS({
"node_modules/react-dom/client.js"(exports) {
"use strict";
var m = require_react_dom();
if (false) {
exports.createRoot = m.createRoot;
exports.hydrateRoot = m.hydrateRoot;
} else {
i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
exports.createRoot = function(c, o) {
i.usingClientEntryPoint = true;
try {
return m.createRoot(c, o);
} finally {
i.usingClientEntryPoint = false;
}
};
exports.hydrateRoot = function(c, h, o) {
i.usingClientEntryPoint = true;
try {
return m.hydrateRoot(c, h, o);
} finally {
i.usingClientEntryPoint = false;
}
};
}
var i;
}
});
// node_modules/lodash/noop.js
var require_noop = __commonJS({
"node_modules/lodash/noop.js"(exports, module2) {
function noop3() {
}
module2.exports = noop3;
}
});
// node_modules/lodash/isArray.js
var require_isArray = __commonJS({
"node_modules/lodash/isArray.js"(exports, module2) {
var isArray3 = Array.isArray;
module2.exports = isArray3;
}
});
// node_modules/lodash/_freeGlobal.js
var require_freeGlobal = __commonJS({
"node_modules/lodash/_freeGlobal.js"(exports, module2) {
var freeGlobal = typeof window == "object" && window && window.Object === Object && window;
module2.exports = freeGlobal;
}
});
// node_modules/lodash/_root.js
var require_root = __commonJS({
"node_modules/lodash/_root.js"(exports, module2) {
var freeGlobal = require_freeGlobal();
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
var root = freeGlobal || freeSelf || Function("return this")();
module2.exports = root;
}
});
// node_modules/lodash/_Symbol.js
var require_Symbol = __commonJS({
"node_modules/lodash/_Symbol.js"(exports, module2) {
var root = require_root();
var Symbol2 = root.Symbol;
module2.exports = Symbol2;
}
});
// node_modules/lodash/_getRawTag.js
var require_getRawTag = __commonJS({
"node_modules/lodash/_getRawTag.js"(exports, module2) {
var Symbol2 = require_Symbol();
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
var nativeObjectToString = objectProto.toString;
var symToStringTag = Symbol2 ? Symbol2.toStringTag : void 0;
function getRawTag(value) {
var isOwn = hasOwnProperty4.call(value, symToStringTag), tag = value[symToStringTag];
try {
value[symToStringTag] = void 0;
var unmasked = true;
} catch (e) {
}
var result = nativeObjectToString.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag] = tag;
} else {
delete value[symToStringTag];
}
}
return result;
}
module2.exports = getRawTag;
}
});
// node_modules/lodash/_objectToString.js
var require_objectToString = __commonJS({
"node_modules/lodash/_objectToString.js"(exports, module2) {
var objectProto = Object.prototype;
var nativeObjectToString = objectProto.toString;
function objectToString(value) {
return nativeObjectToString.call(value);
}
module2.exports = objectToString;
}
});
// node_modules/lodash/_baseGetTag.js
var require_baseGetTag = __commonJS({
"node_modules/lodash/_baseGetTag.js"(exports, module2) {
var Symbol2 = require_Symbol();
var getRawTag = require_getRawTag();
var objectToString = require_objectToString();
var nullTag = "[object Null]";
var undefinedTag = "[object Undefined]";
var symToStringTag = Symbol2 ? Symbol2.toStringTag : void 0;
function baseGetTag(value) {
if (value == null) {
return value === void 0 ? undefinedTag : nullTag;
}
return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
}
module2.exports = baseGetTag;
}
});
// node_modules/lodash/isObjectLike.js
var require_isObjectLike = __commonJS({
"node_modules/lodash/isObjectLike.js"(exports, module2) {
function isObjectLike(value) {
return value != null && typeof value == "object";
}
module2.exports = isObjectLike;
}
});
// node_modules/lodash/isSymbol.js
var require_isSymbol = __commonJS({
"node_modules/lodash/isSymbol.js"(exports, module2) {
var baseGetTag = require_baseGetTag();
var isObjectLike = require_isObjectLike();
var symbolTag = "[object Symbol]";
function isSymbol(value) {
return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag;
}
module2.exports = isSymbol;
}
});
// node_modules/lodash/_isKey.js
var require_isKey = __commonJS({
"node_modules/lodash/_isKey.js"(exports, module2) {
var isArray3 = require_isArray();
var isSymbol = require_isSymbol();
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/;
var reIsPlainProp = /^\w*$/;
function isKey(value, object) {
if (isArray3(value)) {
return false;
}
var type = typeof value;
if (type == "number" || type == "symbol" || type == "boolean" || value == null || isSymbol(value)) {
return true;
}
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object);
}
module2.exports = isKey;
}
});
// node_modules/lodash/isObject.js
var require_isObject = __commonJS({
"node_modules/lodash/isObject.js"(exports, module2) {
function isObject2(value) {
var type = typeof value;
return value != null && (type == "object" || type == "function");
}
module2.exports = isObject2;
}
});
// node_modules/lodash/isFunction.js
var require_isFunction = __commonJS({
"node_modules/lodash/isFunction.js"(exports, module2) {
var baseGetTag = require_baseGetTag();
var isObject2 = require_isObject();
var asyncTag = "[object AsyncFunction]";
var funcTag = "[object Function]";
var genTag = "[object GeneratorFunction]";
var proxyTag = "[object Proxy]";
function isFunction2(value) {
if (!isObject2(value)) {
return false;
}
var tag = baseGetTag(value);
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
module2.exports = isFunction2;
}
});
// node_modules/lodash/_coreJsData.js
var require_coreJsData = __commonJS({
"node_modules/lodash/_coreJsData.js"(exports, module2) {
var root = require_root();
var coreJsData = root["__core-js_shared__"];
module2.exports = coreJsData;
}
});
// node_modules/lodash/_isMasked.js
var require_isMasked = __commonJS({
"node_modules/lodash/_isMasked.js"(exports, module2) {
var coreJsData = require_coreJsData();
var maskSrcKey = function() {
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || "");
return uid ? "Symbol(src)_1." + uid : "";
}();
function isMasked(func) {
return !!maskSrcKey && maskSrcKey in func;
}
module2.exports = isMasked;
}
});
// node_modules/lodash/_toSource.js
var require_toSource = __commonJS({
"node_modules/lodash/_toSource.js"(exports, module2) {
var funcProto = Function.prototype;
var funcToString = funcProto.toString;
function toSource(func) {
if (func != null) {
try {
return funcToString.call(func);
} catch (e) {
}
try {
return func + "";
} catch (e) {
}
}
return "";
}
module2.exports = toSource;
}
});
// node_modules/lodash/_baseIsNative.js
var require_baseIsNative = __commonJS({
"node_modules/lodash/_baseIsNative.js"(exports, module2) {
var isFunction2 = require_isFunction();
var isMasked = require_isMasked();
var isObject2 = require_isObject();
var toSource = require_toSource();
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
var reIsHostCtor = /^\[object .+?Constructor\]$/;
var funcProto = Function.prototype;
var objectProto = Object.prototype;
var funcToString = funcProto.toString;
var hasOwnProperty4 = objectProto.hasOwnProperty;
var reIsNative = RegExp("^" + funcToString.call(hasOwnProperty4).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$");
function baseIsNative(value) {
if (!isObject2(value) || isMasked(value)) {
return false;
}
var pattern = isFunction2(value) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));
}
module2.exports = baseIsNative;
}
});
// node_modules/lodash/_getValue.js
var require_getValue = __commonJS({
"node_modules/lodash/_getValue.js"(exports, module2) {
function getValue(object, key) {
return object == null ? void 0 : object[key];
}
module2.exports = getValue;
}
});
// node_modules/lodash/_getNative.js
var require_getNative = __commonJS({
"node_modules/lodash/_getNative.js"(exports, module2) {
var baseIsNative = require_baseIsNative();
var getValue = require_getValue();
function getNative(object, key) {
var value = getValue(object, key);
return baseIsNative(value) ? value : void 0;
}
module2.exports = getNative;
}
});
// node_modules/lodash/_nativeCreate.js
var require_nativeCreate = __commonJS({
"node_modules/lodash/_nativeCreate.js"(exports, module2) {
var getNative = require_getNative();
var nativeCreate = getNative(Object, "create");
module2.exports = nativeCreate;
}
});
// node_modules/lodash/_hashClear.js
var require_hashClear = __commonJS({
"node_modules/lodash/_hashClear.js"(exports, module2) {
var nativeCreate = require_nativeCreate();
function hashClear() {
this.__data__ = nativeCreate ? nativeCreate(null) : {};
this.size = 0;
}
module2.exports = hashClear;
}
});
// node_modules/lodash/_hashDelete.js
var require_hashDelete = __commonJS({
"node_modules/lodash/_hashDelete.js"(exports, module2) {
function hashDelete(key) {
var result = this.has(key) && delete this.__data__[key];
this.size -= result ? 1 : 0;
return result;
}
module2.exports = hashDelete;
}
});
// node_modules/lodash/_hashGet.js
var require_hashGet = __commonJS({
"node_modules/lodash/_hashGet.js"(exports, module2) {
var nativeCreate = require_nativeCreate();
var HASH_UNDEFINED = "__lodash_hash_undefined__";
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function hashGet(key) {
var data = this.__data__;
if (nativeCreate) {
var result = data[key];
return result === HASH_UNDEFINED ? void 0 : result;
}
return hasOwnProperty4.call(data, key) ? data[key] : void 0;
}
module2.exports = hashGet;
}
});
// node_modules/lodash/_hashHas.js
var require_hashHas = __commonJS({
"node_modules/lodash/_hashHas.js"(exports, module2) {
var nativeCreate = require_nativeCreate();
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function hashHas(key) {
var data = this.__data__;
return nativeCreate ? data[key] !== void 0 : hasOwnProperty4.call(data, key);
}
module2.exports = hashHas;
}
});
// node_modules/lodash/_hashSet.js
var require_hashSet = __commonJS({
"node_modules/lodash/_hashSet.js"(exports, module2) {
var nativeCreate = require_nativeCreate();
var HASH_UNDEFINED = "__lodash_hash_undefined__";
function hashSet(key, value) {
var data = this.__data__;
this.size += this.has(key) ? 0 : 1;
data[key] = nativeCreate && value === void 0 ? HASH_UNDEFINED : value;
return this;
}
module2.exports = hashSet;
}
});
// node_modules/lodash/_Hash.js
var require_Hash = __commonJS({
"node_modules/lodash/_Hash.js"(exports, module2) {
var hashClear = require_hashClear();
var hashDelete = require_hashDelete();
var hashGet = require_hashGet();
var hashHas = require_hashHas();
var hashSet = require_hashSet();
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]);
}
}
Hash.prototype.clear = hashClear;
Hash.prototype["delete"] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
module2.exports = Hash;
}
});
// node_modules/lodash/_listCacheClear.js
var require_listCacheClear = __commonJS({
"node_modules/lodash/_listCacheClear.js"(exports, module2) {
function listCacheClear() {
this.__data__ = [];
this.size = 0;
}
module2.exports = listCacheClear;
}
});
// node_modules/lodash/eq.js
var require_eq = __commonJS({
"node_modules/lodash/eq.js"(exports, module2) {
function eq(value, other) {
return value === other || value !== value && other !== other;
}
module2.exports = eq;
}
});
// node_modules/lodash/_assocIndexOf.js
var require_assocIndexOf = __commonJS({
"node_modules/lodash/_assocIndexOf.js"(exports, module2) {
var eq = require_eq();
function assocIndexOf(array, key) {
var length = array.length;
while (length--) {
if (eq(array[length][0], key)) {
return length;
}
}
return -1;
}
module2.exports = assocIndexOf;
}
});
// node_modules/lodash/_listCacheDelete.js
var require_listCacheDelete = __commonJS({
"node_modules/lodash/_listCacheDelete.js"(exports, module2) {
var assocIndexOf = require_assocIndexOf();
var arrayProto = Array.prototype;
var splice = arrayProto.splice;
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;
}
module2.exports = listCacheDelete;
}
});
// node_modules/lodash/_listCacheGet.js
var require_listCacheGet = __commonJS({
"node_modules/lodash/_listCacheGet.js"(exports, module2) {
var assocIndexOf = require_assocIndexOf();
function listCacheGet(key) {
var data = this.__data__, index2 = assocIndexOf(data, key);
return index2 < 0 ? void 0 : data[index2][1];
}
module2.exports = listCacheGet;
}
});
// node_modules/lodash/_listCacheHas.js
var require_listCacheHas = __commonJS({
"node_modules/lodash/_listCacheHas.js"(exports, module2) {
var assocIndexOf = require_assocIndexOf();
function listCacheHas(key) {
return assocIndexOf(this.__data__, key) > -1;
}
module2.exports = listCacheHas;
}
});
// node_modules/lodash/_listCacheSet.js
var require_listCacheSet = __commonJS({
"node_modules/lodash/_listCacheSet.js"(exports, module2) {
var assocIndexOf = require_assocIndexOf();
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;
}
module2.exports = listCacheSet;
}
});
// node_modules/lodash/_ListCache.js
var require_ListCache = __commonJS({
"node_modules/lodash/_ListCache.js"(exports, module2) {
var listCacheClear = require_listCacheClear();
var listCacheDelete = require_listCacheDelete();
var listCacheGet = require_listCacheGet();
var listCacheHas = require_listCacheHas();
var listCacheSet = require_listCacheSet();
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]);
}
}
ListCache.prototype.clear = listCacheClear;
ListCache.prototype["delete"] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
module2.exports = ListCache;
}
});
// node_modules/lodash/_Map.js
var require_Map = __commonJS({
"node_modules/lodash/_Map.js"(exports, module2) {
var getNative = require_getNative();
var root = require_root();
var Map2 = getNative(root, "Map");
module2.exports = Map2;
}
});
// node_modules/lodash/_mapCacheClear.js
var require_mapCacheClear = __commonJS({
"node_modules/lodash/_mapCacheClear.js"(exports, module2) {
var Hash = require_Hash();
var ListCache = require_ListCache();
var Map2 = require_Map();
function mapCacheClear() {
this.size = 0;
this.__data__ = {
"hash": new Hash(),
"map": new (Map2 || ListCache)(),
"string": new Hash()
};
}
module2.exports = mapCacheClear;
}
});
// node_modules/lodash/_isKeyable.js
var require_isKeyable = __commonJS({
"node_modules/lodash/_isKeyable.js"(exports, module2) {
function isKeyable(value) {
var type = typeof value;
return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null;
}
module2.exports = isKeyable;
}
});
// node_modules/lodash/_getMapData.js
var require_getMapData = __commonJS({
"node_modules/lodash/_getMapData.js"(exports, module2) {
var isKeyable = require_isKeyable();
function getMapData(map, key) {
var data = map.__data__;
return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
}
module2.exports = getMapData;
}
});
// node_modules/lodash/_mapCacheDelete.js
var require_mapCacheDelete = __commonJS({
"node_modules/lodash/_mapCacheDelete.js"(exports, module2) {
var getMapData = require_getMapData();
function mapCacheDelete(key) {
var result = getMapData(this, key)["delete"](key);
this.size -= result ? 1 : 0;
return result;
}
module2.exports = mapCacheDelete;
}
});
// node_modules/lodash/_mapCacheGet.js
var require_mapCacheGet = __commonJS({
"node_modules/lodash/_mapCacheGet.js"(exports, module2) {
var getMapData = require_getMapData();
function mapCacheGet(key) {
return getMapData(this, key).get(key);
}
module2.exports = mapCacheGet;
}
});
// node_modules/lodash/_mapCacheHas.js
var require_mapCacheHas = __commonJS({
"node_modules/lodash/_mapCacheHas.js"(exports, module2) {
var getMapData = require_getMapData();
function mapCacheHas(key) {
return getMapData(this, key).has(key);
}
module2.exports = mapCacheHas;
}
});
// node_modules/lodash/_mapCacheSet.js
var require_mapCacheSet = __commonJS({
"node_modules/lodash/_mapCacheSet.js"(exports, module2) {
var getMapData = require_getMapData();
function mapCacheSet(key, value) {
var data = getMapData(this, key), size = data.size;
data.set(key, value);
this.size += data.size == size ? 0 : 1;
return this;
}
module2.exports = mapCacheSet;
}
});
// node_modules/lodash/_MapCache.js
var require_MapCache = __commonJS({
"node_modules/lodash/_MapCache.js"(exports, module2) {
var mapCacheClear = require_mapCacheClear();
var mapCacheDelete = require_mapCacheDelete();
var mapCacheGet = require_mapCacheGet();
var mapCacheHas = require_mapCacheHas();
var mapCacheSet = require_mapCacheSet();
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]);
}
}
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype["delete"] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
module2.exports = MapCache;
}
});
// node_modules/lodash/memoize.js
var require_memoize = __commonJS({
"node_modules/lodash/memoize.js"(exports, module2) {
var MapCache = require_MapCache();
var FUNC_ERROR_TEXT = "Expected a function";
function memoize(func, resolver) {
if (typeof func != "function" || resolver != null && typeof resolver != "function") {
throw new TypeError(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 result = func.apply(this, args);
memoized.cache = cache.set(key, result) || cache;
return result;
};
memoized.cache = new (memoize.Cache || MapCache)();
return memoized;
}
memoize.Cache = MapCache;
module2.exports = memoize;
}
});
// node_modules/lodash/_memoizeCapped.js
var require_memoizeCapped = __commonJS({
"node_modules/lodash/_memoizeCapped.js"(exports, module2) {
var memoize = require_memoize();
var MAX_MEMOIZE_SIZE = 500;
function memoizeCapped(func) {
var result = memoize(func, function(key) {
if (cache.size === MAX_MEMOIZE_SIZE) {
cache.clear();
}
return key;
});
var cache = result.cache;
return result;
}
module2.exports = memoizeCapped;
}
});
// node_modules/lodash/_stringToPath.js
var require_stringToPath = __commonJS({
"node_modules/lodash/_stringToPath.js"(exports, module2) {
var memoizeCapped = require_memoizeCapped();
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
var reEscapeChar = /\\(\\)?/g;
var stringToPath = memoizeCapped(function(string) {
var result = [];
if (string.charCodeAt(0) === 46) {
result.push("");
}
string.replace(rePropName, function(match2, number, quote, subString) {
result.push(quote ? subString.replace(reEscapeChar, "$1") : number || match2);
});
return result;
});
module2.exports = stringToPath;
}
});
// node_modules/lodash/_arrayMap.js
var require_arrayMap = __commonJS({
"node_modules/lodash/_arrayMap.js"(exports, module2) {
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;
}
module2.exports = arrayMap;
}
});
// node_modules/lodash/_baseToString.js
var require_baseToString = __commonJS({
"node_modules/lodash/_baseToString.js"(exports, module2) {
var Symbol2 = require_Symbol();
var arrayMap = require_arrayMap();
var isArray3 = require_isArray();
var isSymbol = require_isSymbol();
var INFINITY = 1 / 0;
var symbolProto = Symbol2 ? Symbol2.prototype : void 0;
var symbolToString = symbolProto ? symbolProto.toString : void 0;
function baseToString(value) {
if (typeof value == "string") {
return value;
}
if (isArray3(value)) {
return arrayMap(value, baseToString) + "";
}
if (isSymbol(value)) {
return symbolToString ? symbolToString.call(value) : "";
}
var result = value + "";
return result == "0" && 1 / value == -INFINITY ? "-0" : result;
}
module2.exports = baseToString;
}
});
// node_modules/lodash/toString.js
var require_toString = __commonJS({
"node_modules/lodash/toString.js"(exports, module2) {
var baseToString = require_baseToString();
function toString3(value) {
return value == null ? "" : baseToString(value);
}
module2.exports = toString3;
}
});
// node_modules/lodash/_castPath.js
var require_castPath = __commonJS({
"node_modules/lodash/_castPath.js"(exports, module2) {
var isArray3 = require_isArray();
var isKey = require_isKey();
var stringToPath = require_stringToPath();
var toString3 = require_toString();
function castPath(value, object) {
if (isArray3(value)) {
return value;
}
return isKey(value, object) ? [value] : stringToPath(toString3(value));
}
module2.exports = castPath;
}
});
// node_modules/lodash/_toKey.js
var require_toKey = __commonJS({
"node_modules/lodash/_toKey.js"(exports, module2) {
var isSymbol = require_isSymbol();
var INFINITY = 1 / 0;
function toKey(value) {
if (typeof value == "string" || isSymbol(value)) {
return value;
}
var result = value + "";
return result == "0" && 1 / value == -INFINITY ? "-0" : result;
}
module2.exports = toKey;
}
});
// node_modules/lodash/_baseGet.js
var require_baseGet = __commonJS({
"node_modules/lodash/_baseGet.js"(exports, module2) {
var castPath = require_castPath();
var toKey = require_toKey();
function baseGet(object, path) {
path = castPath(path, object);
var index2 = 0, length = path.length;
while (object != null && index2 < length) {
object = object[toKey(path[index2++])];
}
return index2 && index2 == length ? object : void 0;
}
module2.exports = baseGet;
}
});
// node_modules/lodash/get.js
var require_get2 = __commonJS({
"node_modules/lodash/get.js"(exports, module2) {
var baseGet = require_baseGet();
function get(object, path, defaultValue) {
var result = object == null ? void 0 : baseGet(object, path);
return result === void 0 ? defaultValue : result;
}
module2.exports = get;
}
});
// node_modules/lodash/now.js
var require_now = __commonJS({
"node_modules/lodash/now.js"(exports, module2) {
var root = require_root();
var now = function() {
return root.Date.now();
};
module2.exports = now;
}
});
// node_modules/lodash/_trimmedEndIndex.js
var require_trimmedEndIndex = __commonJS({
"node_modules/lodash/_trimmedEndIndex.js"(exports, module2) {
var reWhitespace = /\s/;
function trimmedEndIndex(string) {
var index2 = string.length;
while (index2-- && reWhitespace.test(string.charAt(index2))) {
}
return index2;
}
module2.exports = trimmedEndIndex;
}
});
// node_modules/lodash/_baseTrim.js
var require_baseTrim = __commonJS({
"node_modules/lodash/_baseTrim.js"(exports, module2) {
var trimmedEndIndex = require_trimmedEndIndex();
var reTrimStart = /^\s+/;
function baseTrim(string) {
return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string;
}
module2.exports = baseTrim;
}
});
// node_modules/lodash/toNumber.js
var require_toNumber = __commonJS({
"node_modules/lodash/toNumber.js"(exports, module2) {
var baseTrim = require_baseTrim();
var isObject2 = require_isObject();
var isSymbol = require_isSymbol();
var NAN = 0 / 0;
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
var reIsBinary = /^0b[01]+$/i;
var reIsOctal = /^0o[0-7]+$/i;
var freeParseInt = parseInt;
function toNumber(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject2(value)) {
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
value = isObject2(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;
}
module2.exports = toNumber;
}
});
// node_modules/lodash/debounce.js
var require_debounce = __commonJS({
"node_modules/lodash/debounce.js"(exports, module2) {
var isObject2 = require_isObject();
var now = require_now();
var toNumber = require_toNumber();
var FUNC_ERROR_TEXT = "Expected a function";
var nativeMax = Math.max;
var nativeMin = Math.min;
function debounce(func, wait, options) {
var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
wait = toNumber(wait) || 0;
if (isObject2(options)) {
leading = !!options.leading;
maxing = "maxWait" in options;
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs, thisArg = lastThis;
lastArgs = lastThis = void 0;
lastInvokeTime = time;
result = func.apply(thisArg, args);
return result;
}
function leadingEdge(time) {
lastInvokeTime = time;
timerId = setTimeout(timerExpired, wait);
return leading ? invokeFunc(time) : result;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = void 0;
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = void 0;
return result;
}
function cancel() {
if (timerId !== void 0) {
clearTimeout(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = void 0;
}
function flush() {
return timerId === void 0 ? result : trailingEdge(now());
}
function debounced() {
var time = now(), isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === void 0) {
return leadingEdge(lastCallTime);
}
if (maxing) {
clearTimeout(timerId);
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
if (timerId === void 0) {
timerId = setTimeout(timerExpired, wait);
}
return result;
}
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
module2.exports = debounce;
}
});
// node_modules/lodash/throttle.js
var require_throttle = __commonJS({
"node_modules/lodash/throttle.js"(exports, module2) {
var debounce = require_debounce();
var isObject2 = require_isObject();
var FUNC_ERROR_TEXT = "Expected a function";
function throttle2(func, wait, options) {
var leading = true, trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
if (isObject2(options)) {
leading = "leading" in options ? !!options.leading : leading;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
return debounce(func, wait, {
"leading": leading,
"maxWait": wait,
"trailing": trailing
});
}
module2.exports = throttle2;
}
});
// node_modules/classnames/index.js
var require_classnames = __commonJS({
"node_modules/classnames/index.js"(exports, module2) {
(function() {
"use strict";
var hasOwn = {}.hasOwnProperty;
function classNames5() {
var classes = "";
for (var i = 0; i < arguments.length; i++) {
var arg = arguments[i];
if (arg) {
classes = appendClass(classes, parseValue(arg));
}
}
return classes;
}
function parseValue(arg) {
if (typeof arg === "string" || typeof arg === "number") {
return arg;
}
if (typeof arg !== "object") {
return "";
}
if (Array.isArray(arg)) {
return classNames5.apply(null, arg);
}
if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes("[native code]")) {
return arg.toString();
}
var classes = "";
for (var key in arg) {
if (hasOwn.call(arg, key) && arg[key]) {
classes = appendClass(classes, key);
}
}
return classes;
}
function appendClass(value, newClass) {
if (!newClass) {
return value;
}
if (value) {
return value + " " + newClass;
}
return value + newClass;
}
if (typeof module2 !== "undefined" && module2.exports) {
classNames5.default = classNames5;
module2.exports = classNames5;
} else if (typeof define === "function" && typeof define.amd === "object" && define.amd) {
define("classnames", [], function() {
return classNames5;
});
} else {
window.classNames = classNames5;
}
})();
}
});
// node_modules/react-is/cjs/react-is.development.js
var require_react_is_development = __commonJS({
"node_modules/react-is/cjs/react-is.development.js"(exports) {
"use strict";
if (true) {
(function() {
"use strict";
var hasSymbol = typeof Symbol === "function" && Symbol.for;
var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for("react.element") : 60103;
var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for("react.portal") : 60106;
var REACT_FRAGMENT_TYPE2 = hasSymbol ? Symbol.for("react.fragment") : 60107;
var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for("react.strict_mode") : 60108;
var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for("react.profiler") : 60114;
var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for("react.provider") : 60109;
var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for("react.context") : 60110;
var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for("react.async_mode") : 60111;
var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for("react.concurrent_mode") : 60111;
var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for("react.forward_ref") : 60112;
var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for("react.suspense") : 60113;
var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for("react.suspense_list") : 60120;
var REACT_MEMO_TYPE = hasSymbol ? Symbol.for("react.memo") : 60115;
var REACT_LAZY_TYPE = hasSymbol ? Symbol.for("react.lazy") : 60116;
var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for("react.block") : 60121;
var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for("react.fundamental") : 60117;
var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for("react.responder") : 60118;
var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for("react.scope") : 60119;
function isValidElementType(type) {
return typeof type === "string" || typeof type === "function" || type === REACT_FRAGMENT_TYPE2 || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === "object" && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);
}
function typeOf(object) {
if (typeof object === "object" && object !== null) {
var $$typeof = object.$$typeof;
switch ($$typeof) {
case REACT_ELEMENT_TYPE:
var type = object.type;
switch (type) {
case REACT_ASYNC_MODE_TYPE:
case REACT_CONCURRENT_MODE_TYPE:
case REACT_FRAGMENT_TYPE2:
case REACT_PROFILER_TYPE:
case REACT_STRICT_MODE_TYPE:
case REACT_SUSPENSE_TYPE:
return type;
default:
var $$typeofType = type && type.$$typeof;
switch ($$typeofType) {
case REACT_CONTEXT_TYPE:
case REACT_FORWARD_REF_TYPE:
case REACT_LAZY_TYPE:
case REACT_MEMO_TYPE:
case REACT_PROVIDER_TYPE:
return $$typeofType;
default:
return $$typeof;
}
}
case REACT_PORTAL_TYPE:
return $$typeof;
}
}
return void 0;
}
var AsyncMode = REACT_ASYNC_MODE_TYPE;
var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
var ContextConsumer = REACT_CONTEXT_TYPE;
var ContextProvider = REACT_PROVIDER_TYPE;
var Element2 = REACT_ELEMENT_TYPE;
var ForwardRef = REACT_FORWARD_REF_TYPE;
var Fragment = REACT_FRAGMENT_TYPE2;
var Lazy = REACT_LAZY_TYPE;
var Memo = REACT_MEMO_TYPE;
var Portal2 = REACT_PORTAL_TYPE;
var Profiler = REACT_PROFILER_TYPE;
var StrictMode = REACT_STRICT_MODE_TYPE;
var Suspense = REACT_SUSPENSE_TYPE;
var hasWarnedAboutDeprecatedIsAsyncMode = false;
function isAsyncMode(object) {
{
if (!hasWarnedAboutDeprecatedIsAsyncMode) {
hasWarnedAboutDeprecatedIsAsyncMode = true;
console["warn"]("The ReactIs.isAsyncMode() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactIs.isConcurrentMode() instead. It has the exact same API.");
}
}
return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
}
function isConcurrentMode(object) {
return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
}
function isContextConsumer(object) {
return typeOf(object) === REACT_CONTEXT_TYPE;
}
function isContextProvider(object) {
return typeOf(object) === REACT_PROVIDER_TYPE;
}
function isElement2(object) {
return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
}
function isForwardRef(object) {
return typeOf(object) === REACT_FORWARD_REF_TYPE;
}
function isFragment(object) {
return typeOf(object) === REACT_FRAGMENT_TYPE2;
}
function isLazy(object) {
return typeOf(object) === REACT_LAZY_TYPE;
}
function isMemo(object) {
return typeOf(object) === REACT_MEMO_TYPE;
}
function isPortal(object) {
return typeOf(object) === REACT_PORTAL_TYPE;
}
function isProfiler(object) {
return typeOf(object) === REACT_PROFILER_TYPE;
}
function isStrictMode(object) {
return typeOf(object) === REACT_STRICT_MODE_TYPE;
}
function isSuspense(object) {
return typeOf(object) === REACT_SUSPENSE_TYPE;
}
exports.AsyncMode = AsyncMode;
exports.ConcurrentMode = ConcurrentMode;
exports.ContextConsumer = ContextConsumer;
exports.ContextProvider = ContextProvider;
exports.Element = Element2;
exports.ForwardRef = ForwardRef;
exports.Fragment = Fragment;
exports.Lazy = Lazy;
exports.Memo = Memo;
exports.Portal = Portal2;
exports.Profiler = Profiler;
exports.StrictMode = StrictMode;
exports.Suspense = Suspense;
exports.isAsyncMode = isAsyncMode;
exports.isConcurrentMode = isConcurrentMode;
exports.isContextConsumer = isContextConsumer;
exports.isContextProvider = isContextProvider;
exports.isElement = isElement2;
exports.isForwardRef = isForwardRef;
exports.isFragment = isFragment;
exports.isLazy = isLazy;
exports.isMemo = isMemo;
exports.isPortal = isPortal;
exports.isProfiler = isProfiler;
exports.isStrictMode = isStrictMode;
exports.isSuspense = isSuspense;
exports.isValidElementType = isValidElementType;
exports.typeOf = typeOf;
})();
}
}
});
// node_modules/react-is/index.js
var require_react_is = __commonJS({
"node_modules/react-is/index.js"(exports, module2) {
"use strict";
if (false) {
module2.exports = null;
} else {
module2.exports = require_react_is_development();
}
}
});
// node_modules/object-assign/index.js
var require_object_assign = __commonJS({
"node_modules/object-assign/index.js"(exports, module2) {
"use strict";
var getOwnPropertySymbols2 = Object.getOwnPropertySymbols;
var hasOwnProperty4 = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject(val) {
if (val === null || val === void 0) {
throw new TypeError("Object.assign cannot be called with null or undefined");
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
var test1 = new String("abc");
test1[5] = "de";
if (Object.getOwnPropertyNames(test1)[0] === "5") {
return false;
}
var test2 = {};
for (var i = 0; i < 10; i++) {
test2["_" + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function(n) {
return test2[n];
});
if (order2.join("") !== "0123456789") {
return false;
}
var test3 = {};
"abcdefghijklmnopqrst".split("").forEach(function(letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join("") !== "abcdefghijklmnopqrst") {
return false;
}
return true;
} catch (err) {
return false;
}
}
module2.exports = shouldUseNative() ? Object.assign : function(target, source) {
var from;
var to = toObject(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (var key in from) {
if (hasOwnProperty4.call(from, key)) {
to[key] = from[key];
}
}
if (getOwnPropertySymbols2) {
symbols = getOwnPropertySymbols2(from);
for (var i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
};
}
});
// node_modules/prop-types/lib/ReactPropTypesSecret.js
var require_ReactPropTypesSecret = __commonJS({
"node_modules/prop-types/lib/ReactPropTypesSecret.js"(exports, module2) {
"use strict";
var ReactPropTypesSecret = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
module2.exports = ReactPropTypesSecret;
}
});
// node_modules/prop-types/lib/has.js
var require_has = __commonJS({
"node_modules/prop-types/lib/has.js"(exports, module2) {
module2.exports = Function.call.bind(Object.prototype.hasOwnProperty);
}
});
// node_modules/prop-types/checkPropTypes.js
var require_checkPropTypes = __commonJS({
"node_modules/prop-types/checkPropTypes.js"(exports, module2) {
"use strict";
var printWarning = function() {
};
if (true) {
ReactPropTypesSecret = require_ReactPropTypesSecret();
loggedTypeFailures = {};
has = require_has();
printWarning = function(text) {
var message = "Warning: " + text;
if (typeof console !== "undefined") {
console.error(message);
}
try {
throw new Error(message);
} catch (x) {
}
};
}
var ReactPropTypesSecret;
var loggedTypeFailures;
var has;
function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
if (true) {
for (var typeSpecName in typeSpecs) {
if (has(typeSpecs, typeSpecName)) {
var error;
try {
if (typeof typeSpecs[typeSpecName] !== "function") {
var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");
err.name = "Invariant Violation";
throw err;
}
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
} catch (ex) {
error = ex;
}
if (error && !(error instanceof Error)) {
printWarning((componentName || "React class") + ": type specification of " + location + " `" + typeSpecName + "` is invalid; the type checker function must return `null` or an `Error` but returned a " + typeof error + ". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).");
}
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
loggedTypeFailures[error.message] = true;
var stack = getStack ? getStack() : "";
printWarning("Failed " + location + " type: " + error.message + (stack != null ? stack : ""));
}
}
}
}
}
checkPropTypes.resetWarningCache = function() {
if (true) {
loggedTypeFailures = {};
}
};
module2.exports = checkPropTypes;
}
});
// node_modules/prop-types/factoryWithTypeCheckers.js
var require_factoryWithTypeCheckers = __commonJS({
"node_modules/prop-types/factoryWithTypeCheckers.js"(exports, module2) {
"use strict";
var ReactIs = require_react_is();
var assign2 = require_object_assign();
var ReactPropTypesSecret = require_ReactPropTypesSecret();
var has = require_has();
var checkPropTypes = require_checkPropTypes();
var printWarning = function() {
};
if (true) {
printWarning = function(text) {
var message = "Warning: " + text;
if (typeof console !== "undefined") {
console.error(message);
}
try {
throw new Error(message);
} catch (x) {
}
};
}
function emptyFunctionThatReturnsNull() {
return null;
}
module2.exports = function(isValidElement4, throwOnDirectAccess) {
var ITERATOR_SYMBOL = typeof Symbol === "function" && Symbol.iterator;
var FAUX_ITERATOR_SYMBOL = "@@iterator";
function getIteratorFn(maybeIterable) {
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
if (typeof iteratorFn === "function") {
return iteratorFn;
}
}
var ANONYMOUS = "<<anonymous>>";
var ReactPropTypes = {
array: createPrimitiveTypeChecker("array"),
bigint: createPrimitiveTypeChecker("bigint"),
bool: createPrimitiveTypeChecker("boolean"),
func: createPrimitiveTypeChecker("function"),
number: createPrimitiveTypeChecker("number"),
object: createPrimitiveTypeChecker("object"),
string: createPrimitiveTypeChecker("string"),
symbol: createPrimitiveTypeChecker("symbol"),
any: createAnyTypeChecker(),
arrayOf: createArrayOfTypeChecker,
element: createElementTypeChecker(),
elementType: createElementTypeTypeChecker(),
instanceOf: createInstanceTypeChecker,
node: createNodeChecker(),
objectOf: createObjectOfTypeChecker,
oneOf: createEnumTypeChecker,
oneOfType: createUnionTypeChecker,
shape: createShapeTypeChecker,
exact: createStrictShapeTypeChecker
};
function is(x, y) {
if (x === y) {
return x !== 0 || 1 / x === 1 / y;
} else {
return x !== x && y !== y;
}
}
function PropTypeError(message, data) {
this.message = message;
this.data = data && typeof data === "object" ? data : {};
this.stack = "";
}
PropTypeError.prototype = Error.prototype;
function createChainableTypeChecker(validate) {
if (true) {
var manualPropTypeCallCache = {};
var manualPropTypeWarningCount = 0;
}
function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
componentName = componentName || ANONYMOUS;
propFullName = propFullName || propName;
if (secret !== ReactPropTypesSecret) {
if (throwOnDirectAccess) {
var err = new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types");
err.name = "Invariant Violation";
throw err;
} else if (typeof console !== "undefined") {
var cacheKey = componentName + ":" + propName;
if (!manualPropTypeCallCache[cacheKey] && manualPropTypeWarningCount < 3) {
printWarning("You are manually calling a React.PropTypes validation function for the `" + propFullName + "` prop on `" + componentName + "`. This is deprecated and will throw in the standalone `prop-types` package. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.");
manualPropTypeCallCache[cacheKey] = true;
manualPropTypeWarningCount++;
}
}
}
if (props[propName] == null) {
if (isRequired) {
if (props[propName] === null) {
return new PropTypeError("The " + location + " `" + propFullName + "` is marked as required " + ("in `" + componentName + "`, but its value is `null`."));
}
return new PropTypeError("The " + location + " `" + propFullName + "` is marked as required in " + ("`" + componentName + "`, but its value is `undefined`."));
}
return null;
} else {
return validate(props, propName, componentName, location, propFullName);
}
}
var chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
}
function createPrimitiveTypeChecker(expectedType) {
function validate(props, propName, componentName, location, propFullName, secret) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== expectedType) {
var preciseType = getPreciseType(propValue);
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of type " + ("`" + preciseType + "` supplied to `" + componentName + "`, expected ") + ("`" + expectedType + "`."), { expectedType });
}
return null;
}
return createChainableTypeChecker(validate);
}
function createAnyTypeChecker() {
return createChainableTypeChecker(emptyFunctionThatReturnsNull);
}
function createArrayOfTypeChecker(typeChecker) {
function validate(props, propName, componentName, location, propFullName) {
if (typeof typeChecker !== "function") {
return new PropTypeError("Property `" + propFullName + "` of component `" + componentName + "` has invalid PropType notation inside arrayOf.");
}
var propValue = props[propName];
if (!Array.isArray(propValue)) {
var propType = getPropType(propValue);
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of type " + ("`" + propType + "` supplied to `" + componentName + "`, expected an array."));
}
for (var i = 0; i < propValue.length; i++) {
var error = typeChecker(propValue, i, componentName, location, propFullName + "[" + i + "]", ReactPropTypesSecret);
if (error instanceof Error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createElementTypeChecker() {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
if (!isValidElement4(propValue)) {
var propType = getPropType(propValue);
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of type " + ("`" + propType + "` supplied to `" + componentName + "`, expected a single ReactElement."));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createElementTypeTypeChecker() {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
if (!ReactIs.isValidElementType(propValue)) {
var propType = getPropType(propValue);
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of type " + ("`" + propType + "` supplied to `" + componentName + "`, expected a single ReactElement type."));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createInstanceTypeChecker(expectedClass) {
function validate(props, propName, componentName, location, propFullName) {
if (!(props[propName] instanceof expectedClass)) {
var expectedClassName = expectedClass.name || ANONYMOUS;
var actualClassName = getClassName(props[propName]);
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of type " + ("`" + actualClassName + "` supplied to `" + componentName + "`, expected ") + ("instance of `" + expectedClassName + "`."));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createEnumTypeChecker(expectedValues) {
if (!Array.isArray(expectedValues)) {
if (true) {
if (arguments.length > 1) {
printWarning("Invalid arguments supplied to oneOf, expected an array, got " + arguments.length + " arguments. A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).");
} else {
printWarning("Invalid argument supplied to oneOf, expected an array.");
}
}
return emptyFunctionThatReturnsNull;
}
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
for (var i = 0; i < expectedValues.length; i++) {
if (is(propValue, expectedValues[i])) {
return null;
}
}
var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {
var type = getPreciseType(value);
if (type === "symbol") {
return String(value);
}
return value;
});
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of value `" + String(propValue) + "` " + ("supplied to `" + componentName + "`, expected one of " + valuesString + "."));
}
return createChainableTypeChecker(validate);
}
function createObjectOfTypeChecker(typeChecker) {
function validate(props, propName, componentName, location, propFullName) {
if (typeof typeChecker !== "function") {
return new PropTypeError("Property `" + propFullName + "` of component `" + componentName + "` has invalid PropType notation inside objectOf.");
}
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== "object") {
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of type " + ("`" + propType + "` supplied to `" + componentName + "`, expected an object."));
}
for (var key in propValue) {
if (has(propValue, key)) {
var error = typeChecker(propValue, key, componentName, location, propFullName + "." + key, ReactPropTypesSecret);
if (error instanceof Error) {
return error;
}
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createUnionTypeChecker(arrayOfTypeCheckers) {
if (!Array.isArray(arrayOfTypeCheckers)) {
true ? printWarning("Invalid argument supplied to oneOfType, expected an instance of array.") : void 0;
return emptyFunctionThatReturnsNull;
}
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
var checker = arrayOfTypeCheckers[i];
if (typeof checker !== "function") {
printWarning("Invalid argument supplied to oneOfType. Expected an array of check functions, but received " + getPostfixForTypeWarning(checker) + " at index " + i + ".");
return emptyFunctionThatReturnsNull;
}
}
function validate(props, propName, componentName, location, propFullName) {
var expectedTypes = [];
for (var i2 = 0; i2 < arrayOfTypeCheckers.length; i2++) {
var checker2 = arrayOfTypeCheckers[i2];
var checkerResult = checker2(props, propName, componentName, location, propFullName, ReactPropTypesSecret);
if (checkerResult == null) {
return null;
}
if (checkerResult.data && has(checkerResult.data, "expectedType")) {
expectedTypes.push(checkerResult.data.expectedType);
}
}
var expectedTypesMessage = expectedTypes.length > 0 ? ", expected one of type [" + expectedTypes.join(", ") + "]" : "";
return new PropTypeError("Invalid " + location + " `" + propFullName + "` supplied to " + ("`" + componentName + "`" + expectedTypesMessage + "."));
}
return createChainableTypeChecker(validate);
}
function createNodeChecker() {
function validate(props, propName, componentName, location, propFullName) {
if (!isNode(props[propName])) {
return new PropTypeError("Invalid " + location + " `" + propFullName + "` supplied to " + ("`" + componentName + "`, expected a ReactNode."));
}
return null;
}
return createChainableTypeChecker(validate);
}
function invalidValidatorError(componentName, location, propFullName, key, type) {
return new PropTypeError((componentName || "React class") + ": " + location + " type `" + propFullName + "." + key + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + type + "`.");
}
function createShapeTypeChecker(shapeTypes) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== "object") {
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of type `" + propType + "` " + ("supplied to `" + componentName + "`, expected `object`."));
}
for (var key in shapeTypes) {
var checker = shapeTypes[key];
if (typeof checker !== "function") {
return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));
}
var error = checker(propValue, key, componentName, location, propFullName + "." + key, ReactPropTypesSecret);
if (error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createStrictShapeTypeChecker(shapeTypes) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== "object") {
return new PropTypeError("Invalid " + location + " `" + propFullName + "` of type `" + propType + "` " + ("supplied to `" + componentName + "`, expected `object`."));
}
var allKeys = assign2({}, props[propName], shapeTypes);
for (var key in allKeys) {
var checker = shapeTypes[key];
if (has(shapeTypes, key) && typeof checker !== "function") {
return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));
}
if (!checker) {
return new PropTypeError("Invalid " + location + " `" + propFullName + "` key `" + key + "` supplied to `" + componentName + "`.\nBad object: " + JSON.stringify(props[propName], null, " ") + "\nValid keys: " + JSON.stringify(Object.keys(shapeTypes), null, " "));
}
var error = checker(propValue, key, componentName, location, propFullName + "." + key, ReactPropTypesSecret);
if (error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function isNode(propValue) {
switch (typeof propValue) {
case "number":
case "string":
case "undefined":
return true;
case "boolean":
return !propValue;
case "object":
if (Array.isArray(propValue)) {
return propValue.every(isNode);
}
if (propValue === null || isValidElement4(propValue)) {
return true;
}
var iteratorFn = getIteratorFn(propValue);
if (iteratorFn) {
var iterator2 = iteratorFn.call(propValue);
var step;
if (iteratorFn !== propValue.entries) {
while (!(step = iterator2.next()).done) {
if (!isNode(step.value)) {
return false;
}
}
} else {
while (!(step = iterator2.next()).done) {
var entry = step.value;
if (entry) {
if (!isNode(entry[1])) {
return false;
}
}
}
}
} else {
return false;
}
return true;
default:
return false;
}
}
function isSymbol(propType, propValue) {
if (propType === "symbol") {
return true;
}
if (!propValue) {
return false;
}
if (propValue["@@toStringTag"] === "Symbol") {
return true;
}
if (typeof Symbol === "function" && propValue instanceof Symbol) {
return true;
}
return false;
}
function getPropType(propValue) {
var propType = typeof propValue;
if (Array.isArray(propValue)) {
return "array";
}
if (propValue instanceof RegExp) {
return "object";
}
if (isSymbol(propType, propValue)) {
return "symbol";
}
return propType;
}
function getPreciseType(propValue) {
if (typeof propValue === "undefined" || propValue === null) {
return "" + propValue;
}
var propType = getPropType(propValue);
if (propType === "object") {
if (propValue instanceof Date) {
return "date";
} else if (propValue instanceof RegExp) {
return "regexp";
}
}
return propType;
}
function getPostfixForTypeWarning(value) {
var type = getPreciseType(value);
switch (type) {
case "array":
case "object":
return "an " + type;
case "boolean":
case "date":
case "regexp":
return "a " + type;
default:
return type;
}
}
function getClassName(propValue) {
if (!propValue.constructor || !propValue.constructor.name) {
return ANONYMOUS;
}
return propValue.constructor.name;
}
ReactPropTypes.checkPropTypes = checkPropTypes;
ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;
ReactPropTypes.PropTypes = ReactPropTypes;
return ReactPropTypes;
};
}
});
// node_modules/prop-types/index.js
var require_prop_types = __commonJS({
"node_modules/prop-types/index.js"(exports, module2) {
if (true) {
ReactIs = require_react_is();
throwOnDirectAccess = true;
module2.exports = require_factoryWithTypeCheckers()(ReactIs.isElement, throwOnDirectAccess);
} else {
module2.exports = null();
}
var ReactIs;
var throwOnDirectAccess;
}
});
// node_modules/lodash/isNull.js
var require_isNull = __commonJS({
"node_modules/lodash/isNull.js"(exports, module2) {
function isNull(value) {
return value === null;
}
module2.exports = isNull;
}
});
// node_modules/lodash/isString.js
var require_isString = __commonJS({
"node_modules/lodash/isString.js"(exports, module2) {
var baseGetTag = require_baseGetTag();
var isArray3 = require_isArray();
var isObjectLike = require_isObjectLike();
var stringTag = "[object String]";
function isString2(value) {
return typeof value == "string" || !isArray3(value) && isObjectLike(value) && baseGetTag(value) == stringTag;
}
module2.exports = isString2;
}
});
// node_modules/lodash/_stackClear.js
var require_stackClear = __commonJS({
"node_modules/lodash/_stackClear.js"(exports, module2) {
var ListCache = require_ListCache();
function stackClear() {
this.__data__ = new ListCache();
this.size = 0;
}
module2.exports = stackClear;
}
});
// node_modules/lodash/_stackDelete.js
var require_stackDelete = __commonJS({
"node_modules/lodash/_stackDelete.js"(exports, module2) {
function stackDelete(key) {
var data = this.__data__, result = data["delete"](key);
this.size = data.size;
return result;
}
module2.exports = stackDelete;
}
});
// node_modules/lodash/_stackGet.js
var require_stackGet = __commonJS({
"node_modules/lodash/_stackGet.js"(exports, module2) {
function stackGet(key) {
return this.__data__.get(key);
}
module2.exports = stackGet;
}
});
// node_modules/lodash/_stackHas.js
var require_stackHas = __commonJS({
"node_modules/lodash/_stackHas.js"(exports, module2) {
function stackHas(key) {
return this.__data__.has(key);
}
module2.exports = stackHas;
}
});
// node_modules/lodash/_stackSet.js
var require_stackSet = __commonJS({
"node_modules/lodash/_stackSet.js"(exports, module2) {
var ListCache = require_ListCache();
var Map2 = require_Map();
var MapCache = require_MapCache();
var LARGE_ARRAY_SIZE = 200;
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;
}
module2.exports = stackSet;
}
});
// node_modules/lodash/_Stack.js
var require_Stack = __commonJS({
"node_modules/lodash/_Stack.js"(exports, module2) {
var ListCache = require_ListCache();
var stackClear = require_stackClear();
var stackDelete = require_stackDelete();
var stackGet = require_stackGet();
var stackHas = require_stackHas();
var stackSet = require_stackSet();
function Stack(entries) {
var data = this.__data__ = new ListCache(entries);
this.size = data.size;
}
Stack.prototype.clear = stackClear;
Stack.prototype["delete"] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
module2.exports = Stack;
}
});
// node_modules/lodash/_defineProperty.js
var require_defineProperty = __commonJS({
"node_modules/lodash/_defineProperty.js"(exports, module2) {
var getNative = require_getNative();
var defineProperty2 = function() {
try {
var func = getNative(Object, "defineProperty");
func({}, "", {});
return func;
} catch (e) {
}
}();
module2.exports = defineProperty2;
}
});
// node_modules/lodash/_baseAssignValue.js
var require_baseAssignValue = __commonJS({
"node_modules/lodash/_baseAssignValue.js"(exports, module2) {
var defineProperty2 = require_defineProperty();
function baseAssignValue(object, key, value) {
if (key == "__proto__" && defineProperty2) {
defineProperty2(object, key, {
"configurable": true,
"enumerable": true,
"value": value,
"writable": true
});
} else {
object[key] = value;
}
}
module2.exports = baseAssignValue;
}
});
// node_modules/lodash/_assignMergeValue.js
var require_assignMergeValue = __commonJS({
"node_modules/lodash/_assignMergeValue.js"(exports, module2) {
var baseAssignValue = require_baseAssignValue();
var eq = require_eq();
function assignMergeValue(object, key, value) {
if (value !== void 0 && !eq(object[key], value) || value === void 0 && !(key in object)) {
baseAssignValue(object, key, value);
}
}
module2.exports = assignMergeValue;
}
});
// node_modules/lodash/_createBaseFor.js
var require_createBaseFor = __commonJS({
"node_modules/lodash/_createBaseFor.js"(exports, module2) {
function createBaseFor(fromRight) {
return function(object, iteratee, keysFunc) {
var index2 = -1, iterable = Object(object), props = keysFunc(object), length = props.length;
while (length--) {
var key = props[fromRight ? length : ++index2];
if (iteratee(iterable[key], key, iterable) === false) {
break;
}
}
return object;
};
}
module2.exports = createBaseFor;
}
});
// node_modules/lodash/_baseFor.js
var require_baseFor = __commonJS({
"node_modules/lodash/_baseFor.js"(exports, module2) {
var createBaseFor = require_createBaseFor();
var baseFor = createBaseFor();
module2.exports = baseFor;
}
});
// node_modules/lodash/_cloneBuffer.js
var require_cloneBuffer = __commonJS({
"node_modules/lodash/_cloneBuffer.js"(exports, module2) {
var root = require_root();
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 Buffer2 = moduleExports ? root.Buffer : void 0;
var allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : void 0;
function cloneBuffer(buffer, isDeep) {
if (isDeep) {
return buffer.slice();
}
var length = buffer.length, result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
buffer.copy(result);
return result;
}
module2.exports = cloneBuffer;
}
});
// node_modules/lodash/_Uint8Array.js
var require_Uint8Array = __commonJS({
"node_modules/lodash/_Uint8Array.js"(exports, module2) {
var root = require_root();
var Uint8Array2 = root.Uint8Array;
module2.exports = Uint8Array2;
}
});
// node_modules/lodash/_cloneArrayBuffer.js
var require_cloneArrayBuffer = __commonJS({
"node_modules/lodash/_cloneArrayBuffer.js"(exports, module2) {
var Uint8Array2 = require_Uint8Array();
function cloneArrayBuffer(arrayBuffer) {
var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
new Uint8Array2(result).set(new Uint8Array2(arrayBuffer));
return result;
}
module2.exports = cloneArrayBuffer;
}
});
// node_modules/lodash/_cloneTypedArray.js
var require_cloneTypedArray = __commonJS({
"node_modules/lodash/_cloneTypedArray.js"(exports, module2) {
var cloneArrayBuffer = require_cloneArrayBuffer();
function cloneTypedArray(typedArray, isDeep) {
var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
}
module2.exports = cloneTypedArray;
}
});
// node_modules/lodash/_copyArray.js
var require_copyArray = __commonJS({
"node_modules/lodash/_copyArray.js"(exports, module2) {
function copyArray(source, array) {
var index2 = -1, length = source.length;
array || (array = Array(length));
while (++index2 < length) {
array[index2] = source[index2];
}
return array;
}
module2.exports = copyArray;
}
});
// node_modules/lodash/_baseCreate.js
var require_baseCreate = __commonJS({
"node_modules/lodash/_baseCreate.js"(exports, module2) {
var isObject2 = require_isObject();
var objectCreate = Object.create;
var baseCreate = function() {
function object() {
}
return function(proto) {
if (!isObject2(proto)) {
return {};
}
if (objectCreate) {
return objectCreate(proto);
}
object.prototype = proto;
var result = new object();
object.prototype = void 0;
return result;
};
}();
module2.exports = baseCreate;
}
});
// node_modules/lodash/_overArg.js
var require_overArg = __commonJS({
"node_modules/lodash/_overArg.js"(exports, module2) {
function overArg(func, transform) {
return function(arg) {
return func(transform(arg));
};
}
module2.exports = overArg;
}
});
// node_modules/lodash/_getPrototype.js
var require_getPrototype = __commonJS({
"node_modules/lodash/_getPrototype.js"(exports, module2) {
var overArg = require_overArg();
var getPrototype = overArg(Object.getPrototypeOf, Object);
module2.exports = getPrototype;
}
});
// node_modules/lodash/_isPrototype.js
var require_isPrototype = __commonJS({
"node_modules/lodash/_isPrototype.js"(exports, module2) {
var objectProto = Object.prototype;
function isPrototype(value) {
var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
return value === proto;
}
module2.exports = isPrototype;
}
});
// node_modules/lodash/_initCloneObject.js
var require_initCloneObject = __commonJS({
"node_modules/lodash/_initCloneObject.js"(exports, module2) {
var baseCreate = require_baseCreate();
var getPrototype = require_getPrototype();
var isPrototype = require_isPrototype();
function initCloneObject(object) {
return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
}
module2.exports = initCloneObject;
}
});
// node_modules/lodash/_baseIsArguments.js
var require_baseIsArguments = __commonJS({
"node_modules/lodash/_baseIsArguments.js"(exports, module2) {
var baseGetTag = require_baseGetTag();
var isObjectLike = require_isObjectLike();
var argsTag = "[object Arguments]";
function baseIsArguments(value) {
return isObjectLike(value) && baseGetTag(value) == argsTag;
}
module2.exports = baseIsArguments;
}
});
// node_modules/lodash/isArguments.js
var require_isArguments = __commonJS({
"node_modules/lodash/isArguments.js"(exports, module2) {
var baseIsArguments = require_baseIsArguments();
var isObjectLike = require_isObjectLike();
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
var propertyIsEnumerable2 = objectProto.propertyIsEnumerable;
var isArguments = baseIsArguments(function() {
return arguments;
}()) ? baseIsArguments : function(value) {
return isObjectLike(value) && hasOwnProperty4.call(value, "callee") && !propertyIsEnumerable2.call(value, "callee");
};
module2.exports = isArguments;
}
});
// node_modules/lodash/isLength.js
var require_isLength = __commonJS({
"node_modules/lodash/isLength.js"(exports, module2) {
var MAX_SAFE_INTEGER = 9007199254740991;
function isLength(value) {
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
module2.exports = isLength;
}
});
// node_modules/lodash/isArrayLike.js
var require_isArrayLike = __commonJS({
"node_modules/lodash/isArrayLike.js"(exports, module2) {
var isFunction2 = require_isFunction();
var isLength = require_isLength();
function isArrayLike(value) {
return value != null && isLength(value.length) && !isFunction2(value);
}
module2.exports = isArrayLike;
}
});
// node_modules/lodash/isArrayLikeObject.js
var require_isArrayLikeObject = __commonJS({
"node_modules/lodash/isArrayLikeObject.js"(exports, module2) {
var isArrayLike = require_isArrayLike();
var isObjectLike = require_isObjectLike();
function isArrayLikeObject(value) {
return isObjectLike(value) && isArrayLike(value);
}
module2.exports = isArrayLikeObject;
}
});
// node_modules/lodash/stubFalse.js
var require_stubFalse = __commonJS({
"node_modules/lodash/stubFalse.js"(exports, module2) {
function stubFalse() {
return false;
}
module2.exports = stubFalse;
}
});
// node_modules/lodash/isBuffer.js
var require_isBuffer = __commonJS({
"node_modules/lodash/isBuffer.js"(exports, module2) {
var root = require_root();
var stubFalse = require_stubFalse();
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 Buffer2 = moduleExports ? root.Buffer : void 0;
var nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : void 0;
var isBuffer2 = nativeIsBuffer || stubFalse;
module2.exports = isBuffer2;
}
});
// node_modules/lodash/isPlainObject.js
var require_isPlainObject = __commonJS({
"node_modules/lodash/isPlainObject.js"(exports, module2) {
var baseGetTag = require_baseGetTag();
var getPrototype = require_getPrototype();
var isObjectLike = require_isObjectLike();
var objectTag = "[object Object]";
var funcProto = Function.prototype;
var objectProto = Object.prototype;
var funcToString = funcProto.toString;
var hasOwnProperty4 = objectProto.hasOwnProperty;
var objectCtorString = funcToString.call(Object);
function isPlainObject2(value) {
if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
return false;
}
var proto = getPrototype(value);
if (proto === null) {
return true;
}
var Ctor = hasOwnProperty4.call(proto, "constructor") && proto.constructor;
return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
}
module2.exports = isPlainObject2;
}
});
// node_modules/lodash/_baseIsTypedArray.js
var require_baseIsTypedArray = __commonJS({
"node_modules/lodash/_baseIsTypedArray.js"(exports, module2) {
var baseGetTag = require_baseGetTag();
var isLength = require_isLength();
var isObjectLike = require_isObjectLike();
var argsTag = "[object Arguments]";
var arrayTag = "[object Array]";
var boolTag = "[object Boolean]";
var dateTag = "[object Date]";
var errorTag = "[object Error]";
var funcTag = "[object Function]";
var mapTag = "[object Map]";
var numberTag = "[object Number]";
var objectTag = "[object Object]";
var regexpTag = "[object RegExp]";
var setTag = "[object Set]";
var stringTag = "[object String]";
var weakMapTag = "[object WeakMap]";
var arrayBufferTag = "[object ArrayBuffer]";
var dataViewTag = "[object DataView]";
var float32Tag = "[object Float32Array]";
var float64Tag = "[object Float64Array]";
var int8Tag = "[object Int8Array]";
var int16Tag = "[object Int16Array]";
var int32Tag = "[object Int32Array]";
var uint8Tag = "[object Uint8Array]";
var uint8ClampedTag = "[object Uint8ClampedArray]";
var uint16Tag = "[object Uint16Array]";
var uint32Tag = "[object Uint32Array]";
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;
function baseIsTypedArray(value) {
return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}
module2.exports = baseIsTypedArray;
}
});
// node_modules/lodash/_baseUnary.js
var require_baseUnary = __commonJS({
"node_modules/lodash/_baseUnary.js"(exports, module2) {
function baseUnary(func) {
return function(value) {
return func(value);
};
}
module2.exports = baseUnary;
}
});
// node_modules/lodash/_nodeUtil.js
var require_nodeUtil = __commonJS({
"node_modules/lodash/_nodeUtil.js"(exports, module2) {
var freeGlobal = require_freeGlobal();
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) {
}
}();
module2.exports = nodeUtil;
}
});
// node_modules/lodash/isTypedArray.js
var require_isTypedArray = __commonJS({
"node_modules/lodash/isTypedArray.js"(exports, module2) {
var baseIsTypedArray = require_baseIsTypedArray();
var baseUnary = require_baseUnary();
var nodeUtil = require_nodeUtil();
var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
var isTypedArray2 = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
module2.exports = isTypedArray2;
}
});
// node_modules/lodash/_safeGet.js
var require_safeGet = __commonJS({
"node_modules/lodash/_safeGet.js"(exports, module2) {
function safeGet(object, key) {
if (key === "constructor" && typeof object[key] === "function") {
return;
}
if (key == "__proto__") {
return;
}
return object[key];
}
module2.exports = safeGet;
}
});
// node_modules/lodash/_assignValue.js
var require_assignValue = __commonJS({
"node_modules/lodash/_assignValue.js"(exports, module2) {
var baseAssignValue = require_baseAssignValue();
var eq = require_eq();
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function assignValue(object, key, value) {
var objValue = object[key];
if (!(hasOwnProperty4.call(object, key) && eq(objValue, value)) || value === void 0 && !(key in object)) {
baseAssignValue(object, key, value);
}
}
module2.exports = assignValue;
}
});
// node_modules/lodash/_copyObject.js
var require_copyObject = __commonJS({
"node_modules/lodash/_copyObject.js"(exports, module2) {
var assignValue = require_assignValue();
var baseAssignValue = require_baseAssignValue();
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) : void 0;
if (newValue === void 0) {
newValue = source[key];
}
if (isNew) {
baseAssignValue(object, key, newValue);
} else {
assignValue(object, key, newValue);
}
}
return object;
}
module2.exports = copyObject;
}
});
// node_modules/lodash/_baseTimes.js
var require_baseTimes = __commonJS({
"node_modules/lodash/_baseTimes.js"(exports, module2) {
function baseTimes(n, iteratee) {
var index2 = -1, result = Array(n);
while (++index2 < n) {
result[index2] = iteratee(index2);
}
return result;
}
module2.exports = baseTimes;
}
});
// node_modules/lodash/_isIndex.js
var require_isIndex = __commonJS({
"node_modules/lodash/_isIndex.js"(exports, module2) {
var MAX_SAFE_INTEGER = 9007199254740991;
var reIsUint = /^(?:0|[1-9]\d*)$/;
function isIndex(value, length) {
var type = typeof value;
length = length == null ? MAX_SAFE_INTEGER : length;
return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
}
module2.exports = isIndex;
}
});
// node_modules/lodash/_arrayLikeKeys.js
var require_arrayLikeKeys = __commonJS({
"node_modules/lodash/_arrayLikeKeys.js"(exports, module2) {
var baseTimes = require_baseTimes();
var isArguments = require_isArguments();
var isArray3 = require_isArray();
var isBuffer2 = require_isBuffer();
var isIndex = require_isIndex();
var isTypedArray2 = require_isTypedArray();
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function arrayLikeKeys(value, inherited) {
var isArr = isArray3(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer2(value), isType = !isArr && !isArg && !isBuff && isTypedArray2(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length;
for (var key in value) {
if ((inherited || hasOwnProperty4.call(value, key)) && !(skipIndexes && (key == "length" || isBuff && (key == "offset" || key == "parent") || isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || isIndex(key, length)))) {
result.push(key);
}
}
return result;
}
module2.exports = arrayLikeKeys;
}
});
// node_modules/lodash/_nativeKeysIn.js
var require_nativeKeysIn = __commonJS({
"node_modules/lodash/_nativeKeysIn.js"(exports, module2) {
function nativeKeysIn(object) {
var result = [];
if (object != null) {
for (var key in Object(object)) {
result.push(key);
}
}
return result;
}
module2.exports = nativeKeysIn;
}
});
// node_modules/lodash/_baseKeysIn.js
var require_baseKeysIn = __commonJS({
"node_modules/lodash/_baseKeysIn.js"(exports, module2) {
var isObject2 = require_isObject();
var isPrototype = require_isPrototype();
var nativeKeysIn = require_nativeKeysIn();
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function baseKeysIn(object) {
if (!isObject2(object)) {
return nativeKeysIn(object);
}
var isProto = isPrototype(object), result = [];
for (var key in object) {
if (!(key == "constructor" && (isProto || !hasOwnProperty4.call(object, key)))) {
result.push(key);
}
}
return result;
}
module2.exports = baseKeysIn;
}
});
// node_modules/lodash/keysIn.js
var require_keysIn = __commonJS({
"node_modules/lodash/keysIn.js"(exports, module2) {
var arrayLikeKeys = require_arrayLikeKeys();
var baseKeysIn = require_baseKeysIn();
var isArrayLike = require_isArrayLike();
function keysIn(object) {
return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
}
module2.exports = keysIn;
}
});
// node_modules/lodash/toPlainObject.js
var require_toPlainObject = __commonJS({
"node_modules/lodash/toPlainObject.js"(exports, module2) {
var copyObject = require_copyObject();
var keysIn = require_keysIn();
function toPlainObject(value) {
return copyObject(value, keysIn(value));
}
module2.exports = toPlainObject;
}
});
// node_modules/lodash/_baseMergeDeep.js
var require_baseMergeDeep = __commonJS({
"node_modules/lodash/_baseMergeDeep.js"(exports, module2) {
var assignMergeValue = require_assignMergeValue();
var cloneBuffer = require_cloneBuffer();
var cloneTypedArray = require_cloneTypedArray();
var copyArray = require_copyArray();
var initCloneObject = require_initCloneObject();
var isArguments = require_isArguments();
var isArray3 = require_isArray();
var isArrayLikeObject = require_isArrayLikeObject();
var isBuffer2 = require_isBuffer();
var isFunction2 = require_isFunction();
var isObject2 = require_isObject();
var isPlainObject2 = require_isPlainObject();
var isTypedArray2 = require_isTypedArray();
var safeGet = require_safeGet();
var toPlainObject = require_toPlainObject();
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) : void 0;
var isCommon = newValue === void 0;
if (isCommon) {
var isArr = isArray3(srcValue), isBuff = !isArr && isBuffer2(srcValue), isTyped = !isArr && !isBuff && isTypedArray2(srcValue);
newValue = srcValue;
if (isArr || isBuff || isTyped) {
if (isArray3(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 (isPlainObject2(srcValue) || isArguments(srcValue)) {
newValue = objValue;
if (isArguments(objValue)) {
newValue = toPlainObject(objValue);
} else if (!isObject2(objValue) || isFunction2(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);
}
module2.exports = baseMergeDeep;
}
});
// node_modules/lodash/_baseMerge.js
var require_baseMerge = __commonJS({
"node_modules/lodash/_baseMerge.js"(exports, module2) {
var Stack = require_Stack();
var assignMergeValue = require_assignMergeValue();
var baseFor = require_baseFor();
var baseMergeDeep = require_baseMergeDeep();
var isObject2 = require_isObject();
var keysIn = require_keysIn();
var safeGet = require_safeGet();
function baseMerge(object, source, srcIndex, customizer, stack) {
if (object === source) {
return;
}
baseFor(source, function(srcValue, key) {
stack || (stack = new Stack());
if (isObject2(srcValue)) {
baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
} else {
var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : void 0;
if (newValue === void 0) {
newValue = srcValue;
}
assignMergeValue(object, key, newValue);
}
}, keysIn);
}
module2.exports = baseMerge;
}
});
// node_modules/lodash/identity.js
var require_identity = __commonJS({
"node_modules/lodash/identity.js"(exports, module2) {
function identity(value) {
return value;
}
module2.exports = identity;
}
});
// node_modules/lodash/_apply.js
var require_apply = __commonJS({
"node_modules/lodash/_apply.js"(exports, module2) {
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);
}
module2.exports = apply;
}
});
// node_modules/lodash/_overRest.js
var require_overRest = __commonJS({
"node_modules/lodash/_overRest.js"(exports, module2) {
var apply = require_apply();
var nativeMax = Math.max;
function overRest(func, start, transform) {
start = nativeMax(start === void 0 ? func.length - 1 : start, 0);
return function() {
var args = arguments, index2 = -1, length = nativeMax(args.length - start, 0), array = Array(length);
while (++index2 < length) {
array[index2] = args[start + index2];
}
index2 = -1;
var otherArgs = Array(start + 1);
while (++index2 < start) {
otherArgs[index2] = args[index2];
}
otherArgs[start] = transform(array);
return apply(func, this, otherArgs);
};
}
module2.exports = overRest;
}
});
// node_modules/lodash/constant.js
var require_constant = __commonJS({
"node_modules/lodash/constant.js"(exports, module2) {
function constant(value) {
return function() {
return value;
};
}
module2.exports = constant;
}
});
// node_modules/lodash/_baseSetToString.js
var require_baseSetToString = __commonJS({
"node_modules/lodash/_baseSetToString.js"(exports, module2) {
var constant = require_constant();
var defineProperty2 = require_defineProperty();
var identity = require_identity();
var baseSetToString = !defineProperty2 ? identity : function(func, string) {
return defineProperty2(func, "toString", {
"configurable": true,
"enumerable": false,
"value": constant(string),
"writable": true
});
};
module2.exports = baseSetToString;
}
});
// node_modules/lodash/_shortOut.js
var require_shortOut = __commonJS({
"node_modules/lodash/_shortOut.js"(exports, module2) {
var HOT_COUNT = 800;
var HOT_SPAN = 16;
var nativeNow = Date.now;
function shortOut(func) {
var count = 0, lastCalled = 0;
return function() {
var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);
lastCalled = stamp;
if (remaining > 0) {
if (++count >= HOT_COUNT) {
return arguments[0];
}
} else {
count = 0;
}
return func.apply(void 0, arguments);
};
}
module2.exports = shortOut;
}
});
// node_modules/lodash/_setToString.js
var require_setToString = __commonJS({
"node_modules/lodash/_setToString.js"(exports, module2) {
var baseSetToString = require_baseSetToString();
var shortOut = require_shortOut();
var setToString = shortOut(baseSetToString);
module2.exports = setToString;
}
});
// node_modules/lodash/_baseRest.js
var require_baseRest = __commonJS({
"node_modules/lodash/_baseRest.js"(exports, module2) {
var identity = require_identity();
var overRest = require_overRest();
var setToString = require_setToString();
function baseRest(func, start) {
return setToString(overRest(func, start, identity), func + "");
}
module2.exports = baseRest;
}
});
// node_modules/lodash/_isIterateeCall.js
var require_isIterateeCall = __commonJS({
"node_modules/lodash/_isIterateeCall.js"(exports, module2) {
var eq = require_eq();
var isArrayLike = require_isArrayLike();
var isIndex = require_isIndex();
var isObject2 = require_isObject();
function isIterateeCall(value, index2, object) {
if (!isObject2(object)) {
return false;
}
var type = typeof index2;
if (type == "number" ? isArrayLike(object) && isIndex(index2, object.length) : type == "string" && index2 in object) {
return eq(object[index2], value);
}
return false;
}
module2.exports = isIterateeCall;
}
});
// node_modules/lodash/_createAssigner.js
var require_createAssigner = __commonJS({
"node_modules/lodash/_createAssigner.js"(exports, module2) {
var baseRest = require_baseRest();
var isIterateeCall = require_isIterateeCall();
function createAssigner(assigner) {
return baseRest(function(object, sources) {
var index2 = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : void 0, guard = length > 2 ? sources[2] : void 0;
customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : void 0;
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
customizer = length < 3 ? void 0 : customizer;
length = 1;
}
object = Object(object);
while (++index2 < length) {
var source = sources[index2];
if (source) {
assigner(object, source, index2, customizer);
}
}
return object;
});
}
module2.exports = createAssigner;
}
});
// node_modules/lodash/merge.js
var require_merge = __commonJS({
"node_modules/lodash/merge.js"(exports, module2) {
var baseMerge = require_baseMerge();
var createAssigner = require_createAssigner();
var merge2 = createAssigner(function(object, source, srcIndex) {
baseMerge(object, source, srcIndex);
});
module2.exports = merge2;
}
});
// node_modules/lodash/_arrayEach.js
var require_arrayEach = __commonJS({
"node_modules/lodash/_arrayEach.js"(exports, module2) {
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;
}
module2.exports = arrayEach;
}
});
// node_modules/lodash/_nativeKeys.js
var require_nativeKeys = __commonJS({
"node_modules/lodash/_nativeKeys.js"(exports, module2) {
var overArg = require_overArg();
var nativeKeys = overArg(Object.keys, Object);
module2.exports = nativeKeys;
}
});
// node_modules/lodash/_baseKeys.js
var require_baseKeys = __commonJS({
"node_modules/lodash/_baseKeys.js"(exports, module2) {
var isPrototype = require_isPrototype();
var nativeKeys = require_nativeKeys();
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function baseKeys(object) {
if (!isPrototype(object)) {
return nativeKeys(object);
}
var result = [];
for (var key in Object(object)) {
if (hasOwnProperty4.call(object, key) && key != "constructor") {
result.push(key);
}
}
return result;
}
module2.exports = baseKeys;
}
});
// node_modules/lodash/keys.js
var require_keys = __commonJS({
"node_modules/lodash/keys.js"(exports, module2) {
var arrayLikeKeys = require_arrayLikeKeys();
var baseKeys = require_baseKeys();
var isArrayLike = require_isArrayLike();
function keys(object) {
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}
module2.exports = keys;
}
});
// node_modules/lodash/_baseAssign.js
var require_baseAssign = __commonJS({
"node_modules/lodash/_baseAssign.js"(exports, module2) {
var copyObject = require_copyObject();
var keys = require_keys();
function baseAssign(object, source) {
return object && copyObject(source, keys(source), object);
}
module2.exports = baseAssign;
}
});
// node_modules/lodash/_baseAssignIn.js
var require_baseAssignIn = __commonJS({
"node_modules/lodash/_baseAssignIn.js"(exports, module2) {
var copyObject = require_copyObject();
var keysIn = require_keysIn();
function baseAssignIn(object, source) {
return object && copyObject(source, keysIn(source), object);
}
module2.exports = baseAssignIn;
}
});
// node_modules/lodash/_arrayFilter.js
var require_arrayFilter = __commonJS({
"node_modules/lodash/_arrayFilter.js"(exports, module2) {
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;
}
module2.exports = arrayFilter;
}
});
// node_modules/lodash/stubArray.js
var require_stubArray = __commonJS({
"node_modules/lodash/stubArray.js"(exports, module2) {
function stubArray() {
return [];
}
module2.exports = stubArray;
}
});
// node_modules/lodash/_getSymbols.js
var require_getSymbols = __commonJS({
"node_modules/lodash/_getSymbols.js"(exports, module2) {
var arrayFilter = require_arrayFilter();
var stubArray = require_stubArray();
var objectProto = Object.prototype;
var propertyIsEnumerable2 = objectProto.propertyIsEnumerable;
var nativeGetSymbols = Object.getOwnPropertySymbols;
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
if (object == null) {
return [];
}
object = Object(object);
return arrayFilter(nativeGetSymbols(object), function(symbol) {
return propertyIsEnumerable2.call(object, symbol);
});
};
module2.exports = getSymbols;
}
});
// node_modules/lodash/_copySymbols.js
var require_copySymbols = __commonJS({
"node_modules/lodash/_copySymbols.js"(exports, module2) {
var copyObject = require_copyObject();
var getSymbols = require_getSymbols();
function copySymbols(source, object) {
return copyObject(source, getSymbols(source), object);
}
module2.exports = copySymbols;
}
});
// node_modules/lodash/_arrayPush.js
var require_arrayPush = __commonJS({
"node_modules/lodash/_arrayPush.js"(exports, module2) {
function arrayPush(array, values) {
var index2 = -1, length = values.length, offset = array.length;
while (++index2 < length) {
array[offset + index2] = values[index2];
}
return array;
}
module2.exports = arrayPush;
}
});
// node_modules/lodash/_getSymbolsIn.js
var require_getSymbolsIn = __commonJS({
"node_modules/lodash/_getSymbolsIn.js"(exports, module2) {
var arrayPush = require_arrayPush();
var getPrototype = require_getPrototype();
var getSymbols = require_getSymbols();
var stubArray = require_stubArray();
var nativeGetSymbols = Object.getOwnPropertySymbols;
var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
var result = [];
while (object) {
arrayPush(result, getSymbols(object));
object = getPrototype(object);
}
return result;
};
module2.exports = getSymbolsIn;
}
});
// node_modules/lodash/_copySymbolsIn.js
var require_copySymbolsIn = __commonJS({
"node_modules/lodash/_copySymbolsIn.js"(exports, module2) {
var copyObject = require_copyObject();
var getSymbolsIn = require_getSymbolsIn();
function copySymbolsIn(source, object) {
return copyObject(source, getSymbolsIn(source), object);
}
module2.exports = copySymbolsIn;
}
});
// node_modules/lodash/_baseGetAllKeys.js
var require_baseGetAllKeys = __commonJS({
"node_modules/lodash/_baseGetAllKeys.js"(exports, module2) {
var arrayPush = require_arrayPush();
var isArray3 = require_isArray();
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
var result = keysFunc(object);
return isArray3(object) ? result : arrayPush(result, symbolsFunc(object));
}
module2.exports = baseGetAllKeys;
}
});
// node_modules/lodash/_getAllKeys.js
var require_getAllKeys = __commonJS({
"node_modules/lodash/_getAllKeys.js"(exports, module2) {
var baseGetAllKeys = require_baseGetAllKeys();
var getSymbols = require_getSymbols();
var keys = require_keys();
function getAllKeys(object) {
return baseGetAllKeys(object, keys, getSymbols);
}
module2.exports = getAllKeys;
}
});
// node_modules/lodash/_getAllKeysIn.js
var require_getAllKeysIn = __commonJS({
"node_modules/lodash/_getAllKeysIn.js"(exports, module2) {
var baseGetAllKeys = require_baseGetAllKeys();
var getSymbolsIn = require_getSymbolsIn();
var keysIn = require_keysIn();
function getAllKeysIn(object) {
return baseGetAllKeys(object, keysIn, getSymbolsIn);
}
module2.exports = getAllKeysIn;
}
});
// node_modules/lodash/_DataView.js
var require_DataView = __commonJS({
"node_modules/lodash/_DataView.js"(exports, module2) {
var getNative = require_getNative();
var root = require_root();
var DataView2 = getNative(root, "DataView");
module2.exports = DataView2;
}
});
// node_modules/lodash/_Promise.js
var require_Promise = __commonJS({
"node_modules/lodash/_Promise.js"(exports, module2) {
var getNative = require_getNative();
var root = require_root();
var Promise2 = getNative(root, "Promise");
module2.exports = Promise2;
}
});
// node_modules/lodash/_Set.js
var require_Set = __commonJS({
"node_modules/lodash/_Set.js"(exports, module2) {
var getNative = require_getNative();
var root = require_root();
var Set2 = getNative(root, "Set");
module2.exports = Set2;
}
});
// node_modules/lodash/_WeakMap.js
var require_WeakMap = __commonJS({
"node_modules/lodash/_WeakMap.js"(exports, module2) {
var getNative = require_getNative();
var root = require_root();
var WeakMap2 = getNative(root, "WeakMap");
module2.exports = WeakMap2;
}
});
// node_modules/lodash/_getTag.js
var require_getTag = __commonJS({
"node_modules/lodash/_getTag.js"(exports, module2) {
var DataView2 = require_DataView();
var Map2 = require_Map();
var Promise2 = require_Promise();
var Set2 = require_Set();
var WeakMap2 = require_WeakMap();
var baseGetTag = require_baseGetTag();
var toSource = require_toSource();
var mapTag = "[object Map]";
var objectTag = "[object Object]";
var promiseTag = "[object Promise]";
var setTag = "[object Set]";
var weakMapTag = "[object WeakMap]";
var dataViewTag = "[object DataView]";
var dataViewCtorString = toSource(DataView2);
var mapCtorString = toSource(Map2);
var promiseCtorString = toSource(Promise2);
var setCtorString = toSource(Set2);
var weakMapCtorString = toSource(WeakMap2);
var getTag2 = baseGetTag;
if (DataView2 && getTag2(new DataView2(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag2(new Map2()) != mapTag || Promise2 && getTag2(Promise2.resolve()) != promiseTag || Set2 && getTag2(new Set2()) != setTag || WeakMap2 && getTag2(new WeakMap2()) != weakMapTag) {
getTag2 = function(value) {
var result = baseGetTag(value), Ctor = result == objectTag ? value.constructor : void 0, 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 result;
};
}
module2.exports = getTag2;
}
});
// node_modules/lodash/_initCloneArray.js
var require_initCloneArray = __commonJS({
"node_modules/lodash/_initCloneArray.js"(exports, module2) {
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function initCloneArray(array) {
var length = array.length, result = new array.constructor(length);
if (length && typeof array[0] == "string" && hasOwnProperty4.call(array, "index")) {
result.index = array.index;
result.input = array.input;
}
return result;
}
module2.exports = initCloneArray;
}
});
// node_modules/lodash/_cloneDataView.js
var require_cloneDataView = __commonJS({
"node_modules/lodash/_cloneDataView.js"(exports, module2) {
var cloneArrayBuffer = require_cloneArrayBuffer();
function cloneDataView(dataView, isDeep) {
var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
}
module2.exports = cloneDataView;
}
});
// node_modules/lodash/_cloneRegExp.js
var require_cloneRegExp = __commonJS({
"node_modules/lodash/_cloneRegExp.js"(exports, module2) {
var reFlags = /\w*$/;
function cloneRegExp(regexp) {
var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
result.lastIndex = regexp.lastIndex;
return result;
}
module2.exports = cloneRegExp;
}
});
// node_modules/lodash/_cloneSymbol.js
var require_cloneSymbol = __commonJS({
"node_modules/lodash/_cloneSymbol.js"(exports, module2) {
var Symbol2 = require_Symbol();
var symbolProto = Symbol2 ? Symbol2.prototype : void 0;
var symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;
function cloneSymbol(symbol) {
return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
}
module2.exports = cloneSymbol;
}
});
// node_modules/lodash/_initCloneByTag.js
var require_initCloneByTag = __commonJS({
"node_modules/lodash/_initCloneByTag.js"(exports, module2) {
var cloneArrayBuffer = require_cloneArrayBuffer();
var cloneDataView = require_cloneDataView();
var cloneRegExp = require_cloneRegExp();
var cloneSymbol = require_cloneSymbol();
var cloneTypedArray = require_cloneTypedArray();
var boolTag = "[object Boolean]";
var dateTag = "[object Date]";
var mapTag = "[object Map]";
var numberTag = "[object Number]";
var regexpTag = "[object RegExp]";
var setTag = "[object Set]";
var stringTag = "[object String]";
var symbolTag = "[object Symbol]";
var arrayBufferTag = "[object ArrayBuffer]";
var dataViewTag = "[object DataView]";
var float32Tag = "[object Float32Array]";
var float64Tag = "[object Float64Array]";
var int8Tag = "[object Int8Array]";
var int16Tag = "[object Int16Array]";
var int32Tag = "[object Int32Array]";
var uint8Tag = "[object Uint8Array]";
var uint8ClampedTag = "[object Uint8ClampedArray]";
var uint16Tag = "[object Uint16Array]";
var uint32Tag = "[object Uint32Array]";
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);
}
}
module2.exports = initCloneByTag;
}
});
// node_modules/lodash/_baseIsMap.js
var require_baseIsMap = __commonJS({
"node_modules/lodash/_baseIsMap.js"(exports, module2) {
var getTag2 = require_getTag();
var isObjectLike = require_isObjectLike();
var mapTag = "[object Map]";
function baseIsMap(value) {
return isObjectLike(value) && getTag2(value) == mapTag;
}
module2.exports = baseIsMap;
}
});
// node_modules/lodash/isMap.js
var require_isMap = __commonJS({
"node_modules/lodash/isMap.js"(exports, module2) {
var baseIsMap = require_baseIsMap();
var baseUnary = require_baseUnary();
var nodeUtil = require_nodeUtil();
var nodeIsMap = nodeUtil && nodeUtil.isMap;
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
module2.exports = isMap;
}
});
// node_modules/lodash/_baseIsSet.js
var require_baseIsSet = __commonJS({
"node_modules/lodash/_baseIsSet.js"(exports, module2) {
var getTag2 = require_getTag();
var isObjectLike = require_isObjectLike();
var setTag = "[object Set]";
function baseIsSet(value) {
return isObjectLike(value) && getTag2(value) == setTag;
}
module2.exports = baseIsSet;
}
});
// node_modules/lodash/isSet.js
var require_isSet = __commonJS({
"node_modules/lodash/isSet.js"(exports, module2) {
var baseIsSet = require_baseIsSet();
var baseUnary = require_baseUnary();
var nodeUtil = require_nodeUtil();
var nodeIsSet = nodeUtil && nodeUtil.isSet;
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
module2.exports = isSet;
}
});
// node_modules/lodash/_baseClone.js
var require_baseClone = __commonJS({
"node_modules/lodash/_baseClone.js"(exports, module2) {
var Stack = require_Stack();
var arrayEach = require_arrayEach();
var assignValue = require_assignValue();
var baseAssign = require_baseAssign();
var baseAssignIn = require_baseAssignIn();
var cloneBuffer = require_cloneBuffer();
var copyArray = require_copyArray();
var copySymbols = require_copySymbols();
var copySymbolsIn = require_copySymbolsIn();
var getAllKeys = require_getAllKeys();
var getAllKeysIn = require_getAllKeysIn();
var getTag2 = require_getTag();
var initCloneArray = require_initCloneArray();
var initCloneByTag = require_initCloneByTag();
var initCloneObject = require_initCloneObject();
var isArray3 = require_isArray();
var isBuffer2 = require_isBuffer();
var isMap = require_isMap();
var isObject2 = require_isObject();
var isSet = require_isSet();
var keys = require_keys();
var keysIn = require_keysIn();
var CLONE_DEEP_FLAG = 1;
var CLONE_FLAT_FLAG = 2;
var CLONE_SYMBOLS_FLAG = 4;
var argsTag = "[object Arguments]";
var arrayTag = "[object Array]";
var boolTag = "[object Boolean]";
var dateTag = "[object Date]";
var errorTag = "[object Error]";
var funcTag = "[object Function]";
var genTag = "[object GeneratorFunction]";
var mapTag = "[object Map]";
var numberTag = "[object Number]";
var objectTag = "[object Object]";
var regexpTag = "[object RegExp]";
var setTag = "[object Set]";
var stringTag = "[object String]";
var symbolTag = "[object Symbol]";
var weakMapTag = "[object WeakMap]";
var arrayBufferTag = "[object ArrayBuffer]";
var dataViewTag = "[object DataView]";
var float32Tag = "[object Float32Array]";
var float64Tag = "[object Float64Array]";
var int8Tag = "[object Int8Array]";
var int16Tag = "[object Int16Array]";
var int32Tag = "[object Int32Array]";
var uint8Tag = "[object Uint8Array]";
var uint8ClampedTag = "[object Uint8ClampedArray]";
var uint16Tag = "[object Uint16Array]";
var uint32Tag = "[object Uint32Array]";
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;
function baseClone(value, bitmask, customizer, key, object, stack) {
var result, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG;
if (customizer) {
result = object ? customizer(value, key, object, stack) : customizer(value);
}
if (result !== void 0) {
return result;
}
if (!isObject2(value)) {
return value;
}
var isArr = isArray3(value);
if (isArr) {
result = initCloneArray(value);
if (!isDeep) {
return copyArray(value, result);
}
} else {
var tag = getTag2(value), isFunc = tag == funcTag || tag == genTag;
if (isBuffer2(value)) {
return cloneBuffer(value, isDeep);
}
if (tag == objectTag || tag == argsTag || isFunc && !object) {
result = isFlat || isFunc ? {} : initCloneObject(value);
if (!isDeep) {
return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value));
}
} else {
if (!cloneableTags[tag]) {
return object ? value : {};
}
result = initCloneByTag(value, tag, isDeep);
}
}
stack || (stack = new Stack());
var stacked = stack.get(value);
if (stacked) {
return stacked;
}
stack.set(value, result);
if (isSet(value)) {
value.forEach(function(subValue) {
result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
});
} else if (isMap(value)) {
value.forEach(function(subValue, key2) {
result.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
});
}
var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
var props = isArr ? void 0 : keysFunc(value);
arrayEach(props || value, function(subValue, key2) {
if (props) {
key2 = subValue;
subValue = value[key2];
}
assignValue(result, key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
});
return result;
}
module2.exports = baseClone;
}
});
// node_modules/lodash/last.js
var require_last = __commonJS({
"node_modules/lodash/last.js"(exports, module2) {
function last(array) {
var length = array == null ? 0 : array.length;
return length ? array[length - 1] : void 0;
}
module2.exports = last;
}
});
// node_modules/lodash/_baseSlice.js
var require_baseSlice = __commonJS({
"node_modules/lodash/_baseSlice.js"(exports, module2) {
function baseSlice(array, start, end) {
var index2 = -1, length = array.length;
if (start < 0) {
start = -start > length ? 0 : length + start;
}
end = end > length ? length : end;
if (end < 0) {
end += length;
}
length = start > end ? 0 : end - start >>> 0;
start >>>= 0;
var result = Array(length);
while (++index2 < length) {
result[index2] = array[index2 + start];
}
return result;
}
module2.exports = baseSlice;
}
});
// node_modules/lodash/_parent.js
var require_parent = __commonJS({
"node_modules/lodash/_parent.js"(exports, module2) {
var baseGet = require_baseGet();
var baseSlice = require_baseSlice();
function parent(object, path) {
return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
}
module2.exports = parent;
}
});
// node_modules/lodash/_baseUnset.js
var require_baseUnset = __commonJS({
"node_modules/lodash/_baseUnset.js"(exports, module2) {
var castPath = require_castPath();
var last = require_last();
var parent = require_parent();
var toKey = require_toKey();
function baseUnset(object, path) {
path = castPath(path, object);
object = parent(object, path);
return object == null || delete object[toKey(last(path))];
}
module2.exports = baseUnset;
}
});
// node_modules/lodash/_customOmitClone.js
var require_customOmitClone = __commonJS({
"node_modules/lodash/_customOmitClone.js"(exports, module2) {
var isPlainObject2 = require_isPlainObject();
function customOmitClone(value) {
return isPlainObject2(value) ? void 0 : value;
}
module2.exports = customOmitClone;
}
});
// node_modules/lodash/_isFlattenable.js
var require_isFlattenable = __commonJS({
"node_modules/lodash/_isFlattenable.js"(exports, module2) {
var Symbol2 = require_Symbol();
var isArguments = require_isArguments();
var isArray3 = require_isArray();
var spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : void 0;
function isFlattenable(value) {
return isArray3(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
}
module2.exports = isFlattenable;
}
});
// node_modules/lodash/_baseFlatten.js
var require_baseFlatten = __commonJS({
"node_modules/lodash/_baseFlatten.js"(exports, module2) {
var arrayPush = require_arrayPush();
var isFlattenable = require_isFlattenable();
function baseFlatten(array, depth, predicate, isStrict, result) {
var index2 = -1, length = array.length;
predicate || (predicate = isFlattenable);
result || (result = []);
while (++index2 < length) {
var value = array[index2];
if (depth > 0 && predicate(value)) {
if (depth > 1) {
baseFlatten(value, depth - 1, predicate, isStrict, result);
} else {
arrayPush(result, value);
}
} else if (!isStrict) {
result[result.length] = value;
}
}
return result;
}
module2.exports = baseFlatten;
}
});
// node_modules/lodash/flatten.js
var require_flatten = __commonJS({
"node_modules/lodash/flatten.js"(exports, module2) {
var baseFlatten = require_baseFlatten();
function flatten2(array) {
var length = array == null ? 0 : array.length;
return length ? baseFlatten(array, 1) : [];
}
module2.exports = flatten2;
}
});
// node_modules/lodash/_flatRest.js
var require_flatRest = __commonJS({
"node_modules/lodash/_flatRest.js"(exports, module2) {
var flatten2 = require_flatten();
var overRest = require_overRest();
var setToString = require_setToString();
function flatRest(func) {
return setToString(overRest(func, void 0, flatten2), func + "");
}
module2.exports = flatRest;
}
});
// node_modules/lodash/omit.js
var require_omit = __commonJS({
"node_modules/lodash/omit.js"(exports, module2) {
var arrayMap = require_arrayMap();
var baseClone = require_baseClone();
var baseUnset = require_baseUnset();
var castPath = require_castPath();
var copyObject = require_copyObject();
var customOmitClone = require_customOmitClone();
var flatRest = require_flatRest();
var getAllKeysIn = require_getAllKeysIn();
var CLONE_DEEP_FLAG = 1;
var CLONE_FLAT_FLAG = 2;
var CLONE_SYMBOLS_FLAG = 4;
var omit = flatRest(function(object, paths) {
var result = {};
if (object == null) {
return result;
}
var isDeep = false;
paths = arrayMap(paths, function(path) {
path = castPath(path, object);
isDeep || (isDeep = path.length > 1);
return path;
});
copyObject(object, getAllKeysIn(object), result);
if (isDeep) {
result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
}
var length = paths.length;
while (length--) {
baseUnset(result, paths[length]);
}
return result;
});
module2.exports = omit;
}
});
// node_modules/lodash/isUndefined.js
var require_isUndefined = __commonJS({
"node_modules/lodash/isUndefined.js"(exports, module2) {
function isUndefined2(value) {
return value === void 0;
}
module2.exports = isUndefined2;
}
});
// node_modules/lodash/_setCacheAdd.js
var require_setCacheAdd = __commonJS({
"node_modules/lodash/_setCacheAdd.js"(exports, module2) {
var HASH_UNDEFINED = "__lodash_hash_undefined__";
function setCacheAdd(value) {
this.__data__.set(value, HASH_UNDEFINED);
return this;
}
module2.exports = setCacheAdd;
}
});
// node_modules/lodash/_setCacheHas.js
var require_setCacheHas = __commonJS({
"node_modules/lodash/_setCacheHas.js"(exports, module2) {
function setCacheHas(value) {
return this.__data__.has(value);
}
module2.exports = setCacheHas;
}
});
// node_modules/lodash/_SetCache.js
var require_SetCache = __commonJS({
"node_modules/lodash/_SetCache.js"(exports, module2) {
var MapCache = require_MapCache();
var setCacheAdd = require_setCacheAdd();
var setCacheHas = require_setCacheHas();
function SetCache(values) {
var index2 = -1, length = values == null ? 0 : values.length;
this.__data__ = new MapCache();
while (++index2 < length) {
this.add(values[index2]);
}
}
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;
module2.exports = SetCache;
}
});
// node_modules/lodash/_arraySome.js
var require_arraySome = __commonJS({
"node_modules/lodash/_arraySome.js"(exports, module2) {
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;
}
module2.exports = arraySome;
}
});
// node_modules/lodash/_cacheHas.js
var require_cacheHas = __commonJS({
"node_modules/lodash/_cacheHas.js"(exports, module2) {
function cacheHas(cache, key) {
return cache.has(key);
}
module2.exports = cacheHas;
}
});
// node_modules/lodash/_equalArrays.js
var require_equalArrays = __commonJS({
"node_modules/lodash/_equalArrays.js"(exports, module2) {
var SetCache = require_SetCache();
var arraySome = require_arraySome();
var cacheHas = require_cacheHas();
var COMPARE_PARTIAL_FLAG = 1;
var COMPARE_UNORDERED_FLAG = 2;
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, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : void 0;
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 !== void 0) {
if (compared) {
continue;
}
result = 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);
}
})) {
result = false;
break;
}
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
result = false;
break;
}
}
stack["delete"](array);
stack["delete"](other);
return result;
}
module2.exports = equalArrays;
}
});
// node_modules/lodash/_mapToArray.js
var require_mapToArray = __commonJS({
"node_modules/lodash/_mapToArray.js"(exports, module2) {
function mapToArray(map) {
var index2 = -1, result = Array(map.size);
map.forEach(function(value, key) {
result[++index2] = [key, value];
});
return result;
}
module2.exports = mapToArray;
}
});
// node_modules/lodash/_setToArray.js
var require_setToArray = __commonJS({
"node_modules/lodash/_setToArray.js"(exports, module2) {
function setToArray(set) {
var index2 = -1, result = Array(set.size);
set.forEach(function(value) {
result[++index2] = value;
});
return result;
}
module2.exports = setToArray;
}
});
// node_modules/lodash/_equalByTag.js
var require_equalByTag = __commonJS({
"node_modules/lodash/_equalByTag.js"(exports, module2) {
var Symbol2 = require_Symbol();
var Uint8Array2 = require_Uint8Array();
var eq = require_eq();
var equalArrays = require_equalArrays();
var mapToArray = require_mapToArray();
var setToArray = require_setToArray();
var COMPARE_PARTIAL_FLAG = 1;
var COMPARE_UNORDERED_FLAG = 2;
var boolTag = "[object Boolean]";
var dateTag = "[object Date]";
var errorTag = "[object Error]";
var mapTag = "[object Map]";
var numberTag = "[object Number]";
var regexpTag = "[object RegExp]";
var setTag = "[object Set]";
var stringTag = "[object String]";
var symbolTag = "[object Symbol]";
var arrayBufferTag = "[object ArrayBuffer]";
var dataViewTag = "[object DataView]";
var symbolProto = Symbol2 ? Symbol2.prototype : void 0;
var symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;
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 result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
stack["delete"](object);
return result;
case symbolTag:
if (symbolValueOf) {
return symbolValueOf.call(object) == symbolValueOf.call(other);
}
}
return false;
}
module2.exports = equalByTag;
}
});
// node_modules/lodash/_equalObjects.js
var require_equalObjects = __commonJS({
"node_modules/lodash/_equalObjects.js"(exports, module2) {
var getAllKeys = require_getAllKeys();
var COMPARE_PARTIAL_FLAG = 1;
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
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 : hasOwnProperty4.call(other, key))) {
return false;
}
}
var objStacked = stack.get(object);
var othStacked = stack.get(other);
if (objStacked && othStacked) {
return objStacked == other && othStacked == object;
}
var result = 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 === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
result = false;
break;
}
skipCtor || (skipCtor = key == "constructor");
}
if (result && !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)) {
result = false;
}
}
stack["delete"](object);
stack["delete"](other);
return result;
}
module2.exports = equalObjects;
}
});
// node_modules/lodash/_baseIsEqualDeep.js
var require_baseIsEqualDeep = __commonJS({
"node_modules/lodash/_baseIsEqualDeep.js"(exports, module2) {
var Stack = require_Stack();
var equalArrays = require_equalArrays();
var equalByTag = require_equalByTag();
var equalObjects = require_equalObjects();
var getTag2 = require_getTag();
var isArray3 = require_isArray();
var isBuffer2 = require_isBuffer();
var isTypedArray2 = require_isTypedArray();
var COMPARE_PARTIAL_FLAG = 1;
var argsTag = "[object Arguments]";
var arrayTag = "[object Array]";
var objectTag = "[object Object]";
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
var objIsArr = isArray3(object), othIsArr = isArray3(other), objTag = objIsArr ? arrayTag : getTag2(object), othTag = othIsArr ? arrayTag : getTag2(other);
objTag = objTag == argsTag ? objectTag : objTag;
othTag = othTag == argsTag ? objectTag : othTag;
var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
if (isSameTag && isBuffer2(object)) {
if (!isBuffer2(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
if (isSameTag && !objIsObj) {
stack || (stack = new Stack());
return objIsArr || isTypedArray2(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
var objIsWrapped = objIsObj && hasOwnProperty4.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty4.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);
}
module2.exports = baseIsEqualDeep;
}
});
// node_modules/lodash/_baseIsEqual.js
var require_baseIsEqual = __commonJS({
"node_modules/lodash/_baseIsEqual.js"(exports, module2) {
var baseIsEqualDeep = require_baseIsEqualDeep();
var isObjectLike = require_isObjectLike();
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);
}
module2.exports = baseIsEqual;
}
});
// node_modules/lodash/isEqual.js
var require_isEqual = __commonJS({
"node_modules/lodash/isEqual.js"(exports, module2) {
var baseIsEqual = require_baseIsEqual();
function isEqual(value, other) {
return baseIsEqual(value, other);
}
module2.exports = isEqual;
}
});
// node_modules/lodash/isEmpty.js
var require_isEmpty = __commonJS({
"node_modules/lodash/isEmpty.js"(exports, module2) {
var baseKeys = require_baseKeys();
var getTag2 = require_getTag();
var isArguments = require_isArguments();
var isArray3 = require_isArray();
var isArrayLike = require_isArrayLike();
var isBuffer2 = require_isBuffer();
var isPrototype = require_isPrototype();
var isTypedArray2 = require_isTypedArray();
var mapTag = "[object Map]";
var setTag = "[object Set]";
var objectProto = Object.prototype;
var hasOwnProperty4 = objectProto.hasOwnProperty;
function isEmpty(value) {
if (value == null) {
return true;
}
if (isArrayLike(value) && (isArray3(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer2(value) || isTypedArray2(value) || isArguments(value))) {
return !value.length;
}
var tag = getTag2(value);
if (tag == mapTag || tag == setTag) {
return !value.size;
}
if (isPrototype(value)) {
return !baseKeys(value).length;
}
for (var key in value) {
if (hasOwnProperty4.call(value, key)) {
return false;
}
}
return true;
}
module2.exports = isEmpty;
}
});
// node_modules/lodash/_baseForOwn.js
var require_baseForOwn = __commonJS({
"node_modules/lodash/_baseForOwn.js"(exports, module2) {
var baseFor = require_baseFor();
var keys = require_keys();
function baseForOwn(object, iteratee) {
return object && baseFor(object, iteratee, keys);
}
module2.exports = baseForOwn;
}
});
// node_modules/lodash/_createBaseEach.js
var require_createBaseEach = __commonJS({
"node_modules/lodash/_createBaseEach.js"(exports, module2) {
var isArrayLike = require_isArrayLike();
function createBaseEach(eachFunc, fromRight) {
return function(collection, iteratee) {
if (collection == null) {
return collection;
}
if (!isArrayLike(collection)) {
return eachFunc(collection, iteratee);
}
var length = collection.length, index2 = fromRight ? length : -1, iterable = Object(collection);
while (fromRight ? index2-- : ++index2 < length) {
if (iteratee(iterable[index2], index2, iterable) === false) {
break;
}
}
return collection;
};
}
module2.exports = createBaseEach;
}
});
// node_modules/lodash/_baseEach.js
var require_baseEach = __commonJS({
"node_modules/lodash/_baseEach.js"(exports, module2) {
var baseForOwn = require_baseForOwn();
var createBaseEach = require_createBaseEach();
var baseEach = createBaseEach(baseForOwn);
module2.exports = baseEach;
}
});
// node_modules/lodash/_castFunction.js
var require_castFunction = __commonJS({
"node_modules/lodash/_castFunction.js"(exports, module2) {
var identity = require_identity();
function castFunction(value) {
return typeof value == "function" ? value : identity;
}
module2.exports = castFunction;
}
});
// node_modules/lodash/forEach.js
var require_forEach = __commonJS({
"node_modules/lodash/forEach.js"(exports, module2) {
var arrayEach = require_arrayEach();
var baseEach = require_baseEach();
var castFunction = require_castFunction();
var isArray3 = require_isArray();
function forEach2(collection, iteratee) {
var func = isArray3(collection) ? arrayEach : baseEach;
return func(collection, castFunction(iteratee));
}
module2.exports = forEach2;
}
});
// node_modules/lodash/each.js
var require_each = __commonJS({
"node_modules/lodash/each.js"(exports, module2) {
module2.exports = require_forEach();
}
});
// node_modules/lodash/_baseSet.js
var require_baseSet = __commonJS({
"node_modules/lodash/_baseSet.js"(exports, module2) {
var assignValue = require_assignValue();
var castPath = require_castPath();
var isIndex = require_isIndex();
var isObject2 = require_isObject();
var toKey = require_toKey();
function baseSet(object, path, value, customizer) {
if (!isObject2(object)) {
return object;
}
path = castPath(path, object);
var index2 = -1, length = path.length, lastIndex = length - 1, nested = object;
while (nested != null && ++index2 < length) {
var key = toKey(path[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) : void 0;
if (newValue === void 0) {
newValue = isObject2(objValue) ? objValue : isIndex(path[index2 + 1]) ? [] : {};
}
}
assignValue(nested, key, newValue);
nested = nested[key];
}
return object;
}
module2.exports = baseSet;
}
});
// node_modules/lodash/set.js
var require_set = __commonJS({
"node_modules/lodash/set.js"(exports, module2) {
var baseSet = require_baseSet();
function set(object, path, value) {
return object == null ? object : baseSet(object, path, value);
}
module2.exports = set;
}
});
// node_modules/lodash/cloneDeepWith.js
var require_cloneDeepWith = __commonJS({
"node_modules/lodash/cloneDeepWith.js"(exports, module2) {
var baseClone = require_baseClone();
var CLONE_DEEP_FLAG = 1;
var CLONE_SYMBOLS_FLAG = 4;
function cloneDeepWith(value, customizer) {
customizer = typeof customizer == "function" ? customizer : void 0;
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
}
module2.exports = cloneDeepWith;
}
});
// node_modules/copy-text-to-clipboard/index.js
var require_copy_text_to_clipboard = __commonJS({
"node_modules/copy-text-to-clipboard/index.js"(exports, module2) {
"use strict";
var copyTextToClipboard = (input, { target = document.body } = {}) => {
const element = document.createElement("textarea");
const previouslyFocusedElement = document.activeElement;
element.value = input;
element.setAttribute("readonly", "");
element.style.contain = "strict";
element.style.position = "absolute";
element.style.left = "-9999px";
element.style.fontSize = "12pt";
const selection = document.getSelection();
let originalRange = false;
if (selection.rangeCount > 0) {
originalRange = selection.getRangeAt(0);
}
target.append(element);
element.select();
element.selectionStart = 0;
element.selectionEnd = input.length;
let isSuccess = false;
try {
isSuccess = document.execCommand("copy");
} catch (_) {
}
element.remove();
if (originalRange) {
selection.removeAllRanges();
selection.addRange(originalRange);
}
if (previouslyFocusedElement) {
previouslyFocusedElement.focus();
}
return isSuccess;
};
module2.exports = copyTextToClipboard;
module2.exports.default = copyTextToClipboard;
}
});
// node_modules/lodash/isNumber.js
var require_isNumber = __commonJS({
"node_modules/lodash/isNumber.js"(exports, module2) {
var baseGetTag = require_baseGetTag();
var isObjectLike = require_isObjectLike();
var numberTag = "[object Number]";
function isNumber2(value) {
return typeof value == "number" || isObjectLike(value) && baseGetTag(value) == numberTag;
}
module2.exports = isNumber2;
}
});
// node_modules/lodash/_basePickBy.js
var require_basePickBy = __commonJS({
"node_modules/lodash/_basePickBy.js"(exports, module2) {
var baseGet = require_baseGet();
var baseSet = require_baseSet();
var castPath = require_castPath();
function basePickBy(object, paths, predicate) {
var index2 = -1, length = paths.length, result = {};
while (++index2 < length) {
var path = paths[index2], value = baseGet(object, path);
if (predicate(value, path)) {
baseSet(result, castPath(path, object), value);
}
}
return result;
}
module2.exports = basePickBy;
}
});
// node_modules/lodash/_baseHasIn.js
var require_baseHasIn = __commonJS({
"node_modules/lodash/_baseHasIn.js"(exports, module2) {
function baseHasIn(object, key) {
return object != null && key in Object(object);
}
module2.exports = baseHasIn;
}
});
// node_modules/lodash/_hasPath.js
var require_hasPath = __commonJS({
"node_modules/lodash/_hasPath.js"(exports, module2) {
var castPath = require_castPath();
var isArguments = require_isArguments();
var isArray3 = require_isArray();
var isIndex = require_isIndex();
var isLength = require_isLength();
var toKey = require_toKey();
function hasPath(object, path, hasFunc) {
path = castPath(path, object);
var index2 = -1, length = path.length, result = false;
while (++index2 < length) {
var key = toKey(path[index2]);
if (!(result = object != null && hasFunc(object, key))) {
break;
}
object = object[key];
}
if (result || ++index2 != length) {
return result;
}
length = object == null ? 0 : object.length;
return !!length && isLength(length) && isIndex(key, length) && (isArray3(object) || isArguments(object));
}
module2.exports = hasPath;
}
});
// node_modules/lodash/hasIn.js
var require_hasIn = __commonJS({
"node_modules/lodash/hasIn.js"(exports, module2) {
var baseHasIn = require_baseHasIn();
var hasPath = require_hasPath();
function hasIn(object, path) {
return object != null && hasPath(object, path, baseHasIn);
}
module2.exports = hasIn;
}
});
// node_modules/lodash/_basePick.js
var require_basePick = __commonJS({
"node_modules/lodash/_basePick.js"(exports, module2) {
var basePickBy = require_basePickBy();
var hasIn = require_hasIn();
function basePick(object, paths) {
return basePickBy(object, paths, function(value, path) {
return hasIn(object, path);
});
}
module2.exports = basePick;
}
});
// node_modules/lodash/pick.js
var require_pick = __commonJS({
"node_modules/lodash/pick.js"(exports, module2) {
var basePick = require_basePick();
var flatRest = require_flatRest();
var pick = flatRest(function(object, paths) {
return object == null ? {} : basePick(object, paths);
});
module2.exports = pick;
}
});
// node_modules/react-infinite-scroller/dist/InfiniteScroll.js
var require_InfiniteScroll = __commonJS({
"node_modules/react-infinite-scroller/dist/InfiniteScroll.js"(exports, module2) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function() {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor)
descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps)
defineProperties(Constructor.prototype, protoProps);
if (staticProps)
defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var _react = require_react();
var _react2 = _interopRequireDefault(_react);
var _propTypes = require_prop_types();
var _propTypes2 = _interopRequireDefault(_propTypes);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function _objectWithoutProperties(obj, keys) {
var target = {};
for (var i in obj) {
if (keys.indexOf(i) >= 0)
continue;
if (!Object.prototype.hasOwnProperty.call(obj, i))
continue;
target[i] = obj[i];
}
return target;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self2, call) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call && (typeof call === "object" || typeof call === "function") ? call : self2;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
var InfiniteScroll2 = function(_Component) {
_inherits(InfiniteScroll3, _Component);
function InfiniteScroll3(props) {
_classCallCheck(this, InfiniteScroll3);
var _this = _possibleConstructorReturn(this, (InfiniteScroll3.__proto__ || Object.getPrototypeOf(InfiniteScroll3)).call(this, props));
_this.scrollListener = _this.scrollListener.bind(_this);
_this.eventListenerOptions = _this.eventListenerOptions.bind(_this);
_this.mousewheelListener = _this.mousewheelListener.bind(_this);
return _this;
}
_createClass(InfiniteScroll3, [{
key: "componentDidMount",
value: function componentDidMount() {
this.pageLoaded = this.props.pageStart;
this.options = this.eventListenerOptions();
this.attachScrollListener();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
if (this.props.isReverse && this.loadMore) {
var parentElement = this.getParentElement(this.scrollComponent);
parentElement.scrollTop = parentElement.scrollHeight - this.beforeScrollHeight + this.beforeScrollTop;
this.loadMore = false;
}
this.attachScrollListener();
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.detachScrollListener();
this.detachMousewheelListener();
}
}, {
key: "isPassiveSupported",
value: function isPassiveSupported() {
var passive = false;
var testOptions = {
get passive() {
passive = true;
}
};
try {
document.addEventListener("test", null, testOptions);
document.removeEventListener("test", null, testOptions);
} catch (e) {
}
return passive;
}
}, {
key: "eventListenerOptions",
value: function eventListenerOptions() {
var options = this.props.useCapture;
if (this.isPassiveSupported()) {
options = {
useCapture: this.props.useCapture,
passive: true
};
} else {
options = {
passive: false
};
}
return options;
}
}, {
key: "setDefaultLoader",
value: function setDefaultLoader(loader) {
this.defaultLoader = loader;
}
}, {
key: "detachMousewheelListener",
value: function detachMousewheelListener() {
var scrollEl = window;
if (this.props.useWindow === false) {
scrollEl = this.scrollComponent.parentNode;
}
scrollEl.removeEventListener("mousewheel", this.mousewheelListener, this.options ? this.options : this.props.useCapture);
}
}, {
key: "detachScrollListener",
value: function detachScrollListener() {
var scrollEl = window;
if (this.props.useWindow === false) {
scrollEl = this.getParentElement(this.scrollComponent);
}
scrollEl.removeEventListener("scroll", this.scrollListener, this.options ? this.options : this.props.useCapture);
scrollEl.removeEventListener("resize", this.scrollListener, this.options ? this.options : this.props.useCapture);
}
}, {
key: "getParentElement",
value: function getParentElement(el) {
var scrollParent = this.props.getScrollParent && this.props.getScrollParent();
if (scrollParent != null) {
return scrollParent;
}
return el && el.parentNode;
}
}, {
key: "filterProps",
value: function filterProps(props) {
return props;
}
}, {
key: "attachScrollListener",
value: function attachScrollListener() {
var parentElement = this.getParentElement(this.scrollComponent);
if (!this.props.hasMore || !parentElement) {
return;
}
var scrollEl = window;
if (this.props.useWindow === false) {
scrollEl = parentElement;
}
scrollEl.addEventListener("mousewheel", this.mousewheelListener, this.options ? this.options : this.props.useCapture);
scrollEl.addEventListener("scroll", this.scrollListener, this.options ? this.options : this.props.useCapture);
scrollEl.addEventListener("resize", this.scrollListener, this.options ? this.options : this.props.useCapture);
if (this.props.initialLoad) {
this.scrollListener();
}
}
}, {
key: "mousewheelListener",
value: function mousewheelListener(e) {
if (e.deltaY === 1 && !this.isPassiveSupported()) {
e.preventDefault();
}
}
}, {
key: "scrollListener",
value: function scrollListener() {
var el = this.scrollComponent;
var scrollEl = window;
var parentNode = this.getParentElement(el);
var offset = void 0;
if (this.props.useWindow) {
var doc = document.documentElement || document.body.parentNode || document.body;
var scrollTop = scrollEl.pageYOffset !== void 0 ? scrollEl.pageYOffset : doc.scrollTop;
if (this.props.isReverse) {
offset = scrollTop;
} else {
offset = this.calculateOffset(el, scrollTop);
}
} else if (this.props.isReverse) {
offset = parentNode.scrollTop;
} else {
offset = el.scrollHeight - parentNode.scrollTop - parentNode.clientHeight;
}
if (offset < Number(this.props.threshold) && el && el.offsetParent !== null) {
this.detachScrollListener();
this.beforeScrollHeight = parentNode.scrollHeight;
this.beforeScrollTop = parentNode.scrollTop;
if (typeof this.props.loadMore === "function") {
this.props.loadMore(this.pageLoaded += 1);
this.loadMore = true;
}
}
}
}, {
key: "calculateOffset",
value: function calculateOffset(el, scrollTop) {
if (!el) {
return 0;
}
return this.calculateTopPosition(el) + (el.offsetHeight - scrollTop - window.innerHeight);
}
}, {
key: "calculateTopPosition",
value: function calculateTopPosition(el) {
if (!el) {
return 0;
}
return el.offsetTop + this.calculateTopPosition(el.offsetParent);
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var renderProps = this.filterProps(this.props);
var children = renderProps.children, element = renderProps.element, hasMore = renderProps.hasMore, initialLoad = renderProps.initialLoad, isReverse = renderProps.isReverse, loader = renderProps.loader, loadMore = renderProps.loadMore, pageStart = renderProps.pageStart, ref = renderProps.ref, threshold = renderProps.threshold, useCapture = renderProps.useCapture, useWindow = renderProps.useWindow, getScrollParent = renderProps.getScrollParent, props = _objectWithoutProperties(renderProps, ["children", "element", "hasMore", "initialLoad", "isReverse", "loader", "loadMore", "pageStart", "ref", "threshold", "useCapture", "useWindow", "getScrollParent"]);
props.ref = function(node) {
_this2.scrollComponent = node;
if (ref) {
ref(node);
}
};
var childrenArray = [children];
if (hasMore) {
if (loader) {
isReverse ? childrenArray.unshift(loader) : childrenArray.push(loader);
} else if (this.defaultLoader) {
isReverse ? childrenArray.unshift(this.defaultLoader) : childrenArray.push(this.defaultLoader);
}
}
return _react2.default.createElement(element, props, childrenArray);
}
}]);
return InfiniteScroll3;
}(_react.Component);
InfiniteScroll2.propTypes = {
children: _propTypes2.default.node.isRequired,
element: _propTypes2.default.node,
hasMore: _propTypes2.default.bool,
initialLoad: _propTypes2.default.bool,
isReverse: _propTypes2.default.bool,
loader: _propTypes2.default.node,
loadMore: _propTypes2.default.func.isRequired,
pageStart: _propTypes2.default.number,
ref: _propTypes2.default.func,
getScrollParent: _propTypes2.default.func,
threshold: _propTypes2.default.number,
useCapture: _propTypes2.default.bool,
useWindow: _propTypes2.default.bool
};
InfiniteScroll2.defaultProps = {
element: "div",
hasMore: false,
initialLoad: true,
pageStart: 0,
ref: null,
threshold: 250,
useWindow: true,
isReverse: false,
useCapture: false,
loader: null,
getScrollParent: null
};
exports.default = InfiniteScroll2;
module2.exports = exports["default"];
}
});
// node_modules/react-infinite-scroller/index.js
var require_react_infinite_scroller = __commonJS({
"node_modules/react-infinite-scroller/index.js"(exports, module2) {
module2.exports = require_InfiniteScroll();
}
});
// src/main.ts
__export(exports, {
default: () => main_default
});
var import_obsidian9 = __toModule(require("obsidian"));
// node_modules/axios/lib/helpers/bind.js
"use strict";
function bind(fn, thisArg) {
return function wrap() {
return fn.apply(thisArg, arguments);
};
}
// node_modules/axios/lib/utils.js
"use strict";
var { toString } = Object.prototype;
var { getPrototypeOf } = Object;
var { iterator, toStringTag } = Symbol;
var kindOf = ((cache) => (thing) => {
const str = toString.call(thing);
return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
})(Object.create(null));
var kindOfTest = (type) => {
type = type.toLowerCase();
return (thing) => kindOf(thing) === type;
};
var typeOfTest = (type) => (thing) => typeof thing === type;
var { isArray } = Array;
var isUndefined = typeOfTest("undefined");
function isBuffer(val) {
return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
}
var isArrayBuffer = kindOfTest("ArrayBuffer");
function isArrayBufferView(val) {
let result;
if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) {
result = ArrayBuffer.isView(val);
} else {
result = val && val.buffer && isArrayBuffer(val.buffer);
}
return result;
}
var isString = typeOfTest("string");
var isFunction = typeOfTest("function");
var isNumber = typeOfTest("number");
var isObject = (thing) => thing !== null && typeof thing === "object";
var isBoolean = (thing) => thing === true || thing === false;
var isPlainObject = (val) => {
if (kindOf(val) !== "object") {
return false;
}
const prototype3 = getPrototypeOf(val);
return (prototype3 === null || prototype3 === Object.prototype || Object.getPrototypeOf(prototype3) === null) && !(toStringTag in val) && !(iterator in val);
};
var isDate = kindOfTest("Date");
var isFile = kindOfTest("File");
var isBlob = kindOfTest("Blob");
var isFileList = kindOfTest("FileList");
var isStream = (val) => isObject(val) && isFunction(val.pipe);
var isFormData = (thing) => {
let kind;
return thing && (typeof FormData === "function" && thing instanceof FormData || isFunction(thing.append) && ((kind = kindOf(thing)) === "formdata" || kind === "object" && isFunction(thing.toString) && thing.toString() === "[object FormData]"));
};
var isURLSearchParams = kindOfTest("URLSearchParams");
var [isReadableStream, isRequest, isResponse, isHeaders] = ["ReadableStream", "Request", "Response", "Headers"].map(kindOfTest);
var trim = (str) => str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
function forEach(obj, fn, { allOwnKeys = false } = {}) {
if (obj === null || typeof obj === "undefined") {
return;
}
let i;
let l;
if (typeof obj !== "object") {
obj = [obj];
}
if (isArray(obj)) {
for (i = 0, l = obj.length; i < l; i++) {
fn.call(null, obj[i], i, obj);
}
} else {
const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
const len = keys.length;
let key;
for (i = 0; i < len; i++) {
key = keys[i];
fn.call(null, obj[key], key, obj);
}
}
}
function findKey(obj, key) {
key = key.toLowerCase();
const keys = Object.keys(obj);
let i = keys.length;
let _key;
while (i-- > 0) {
_key = keys[i];
if (key === _key.toLowerCase()) {
return _key;
}
}
return null;
}
var _global = (() => {
if (typeof globalThis !== "undefined")
return globalThis;
return typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : window;
})();
var isContextDefined = (context) => !isUndefined(context) && context !== _global;
function merge() {
const { caseless } = isContextDefined(this) && this || {};
const result = {};
const assignValue = (val, key) => {
const targetKey = caseless && findKey(result, key) || key;
if (isPlainObject(result[targetKey]) && isPlainObject(val)) {
result[targetKey] = merge(result[targetKey], val);
} else if (isPlainObject(val)) {
result[targetKey] = merge({}, val);
} else if (isArray(val)) {
result[targetKey] = val.slice();
} else {
result[targetKey] = val;
}
};
for (let i = 0, l = arguments.length; i < l; i++) {
arguments[i] && forEach(arguments[i], assignValue);
}
return result;
}
var extend = (a, b, thisArg, { allOwnKeys } = {}) => {
forEach(b, (val, key) => {
if (thisArg && isFunction(val)) {
a[key] = bind(val, thisArg);
} else {
a[key] = val;
}
}, { allOwnKeys });
return a;
};
var stripBOM = (content) => {
if (content.charCodeAt(0) === 65279) {
content = content.slice(1);
}
return content;
};
var inherits = (constructor, superConstructor, props, descriptors2) => {
constructor.prototype = Object.create(superConstructor.prototype, descriptors2);
constructor.prototype.constructor = constructor;
Object.defineProperty(constructor, "super", {
value: superConstructor.prototype
});
props && Object.assign(constructor.prototype, props);
};
var toFlatObject = (sourceObj, destObj, filter2, propFilter) => {
let props;
let i;
let prop;
const merged = {};
destObj = destObj || {};
if (sourceObj == null)
return destObj;
do {
props = Object.getOwnPropertyNames(sourceObj);
i = props.length;
while (i-- > 0) {
prop = props[i];
if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
destObj[prop] = sourceObj[prop];
merged[prop] = true;
}
}
sourceObj = filter2 !== false && getPrototypeOf(sourceObj);
} while (sourceObj && (!filter2 || filter2(sourceObj, destObj)) && sourceObj !== Object.prototype);
return destObj;
};
var endsWith = (str, searchString, position) => {
str = String(str);
if (position === void 0 || position > str.length) {
position = str.length;
}
position -= searchString.length;
const lastIndex = str.indexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
var toArray = (thing) => {
if (!thing)
return null;
if (isArray(thing))
return thing;
let i = thing.length;
if (!isNumber(i))
return null;
const arr = new Array(i);
while (i-- > 0) {
arr[i] = thing[i];
}
return arr;
};
var isTypedArray = ((TypedArray) => {
return (thing) => {
return TypedArray && thing instanceof TypedArray;
};
})(typeof Uint8Array !== "undefined" && getPrototypeOf(Uint8Array));
var forEachEntry = (obj, fn) => {
const generator3 = obj && obj[iterator];
const _iterator = generator3.call(obj);
let result;
while ((result = _iterator.next()) && !result.done) {
const pair = result.value;
fn.call(obj, pair[0], pair[1]);
}
};
var matchAll = (regExp, str) => {
let matches;
const arr = [];
while ((matches = regExp.exec(str)) !== null) {
arr.push(matches);
}
return arr;
};
var isHTMLForm = kindOfTest("HTMLFormElement");
var toCamelCase = (str) => {
return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, function replacer(m, p1, p2) {
return p1.toUpperCase() + p2;
});
};
var hasOwnProperty = (({ hasOwnProperty: hasOwnProperty4 }) => (obj, prop) => hasOwnProperty4.call(obj, prop))(Object.prototype);
var isRegExp = kindOfTest("RegExp");
var reduceDescriptors = (obj, reducer) => {
const descriptors2 = Object.getOwnPropertyDescriptors(obj);
const reducedDescriptors = {};
forEach(descriptors2, (descriptor, name) => {
let ret;
if ((ret = reducer(descriptor, name, obj)) !== false) {
reducedDescriptors[name] = ret || descriptor;
}
});
Object.defineProperties(obj, reducedDescriptors);
};
var freezeMethods = (obj) => {
reduceDescriptors(obj, (descriptor, name) => {
if (isFunction(obj) && ["arguments", "caller", "callee"].indexOf(name) !== -1) {
return false;
}
const value = obj[name];
if (!isFunction(value))
return;
descriptor.enumerable = false;
if ("writable" in descriptor) {
descriptor.writable = false;
return;
}
if (!descriptor.set) {
descriptor.set = () => {
throw Error("Can not rewrite read-only method '" + name + "'");
};
}
});
};
var toObjectSet = (arrayOrString, delimiter) => {
const obj = {};
const define2 = (arr) => {
arr.forEach((value) => {
obj[value] = true;
});
};
isArray(arrayOrString) ? define2(arrayOrString) : define2(String(arrayOrString).split(delimiter));
return obj;
};
var noop = () => {
};
var toFiniteNumber = (value, defaultValue) => {
return value != null && Number.isFinite(value = +value) ? value : defaultValue;
};
function isSpecCompliantForm(thing) {
return !!(thing && isFunction(thing.append) && thing[toStringTag] === "FormData" && thing[iterator]);
}
var toJSONObject = (obj) => {
const stack = new Array(10);
const visit = (source, i) => {
if (isObject(source)) {
if (stack.indexOf(source) >= 0) {
return;
}
if (!("toJSON" in source)) {
stack[i] = source;
const target = isArray(source) ? [] : {};
forEach(source, (value, key) => {
const reducedValue = visit(value, i + 1);
!isUndefined(reducedValue) && (target[key] = reducedValue);
});
stack[i] = void 0;
return target;
}
}
return source;
};
return visit(obj, 0);
};
var isAsyncFn = kindOfTest("AsyncFunction");
var isThenable = (thing) => thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);
var _setImmediate = ((setImmediateSupported, postMessageSupported) => {
if (setImmediateSupported) {
return setImmediate;
}
return postMessageSupported ? ((token, callbacks) => {
_global.addEventListener("message", ({ source, data }) => {
if (source === _global && data === token) {
callbacks.length && callbacks.shift()();
}
}, false);
return (cb) => {
callbacks.push(cb);
_global.postMessage(token, "*");
};
})(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);
})(typeof setImmediate === "function", isFunction(_global.postMessage));
var asap = typeof queueMicrotask !== "undefined" ? queueMicrotask.bind(_global) : typeof process !== "undefined" && process.nextTick || _setImmediate;
var isIterable = (thing) => thing != null && isFunction(thing[iterator]);
var utils_default = {
isArray,
isArrayBuffer,
isBuffer,
isFormData,
isArrayBufferView,
isString,
isNumber,
isBoolean,
isObject,
isPlainObject,
isReadableStream,
isRequest,
isResponse,
isHeaders,
isUndefined,
isDate,
isFile,
isBlob,
isRegExp,
isFunction,
isStream,
isURLSearchParams,
isTypedArray,
isFileList,
forEach,
merge,
extend,
trim,
stripBOM,
inherits,
toFlatObject,
kindOf,
kindOfTest,
endsWith,
toArray,
forEachEntry,
matchAll,
isHTMLForm,
hasOwnProperty,
hasOwnProp: hasOwnProperty,
reduceDescriptors,
freezeMethods,
toObjectSet,
toCamelCase,
noop,
toFiniteNumber,
findKey,
global: _global,
isContextDefined,
isSpecCompliantForm,
toJSONObject,
isAsyncFn,
isThenable,
setImmediate: _setImmediate,
asap,
isIterable
};
// node_modules/axios/lib/core/AxiosError.js
"use strict";
function AxiosError(message, code, config, request2, response) {
Error.call(this);
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
} else {
this.stack = new Error().stack;
}
this.message = message;
this.name = "AxiosError";
code && (this.code = code);
config && (this.config = config);
request2 && (this.request = request2);
if (response) {
this.response = response;
this.status = response.status ? response.status : null;
}
}
utils_default.inherits(AxiosError, Error, {
toJSON: function toJSON() {
return {
message: this.message,
name: this.name,
description: this.description,
number: this.number,
fileName: this.fileName,
lineNumber: this.lineNumber,
columnNumber: this.columnNumber,
stack: this.stack,
config: utils_default.toJSONObject(this.config),
code: this.code,
status: this.status
};
}
});
var prototype = AxiosError.prototype;
var descriptors = {};
[
"ERR_BAD_OPTION_VALUE",
"ERR_BAD_OPTION",
"ECONNABORTED",
"ETIMEDOUT",
"ERR_NETWORK",
"ERR_FR_TOO_MANY_REDIRECTS",
"ERR_DEPRECATED",
"ERR_BAD_RESPONSE",
"ERR_BAD_REQUEST",
"ERR_CANCELED",
"ERR_NOT_SUPPORT",
"ERR_INVALID_URL"
].forEach((code) => {
descriptors[code] = { value: code };
});
Object.defineProperties(AxiosError, descriptors);
Object.defineProperty(prototype, "isAxiosError", { value: true });
AxiosError.from = (error, code, config, request2, response, customProps) => {
const axiosError = Object.create(prototype);
utils_default.toFlatObject(error, axiosError, function filter2(obj) {
return obj !== Error.prototype;
}, (prop) => {
return prop !== "isAxiosError";
});
AxiosError.call(axiosError, error.message, code, config, request2, response);
axiosError.cause = error;
axiosError.name = error.name;
customProps && Object.assign(axiosError, customProps);
return axiosError;
};
var AxiosError_default = AxiosError;
// node_modules/axios/lib/platform/node/classes/FormData.js
var import_form_data = __toModule(require_browser());
var FormData_default = import_form_data.default;
// node_modules/axios/lib/helpers/toFormData.js
"use strict";
function isVisitable(thing) {
return utils_default.isPlainObject(thing) || utils_default.isArray(thing);
}
function removeBrackets(key) {
return utils_default.endsWith(key, "[]") ? key.slice(0, -2) : key;
}
function renderKey(path, key, dots) {
if (!path)
return key;
return path.concat(key).map(function each(token, i) {
token = removeBrackets(token);
return !dots && i ? "[" + token + "]" : token;
}).join(dots ? "." : "");
}
function isFlatArray(arr) {
return utils_default.isArray(arr) && !arr.some(isVisitable);
}
var predicates = utils_default.toFlatObject(utils_default, {}, null, function filter(prop) {
return /^is[A-Z]/.test(prop);
});
function toFormData(obj, formData, options) {
if (!utils_default.isObject(obj)) {
throw new TypeError("target must be an object");
}
formData = formData || new (FormData_default || FormData)();
options = utils_default.toFlatObject(options, {
metaTokens: true,
dots: false,
indexes: false
}, false, function defined(option, source) {
return !utils_default.isUndefined(source[option]);
});
const metaTokens = options.metaTokens;
const visitor = options.visitor || defaultVisitor;
const dots = options.dots;
const indexes = options.indexes;
const _Blob = options.Blob || typeof Blob !== "undefined" && Blob;
const useBlob = _Blob && utils_default.isSpecCompliantForm(formData);
if (!utils_default.isFunction(visitor)) {
throw new TypeError("visitor must be a function");
}
function convertValue(value) {
if (value === null)
return "";
if (utils_default.isDate(value)) {
return value.toISOString();
}
if (utils_default.isBoolean(value)) {
return value.toString();
}
if (!useBlob && utils_default.isBlob(value)) {
throw new AxiosError_default("Blob is not supported. Use a Buffer instead.");
}
if (utils_default.isArrayBuffer(value) || utils_default.isTypedArray(value)) {
return useBlob && typeof Blob === "function" ? new Blob([value]) : Buffer.from(value);
}
return value;
}
function defaultVisitor(value, key, path) {
let arr = value;
if (value && !path && typeof value === "object") {
if (utils_default.endsWith(key, "{}")) {
key = metaTokens ? key : key.slice(0, -2);
value = JSON.stringify(value);
} else if (utils_default.isArray(value) && isFlatArray(value) || (utils_default.isFileList(value) || utils_default.endsWith(key, "[]")) && (arr = utils_default.toArray(value))) {
key = removeBrackets(key);
arr.forEach(function each(el, index2) {
!(utils_default.isUndefined(el) || el === null) && formData.append(indexes === true ? renderKey([key], index2, dots) : indexes === null ? key : key + "[]", convertValue(el));
});
return false;
}
}
if (isVisitable(value)) {
return true;
}
formData.append(renderKey(path, key, dots), convertValue(value));
return false;
}
const stack = [];
const exposedHelpers = Object.assign(predicates, {
defaultVisitor,
convertValue,
isVisitable
});
function build(value, path) {
if (utils_default.isUndefined(value))
return;
if (stack.indexOf(value) !== -1) {
throw Error("Circular reference detected in " + path.join("."));
}
stack.push(value);
utils_default.forEach(value, function each(el, key) {
const result = !(utils_default.isUndefined(el) || el === null) && visitor.call(formData, el, utils_default.isString(key) ? key.trim() : key, path, exposedHelpers);
if (result === true) {
build(el, path ? path.concat(key) : [key]);
}
});
stack.pop();
}
if (!utils_default.isObject(obj)) {
throw new TypeError("data must be an object");
}
build(obj);
return formData;
}
var toFormData_default = toFormData;
// node_modules/axios/lib/helpers/AxiosURLSearchParams.js
"use strict";
function encode(str) {
const charMap = {
"!": "%21",
"'": "%27",
"(": "%28",
")": "%29",
"~": "%7E",
"%20": "+",
"%00": "\0"
};
return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match2) {
return charMap[match2];
});
}
function AxiosURLSearchParams(params, options) {
this._pairs = [];
params && toFormData_default(params, this, options);
}
var prototype2 = AxiosURLSearchParams.prototype;
prototype2.append = function append(name, value) {
this._pairs.push([name, value]);
};
prototype2.toString = function toString2(encoder) {
const _encode = encoder ? function(value) {
return encoder.call(this, value, encode);
} : encode;
return this._pairs.map(function each(pair) {
return _encode(pair[0]) + "=" + _encode(pair[1]);
}, "").join("&");
};
var AxiosURLSearchParams_default = AxiosURLSearchParams;
// node_modules/axios/lib/helpers/buildURL.js
"use strict";
function encode2(val) {
return encodeURIComponent(val).replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+").replace(/%5B/gi, "[").replace(/%5D/gi, "]");
}
function buildURL(url2, params, options) {
if (!params) {
return url2;
}
const _encode = options && options.encode || encode2;
if (utils_default.isFunction(options)) {
options = {
serialize: options
};
}
const serializeFn = options && options.serialize;
let serializedParams;
if (serializeFn) {
serializedParams = serializeFn(params, options);
} else {
serializedParams = utils_default.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams_default(params, options).toString(_encode);
}
if (serializedParams) {
const hashmarkIndex = url2.indexOf("#");
if (hashmarkIndex !== -1) {
url2 = url2.slice(0, hashmarkIndex);
}
url2 += (url2.indexOf("?") === -1 ? "?" : "&") + serializedParams;
}
return url2;
}
// node_modules/axios/lib/core/InterceptorManager.js
"use strict";
var InterceptorManager = class {
constructor() {
this.handlers = [];
}
use(fulfilled, rejected, options) {
this.handlers.push({
fulfilled,
rejected,
synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null
});
return this.handlers.length - 1;
}
eject(id) {
if (this.handlers[id]) {
this.handlers[id] = null;
}
}
clear() {
if (this.handlers) {
this.handlers = [];
}
}
forEach(fn) {
utils_default.forEach(this.handlers, function forEachHandler(h) {
if (h !== null) {
fn(h);
}
});
}
};
var InterceptorManager_default = InterceptorManager;
// node_modules/axios/lib/defaults/transitional.js
"use strict";
var transitional_default = {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
};
// node_modules/axios/lib/platform/node/index.js
var import_crypto = __toModule(require("crypto"));
// node_modules/axios/lib/platform/node/classes/URLSearchParams.js
var import_url = __toModule(require("url"));
"use strict";
var URLSearchParams_default = import_url.default.URLSearchParams;
// node_modules/axios/lib/platform/node/index.js
var ALPHA = "abcdefghijklmnopqrstuvwxyz";
var DIGIT = "0123456789";
var ALPHABET = {
DIGIT,
ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
};
var generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = "";
const { length } = alphabet;
const randomValues = new Uint32Array(size);
import_crypto.default.randomFillSync(randomValues);
for (let i = 0; i < size; i++) {
str += alphabet[randomValues[i] % length];
}
return str;
};
var node_default = {
isNode: true,
classes: {
URLSearchParams: URLSearchParams_default,
FormData: FormData_default,
Blob: typeof Blob !== "undefined" && Blob || null
},
ALPHABET,
generateString,
protocols: ["http", "https", "file", "data"]
};
// node_modules/axios/lib/platform/common/utils.js
var utils_exports = {};
__export(utils_exports, {
hasBrowserEnv: () => hasBrowserEnv,
hasStandardBrowserEnv: () => hasStandardBrowserEnv,
hasStandardBrowserWebWorkerEnv: () => hasStandardBrowserWebWorkerEnv,
navigator: () => _navigator,
origin: () => origin
});
var hasBrowserEnv = typeof window !== "undefined" && typeof document !== "undefined";
var _navigator = typeof navigator === "object" && navigator || void 0;
var hasStandardBrowserEnv = hasBrowserEnv && (!_navigator || ["ReactNative", "NativeScript", "NS"].indexOf(_navigator.product) < 0);
var hasStandardBrowserWebWorkerEnv = (() => {
return typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope && typeof self.importScripts === "function";
})();
var origin = hasBrowserEnv && window.location.href || "http://localhost";
// node_modules/axios/lib/platform/index.js
var platform_default = {
...utils_exports,
...node_default
};
// node_modules/axios/lib/helpers/toURLEncodedForm.js
"use strict";
function toURLEncodedForm(data, options) {
return toFormData_default(data, new platform_default.classes.URLSearchParams(), Object.assign({
visitor: function(value, key, path, helpers) {
if (platform_default.isNode && utils_default.isBuffer(value)) {
this.append(key, value.toString("base64"));
return false;
}
return helpers.defaultVisitor.apply(this, arguments);
}
}, options));
}
// node_modules/axios/lib/helpers/formDataToJSON.js
"use strict";
function parsePropPath(name) {
return utils_default.matchAll(/\w+|\[(\w*)]/g, name).map((match2) => {
return match2[0] === "[]" ? "" : match2[1] || match2[0];
});
}
function arrayToObject(arr) {
const obj = {};
const keys = Object.keys(arr);
let i;
const len = keys.length;
let key;
for (i = 0; i < len; i++) {
key = keys[i];
obj[key] = arr[key];
}
return obj;
}
function formDataToJSON(formData) {
function buildPath(path, value, target, index2) {
let name = path[index2++];
if (name === "__proto__")
return true;
const isNumericKey = Number.isFinite(+name);
const isLast = index2 >= path.length;
name = !name && utils_default.isArray(target) ? target.length : name;
if (isLast) {
if (utils_default.hasOwnProp(target, name)) {
target[name] = [target[name], value];
} else {
target[name] = value;
}
return !isNumericKey;
}
if (!target[name] || !utils_default.isObject(target[name])) {
target[name] = [];
}
const result = buildPath(path, value, target[name], index2);
if (result && utils_default.isArray(target[name])) {
target[name] = arrayToObject(target[name]);
}
return !isNumericKey;
}
if (utils_default.isFormData(formData) && utils_default.isFunction(formData.entries)) {
const obj = {};
utils_default.forEachEntry(formData, (name, value) => {
buildPath(parsePropPath(name), value, obj, 0);
});
return obj;
}
return null;
}
var formDataToJSON_default = formDataToJSON;
// node_modules/axios/lib/defaults/index.js
"use strict";
function stringifySafely(rawValue, parser, encoder) {
if (utils_default.isString(rawValue)) {
try {
(parser || JSON.parse)(rawValue);
return utils_default.trim(rawValue);
} catch (e) {
if (e.name !== "SyntaxError") {
throw e;
}
}
}
return (encoder || JSON.stringify)(rawValue);
}
var defaults = {
transitional: transitional_default,
adapter: ["xhr", "http", "fetch"],
transformRequest: [function transformRequest(data, headers) {
const contentType = headers.getContentType() || "";
const hasJSONContentType = contentType.indexOf("application/json") > -1;
const isObjectPayload = utils_default.isObject(data);
if (isObjectPayload && utils_default.isHTMLForm(data)) {
data = new FormData(data);
}
const isFormData2 = utils_default.isFormData(data);
if (isFormData2) {
return hasJSONContentType ? JSON.stringify(formDataToJSON_default(data)) : data;
}
if (utils_default.isArrayBuffer(data) || utils_default.isBuffer(data) || utils_default.isStream(data) || utils_default.isFile(data) || utils_default.isBlob(data) || utils_default.isReadableStream(data)) {
return data;
}
if (utils_default.isArrayBufferView(data)) {
return data.buffer;
}
if (utils_default.isURLSearchParams(data)) {
headers.setContentType("application/x-www-form-urlencoded;charset=utf-8", false);
return data.toString();
}
let isFileList2;
if (isObjectPayload) {
if (contentType.indexOf("application/x-www-form-urlencoded") > -1) {
return toURLEncodedForm(data, this.formSerializer).toString();
}
if ((isFileList2 = utils_default.isFileList(data)) || contentType.indexOf("multipart/form-data") > -1) {
const _FormData = this.env && this.env.FormData;
return toFormData_default(isFileList2 ? { "files[]": data } : data, _FormData && new _FormData(), this.formSerializer);
}
}
if (isObjectPayload || hasJSONContentType) {
headers.setContentType("application/json", false);
return stringifySafely(data);
}
return data;
}],
transformResponse: [function transformResponse(data) {
const transitional2 = this.transitional || defaults.transitional;
const forcedJSONParsing = transitional2 && transitional2.forcedJSONParsing;
const JSONRequested = this.responseType === "json";
if (utils_default.isResponse(data) || utils_default.isReadableStream(data)) {
return data;
}
if (data && utils_default.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) {
const silentJSONParsing = transitional2 && transitional2.silentJSONParsing;
const strictJSONParsing = !silentJSONParsing && JSONRequested;
try {
return JSON.parse(data);
} catch (e) {
if (strictJSONParsing) {
if (e.name === "SyntaxError") {
throw AxiosError_default.from(e, AxiosError_default.ERR_BAD_RESPONSE, this, null, this.response);
}
throw e;
}
}
}
return data;
}],
timeout: 0,
xsrfCookieName: "XSRF-TOKEN",
xsrfHeaderName: "X-XSRF-TOKEN",
maxContentLength: -1,
maxBodyLength: -1,
env: {
FormData: platform_default.classes.FormData,
Blob: platform_default.classes.Blob
},
validateStatus: function validateStatus(status) {
return status >= 200 && status < 300;
},
headers: {
common: {
"Accept": "application/json, text/plain, */*",
"Content-Type": void 0
}
}
};
utils_default.forEach(["delete", "get", "head", "post", "put", "patch"], (method) => {
defaults.headers[method] = {};
});
var defaults_default = defaults;
// node_modules/axios/lib/helpers/parseHeaders.js
"use strict";
var ignoreDuplicateOf = utils_default.toObjectSet([
"age",
"authorization",
"content-length",
"content-type",
"etag",
"expires",
"from",
"host",
"if-modified-since",
"if-unmodified-since",
"last-modified",
"location",
"max-forwards",
"proxy-authorization",
"referer",
"retry-after",
"user-agent"
]);
var parseHeaders_default = (rawHeaders) => {
const parsed = {};
let key;
let val;
let i;
rawHeaders && rawHeaders.split("\n").forEach(function parser(line) {
i = line.indexOf(":");
key = line.substring(0, i).trim().toLowerCase();
val = line.substring(i + 1).trim();
if (!key || parsed[key] && ignoreDuplicateOf[key]) {
return;
}
if (key === "set-cookie") {
if (parsed[key]) {
parsed[key].push(val);
} else {
parsed[key] = [val];
}
} else {
parsed[key] = parsed[key] ? parsed[key] + ", " + val : val;
}
});
return parsed;
};
// node_modules/axios/lib/core/AxiosHeaders.js
"use strict";
var $internals = Symbol("internals");
function normalizeHeader(header) {
return header && String(header).trim().toLowerCase();
}
function normalizeValue(value) {
if (value === false || value == null) {
return value;
}
return utils_default.isArray(value) ? value.map(normalizeValue) : String(value);
}
function parseTokens(str) {
const tokens = Object.create(null);
const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
let match2;
while (match2 = tokensRE.exec(str)) {
tokens[match2[1]] = match2[2];
}
return tokens;
}
var isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());
function matchHeaderValue(context, value, header, filter2, isHeaderNameFilter) {
if (utils_default.isFunction(filter2)) {
return filter2.call(this, value, header);
}
if (isHeaderNameFilter) {
value = header;
}
if (!utils_default.isString(value))
return;
if (utils_default.isString(filter2)) {
return value.indexOf(filter2) !== -1;
}
if (utils_default.isRegExp(filter2)) {
return filter2.test(value);
}
}
function formatHeader(header) {
return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => {
return char.toUpperCase() + str;
});
}
function buildAccessors(obj, header) {
const accessorName = utils_default.toCamelCase(" " + header);
["get", "set", "has"].forEach((methodName) => {
Object.defineProperty(obj, methodName + accessorName, {
value: function(arg1, arg2, arg3) {
return this[methodName].call(this, header, arg1, arg2, arg3);
},
configurable: true
});
});
}
var AxiosHeaders = class {
constructor(headers) {
headers && this.set(headers);
}
set(header, valueOrRewrite, rewrite) {
const self2 = this;
function setHeader(_value, _header, _rewrite) {
const lHeader = normalizeHeader(_header);
if (!lHeader) {
throw new Error("header name must be a non-empty string");
}
const key = utils_default.findKey(self2, lHeader);
if (!key || self2[key] === void 0 || _rewrite === true || _rewrite === void 0 && self2[key] !== false) {
self2[key || _header] = normalizeValue(_value);
}
}
const setHeaders = (headers, _rewrite) => utils_default.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
if (utils_default.isPlainObject(header) || header instanceof this.constructor) {
setHeaders(header, valueOrRewrite);
} else if (utils_default.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
setHeaders(parseHeaders_default(header), valueOrRewrite);
} else if (utils_default.isObject(header) && utils_default.isIterable(header)) {
let obj = {}, dest, key;
for (const entry of header) {
if (!utils_default.isArray(entry)) {
throw TypeError("Object iterator must return a key-value pair");
}
obj[key = entry[0]] = (dest = obj[key]) ? utils_default.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]] : entry[1];
}
setHeaders(obj, valueOrRewrite);
} else {
header != null && setHeader(valueOrRewrite, header, rewrite);
}
return this;
}
get(header, parser) {
header = normalizeHeader(header);
if (header) {
const key = utils_default.findKey(this, header);
if (key) {
const value = this[key];
if (!parser) {
return value;
}
if (parser === true) {
return parseTokens(value);
}
if (utils_default.isFunction(parser)) {
return parser.call(this, value, key);
}
if (utils_default.isRegExp(parser)) {
return parser.exec(value);
}
throw new TypeError("parser must be boolean|regexp|function");
}
}
}
has(header, matcher) {
header = normalizeHeader(header);
if (header) {
const key = utils_default.findKey(this, header);
return !!(key && this[key] !== void 0 && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
}
return false;
}
delete(header, matcher) {
const self2 = this;
let deleted = false;
function deleteHeader(_header) {
_header = normalizeHeader(_header);
if (_header) {
const key = utils_default.findKey(self2, _header);
if (key && (!matcher || matchHeaderValue(self2, self2[key], key, matcher))) {
delete self2[key];
deleted = true;
}
}
}
if (utils_default.isArray(header)) {
header.forEach(deleteHeader);
} else {
deleteHeader(header);
}
return deleted;
}
clear(matcher) {
const keys = Object.keys(this);
let i = keys.length;
let deleted = false;
while (i--) {
const key = keys[i];
if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
delete this[key];
deleted = true;
}
}
return deleted;
}
normalize(format) {
const self2 = this;
const headers = {};
utils_default.forEach(this, (value, header) => {
const key = utils_default.findKey(headers, header);
if (key) {
self2[key] = normalizeValue(value);
delete self2[header];
return;
}
const normalized = format ? formatHeader(header) : String(header).trim();
if (normalized !== header) {
delete self2[header];
}
self2[normalized] = normalizeValue(value);
headers[normalized] = true;
});
return this;
}
concat(...targets) {
return this.constructor.concat(this, ...targets);
}
toJSON(asStrings) {
const obj = Object.create(null);
utils_default.forEach(this, (value, header) => {
value != null && value !== false && (obj[header] = asStrings && utils_default.isArray(value) ? value.join(", ") : value);
});
return obj;
}
[Symbol.iterator]() {
return Object.entries(this.toJSON())[Symbol.iterator]();
}
toString() {
return Object.entries(this.toJSON()).map(([header, value]) => header + ": " + value).join("\n");
}
getSetCookie() {
return this.get("set-cookie") || [];
}
get [Symbol.toStringTag]() {
return "AxiosHeaders";
}
static from(thing) {
return thing instanceof this ? thing : new this(thing);
}
static concat(first, ...targets) {
const computed = new this(first);
targets.forEach((target) => computed.set(target));
return computed;
}
static accessor(header) {
const internals = this[$internals] = this[$internals] = {
accessors: {}
};
const accessors = internals.accessors;
const prototype3 = this.prototype;
function defineAccessor(_header) {
const lHeader = normalizeHeader(_header);
if (!accessors[lHeader]) {
buildAccessors(prototype3, _header);
accessors[lHeader] = true;
}
}
utils_default.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
return this;
}
};
AxiosHeaders.accessor(["Content-Type", "Content-Length", "Accept", "Accept-Encoding", "User-Agent", "Authorization"]);
utils_default.reduceDescriptors(AxiosHeaders.prototype, ({ value }, key) => {
let mapped = key[0].toUpperCase() + key.slice(1);
return {
get: () => value,
set(headerValue) {
this[mapped] = headerValue;
}
};
});
utils_default.freezeMethods(AxiosHeaders);
var AxiosHeaders_default = AxiosHeaders;
// node_modules/axios/lib/core/transformData.js
"use strict";
function transformData(fns, response) {
const config = this || defaults_default;
const context = response || config;
const headers = AxiosHeaders_default.from(context.headers);
let data = context.data;
utils_default.forEach(fns, function transform(fn) {
data = fn.call(config, data, headers.normalize(), response ? response.status : void 0);
});
headers.normalize();
return data;
}
// node_modules/axios/lib/cancel/isCancel.js
"use strict";
function isCancel(value) {
return !!(value && value.__CANCEL__);
}
// node_modules/axios/lib/cancel/CanceledError.js
"use strict";
function CanceledError(message, config, request2) {
AxiosError_default.call(this, message == null ? "canceled" : message, AxiosError_default.ERR_CANCELED, config, request2);
this.name = "CanceledError";
}
utils_default.inherits(CanceledError, AxiosError_default, {
__CANCEL__: true
});
var CanceledError_default = CanceledError;
// node_modules/axios/lib/core/settle.js
"use strict";
function settle(resolve, reject, response) {
const validateStatus2 = response.config.validateStatus;
if (!response.status || !validateStatus2 || validateStatus2(response.status)) {
resolve(response);
} else {
reject(new AxiosError_default("Request failed with status code " + response.status, [AxiosError_default.ERR_BAD_REQUEST, AxiosError_default.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], response.config, response.request, response));
}
}
// node_modules/axios/lib/helpers/isAbsoluteURL.js
"use strict";
function isAbsoluteURL(url2) {
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url2);
}
// node_modules/axios/lib/helpers/combineURLs.js
"use strict";
function combineURLs(baseURL, relativeURL) {
return relativeURL ? baseURL.replace(/\/?\/$/, "") + "/" + relativeURL.replace(/^\/+/, "") : baseURL;
}
// node_modules/axios/lib/core/buildFullPath.js
"use strict";
function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
let isRelativeUrl = !isAbsoluteURL(requestedURL);
if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {
return combineURLs(baseURL, requestedURL);
}
return requestedURL;
}
// node_modules/axios/lib/adapters/http.js
var import_proxy_from_env = __toModule(require_proxy_from_env());
var import_http = __toModule(require("http"));
var import_https = __toModule(require("https"));
var import_util2 = __toModule(require("util"));
var import_follow_redirects = __toModule(require_follow_redirects());
var import_zlib = __toModule(require("zlib"));
// node_modules/axios/lib/env/data.js
var VERSION = "1.10.0";
// node_modules/axios/lib/helpers/parseProtocol.js
"use strict";
function parseProtocol(url2) {
const match2 = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url2);
return match2 && match2[1] || "";
}
// node_modules/axios/lib/helpers/fromDataURI.js
"use strict";
var DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
function fromDataURI(uri, asBlob, options) {
const _Blob = options && options.Blob || platform_default.classes.Blob;
const protocol = parseProtocol(uri);
if (asBlob === void 0 && _Blob) {
asBlob = true;
}
if (protocol === "data") {
uri = protocol.length ? uri.slice(protocol.length + 1) : uri;
const match2 = DATA_URL_PATTERN.exec(uri);
if (!match2) {
throw new AxiosError_default("Invalid URL", AxiosError_default.ERR_INVALID_URL);
}
const mime = match2[1];
const isBase64 = match2[2];
const body = match2[3];
const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? "base64" : "utf8");
if (asBlob) {
if (!_Blob) {
throw new AxiosError_default("Blob is not supported", AxiosError_default.ERR_NOT_SUPPORT);
}
return new _Blob([buffer], { type: mime });
}
return buffer;
}
throw new AxiosError_default("Unsupported protocol " + protocol, AxiosError_default.ERR_NOT_SUPPORT);
}
// node_modules/axios/lib/adapters/http.js
var import_stream4 = __toModule(require("stream"));
// node_modules/axios/lib/helpers/AxiosTransformStream.js
var import_stream = __toModule(require("stream"));
"use strict";
var kInternals = Symbol("internals");
var AxiosTransformStream = class extends import_stream.default.Transform {
constructor(options) {
options = utils_default.toFlatObject(options, {
maxRate: 0,
chunkSize: 64 * 1024,
minChunkSize: 100,
timeWindow: 500,
ticksRate: 2,
samplesCount: 15
}, null, (prop, source) => {
return !utils_default.isUndefined(source[prop]);
});
super({
readableHighWaterMark: options.chunkSize
});
const internals = this[kInternals] = {
timeWindow: options.timeWindow,
chunkSize: options.chunkSize,
maxRate: options.maxRate,
minChunkSize: options.minChunkSize,
bytesSeen: 0,
isCaptured: false,
notifiedBytesLoaded: 0,
ts: Date.now(),
bytes: 0,
onReadCallback: null
};
this.on("newListener", (event) => {
if (event === "progress") {
if (!internals.isCaptured) {
internals.isCaptured = true;
}
}
});
}
_read(size) {
const internals = this[kInternals];
if (internals.onReadCallback) {
internals.onReadCallback();
}
return super._read(size);
}
_transform(chunk, encoding, callback) {
const internals = this[kInternals];
const maxRate = internals.maxRate;
const readableHighWaterMark = this.readableHighWaterMark;
const timeWindow = internals.timeWindow;
const divider = 1e3 / timeWindow;
const bytesThreshold = maxRate / divider;
const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;
const pushChunk = (_chunk, _callback) => {
const bytes = Buffer.byteLength(_chunk);
internals.bytesSeen += bytes;
internals.bytes += bytes;
internals.isCaptured && this.emit("progress", internals.bytesSeen);
if (this.push(_chunk)) {
process.nextTick(_callback);
} else {
internals.onReadCallback = () => {
internals.onReadCallback = null;
process.nextTick(_callback);
};
}
};
const transformChunk = (_chunk, _callback) => {
const chunkSize = Buffer.byteLength(_chunk);
let chunkRemainder = null;
let maxChunkSize = readableHighWaterMark;
let bytesLeft;
let passed = 0;
if (maxRate) {
const now = Date.now();
if (!internals.ts || (passed = now - internals.ts) >= timeWindow) {
internals.ts = now;
bytesLeft = bytesThreshold - internals.bytes;
internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;
passed = 0;
}
bytesLeft = bytesThreshold - internals.bytes;
}
if (maxRate) {
if (bytesLeft <= 0) {
return setTimeout(() => {
_callback(null, _chunk);
}, timeWindow - passed);
}
if (bytesLeft < maxChunkSize) {
maxChunkSize = bytesLeft;
}
}
if (maxChunkSize && chunkSize > maxChunkSize && chunkSize - maxChunkSize > minChunkSize) {
chunkRemainder = _chunk.subarray(maxChunkSize);
_chunk = _chunk.subarray(0, maxChunkSize);
}
pushChunk(_chunk, chunkRemainder ? () => {
process.nextTick(_callback, null, chunkRemainder);
} : _callback);
};
transformChunk(chunk, function transformNextChunk(err, _chunk) {
if (err) {
return callback(err);
}
if (_chunk) {
transformChunk(_chunk, transformNextChunk);
} else {
callback(null);
}
});
}
};
var AxiosTransformStream_default = AxiosTransformStream;
// node_modules/axios/lib/adapters/http.js
var import_events = __toModule(require("events"));
// node_modules/axios/lib/helpers/formDataToStream.js
var import_util = __toModule(require("util"));
var import_stream2 = __toModule(require("stream"));
// node_modules/axios/lib/helpers/readBlob.js
var { asyncIterator } = Symbol;
var readBlob = async function* (blob) {
if (blob.stream) {
yield* blob.stream();
} else if (blob.arrayBuffer) {
yield await blob.arrayBuffer();
} else if (blob[asyncIterator]) {
yield* blob[asyncIterator]();
} else {
yield blob;
}
};
var readBlob_default = readBlob;
// node_modules/axios/lib/helpers/formDataToStream.js
var BOUNDARY_ALPHABET = platform_default.ALPHABET.ALPHA_DIGIT + "-_";
var textEncoder = typeof TextEncoder === "function" ? new TextEncoder() : new import_util.default.TextEncoder();
var CRLF = "\r\n";
var CRLF_BYTES = textEncoder.encode(CRLF);
var CRLF_BYTES_COUNT = 2;
var FormDataPart = class {
constructor(name, value) {
const { escapeName } = this.constructor;
const isStringValue = utils_default.isString(value);
let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${!isStringValue && value.name ? `; filename="${escapeName(value.name)}"` : ""}${CRLF}`;
if (isStringValue) {
value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF));
} else {
headers += `Content-Type: ${value.type || "application/octet-stream"}${CRLF}`;
}
this.headers = textEncoder.encode(headers + CRLF);
this.contentLength = isStringValue ? value.byteLength : value.size;
this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;
this.name = name;
this.value = value;
}
async *encode() {
yield this.headers;
const { value } = this;
if (utils_default.isTypedArray(value)) {
yield value;
} else {
yield* readBlob_default(value);
}
yield CRLF_BYTES;
}
static escapeName(name) {
return String(name).replace(/[\r\n"]/g, (match2) => ({
"\r": "%0D",
"\n": "%0A",
'"': "%22"
})[match2]);
}
};
var formDataToStream = (form, headersHandler, options) => {
const {
tag = "form-data-boundary",
size = 25,
boundary = tag + "-" + platform_default.generateString(size, BOUNDARY_ALPHABET)
} = options || {};
if (!utils_default.isFormData(form)) {
throw TypeError("FormData instance required");
}
if (boundary.length < 1 || boundary.length > 70) {
throw Error("boundary must be 10-70 characters long");
}
const boundaryBytes = textEncoder.encode("--" + boundary + CRLF);
const footerBytes = textEncoder.encode("--" + boundary + "--" + CRLF);
let contentLength = footerBytes.byteLength;
const parts = Array.from(form.entries()).map(([name, value]) => {
const part = new FormDataPart(name, value);
contentLength += part.size;
return part;
});
contentLength += boundaryBytes.byteLength * parts.length;
contentLength = utils_default.toFiniteNumber(contentLength);
const computedHeaders = {
"Content-Type": `multipart/form-data; boundary=${boundary}`
};
if (Number.isFinite(contentLength)) {
computedHeaders["Content-Length"] = contentLength;
}
headersHandler && headersHandler(computedHeaders);
return import_stream2.Readable.from(async function* () {
for (const part of parts) {
yield boundaryBytes;
yield* part.encode();
}
yield footerBytes;
}());
};
var formDataToStream_default = formDataToStream;
// node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js
var import_stream3 = __toModule(require("stream"));
"use strict";
var ZlibHeaderTransformStream = class extends import_stream3.default.Transform {
__transform(chunk, encoding, callback) {
this.push(chunk);
callback();
}
_transform(chunk, encoding, callback) {
if (chunk.length !== 0) {
this._transform = this.__transform;
if (chunk[0] !== 120) {
const header = Buffer.alloc(2);
header[0] = 120;
header[1] = 156;
this.push(header, encoding);
}
}
this.__transform(chunk, encoding, callback);
}
};
var ZlibHeaderTransformStream_default = ZlibHeaderTransformStream;
// node_modules/axios/lib/helpers/callbackify.js
var callbackify = (fn, reducer) => {
return utils_default.isAsyncFn(fn) ? function(...args) {
const cb = args.pop();
fn.apply(this, args).then((value) => {
try {
reducer ? cb(null, ...reducer(value)) : cb(null, value);
} catch (err) {
cb(err);
}
}, cb);
} : fn;
};
var callbackify_default = callbackify;
// node_modules/axios/lib/helpers/speedometer.js
"use strict";
function speedometer(samplesCount, min) {
samplesCount = samplesCount || 10;
const bytes = new Array(samplesCount);
const timestamps = new Array(samplesCount);
let head = 0;
let tail = 0;
let firstSampleTS;
min = min !== void 0 ? min : 1e3;
return function push(chunkLength) {
const now = Date.now();
const startedAt = timestamps[tail];
if (!firstSampleTS) {
firstSampleTS = now;
}
bytes[head] = chunkLength;
timestamps[head] = now;
let i = tail;
let bytesCount = 0;
while (i !== head) {
bytesCount += bytes[i++];
i = i % samplesCount;
}
head = (head + 1) % samplesCount;
if (head === tail) {
tail = (tail + 1) % samplesCount;
}
if (now - firstSampleTS < min) {
return;
}
const passed = startedAt && now - startedAt;
return passed ? Math.round(bytesCount * 1e3 / passed) : void 0;
};
}
var speedometer_default = speedometer;
// node_modules/axios/lib/helpers/throttle.js
function throttle(fn, freq) {
let timestamp = 0;
let threshold = 1e3 / freq;
let lastArgs;
let timer;
const invoke = (args, now = Date.now()) => {
timestamp = now;
lastArgs = null;
if (timer) {
clearTimeout(timer);
timer = null;
}
fn.apply(null, args);
};
const throttled = (...args) => {
const now = Date.now();
const passed = now - timestamp;
if (passed >= threshold) {
invoke(args, now);
} else {
lastArgs = args;
if (!timer) {
timer = setTimeout(() => {
timer = null;
invoke(lastArgs);
}, threshold - passed);
}
}
};
const flush = () => lastArgs && invoke(lastArgs);
return [throttled, flush];
}
var throttle_default = throttle;
// node_modules/axios/lib/helpers/progressEventReducer.js
var progressEventReducer = (listener, isDownloadStream, freq = 3) => {
let bytesNotified = 0;
const _speedometer = speedometer_default(50, 250);
return throttle_default((e) => {
const loaded = e.loaded;
const total = e.lengthComputable ? e.total : void 0;
const progressBytes = loaded - bytesNotified;
const rate = _speedometer(progressBytes);
const inRange = loaded <= total;
bytesNotified = loaded;
const data = {
loaded,
total,
progress: total ? loaded / total : void 0,
bytes: progressBytes,
rate: rate ? rate : void 0,
estimated: rate && total && inRange ? (total - loaded) / rate : void 0,
event: e,
lengthComputable: total != null,
[isDownloadStream ? "download" : "upload"]: true
};
listener(data);
}, freq);
};
var progressEventDecorator = (total, throttled) => {
const lengthComputable = total != null;
return [(loaded) => throttled[0]({
lengthComputable,
total,
loaded
}), throttled[1]];
};
var asyncDecorator = (fn) => (...args) => utils_default.asap(() => fn(...args));
// node_modules/axios/lib/adapters/http.js
"use strict";
var zlibOptions = {
flush: import_zlib.default.constants.Z_SYNC_FLUSH,
finishFlush: import_zlib.default.constants.Z_SYNC_FLUSH
};
var brotliOptions = {
flush: import_zlib.default.constants.BROTLI_OPERATION_FLUSH,
finishFlush: import_zlib.default.constants.BROTLI_OPERATION_FLUSH
};
var isBrotliSupported = utils_default.isFunction(import_zlib.default.createBrotliDecompress);
var { http: httpFollow, https: httpsFollow } = import_follow_redirects.default;
var isHttps = /https:?/;
var supportedProtocols = platform_default.protocols.map((protocol) => {
return protocol + ":";
});
var flushOnFinish = (stream4, [throttled, flush]) => {
stream4.on("end", flush).on("error", flush);
return throttled;
};
function dispatchBeforeRedirect(options, responseDetails) {
if (options.beforeRedirects.proxy) {
options.beforeRedirects.proxy(options);
}
if (options.beforeRedirects.config) {
options.beforeRedirects.config(options, responseDetails);
}
}
function setProxy(options, configProxy, location) {
let proxy = configProxy;
if (!proxy && proxy !== false) {
const proxyUrl = import_proxy_from_env.default.getProxyForUrl(location);
if (proxyUrl) {
proxy = new URL(proxyUrl);
}
}
if (proxy) {
if (proxy.username) {
proxy.auth = (proxy.username || "") + ":" + (proxy.password || "");
}
if (proxy.auth) {
if (proxy.auth.username || proxy.auth.password) {
proxy.auth = (proxy.auth.username || "") + ":" + (proxy.auth.password || "");
}
const base64 = Buffer.from(proxy.auth, "utf8").toString("base64");
options.headers["Proxy-Authorization"] = "Basic " + base64;
}
options.headers.host = options.hostname + (options.port ? ":" + options.port : "");
const proxyHost = proxy.hostname || proxy.host;
options.hostname = proxyHost;
options.host = proxyHost;
options.port = proxy.port;
options.path = location;
if (proxy.protocol) {
options.protocol = proxy.protocol.includes(":") ? proxy.protocol : `${proxy.protocol}:`;
}
}
options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {
setProxy(redirectOptions, configProxy, redirectOptions.href);
};
}
var isHttpAdapterSupported = typeof process !== "undefined" && utils_default.kindOf(process) === "process";
var wrapAsync = (asyncExecutor) => {
return new Promise((resolve, reject) => {
let onDone;
let isDone;
const done = (value, isRejected) => {
if (isDone)
return;
isDone = true;
onDone && onDone(value, isRejected);
};
const _resolve = (value) => {
done(value);
resolve(value);
};
const _reject = (reason) => {
done(reason, true);
reject(reason);
};
asyncExecutor(_resolve, _reject, (onDoneHandler) => onDone = onDoneHandler).catch(_reject);
});
};
var resolveFamily = ({ address, family }) => {
if (!utils_default.isString(address)) {
throw TypeError("address must be a string");
}
return {
address,
family: family || (address.indexOf(".") < 0 ? 6 : 4)
};
};
var buildAddressEntry = (address, family) => resolveFamily(utils_default.isObject(address) ? address : { address, family });
var http_default = isHttpAdapterSupported && function httpAdapter(config) {
return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {
let { data, lookup, family } = config;
const { responseType, responseEncoding } = config;
const method = config.method.toUpperCase();
let isDone;
let rejected = false;
let req;
if (lookup) {
const _lookup = callbackify_default(lookup, (value) => utils_default.isArray(value) ? value : [value]);
lookup = (hostname, opt, cb) => {
_lookup(hostname, opt, (err, arg0, arg1) => {
if (err) {
return cb(err);
}
const addresses = utils_default.isArray(arg0) ? arg0.map((addr) => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];
opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);
});
};
}
const emitter = new import_events.EventEmitter();
const onFinished = () => {
if (config.cancelToken) {
config.cancelToken.unsubscribe(abort);
}
if (config.signal) {
config.signal.removeEventListener("abort", abort);
}
emitter.removeAllListeners();
};
onDone((value, isRejected) => {
isDone = true;
if (isRejected) {
rejected = true;
onFinished();
}
});
function abort(reason) {
emitter.emit("abort", !reason || reason.type ? new CanceledError_default(null, config, req) : reason);
}
emitter.once("abort", reject);
if (config.cancelToken || config.signal) {
config.cancelToken && config.cancelToken.subscribe(abort);
if (config.signal) {
config.signal.aborted ? abort() : config.signal.addEventListener("abort", abort);
}
}
const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
const parsed = new URL(fullPath, platform_default.hasBrowserEnv ? platform_default.origin : void 0);
const protocol = parsed.protocol || supportedProtocols[0];
if (protocol === "data:") {
let convertedData;
if (method !== "GET") {
return settle(resolve, reject, {
status: 405,
statusText: "method not allowed",
headers: {},
config
});
}
try {
convertedData = fromDataURI(config.url, responseType === "blob", {
Blob: config.env && config.env.Blob
});
} catch (err) {
throw AxiosError_default.from(err, AxiosError_default.ERR_BAD_REQUEST, config);
}
if (responseType === "text") {
convertedData = convertedData.toString(responseEncoding);
if (!responseEncoding || responseEncoding === "utf8") {
convertedData = utils_default.stripBOM(convertedData);
}
} else if (responseType === "stream") {
convertedData = import_stream4.default.Readable.from(convertedData);
}
return settle(resolve, reject, {
data: convertedData,
status: 200,
statusText: "OK",
headers: new AxiosHeaders_default(),
config
});
}
if (supportedProtocols.indexOf(protocol) === -1) {
return reject(new AxiosError_default("Unsupported protocol " + protocol, AxiosError_default.ERR_BAD_REQUEST, config));
}
const headers = AxiosHeaders_default.from(config.headers).normalize();
headers.set("User-Agent", "axios/" + VERSION, false);
const { onUploadProgress, onDownloadProgress } = config;
const maxRate = config.maxRate;
let maxUploadRate = void 0;
let maxDownloadRate = void 0;
if (utils_default.isSpecCompliantForm(data)) {
const userBoundary = headers.getContentType(/boundary=([-_\w\d]{10,70})/i);
data = formDataToStream_default(data, (formHeaders) => {
headers.set(formHeaders);
}, {
tag: `axios-${VERSION}-boundary`,
boundary: userBoundary && userBoundary[1] || void 0
});
} else if (utils_default.isFormData(data) && utils_default.isFunction(data.getHeaders)) {
headers.set(data.getHeaders());
if (!headers.hasContentLength()) {
try {
const knownLength = await import_util2.default.promisify(data.getLength).call(data);
Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);
} catch (e) {
}
}
} else if (utils_default.isBlob(data) || utils_default.isFile(data)) {
data.size && headers.setContentType(data.type || "application/octet-stream");
headers.setContentLength(data.size || 0);
data = import_stream4.default.Readable.from(readBlob_default(data));
} else if (data && !utils_default.isStream(data)) {
if (Buffer.isBuffer(data)) {
} else if (utils_default.isArrayBuffer(data)) {
data = Buffer.from(new Uint8Array(data));
} else if (utils_default.isString(data)) {
data = Buffer.from(data, "utf-8");
} else {
return reject(new AxiosError_default("Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream", AxiosError_default.ERR_BAD_REQUEST, config));
}
headers.setContentLength(data.length, false);
if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {
return reject(new AxiosError_default("Request body larger than maxBodyLength limit", AxiosError_default.ERR_BAD_REQUEST, config));
}
}
const contentLength = utils_default.toFiniteNumber(headers.getContentLength());
if (utils_default.isArray(maxRate)) {
maxUploadRate = maxRate[0];
maxDownloadRate = maxRate[1];
} else {
maxUploadRate = maxDownloadRate = maxRate;
}
if (data && (onUploadProgress || maxUploadRate)) {
if (!utils_default.isStream(data)) {
data = import_stream4.default.Readable.from(data, { objectMode: false });
}
data = import_stream4.default.pipeline([data, new AxiosTransformStream_default({
maxRate: utils_default.toFiniteNumber(maxUploadRate)
})], utils_default.noop);
onUploadProgress && data.on("progress", flushOnFinish(data, progressEventDecorator(contentLength, progressEventReducer(asyncDecorator(onUploadProgress), false, 3))));
}
let auth = void 0;
if (config.auth) {
const username = config.auth.username || "";
const password = config.auth.password || "";
auth = username + ":" + password;
}
if (!auth && parsed.username) {
const urlUsername = parsed.username;
const urlPassword = parsed.password;
auth = urlUsername + ":" + urlPassword;
}
auth && headers.delete("authorization");
let path;
try {
path = buildURL(parsed.pathname + parsed.search, config.params, config.paramsSerializer).replace(/^\?/, "");
} catch (err) {
const customErr = new Error(err.message);
customErr.config = config;
customErr.url = config.url;
customErr.exists = true;
return reject(customErr);
}
headers.set("Accept-Encoding", "gzip, compress, deflate" + (isBrotliSupported ? ", br" : ""), false);
const options = {
path,
method,
headers: headers.toJSON(),
agents: { http: config.httpAgent, https: config.httpsAgent },
auth,
protocol,
family,
beforeRedirect: dispatchBeforeRedirect,
beforeRedirects: {}
};
!utils_default.isUndefined(lookup) && (options.lookup = lookup);
if (config.socketPath) {
options.socketPath = config.socketPath;
} else {
options.hostname = parsed.hostname.startsWith("[") ? parsed.hostname.slice(1, -1) : parsed.hostname;
options.port = parsed.port;
setProxy(options, config.proxy, protocol + "//" + parsed.hostname + (parsed.port ? ":" + parsed.port : "") + options.path);
}
let transport;
const isHttpsRequest = isHttps.test(options.protocol);
options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;
if (config.transport) {
transport = config.transport;
} else if (config.maxRedirects === 0) {
transport = isHttpsRequest ? import_https.default : import_http.default;
} else {
if (config.maxRedirects) {
options.maxRedirects = config.maxRedirects;
}
if (config.beforeRedirect) {
options.beforeRedirects.config = config.beforeRedirect;
}
transport = isHttpsRequest ? httpsFollow : httpFollow;
}
if (config.maxBodyLength > -1) {
options.maxBodyLength = config.maxBodyLength;
} else {
options.maxBodyLength = Infinity;
}
if (config.insecureHTTPParser) {
options.insecureHTTPParser = config.insecureHTTPParser;
}
req = transport.request(options, function handleResponse(res) {
if (req.destroyed)
return;
const streams = [res];
const responseLength = +res.headers["content-length"];
if (onDownloadProgress || maxDownloadRate) {
const transformStream = new AxiosTransformStream_default({
maxRate: utils_default.toFiniteNumber(maxDownloadRate)
});
onDownloadProgress && transformStream.on("progress", flushOnFinish(transformStream, progressEventDecorator(responseLength, progressEventReducer(asyncDecorator(onDownloadProgress), true, 3))));
streams.push(transformStream);
}
let responseStream = res;
const lastRequest = res.req || req;
if (config.decompress !== false && res.headers["content-encoding"]) {
if (method === "HEAD" || res.statusCode === 204) {
delete res.headers["content-encoding"];
}
switch ((res.headers["content-encoding"] || "").toLowerCase()) {
case "gzip":
case "x-gzip":
case "compress":
case "x-compress":
streams.push(import_zlib.default.createUnzip(zlibOptions));
delete res.headers["content-encoding"];
break;
case "deflate":
streams.push(new ZlibHeaderTransformStream_default());
streams.push(import_zlib.default.createUnzip(zlibOptions));
delete res.headers["content-encoding"];
break;
case "br":
if (isBrotliSupported) {
streams.push(import_zlib.default.createBrotliDecompress(brotliOptions));
delete res.headers["content-encoding"];
}
}
}
responseStream = streams.length > 1 ? import_stream4.default.pipeline(streams, utils_default.noop) : streams[0];
const offListeners = import_stream4.default.finished(responseStream, () => {
offListeners();
onFinished();
});
const response = {
status: res.statusCode,
statusText: res.statusMessage,
headers: new AxiosHeaders_default(res.headers),
config,
request: lastRequest
};
if (responseType === "stream") {
response.data = responseStream;
settle(resolve, reject, response);
} else {
const responseBuffer = [];
let totalResponseBytes = 0;
responseStream.on("data", function handleStreamData(chunk) {
responseBuffer.push(chunk);
totalResponseBytes += chunk.length;
if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {
rejected = true;
responseStream.destroy();
reject(new AxiosError_default("maxContentLength size of " + config.maxContentLength + " exceeded", AxiosError_default.ERR_BAD_RESPONSE, config, lastRequest));
}
});
responseStream.on("aborted", function handlerStreamAborted() {
if (rejected) {
return;
}
const err = new AxiosError_default("stream has been aborted", AxiosError_default.ERR_BAD_RESPONSE, config, lastRequest);
responseStream.destroy(err);
reject(err);
});
responseStream.on("error", function handleStreamError(err) {
if (req.destroyed)
return;
reject(AxiosError_default.from(err, null, config, lastRequest));
});
responseStream.on("end", function handleStreamEnd() {
try {
let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);
if (responseType !== "arraybuffer") {
responseData = responseData.toString(responseEncoding);
if (!responseEncoding || responseEncoding === "utf8") {
responseData = utils_default.stripBOM(responseData);
}
}
response.data = responseData;
} catch (err) {
return reject(AxiosError_default.from(err, null, config, response.request, response));
}
settle(resolve, reject, response);
});
}
emitter.once("abort", (err) => {
if (!responseStream.destroyed) {
responseStream.emit("error", err);
responseStream.destroy();
}
});
});
emitter.once("abort", (err) => {
reject(err);
req.destroy(err);
});
req.on("error", function handleRequestError(err) {
reject(AxiosError_default.from(err, null, config, req));
});
req.on("socket", function handleRequestSocket(socket) {
socket.setKeepAlive(true, 1e3 * 60);
});
if (config.timeout) {
const timeout = parseInt(config.timeout, 10);
if (Number.isNaN(timeout)) {
reject(new AxiosError_default("error trying to parse `config.timeout` to int", AxiosError_default.ERR_BAD_OPTION_VALUE, config, req));
return;
}
req.setTimeout(timeout, function handleRequestTimeout() {
if (isDone)
return;
let timeoutErrorMessage = config.timeout ? "timeout of " + config.timeout + "ms exceeded" : "timeout exceeded";
const transitional2 = config.transitional || transitional_default;
if (config.timeoutErrorMessage) {
timeoutErrorMessage = config.timeoutErrorMessage;
}
reject(new AxiosError_default(timeoutErrorMessage, transitional2.clarifyTimeoutError ? AxiosError_default.ETIMEDOUT : AxiosError_default.ECONNABORTED, config, req));
abort();
});
}
if (utils_default.isStream(data)) {
let ended = false;
let errored = false;
data.on("end", () => {
ended = true;
});
data.once("error", (err) => {
errored = true;
req.destroy(err);
});
data.on("close", () => {
if (!ended && !errored) {
abort(new CanceledError_default("Request stream has been aborted", config, req));
}
});
data.pipe(req);
} else {
req.end(data);
}
});
};
// node_modules/axios/lib/helpers/isURLSameOrigin.js
var isURLSameOrigin_default = platform_default.hasStandardBrowserEnv ? ((origin2, isMSIE) => (url2) => {
url2 = new URL(url2, platform_default.origin);
return origin2.protocol === url2.protocol && origin2.host === url2.host && (isMSIE || origin2.port === url2.port);
})(new URL(platform_default.origin), platform_default.navigator && /(msie|trident)/i.test(platform_default.navigator.userAgent)) : () => true;
// node_modules/axios/lib/helpers/cookies.js
var cookies_default = platform_default.hasStandardBrowserEnv ? {
write(name, value, expires, path, domain, secure) {
const cookie = [name + "=" + encodeURIComponent(value)];
utils_default.isNumber(expires) && cookie.push("expires=" + new Date(expires).toGMTString());
utils_default.isString(path) && cookie.push("path=" + path);
utils_default.isString(domain) && cookie.push("domain=" + domain);
secure === true && cookie.push("secure");
document.cookie = cookie.join("; ");
},
read(name) {
const match2 = document.cookie.match(new RegExp("(^|;\\s*)(" + name + ")=([^;]*)"));
return match2 ? decodeURIComponent(match2[3]) : null;
},
remove(name) {
this.write(name, "", Date.now() - 864e5);
}
} : {
write() {
},
read() {
return null;
},
remove() {
}
};
// node_modules/axios/lib/core/mergeConfig.js
"use strict";
var headersToObject = (thing) => thing instanceof AxiosHeaders_default ? { ...thing } : thing;
function mergeConfig(config1, config2) {
config2 = config2 || {};
const config = {};
function getMergedValue(target, source, prop, caseless) {
if (utils_default.isPlainObject(target) && utils_default.isPlainObject(source)) {
return utils_default.merge.call({ caseless }, target, source);
} else if (utils_default.isPlainObject(source)) {
return utils_default.merge({}, source);
} else if (utils_default.isArray(source)) {
return source.slice();
}
return source;
}
function mergeDeepProperties(a, b, prop, caseless) {
if (!utils_default.isUndefined(b)) {
return getMergedValue(a, b, prop, caseless);
} else if (!utils_default.isUndefined(a)) {
return getMergedValue(void 0, a, prop, caseless);
}
}
function valueFromConfig2(a, b) {
if (!utils_default.isUndefined(b)) {
return getMergedValue(void 0, b);
}
}
function defaultToConfig2(a, b) {
if (!utils_default.isUndefined(b)) {
return getMergedValue(void 0, b);
} else if (!utils_default.isUndefined(a)) {
return getMergedValue(void 0, a);
}
}
function mergeDirectKeys(a, b, prop) {
if (prop in config2) {
return getMergedValue(a, b);
} else if (prop in config1) {
return getMergedValue(void 0, a);
}
}
const mergeMap = {
url: valueFromConfig2,
method: valueFromConfig2,
data: valueFromConfig2,
baseURL: defaultToConfig2,
transformRequest: defaultToConfig2,
transformResponse: defaultToConfig2,
paramsSerializer: defaultToConfig2,
timeout: defaultToConfig2,
timeoutMessage: defaultToConfig2,
withCredentials: defaultToConfig2,
withXSRFToken: defaultToConfig2,
adapter: defaultToConfig2,
responseType: defaultToConfig2,
xsrfCookieName: defaultToConfig2,
xsrfHeaderName: defaultToConfig2,
onUploadProgress: defaultToConfig2,
onDownloadProgress: defaultToConfig2,
decompress: defaultToConfig2,
maxContentLength: defaultToConfig2,
maxBodyLength: defaultToConfig2,
beforeRedirect: defaultToConfig2,
transport: defaultToConfig2,
httpAgent: defaultToConfig2,
httpsAgent: defaultToConfig2,
cancelToken: defaultToConfig2,
socketPath: defaultToConfig2,
responseEncoding: defaultToConfig2,
validateStatus: mergeDirectKeys,
headers: (a, b, prop) => mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true)
};
utils_default.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {
const merge2 = mergeMap[prop] || mergeDeepProperties;
const configValue = merge2(config1[prop], config2[prop], prop);
utils_default.isUndefined(configValue) && merge2 !== mergeDirectKeys || (config[prop] = configValue);
});
return config;
}
// node_modules/axios/lib/helpers/resolveConfig.js
var resolveConfig_default = (config) => {
const newConfig = mergeConfig({}, config);
let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;
newConfig.headers = headers = AxiosHeaders_default.from(headers);
newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);
if (auth) {
headers.set("Authorization", "Basic " + btoa((auth.username || "") + ":" + (auth.password ? unescape(encodeURIComponent(auth.password)) : "")));
}
let contentType;
if (utils_default.isFormData(data)) {
if (platform_default.hasStandardBrowserEnv || platform_default.hasStandardBrowserWebWorkerEnv) {
headers.setContentType(void 0);
} else if ((contentType = headers.getContentType()) !== false) {
const [type, ...tokens] = contentType ? contentType.split(";").map((token) => token.trim()).filter(Boolean) : [];
headers.setContentType([type || "multipart/form-data", ...tokens].join("; "));
}
}
if (platform_default.hasStandardBrowserEnv) {
withXSRFToken && utils_default.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));
if (withXSRFToken || withXSRFToken !== false && isURLSameOrigin_default(newConfig.url)) {
const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies_default.read(xsrfCookieName);
if (xsrfValue) {
headers.set(xsrfHeaderName, xsrfValue);
}
}
}
return newConfig;
};
// node_modules/axios/lib/adapters/xhr.js
var isXHRAdapterSupported = typeof XMLHttpRequest !== "undefined";
var xhr_default = isXHRAdapterSupported && function(config) {
return new Promise(function dispatchXhrRequest(resolve, reject) {
const _config = resolveConfig_default(config);
let requestData = _config.data;
const requestHeaders = AxiosHeaders_default.from(_config.headers).normalize();
let { responseType, onUploadProgress, onDownloadProgress } = _config;
let onCanceled;
let uploadThrottled, downloadThrottled;
let flushUpload, flushDownload;
function done() {
flushUpload && flushUpload();
flushDownload && flushDownload();
_config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);
_config.signal && _config.signal.removeEventListener("abort", onCanceled);
}
let request2 = new XMLHttpRequest();
request2.open(_config.method.toUpperCase(), _config.url, true);
request2.timeout = _config.timeout;
function onloadend() {
if (!request2) {
return;
}
const responseHeaders = AxiosHeaders_default.from("getAllResponseHeaders" in request2 && request2.getAllResponseHeaders());
const responseData = !responseType || responseType === "text" || responseType === "json" ? request2.responseText : request2.response;
const response = {
data: responseData,
status: request2.status,
statusText: request2.statusText,
headers: responseHeaders,
config,
request: request2
};
settle(function _resolve(value) {
resolve(value);
done();
}, function _reject(err) {
reject(err);
done();
}, response);
request2 = null;
}
if ("onloadend" in request2) {
request2.onloadend = onloadend;
} else {
request2.onreadystatechange = function handleLoad() {
if (!request2 || request2.readyState !== 4) {
return;
}
if (request2.status === 0 && !(request2.responseURL && request2.responseURL.indexOf("file:") === 0)) {
return;
}
setTimeout(onloadend);
};
}
request2.onabort = function handleAbort() {
if (!request2) {
return;
}
reject(new AxiosError_default("Request aborted", AxiosError_default.ECONNABORTED, config, request2));
request2 = null;
};
request2.onerror = function handleError() {
reject(new AxiosError_default("Network Error", AxiosError_default.ERR_NETWORK, config, request2));
request2 = null;
};
request2.ontimeout = function handleTimeout() {
let timeoutErrorMessage = _config.timeout ? "timeout of " + _config.timeout + "ms exceeded" : "timeout exceeded";
const transitional2 = _config.transitional || transitional_default;
if (_config.timeoutErrorMessage) {
timeoutErrorMessage = _config.timeoutErrorMessage;
}
reject(new AxiosError_default(timeoutErrorMessage, transitional2.clarifyTimeoutError ? AxiosError_default.ETIMEDOUT : AxiosError_default.ECONNABORTED, config, request2));
request2 = null;
};
requestData === void 0 && requestHeaders.setContentType(null);
if ("setRequestHeader" in request2) {
utils_default.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {
request2.setRequestHeader(key, val);
});
}
if (!utils_default.isUndefined(_config.withCredentials)) {
request2.withCredentials = !!_config.withCredentials;
}
if (responseType && responseType !== "json") {
request2.responseType = _config.responseType;
}
if (onDownloadProgress) {
[downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true);
request2.addEventListener("progress", downloadThrottled);
}
if (onUploadProgress && request2.upload) {
[uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress);
request2.upload.addEventListener("progress", uploadThrottled);
request2.upload.addEventListener("loadend", flushUpload);
}
if (_config.cancelToken || _config.signal) {
onCanceled = (cancel) => {
if (!request2) {
return;
}
reject(!cancel || cancel.type ? new CanceledError_default(null, config, request2) : cancel);
request2.abort();
request2 = null;
};
_config.cancelToken && _config.cancelToken.subscribe(onCanceled);
if (_config.signal) {
_config.signal.aborted ? onCanceled() : _config.signal.addEventListener("abort", onCanceled);
}
}
const protocol = parseProtocol(_config.url);
if (protocol && platform_default.protocols.indexOf(protocol) === -1) {
reject(new AxiosError_default("Unsupported protocol " + protocol + ":", AxiosError_default.ERR_BAD_REQUEST, config));
return;
}
request2.send(requestData || null);
});
};
// node_modules/axios/lib/helpers/composeSignals.js
var composeSignals = (signals, timeout) => {
const { length } = signals = signals ? signals.filter(Boolean) : [];
if (timeout || length) {
let controller = new AbortController();
let aborted;
const onabort = function(reason) {
if (!aborted) {
aborted = true;
unsubscribe();
const err = reason instanceof Error ? reason : this.reason;
controller.abort(err instanceof AxiosError_default ? err : new CanceledError_default(err instanceof Error ? err.message : err));
}
};
let timer = timeout && setTimeout(() => {
timer = null;
onabort(new AxiosError_default(`timeout ${timeout} of ms exceeded`, AxiosError_default.ETIMEDOUT));
}, timeout);
const unsubscribe = () => {
if (signals) {
timer && clearTimeout(timer);
timer = null;
signals.forEach((signal2) => {
signal2.unsubscribe ? signal2.unsubscribe(onabort) : signal2.removeEventListener("abort", onabort);
});
signals = null;
}
};
signals.forEach((signal2) => signal2.addEventListener("abort", onabort));
const { signal } = controller;
signal.unsubscribe = () => utils_default.asap(unsubscribe);
return signal;
}
};
var composeSignals_default = composeSignals;
// node_modules/axios/lib/helpers/trackStream.js
var streamChunk = function* (chunk, chunkSize) {
let len = chunk.byteLength;
if (!chunkSize || len < chunkSize) {
yield chunk;
return;
}
let pos = 0;
let end;
while (pos < len) {
end = pos + chunkSize;
yield chunk.slice(pos, end);
pos = end;
}
};
var readBytes = async function* (iterable, chunkSize) {
for await (const chunk of readStream(iterable)) {
yield* streamChunk(chunk, chunkSize);
}
};
var readStream = async function* (stream4) {
if (stream4[Symbol.asyncIterator]) {
yield* stream4;
return;
}
const reader = stream4.getReader();
try {
for (; ; ) {
const { done, value } = await reader.read();
if (done) {
break;
}
yield value;
}
} finally {
await reader.cancel();
}
};
var trackStream = (stream4, chunkSize, onProgress, onFinish) => {
const iterator2 = readBytes(stream4, chunkSize);
let bytes = 0;
let done;
let _onFinish = (e) => {
if (!done) {
done = true;
onFinish && onFinish(e);
}
};
return new ReadableStream({
async pull(controller) {
try {
const { done: done2, value } = await iterator2.next();
if (done2) {
_onFinish();
controller.close();
return;
}
let len = value.byteLength;
if (onProgress) {
let loadedBytes = bytes += len;
onProgress(loadedBytes);
}
controller.enqueue(new Uint8Array(value));
} catch (err) {
_onFinish(err);
throw err;
}
},
cancel(reason) {
_onFinish(reason);
return iterator2.return();
}
}, {
highWaterMark: 2
});
};
// node_modules/axios/lib/adapters/fetch.js
var isFetchSupported = typeof fetch === "function" && typeof Request === "function" && typeof Response === "function";
var isReadableStreamSupported = isFetchSupported && typeof ReadableStream === "function";
var encodeText = isFetchSupported && (typeof TextEncoder === "function" ? ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) : async (str) => new Uint8Array(await new Response(str).arrayBuffer()));
var test = (fn, ...args) => {
try {
return !!fn(...args);
} catch (e) {
return false;
}
};
var supportsRequestStream = isReadableStreamSupported && test(() => {
let duplexAccessed = false;
const hasContentType = new Request(platform_default.origin, {
body: new ReadableStream(),
method: "POST",
get duplex() {
duplexAccessed = true;
return "half";
}
}).headers.has("Content-Type");
return duplexAccessed && !hasContentType;
});
var DEFAULT_CHUNK_SIZE = 64 * 1024;
var supportsResponseStream = isReadableStreamSupported && test(() => utils_default.isReadableStream(new Response("").body));
var resolvers = {
stream: supportsResponseStream && ((res) => res.body)
};
isFetchSupported && ((res) => {
["text", "arrayBuffer", "blob", "formData", "stream"].forEach((type) => {
!resolvers[type] && (resolvers[type] = utils_default.isFunction(res[type]) ? (res2) => res2[type]() : (_, config) => {
throw new AxiosError_default(`Response type '${type}' is not supported`, AxiosError_default.ERR_NOT_SUPPORT, config);
});
});
})(new Response());
var getBodyLength = async (body) => {
if (body == null) {
return 0;
}
if (utils_default.isBlob(body)) {
return body.size;
}
if (utils_default.isSpecCompliantForm(body)) {
const _request = new Request(platform_default.origin, {
method: "POST",
body
});
return (await _request.arrayBuffer()).byteLength;
}
if (utils_default.isArrayBufferView(body) || utils_default.isArrayBuffer(body)) {
return body.byteLength;
}
if (utils_default.isURLSearchParams(body)) {
body = body + "";
}
if (utils_default.isString(body)) {
return (await encodeText(body)).byteLength;
}
};
var resolveBodyLength = async (headers, body) => {
const length = utils_default.toFiniteNumber(headers.getContentLength());
return length == null ? getBodyLength(body) : length;
};
var fetch_default = isFetchSupported && (async (config) => {
let {
url: url2,
method,
data,
signal,
cancelToken,
timeout,
onDownloadProgress,
onUploadProgress,
responseType,
headers,
withCredentials = "same-origin",
fetchOptions
} = resolveConfig_default(config);
responseType = responseType ? (responseType + "").toLowerCase() : "text";
let composedSignal = composeSignals_default([signal, cancelToken && cancelToken.toAbortSignal()], timeout);
let request2;
const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {
composedSignal.unsubscribe();
});
let requestContentLength;
try {
if (onUploadProgress && supportsRequestStream && method !== "get" && method !== "head" && (requestContentLength = await resolveBodyLength(headers, data)) !== 0) {
let _request = new Request(url2, {
method: "POST",
body: data,
duplex: "half"
});
let contentTypeHeader;
if (utils_default.isFormData(data) && (contentTypeHeader = _request.headers.get("content-type"))) {
headers.setContentType(contentTypeHeader);
}
if (_request.body) {
const [onProgress, flush] = progressEventDecorator(requestContentLength, progressEventReducer(asyncDecorator(onUploadProgress)));
data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);
}
}
if (!utils_default.isString(withCredentials)) {
withCredentials = withCredentials ? "include" : "omit";
}
const isCredentialsSupported = "credentials" in Request.prototype;
request2 = new Request(url2, {
...fetchOptions,
signal: composedSignal,
method: method.toUpperCase(),
headers: headers.normalize().toJSON(),
body: data,
duplex: "half",
credentials: isCredentialsSupported ? withCredentials : void 0
});
let response = await fetch(request2, fetchOptions);
const isStreamResponse = supportsResponseStream && (responseType === "stream" || responseType === "response");
if (supportsResponseStream && (onDownloadProgress || isStreamResponse && unsubscribe)) {
const options = {};
["status", "statusText", "headers"].forEach((prop) => {
options[prop] = response[prop];
});
const responseContentLength = utils_default.toFiniteNumber(response.headers.get("content-length"));
const [onProgress, flush] = onDownloadProgress && progressEventDecorator(responseContentLength, progressEventReducer(asyncDecorator(onDownloadProgress), true)) || [];
response = new Response(trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
flush && flush();
unsubscribe && unsubscribe();
}), options);
}
responseType = responseType || "text";
let responseData = await resolvers[utils_default.findKey(resolvers, responseType) || "text"](response, config);
!isStreamResponse && unsubscribe && unsubscribe();
return await new Promise((resolve, reject) => {
settle(resolve, reject, {
data: responseData,
headers: AxiosHeaders_default.from(response.headers),
status: response.status,
statusText: response.statusText,
config,
request: request2
});
});
} catch (err) {
unsubscribe && unsubscribe();
if (err && err.name === "TypeError" && /Load failed|fetch/i.test(err.message)) {
throw Object.assign(new AxiosError_default("Network Error", AxiosError_default.ERR_NETWORK, config, request2), {
cause: err.cause || err
});
}
throw AxiosError_default.from(err, err && err.code, config, request2);
}
});
// node_modules/axios/lib/adapters/adapters.js
var knownAdapters = {
http: http_default,
xhr: xhr_default,
fetch: fetch_default
};
utils_default.forEach(knownAdapters, (fn, value) => {
if (fn) {
try {
Object.defineProperty(fn, "name", { value });
} catch (e) {
}
Object.defineProperty(fn, "adapterName", { value });
}
});
var renderReason = (reason) => `- ${reason}`;
var isResolvedHandle = (adapter) => utils_default.isFunction(adapter) || adapter === null || adapter === false;
var adapters_default = {
getAdapter: (adapters) => {
adapters = utils_default.isArray(adapters) ? adapters : [adapters];
const { length } = adapters;
let nameOrAdapter;
let adapter;
const rejectedReasons = {};
for (let i = 0; i < length; i++) {
nameOrAdapter = adapters[i];
let id;
adapter = nameOrAdapter;
if (!isResolvedHandle(nameOrAdapter)) {
adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];
if (adapter === void 0) {
throw new AxiosError_default(`Unknown adapter '${id}'`);
}
}
if (adapter) {
break;
}
rejectedReasons[id || "#" + i] = adapter;
}
if (!adapter) {
const reasons = Object.entries(rejectedReasons).map(([id, state]) => `adapter ${id} ` + (state === false ? "is not supported by the environment" : "is not available in the build"));
let s = length ? reasons.length > 1 ? "since :\n" + reasons.map(renderReason).join("\n") : " " + renderReason(reasons[0]) : "as no adapter specified";
throw new AxiosError_default(`There is no suitable adapter to dispatch the request ` + s, "ERR_NOT_SUPPORT");
}
return adapter;
},
adapters: knownAdapters
};
// node_modules/axios/lib/core/dispatchRequest.js
"use strict";
function throwIfCancellationRequested(config) {
if (config.cancelToken) {
config.cancelToken.throwIfRequested();
}
if (config.signal && config.signal.aborted) {
throw new CanceledError_default(null, config);
}
}
function dispatchRequest(config) {
throwIfCancellationRequested(config);
config.headers = AxiosHeaders_default.from(config.headers);
config.data = transformData.call(config, config.transformRequest);
if (["post", "put", "patch"].indexOf(config.method) !== -1) {
config.headers.setContentType("application/x-www-form-urlencoded", false);
}
const adapter = adapters_default.getAdapter(config.adapter || defaults_default.adapter);
return adapter(config).then(function onAdapterResolution(response) {
throwIfCancellationRequested(config);
response.data = transformData.call(config, config.transformResponse, response);
response.headers = AxiosHeaders_default.from(response.headers);
return response;
}, function onAdapterRejection(reason) {
if (!isCancel(reason)) {
throwIfCancellationRequested(config);
if (reason && reason.response) {
reason.response.data = transformData.call(config, config.transformResponse, reason.response);
reason.response.headers = AxiosHeaders_default.from(reason.response.headers);
}
}
return Promise.reject(reason);
});
}
// node_modules/axios/lib/helpers/validator.js
"use strict";
var validators = {};
["object", "boolean", "number", "function", "string", "symbol"].forEach((type, i) => {
validators[type] = function validator(thing) {
return typeof thing === type || "a" + (i < 1 ? "n " : " ") + type;
};
});
var deprecatedWarnings = {};
validators.transitional = function transitional(validator, version, message) {
function formatMessage(opt, desc) {
return "[Axios v" + VERSION + "] Transitional option '" + opt + "'" + desc + (message ? ". " + message : "");
}
return (value, opt, opts) => {
if (validator === false) {
throw new AxiosError_default(formatMessage(opt, " has been removed" + (version ? " in " + version : "")), AxiosError_default.ERR_DEPRECATED);
}
if (version && !deprecatedWarnings[opt]) {
deprecatedWarnings[opt] = true;
console.warn(formatMessage(opt, " has been deprecated since v" + version + " and will be removed in the near future"));
}
return validator ? validator(value, opt, opts) : true;
};
};
validators.spelling = function spelling(correctSpelling) {
return (value, opt) => {
console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);
return true;
};
};
function assertOptions(options, schema, allowUnknown) {
if (typeof options !== "object") {
throw new AxiosError_default("options must be an object", AxiosError_default.ERR_BAD_OPTION_VALUE);
}
const keys = Object.keys(options);
let i = keys.length;
while (i-- > 0) {
const opt = keys[i];
const validator = schema[opt];
if (validator) {
const value = options[opt];
const result = value === void 0 || validator(value, opt, options);
if (result !== true) {
throw new AxiosError_default("option " + opt + " must be " + result, AxiosError_default.ERR_BAD_OPTION_VALUE);
}
continue;
}
if (allowUnknown !== true) {
throw new AxiosError_default("Unknown option " + opt, AxiosError_default.ERR_BAD_OPTION);
}
}
}
var validator_default = {
assertOptions,
validators
};
// node_modules/axios/lib/core/Axios.js
"use strict";
var validators2 = validator_default.validators;
var Axios = class {
constructor(instanceConfig) {
this.defaults = instanceConfig || {};
this.interceptors = {
request: new InterceptorManager_default(),
response: new InterceptorManager_default()
};
}
async request(configOrUrl, config) {
try {
return await this._request(configOrUrl, config);
} catch (err) {
if (err instanceof Error) {
let dummy = {};
Error.captureStackTrace ? Error.captureStackTrace(dummy) : dummy = new Error();
const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, "") : "";
try {
if (!err.stack) {
err.stack = stack;
} else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\n.+\n/, ""))) {
err.stack += "\n" + stack;
}
} catch (e) {
}
}
throw err;
}
}
_request(configOrUrl, config) {
if (typeof configOrUrl === "string") {
config = config || {};
config.url = configOrUrl;
} else {
config = configOrUrl || {};
}
config = mergeConfig(this.defaults, config);
const { transitional: transitional2, paramsSerializer, headers } = config;
if (transitional2 !== void 0) {
validator_default.assertOptions(transitional2, {
silentJSONParsing: validators2.transitional(validators2.boolean),
forcedJSONParsing: validators2.transitional(validators2.boolean),
clarifyTimeoutError: validators2.transitional(validators2.boolean)
}, false);
}
if (paramsSerializer != null) {
if (utils_default.isFunction(paramsSerializer)) {
config.paramsSerializer = {
serialize: paramsSerializer
};
} else {
validator_default.assertOptions(paramsSerializer, {
encode: validators2.function,
serialize: validators2.function
}, true);
}
}
if (config.allowAbsoluteUrls !== void 0) {
} else if (this.defaults.allowAbsoluteUrls !== void 0) {
config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;
} else {
config.allowAbsoluteUrls = true;
}
validator_default.assertOptions(config, {
baseUrl: validators2.spelling("baseURL"),
withXsrfToken: validators2.spelling("withXSRFToken")
}, true);
config.method = (config.method || this.defaults.method || "get").toLowerCase();
let contextHeaders = headers && utils_default.merge(headers.common, headers[config.method]);
headers && utils_default.forEach(["delete", "get", "head", "post", "put", "patch", "common"], (method) => {
delete headers[method];
});
config.headers = AxiosHeaders_default.concat(contextHeaders, headers);
const requestInterceptorChain = [];
let synchronousRequestInterceptors = true;
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor2) {
if (typeof interceptor2.runWhen === "function" && interceptor2.runWhen(config) === false) {
return;
}
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor2.synchronous;
requestInterceptorChain.unshift(interceptor2.fulfilled, interceptor2.rejected);
});
const responseInterceptorChain = [];
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor2) {
responseInterceptorChain.push(interceptor2.fulfilled, interceptor2.rejected);
});
let promise;
let i = 0;
let len;
if (!synchronousRequestInterceptors) {
const chain = [dispatchRequest.bind(this), void 0];
chain.unshift.apply(chain, requestInterceptorChain);
chain.push.apply(chain, responseInterceptorChain);
len = chain.length;
promise = Promise.resolve(config);
while (i < len) {
promise = promise.then(chain[i++], chain[i++]);
}
return promise;
}
len = requestInterceptorChain.length;
let newConfig = config;
i = 0;
while (i < len) {
const onFulfilled = requestInterceptorChain[i++];
const onRejected = requestInterceptorChain[i++];
try {
newConfig = onFulfilled(newConfig);
} catch (error) {
onRejected.call(this, error);
break;
}
}
try {
promise = dispatchRequest.call(this, newConfig);
} catch (error) {
return Promise.reject(error);
}
i = 0;
len = responseInterceptorChain.length;
while (i < len) {
promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);
}
return promise;
}
getUri(config) {
config = mergeConfig(this.defaults, config);
const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
return buildURL(fullPath, config.params, config.paramsSerializer);
}
};
utils_default.forEach(["delete", "get", "head", "options"], function forEachMethodNoData(method) {
Axios.prototype[method] = function(url2, config) {
return this.request(mergeConfig(config || {}, {
method,
url: url2,
data: (config || {}).data
}));
};
});
utils_default.forEach(["post", "put", "patch"], function forEachMethodWithData(method) {
function generateHTTPMethod(isForm) {
return function httpMethod(url2, data, config) {
return this.request(mergeConfig(config || {}, {
method,
headers: isForm ? {
"Content-Type": "multipart/form-data"
} : {},
url: url2,
data
}));
};
}
Axios.prototype[method] = generateHTTPMethod();
Axios.prototype[method + "Form"] = generateHTTPMethod(true);
});
var Axios_default = Axios;
// node_modules/axios/lib/cancel/CancelToken.js
"use strict";
var CancelToken = class {
constructor(executor) {
if (typeof executor !== "function") {
throw new TypeError("executor must be a function.");
}
let resolvePromise;
this.promise = new Promise(function promiseExecutor(resolve) {
resolvePromise = resolve;
});
const token = this;
this.promise.then((cancel) => {
if (!token._listeners)
return;
let i = token._listeners.length;
while (i-- > 0) {
token._listeners[i](cancel);
}
token._listeners = null;
});
this.promise.then = (onfulfilled) => {
let _resolve;
const promise = new Promise((resolve) => {
token.subscribe(resolve);
_resolve = resolve;
}).then(onfulfilled);
promise.cancel = function reject() {
token.unsubscribe(_resolve);
};
return promise;
};
executor(function cancel(message, config, request2) {
if (token.reason) {
return;
}
token.reason = new CanceledError_default(message, config, request2);
resolvePromise(token.reason);
});
}
throwIfRequested() {
if (this.reason) {
throw this.reason;
}
}
subscribe(listener) {
if (this.reason) {
listener(this.reason);
return;
}
if (this._listeners) {
this._listeners.push(listener);
} else {
this._listeners = [listener];
}
}
unsubscribe(listener) {
if (!this._listeners) {
return;
}
const index2 = this._listeners.indexOf(listener);
if (index2 !== -1) {
this._listeners.splice(index2, 1);
}
}
toAbortSignal() {
const controller = new AbortController();
const abort = (err) => {
controller.abort(err);
};
this.subscribe(abort);
controller.signal.unsubscribe = () => this.unsubscribe(abort);
return controller.signal;
}
static source() {
let cancel;
const token = new CancelToken(function executor(c) {
cancel = c;
});
return {
token,
cancel
};
}
};
var CancelToken_default = CancelToken;
// node_modules/axios/lib/helpers/spread.js
"use strict";
function spread(callback) {
return function wrap(arr) {
return callback.apply(null, arr);
};
}
// node_modules/axios/lib/helpers/isAxiosError.js
"use strict";
function isAxiosError(payload) {
return utils_default.isObject(payload) && payload.isAxiosError === true;
}
// node_modules/axios/lib/helpers/HttpStatusCode.js
var HttpStatusCode = {
Continue: 100,
SwitchingProtocols: 101,
Processing: 102,
EarlyHints: 103,
Ok: 200,
Created: 201,
Accepted: 202,
NonAuthoritativeInformation: 203,
NoContent: 204,
ResetContent: 205,
PartialContent: 206,
MultiStatus: 207,
AlreadyReported: 208,
ImUsed: 226,
MultipleChoices: 300,
MovedPermanently: 301,
Found: 302,
SeeOther: 303,
NotModified: 304,
UseProxy: 305,
Unused: 306,
TemporaryRedirect: 307,
PermanentRedirect: 308,
BadRequest: 400,
Unauthorized: 401,
PaymentRequired: 402,
Forbidden: 403,
NotFound: 404,
MethodNotAllowed: 405,
NotAcceptable: 406,
ProxyAuthenticationRequired: 407,
RequestTimeout: 408,
Conflict: 409,
Gone: 410,
LengthRequired: 411,
PreconditionFailed: 412,
PayloadTooLarge: 413,
UriTooLong: 414,
UnsupportedMediaType: 415,
RangeNotSatisfiable: 416,
ExpectationFailed: 417,
ImATeapot: 418,
MisdirectedRequest: 421,
UnprocessableEntity: 422,
Locked: 423,
FailedDependency: 424,
TooEarly: 425,
UpgradeRequired: 426,
PreconditionRequired: 428,
TooManyRequests: 429,
RequestHeaderFieldsTooLarge: 431,
UnavailableForLegalReasons: 451,
InternalServerError: 500,
NotImplemented: 501,
BadGateway: 502,
ServiceUnavailable: 503,
GatewayTimeout: 504,
HttpVersionNotSupported: 505,
VariantAlsoNegotiates: 506,
InsufficientStorage: 507,
LoopDetected: 508,
NotExtended: 510,
NetworkAuthenticationRequired: 511
};
Object.entries(HttpStatusCode).forEach(([key, value]) => {
HttpStatusCode[value] = key;
});
var HttpStatusCode_default = HttpStatusCode;
// node_modules/axios/lib/axios.js
"use strict";
function createInstance(defaultConfig) {
const context = new Axios_default(defaultConfig);
const instance = bind(Axios_default.prototype.request, context);
utils_default.extend(instance, Axios_default.prototype, context, { allOwnKeys: true });
utils_default.extend(instance, context, null, { allOwnKeys: true });
instance.create = function create2(instanceConfig) {
return createInstance(mergeConfig(defaultConfig, instanceConfig));
};
return instance;
}
var axios = createInstance(defaults_default);
axios.Axios = Axios_default;
axios.CanceledError = CanceledError_default;
axios.CancelToken = CancelToken_default;
axios.isCancel = isCancel;
axios.VERSION = VERSION;
axios.toFormData = toFormData_default;
axios.AxiosError = AxiosError_default;
axios.Cancel = axios.CanceledError;
axios.all = function all(promises) {
return Promise.all(promises);
};
axios.spread = spread;
axios.isAxiosError = isAxiosError;
axios.mergeConfig = mergeConfig;
axios.AxiosHeaders = AxiosHeaders_default;
axios.formToJSON = (thing) => formDataToJSON_default(utils_default.isHTMLForm(thing) ? new FormData(thing) : thing);
axios.getAdapter = adapters_default.getAdapter;
axios.HttpStatusCode = HttpStatusCode_default;
axios.default = axios;
var axios_default = axios;
// src/utils/request.ts
var import_obsidian = __toModule(require("obsidian"));
var import_qs = __toModule(require_lib());
// src/common/config.ts
var config_default = {
baseURL: "http://127.0.0.1:8081"
};
// src/utils/request.ts
var Request2 = class {
constructor() {
this._headers = { "Content-Type": "application/json;charset=UTF-8" };
this._axios = axios_default.create({ baseURL: config_default.baseURL, adapter: this.obAdapter });
}
static getInstance() {
if (!this._instance)
this._instance = new Request2();
return this._instance;
}
obAdapter(config) {
return new Promise((resolve, reject) => {
const response = (res) => {
if (typeof res === "string") {
try {
res = JSON.parse(res);
} catch (e) {
console.error(e);
}
}
return {
status: res.statusCode || res.status,
statusText: res.errMsg || res.statusText,
headers: res.header,
config,
request: null,
data: { ...res }
};
};
const rUrl = () => {
let url2 = config.url ?? "";
const params = import_qs.default.stringify({ ...config.params, ...import_qs.default.parse(url2.split("?")[1] ?? "") });
if (url2.includes("?"))
url2 = url2.split("?")[0];
if (!url2.startsWith("http"))
url2 = (config.baseURL ?? "") + url2;
return `${url2}?${params}`;
};
const rHeader = () => {
let headers = {};
if (typeof config.headers?.toJSON === "function") {
Object.assign(headers, config.headers.toJSON(true));
} else {
Object.assign(headers, config.headers);
}
return headers;
};
(0, import_obsidian.request)({
url: rUrl(),
method: config.method,
contentType: config.headers?.["Content-Type"] ?? "application/json;charset=UTF-8",
body: config.data,
headers: rHeader()
}).then((res) => resolve(response(res))).catch((err) => reject(response(err)));
});
}
getAxios() {
return this._axios;
}
setRequestInterceptor(onFulfilled, onRejected) {
this._axios.interceptors.request.use(onFulfilled, onRejected);
}
setResponseInterceptor(onFulfilled, onRejected) {
this._axios.interceptors.response.use(onFulfilled, onRejected);
}
get(config) {
return this._axios.request({ headers: this._headers, ...config, method: "GET" });
}
post(config) {
return this._axios.request({ headers: this._headers, ...config, method: "POST" });
}
delete(config) {
return this._axios.request({ headers: this._headers, ...config, method: "DELETE" });
}
put(config) {
return this._axios.request({ headers: this._headers, ...config, method: "PUT" });
}
};
var request_default = Request2.getInstance();
// src/interceptor/request.ts
var successCode = ["RC00000"];
var isSkipError = (config) => config?.headers?.skipError ?? false;
var interceptor = (plugin) => {
request_default.setRequestInterceptor((config) => {
if (!config)
return config;
const token = plugin.accountStore.accountInfo?.token;
if (token) {
config.headers.token = `${token}`;
}
return config;
});
request_default.setResponseInterceptor((response) => {
const data = response.data ?? {};
const code = data.code ?? "-1";
if (!successCode.includes(code)) {
if (isSkipError(response?.config)) {
return Promise.resolve();
}
throw new Error(JSON.stringify(data));
}
return response;
}, (error) => {
if (isSkipError(error.config)) {
return Promise.resolve();
}
console.log("\u3010\u8BF7\u6C42\u5F02\u5E38\u3011", error);
return Promise.reject(error);
});
};
var requestInterceptor = {
install: interceptor
};
// src/interceptor/index.ts
var install = (plugin) => {
requestInterceptor.install(plugin);
};
var interceptor_default = install;
// node_modules/zustand/esm/vanilla.mjs
var createStoreImpl = (createState) => {
let state;
const listeners = /* @__PURE__ */ new Set();
const setState = (partial, replace) => {
const nextState = typeof partial === "function" ? partial(state) : partial;
if (!Object.is(nextState, state)) {
const previousState = state;
state = (replace != null ? replace : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState);
listeners.forEach((listener) => listener(state, previousState));
}
};
const getState = () => state;
const getInitialState = () => initialState;
const subscribe = (listener) => {
listeners.add(listener);
return () => listeners.delete(listener);
};
const api = { setState, getState, getInitialState, subscribe };
const initialState = state = createState(setState, getState, api);
return api;
};
var createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
// src/utils/crypto.ts
var base64Encode = (str) => {
return Buffer.from(str).toString("base64");
};
// src/api/account.ts
function sendLicense(email) {
return request_default.post({
url: "/account/email/license",
data: { email }
});
}
function login(email, license) {
return request_default.post({
url: "/account/login",
data: { email, license: base64Encode(license) }
});
}
function getAccountInfo() {
return request_default.get({
url: "/account/info"
});
}
// node_modules/zustand/esm/middleware.mjs
function createJSONStorage(getStorage, options) {
let storage;
try {
storage = getStorage();
} catch (e) {
return;
}
const persistStorage = {
getItem: (name) => {
var _a2;
const parse = (str2) => {
if (str2 === null) {
return null;
}
return JSON.parse(str2, options == null ? void 0 : options.reviver);
};
const str = (_a2 = storage.getItem(name)) != null ? _a2 : null;
if (str instanceof Promise) {
return str.then(parse);
}
return parse(str);
},
setItem: (name, newValue) => storage.setItem(name, JSON.stringify(newValue, options == null ? void 0 : options.replacer)),
removeItem: (name) => storage.removeItem(name)
};
return persistStorage;
}
var toThenable = (fn) => (input) => {
try {
const result = fn(input);
if (result instanceof Promise) {
return result;
}
return {
then(onFulfilled) {
return toThenable(onFulfilled)(result);
},
catch(_onRejected) {
return this;
}
};
} catch (e) {
return {
then(_onFulfilled) {
return this;
},
catch(onRejected) {
return toThenable(onRejected)(e);
}
};
}
};
var persistImpl = (config, baseOptions) => (set, get, api) => {
let options = {
storage: createJSONStorage(() => localStorage),
partialize: (state) => state,
version: 0,
merge: (persistedState, currentState) => ({
...currentState,
...persistedState
}),
...baseOptions
};
let hasHydrated = false;
const hydrationListeners = /* @__PURE__ */ new Set();
const finishHydrationListeners = /* @__PURE__ */ new Set();
let storage = options.storage;
if (!storage) {
return config((...args) => {
console.warn(`[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`);
set(...args);
}, get, api);
}
const setItem = () => {
const state = options.partialize({ ...get() });
return storage.setItem(options.name, {
state,
version: options.version
});
};
const savedSetState = api.setState;
api.setState = (state, replace) => {
savedSetState(state, replace);
void setItem();
};
const configResult = config((...args) => {
set(...args);
void setItem();
}, get, api);
api.getInitialState = () => configResult;
let stateFromStorage;
const hydrate = () => {
var _a2, _b;
if (!storage)
return;
hasHydrated = false;
hydrationListeners.forEach((cb) => {
var _a22;
return cb((_a22 = get()) != null ? _a22 : configResult);
});
const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a2 = get()) != null ? _a2 : configResult)) || void 0;
return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {
if (deserializedStorageValue) {
if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
if (options.migrate) {
const migration = options.migrate(deserializedStorageValue.state, deserializedStorageValue.version);
if (migration instanceof Promise) {
return migration.then((result) => [true, result]);
}
return [true, migration];
}
console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`);
} else {
return [false, deserializedStorageValue.state];
}
}
return [false, void 0];
}).then((migrationResult) => {
var _a22;
const [migrated, migratedState] = migrationResult;
stateFromStorage = options.merge(migratedState, (_a22 = get()) != null ? _a22 : configResult);
set(stateFromStorage, true);
if (migrated) {
return setItem();
}
}).then(() => {
postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
stateFromStorage = get();
hasHydrated = true;
finishHydrationListeners.forEach((cb) => cb(stateFromStorage));
}).catch((e) => {
postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
});
};
api.persist = {
setOptions: (newOptions) => {
options = {
...options,
...newOptions
};
if (newOptions.storage) {
storage = newOptions.storage;
}
},
clearStorage: () => {
storage == null ? void 0 : storage.removeItem(options.name);
},
getOptions: () => options,
rehydrate: () => hydrate(),
hasHydrated: () => hasHydrated,
onHydrate: (cb) => {
hydrationListeners.add(cb);
return () => {
hydrationListeners.delete(cb);
};
},
onFinishHydration: (cb) => {
finishHydrationListeners.add(cb);
return () => {
finishHydrationListeners.delete(cb);
};
}
};
if (!options.skipHydration) {
hydrate();
}
return stateFromStorage || configResult;
};
var persist = persistImpl;
// src/store/account.ts
var DEFAULT_ACCOUNT = {
accountId: "",
email: "",
license: "",
avatar: "",
nickname: "",
token: ""
};
var useAccountStore = createStore(persist((set) => ({
accountInfo: DEFAULT_ACCOUNT,
setAccount: (account) => set((state) => {
state.accountInfo = { ...state.accountInfo, ...account };
return state;
}),
resetAccount: () => set((state) => {
state.accountInfo = { ...DEFAULT_ACCOUNT };
return state;
}),
isLogin: () => {
const {
accountId = "",
email = "",
license = "",
token = ""
} = useAccountStore.getState().accountInfo;
return accountId !== "" && email !== "" && license !== "" && token !== "";
},
loginAccount: async () => {
return new Promise(async (resolve) => {
try {
const { email, license } = useAccountStore.getState().accountInfo;
if (!email || !email.length || !license || !license.length) {
resolve(false);
return;
}
const loginRes = await login(email, license);
const { token, account = {} } = loginRes.data.result || {};
useAccountStore.getState().setAccount({
...useAccountStore.getState().accountInfo,
token,
accountId: account.accountId,
avatar: account.header,
nickname: account.nickname
});
resolve(true);
} catch (error) {
useAccountStore.getState().setAccount({ ...useAccountStore.getState().accountInfo, token: "" });
resolve(false);
}
});
}
}), {
name: "spaceship-publish-account",
storage: createJSONStorage(() => localStorage)
}));
// src/store/index.ts
var useAppStore = createStore((set) => {
});
// src/service/publish_process.ts
var import_obsidian3 = __toModule(require("obsidian"));
// src/api/article.ts
function getArticleList(page, size, status, title, userSourceId) {
return request_default.post({
url: "/account/article/list",
data: { no: page || 1, size: size || 10, status, title, userSourceId }
});
}
function getArticleDetail(articleId) {
return request_default.get({ url: `/article/${articleId}` });
}
function draftArticle() {
return request_default.post({ url: "/account/article/draft" });
}
function publishArticle(articleId, title, mdContent) {
return request_default.post({
url: "/account/article/publish",
data: { articleId, title, mdContent }
});
}
function uploadAttachment(articleId, files) {
const formData = new FormData();
formData.append("articleId", articleId);
for (let i = 0; i < files.length; i++) {
formData.append("attachments", files[i]);
}
return request_default.post({
url: `/account/article/attachment/upload`,
data: formData
});
}
function unPublishArticle(articleId) {
return request_default.post({ url: "/account/article/unpublish", data: { articleId } });
}
function likeArticle(articleId) {
return request_default.get({ url: `/article/like/${articleId}` });
}
function unlikeArticle(articleId) {
return request_default.get({ url: `/article/unlike/${articleId}` });
}
function collectArticleList(page, size) {
return request_default.post({ url: "/collect/list", data: { pageNo: page || 1, pageSize: size || 10 } });
}
function collectArticle(articleId) {
return request_default.get({ url: `/collect/${articleId}` });
}
function unCollectArticle(articleId) {
return request_default.get({ url: `/collect/remove/${articleId}` });
}
function followArticleList(page, size) {
return request_default.post({ url: "/subscription/updates/list", data: { pageNo: page || 1, pageSize: size || 10 } });
}
function followUserList(page, size) {
return request_default.post({
url: "/subscription/list",
data: { pageNo: page || 1, pageSize: size || 10, subscribeType: "account" }
});
}
function followUser(userId) {
return request_default.post({ url: "/subscription/follow", data: { id: userId, subscribeType: "account" } });
}
function unfollowUser(userId) {
return request_default.post({ url: "/subscription/unfollow", data: { id: userId, subscribeType: "account" } });
}
// src/components/message.ts
var import_obsidian2 = __toModule(require("obsidian"));
var pluginName = require_manifest().name;
var StatusType;
(function(StatusType2) {
StatusType2[StatusType2["Default"] = 0] = "Default";
StatusType2[StatusType2["Info"] = 1] = "Info";
StatusType2[StatusType2["Error"] = 2] = "Error";
StatusType2[StatusType2["Success"] = 3] = "Success";
})(StatusType || (StatusType = {}));
var statuses = {
[2]: {
class: "publish-note-status-error",
icon: "\u274C "
},
[1]: {
class: "publish-note-status-info",
icon: ""
},
[3]: {
class: "publish-note-status-success",
icon: "\u2714 "
}
};
var Message = class extends import_obsidian2.Notice {
constructor(text, type = 0, duration = 5e3) {
const messageDoc = new DocumentFragment();
const icon = statuses[type]?.icon || "";
const messageEl = messageDoc.createEl("div", {
text: `${icon}${pluginName}: ${text}`
});
super(messageDoc, duration);
if (messageEl.parentElement) {
if (statuses[type]) {
messageEl.parentElement.classList.add(statuses[type].class);
}
}
this.icon = icon;
this.messageEl = messageEl;
}
setStatus(message) {
this.messageEl.innerText = `${this.icon}${pluginName}: ${message}`;
}
};
// src/service/publish_process.ts
var fm_key_publish_id = "opp_publish_id";
var fm_key_publish_title = "opp_publish_title";
var fm_key_publish_status = "opp_publish_status";
async function publish(file, app) {
let articleId = "";
let publishStatus = "";
await app.fileManager.processFrontMatter(file, (data) => {
if (data[fm_key_publish_id]) {
articleId = data[fm_key_publish_id];
publishStatus = data[fm_key_publish_status];
console.log(fm_key_publish_id + " = " + articleId);
console.log(fm_key_publish_status + " = " + publishStatus);
}
});
if (!publishStatus) {
console.log("no publish info " + publishStatus);
try {
const prePublishResp = await draftArticle();
const prePubResp = prePublishResp.data || {};
console.log("\u9884\u53D1\u5E03\u6210\u529F", prePubResp);
await app.fileManager.processFrontMatter(file, (data) => {
data[fm_key_publish_id] = prePubResp.result.articleId;
data[fm_key_publish_status] = prePubResp.result.status;
data[fm_key_publish_title] = prePubResp.result.title;
articleId = prePubResp.result.articleId;
publishStatus = prePubResp.result.status;
});
} catch (error) {
console.error("\u9884\u53D1\u5E03\u5931\u8D25" + error);
return false;
}
}
let content = await file.vault.read(file);
try {
content = await processObsidianReferences(content, file, app, articleId);
const publishResp = await publishArticle(articleId, file.basename, content);
const respData = publishResp.data;
console.log("\u53D1\u5E03\u7ED3\u679C: " + respData.code);
await app.fileManager.processFrontMatter(file, (data) => {
data[fm_key_publish_status] = "published";
data[fm_key_publish_title] = file.basename;
});
return true;
} catch (error) {
console.error("\u53D1\u5E03\u9519\u8BEF: " + error);
if (error instanceof Error) {
new Message(`\u53D1\u5E03\u5931\u8D25: ${error.message}`, StatusType.Error, 8e3);
} else {
new Message("\u53D1\u5E03\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u548C\u6587\u4EF6\u5F15\u7528", StatusType.Error, 8e3);
}
return false;
}
}
async function processObsidianReferences(content, currentFile, app, articleId) {
const referenceRegex = /\[\[([^\]|]+)(\|[^\]]+)?\]\]/g;
const imageExtensions = [".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg", ".webp"];
let processedContent = content;
const matches = Array.from(content.matchAll(referenceRegex));
console.log(`\u627E\u5230 ${matches.length} \u4E2A Obsidian \u5F15\u7528`);
for (const match2 of matches) {
const fullMatch = match2[0];
const filename = match2[1].trim();
const displayText = match2[2];
const isImage = imageExtensions.some((ext) => filename.toLowerCase().endsWith(ext));
if (isImage) {
console.log(`\u5904\u7406\u56FE\u7247\u5F15\u7528: ${filename}`);
const referencedFile = app.vault.getAbstractFileByPath(filename) || app.metadataCache.getFirstLinkpathDest(filename, currentFile.path);
if (!referencedFile || !(referencedFile instanceof import_obsidian3.TFile)) {
throw new Error(`\u627E\u4E0D\u5230\u5F15\u7528\u7684\u56FE\u7247\u6587\u4EF6: ${filename}`);
}
try {
const fileBuffer = await app.vault.readBinary(referencedFile);
const blob = new Blob([fileBuffer], { type: getMimeType(referencedFile.extension) });
const file = new File([blob], referencedFile.name, { type: blob.type });
const uploadResp = await uploadAttachment(articleId, [file]);
const uploadData = uploadResp.data;
if (!uploadData || !uploadData.result || uploadData.result.length === 0) {
const errorMsg = uploadData?.info || "\u672A\u77E5\u9519\u8BEF";
throw new Error(`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${filename} - ${errorMsg}`);
}
const uploadResult = uploadData.result[0];
if (!uploadResult || !uploadResult.url) {
throw new Error(`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${filename} - \u670D\u52A1\u5668\u672A\u8FD4\u56DE\u6709\u6548\u7684\u56FE\u7247URL`);
}
const remoteUrl = uploadResult.url;
console.log(`\u56FE\u7247\u4E0A\u4F20\u6210\u529F: ${filename} -> ${remoteUrl}`);
const displayName = displayText ? displayText.substring(1) : filename;
const markdownImage = `![${displayName}](${remoteUrl})`;
processedContent = processedContent.replace(fullMatch, markdownImage);
} catch (error) {
if (error instanceof Error) {
throw error;
} else {
throw new Error(`\u5904\u7406\u56FE\u7247\u5F15\u7528\u65F6\u51FA\u9519: ${filename} - ${String(error)}`);
}
}
}
}
return processedContent;
}
function getMimeType(extension) {
const mimeTypes = {
"png": "image/png",
"jpg": "image/jpeg",
"jpeg": "image/jpeg",
"gif": "image/gif",
"bmp": "image/bmp",
"svg": "image/svg+xml",
"webp": "image/webp"
};
return mimeTypes[extension.toLowerCase()] || "application/octet-stream";
}
// src/views/settings.ts
var import_obsidian4 = __toModule(require("obsidian"));
var PublishSettingsTab = class extends import_obsidian4.PluginSettingTab {
constructor(plugin) {
super(plugin.app, plugin);
this.plugin = plugin;
useAccountStore.subscribe(this.updateLoginStatus);
}
updateLoginStatus() {
if (this.plugin.accountStore.isLogin()) {
this.updateSettingDesc(this.licenseSetting, "License is valid", "green");
} else {
this.updateSettingDesc(this.licenseSetting, "Your license key");
}
}
updateSettingDesc(setting, desc, color) {
setting?.setDesc(desc ?? "").then((setting2) => {
setting2.descEl.style.color = color ?? "var(--text-muted)";
return setting2;
});
}
async handleEmailChange(value) {
const { accountInfo } = this.plugin.accountStore;
if (accountInfo.email === value)
return;
this.plugin.accountStore.setAccount({ ...accountInfo, email: value, license: "", token: "" });
this.licenseSetting?.controlEl.querySelectorAll("input").forEach((inputEl) => {
inputEl.value = "";
});
this.updateSettingDesc(this.emailSetting, "Your email address");
this.updateSettingDesc(this.licenseSetting, "Your license key");
}
async handleLicenseChange(value) {
const { accountInfo } = this.plugin.accountStore;
if (accountInfo.license === value)
return;
this.plugin.accountStore.setAccount({ ...accountInfo, license: value, token: "" });
this.updateSettingDesc(this.licenseSetting, "Your license key");
}
handleGetLicense(btn) {
const email = this.plugin.accountStore.accountInfo.email?.trim() || "";
if (email === "") {
this.updateSettingDesc(this.emailSetting, "Please input your email address", "red");
return;
}
if (!email.match(/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/)) {
this.updateSettingDesc(this.emailSetting, "Please input a valid email address", "red");
return;
}
btn.setDisabled(true);
btn.setButtonText("Sending...");
this.updateSettingDesc(this.emailSetting, "Sending email...");
sendLicense(email).then(() => {
this.updateSettingDesc(this.emailSetting, "Please go and check your email", "green");
}).catch(() => {
this.updateSettingDesc(this.emailSetting, "Send email failed", "red");
}).finally(() => {
btn.setDisabled(false);
btn.setButtonText("Get License");
});
}
handleCheckLicense(btn) {
const license = this.plugin.accountStore.accountInfo.license?.trim() || "";
if (license === "") {
this.updateSettingDesc(this.licenseSetting, "Please input your license", "red");
return;
}
btn.setDisabled(true);
btn.setButtonText("Checking...");
this.updateSettingDesc(this.licenseSetting, "Checking license...");
this.plugin.accountStore.loginAccount().then((res) => {
if (res) {
this.updateSettingDesc(this.licenseSetting, "License is valid", "green");
} else {
this.updateSettingDesc(this.licenseSetting, "License is invalid", "red");
}
}).finally(() => {
btn.setDisabled(false);
btn.setButtonText("Check License");
});
}
display() {
const { containerEl } = this;
containerEl.empty();
this.emailSetting = new import_obsidian4.Setting(containerEl).setName("Email").setDesc("Your email address").addButton((btn) => {
btn.setButtonText("Get License").setCta().onClick(() => this.handleGetLicense(btn));
}).addText((inputEl) => {
inputEl.setPlaceholder("email address").setValue(this.plugin.accountStore.accountInfo.email ?? "").onChange((value) => this.handleEmailChange(value));
});
this.licenseSetting = new import_obsidian4.Setting(containerEl).setName("License").setDesc("Your license key").addButton((btn) => {
btn.setButtonText("Check License").setCta().onClick(() => this.handleCheckLicense(btn));
}).addText((inputEl) => {
inputEl.setPlaceholder("license key").setValue(this.plugin.accountStore.accountInfo.license ?? "").onChange((value) => this.handleLicenseChange(value));
});
this.updateLoginStatus();
}
};
// src/views/opp_profile.ts
var import_react62 = __toModule(require_react());
var import_client = __toModule(require_client());
// src/components/baseItemView.ts
var import_obsidian5 = __toModule(require("obsidian"));
var BaseItemView = class extends import_obsidian5.ItemView {
constructor(leaf) {
super(leaf);
this.plugin = this.app.plugins.plugins["publish"];
}
};
// src/views/components/profile_view.tsx
var import_obsidian7 = __toModule(require("obsidian"));
var import_react61 = __toModule(require_react());
// node_modules/@douyinfe/semi-foundation/lib/es/base/foundation.js
var import_noop = __toModule(require_noop());
// node_modules/@douyinfe/semi-foundation/lib/es/utils/log.js
var import_get = __toModule(require_get2());
var log = function(text) {
if ((0, import_get.default)(process, "env.NODE_ENV") === "development") {
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
console.log(text, ...rest);
}
};
var log_default = log;
// node_modules/@douyinfe/semi-foundation/lib/es/base/foundation.js
var BaseFoundation = class {
static get cssClasses() {
return {};
}
static get strings() {
return {};
}
static get numbers() {
return {};
}
static get defaultAdapter() {
return {
getProp: import_noop.default,
getProps: import_noop.default,
getState: import_noop.default,
getStates: import_noop.default,
setState: import_noop.default,
getContext: import_noop.default,
getContexts: import_noop.default,
getCache: import_noop.default,
setCache: import_noop.default,
getCaches: import_noop.default,
stopPropagation: import_noop.default,
persistEvent: import_noop.default
};
}
constructor(adapter) {
this._adapter = Object.assign(Object.assign({}, BaseFoundation.defaultAdapter), adapter);
}
getProp(key) {
return this._adapter.getProp(key);
}
getProps() {
return this._adapter.getProps();
}
getState(key) {
return this._adapter.getState(key);
}
getStates() {
return this._adapter.getStates();
}
setState(states, cb) {
return this._adapter.setState(Object.assign({}, states), cb);
}
getContext(key) {
return this._adapter.getContext(key);
}
getContexts() {
return this._adapter.getContexts();
}
getCaches() {
return this._adapter.getCaches();
}
getCache(key) {
return this._adapter.getCache(key);
}
setCache(key, value) {
return key && this._adapter.setCache(key, value);
}
stopPropagation(e) {
this._adapter.stopPropagation(e);
}
_isControlledComponent() {
let key = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "value";
const props = this.getProps();
const isControlComponent = key in props;
return isControlComponent;
}
_isInProps(key) {
const props = this.getProps();
return key in props;
}
init(lifecycle) {
}
destroy() {
}
log(text) {
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
log_default(text, ...rest);
}
_persistEvent(e) {
this._adapter.persistEvent(e);
}
};
var foundation_default = BaseFoundation;
// node_modules/@douyinfe/semi-ui/lib/es/_base/baseComponent.js
var import_react = __toModule(require_react());
// node_modules/@douyinfe/semi-foundation/lib/es/utils/getDataAttr.js
function getDataAttr(props) {
return Object.keys(props).reduce((prev, key) => {
if (key.substr(0, 5) === "data-") {
prev[key] = props[key];
}
return prev;
}, {});
}
// node_modules/@douyinfe/semi-ui/lib/es/_base/baseComponent.js
var {
hasOwnProperty: hasOwnProperty2
} = Object.prototype;
var BaseComponent = class extends import_react.Component {
constructor(props) {
super(props);
this.isControlled = (key) => Boolean(key && this.props && typeof this.props === "object" && hasOwnProperty2.call(this.props, key));
this.setStateAsync = (state) => {
return new Promise((resolve) => {
this.setState(state, resolve);
});
};
this.cache = {};
this.foundation = null;
}
componentDidMount() {
this.foundation && typeof this.foundation.init === "function" && this.foundation.init();
}
componentWillUnmount() {
this.foundation && typeof this.foundation.destroy === "function" && this.foundation.destroy();
this.cache = {};
}
get adapter() {
return {
getContext: (key) => {
if (this.context && key) {
return this.context[key];
}
},
getContexts: () => this.context,
getProp: (key) => this.props[key],
getProps: () => this.props,
getState: (key) => this.state[key],
getStates: () => this.state,
setState: (states, cb) => this.setState(Object.assign({}, states), cb),
getCache: (key) => key && this.cache[key],
getCaches: () => this.cache,
setCache: (key, value) => key && (this.cache[key] = value),
stopPropagation: (e) => {
try {
e.stopPropagation();
e.nativeEvent && e.nativeEvent.stopImmediatePropagation();
} catch (error) {
}
},
persistEvent: (e) => {
e && e.persist && typeof e.persist === "function" ? e.persist() : null;
}
};
}
log(text) {
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
return log_default(text, ...rest);
}
getDataAttr() {
let props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.props;
return getDataAttr(props);
}
};
BaseComponent.propTypes = {};
BaseComponent.defaultProps = {};
// node_modules/@douyinfe/semi-foundation/lib/es/base/env.js
var BASE_CLASS_PREFIX = "semi";
// node_modules/@douyinfe/semi-ui/lib/es/typography/typography.js
var import_react2 = __toModule(require_react());
var import_classnames = __toModule(require_classnames());
var import_prop_types = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/typography/constants.js
var cssClasses = {
PREFIX: `${BASE_CLASS_PREFIX}-typography`
};
var strings = {
WEIGHT: ["light", "regular", "medium", "semibold", "bold", "default"],
TYPE: ["primary", "secondary", "danger", "warning", "success", "tertiary", "quaternary"],
SIZE: ["normal", "small", "inherit"],
SPACING: ["normal", "extended"],
HEADING: [1, 2, 3, 4, 5, 6],
RULE: ["text", "numbers", "bytes-decimal", "bytes-binary", "percentages", "exponential"],
TRUNCATE: ["ceil", "floor", "round"]
};
// node_modules/@douyinfe/semi-ui/lib/es/typography/typography.js
var __rest = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixCls = cssClasses.PREFIX;
var Typography = class extends import_react2.PureComponent {
render() {
const _a2 = this.props, {
component,
className,
children,
forwardRef: forwardRef2
} = _a2, rest = __rest(_a2, ["component", "className", "children", "forwardRef"]);
const Component4 = component;
const classNames5 = (0, import_classnames.default)(prefixCls, className);
return /* @__PURE__ */ import_react2.default.createElement(Component4, Object.assign({
className: classNames5,
ref: forwardRef2
}, rest), children);
}
};
Typography.defaultProps = {
component: "article",
style: {},
className: ""
};
Typography.propTypes = {
component: import_prop_types.default.string,
style: import_prop_types.default.object,
className: import_prop_types.default.string
};
var typography_default = Typography;
// node_modules/@douyinfe/semi-ui/lib/es/typography/text.js
var import_react20 = __toModule(require_react());
var import_prop_types11 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-ui/lib/es/typography/base.js
var import_isFunction3 = __toModule(require_isFunction());
var import_isNull = __toModule(require_isNull());
var import_isString = __toModule(require_isString());
var import_merge = __toModule(require_merge());
var import_omit3 = __toModule(require_omit());
var import_isUndefined = __toModule(require_isUndefined());
var import_react19 = __toModule(require_react());
var import_classnames8 = __toModule(require_classnames());
var import_prop_types10 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-ui/lib/es/typography/copyable.js
var import_react14 = __toModule(require_react());
var import_prop_types6 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-ui/lib/es/tooltip/index.js
var import_isEqual2 = __toModule(require_isEqual());
var import_isFunction = __toModule(require_isFunction());
var import_isEmpty2 = __toModule(require_isEmpty());
var import_each = __toModule(require_each());
var import_omit = __toModule(require_omit());
var import_get5 = __toModule(require_get2());
var import_noop2 = __toModule(require_noop());
var import_throttle2 = __toModule(require_throttle());
var import_react10 = __toModule(require_react());
var import_react_dom2 = __toModule(require_react_dom());
var import_classnames3 = __toModule(require_classnames());
var import_prop_types4 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/utils/warning.js
function warning(flag, info) {
if (flag) {
console.warn(`Warning: ${info}`);
}
}
// node_modules/@douyinfe/semi-foundation/lib/es/utils/isNullOrUndefined.js
function isNullOrUndefined(value) {
return value === null || value === void 0;
}
// node_modules/@douyinfe/semi-foundation/lib/es/utils/Event.js
var Event = class {
constructor() {
this._eventMap = new Map();
}
on(event, callback) {
if (event && typeof callback === "function") {
this._eventMap.has(event) || this._eventMap.set(event, []);
this._eventMap.get(event).push(callback);
}
return this;
}
once(event, callback) {
var _this = this;
if (event && typeof callback === "function") {
const fn = function() {
callback(...arguments);
_this.off(event, fn);
};
this.on(event, fn);
}
}
off(event, callback) {
if (event) {
if (typeof callback === "function") {
const callbacks = this._eventMap.get(event);
if (Array.isArray(callbacks) && callbacks.length) {
let index2 = -1;
while ((index2 = callbacks.findIndex((cb) => cb === callback)) > -1) {
callbacks.splice(index2, 1);
}
}
} else if (isNullOrUndefined(callback)) {
this._eventMap.delete(event);
}
}
return this;
}
emit(event) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
if (!this._eventMap.has(event)) {
return false;
}
const callbacks = [...this._eventMap.get(event)];
callbacks.forEach((callback) => callback(...args));
return true;
}
};
// node_modules/@douyinfe/semi-foundation/lib/es/utils/isElement.js
function isElement(obj) {
try {
return obj instanceof HTMLElement;
} catch (e) {
return typeof obj === "object" && obj.nodeType === 1 && typeof obj.style === "object" && typeof obj.ownerDocument === "object";
}
}
// node_modules/@douyinfe/semi-foundation/lib/es/utils/dom.js
function convertDOMRectToObject(domRect) {
if (domRect && typeof domRect === "object") {
if (typeof domRect.toJSON === "function") {
return domRect.toJSON();
} else {
const keys = ["left", "top", "right", "bottom", "width", "height"];
return keys.reduce((obj, key) => {
obj[key] = domRect[key];
return obj;
}, {});
}
}
return void 0;
}
// node_modules/@douyinfe/semi-foundation/lib/es/tooltip/foundation.js
var import_isEmpty = __toModule(require_isEmpty());
var import_get3 = __toModule(require_get2());
// node_modules/@douyinfe/semi-foundation/lib/es/utils/a11y.js
var import_get2 = __toModule(require_get2());
function handlePrevent(event) {
event.stopPropagation();
event.preventDefault();
}
function isPrintableCharacter(string) {
return string.length === 1 && string.match(/\S/);
}
function setFocusToItem(itemNodes, targetItem) {
for (let i = 0; i < itemNodes.length; i++) {
if (itemNodes[i] === targetItem) {
itemNodes[i].tabIndex = 0;
itemNodes[i].focus();
} else {
itemNodes[i].tabIndex = -1;
}
}
}
function setFocusToFirstItem(itemNodes) {
itemNodes.length > 0 && setFocusToItem(itemNodes, itemNodes[0]);
}
function setFocusToLastItem(itemNodes) {
itemNodes.length > 0 && setFocusToItem(itemNodes, itemNodes[itemNodes.length - 1]);
}
function setFocusToPreviousMenuItem(itemNodes, currentItem) {
let newMenuItem, index2;
if (itemNodes.length > 0) {
if (currentItem === itemNodes[0]) {
newMenuItem = itemNodes[itemNodes.length - 1];
} else {
index2 = itemNodes.indexOf(currentItem);
newMenuItem = itemNodes[index2 - 1];
}
setFocusToItem(itemNodes, newMenuItem);
}
}
function setFocusToNextMenuitem(itemNodes, currentItem) {
let newMenuItem, index2;
if (itemNodes.length > 0) {
if (currentItem === itemNodes[itemNodes.length - 1]) {
newMenuItem = itemNodes[0];
} else {
index2 = itemNodes.indexOf(currentItem);
newMenuItem = itemNodes[index2 + 1];
}
setFocusToItem(itemNodes, newMenuItem);
}
}
function findIndexByCharacter(itemList, curItem, firstCharList, char) {
let start, index2;
if (!itemList || !firstCharList || !char || char.length > 1) {
return -1;
}
char = char.toLowerCase();
start = itemList.indexOf(curItem) + 1;
if (start >= itemList.length) {
start = 0;
}
index2 = firstCharList.indexOf(char, start);
if (index2 === -1) {
index2 = firstCharList.indexOf(char, 0);
}
return index2 >= 0 ? index2 : -1;
}
function getAncestorNodeByRole(curElement, role) {
if (!curElement) {
return null;
}
while (curElement.parentElement && (0, import_get2.default)(curElement.parentElement, "attributes.role.value", "") !== role) {
curElement = curElement.parentElement;
}
return curElement.parentElement;
}
function getMenuButton(focusableEle, Id) {
for (let i = 0; i < focusableEle.length; i++) {
const curAriDescribedby = focusableEle[i].attributes["data-popupid"];
if (curAriDescribedby && curAriDescribedby.value === Id) {
return focusableEle[i];
}
}
return null;
}
// node_modules/@douyinfe/semi-foundation/lib/es/tooltip/foundation.js
var REGS = {
TOP: /top/i,
RIGHT: /right/i,
BOTTOM: /bottom/i,
LEFT: /left/i
};
var defaultRect = {
left: 0,
top: 0,
height: 0,
width: 0,
scrollLeft: 0,
scrollTop: 0
};
var Tooltip = class extends foundation_default {
constructor(adapter) {
var _this;
super(Object.assign({}, adapter));
_this = this;
this.removePortal = () => {
this._adapter.removePortal();
};
this.setDisplayNone = (displayNone, cb) => {
this._adapter.setDisplayNone(displayNone, cb);
};
this.updateStateIfCursorOnTrigger = (trigger) => {
var _a2, _b;
if ((_a2 = trigger === null || trigger === void 0 ? void 0 : trigger.matches) === null || _a2 === void 0 ? void 0 : _a2.call(trigger, ":hover")) {
const eventNames = this._adapter.getEventName();
const triggerEventSet = this.getState("triggerEventSet");
(_b = triggerEventSet[eventNames.mouseEnter]) === null || _b === void 0 ? void 0 : _b.call(triggerEventSet);
}
};
this.onResize = () => {
const visible = this.getState("visible");
if (!visible) {
return;
}
this.calcPosition();
};
this.delayShow = () => {
const mouseEnterDelay = this.getProp("mouseEnterDelay");
this.clearDelayTimer();
if (mouseEnterDelay > 0) {
this._timer = setTimeout(() => {
this.show();
this.clearDelayTimer();
}, mouseEnterDelay);
} else {
this.show();
}
};
this.show = () => {
if (this._adapter.getAnimatingState()) {
return;
}
const content = this.getProp("content");
const trigger = this.getProp("trigger");
const clickTriggerToHide = this.getProp("clickTriggerToHide");
const {
visible,
displayNone
} = this.getStates();
if (displayNone) {
this.setDisplayNone(false);
}
if (visible) {
return;
}
this.clearDelayTimer();
this._adapter.on("portalInserted", () => {
this.calcPosition();
});
if (trigger === "hover") {
const checkTriggerIsHover = () => {
var _a2;
const triggerDOM = this._adapter.getTriggerDOM();
if (trigger && !((_a2 = triggerDOM === null || triggerDOM === void 0 ? void 0 : triggerDOM.matches) === null || _a2 === void 0 ? void 0 : _a2.call(triggerDOM, ":hover"))) {
this.hide();
}
this._adapter.off("portalInserted", checkTriggerIsHover);
};
this._adapter.on("portalInserted", checkTriggerIsHover);
}
this._adapter.on("positionUpdated", () => {
this._togglePortalVisible(true);
});
this._adapter.insertPortal(content, {
left: -9999,
top: -9999
});
if (trigger === "custom") {
this._adapter.registerClickOutsideHandler(() => {
});
}
if (trigger === "click" || clickTriggerToHide || trigger === "contextMenu") {
this._adapter.registerClickOutsideHandler(this.hide);
}
this._bindScrollEvent();
this._bindResizeEvent();
};
this.calcPosition = function(triggerRect, wrapperRect, containerRect) {
let shouldUpdatePos = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : true;
triggerRect = ((0, import_isEmpty.default)(triggerRect) ? _this._adapter.getTriggerBounding() : triggerRect) || Object.assign({}, defaultRect);
containerRect = ((0, import_isEmpty.default)(containerRect) ? _this._adapter.getPopupContainerRect() : containerRect) || Object.assign({}, defaultRect);
wrapperRect = ((0, import_isEmpty.default)(wrapperRect) ? _this._adapter.getWrapperBounding() : wrapperRect) || Object.assign({}, defaultRect);
let style = _this.calcPosStyle({
triggerRect,
wrapperRect,
containerRect
});
let position = _this.getProp("position");
if (_this.getProp("autoAdjustOverflow")) {
const {
position: adjustedPos,
isHeightOverFlow,
isWidthOverFlow
} = _this.adjustPosIfNeed(position, style, triggerRect, wrapperRect, containerRect);
if (position !== adjustedPos || isHeightOverFlow || isWidthOverFlow) {
position = adjustedPos;
style = _this.calcPosStyle({
triggerRect,
wrapperRect,
containerRect,
position,
spacing: null,
isOverFlow: [isHeightOverFlow, isWidthOverFlow]
});
}
}
if (shouldUpdatePos && _this._mounted) {
_this._adapter.setPosition(Object.assign(Object.assign({}, style), {
position
}));
}
return style;
};
this.delayHide = () => {
const mouseLeaveDelay = this.getProp("mouseLeaveDelay");
this.clearDelayTimer();
if (mouseLeaveDelay > 0) {
this._timer = setTimeout(() => {
this.hide();
this.clearDelayTimer();
}, mouseLeaveDelay);
} else {
this.hide();
}
};
this.hide = () => {
this.clearDelayTimer();
this._togglePortalVisible(false);
this._adapter.off("portalInserted");
this._adapter.off("positionUpdated");
};
this.handleContainerKeydown = (event) => {
const {
guardFocus,
closeOnEsc
} = this.getProps();
switch (event && event.key) {
case "Escape":
closeOnEsc && this._handleEscKeyDown(event);
break;
case "Tab":
if (guardFocus) {
const container = this._adapter.getContainer();
const focusableElements = this._adapter.getFocusableElements(container);
const focusableNum = focusableElements.length;
if (focusableNum) {
if (event.shiftKey) {
this._handleContainerShiftTabKeyDown(focusableElements, event);
} else {
this._handleContainerTabKeyDown(focusableElements, event);
}
}
}
break;
default:
break;
}
};
this._timer = null;
}
init() {
const {
wrapperId
} = this.getProps();
this._mounted = true;
this._bindEvent();
this._shouldShow();
this._initContainerPosition();
if (!wrapperId) {
this._adapter.setId();
}
}
destroy() {
this._mounted = false;
this.unBindEvent();
}
_bindEvent() {
const trigger = this.getProp("trigger");
const {
triggerEventSet,
portalEventSet
} = this._generateEvent(trigger);
this._bindTriggerEvent(triggerEventSet);
this._bindPortalEvent(portalEventSet);
this._bindResizeEvent();
}
unBindEvent() {
this._adapter.unregisterClickOutsideHandler();
this.unBindResizeEvent();
this.unBindScrollEvent();
clearTimeout(this._timer);
}
_bindTriggerEvent(triggerEventSet) {
this._adapter.registerTriggerEvent(triggerEventSet);
}
_bindPortalEvent(portalEventSet) {
this._adapter.registerPortalEvent(portalEventSet);
}
_bindResizeEvent() {
this._adapter.registerResizeHandler(this.onResize);
}
unBindResizeEvent() {
this._adapter.unregisterResizeHandler(this.onResize);
}
_adjustPos() {
let position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
let isVertical = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
let adjustType = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "reverse";
let concatPos = arguments.length > 3 ? arguments[3] : void 0;
switch (adjustType) {
case "reverse":
return this._reversePos(position, isVertical);
case "expand":
return this._expandPos(position, concatPos);
case "reduce":
return this._reducePos(position);
default:
return this._reversePos(position, isVertical);
}
}
_reversePos() {
let position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
let isVertical = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
if (isVertical) {
if (REGS.TOP.test(position)) {
return position.replace("top", "bottom").replace("Top", "Bottom");
} else if (REGS.BOTTOM.test(position)) {
return position.replace("bottom", "top").replace("Bottom", "Top");
}
} else if (REGS.LEFT.test(position)) {
return position.replace("left", "right").replace("Left", "Right");
} else if (REGS.RIGHT.test(position)) {
return position.replace("right", "left").replace("Right", "Left");
}
return position;
}
_expandPos() {
let position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
let concatPos = arguments.length > 1 ? arguments[1] : void 0;
return position.concat(concatPos);
}
_reducePos() {
let position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
const found = ["Top", "Bottom", "Left", "Right"].find((pos) => position.endsWith(pos));
return found ? position.replace(found, "") : position;
}
clearDelayTimer() {
if (this._timer) {
clearTimeout(this._timer);
this._timer = null;
}
}
_generateEvent(types) {
const eventNames = this._adapter.getEventName();
const triggerEventSet = {
[eventNames.keydown]: (event) => {
this._handleTriggerKeydown(event);
}
};
let portalEventSet = {};
switch (types) {
case "focus":
triggerEventSet[eventNames.focus] = () => {
this.delayShow();
};
triggerEventSet[eventNames.blur] = () => {
this.delayHide();
};
portalEventSet = triggerEventSet;
break;
case "click":
triggerEventSet[eventNames.click] = () => {
this.show();
};
portalEventSet = {};
break;
case "hover":
triggerEventSet[eventNames.mouseEnter] = () => {
this.setCache("isClickToHide", false);
this.delayShow();
};
triggerEventSet[eventNames.mouseLeave] = () => {
this.delayHide();
};
triggerEventSet[eventNames.focus] = () => {
const {
disableFocusListener
} = this.getProps();
!disableFocusListener && this.delayShow();
};
triggerEventSet[eventNames.blur] = () => {
const {
disableFocusListener
} = this.getProps();
!disableFocusListener && this.delayHide();
};
portalEventSet = Object.assign({}, triggerEventSet);
if (this.getProp("clickToHide")) {
portalEventSet[eventNames.click] = () => {
this.setCache("isClickToHide", true);
this.hide();
};
portalEventSet[eventNames.mouseEnter] = () => {
if (this.getCache("isClickToHide")) {
return;
}
this.delayShow();
};
}
break;
case "custom":
break;
case "contextMenu":
triggerEventSet[eventNames.contextMenu] = (e) => {
e.preventDefault();
this.show();
};
break;
default:
break;
}
return {
triggerEventSet,
portalEventSet
};
}
_shouldShow() {
const visible = this.getProp("visible");
if (visible) {
this.show();
} else {
}
}
_togglePortalVisible(isVisible) {
const nowVisible = this.getState("visible");
const isInsert = this.getState("isInsert");
if (nowVisible !== isVisible || isInsert !== isVisible) {
this._adapter.togglePortalVisible(isVisible, () => {
if (isVisible) {
this._adapter.setInitialFocus();
}
this._adapter.notifyVisibleChange(isVisible);
});
}
}
_roundPixel(pixel) {
if (typeof pixel === "number") {
return Math.round(pixel);
}
return pixel;
}
calcTransformOrigin(position, triggerRect, translateX, translateY) {
if (position && triggerRect && translateX != null && translateY != null) {
if (this.getProp("transformFromCenter")) {
if (["topLeft", "bottomLeft"].includes(position)) {
return `${this._roundPixel(triggerRect.width / 2)}px ${-translateY * 100}%`;
}
if (["topRight", "bottomRight"].includes(position)) {
return `calc(100% - ${this._roundPixel(triggerRect.width / 2)}px) ${-translateY * 100}%`;
}
if (["leftTop", "rightTop"].includes(position)) {
return `${-translateX * 100}% ${this._roundPixel(triggerRect.height / 2)}px`;
}
if (["leftBottom", "rightBottom"].includes(position)) {
return `${-translateX * 100}% calc(100% - ${this._roundPixel(triggerRect.height / 2)}px)`;
}
}
return `${-translateX * 100}% ${-translateY * 100}%`;
}
return null;
}
calcPosStyle(props) {
var _a2;
const {
spacing,
isOverFlow
} = props;
const {
innerWidth
} = window;
const triggerRect = ((0, import_isEmpty.default)(props.triggerRect) ? props.triggerRect : this._adapter.getTriggerBounding()) || Object.assign({}, defaultRect);
const containerRect = ((0, import_isEmpty.default)(props.containerRect) ? props.containerRect : this._adapter.getPopupContainerRect()) || Object.assign({}, defaultRect);
const wrapperRect = ((0, import_isEmpty.default)(props.wrapperRect) ? props.wrapperRect : this._adapter.getWrapperBounding()) || Object.assign({}, defaultRect);
const position = props.position != null ? props.position : this.getProp("position");
const RAW_SPACING = spacing != null ? spacing : this.getProp("spacing");
const {
arrowPointAtCenter,
showArrow,
arrowBounding
} = this.getProps();
const pointAtCenter = showArrow && arrowPointAtCenter;
let SPACING = RAW_SPACING;
let ANO_SPACING = 0;
if (typeof RAW_SPACING !== "number") {
const isTopOrBottom = position.includes("top") || position.includes("bottom");
SPACING = isTopOrBottom ? RAW_SPACING.y : RAW_SPACING.x;
ANO_SPACING = isTopOrBottom ? RAW_SPACING.x : RAW_SPACING.y;
}
const horizontalArrowWidth = (0, import_get3.default)(arrowBounding, "width", 24);
const verticalArrowHeight = (0, import_get3.default)(arrowBounding, "width", 24);
const arrowOffsetY = (0, import_get3.default)(arrowBounding, "offsetY", 0);
const positionOffsetX = 6;
const positionOffsetY = 6;
let left;
let top;
let translateX = 0;
let translateY = 0;
const middleX = triggerRect.left + triggerRect.width / 2;
const middleY = triggerRect.top + triggerRect.height / 2;
const offsetXWithArrow = positionOffsetX + horizontalArrowWidth / 2;
const offsetYWithArrow = positionOffsetY + verticalArrowHeight / 2;
const heightDifference = wrapperRect.height - containerRect.height;
const widthDifference = wrapperRect.width - containerRect.width;
const offsetHeight = heightDifference > 0 ? heightDifference : 0;
const offsetWidth = widthDifference > 0 ? widthDifference : 0;
const isHeightOverFlow = isOverFlow && isOverFlow[0];
const isWidthOverFlow = isOverFlow && isOverFlow[1];
const isTriggerNearLeft = middleX - containerRect.left < containerRect.right - middleX;
const isTriggerNearTop = middleY - containerRect.top < containerRect.bottom - middleY;
const isWrapperWidthOverflow = wrapperRect.width > innerWidth;
const scaled = Math.abs((wrapperRect === null || wrapperRect === void 0 ? void 0 : wrapperRect.width) - ((_a2 = this._adapter.getContainer()) === null || _a2 === void 0 ? void 0 : _a2.clientWidth)) > 1;
if (scaled) {
SPACING = SPACING * wrapperRect.width / this._adapter.getContainer().clientWidth;
}
switch (position) {
case "top":
left = isWidthOverFlow ? isTriggerNearLeft ? containerRect.left + wrapperRect.width / 2 : containerRect.right - wrapperRect.width / 2 + offsetWidth : middleX + ANO_SPACING;
top = isHeightOverFlow ? containerRect.bottom + offsetHeight : triggerRect.top - SPACING;
translateX = -0.5;
translateY = -1;
break;
case "topLeft":
left = isWidthOverFlow ? isWrapperWidthOverflow ? containerRect.left : containerRect.right - wrapperRect.width : pointAtCenter ? middleX - offsetXWithArrow + ANO_SPACING : triggerRect.left + ANO_SPACING;
top = isHeightOverFlow ? containerRect.bottom + offsetHeight : triggerRect.top - SPACING;
translateY = -1;
break;
case "topRight":
left = isWidthOverFlow ? containerRect.right + offsetWidth : pointAtCenter ? middleX + offsetXWithArrow + ANO_SPACING : triggerRect.right + ANO_SPACING;
top = isHeightOverFlow ? containerRect.bottom + offsetHeight : triggerRect.top - SPACING;
translateY = -1;
translateX = -1;
break;
case "left":
left = isWidthOverFlow ? containerRect.right + offsetWidth - SPACING + offsetXWithArrow : triggerRect.left - SPACING;
top = isHeightOverFlow ? isTriggerNearTop ? containerRect.top + wrapperRect.height / 2 : containerRect.bottom - wrapperRect.height / 2 + offsetHeight : middleY + ANO_SPACING;
translateX = -1;
translateY = -0.5;
break;
case "leftTop":
left = isWidthOverFlow ? containerRect.right + offsetWidth - SPACING + offsetXWithArrow : triggerRect.left - SPACING;
top = isHeightOverFlow ? containerRect.top : pointAtCenter ? middleY - offsetYWithArrow + ANO_SPACING : triggerRect.top + ANO_SPACING;
translateX = -1;
break;
case "leftBottom":
left = isWidthOverFlow ? containerRect.right + offsetWidth - SPACING + offsetXWithArrow : triggerRect.left - SPACING;
top = isHeightOverFlow ? containerRect.bottom + offsetHeight : pointAtCenter ? middleY + offsetYWithArrow + ANO_SPACING : triggerRect.bottom + ANO_SPACING;
translateX = -1;
translateY = -1;
break;
case "bottom":
left = isWidthOverFlow ? isTriggerNearLeft ? containerRect.left + wrapperRect.width / 2 : containerRect.right - wrapperRect.width / 2 + offsetWidth : middleX + ANO_SPACING;
top = isHeightOverFlow ? containerRect.top + offsetYWithArrow - SPACING : triggerRect.top + triggerRect.height + SPACING;
translateX = -0.5;
break;
case "bottomLeft":
left = isWidthOverFlow ? isWrapperWidthOverflow ? containerRect.left : containerRect.right - wrapperRect.width : pointAtCenter ? middleX - offsetXWithArrow + ANO_SPACING : triggerRect.left + ANO_SPACING;
top = isHeightOverFlow ? containerRect.top + offsetYWithArrow - SPACING : triggerRect.top + triggerRect.height + SPACING;
break;
case "bottomRight":
left = isWidthOverFlow ? containerRect.right + offsetWidth : pointAtCenter ? middleX + offsetXWithArrow + ANO_SPACING : triggerRect.right + ANO_SPACING;
top = isHeightOverFlow ? containerRect.top + offsetYWithArrow - SPACING : triggerRect.top + triggerRect.height + SPACING;
translateX = -1;
break;
case "right":
left = isWidthOverFlow ? containerRect.left - SPACING + offsetXWithArrow : triggerRect.right + SPACING;
top = isHeightOverFlow ? isTriggerNearTop ? containerRect.top + wrapperRect.height / 2 : containerRect.bottom - wrapperRect.height / 2 + offsetHeight : middleY + ANO_SPACING;
translateY = -0.5;
break;
case "rightTop":
left = isWidthOverFlow ? containerRect.left - SPACING + offsetXWithArrow : triggerRect.right + SPACING;
top = isHeightOverFlow ? containerRect.top : pointAtCenter ? middleY - offsetYWithArrow + ANO_SPACING : triggerRect.top + ANO_SPACING;
break;
case "rightBottom":
left = isWidthOverFlow ? containerRect.left - SPACING + offsetXWithArrow : triggerRect.right + SPACING;
top = isHeightOverFlow ? containerRect.bottom + offsetHeight : pointAtCenter ? middleY + offsetYWithArrow + ANO_SPACING : triggerRect.bottom + ANO_SPACING;
translateY = -1;
break;
case "leftTopOver":
left = triggerRect.left - SPACING;
top = triggerRect.top - SPACING;
break;
case "rightTopOver":
left = triggerRect.right + SPACING;
top = triggerRect.top - SPACING;
translateX = -1;
break;
case "leftBottomOver":
left = triggerRect.left - SPACING;
top = triggerRect.bottom + SPACING;
translateY = -1;
break;
case "rightBottomOver":
left = triggerRect.right + SPACING;
top = triggerRect.bottom + SPACING;
translateX = -1;
translateY = -1;
break;
default:
break;
}
const transformOrigin = this.calcTransformOrigin(position, triggerRect, translateX, translateY);
const _containerIsBody = this._adapter.containerIsBody();
left = left - containerRect.left;
top = top - containerRect.top;
if (scaled) {
left /= wrapperRect.width / this._adapter.getContainer().clientWidth;
}
if (scaled) {
top /= wrapperRect.height / this._adapter.getContainer().clientHeight;
}
if (_containerIsBody && !this._adapter.containerIsRelativeOrAbsolute()) {
const documentEleRect = this._adapter.getDocumentElementBounding();
left += containerRect.left - documentEleRect.left;
top += containerRect.top - documentEleRect.top;
}
left = _containerIsBody ? left : left + containerRect.scrollLeft;
top = _containerIsBody ? top : top + containerRect.scrollTop;
const triggerHeight = triggerRect.height;
if (this.getProp("showArrow") && !arrowPointAtCenter && triggerHeight <= (verticalArrowHeight / 2 + arrowOffsetY) * 2) {
const offsetY = triggerHeight / 2 - (arrowOffsetY + verticalArrowHeight / 2);
if ((position.includes("Top") || position.includes("Bottom")) && !position.includes("Over")) {
top = position.includes("Top") ? top + offsetY : top - offsetY;
}
}
const style = {
left: this._roundPixel(left),
top: this._roundPixel(top)
};
let transform = "";
if (translateX != null) {
transform += `translateX(${translateX * 100}%) `;
Object.defineProperty(style, "translateX", {
enumerable: false,
value: translateX
});
}
if (translateY != null) {
transform += `translateY(${translateY * 100}%) `;
Object.defineProperty(style, "translateY", {
enumerable: false,
value: translateY
});
}
if (transformOrigin != null) {
style.transformOrigin = transformOrigin;
}
if (transform) {
style.transform = transform;
}
return style;
}
isLR() {
let position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
return position.includes("left") || position.includes("right");
}
isTB() {
let position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
return position.includes("top") || position.includes("bottom");
}
isReverse(rowSpace, reverseSpace, size) {
return rowSpace < size && reverseSpace > size;
}
isOverFlow(rowSpace, reverseSpace, size) {
return rowSpace < size && reverseSpace < size;
}
isHalfOverFlow(posSpace, negSpace, size) {
return posSpace < size || negSpace < size;
}
isHalfAllEnough(posSpace, negSpace, size) {
return posSpace >= size || negSpace >= size;
}
getReverse(viewOverFlow, containerOverFlow, shouldReverseView, shouldReverseContainer) {
return viewOverFlow && shouldReverseContainer || shouldReverseView;
}
adjustPosIfNeed(position, style, triggerRect, wrapperRect, containerRect) {
const {
innerWidth,
innerHeight
} = window;
const {
margin
} = this.getProps();
const marginLeft = typeof margin === "number" ? margin : margin.marginLeft;
const marginTop = typeof margin === "number" ? margin : margin.marginTop;
const marginRight = typeof margin === "number" ? margin : margin.marginRight;
const marginBottom = typeof margin === "number" ? margin : margin.marginBottom;
let isHeightOverFlow = false;
let isWidthOverFlow = false;
const raw_spacing = this.getProp("spacing");
let spacing = raw_spacing;
let ano_spacing = 0;
if (typeof raw_spacing !== "number") {
const isTopOrBottom = position.includes("top") || position.includes("bottom");
spacing = isTopOrBottom ? raw_spacing.y : raw_spacing.x;
ano_spacing = isTopOrBottom ? raw_spacing.x : raw_spacing.y;
}
if (wrapperRect.width > 0 && wrapperRect.height > 0) {
const clientLeft = triggerRect.left;
const clientRight = triggerRect.right;
const clientTop = triggerRect.top;
const clientBottom = triggerRect.bottom;
const restClientLeft = innerWidth - clientLeft;
const restClientTop = innerHeight - clientTop;
const restClientRight = innerWidth - clientRight;
const restClientBottom = innerHeight - clientBottom;
const widthIsBigger = wrapperRect.width > triggerRect.width;
const heightIsBigger = wrapperRect.height > triggerRect.height;
const shouldViewReverseTop = clientTop - marginTop < wrapperRect.height + spacing && restClientBottom - marginBottom > wrapperRect.height + spacing;
const shouldViewReverseLeft = clientLeft - marginLeft < wrapperRect.width + spacing && restClientRight - marginRight > wrapperRect.width + spacing;
const shouldViewReverseBottom = restClientBottom - marginBottom < wrapperRect.height + spacing && clientTop - marginTop > wrapperRect.height + spacing;
const shouldViewReverseRight = restClientRight - marginRight < wrapperRect.width + spacing && clientLeft - marginLeft > wrapperRect.width + spacing;
const shouldViewReverseTopOver = restClientTop - marginBottom < wrapperRect.height + spacing && clientBottom - marginTop > wrapperRect.height + spacing;
const shouldViewReverseBottomOver = clientBottom - marginTop < wrapperRect.height + spacing && restClientTop - marginBottom > wrapperRect.height + spacing;
const shouldViewReverseTopSide = restClientTop < wrapperRect.height + ano_spacing && clientBottom > wrapperRect.height + ano_spacing;
const shouldViewReverseBottomSide = clientBottom < wrapperRect.height + ano_spacing && restClientTop > wrapperRect.height + ano_spacing;
const shouldViewReverseLeftSide = restClientLeft < wrapperRect.width + ano_spacing && clientRight > wrapperRect.width + ano_spacing;
const shouldViewReverseRightSide = clientRight < wrapperRect.width + ano_spacing && restClientLeft > wrapperRect.width + ano_spacing;
const shouldReverseTopOver = restClientTop < wrapperRect.height + spacing && clientBottom > wrapperRect.height + spacing;
const shouldReverseBottomOver = clientBottom < wrapperRect.height + spacing && restClientTop > wrapperRect.height + spacing;
const shouldReverseLeftOver = restClientLeft < wrapperRect.width && clientRight > wrapperRect.width;
const shouldReverseRightOver = clientRight < wrapperRect.width && restClientLeft > wrapperRect.width;
const clientTopInContainer = clientTop - containerRect.top;
const clientLeftInContainer = clientLeft - containerRect.left;
const clientBottomInContainer = clientTopInContainer + triggerRect.height;
const clientRightInContainer = clientLeftInContainer + triggerRect.width;
const restClientBottomInContainer = containerRect.bottom - clientBottom;
const restClientRightInContainer = containerRect.right - clientRight;
const restClientTopInContainer = restClientBottomInContainer + triggerRect.height;
const restClientLeftInContainer = restClientRightInContainer + triggerRect.width;
const shouldContainerReverseTop = this.isReverse(clientTopInContainer - marginTop, restClientBottomInContainer - marginBottom, wrapperRect.height + spacing);
const shouldContainerReverseLeft = this.isReverse(clientLeftInContainer - marginLeft, restClientRightInContainer - marginRight, wrapperRect.width + spacing);
const shouldContainerReverseBottom = this.isReverse(restClientBottomInContainer - marginBottom, clientTopInContainer - marginTop, wrapperRect.height + spacing);
const shouldContainerReverseRight = this.isReverse(restClientRightInContainer - marginRight, clientLeftInContainer - marginLeft, wrapperRect.width + spacing);
const shouldContainerReverseTopOver = this.isReverse(restClientTopInContainer - marginBottom, clientBottomInContainer - marginTop, wrapperRect.height + spacing);
const shouldContainerReverseBottomOver = this.isReverse(clientBottomInContainer - marginTop, restClientTopInContainer - marginBottom, wrapperRect.height + spacing);
const shouldContainerReverseTopSide = this.isReverse(restClientTopInContainer, clientBottomInContainer, wrapperRect.height + ano_spacing);
const shouldContainerReverseBottomSide = this.isReverse(clientBottomInContainer, restClientTopInContainer, wrapperRect.height + ano_spacing);
const shouldContainerReverseLeftSide = this.isReverse(restClientLeftInContainer, clientRightInContainer, wrapperRect.width + ano_spacing);
const shouldContainerReverseRightSide = this.isReverse(clientRightInContainer, restClientLeftInContainer, wrapperRect.width + ano_spacing);
const halfHeight = triggerRect.height / 2;
const halfWidth = triggerRect.width / 2;
const isViewYOverFlow = this.isOverFlow(clientTop - marginTop, restClientBottom - marginBottom, wrapperRect.height + spacing);
const isViewXOverFlow = this.isOverFlow(clientLeft - marginLeft, restClientRight - marginRight, wrapperRect.width + spacing);
const isViewYOverFlowSide = this.isOverFlow(clientBottom - marginTop, restClientTop - marginBottom, wrapperRect.height + spacing);
const isViewXOverFlowSide = this.isOverFlow(clientRight - marginLeft, restClientLeft - marginRight, wrapperRect.width + spacing);
const isViewYOverFlowSideHalf = this.isHalfOverFlow(clientBottom - halfHeight, restClientTop - halfHeight, (wrapperRect.height + ano_spacing) / 2);
const isViewXOverFlowSideHalf = this.isHalfOverFlow(clientRight - halfWidth, restClientLeft - halfWidth, (wrapperRect.width + ano_spacing) / 2);
const isViewYEnoughSideHalf = this.isHalfAllEnough(clientBottom - halfHeight, restClientTop - halfHeight, (wrapperRect.height + ano_spacing) / 2);
const isViewXEnoughSideHalf = this.isHalfAllEnough(clientRight - halfWidth, restClientLeft - halfWidth, (wrapperRect.width + ano_spacing) / 2);
const isContainerYOverFlow = this.isOverFlow(clientTopInContainer - marginTop, restClientBottomInContainer - marginBottom, wrapperRect.height + spacing);
const isContainerXOverFlow = this.isOverFlow(clientLeftInContainer - marginLeft, restClientRightInContainer - marginRight, wrapperRect.width + spacing);
const isContainerYOverFlowSide = this.isOverFlow(clientBottomInContainer - marginTop, restClientTopInContainer - marginBottom, wrapperRect.height + spacing);
const isContainerXOverFlowSide = this.isOverFlow(clientRightInContainer - marginLeft, restClientLeftInContainer - marginRight, wrapperRect.width + spacing);
const isContainerYOverFlowSideHalf = this.isHalfOverFlow(clientBottomInContainer - halfHeight, restClientTopInContainer - halfHeight, (wrapperRect.height + ano_spacing) / 2);
const isContainerXOverFlowSideHalf = this.isHalfOverFlow(clientRightInContainer - halfWidth, restClientLeftInContainer - halfWidth, (wrapperRect.width + ano_spacing) / 2);
const isContainerYEnoughSideHalf = this.isHalfAllEnough(clientBottomInContainer - halfHeight, restClientTopInContainer - halfHeight, (wrapperRect.height + ano_spacing) / 2);
const isContainerXEnoughSideHalf = this.isHalfAllEnough(clientRightInContainer - halfWidth, restClientLeftInContainer - halfWidth, (wrapperRect.width + ano_spacing) / 2);
const shouldReverseTop = this.getReverse(isViewYOverFlow, isContainerYOverFlow, shouldViewReverseTop, shouldContainerReverseTop);
const shouldReverseLeft = this.getReverse(isViewXOverFlow, isContainerXOverFlow, shouldViewReverseLeft, shouldContainerReverseLeft);
const shouldReverseBottom = this.getReverse(isViewYOverFlow, isContainerYOverFlow, shouldViewReverseBottom, shouldContainerReverseBottom);
const shouldReverseRight = this.getReverse(isViewXOverFlow, isContainerXOverFlow, shouldViewReverseRight, shouldContainerReverseRight);
const shouldReverseTopSide = this.getReverse(isViewYOverFlowSide, isContainerYOverFlowSide, shouldViewReverseTopSide, shouldContainerReverseTopSide);
const shouldReverseBottomSide = this.getReverse(isViewYOverFlowSide, isContainerYOverFlowSide, shouldViewReverseBottomSide, shouldContainerReverseBottomSide);
const shouldReverseLeftSide = this.getReverse(isViewXOverFlowSide, isContainerXOverFlowSide, shouldViewReverseLeftSide, shouldContainerReverseLeftSide);
const shouldReverseRightSide = this.getReverse(isViewXOverFlowSide, isContainerXOverFlowSide, shouldViewReverseRightSide, shouldContainerReverseRightSide);
const isYOverFlowSideHalf = isViewYOverFlowSideHalf && isContainerYOverFlowSideHalf;
const isXOverFlowSideHalf = isViewXOverFlowSideHalf && isContainerXOverFlowSideHalf;
switch (position) {
case "top":
if (shouldReverseTop) {
position = this._adjustPos(position, true);
}
if (isXOverFlowSideHalf && (shouldReverseLeftSide || shouldReverseRightSide)) {
position = this._adjustPos(position, true, "expand", shouldReverseLeftSide ? "Right" : "Left");
}
break;
case "topLeft":
if (shouldReverseTop) {
position = this._adjustPos(position, true);
}
if (shouldReverseLeftSide && widthIsBigger) {
position = this._adjustPos(position);
}
if (isWidthOverFlow && (isViewXEnoughSideHalf || isContainerXEnoughSideHalf)) {
position = this._adjustPos(position, true, "reduce");
}
break;
case "topRight":
if (shouldReverseTop) {
position = this._adjustPos(position, true);
}
if (shouldReverseRightSide && widthIsBigger) {
position = this._adjustPos(position);
}
if (isWidthOverFlow && (isViewXEnoughSideHalf || isContainerXEnoughSideHalf)) {
position = this._adjustPos(position, true, "reduce");
}
break;
case "left":
if (shouldReverseLeft) {
position = this._adjustPos(position);
}
if (isYOverFlowSideHalf && (shouldReverseTopSide || shouldReverseBottomSide)) {
position = this._adjustPos(position, false, "expand", shouldReverseTopSide ? "Bottom" : "Top");
}
break;
case "leftTop":
if (shouldReverseLeft) {
position = this._adjustPos(position);
}
if (shouldReverseTopSide && heightIsBigger) {
position = this._adjustPos(position, true);
}
if (isHeightOverFlow && (isViewYEnoughSideHalf || isContainerYEnoughSideHalf)) {
position = this._adjustPos(position, false, "reduce");
}
break;
case "leftBottom":
if (shouldReverseLeft) {
position = this._adjustPos(position);
}
if (shouldReverseBottomSide && heightIsBigger) {
position = this._adjustPos(position, true);
}
if (isHeightOverFlow && (isViewYEnoughSideHalf || isContainerYEnoughSideHalf)) {
position = this._adjustPos(position, false, "reduce");
}
break;
case "bottom":
if (shouldReverseBottom) {
position = this._adjustPos(position, true);
}
if (isXOverFlowSideHalf && (shouldReverseLeftSide || shouldReverseRightSide)) {
position = this._adjustPos(position, true, "expand", shouldReverseLeftSide ? "Right" : "Left");
}
break;
case "bottomLeft":
if (shouldReverseBottom) {
position = this._adjustPos(position, true);
}
if (shouldReverseLeftSide && widthIsBigger) {
position = this._adjustPos(position);
}
if (isWidthOverFlow && (isViewXEnoughSideHalf || isContainerXEnoughSideHalf)) {
position = this._adjustPos(position, true, "reduce");
}
break;
case "bottomRight":
if (shouldReverseBottom) {
position = this._adjustPos(position, true);
}
if (shouldReverseRightSide && widthIsBigger) {
position = this._adjustPos(position);
}
if (isWidthOverFlow && (isViewXEnoughSideHalf || isContainerXEnoughSideHalf)) {
position = this._adjustPos(position, true, "reduce");
}
break;
case "right":
if (shouldReverseRight) {
position = this._adjustPos(position);
}
if (isYOverFlowSideHalf && (shouldReverseTopSide || shouldReverseBottomSide)) {
position = this._adjustPos(position, false, "expand", shouldReverseTopSide ? "Bottom" : "Top");
}
break;
case "rightTop":
if (shouldReverseRight) {
position = this._adjustPos(position);
}
if (shouldReverseTopSide && heightIsBigger) {
position = this._adjustPos(position, true);
}
if (isHeightOverFlow && (isViewYEnoughSideHalf || isContainerYEnoughSideHalf)) {
position = this._adjustPos(position, false, "reduce");
}
break;
case "rightBottom":
if (shouldReverseRight) {
position = this._adjustPos(position);
}
if (shouldReverseBottomSide && heightIsBigger) {
position = this._adjustPos(position, true);
}
if (isHeightOverFlow && (isViewYEnoughSideHalf || isContainerYEnoughSideHalf)) {
position = this._adjustPos(position, false, "reduce");
}
break;
case "leftTopOver":
if (shouldReverseTopOver) {
position = this._adjustPos(position, true);
}
if (shouldReverseLeftOver) {
position = this._adjustPos(position);
}
break;
case "leftBottomOver":
if (shouldReverseBottomOver) {
position = this._adjustPos(position, true);
}
if (shouldReverseLeftOver) {
position = this._adjustPos(position);
}
break;
case "rightTopOver":
if (shouldReverseTopOver) {
position = this._adjustPos(position, true);
}
if (shouldReverseRightOver) {
position = this._adjustPos(position);
}
break;
case "rightBottomOver":
if (shouldReverseBottomOver) {
position = this._adjustPos(position, true);
}
if (shouldReverseRightOver) {
position = this._adjustPos(position);
}
break;
default:
break;
}
if (this.isTB(position)) {
isHeightOverFlow = isViewYOverFlow && isContainerYOverFlow;
if (position === "top" || position === "bottom") {
isWidthOverFlow = isViewXOverFlowSideHalf && isContainerXOverFlowSideHalf || clientRight < 0 || restClientRight < 0;
} else {
isWidthOverFlow = isViewXOverFlowSide && isContainerXOverFlowSide || clientRight < 0 || restClientRight < 0;
}
}
if (this.isLR(position)) {
isWidthOverFlow = isViewXOverFlow && isContainerXOverFlow;
if (position === "left" || position === "right") {
isHeightOverFlow = isViewYOverFlowSideHalf && isContainerYOverFlowSideHalf || clientTop < 0 || restClientTop < 0;
} else {
isHeightOverFlow = isViewYOverFlowSide && isContainerYOverFlowSide || clientTop < 0 || restClientTop < 0;
}
}
}
return {
position,
isHeightOverFlow,
isWidthOverFlow
};
}
_bindScrollEvent() {
this._adapter.registerScrollHandler(() => this.calcPosition());
}
unBindScrollEvent() {
this._adapter.unregisterScrollHandler();
}
_initContainerPosition() {
this._adapter.updateContainerPosition();
}
_handleTriggerKeydown(event) {
const {
closeOnEsc,
disableArrowKeyDown
} = this.getProps();
const container = this._adapter.getContainer();
const focusableElements = this._adapter.getFocusableElements(container);
const focusableNum = focusableElements.length;
switch (event && event.key) {
case "Escape":
handlePrevent(event);
closeOnEsc && this._handleEscKeyDown(event);
break;
case "ArrowUp":
!disableArrowKeyDown && focusableNum && this._handleTriggerArrowUpKeydown(focusableElements, event);
break;
case "ArrowDown":
!disableArrowKeyDown && focusableNum && this._handleTriggerArrowDownKeydown(focusableElements, event);
break;
default:
break;
}
}
focusTrigger() {
const {
trigger,
returnFocusOnClose,
preventScroll
} = this.getProps();
if (returnFocusOnClose && trigger !== "custom") {
const triggerNode = this._adapter.getTriggerNode();
if (triggerNode && "focus" in triggerNode) {
triggerNode.focus({
preventScroll
});
}
}
}
_handleEscKeyDown(event) {
const {
trigger
} = this.getProps();
if (trigger !== "custom") {
this.focusTrigger();
this.hide();
}
this._adapter.notifyEscKeydown(event);
}
_handleContainerTabKeyDown(focusableElements, event) {
const {
preventScroll
} = this.getProps();
const activeElement = this._adapter.getActiveElement();
const isLastCurrentFocus = focusableElements[focusableElements.length - 1] === activeElement;
if (isLastCurrentFocus) {
focusableElements[0].focus({
preventScroll
});
event.preventDefault();
}
}
_handleContainerShiftTabKeyDown(focusableElements, event) {
const {
preventScroll
} = this.getProps();
const activeElement = this._adapter.getActiveElement();
const isFirstCurrentFocus = focusableElements[0] === activeElement;
if (isFirstCurrentFocus) {
focusableElements[focusableElements.length - 1].focus({
preventScroll
});
event.preventDefault();
}
}
_handleTriggerArrowDownKeydown(focusableElements, event) {
const {
preventScroll
} = this.getProps();
focusableElements[0].focus({
preventScroll
});
event.preventDefault();
}
_handleTriggerArrowUpKeydown(focusableElements, event) {
const {
preventScroll
} = this.getProps();
focusableElements[focusableElements.length - 1].focus({
preventScroll
});
event.preventDefault();
}
};
// node_modules/@douyinfe/semi-foundation/lib/es/tooltip/constants.js
var cssClasses2 = {
PREFIX: `${BASE_CLASS_PREFIX}-tooltip`
};
var strings2 = {
POSITION_SET: ["top", "topLeft", "topRight", "left", "leftTop", "leftBottom", "right", "rightTop", "rightBottom", "bottom", "bottomLeft", "bottomRight", "leftTopOver", "rightTopOver", "leftBottomOver", "rightBottomOver"],
TRIGGER_SET: ["hover", "focus", "click", "custom", "contextMenu"],
STATUS_DISABLED: "disabled",
STATUS_LOADING: "loading"
};
var numbers = {
ARROW_BOUNDING: {
offsetX: 0,
offsetY: 2,
width: 24,
height: 7
},
DEFAULT_Z_INDEX: 1060,
MOUSE_ENTER_DELAY: 50,
MOUSE_LEAVE_DELAY: 50,
SPACING: 8,
MARGIN: 0
};
// node_modules/@douyinfe/semi-foundation/lib/es/utils/uuid.js
function getUuid(prefix2) {
return `${prefix2}-${new Date().getTime()}-${Math.random()}`;
}
function getUuidv4() {
var _a2, _b;
try {
return (_b = (_a2 = crypto === null || crypto === void 0 ? void 0 : crypto.randomUUID) === null || _a2 === void 0 ? void 0 : _a2.call(crypto)) !== null && _b !== void 0 ? _b : String(1e7 + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (Number(c) ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> Number(c) / 4).toString(16));
} catch (err) {
return getUuid("semi");
}
}
function getUuidShort() {
let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
const {
prefix: prefix2 = "",
length = 7
} = options;
const characters = "0123456789abcdefghijklmnopqrstuvwxyz";
const total = characters.length;
let randomId = "";
for (let i = 0; i < length; i++) {
const random = Math.floor(Math.random() * total);
randomId += characters.charAt(random);
}
return prefix2 ? `${prefix2}-${randomId}` : randomId;
}
// node_modules/@douyinfe/semi-ui/lib/es/_base/reactUtils.js
var import_react3 = __toModule(require_react());
// node_modules/@douyinfe/semi-ui/lib/es/_utils/index.js
var import_get4 = __toModule(require_get2());
var import_set = __toModule(require_set());
var import_cloneDeepWith = __toModule(require_cloneDeepWith());
var import_react4 = __toModule(require_react());
// node_modules/@douyinfe/semi-ui/lib/es/_utils/semi-global.js
var SemiGlobal = class {
constructor() {
this.config = {};
}
};
var semi_global_default = new SemiGlobal();
// node_modules/@douyinfe/semi-ui/lib/es/_utils/index.js
var __awaiter = function(thisArg, _arguments, P, generator3) {
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(generator3.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator3["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator3 = generator3.apply(thisArg, _arguments || [])).next());
});
};
function stopPropagation(e, noImmediate) {
if (e && typeof e.stopPropagation === "function") {
e.stopPropagation();
}
if (!noImmediate && e.nativeEvent && typeof e.nativeEvent.stopImmediatePropagation === "function") {
e.nativeEvent.stopImmediatePropagation();
}
}
var registerMediaQuery = (media, _ref) => {
let {
match: match2,
unmatch,
callInInit = true
} = _ref;
if (typeof window !== "undefined") {
let handlerMediaChange = function(e) {
if (e.matches) {
match2 && match2(e);
} else {
unmatch && unmatch(e);
}
};
const mediaQueryList = window.matchMedia(media);
callInInit && handlerMediaChange(mediaQueryList);
if (Object.prototype.hasOwnProperty.call(mediaQueryList, "addEventListener")) {
mediaQueryList.addEventListener("change", handlerMediaChange);
return () => mediaQueryList.removeEventListener("change", handlerMediaChange);
}
mediaQueryList.addListener(handlerMediaChange);
return () => mediaQueryList.removeListener(handlerMediaChange);
}
return () => void 0;
};
var isSemiIcon = (icon) => /* @__PURE__ */ import_react4.default.isValidElement(icon) && (0, import_get4.default)(icon.type, "elementType") === "Icon";
function getActiveElement() {
return document ? document.activeElement : null;
}
function getFocusableElements(node) {
if (!isElement(node)) {
return [];
}
const focusableSelectorsList = ["input:not([disabled]):not([tabindex='-1'])", "textarea:not([disabled]):not([tabindex='-1'])", "button:not([disabled]):not([tabindex='-1'])", "a[href]:not([tabindex='-1'])", "select:not([disabled]):not([tabindex='-1'])", "area[href]:not([tabindex='-1'])", "iframe:not([tabindex='-1'])", "object:not([tabindex='-1'])", "*[tabindex]:not([tabindex='-1'])", "*[contenteditable]:not([tabindex='-1'])"];
const focusableSelectorsStr = focusableSelectorsList.join(",");
const focusableElements = Array.from(node.querySelectorAll(focusableSelectorsStr));
return focusableElements;
}
function runAfterTicks(func, numberOfTicks) {
return __awaiter(this, void 0, void 0, function* () {
if (numberOfTicks === 0) {
yield func();
return;
} else {
yield new Promise((resolve) => {
setTimeout(() => __awaiter(this, void 0, void 0, function* () {
yield runAfterTicks(func, numberOfTicks - 1);
resolve();
}), 0);
});
return;
}
});
}
function getDefaultPropsFromGlobalConfig(componentName) {
let semiDefaultProps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
const getFromGlobalConfig = () => {
var _a2, _b;
return ((_b = (_a2 = semi_global_default === null || semi_global_default === void 0 ? void 0 : semi_global_default.config) === null || _a2 === void 0 ? void 0 : _a2.overrideDefaultProps) === null || _b === void 0 ? void 0 : _b[componentName]) || {};
};
return new Proxy(Object.assign({}, semiDefaultProps), {
get(target, key, receiver) {
const defaultPropsFromGlobal = getFromGlobalConfig();
if (key in defaultPropsFromGlobal) {
return defaultPropsFromGlobal[key];
}
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
return Reflect.set(target, key, value, receiver);
},
ownKeys() {
const defaultPropsFromGlobal = getFromGlobalConfig();
return Array.from(new Set([...Reflect.ownKeys(semiDefaultProps), ...Object.keys(defaultPropsFromGlobal)]));
},
getOwnPropertyDescriptor(target, key) {
const defaultPropsFromGlobal = getFromGlobalConfig();
if (key in defaultPropsFromGlobal) {
return Reflect.getOwnPropertyDescriptor(defaultPropsFromGlobal, key);
} else {
return Reflect.getOwnPropertyDescriptor(target, key);
}
}
});
}
// node_modules/@douyinfe/semi-ui/lib/es/_portal/index.js
var import_react6 = __toModule(require_react());
var import_react_dom = __toModule(require_react_dom());
var import_prop_types2 = __toModule(require_prop_types());
var import_classnames2 = __toModule(require_classnames());
// node_modules/@douyinfe/semi-ui/lib/es/configProvider/context.js
var import_react5 = __toModule(require_react());
var ConfigContext = /* @__PURE__ */ import_react5.default.createContext({});
var context_default = ConfigContext;
// node_modules/@douyinfe/semi-ui/lib/es/_portal/index.js
var defaultGetContainer = () => document.body;
var Portal = class extends import_react6.PureComponent {
constructor(props, context) {
var _this;
super(props);
_this = this;
this.initContainer = function(context2) {
let catchError = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var _a2, _b;
try {
let container = void 0;
if (!_this.el || !((_a2 = _this.state) === null || _a2 === void 0 ? void 0 : _a2.container) || !Array.from(_this.state.container.childNodes).includes(_this.el)) {
_this.el = document.createElement("div");
const getContainer = _this.props.getPopupContainer || context2.getPopupContainer || defaultGetContainer;
const portalContainer = getContainer();
portalContainer.appendChild(_this.el);
_this.addStyle(_this.props.style);
_this.addClass(_this.props.prefixCls, context2, _this.props.className);
container = portalContainer;
return container;
}
} catch (e) {
if (!catchError) {
throw e;
}
}
return (_b = _this.state) === null || _b === void 0 ? void 0 : _b.container;
};
this.addStyle = function() {
let style = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
if (_this.el) {
for (const key of Object.keys(style)) {
_this.el.style[key] = style[key];
}
}
};
this.addClass = function(prefixCls17) {
let context2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : _this.context;
const {
direction
} = context2;
for (var _len = arguments.length, classNames5 = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
classNames5[_key - 2] = arguments[_key];
}
const cls26 = (0, import_classnames2.default)(prefixCls17, ...classNames5, {
[`${prefixCls17}-rtl`]: direction === "rtl"
});
if (_this.el) {
_this.el.className = cls26;
}
};
this.state = {
container: this.initContainer(context, true)
};
}
componentDidMount() {
const container = this.initContainer(this.context);
if (container !== this.state.container) {
this.setState({
container
});
}
}
componentDidUpdate(prevProps) {
const {
didUpdate
} = this.props;
if (didUpdate) {
didUpdate(prevProps);
}
}
componentWillUnmount() {
const {
container
} = this.state;
if (container) {
container.removeChild(this.el);
}
}
render() {
const {
state,
props
} = this;
if (state.container) {
return /* @__PURE__ */ (0, import_react_dom.createPortal)(props.children, this.el);
}
return null;
}
};
Portal.contextType = context_default;
Portal.defaultProps = {
prefixCls: `${BASE_CLASS_PREFIX}-portal`
};
Portal.propTypes = {
children: import_prop_types2.default.node,
prefixCls: import_prop_types2.default.string,
getPopupContainer: import_prop_types2.default.func,
className: import_prop_types2.default.string,
didUpdate: import_prop_types2.default.func
};
var portal_default = Portal;
// node_modules/@douyinfe/semi-ui/lib/es/tooltip/TriangleArrow.js
var import_react7 = __toModule(require_react());
var __rest2 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var TriangleArrow = (props) => {
const {
className,
style
} = props, restProps = __rest2(props, ["className", "style"]);
return /* @__PURE__ */ import_react7.default.createElement("svg", Object.assign({
"aria-hidden": true,
className,
style
}, restProps, {
width: "24",
height: "7",
viewBox: "0 0 24 7",
fill: "currentColor",
xmlns: "http://www.w3.org/2000/svg"
}), /* @__PURE__ */ import_react7.default.createElement("path", {
d: "M24 0V1C20 1 18.5 2 16.5 4C14.5 6 14 7 12 7C10 7 9.5 6 7.5 4C5.5 2 4 1 0 1V0H24Z"
}));
};
var TriangleArrow_default = TriangleArrow;
// node_modules/@douyinfe/semi-ui/lib/es/tooltip/TriangleArrowVertical.js
var import_react8 = __toModule(require_react());
var __rest3 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var TriangleArrowVertical = (props) => {
const {
className,
style
} = props, restProps = __rest3(props, ["className", "style"]);
return /* @__PURE__ */ import_react8.default.createElement("svg", Object.assign({
"aria-hidden": true,
className,
style
}, restProps, {
width: "7",
height: "24",
xmlns: "http://www.w3.org/2000/svg",
fill: "currentColor"
}), /* @__PURE__ */ import_react8.default.createElement("path", {
d: "M0 0L1 0C1 4, 2 5.5, 4 7.5S7,10 7,12S6 14.5, 4 16.5S1,20 1,24L0 24L0 0z"
}));
};
var TriangleArrowVertical_default = TriangleArrowVertical;
// node_modules/@douyinfe/semi-ui/lib/es/tooltip/ArrowBoundingShape.js
var import_prop_types3 = __toModule(require_prop_types());
var ArrowBoundingShape_default = import_prop_types3.default.shape({
offsetX: import_prop_types3.default.number,
offsetY: import_prop_types3.default.number,
width: import_prop_types3.default.number,
height: import_prop_types3.default.number
});
// node_modules/@douyinfe/semi-ui/lib/es/_cssAnimation/index.js
var import_isEqual = __toModule(require_isEqual());
var import_react9 = __toModule(require_react());
var CSSAnimation = class extends import_react9.default.Component {
constructor(props) {
super(props);
this.handleAnimationStart = () => {
var _a2, _b;
(_b = (_a2 = this.props).onAnimationStart) === null || _b === void 0 ? void 0 : _b.call(_a2);
};
this.handleAnimationEnd = () => {
this.setState({
currentClassName: this.props.endClassName,
extraStyle: {
animationFillMode: this.props.fillMode
},
isAnimating: false
}, () => {
var _a2, _b;
(_b = (_a2 = this.props).onAnimationEnd) === null || _b === void 0 ? void 0 : _b.call(_a2, false);
});
};
this.state = {
currentClassName: this.props.startClassName,
extraStyle: {
animationFillMode: this.props.fillMode
},
isAnimating: true
};
}
componentDidMount() {
var _a2, _b, _c, _d;
(_b = (_a2 = this.props).onAnimationStart) === null || _b === void 0 ? void 0 : _b.call(_a2);
if (!this.props.motion) {
(_d = (_c = this.props).onAnimationEnd) === null || _d === void 0 ? void 0 : _d.call(_c, false);
this.setState({
isAnimating: false
});
}
}
componentDidUpdate(prevProps, prevState, snapshot) {
const changedKeys = Object.keys(this.props).filter((key) => !(0, import_isEqual.default)(this.props[key], prevProps[key]));
if (changedKeys.includes("animationState")) {
}
if (changedKeys.includes("startClassName") || changedKeys.includes("replayKey") || changedKeys.includes("motion")) {
this.setState({
currentClassName: this.props.startClassName,
extraStyle: {
animationFillMode: this.props.fillMode
},
isAnimating: true
}, () => {
var _a2, _b, _c, _d;
(_b = (_a2 = this.props).onAnimationStart) === null || _b === void 0 ? void 0 : _b.call(_a2);
if (!this.props.motion) {
(_d = (_c = this.props).onAnimationEnd) === null || _d === void 0 ? void 0 : _d.call(_c, this.state.isAnimating);
this.setState({
isAnimating: false
});
}
});
}
}
render() {
var _a2;
if (this.props.motion) {
return this.props.children({
animationClassName: (_a2 = this.state.currentClassName) !== null && _a2 !== void 0 ? _a2 : "",
animationStyle: this.state.extraStyle,
animationEventsNeedBind: {
onAnimationStart: this.handleAnimationStart,
onAnimationEnd: this.handleAnimationEnd
},
isAnimating: this.state.isAnimating
});
} else {
return this.props.children({
animationClassName: "",
animationStyle: {},
animationEventsNeedBind: {},
isAnimating: this.state.isAnimating
});
}
}
};
CSSAnimation.defaultProps = {
motion: true,
replayKey: ""
};
var cssAnimation_default = CSSAnimation;
// node_modules/@douyinfe/semi-ui/lib/es/tooltip/index.js
var __rest4 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefix = cssClasses2.PREFIX;
var positionSet = strings2.POSITION_SET;
var triggerSet = strings2.TRIGGER_SET;
var blockDisplays = ["flex", "block", "table", "flow-root", "grid"];
var defaultGetContainer2 = () => document.body;
var Tooltip2 = class extends BaseComponent {
constructor(props) {
super(props);
this.isAnimating = false;
this.setContainerEl = (node) => this.containerEl = {
current: node
};
this.isSpecial = (elem) => {
if (isElement(elem)) {
return Boolean(elem.disabled);
} else if (/* @__PURE__ */ (0, import_react10.isValidElement)(elem)) {
const disabled = (0, import_get5.default)(elem, "props.disabled");
if (disabled) {
return strings2.STATUS_DISABLED;
}
const loading = (0, import_get5.default)(elem, "props.loading");
const isButton = !(0, import_isEmpty2.default)(elem) && !(0, import_isEmpty2.default)(elem.type) && ((0, import_get5.default)(elem, "type.elementType") === "Button" || (0, import_get5.default)(elem, "type.elementType") === "IconButton");
if (loading && isButton) {
return strings2.STATUS_LOADING;
}
}
return false;
};
this.didLeave = () => {
if (this.props.keepDOM) {
this.foundation.setDisplayNone(true);
} else {
this.foundation.removePortal();
}
this.foundation.unBindEvent();
};
this.renderIcon = () => {
const {
placement
} = this.state;
const {
showArrow,
prefixCls: prefixCls17,
style
} = this.props;
let icon = null;
const triangleCls = (0, import_classnames3.default)([`${prefixCls17}-icon-arrow`]);
const bgColor = (0, import_get5.default)(style, "backgroundColor");
const iconComponent = (placement === null || placement === void 0 ? void 0 : placement.includes("left")) || (placement === null || placement === void 0 ? void 0 : placement.includes("right")) ? /* @__PURE__ */ import_react10.default.createElement(TriangleArrowVertical_default, null) : /* @__PURE__ */ import_react10.default.createElement(TriangleArrow_default, null);
if (showArrow) {
if (/* @__PURE__ */ (0, import_react10.isValidElement)(showArrow)) {
icon = showArrow;
} else {
icon = /* @__PURE__ */ import_react10.default.cloneElement(iconComponent, {
className: triangleCls,
style: {
color: bgColor,
fill: "currentColor"
}
});
}
}
return icon;
};
this.handlePortalInnerClick = (e) => {
if (this.props.clickToHide) {
this.foundation.hide();
}
if (this.props.stopPropagation) {
stopPropagation(e);
}
};
this.handlePortalMouseDown = (e) => {
if (this.props.stopPropagation) {
stopPropagation(e);
}
};
this.handlePortalFocus = (e) => {
if (this.props.stopPropagation) {
stopPropagation(e);
}
};
this.handlePortalBlur = (e) => {
if (this.props.stopPropagation) {
stopPropagation(e);
}
};
this.handlePortalInnerKeyDown = (e) => {
this.foundation.handleContainerKeydown(e);
};
this.renderContentNode = (content) => {
const contentProps = {
initialFocusRef: this.initialFocusRef
};
return !(0, import_isFunction.default)(content) ? content : content(contentProps);
};
this.renderPortal = () => {
const {
containerStyle = {},
visible,
portalEventSet,
placement,
displayNone,
transitionState,
id,
isPositionUpdated
} = this.state;
const {
prefixCls: prefixCls17,
content,
showArrow,
style,
motion,
role,
zIndex
} = this.props;
const contentNode = this.renderContentNode(content);
const {
className: propClassName
} = this.props;
const direction = this.context.direction;
const className = (0, import_classnames3.default)(propClassName, {
[`${prefixCls17}-wrapper`]: true,
[`${prefixCls17}-wrapper-show`]: visible,
[`${prefixCls17}-with-arrow`]: Boolean(showArrow),
[`${prefixCls17}-rtl`]: direction === "rtl"
});
const icon = this.renderIcon();
const portalInnerStyle = (0, import_omit.default)(containerStyle, motion ? ["transformOrigin"] : void 0);
const transformOrigin = (0, import_get5.default)(containerStyle, "transformOrigin");
const userOpacity = (0, import_get5.default)(style, "opacity", null);
const opacity = userOpacity ? userOpacity : 1;
const inner = /* @__PURE__ */ import_react10.default.createElement(cssAnimation_default, {
fillMode: "forwards",
animationState: transitionState,
motion: motion && isPositionUpdated,
startClassName: transitionState === "enter" ? `${prefix}-animation-show` : `${prefix}-animation-hide`,
onAnimationStart: () => this.isAnimating = true,
onAnimationEnd: () => {
var _a2, _b;
if (transitionState === "leave") {
this.didLeave();
(_b = (_a2 = this.props).afterClose) === null || _b === void 0 ? void 0 : _b.call(_a2);
}
this.isAnimating = false;
}
}, (_ref) => {
let {
animationStyle,
animationClassName,
animationEventsNeedBind
} = _ref;
return /* @__PURE__ */ import_react10.default.createElement("div", Object.assign({
className: (0, import_classnames3.default)(className, animationClassName),
style: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, animationStyle), displayNone ? {
display: "none"
} : {}), {
transformOrigin
}), style), userOpacity ? {
opacity: isPositionUpdated ? opacity : "0"
} : {})
}, portalEventSet, animationEventsNeedBind, {
role,
"x-placement": placement,
id
}), /* @__PURE__ */ import_react10.default.createElement("div", {
className: `${prefix}-content`
}, contentNode), icon);
});
return /* @__PURE__ */ import_react10.default.createElement(portal_default, {
getPopupContainer: this.props.getPopupContainer,
style: {
zIndex
}
}, /* @__PURE__ */ import_react10.default.createElement("div", {
tabIndex: -1,
className: `${BASE_CLASS_PREFIX}-portal-inner`,
style: portalInnerStyle,
ref: this.setContainerEl,
onClick: this.handlePortalInnerClick,
onFocus: this.handlePortalFocus,
onBlur: this.handlePortalBlur,
onMouseDown: this.handlePortalMouseDown,
onKeyDown: this.handlePortalInnerKeyDown
}, inner));
};
this.wrapSpan = (elem) => {
const {
wrapperClassName
} = this.props;
const display = (0, import_get5.default)(elem, "props.style.display");
const block = (0, import_get5.default)(elem, "props.block");
const isStringElem = typeof elem == "string";
const style = {};
if (!isStringElem) {
style.display = "inline-block";
}
if (block || blockDisplays.includes(display)) {
style.width = "100%";
}
return /* @__PURE__ */ import_react10.default.createElement("span", {
className: wrapperClassName,
style
}, elem);
};
this.mergeEvents = (rawEvents, events) => {
const mergedEvents = {};
(0, import_each.default)(events, (handler, key) => {
if (typeof handler === "function") {
mergedEvents[key] = function() {
handler(...arguments);
if (rawEvents && typeof rawEvents[key] === "function") {
rawEvents[key](...arguments);
}
};
}
});
return mergedEvents;
};
this.getPopupId = () => {
return this.state.id;
};
this.state = {
visible: false,
transitionState: "",
triggerEventSet: {},
portalEventSet: {},
containerStyle: {},
isInsert: false,
placement: props.position || "top",
transitionStyle: {},
isPositionUpdated: false,
id: props.wrapperId,
displayNone: false
};
this.foundation = new Tooltip(this.adapter);
this.eventManager = new Event();
this.triggerEl = /* @__PURE__ */ import_react10.default.createRef();
this.containerEl = /* @__PURE__ */ import_react10.default.createRef();
this.initialFocusRef = /* @__PURE__ */ import_react10.default.createRef();
this.clickOutsideHandler = null;
this.resizeHandler = null;
this.isWrapped = false;
this.containerPosition = void 0;
}
get adapter() {
var _this = this;
return Object.assign(Object.assign({}, super.adapter), {
on: function() {
return _this.eventManager.on(...arguments);
},
off: function() {
return _this.eventManager.off(...arguments);
},
getAnimatingState: () => this.isAnimating,
insertPortal: (content, _a2) => {
var {
position
} = _a2, containerStyle = __rest4(_a2, ["position"]);
this.setState({
isInsert: true,
transitionState: "enter",
containerStyle: Object.assign(Object.assign({}, this.state.containerStyle), containerStyle)
}, () => {
setTimeout(() => {
this.setState((oldState) => {
if (oldState.transitionState === "enter") {
this.eventManager.emit("portalInserted");
}
return {};
});
}, 0);
});
},
removePortal: () => {
this.setState({
isInsert: false,
isPositionUpdated: false
});
},
getEventName: () => ({
mouseEnter: "onMouseEnter",
mouseLeave: "onMouseLeave",
mouseOut: "onMouseOut",
mouseOver: "onMouseOver",
click: "onClick",
focus: "onFocus",
blur: "onBlur",
keydown: "onKeyDown",
contextMenu: "onContextMenu"
}),
registerTriggerEvent: (triggerEventSet) => {
this.setState({
triggerEventSet
});
},
registerPortalEvent: (portalEventSet) => {
this.setState({
portalEventSet
});
},
getTriggerBounding: () => {
const triggerDOM = this.adapter.getTriggerNode();
this.triggerEl.current = triggerDOM;
return triggerDOM && triggerDOM.getBoundingClientRect();
},
getPopupContainerRect: () => {
const container = this.getPopupContainer();
let rect = null;
if (container && isElement(container)) {
const boundingRect = convertDOMRectToObject(container.getBoundingClientRect());
rect = Object.assign(Object.assign({}, boundingRect), {
scrollLeft: container.scrollLeft,
scrollTop: container.scrollTop
});
}
return rect;
},
containerIsBody: () => {
const container = this.getPopupContainer();
return container === document.body;
},
containerIsRelative: () => {
const container = this.getPopupContainer();
const computedStyle = window.getComputedStyle(container);
return computedStyle.getPropertyValue("position") === "relative";
},
containerIsRelativeOrAbsolute: () => ["relative", "absolute"].includes(this.containerPosition),
getWrapperBounding: () => {
const el = this.containerEl && this.containerEl.current;
return el && el.getBoundingClientRect();
},
getDocumentElementBounding: () => document.documentElement.getBoundingClientRect(),
setPosition: (_a2) => {
var {
position
} = _a2, style = __rest4(_a2, ["position"]);
this.setState({
containerStyle: Object.assign(Object.assign({}, this.state.containerStyle), style),
placement: position,
isPositionUpdated: true
}, () => {
this.eventManager.emit("positionUpdated");
});
},
setDisplayNone: (displayNone, cb) => {
this.setState({
displayNone
}, cb);
},
updatePlacementAttr: (placement) => {
this.setState({
placement
});
},
togglePortalVisible: (visible, cb) => {
const willUpdateStates = {};
willUpdateStates.transitionState = visible ? "enter" : "leave";
willUpdateStates.visible = visible;
this.mounted && this.setState(willUpdateStates, () => {
cb();
});
},
registerClickOutsideHandler: (cb) => {
if (this.clickOutsideHandler) {
this.adapter.unregisterClickOutsideHandler();
}
this.clickOutsideHandler = (e) => {
if (!this.mounted) {
return false;
}
let el = this.triggerEl && this.triggerEl.current;
let popupEl = this.containerEl && this.containerEl.current;
el = import_react_dom2.default.findDOMNode(el);
popupEl = import_react_dom2.default.findDOMNode(popupEl);
const target = e.target;
const path = e.composedPath && e.composedPath() || [target];
const isClickTriggerToHide = this.props.clickTriggerToHide ? el && el.contains(target) || path.includes(el) : false;
if (el && !el.contains(target) && popupEl && !popupEl.contains(target) && !(path.includes(popupEl) || path.includes(el)) || isClickTriggerToHide) {
this.props.onClickOutSide(e);
cb();
}
};
window.addEventListener("mousedown", this.clickOutsideHandler);
},
unregisterClickOutsideHandler: () => {
if (this.clickOutsideHandler) {
window.removeEventListener("mousedown", this.clickOutsideHandler);
this.clickOutsideHandler = null;
}
},
registerResizeHandler: (cb) => {
if (this.resizeHandler) {
this.adapter.unregisterResizeHandler();
}
this.resizeHandler = (0, import_throttle2.default)((e) => {
if (!this.mounted) {
return false;
}
cb(e);
}, 10);
window.addEventListener("resize", this.resizeHandler, false);
},
unregisterResizeHandler: () => {
if (this.resizeHandler) {
window.removeEventListener("resize", this.resizeHandler, false);
this.resizeHandler = null;
}
},
notifyVisibleChange: (visible) => {
this.props.onVisibleChange(visible);
},
registerScrollHandler: (rePositionCb) => {
if (this.scrollHandler) {
this.adapter.unregisterScrollHandler();
}
this.scrollHandler = (0, import_throttle2.default)((e) => {
if (!this.mounted) {
return false;
}
const triggerDOM = this.adapter.getTriggerNode();
const isRelativeScroll = e.target.contains(triggerDOM);
if (isRelativeScroll) {
const scrollPos = {
x: e.target.scrollLeft,
y: e.target.scrollTop
};
rePositionCb(scrollPos);
}
}, 10);
window.addEventListener("scroll", this.scrollHandler, true);
},
unregisterScrollHandler: () => {
if (this.scrollHandler) {
window.removeEventListener("scroll", this.scrollHandler, true);
this.scrollHandler = null;
}
},
canMotion: () => Boolean(this.props.motion),
updateContainerPosition: () => {
const container = this.getPopupContainer();
if (container && isElement(container)) {
const computedStyle = window.getComputedStyle(container);
const position = computedStyle.getPropertyValue("position");
this.containerPosition = position;
}
},
getContainerPosition: () => this.containerPosition,
getContainer: () => this.containerEl && this.containerEl.current,
getTriggerNode: () => {
let triggerDOM = this.triggerEl.current;
if (!isElement(this.triggerEl.current)) {
triggerDOM = import_react_dom2.default.findDOMNode(this.triggerEl.current);
}
return triggerDOM;
},
getFocusableElements: (node) => {
return getFocusableElements(node);
},
getActiveElement: () => {
return getActiveElement();
},
setInitialFocus: () => {
const {
preventScroll
} = this.props;
const focusRefNode = (0, import_get5.default)(this, "initialFocusRef.current");
if (focusRefNode && "focus" in focusRefNode) {
focusRefNode.focus({
preventScroll
});
}
},
notifyEscKeydown: (event) => {
this.props.onEscKeyDown(event);
},
setId: () => {
this.setState({
id: getUuidShort()
});
},
getTriggerDOM: () => {
if (this.triggerEl.current) {
return import_react_dom2.default.findDOMNode(this.triggerEl.current);
} else {
return null;
}
}
});
}
componentDidMount() {
this.mounted = true;
this.getPopupContainer = this.props.getPopupContainer || this.context.getPopupContainer || defaultGetContainer2;
this.foundation.init();
runAfterTicks(() => {
let triggerEle = this.triggerEl.current;
if (triggerEle) {
if (!(triggerEle instanceof HTMLElement)) {
triggerEle = (0, import_react_dom2.findDOMNode)(triggerEle);
}
}
this.foundation.updateStateIfCursorOnTrigger(triggerEle);
}, 1);
}
componentWillUnmount() {
this.mounted = false;
this.foundation.destroy();
}
focusTrigger() {
this.foundation.focusTrigger();
}
rePosition() {
return this.foundation.calcPosition();
}
componentDidUpdate(prevProps, prevState) {
warning(this.props.mouseLeaveDelay < this.props.mouseEnterDelay, "[Semi Tooltip] 'mouseLeaveDelay' cannot be less than 'mouseEnterDelay', which may cause the dropdown layer to not be hidden.");
if (prevProps.visible !== this.props.visible) {
if (["hover", "focus"].includes(this.props.trigger)) {
this.props.visible ? this.foundation.delayShow() : this.foundation.delayHide();
} else {
this.props.visible ? this.foundation.show() : this.foundation.hide();
}
}
if (!(0, import_isEqual2.default)(prevProps.rePosKey, this.props.rePosKey)) {
this.rePosition();
}
}
render() {
const {
isInsert,
triggerEventSet,
visible,
id
} = this.state;
const {
wrapWhenSpecial,
role,
trigger
} = this.props;
let {
children
} = this.props;
const childrenStyle = Object.assign({}, (0, import_get5.default)(children, "props.style"));
const extraStyle = {};
if (wrapWhenSpecial) {
const isSpecial = this.isSpecial(children);
if (isSpecial) {
childrenStyle.pointerEvents = "none";
if (isSpecial === strings2.STATUS_DISABLED) {
extraStyle.cursor = "not-allowed";
}
children = /* @__PURE__ */ (0, import_react10.cloneElement)(children, {
style: childrenStyle
});
if (trigger !== "custom") {
children = this.wrapSpan(children);
}
this.isWrapped = true;
} else if (!/* @__PURE__ */ (0, import_react10.isValidElement)(children)) {
children = this.wrapSpan(children);
this.isWrapped = true;
}
}
let ariaAttribute = {};
if (role === "dialog") {
ariaAttribute["aria-expanded"] = visible ? "true" : "false";
ariaAttribute["aria-haspopup"] = "dialog";
ariaAttribute["aria-controls"] = id;
} else {
ariaAttribute["aria-describedby"] = id;
}
const newChild = /* @__PURE__ */ import_react10.default.cloneElement(children, Object.assign(Object.assign(Object.assign(Object.assign({}, ariaAttribute), children.props), this.mergeEvents(children.props, triggerEventSet)), {
style: Object.assign(Object.assign({}, (0, import_get5.default)(children, "props.style")), extraStyle),
className: (0, import_classnames3.default)((0, import_get5.default)(children, "props.className")),
ref: (node) => {
this.triggerEl.current = node;
const {
ref
} = children;
if (typeof ref === "function") {
ref(node);
} else if (ref && typeof ref === "object") {
ref.current = node;
}
},
tabIndex: children.props.tabIndex || 0,
"data-popupid": id
}));
return /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, isInsert ? this.renderPortal() : null, newChild);
}
};
Tooltip2.contextType = context_default;
Tooltip2.propTypes = {
children: import_prop_types4.default.node,
motion: import_prop_types4.default.bool,
autoAdjustOverflow: import_prop_types4.default.bool,
position: import_prop_types4.default.oneOf(positionSet),
getPopupContainer: import_prop_types4.default.func,
mouseEnterDelay: import_prop_types4.default.number,
mouseLeaveDelay: import_prop_types4.default.number,
trigger: import_prop_types4.default.oneOf(triggerSet).isRequired,
className: import_prop_types4.default.string,
wrapperClassName: import_prop_types4.default.string,
clickToHide: import_prop_types4.default.bool,
clickTriggerToHide: import_prop_types4.default.bool,
visible: import_prop_types4.default.bool,
style: import_prop_types4.default.object,
content: import_prop_types4.default.oneOfType([import_prop_types4.default.node, import_prop_types4.default.func]),
prefixCls: import_prop_types4.default.string,
onVisibleChange: import_prop_types4.default.func,
onClickOutSide: import_prop_types4.default.func,
spacing: import_prop_types4.default.oneOfType([import_prop_types4.default.number, import_prop_types4.default.object]),
margin: import_prop_types4.default.oneOfType([import_prop_types4.default.number, import_prop_types4.default.object]),
showArrow: import_prop_types4.default.oneOfType([import_prop_types4.default.bool, import_prop_types4.default.node]),
zIndex: import_prop_types4.default.number,
rePosKey: import_prop_types4.default.oneOfType([import_prop_types4.default.string, import_prop_types4.default.number]),
arrowBounding: ArrowBoundingShape_default,
transformFromCenter: import_prop_types4.default.bool,
arrowPointAtCenter: import_prop_types4.default.bool,
stopPropagation: import_prop_types4.default.bool,
role: import_prop_types4.default.string,
wrapWhenSpecial: import_prop_types4.default.bool,
guardFocus: import_prop_types4.default.bool,
returnFocusOnClose: import_prop_types4.default.bool,
preventScroll: import_prop_types4.default.bool,
keepDOM: import_prop_types4.default.bool
};
Tooltip2.__SemiComponentName__ = "Tooltip";
Tooltip2.defaultProps = getDefaultPropsFromGlobalConfig(Tooltip2.__SemiComponentName__, {
arrowBounding: numbers.ARROW_BOUNDING,
autoAdjustOverflow: true,
arrowPointAtCenter: true,
trigger: "hover",
transformFromCenter: true,
position: "top",
prefixCls: prefix,
role: "tooltip",
mouseEnterDelay: numbers.MOUSE_ENTER_DELAY,
mouseLeaveDelay: numbers.MOUSE_LEAVE_DELAY,
motion: true,
onVisibleChange: import_noop2.default,
onClickOutSide: import_noop2.default,
spacing: numbers.SPACING,
margin: numbers.MARGIN,
showArrow: true,
wrapWhenSpecial: true,
zIndex: numbers.DEFAULT_Z_INDEX,
closeOnEsc: false,
guardFocus: false,
returnFocusOnClose: false,
onEscKeyDown: import_noop2.default,
disableFocusListener: false,
disableArrowKeyDown: false,
keepDOM: false
});
// node_modules/@douyinfe/semi-ui/lib/es/typography/copyable.js
var import_copy_text_to_clipboard = __toModule(require_copy_text_to_clipboard());
var import_classnames5 = __toModule(require_classnames());
// node_modules/@douyinfe/semi-foundation/lib/es/utils/function.js
function noop2() {
}
// node_modules/@douyinfe/semi-ui/lib/es/locale/localeConsumer.js
var import_get6 = __toModule(require_get2());
var import_react12 = __toModule(require_react());
var import_prop_types5 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-ui/lib/es/locale/context.js
var import_react11 = __toModule(require_react());
var LocaleContext = /* @__PURE__ */ import_react11.default.createContext(null);
var context_default2 = LocaleContext;
// node_modules/date-fns/esm/locale/_lib/buildFormatLongFn/index.js
function buildFormatLongFn(args) {
return function() {
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var width = options.width ? String(options.width) : args.defaultWidth;
var format = args.formats[width] || args.formats[args.defaultWidth];
return format;
};
}
// node_modules/date-fns/esm/locale/_lib/buildLocalizeFn/index.js
function buildLocalizeFn(args) {
return function(dirtyIndex, options) {
var context = options !== null && options !== void 0 && options.context ? String(options.context) : "standalone";
var valuesArray;
if (context === "formatting" && args.formattingValues) {
var defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
var width = options !== null && options !== void 0 && options.width ? String(options.width) : defaultWidth;
valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
} else {
var _defaultWidth = args.defaultWidth;
var _width = options !== null && options !== void 0 && options.width ? String(options.width) : args.defaultWidth;
valuesArray = args.values[_width] || args.values[_defaultWidth];
}
var index2 = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex;
return valuesArray[index2];
};
}
// node_modules/date-fns/esm/locale/_lib/buildMatchFn/index.js
function buildMatchFn(args) {
return function(string) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var width = options.width;
var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
var matchResult = string.match(matchPattern);
if (!matchResult) {
return null;
}
var matchedString = matchResult[0];
var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
var key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, function(pattern) {
return pattern.test(matchedString);
}) : findKey2(parsePatterns, function(pattern) {
return pattern.test(matchedString);
});
var value;
value = args.valueCallback ? args.valueCallback(key) : key;
value = options.valueCallback ? options.valueCallback(value) : value;
var rest = string.slice(matchedString.length);
return {
value,
rest
};
};
}
function findKey2(object, predicate) {
for (var key in object) {
if (object.hasOwnProperty(key) && predicate(object[key])) {
return key;
}
}
return void 0;
}
function findIndex(array, predicate) {
for (var key = 0; key < array.length; key++) {
if (predicate(array[key])) {
return key;
}
}
return void 0;
}
// node_modules/date-fns/esm/locale/_lib/buildMatchPatternFn/index.js
function buildMatchPatternFn(args) {
return function(string) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var matchResult = string.match(args.matchPattern);
if (!matchResult)
return null;
var matchedString = matchResult[0];
var parseResult = string.match(args.parsePattern);
if (!parseResult)
return null;
var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
value = options.valueCallback ? options.valueCallback(value) : value;
var rest = string.slice(matchedString.length);
return {
value,
rest
};
};
}
// node_modules/@babel/runtime/helpers/esm/typeof.js
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(o2) {
return typeof o2;
} : function(o2) {
return o2 && typeof Symbol == "function" && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2;
}, _typeof(o);
}
// node_modules/date-fns/esm/_lib/toInteger/index.js
function toInteger(dirtyNumber) {
if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) {
return NaN;
}
var number = Number(dirtyNumber);
if (isNaN(number)) {
return number;
}
return number < 0 ? Math.ceil(number) : Math.floor(number);
}
// node_modules/date-fns/esm/_lib/requiredArgs/index.js
function requiredArgs(required, args) {
if (args.length < required) {
throw new TypeError(required + " argument" + (required > 1 ? "s" : "") + " required, but only " + args.length + " present");
}
}
// node_modules/date-fns/esm/toDate/index.js
function toDate(argument) {
requiredArgs(1, arguments);
var argStr = Object.prototype.toString.call(argument);
if (argument instanceof Date || _typeof(argument) === "object" && argStr === "[object Date]") {
return new Date(argument.getTime());
} else if (typeof argument === "number" || argStr === "[object Number]") {
return new Date(argument);
} else {
if ((typeof argument === "string" || argStr === "[object String]") && typeof console !== "undefined") {
console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments");
console.warn(new Error().stack);
}
return new Date(NaN);
}
}
// node_modules/date-fns/esm/_lib/defaultOptions/index.js
var defaultOptions = {};
function getDefaultOptions() {
return defaultOptions;
}
// node_modules/date-fns/esm/_lib/startOfUTCWeek/index.js
function startOfUTCWeek(dirtyDate, options) {
var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2;
requiredArgs(1, arguments);
var defaultOptions2 = getDefaultOptions();
var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions2.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions2.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0);
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
}
var date = toDate(dirtyDate);
var day = date.getUTCDay();
var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
date.setUTCDate(date.getUTCDate() - diff);
date.setUTCHours(0, 0, 0, 0);
return date;
}
// node_modules/date-fns/esm/_lib/isSameUTCWeek/index.js
function isSameUTCWeek(dirtyDateLeft, dirtyDateRight, options) {
requiredArgs(2, arguments);
var dateLeftStartOfWeek = startOfUTCWeek(dirtyDateLeft, options);
var dateRightStartOfWeek = startOfUTCWeek(dirtyDateRight, options);
return dateLeftStartOfWeek.getTime() === dateRightStartOfWeek.getTime();
}
// node_modules/date-fns/esm/locale/zh-CN/_lib/formatDistance/index.js
var formatDistanceLocale = {
lessThanXSeconds: {
one: "\u4E0D\u5230 1 \u79D2",
other: "\u4E0D\u5230 {{count}} \u79D2"
},
xSeconds: {
one: "1 \u79D2",
other: "{{count}} \u79D2"
},
halfAMinute: "\u534A\u5206\u949F",
lessThanXMinutes: {
one: "\u4E0D\u5230 1 \u5206\u949F",
other: "\u4E0D\u5230 {{count}} \u5206\u949F"
},
xMinutes: {
one: "1 \u5206\u949F",
other: "{{count}} \u5206\u949F"
},
xHours: {
one: "1 \u5C0F\u65F6",
other: "{{count}} \u5C0F\u65F6"
},
aboutXHours: {
one: "\u5927\u7EA6 1 \u5C0F\u65F6",
other: "\u5927\u7EA6 {{count}} \u5C0F\u65F6"
},
xDays: {
one: "1 \u5929",
other: "{{count}} \u5929"
},
aboutXWeeks: {
one: "\u5927\u7EA6 1 \u4E2A\u661F\u671F",
other: "\u5927\u7EA6 {{count}} \u4E2A\u661F\u671F"
},
xWeeks: {
one: "1 \u4E2A\u661F\u671F",
other: "{{count}} \u4E2A\u661F\u671F"
},
aboutXMonths: {
one: "\u5927\u7EA6 1 \u4E2A\u6708",
other: "\u5927\u7EA6 {{count}} \u4E2A\u6708"
},
xMonths: {
one: "1 \u4E2A\u6708",
other: "{{count}} \u4E2A\u6708"
},
aboutXYears: {
one: "\u5927\u7EA6 1 \u5E74",
other: "\u5927\u7EA6 {{count}} \u5E74"
},
xYears: {
one: "1 \u5E74",
other: "{{count}} \u5E74"
},
overXYears: {
one: "\u8D85\u8FC7 1 \u5E74",
other: "\u8D85\u8FC7 {{count}} \u5E74"
},
almostXYears: {
one: "\u5C06\u8FD1 1 \u5E74",
other: "\u5C06\u8FD1 {{count}} \u5E74"
}
};
var formatDistance = function formatDistance2(token, count, options) {
var result;
var tokenValue = formatDistanceLocale[token];
if (typeof tokenValue === "string") {
result = tokenValue;
} else if (count === 1) {
result = tokenValue.one;
} else {
result = tokenValue.other.replace("{{count}}", String(count));
}
if (options !== null && options !== void 0 && options.addSuffix) {
if (options.comparison && options.comparison > 0) {
return result + "\u5185";
} else {
return result + "\u524D";
}
}
return result;
};
var formatDistance_default = formatDistance;
// node_modules/date-fns/esm/locale/zh-CN/_lib/formatLong/index.js
var dateFormats = {
full: "y'\u5E74'M'\u6708'd'\u65E5' EEEE",
long: "y'\u5E74'M'\u6708'd'\u65E5'",
medium: "yyyy-MM-dd",
short: "yy-MM-dd"
};
var timeFormats = {
full: "zzzz a h:mm:ss",
long: "z a h:mm:ss",
medium: "a h:mm:ss",
short: "a h:mm"
};
var dateTimeFormats = {
full: "{{date}} {{time}}",
long: "{{date}} {{time}}",
medium: "{{date}} {{time}}",
short: "{{date}} {{time}}"
};
var formatLong = {
date: buildFormatLongFn({
formats: dateFormats,
defaultWidth: "full"
}),
time: buildFormatLongFn({
formats: timeFormats,
defaultWidth: "full"
}),
dateTime: buildFormatLongFn({
formats: dateTimeFormats,
defaultWidth: "full"
})
};
var formatLong_default = formatLong;
// node_modules/date-fns/esm/locale/zh-CN/_lib/formatRelative/index.js
function checkWeek(date, baseDate, options) {
var baseFormat = "eeee p";
if (isSameUTCWeek(date, baseDate, options)) {
return baseFormat;
} else if (date.getTime() > baseDate.getTime()) {
return "'\u4E0B\u4E2A'" + baseFormat;
}
return "'\u4E0A\u4E2A'" + baseFormat;
}
var formatRelativeLocale = {
lastWeek: checkWeek,
yesterday: "'\u6628\u5929' p",
today: "'\u4ECA\u5929' p",
tomorrow: "'\u660E\u5929' p",
nextWeek: checkWeek,
other: "PP p"
};
var formatRelative = function formatRelative2(token, date, baseDate, options) {
var format = formatRelativeLocale[token];
if (typeof format === "function") {
return format(date, baseDate, options);
}
return format;
};
var formatRelative_default = formatRelative;
// node_modules/date-fns/esm/locale/zh-CN/_lib/localize/index.js
var eraValues = {
narrow: ["\u524D", "\u516C\u5143"],
abbreviated: ["\u524D", "\u516C\u5143"],
wide: ["\u516C\u5143\u524D", "\u516C\u5143"]
};
var quarterValues = {
narrow: ["1", "2", "3", "4"],
abbreviated: ["\u7B2C\u4E00\u5B63", "\u7B2C\u4E8C\u5B63", "\u7B2C\u4E09\u5B63", "\u7B2C\u56DB\u5B63"],
wide: ["\u7B2C\u4E00\u5B63\u5EA6", "\u7B2C\u4E8C\u5B63\u5EA6", "\u7B2C\u4E09\u5B63\u5EA6", "\u7B2C\u56DB\u5B63\u5EA6"]
};
var monthValues = {
narrow: ["\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u4E03", "\u516B", "\u4E5D", "\u5341", "\u5341\u4E00", "\u5341\u4E8C"],
abbreviated: ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"],
wide: ["\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708"]
};
var dayValues = {
narrow: ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D"],
short: ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D"],
abbreviated: ["\u5468\u65E5", "\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D"],
wide: ["\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D"]
};
var dayPeriodValues = {
narrow: {
am: "\u4E0A",
pm: "\u4E0B",
midnight: "\u51CC\u6668",
noon: "\u5348",
morning: "\u65E9",
afternoon: "\u4E0B\u5348",
evening: "\u665A",
night: "\u591C"
},
abbreviated: {
am: "\u4E0A\u5348",
pm: "\u4E0B\u5348",
midnight: "\u51CC\u6668",
noon: "\u4E2D\u5348",
morning: "\u65E9\u6668",
afternoon: "\u4E2D\u5348",
evening: "\u665A\u4E0A",
night: "\u591C\u95F4"
},
wide: {
am: "\u4E0A\u5348",
pm: "\u4E0B\u5348",
midnight: "\u51CC\u6668",
noon: "\u4E2D\u5348",
morning: "\u65E9\u6668",
afternoon: "\u4E2D\u5348",
evening: "\u665A\u4E0A",
night: "\u591C\u95F4"
}
};
var formattingDayPeriodValues = {
narrow: {
am: "\u4E0A",
pm: "\u4E0B",
midnight: "\u51CC\u6668",
noon: "\u5348",
morning: "\u65E9",
afternoon: "\u4E0B\u5348",
evening: "\u665A",
night: "\u591C"
},
abbreviated: {
am: "\u4E0A\u5348",
pm: "\u4E0B\u5348",
midnight: "\u51CC\u6668",
noon: "\u4E2D\u5348",
morning: "\u65E9\u6668",
afternoon: "\u4E2D\u5348",
evening: "\u665A\u4E0A",
night: "\u591C\u95F4"
},
wide: {
am: "\u4E0A\u5348",
pm: "\u4E0B\u5348",
midnight: "\u51CC\u6668",
noon: "\u4E2D\u5348",
morning: "\u65E9\u6668",
afternoon: "\u4E2D\u5348",
evening: "\u665A\u4E0A",
night: "\u591C\u95F4"
}
};
var ordinalNumber = function ordinalNumber2(dirtyNumber, options) {
var number = Number(dirtyNumber);
switch (options === null || options === void 0 ? void 0 : options.unit) {
case "date":
return number.toString() + "\u65E5";
case "hour":
return number.toString() + "\u65F6";
case "minute":
return number.toString() + "\u5206";
case "second":
return number.toString() + "\u79D2";
default:
return "\u7B2C " + number.toString();
}
};
var localize = {
ordinalNumber,
era: buildLocalizeFn({
values: eraValues,
defaultWidth: "wide"
}),
quarter: buildLocalizeFn({
values: quarterValues,
defaultWidth: "wide",
argumentCallback: function argumentCallback(quarter) {
return quarter - 1;
}
}),
month: buildLocalizeFn({
values: monthValues,
defaultWidth: "wide"
}),
day: buildLocalizeFn({
values: dayValues,
defaultWidth: "wide"
}),
dayPeriod: buildLocalizeFn({
values: dayPeriodValues,
defaultWidth: "wide",
formattingValues: formattingDayPeriodValues,
defaultFormattingWidth: "wide"
})
};
var localize_default = localize;
// node_modules/date-fns/esm/locale/zh-CN/_lib/match/index.js
var matchOrdinalNumberPattern = /^(第\s*)?\d+(日|时|分|秒)?/i;
var parseOrdinalNumberPattern = /\d+/i;
var matchEraPatterns = {
narrow: /^(前)/i,
abbreviated: /^(前)/i,
wide: /^(公元前|公元)/i
};
var parseEraPatterns = {
any: [/^(前)/i, /^(公元)/i]
};
var matchQuarterPatterns = {
narrow: /^[1234]/i,
abbreviated: /^第[一二三四]刻/i,
wide: /^第[一二三四]刻钟/i
};
var parseQuarterPatterns = {
any: [/(1|一)/i, /(2|二)/i, /(3|三)/i, /(4|四)/i]
};
var matchMonthPatterns = {
narrow: /^(一|二|三|四|五|六|七|八|九|十[二一])/i,
abbreviated: /^(一|二|三|四|五|六|七|八|九|十[二一]|\d|1[12])月/i,
wide: /^(一|二|三|四|五|六|七|八|九|十[二一])月/i
};
var parseMonthPatterns = {
narrow: [/^一/i, /^二/i, /^三/i, /^四/i, /^五/i, /^六/i, /^七/i, /^八/i, /^九/i, /^十(?!(一|二))/i, /^十一/i, /^十二/i],
any: [/^一|1/i, /^二|2/i, /^三|3/i, /^四|4/i, /^五|5/i, /^六|6/i, /^七|7/i, /^八|8/i, /^九|9/i, /^十(?!(一|二))|10/i, /^十一|11/i, /^十二|12/i]
};
var matchDayPatterns = {
narrow: /^[一二三四五六日]/i,
short: /^[一二三四五六日]/i,
abbreviated: /^周[一二三四五六日]/i,
wide: /^星期[一二三四五六日]/i
};
var parseDayPatterns = {
any: [/日/i, /一/i, /二/i, /三/i, /四/i, /五/i, /六/i]
};
var matchDayPeriodPatterns = {
any: /^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨|)/i
};
var parseDayPeriodPatterns = {
any: {
am: /^上午?/i,
pm: /^下午?/i,
midnight: /^午夜/i,
noon: /^[中正]午/i,
morning: /^早上/i,
afternoon: /^下午/i,
evening: /^晚上?/i,
night: /^凌晨/i
}
};
var match = {
ordinalNumber: buildMatchPatternFn({
matchPattern: matchOrdinalNumberPattern,
parsePattern: parseOrdinalNumberPattern,
valueCallback: function valueCallback(value) {
return parseInt(value, 10);
}
}),
era: buildMatchFn({
matchPatterns: matchEraPatterns,
defaultMatchWidth: "wide",
parsePatterns: parseEraPatterns,
defaultParseWidth: "any"
}),
quarter: buildMatchFn({
matchPatterns: matchQuarterPatterns,
defaultMatchWidth: "wide",
parsePatterns: parseQuarterPatterns,
defaultParseWidth: "any",
valueCallback: function valueCallback2(index2) {
return index2 + 1;
}
}),
month: buildMatchFn({
matchPatterns: matchMonthPatterns,
defaultMatchWidth: "wide",
parsePatterns: parseMonthPatterns,
defaultParseWidth: "any"
}),
day: buildMatchFn({
matchPatterns: matchDayPatterns,
defaultMatchWidth: "wide",
parsePatterns: parseDayPatterns,
defaultParseWidth: "any"
}),
dayPeriod: buildMatchFn({
matchPatterns: matchDayPeriodPatterns,
defaultMatchWidth: "any",
parsePatterns: parseDayPeriodPatterns,
defaultParseWidth: "any"
})
};
var match_default = match;
// node_modules/date-fns/esm/locale/zh-CN/index.js
var locale = {
code: "zh-CN",
formatDistance: formatDistance_default,
formatLong: formatLong_default,
formatRelative: formatRelative_default,
localize: localize_default,
match: match_default,
options: {
weekStartsOn: 1,
firstWeekContainsDate: 4
}
};
var zh_CN_default = locale;
// node_modules/@douyinfe/semi-ui/lib/es/locale/source/zh_CN.js
var local = {
code: "zh-CN",
currency: "CNY",
dateFnsLocale: zh_CN_default,
Pagination: {
pageSize: "\u6BCF\u9875\u6761\u6570\uFF1A${pageSize}",
total: "\u603B\u9875\u6570\uFF1A${total}",
jumpTo: "\u8DF3\u81F3",
page: "\u9875"
},
Modal: {
confirm: "\u786E\u5B9A",
cancel: "\u53D6\u6D88"
},
Tabs: {
more: "\u66F4\u591A"
},
TimePicker: {
placeholder: {
time: "\u8BF7\u9009\u62E9\u65F6\u95F4",
timeRange: "\u8BF7\u9009\u62E9\u65F6\u95F4\u8303\u56F4"
},
begin: "\u5F00\u59CB\u65F6\u95F4",
end: "\u7ED3\u675F\u65F6\u95F4",
hour: "\u65F6",
minute: "\u5206",
second: "\u79D2",
AM: "\u4E0A\u5348",
PM: "\u4E0B\u5348"
},
DatePicker: {
placeholder: {
date: "\u8BF7\u9009\u62E9\u65E5\u671F",
dateTime: "\u8BF7\u9009\u62E9\u65E5\u671F\u53CA\u65F6\u95F4",
dateRange: ["\u5F00\u59CB\u65E5\u671F", "\u7ED3\u675F\u65E5\u671F"],
dateTimeRange: ["\u5F00\u59CB\u65E5\u671F", "\u7ED3\u675F\u65E5\u671F"],
monthRange: ["\u5F00\u59CB\u6708\u4EFD", "\u7ED3\u675F\u6708\u4EFD"]
},
presets: "\u5FEB\u6377\u9009\u62E9",
footer: {
confirm: "\u786E\u5B9A",
cancel: "\u53D6\u6D88"
},
selectDate: "\u8FD4\u56DE\u9009\u62E9\u65E5\u671F",
selectTime: "\u9009\u62E9\u65F6\u95F4",
year: "\u5E74",
month: "\u6708",
day: "\u65E5",
monthText: "${year}\u5E74 ${month}",
months: {
1: "1\u6708",
2: "2\u6708",
3: "3\u6708",
4: "4\u6708",
5: "5\u6708",
6: "6\u6708",
7: "7\u6708",
8: "8\u6708",
9: "9\u6708",
10: "10\u6708",
11: "11\u6708",
12: "12\u6708"
},
fullMonths: {
1: "1",
2: "2",
3: "3",
4: "4",
5: "5",
6: "6",
7: "7",
8: "8",
9: "9",
10: "10",
11: "11",
12: "12"
},
weeks: {
Mon: "\u4E00",
Tue: "\u4E8C",
Wed: "\u4E09",
Thu: "\u56DB",
Fri: "\u4E94",
Sat: "\u516D",
Sun: "\u65E5"
},
localeFormatToken: {
FORMAT_SWITCH_DATE: "yyyy-MM-dd"
}
},
Navigation: {
collapseText: "\u6536\u8D77\u4FA7\u8FB9\u680F",
expandText: "\u5C55\u5F00\u4FA7\u8FB9\u680F"
},
Popconfirm: {
confirm: "\u786E\u5B9A",
cancel: "\u53D6\u6D88"
},
Table: {
emptyText: "\u6682\u65E0\u6570\u636E",
pageText: "\u663E\u793A\u7B2C ${currentStart} \u6761-\u7B2C ${currentEnd} \u6761\uFF0C\u5171 ${total} \u6761",
descend: "\u70B9\u51FB\u964D\u5E8F",
ascend: "\u70B9\u51FB\u5347\u5E8F",
cancelSort: "\u53D6\u6D88\u6392\u5E8F"
},
Select: {
emptyText: "\u6682\u65E0\u6570\u636E",
createText: "\u521B\u5EFA"
},
Cascader: {
emptyText: "\u6682\u65E0\u6570\u636E"
},
Tree: {
emptyText: "\u6682\u65E0\u6570\u636E",
searchPlaceholder: "\u641C\u7D22"
},
List: {
emptyText: "\u6682\u65E0\u6570\u636E"
},
Calendar: {
allDay: "\u5168\u5929",
AM: "\u4E0A\u5348${time}\u65F6",
PM: "\u4E0B\u5348${time}\u65F6",
datestring: "\u65E5",
remaining: "\u8FD8\u6709${remained}\u9879"
},
Upload: {
mainText: "\u70B9\u51FB\u4E0A\u4F20\u6587\u4EF6\u6216\u62D6\u62FD\u6587\u4EF6\u5230\u8FD9\u91CC",
illegalTips: "\u4E0D\u652F\u6301\u6B64\u7C7B\u578B\u6587\u4EF6",
legalTips: "\u677E\u624B\u5F00\u59CB\u4E0A\u4F20",
retry: "\u91CD\u8BD5",
replace: "\u66FF\u6362\u6587\u4EF6",
clear: "\u6E05\u7A7A",
selectedFiles: "\u5DF2\u9009\u62E9\u6587\u4EF6",
illegalSize: "\u6587\u4EF6\u5C3A\u5BF8\u4E0D\u5408\u6CD5",
fail: "\u4E0A\u4F20\u5931\u8D25"
},
TreeSelect: {
searchPlaceholder: "\u641C\u7D22"
},
Typography: {
copy: "\u590D\u5236",
copied: "\u590D\u5236\u6210\u529F",
expand: "\u5C55\u5F00",
collapse: "\u6536\u8D77"
},
Transfer: {
emptyLeft: "\u6682\u65E0\u6570\u636E",
emptySearch: "\u65E0\u641C\u7D22\u7ED3\u679C",
emptyRight: "\u6682\u65E0\u5185\u5BB9\uFF0C\u53EF\u4ECE\u5DE6\u4FA7\u52FE\u9009",
placeholder: "\u641C\u7D22",
clear: "\u6E05\u7A7A",
selectAll: "\u5168\u9009",
clearSelectAll: "\u53D6\u6D88\u5168\u9009",
total: "\u603B\u4E2A\u6570\uFF1A${total}",
selected: "\u5DF2\u9009\u4E2A\u6570\uFF1A${total}"
},
Form: {
optional: "\uFF08\u53EF\u9009\uFF09"
},
Image: {
preview: "\u9884\u89C8",
loading: "\u52A0\u8F7D\u4E2D",
loadError: "\u52A0\u8F7D\u5931\u8D25",
prevTip: "\u4E0A\u4E00\u5F20",
nextTip: "\u4E0B\u4E00\u5F20",
zoomInTip: "\u653E\u5927",
zoomOutTip: "\u7F29\u5C0F",
rotateTip: "\u65CB\u8F6C",
downloadTip: "\u4E0B\u8F7D",
adaptiveTip: "\u9002\u5E94\u9875\u9762",
originTip: "\u539F\u59CB\u5C3A\u5BF8"
},
Chat: {
deleteConfirm: "\u786E\u8BA4\u5220\u9664\u8BE5\u4F1A\u8BDD\u5417\uFF1F",
clearContext: "\u4E0A\u4E0B\u6587\u5DF2\u6E05\u9664",
copySuccess: "\u590D\u5236\u6210\u529F",
stop: "\u505C\u6B62",
copy: "\u590D\u5236",
copied: "\u590D\u5236\u6210\u529F",
dropAreaText: "\u5C06\u6587\u4EF6\u653E\u5230\u8FD9\u91CC"
},
UserGuide: {
skip: "\u8DF3\u8FC7",
next: "\u4E0B\u4E00\u6B65",
prev: "\u4E0A\u4E00\u6B65",
finish: "\u5B8C\u6210"
},
InputNumber: {},
JsonViewer: {
search: "\u67E5\u627E",
replace: "\u66FF\u6362",
replaceAll: "\u5168\u90E8\u66FF\u6362"
},
VideoPlayer: {
rateChange: "\u5207\u6362\u901F\u7387\u81F3 ${rate}",
qualityChange: "\u5207\u6362\u6E05\u6670\u5EA6\u81F3${quality}",
routeChange: "\u5207\u6362\u7EBF\u8DEF\u81F3${route}",
mirror: "\u955C\u50CF",
cancelMirror: "\u53D6\u6D88\u955C\u50CF",
loading: "\u52A0\u8F7D\u4E2D...",
stall: "\u52A0\u8F7D\u5931\u8D25",
noResource: "\u6682\u65E0\u8D44\u6E90",
videoError: "\u89C6\u9891\u52A0\u8F7D\u9519\u8BEF"
}
};
var zh_CN_default2 = local;
// node_modules/@douyinfe/semi-ui/lib/es/locale/localeConsumer.js
var LocaleConsumer = class extends import_react12.Component {
renderChildren(localeData, children) {
const {
componentName
} = this.props;
let locale2 = localeData;
if (!(localeData === null || localeData === void 0 ? void 0 : localeData.code)) {
locale2 = zh_CN_default2;
}
const defaultFnsLocale = (0, import_get6.default)(zh_CN_default2, "dateFnsLocale");
const dateFnsLocale = (0, import_get6.default)(locale2, "dateFnsLocale", defaultFnsLocale);
const currency = (0, import_get6.default)(locale2, "currency");
return children(locale2[componentName], locale2.code, dateFnsLocale, currency);
}
render() {
const {
children
} = this.props;
return /* @__PURE__ */ import_react12.default.createElement(context_default.Consumer, null, (_ref) => {
let {
locale: locale2
} = _ref;
return /* @__PURE__ */ import_react12.default.createElement(context_default2.Consumer, null, (localeData) => this.renderChildren(locale2 || localeData, children));
});
}
};
LocaleConsumer.propTypes = {
componentName: import_prop_types5.default.string.isRequired,
children: import_prop_types5.default.any
};
LocaleConsumer.defaultProps = {
componentName: ""
};
// node_modules/@douyinfe/semi-icons/lib/es/components/Icon.js
var import_react13 = __toModule(require_react());
// node_modules/@douyinfe/semi-icons/lib/es/env.js
var BASE_CLASS_PREFIX2 = "semi";
// node_modules/@douyinfe/semi-icons/lib/es/components/Icon.js
var import_classnames4 = __toModule(require_classnames());
var __rest5 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var Icon = /* @__PURE__ */ import_react13.default.forwardRef((props, ref) => {
const {
svg,
spin = false,
rotate,
style,
className,
prefixCls: prefixCls17 = BASE_CLASS_PREFIX2,
type,
size = "default"
} = props, restProps = __rest5(props, ["svg", "spin", "rotate", "style", "className", "prefixCls", "type", "size"]);
const classes = (0, import_classnames4.default)(`${prefixCls17}-icon`, {
[`${prefixCls17}-icon-extra-small`]: size === "extra-small",
[`${prefixCls17}-icon-small`]: size === "small",
[`${prefixCls17}-icon-default`]: size === "default",
[`${prefixCls17}-icon-large`]: size === "large",
[`${prefixCls17}-icon-extra-large`]: size === "extra-large",
[`${prefixCls17}-icon-spinning`]: spin === true,
[`${prefixCls17}-icon-${type}`]: Boolean(type)
}, className);
const outerStyle = {};
if (Number.isSafeInteger(rotate)) {
outerStyle.transform = `rotate(${rotate}deg)`;
}
Object.assign(outerStyle, style);
return /* @__PURE__ */ import_react13.default.createElement("span", Object.assign({
role: "img",
ref,
"aria-label": type,
className: classes,
style: outerStyle
}, restProps), svg);
});
Icon.elementType = "Icon";
var convertIcon = (Svg, iconType) => {
const InnerIcon = /* @__PURE__ */ import_react13.default.forwardRef((props, ref) => /* @__PURE__ */ import_react13.default.createElement(Icon, Object.assign({
svg: /* @__PURE__ */ import_react13.default.createElement(Svg),
type: iconType,
ref
}, props)));
InnerIcon.elementType = "Icon";
return InnerIcon;
};
// node_modules/@douyinfe/semi-icons/lib/es/icons/IconChevronDown.js
var React12 = __toModule(require_react());
function SvgComponent(props) {
return /* @__PURE__ */ React12.createElement("svg", Object.assign({
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
width: "1em",
height: "1em",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React12.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M4.08 7.6a1.5 1.5 0 0 1 2.12 0l5.66 5.65 5.66-5.65a1.5 1.5 0 1 1 2.12 2.12l-6.72 6.72a1.5 1.5 0 0 1-2.12 0L4.08 9.72a1.5 1.5 0 0 1 0-2.12Z",
fill: "currentColor"
}));
}
var IconComponent = convertIcon(SvgComponent, "chevron_down");
var IconChevronDown_default = IconComponent;
// node_modules/@douyinfe/semi-icons/lib/es/icons/IconChevronLeft.js
var React13 = __toModule(require_react());
function SvgComponent2(props) {
return /* @__PURE__ */ React13.createElement("svg", Object.assign({
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
width: "1em",
height: "1em",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React13.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M16.28 4.24a1.5 1.5 0 0 1 0 2.12l-5.66 5.66 5.66 5.65a1.5 1.5 0 1 1-2.12 2.13l-6.72-6.72a1.5 1.5 0 0 1 0-2.12l6.72-6.72a1.5 1.5 0 0 1 2.12 0Z",
fill: "currentColor"
}));
}
var IconComponent2 = convertIcon(SvgComponent2, "chevron_left");
var IconChevronLeft_default = IconComponent2;
// node_modules/@douyinfe/semi-icons/lib/es/icons/IconChevronRight.js
var React14 = __toModule(require_react());
function SvgComponent3(props) {
return /* @__PURE__ */ React14.createElement("svg", Object.assign({
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
width: "1em",
height: "1em",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React14.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M7.44 19.8a1.5 1.5 0 0 1 0-2.13l5.66-5.65-5.66-5.66a1.5 1.5 0 1 1 2.12-2.12l6.72 6.72a1.5 1.5 0 0 1 0 2.12L9.56 19.8a1.5 1.5 0 0 1-2.12 0Z",
fill: "currentColor"
}));
}
var IconComponent3 = convertIcon(SvgComponent3, "chevron_right");
var IconChevronRight_default = IconComponent3;
// node_modules/@douyinfe/semi-icons/lib/es/icons/IconClose.js
var React15 = __toModule(require_react());
function SvgComponent4(props) {
return /* @__PURE__ */ React15.createElement("svg", Object.assign({
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
width: "1em",
height: "1em",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React15.createElement("path", {
d: "M17.66 19.78a1.5 1.5 0 0 0 2.12-2.12L14.12 12l5.66-5.66a1.5 1.5 0 0 0-2.12-2.12L12 9.88 6.34 4.22a1.5 1.5 0 1 0-2.12 2.12L9.88 12l-5.66 5.66a1.5 1.5 0 0 0 2.12 2.12L12 14.12l5.66 5.66Z",
fill: "currentColor"
}));
}
var IconComponent4 = convertIcon(SvgComponent4, "close");
var IconClose_default = IconComponent4;
// node_modules/@douyinfe/semi-icons/lib/es/icons/IconCopy.js
var React16 = __toModule(require_react());
function SvgComponent5(props) {
return /* @__PURE__ */ React16.createElement("svg", Object.assign({
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
width: "1em",
height: "1em",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React16.createElement("path", {
d: "M7 4c0-1.1.9-2 2-2h11a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2h-1V8c0-2-1-3-3-3H7V4Z",
fill: "currentColor"
}), /* @__PURE__ */ React16.createElement("path", {
d: "M5 7a2 2 0 0 0-2 2v10c0 1.1.9 2 2 2h10a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2H5Z",
fill: "currentColor"
}));
}
var IconComponent5 = convertIcon(SvgComponent5, "copy");
var IconCopy_default = IconComponent5;
// node_modules/@douyinfe/semi-icons/lib/es/icons/IconDelete.js
var React17 = __toModule(require_react());
function SvgComponent6(props) {
return /* @__PURE__ */ React17.createElement("svg", Object.assign({
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
width: "1em",
height: "1em",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React17.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M9.38 2a1 1 0 0 0-.9.55L7.02 5.5H3a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h18a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1h-4L15.5 2.55a1 1 0 0 0-.9-.55H9.39Zm5.48 3.5-.72-1.25a.5.5 0 0 0-.43-.25h-3.42a.5.5 0 0 0-.43.25L9.14 5.5h5.72Zm3.86 4.5H5.28a1 1 0 0 0-.97 1.24l2.12 8.49A3 3 0 0 0 9.34 22h5.32a3 3 0 0 0 2.9-2.27l2.13-8.49a1 1 0 0 0-.97-1.24Z",
fill: "currentColor"
}));
}
var IconComponent6 = convertIcon(SvgComponent6, "delete");
var IconDelete_default = IconComponent6;
// node_modules/@douyinfe/semi-icons/lib/es/icons/IconLink.js
var React18 = __toModule(require_react());
function SvgComponent7(props) {
return /* @__PURE__ */ React18.createElement("svg", Object.assign({
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
width: "1em",
height: "1em",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React18.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M12.94 2.94a5.74 5.74 0 1 1 8.12 8.12l-2.67 2.67a7.05 7.05 0 0 0-.4-3.85l.95-.94a2.74 2.74 0 1 0-3.88-3.88l-4 4a2.74 2.74 0 0 0 .9 4.48l-2.2 2.2a5.77 5.77 0 0 1-.82-8.8l4-4Zm-10 10 2.67-2.67a7.04 7.04 0 0 0 .4 3.85l-.95.94a2.74 2.74 0 1 0 3.88 3.88l4-4a2.74 2.74 0 0 0-.57-4.31l2.16-2.16a5.74 5.74 0 0 1 .53 8.6l-4 4a5.74 5.74 0 0 1-8.12-8.13Z",
fill: "currentColor"
}));
}
var IconComponent7 = convertIcon(SvgComponent7, "link");
var IconLink_default = IconComponent7;
// node_modules/@douyinfe/semi-icons/lib/es/icons/IconTick.js
var React19 = __toModule(require_react());
function SvgComponent8(props) {
return /* @__PURE__ */ React19.createElement("svg", Object.assign({
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
width: "1em",
height: "1em",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React19.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M21.35 4.27c.68.47.86 1.4.38 2.08l-10 14.5a1.5 1.5 0 0 1-2.33.17l-6.5-7a1.5 1.5 0 0 1 2.2-2.04l5.23 5.63 8.94-12.96a1.5 1.5 0 0 1 2.08-.38Z",
fill: "currentColor"
}));
}
var IconComponent8 = convertIcon(SvgComponent8, "tick");
var IconTick_default = IconComponent8;
// node_modules/@douyinfe/semi-foundation/lib/es/utils/isEnterPress.js
var import_get7 = __toModule(require_get2());
// node_modules/@douyinfe/semi-foundation/lib/es/utils/keyCode.js
var ENTER_KEY = "Enter";
// node_modules/@douyinfe/semi-foundation/lib/es/utils/isEnterPress.js
function isEnterPress(e) {
return (0, import_get7.default)(e, "key") === ENTER_KEY ? true : false;
}
var isEnterPress_default = isEnterPress;
// node_modules/@douyinfe/semi-ui/lib/es/typography/copyable.js
var prefixCls2 = cssClasses.PREFIX;
var Copyable = class extends import_react14.default.PureComponent {
constructor(props) {
super(props);
this.copy = (e) => {
const {
content,
duration,
onCopy
} = this.props;
const res = (0, import_copy_text_to_clipboard.default)(content);
onCopy && onCopy(e, content, res);
this.setCopied(content, duration);
};
this.setCopied = (item, timer) => {
this.setState({
copied: true,
item
});
this._timeId = setTimeout(() => {
this.resetCopied();
}, timer * 1e3);
};
this.resetCopied = () => {
if (this._timeId) {
clearTimeout(this._timeId);
this._timeId = null;
this.setState({
copied: false,
item: ""
});
}
};
this.renderSuccessTip = () => {
const {
successTip
} = this.props;
if (typeof successTip !== "undefined") {
return successTip;
}
return /* @__PURE__ */ import_react14.default.createElement(LocaleConsumer, {
componentName: "Typography"
}, (locale2) => /* @__PURE__ */ import_react14.default.createElement("span", null, /* @__PURE__ */ import_react14.default.createElement(IconTick_default, null), locale2.copied));
};
this.renderCopyIcon = () => {
const {
icon
} = this.props;
const copyProps = {
role: "button",
tabIndex: 0,
onClick: this.copy,
onKeyPress: (e) => isEnterPress_default(e) && this.copy(e)
};
{
}
const defaultIcon = /* @__PURE__ */ import_react14.default.createElement("a", {
className: `${prefixCls2}-action-copy-icon`
}, /* @__PURE__ */ import_react14.default.createElement(IconCopy_default, Object.assign({
onClick: this.copy
}, copyProps)));
return /* @__PURE__ */ import_react14.default.isValidElement(icon) ? /* @__PURE__ */ import_react14.default.cloneElement(icon, copyProps) : defaultIcon;
};
this.state = {
copied: false,
item: ""
};
}
componentWillUnmount() {
if (this._timeId) {
clearTimeout(this._timeId);
this._timeId = null;
}
}
render() {
const {
style,
className,
forwardRef: forwardRef2,
copyTip,
render
} = this.props;
const {
copied
} = this.state;
const finalCls = (0, import_classnames5.default)(className, {
[`${prefixCls2}-action-copy`]: !copied,
[`${prefixCls2}-action-copied`]: copied
});
if (render) {
return render(copied, this.copy, this.props);
}
return /* @__PURE__ */ import_react14.default.createElement(LocaleConsumer, {
componentName: "Typography"
}, (locale2) => /* @__PURE__ */ import_react14.default.createElement("span", {
style: Object.assign({
marginLeft: "4px"
}, style),
className: finalCls,
ref: forwardRef2
}, copied ? this.renderSuccessTip() : /* @__PURE__ */ import_react14.default.createElement(Tooltip2, {
content: typeof copyTip !== "undefined" ? copyTip : locale2.copy
}, this.renderCopyIcon())));
}
};
Copyable.propTypes = {
content: import_prop_types6.default.string,
onCopy: import_prop_types6.default.func,
successTip: import_prop_types6.default.node,
copyTip: import_prop_types6.default.node,
duration: import_prop_types6.default.number,
style: import_prop_types6.default.object,
className: import_prop_types6.default.string,
icon: import_prop_types6.default.node
};
Copyable.defaultProps = {
content: "",
onCopy: noop2,
duration: 3,
style: {},
className: ""
};
var copyable_default = Copyable;
// node_modules/@douyinfe/semi-ui/lib/es/popover/index.js
var import_noop3 = __toModule(require_noop());
var import_isFunction2 = __toModule(require_isFunction());
var import_react16 = __toModule(require_react());
var import_classnames7 = __toModule(require_classnames());
var import_prop_types8 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/popover/constants.js
var cssClasses3 = {
PREFIX: `${BASE_CLASS_PREFIX}-popover`,
ARROW: `${BASE_CLASS_PREFIX}-popover-icon-arrow`
};
var strings3 = {
POSITION_SET: ["top", "topLeft", "topRight", "left", "leftTop", "leftBottom", "right", "rightTop", "rightBottom", "bottom", "bottomLeft", "bottomRight", "leftTopOver", "rightTopOver"],
TRIGGER_SET: ["hover", "focus", "click", "custom", "contextMenu"],
DEFAULT_ARROW_STYLE: {
borderOpacity: "1",
backgroundColor: "var(--semi-color-bg-3)",
borderColor: "var(--semi-color-border)"
}
};
var numbers2 = {
ARROW_BOUNDING: Object.assign(Object.assign({}, numbers.ARROW_BOUNDING), {
offsetY: 6,
offsetX: 0,
height: 8
}),
SPACING: 4,
SPACING_WITH_ARROW: 10,
DEFAULT_Z_INDEX: 1030
};
// node_modules/@douyinfe/semi-ui/lib/es/popover/Arrow.js
var import_get8 = __toModule(require_get2());
var import_react15 = __toModule(require_react());
var import_prop_types7 = __toModule(require_prop_types());
var import_classnames6 = __toModule(require_classnames());
var __rest6 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var Arrow = function() {
let props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
const {
position = "",
className,
arrowStyle,
popStyle
} = props, rest = __rest6(props, ["position", "className", "arrowStyle", "popStyle"]);
const isVertical = position.indexOf("top") === 0 || position.indexOf("bottom") === 0;
const cls26 = (0, import_classnames6.default)(className, cssClasses3.ARROW);
const borderOpacity = (0, import_get8.default)(arrowStyle, "borderOpacity");
const bgColor = (0, import_get8.default)(arrowStyle, "backgroundColor", (0, import_get8.default)(popStyle, "backgroundColor"));
const borderColor = (0, import_get8.default)(arrowStyle, "borderColor", (0, import_get8.default)(popStyle, "borderColor"));
const wrapProps = Object.assign(Object.assign({}, rest), {
width: numbers2.ARROW_BOUNDING.width,
height: numbers2.ARROW_BOUNDING.height,
xmlns: "http://www.w3.org/2000/svg",
className: cls26
});
return isVertical ? /* @__PURE__ */ import_react15.default.createElement("svg", Object.assign({}, wrapProps), /* @__PURE__ */ import_react15.default.createElement("path", {
d: "M0 0.5L0 1.5C4 1.5, 5.5 3, 7.5 5S10,8 12,8S14.5 7, 16.5 5S20,1.5 24,1.5L24 0.5L0 0.5z",
style: {
fill: borderColor,
opacity: borderOpacity
}
}), /* @__PURE__ */ import_react15.default.createElement("path", {
d: "M0 0L0 1C4 1, 5.5 2, 7.5 4S10,7 12,7S14.5 6, 16.5 4S20,1 24,1L24 0L0 0z",
style: {
fill: bgColor
}
})) : /* @__PURE__ */ import_react15.default.createElement("svg", Object.assign({}, wrapProps), /* @__PURE__ */ import_react15.default.createElement("path", {
d: "M0.5 0L1.5 0C1.5 4, 3 5.5, 5 7.5S8,10 8,12S7 14.5, 5 16.5S1.5,20 1.5,24L0.5 24L0.5 0z",
style: {
fill: borderColor,
opacity: borderOpacity
}
}), /* @__PURE__ */ import_react15.default.createElement("path", {
d: "M0 0L1 0C1 4, 2 5.5, 4 7.5S7,10 7,12S6 14.5, 4 16.5S1,20 1,24L0 24L0 0z",
style: {
fill: bgColor
}
}));
};
Arrow.propTypes = {
position: import_prop_types7.default.string,
className: import_prop_types7.default.string,
arrowStyle: import_prop_types7.default.object,
popStyle: import_prop_types7.default.object
};
var Arrow_default = Arrow;
// node_modules/@douyinfe/semi-ui/lib/es/popover/index.js
var __rest7 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var positionSet2 = strings3.POSITION_SET;
var triggerSet2 = strings3.TRIGGER_SET;
var Popover = class extends import_react16.default.PureComponent {
constructor(props) {
super(props);
this.focusTrigger = () => {
var _a2;
(_a2 = this.tooltipRef.current) === null || _a2 === void 0 ? void 0 : _a2.focusTrigger();
};
this.renderPopCard = (_ref) => {
let {
initialFocusRef
} = _ref;
const {
content,
contentClassName,
prefixCls: prefixCls17
} = this.props;
const {
direction
} = this.context;
const popCardCls = (0, import_classnames7.default)(prefixCls17, contentClassName, {
[`${prefixCls17}-rtl`]: direction === "rtl"
});
const contentNode = this.renderContentNode({
initialFocusRef,
content
});
return /* @__PURE__ */ import_react16.default.createElement("div", {
className: popCardCls
}, /* @__PURE__ */ import_react16.default.createElement("div", {
className: `${prefixCls17}-content`
}, contentNode));
};
this.renderContentNode = (props2) => {
const {
initialFocusRef,
content
} = props2;
const contentProps = {
initialFocusRef
};
return !(0, import_isFunction2.default)(content) ? content : content(contentProps);
};
this.tooltipRef = /* @__PURE__ */ import_react16.default.createRef();
}
render() {
const _a2 = this.props, {
children,
prefixCls: prefixCls17,
showArrow,
arrowStyle = {},
arrowBounding,
position,
style,
trigger
} = _a2, attr = __rest7(_a2, ["children", "prefixCls", "showArrow", "arrowStyle", "arrowBounding", "position", "style", "trigger"]);
let {
spacing
} = this.props;
const arrowProps = {
position,
className: "",
popStyle: style,
arrowStyle
};
const arrow = showArrow ? /* @__PURE__ */ import_react16.default.createElement(Arrow_default, Object.assign({}, arrowProps)) : false;
if (isNullOrUndefined(spacing)) {
spacing = showArrow ? numbers2.SPACING_WITH_ARROW : numbers2.SPACING;
}
const role = trigger === "click" || trigger === "custom" ? "dialog" : "tooltip";
return /* @__PURE__ */ import_react16.default.createElement(Tooltip2, Object.assign({
guardFocus: true,
ref: this.tooltipRef
}, attr, {
trigger,
position,
style,
content: this.renderPopCard,
prefixCls: prefixCls17,
spacing,
showArrow: arrow,
arrowBounding,
role
}), children);
}
};
Popover.contextType = context_default;
Popover.propTypes = {
children: import_prop_types8.default.node,
content: import_prop_types8.default.oneOfType([import_prop_types8.default.node, import_prop_types8.default.func]),
visible: import_prop_types8.default.bool,
autoAdjustOverflow: import_prop_types8.default.bool,
motion: import_prop_types8.default.bool,
position: import_prop_types8.default.oneOf(positionSet2),
margin: import_prop_types8.default.oneOfType([import_prop_types8.default.number, import_prop_types8.default.object]),
mouseEnterDelay: import_prop_types8.default.number,
mouseLeaveDelay: import_prop_types8.default.number,
trigger: import_prop_types8.default.oneOf(triggerSet2).isRequired,
contentClassName: import_prop_types8.default.oneOfType([import_prop_types8.default.string, import_prop_types8.default.array]),
onVisibleChange: import_prop_types8.default.func,
onClickOutSide: import_prop_types8.default.func,
style: import_prop_types8.default.object,
spacing: import_prop_types8.default.oneOfType([import_prop_types8.default.number, import_prop_types8.default.object]),
zIndex: import_prop_types8.default.number,
showArrow: import_prop_types8.default.bool,
arrowStyle: import_prop_types8.default.shape({
borderColor: import_prop_types8.default.string,
backgroundColor: import_prop_types8.default.string,
borderOpacity: import_prop_types8.default.oneOfType([import_prop_types8.default.string, import_prop_types8.default.number])
}),
arrowPointAtCenter: import_prop_types8.default.bool,
arrowBounding: import_prop_types8.default.object,
prefixCls: import_prop_types8.default.string,
guardFocus: import_prop_types8.default.bool,
disableArrowKeyDown: import_prop_types8.default.bool
};
Popover.__SemiComponentName__ = "Popover";
Popover.defaultProps = getDefaultPropsFromGlobalConfig(Popover.__SemiComponentName__, {
arrowBounding: numbers2.ARROW_BOUNDING,
showArrow: false,
autoAdjustOverflow: true,
zIndex: numbers2.DEFAULT_Z_INDEX,
motion: true,
trigger: "hover",
cancelText: "No",
okText: "Yes",
position: "bottom",
prefixCls: cssClasses3.PREFIX,
onClickOutSide: import_noop3.default,
onEscKeyDown: import_noop3.default,
closeOnEsc: true,
returnFocusOnClose: true,
guardFocus: true,
disableFocusListener: true
});
var popover_default = Popover;
// node_modules/@douyinfe/semi-ui/lib/es/typography/util.js
var import_omit2 = __toModule(require_omit());
var ellipsisContainer;
function pxToNumber(value) {
if (!value) {
return 0;
}
const match2 = value.match(/^\d*(\.\d*)?/);
return match2 ? Number(match2[0]) : 0;
}
function styleToString(style) {
const styleNames = Array.prototype.slice.apply(style);
return styleNames.map((name) => `${name}: ${style.getPropertyValue(name)};`).join("");
}
var getRenderText = function(originEle, rows) {
let content = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "";
let fixedContent = arguments.length > 3 ? arguments[3] : void 0;
let ellipsisStr = arguments.length > 4 ? arguments[4] : void 0;
let suffix = arguments.length > 5 ? arguments[5] : void 0;
let ellipsisPos = arguments.length > 6 ? arguments[6] : void 0;
let isStrong = arguments.length > 7 ? arguments[7] : void 0;
if (content.length === 0) {
return "";
}
if (!ellipsisContainer) {
ellipsisContainer = document.createElement("div");
ellipsisContainer.setAttribute("aria-hidden", "true");
document.body.appendChild(ellipsisContainer);
}
const originStyle = window.getComputedStyle(originEle);
const originCSS = styleToString(originStyle);
const lineHeight = pxToNumber(originStyle.lineHeight);
const maxHeight = Math.round(lineHeight * (rows + 1) + pxToNumber(originStyle.paddingTop) + pxToNumber(originStyle.paddingBottom));
ellipsisContainer.setAttribute("style", originCSS);
ellipsisContainer.style.position = "fixed";
ellipsisContainer.style.left = "0";
if (originStyle.getPropertyValue("width") === "auto" && originEle.offsetWidth) {
ellipsisContainer.style.width = `${originEle.offsetWidth}px`;
}
ellipsisContainer.style.height = "auto";
ellipsisContainer.style.top = "-999999px";
ellipsisContainer.style.zIndex = "-1000";
isStrong && (ellipsisContainer.style.fontWeight = "600");
ellipsisContainer.style.textOverflow = "clip";
ellipsisContainer.style.webkitLineClamp = "none";
ellipsisContainer.innerHTML = "";
function inRange() {
const widthInRange = ellipsisContainer.scrollWidth <= ellipsisContainer.offsetWidth;
const heightInRange = ellipsisContainer.scrollHeight < maxHeight;
return rows === 1 ? widthInRange && heightInRange : heightInRange;
}
const ellipsisContentHolder = document.createElement("span");
const textNode = document.createTextNode(content);
ellipsisContentHolder.appendChild(textNode);
if (suffix.length > 0) {
const ellipsisTextNode = document.createTextNode(suffix);
ellipsisContentHolder.appendChild(ellipsisTextNode);
}
ellipsisContainer.appendChild(ellipsisContentHolder);
Object.values((0, import_omit2.default)(fixedContent, "expand")).map((node) => node && ellipsisContainer.appendChild(node.cloneNode(true)));
function appendExpandNode() {
ellipsisContainer.innerHTML = "";
ellipsisContainer.appendChild(ellipsisContentHolder);
Object.values(fixedContent).map((node) => node && ellipsisContainer.appendChild(node.cloneNode(true)));
}
function getCurrentText(text, pos) {
const end = text.length;
if (!pos) {
return ellipsisStr;
}
if (ellipsisPos === "end") {
return text.slice(0, pos) + ellipsisStr;
}
return text.slice(0, pos) + ellipsisStr + text.slice(end - pos, end);
}
function measureText(textNode2, fullText) {
let startLoc = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;
let endLoc = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : fullText.length;
let lastSuccessLoc = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : 0;
const midLoc = Math.floor((startLoc + endLoc) / 2);
const currentText = getCurrentText(fullText, midLoc);
textNode2.textContent = currentText;
if (startLoc >= endLoc - 1 && endLoc > 0) {
for (let step = endLoc; step >= startLoc; step -= 1) {
const currentStepText = getCurrentText(fullText, step);
textNode2.textContent = currentStepText;
if (inRange()) {
return currentStepText;
}
}
} else if (endLoc === 0) {
return ellipsisStr;
}
if (inRange()) {
return measureText(textNode2, fullText, midLoc, endLoc, midLoc);
}
return measureText(textNode2, fullText, startLoc, midLoc, lastSuccessLoc);
}
let resText = content;
if (!inRange()) {
appendExpandNode();
resText = measureText(textNode, content, 0, ellipsisPos === "middle" ? Math.floor(content.length / 2) : content.length);
}
ellipsisContainer.innerHTML = "";
return resText;
};
var util_default = getRenderText;
// node_modules/@douyinfe/semi-ui/lib/es/typography/context.js
var import_react17 = __toModule(require_react());
var SizeContext = /* @__PURE__ */ import_react17.default.createContext("normal");
var context_default3 = SizeContext;
// node_modules/@douyinfe/semi-ui/lib/es/resizeObserver/index.js
var import_react18 = __toModule(require_react());
var import_react_dom3 = __toModule(require_react_dom());
var import_prop_types9 = __toModule(require_prop_types());
var ObserverProperty;
(function(ObserverProperty2) {
ObserverProperty2["Width"] = "width";
ObserverProperty2["Height"] = "height";
ObserverProperty2["All"] = "all";
})(ObserverProperty || (ObserverProperty = {}));
var ReactResizeObserver = class extends BaseComponent {
constructor(props) {
var _this;
super(props);
_this = this;
this.formerPropertyValue = new Map();
this.getElement = () => {
try {
return (0, import_react_dom3.findDOMNode)(this.childNode || this);
} catch (error) {
return null;
}
};
this.handleResizeEventTriggered = (entries) => {
var _a2, _b, _c, _d;
if (this.props.observerProperty === ObserverProperty.All) {
(_b = (_a2 = this.props).onResize) === null || _b === void 0 ? void 0 : _b.call(_a2, entries);
} else {
const finalEntries = [];
for (const entry of entries) {
if (this.formerPropertyValue.has(entry.target)) {
if (entry.contentRect[this.props.observerProperty] !== this.formerPropertyValue.get(entry.target)) {
this.formerPropertyValue.set(entry.target, entry.contentRect[this.props.observerProperty]);
finalEntries.push(entry);
}
} else {
this.formerPropertyValue.set(entry.target, entry.contentRect[this.props.observerProperty]);
finalEntries.push(entry);
}
}
if (finalEntries.length > 0) {
(_d = (_c = this.props).onResize) === null || _d === void 0 ? void 0 : _d.call(_c, finalEntries);
}
}
};
this.observeElement = function() {
let force = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
const element = _this.getElement();
if (!_this.observer) {
_this.observer = new ResizeObserver(_this.handleResizeEventTriggered);
}
if (!(element && element instanceof Element)) {
_this.observer.disconnect();
return;
}
if (element === _this.element && !force) {
return;
} else {
_this.observer.disconnect();
_this.element = element;
}
_this.observer.observe(element);
if (_this.props.observeParent && element.parentNode && element.parentNode.ownerDocument && element.parentNode.ownerDocument.defaultView && element.parentNode instanceof element.parentNode.ownerDocument.defaultView.HTMLElement) {
_this._parentNode = element.parentNode;
_this.observer.observe(_this._parentNode);
}
};
this.mergeRef = (ref, node) => {
this.childNode = node;
if (typeof ref === "function") {
ref(node);
} else if (typeof ref === "object" && ref && "current" in ref) {
ref.current = node;
}
};
if (globalThis["ResizeObserver"]) {
this.observer = new ResizeObserver(this.handleResizeEventTriggered);
}
}
componentDidMount() {
var _a2;
(_a2 = this.observeElement) === null || _a2 === void 0 ? void 0 : _a2.call(this);
}
componentDidUpdate(prevProps) {
var _a2;
(_a2 = this.observeElement) === null || _a2 === void 0 ? void 0 : _a2.call(this, this.props.observeParent !== prevProps.observeParent);
}
componentWillUnmount() {
if (this.observer) {
this.observer.disconnect();
this.observer = null;
this.element = null;
}
}
render() {
const child = import_react18.default.Children.only(this.props.children);
const {
ref
} = child;
return /* @__PURE__ */ import_react18.default.cloneElement(child, {
ref: (node) => this.mergeRef(ref, node)
});
}
};
ReactResizeObserver.propTypes = {
onResize: import_prop_types9.default.func,
observeParent: import_prop_types9.default.bool,
observerProperty: import_prop_types9.default.string,
delayTick: import_prop_types9.default.number
};
ReactResizeObserver.defaultProps = {
onResize: () => {
},
observeParent: false,
observerProperty: "all",
delayTick: 0
};
// node_modules/@douyinfe/semi-ui/lib/es/typography/base.js
var __awaiter2 = function(thisArg, _arguments, P, generator3) {
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(generator3.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator3["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator3 = generator3.apply(thisArg, _arguments || [])).next());
});
};
var __rest8 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixCls3 = cssClasses.PREFIX;
var ELLIPSIS_STR = "...";
var wrapperDecorations = (props, content) => {
const {
mark,
code,
underline,
strong,
link,
disabled
} = props;
let wrapped = content;
const wrap = (isNeeded, tag) => {
let wrapProps = {};
if (!isNeeded) {
return;
}
if (typeof isNeeded === "object") {
wrapProps = Object.assign({}, isNeeded);
}
wrapped = /* @__PURE__ */ import_react19.default.createElement(tag, wrapProps, wrapped);
};
wrap(mark, "mark");
wrap(code, "code");
wrap(underline && !link, "u");
wrap(strong, "strong");
wrap(props.delete, "del");
wrap(link, disabled ? "span" : "a");
return wrapped;
};
var Base = class extends import_react19.Component {
constructor(props) {
super(props);
this.observerTakingEffect = false;
this.onResize = (entries) => __awaiter2(this, void 0, void 0, function* () {
if (this.rafId) {
window.cancelAnimationFrame(this.rafId);
}
return new Promise((resolve) => {
this.rafId = window.requestAnimationFrame(() => __awaiter2(this, void 0, void 0, function* () {
yield this.getEllipsisState();
resolve();
}));
});
});
this.canUseCSSEllipsis = () => {
const {
copyable
} = this.props;
const {
expandable,
expandText,
pos,
suffix
} = this.getEllipsisOpt();
return !expandable && (0, import_isUndefined.default)(expandText) && !copyable && pos === "end" && !suffix.length;
};
this.shouldTruncated = (rows) => {
if (!rows || rows < 1) {
return false;
}
const updateOverflow = rows <= 1 ? this.compareSingleRow() : this.wrapperRef.current.scrollHeight > this.wrapperRef.current.offsetHeight;
return updateOverflow;
};
this.compareSingleRow = () => {
if (!(document && document.createRange)) {
return false;
}
const containerNode = this.wrapperRef.current;
const containerWidth = containerNode.getBoundingClientRect().width;
const childNodes = Array.from(containerNode.childNodes);
const range = document.createRange();
const contentWidth = childNodes.reduce((acc, node) => {
var _a2;
range.selectNodeContents(node);
return acc + ((_a2 = range.getBoundingClientRect().width) !== null && _a2 !== void 0 ? _a2 : 0);
}, 0);
range.detach();
return contentWidth > containerWidth;
};
this.showTooltip = () => {
var _a2, _b;
const {
isOverflowed,
isTruncated,
expanded
} = this.state;
const {
showTooltip,
expandable,
expandText
} = this.getEllipsisOpt();
const canUseCSSEllipsis = this.canUseCSSEllipsis();
const overflowed = !expanded && (canUseCSSEllipsis ? isOverflowed : isTruncated);
const noExpandText = !expandable && (0, import_isUndefined.default)(expandText);
const show = noExpandText && overflowed && showTooltip;
if (!show) {
return show;
}
const defaultOpts = {
type: "tooltip"
};
if (typeof showTooltip === "object") {
if (showTooltip.type && showTooltip.type.toLowerCase() === "popover") {
return (0, import_merge.default)({
opts: {
showArrow: true
}
}, showTooltip, {
opts: {
className: (0, import_classnames8.default)({
[`${prefixCls3}-ellipsis-popover`]: true,
[(_a2 = showTooltip === null || showTooltip === void 0 ? void 0 : showTooltip.opts) === null || _a2 === void 0 ? void 0 : _a2.className]: Boolean((_b = showTooltip === null || showTooltip === void 0 ? void 0 : showTooltip.opts) === null || _b === void 0 ? void 0 : _b.className)
})
}
});
}
return Object.assign(Object.assign({}, defaultOpts), showTooltip);
}
return defaultOpts;
};
this.onHover = () => {
const canUseCSSEllipsis = this.canUseCSSEllipsis();
if (canUseCSSEllipsis) {
const {
rows,
suffix,
pos
} = this.getEllipsisOpt();
const updateOverflow = this.shouldTruncated(rows);
this.setState({
isOverflowed: updateOverflow,
isTruncated: false
});
return void 0;
}
};
this.getEllipsisState = () => __awaiter2(this, void 0, void 0, function* () {
const {
rows,
suffix,
pos
} = this.getEllipsisOpt();
const {
children,
strong
} = this.props;
if (!this.wrapperRef || !this.wrapperRef.current) {
yield this.onResize();
return;
}
const {
expanded
} = this.state;
const canUseCSSEllipsis = this.canUseCSSEllipsis();
if (canUseCSSEllipsis) {
return;
}
if ((0, import_isNull.default)(children)) {
return new Promise((resolve) => {
this.setState({
isTruncated: false,
isOverflowed: false
}, resolve);
});
}
warning("children" in this.props && typeof children !== "string", "[Semi Typography] Only children with pure text could be used with ellipsis at this moment.");
if (!rows || rows < 0 || expanded) {
return;
}
const extraNode = {
expand: this.expandRef.current,
copy: this.copyRef && this.copyRef.current
};
const realChildren = Array.isArray(children) ? children.join("") : String(children);
const content = util_default(this.wrapperRef.current, rows, realChildren, extraNode, ELLIPSIS_STR, suffix, pos, strong);
return new Promise((resolve) => {
this.setState({
isOverflowed: false,
ellipsisContent: content,
isTruncated: realChildren !== content
}, resolve);
});
});
this.toggleOverflow = (e) => {
const {
onExpand,
expandable,
collapsible
} = this.getEllipsisOpt();
const {
expanded
} = this.state;
onExpand && onExpand(!expanded, e);
if (expandable && !expanded || collapsible && expanded) {
this.setState({
expanded: !expanded
});
}
};
this.getEllipsisOpt = () => {
const {
ellipsis
} = this.props;
if (!ellipsis) {
return {};
}
const opt = Object.assign({
rows: 1,
expandable: false,
pos: "end",
suffix: "",
showTooltip: false,
collapsible: false,
expandText: ellipsis.expandable ? this.expandStr : void 0,
collapseText: ellipsis.collapsible ? this.collapseStr : void 0
}, typeof ellipsis === "object" ? ellipsis : null);
return opt;
};
this.renderExpandable = () => {
const {
expanded,
isTruncated
} = this.state;
if (!isTruncated)
return null;
const {
expandText,
expandable,
collapseText,
collapsible
} = this.getEllipsisOpt();
const noExpandText = !expandable && (0, import_isUndefined.default)(expandText);
const noCollapseText = !collapsible && (0, import_isUndefined.default)(collapseText);
let text;
if (!expanded && !noExpandText) {
text = expandText;
} else if (expanded && !noCollapseText) {
text = collapseText;
}
if (!noExpandText || !noCollapseText) {
return /* @__PURE__ */ import_react19.default.createElement("a", {
role: "button",
tabIndex: 0,
className: `${prefixCls3}-ellipsis-expand`,
key: "expand",
ref: this.expandRef,
"aria-label": text,
onClick: this.toggleOverflow,
onKeyPress: (e) => isEnterPress_default(e) && this.toggleOverflow(e)
}, text);
}
return null;
};
this.getEllipsisStyle = () => {
const {
ellipsis,
component
} = this.props;
if (!ellipsis) {
return {
ellipsisCls: "",
ellipsisStyle: {}
};
}
const {
rows
} = this.getEllipsisOpt();
const {
expanded
} = this.state;
const useCSS = !expanded && this.canUseCSSEllipsis();
const ellipsisCls = (0, import_classnames8.default)({
[`${prefixCls3}-ellipsis`]: true,
[`${prefixCls3}-ellipsis-single-line`]: rows === 1,
[`${prefixCls3}-ellipsis-multiple-line`]: rows > 1,
[`${prefixCls3}-ellipsis-multiple-line-text`]: rows > 1 && component === "span",
[`${prefixCls3}-ellipsis-overflow-ellipsis`]: rows === 1 && useCSS,
[`${prefixCls3}-ellipsis-overflow-ellipsis-text`]: rows === 1 && useCSS && component === "span"
});
const ellipsisStyle = useCSS && rows > 1 ? {
WebkitLineClamp: rows
} : {};
return {
ellipsisCls,
ellipsisStyle
};
};
this.renderEllipsisText = (opt) => {
const {
suffix
} = opt;
const {
children
} = this.props;
const {
isTruncated,
expanded,
ellipsisContent
} = this.state;
if (expanded || !isTruncated) {
return /* @__PURE__ */ import_react19.default.createElement("span", {
onMouseEnter: this.onHover
}, children, suffix && suffix.length ? suffix : null);
}
return /* @__PURE__ */ import_react19.default.createElement("span", {
onMouseEnter: this.onHover
}, ellipsisContent, suffix);
};
this.state = {
editable: false,
copied: false,
isOverflowed: false,
ellipsisContent: props.children,
expanded: false,
isTruncated: false,
prevChildren: null
};
this.wrapperRef = /* @__PURE__ */ import_react19.default.createRef();
this.expandRef = /* @__PURE__ */ import_react19.default.createRef();
this.copyRef = /* @__PURE__ */ import_react19.default.createRef();
}
componentDidMount() {
if (this.props.ellipsis) {
this.onResize().then(() => runAfterTicks(() => this.observerTakingEffect = true, 1));
}
}
static getDerivedStateFromProps(props, prevState) {
const {
prevChildren
} = prevState;
const newState = {};
newState.prevChildren = props.children;
if (props.ellipsis && prevChildren !== props.children) {
newState.isOverflowed = false;
newState.ellipsisContent = props.children;
newState.expanded = false;
newState.isTruncated = true;
}
return newState;
}
componentDidUpdate(prevProps) {
if (this.props.children !== prevProps.children) {
this.forceUpdate();
if (this.props.ellipsis) {
this.onResize();
}
}
}
componentWillUnmount() {
if (this.rafId) {
window.cancelAnimationFrame(this.rafId);
}
}
renderOperations() {
return /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, this.renderExpandable(), this.renderCopy());
}
renderCopy() {
var _a2;
const {
copyable,
children
} = this.props;
if (!copyable) {
return null;
}
const willCopyContent = (_a2 = copyable === null || copyable === void 0 ? void 0 : copyable.content) !== null && _a2 !== void 0 ? _a2 : children;
let copyContent;
let hasObject = false;
if (Array.isArray(willCopyContent)) {
copyContent = "";
willCopyContent.forEach((value) => {
if (typeof value === "object") {
hasObject = true;
}
copyContent += String(value);
});
} else if (typeof willCopyContent !== "object") {
copyContent = String(willCopyContent);
} else {
hasObject = true;
copyContent = String(willCopyContent);
}
warning(hasObject, "Content to be copied in Typography is a object, it will case a [object Object] mistake when copy to clipboard.");
const copyConfig = Object.assign({
content: copyContent,
duration: 3
}, typeof copyable === "object" ? copyable : null);
return /* @__PURE__ */ import_react19.default.createElement(copyable_default, Object.assign({}, copyConfig, {
forwardRef: this.copyRef
}));
}
renderIcon() {
const {
icon,
size
} = this.props;
const realSize = size === "inherit" ? this.context : size;
if (!icon) {
return null;
}
const iconSize = realSize === "small" ? "small" : "default";
return /* @__PURE__ */ import_react19.default.createElement("span", {
className: `${prefixCls3}-icon`,
"x-semi-prop": "icon"
}, isSemiIcon(icon) ? /* @__PURE__ */ import_react19.default.cloneElement(icon, {
size: iconSize
}) : icon);
}
renderContent() {
const _a2 = this.props, {
component,
children,
className,
type,
spacing,
disabled,
style,
ellipsis,
icon,
size,
link,
heading,
weight
} = _a2, rest = __rest8(_a2, ["component", "children", "className", "type", "spacing", "disabled", "style", "ellipsis", "icon", "size", "link", "heading", "weight"]);
const textProps = (0, import_omit3.default)(rest, [
"strong",
"editable",
"mark",
"copyable",
"underline",
"code",
"delete"
]);
const realSize = size === "inherit" ? this.context : size;
const iconNode = this.renderIcon();
const ellipsisOpt = this.getEllipsisOpt();
const {
ellipsisCls,
ellipsisStyle
} = this.getEllipsisStyle();
let textNode = ellipsis ? this.renderEllipsisText(ellipsisOpt) : children;
const linkCls = (0, import_classnames8.default)({
[`${prefixCls3}-link-text`]: link,
[`${prefixCls3}-link-underline`]: this.props.underline && link
});
textNode = wrapperDecorations(this.props, /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, iconNode, this.props.link ? /* @__PURE__ */ import_react19.default.createElement("span", {
className: linkCls
}, textNode) : textNode));
const hTagReg = /^h[1-6]$/;
const isHeader = (0, import_isString.default)(heading) && hTagReg.test(heading);
const wrapperCls = (0, import_classnames8.default)(className, ellipsisCls, {
[`${prefixCls3}-${type}`]: type && !link,
[`${prefixCls3}-${realSize}`]: realSize,
[`${prefixCls3}-link`]: link,
[`${prefixCls3}-disabled`]: disabled,
[`${prefixCls3}-${spacing}`]: spacing,
[`${prefixCls3}-${heading}`]: isHeader,
[`${prefixCls3}-${heading}-weight-${weight}`]: isHeader && weight && isNaN(Number(weight))
});
const textStyle = Object.assign(Object.assign({}, isNaN(Number(weight)) ? {} : {
fontWeight: weight
}), style);
return /* @__PURE__ */ import_react19.default.createElement(typography_default, Object.assign({
className: wrapperCls,
style: Object.assign(Object.assign({}, textStyle), ellipsisStyle),
component,
forwardRef: this.wrapperRef
}, textProps), textNode, this.renderOperations());
}
renderTipWrapper() {
const {
children
} = this.props;
const showTooltip = this.showTooltip();
const content = this.renderContent();
if (showTooltip) {
const {
type,
opts,
renderTooltip
} = showTooltip;
if ((0, import_isFunction3.default)(renderTooltip)) {
return renderTooltip(children, content);
} else if (type.toLowerCase() === "popover") {
return /* @__PURE__ */ import_react19.default.createElement(popover_default, Object.assign({
content: children,
position: "top"
}, opts), content);
}
return /* @__PURE__ */ import_react19.default.createElement(Tooltip2, Object.assign({
content: children,
position: "top"
}, opts), content);
} else {
return content;
}
}
render() {
var _this = this;
const {
size
} = this.props;
const realSize = size === "inherit" ? this.context : size;
const content = /* @__PURE__ */ import_react19.default.createElement(context_default3.Provider, {
value: realSize
}, /* @__PURE__ */ import_react19.default.createElement(LocaleConsumer, {
componentName: "Typography"
}, (locale2) => {
this.expandStr = locale2.expand;
this.collapseStr = locale2.collapse;
return this.renderTipWrapper();
}));
if (this.props.ellipsis) {
return /* @__PURE__ */ import_react19.default.createElement(ReactResizeObserver, {
onResize: function() {
if (_this.observerTakingEffect) {
_this.onResize(...arguments);
}
},
observeParent: true,
observerProperty: ObserverProperty.Width
}, content);
}
return content;
}
};
Base.propTypes = {
children: import_prop_types10.default.node,
copyable: import_prop_types10.default.oneOfType([import_prop_types10.default.shape({
text: import_prop_types10.default.string,
onCopy: import_prop_types10.default.func,
successTip: import_prop_types10.default.node,
copyTip: import_prop_types10.default.node
}), import_prop_types10.default.bool]),
delete: import_prop_types10.default.bool,
disabled: import_prop_types10.default.bool,
ellipsis: import_prop_types10.default.oneOfType([import_prop_types10.default.shape({
rows: import_prop_types10.default.number,
expandable: import_prop_types10.default.bool,
expandText: import_prop_types10.default.string,
onExpand: import_prop_types10.default.func,
suffix: import_prop_types10.default.string,
showTooltip: import_prop_types10.default.oneOfType([import_prop_types10.default.shape({
type: import_prop_types10.default.string,
opts: import_prop_types10.default.object
}), import_prop_types10.default.bool]),
collapsible: import_prop_types10.default.bool,
collapseText: import_prop_types10.default.string,
pos: import_prop_types10.default.oneOf(["end", "middle"])
}), import_prop_types10.default.bool]),
mark: import_prop_types10.default.bool,
underline: import_prop_types10.default.bool,
link: import_prop_types10.default.oneOfType([import_prop_types10.default.object, import_prop_types10.default.bool]),
spacing: import_prop_types10.default.oneOf(strings.SPACING),
strong: import_prop_types10.default.bool,
size: import_prop_types10.default.oneOf(strings.SIZE),
type: import_prop_types10.default.oneOf(strings.TYPE),
style: import_prop_types10.default.object,
className: import_prop_types10.default.string,
icon: import_prop_types10.default.oneOfType([import_prop_types10.default.node, import_prop_types10.default.string]),
heading: import_prop_types10.default.string,
component: import_prop_types10.default.string
};
Base.defaultProps = {
children: null,
copyable: false,
delete: false,
disabled: false,
ellipsis: false,
icon: "",
mark: false,
underline: false,
strong: false,
link: false,
type: "primary",
spacing: "normal",
size: "normal",
style: {},
className: ""
};
Base.contextType = context_default3;
// node_modules/@douyinfe/semi-ui/lib/es/typography/text.js
var Text = class extends import_react20.PureComponent {
render() {
return /* @__PURE__ */ import_react20.default.createElement(Base, Object.assign({
component: "span"
}, this.props));
}
};
Text.propTypes = {
copyable: import_prop_types11.default.oneOfType([import_prop_types11.default.object, import_prop_types11.default.bool]),
delete: import_prop_types11.default.bool,
disabled: import_prop_types11.default.bool,
icon: import_prop_types11.default.oneOfType([import_prop_types11.default.node, import_prop_types11.default.string]),
ellipsis: import_prop_types11.default.oneOfType([import_prop_types11.default.object, import_prop_types11.default.bool]),
mark: import_prop_types11.default.bool,
underline: import_prop_types11.default.bool,
link: import_prop_types11.default.oneOfType([import_prop_types11.default.object, import_prop_types11.default.bool]),
strong: import_prop_types11.default.bool,
type: import_prop_types11.default.oneOf(strings.TYPE),
size: import_prop_types11.default.oneOf(strings.SIZE),
style: import_prop_types11.default.object,
className: import_prop_types11.default.string,
code: import_prop_types11.default.bool,
component: import_prop_types11.default.string,
weight: import_prop_types11.default.number
};
Text.defaultProps = {
copyable: false,
delete: false,
disabled: false,
icon: "",
ellipsis: false,
mark: false,
underline: false,
strong: false,
link: false,
type: "primary",
style: {},
size: "normal",
className: ""
};
// node_modules/@douyinfe/semi-ui/lib/es/typography/title.js
var import_react21 = __toModule(require_react());
var import_prop_types12 = __toModule(require_prop_types());
var __rest9 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var Title = class extends import_react21.PureComponent {
render() {
const _a2 = this.props, {
heading
} = _a2, rest = __rest9(_a2, ["heading"]);
const component = strings.HEADING.indexOf(heading) !== -1 ? `h${heading}` : "h1";
return /* @__PURE__ */ import_react21.default.createElement(Base, Object.assign({
component,
heading: component
}, rest));
}
};
Title.propTypes = {
copyable: import_prop_types12.default.oneOfType([import_prop_types12.default.object, import_prop_types12.default.bool]),
delete: import_prop_types12.default.bool,
disabled: import_prop_types12.default.bool,
ellipsis: import_prop_types12.default.oneOfType([import_prop_types12.default.object, import_prop_types12.default.bool]),
mark: import_prop_types12.default.bool,
link: import_prop_types12.default.oneOfType([import_prop_types12.default.object, import_prop_types12.default.bool]),
underline: import_prop_types12.default.bool,
strong: import_prop_types12.default.bool,
type: import_prop_types12.default.oneOf(strings.TYPE),
heading: import_prop_types12.default.oneOf(strings.HEADING),
style: import_prop_types12.default.object,
className: import_prop_types12.default.string,
component: import_prop_types12.default.string,
weight: import_prop_types12.default.oneOfType([import_prop_types12.default.oneOf(strings.WEIGHT), import_prop_types12.default.number])
};
Title.defaultProps = {
copyable: false,
delete: false,
disabled: false,
ellipsis: false,
mark: false,
underline: false,
strong: false,
link: false,
type: "primary",
heading: 1,
style: {},
className: ""
};
// node_modules/@douyinfe/semi-ui/lib/es/typography/paragraph.js
var import_react22 = __toModule(require_react());
var import_prop_types13 = __toModule(require_prop_types());
var import_classnames9 = __toModule(require_classnames());
var prefixCls4 = cssClasses.PREFIX;
var Paragraph = class extends import_react22.PureComponent {
render() {
const {
className
} = this.props;
const paragraphCls = (0, import_classnames9.default)(className, `${prefixCls4}-paragraph`);
return /* @__PURE__ */ import_react22.default.createElement(Base, Object.assign({
component: "p"
}, this.props, {
className: paragraphCls
}));
}
};
Paragraph.propTypes = {
copyable: import_prop_types13.default.oneOfType([import_prop_types13.default.object, import_prop_types13.default.bool]),
delete: import_prop_types13.default.bool,
disabled: import_prop_types13.default.bool,
ellipsis: import_prop_types13.default.oneOfType([import_prop_types13.default.object, import_prop_types13.default.bool]),
mark: import_prop_types13.default.bool,
link: import_prop_types13.default.oneOfType([import_prop_types13.default.object, import_prop_types13.default.bool]),
underline: import_prop_types13.default.bool,
strong: import_prop_types13.default.bool,
type: import_prop_types13.default.oneOf(strings.TYPE),
size: import_prop_types13.default.oneOf(strings.SIZE),
spacing: import_prop_types13.default.oneOf(strings.SPACING),
style: import_prop_types13.default.object,
className: import_prop_types13.default.string,
component: import_prop_types13.default.string
};
Paragraph.defaultProps = {
copyable: false,
delete: false,
disabled: false,
ellipsis: false,
mark: false,
underline: false,
strong: false,
link: false,
type: "primary",
size: "normal",
spacing: "normal",
style: {},
className: ""
};
// node_modules/@douyinfe/semi-ui/lib/es/typography/numeral.js
var import_react23 = __toModule(require_react());
var import_prop_types14 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/typography/formatNumeral.js
var FormatNumeral = class {
constructor(content, rule, precision, truncate, parser) {
this.ruleMethods = {
"bytes-decimal": (value) => {
const units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
let i = 0;
while (value >= 1e3) {
value /= 1e3;
i++;
}
return `${this.truncatePrecision(value)} ${units[i]}`;
},
"bytes-binary": (value) => {
const units = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
let i = 0;
while (value >= 1024) {
value /= 1024;
i++;
}
return `${this.truncatePrecision(value)} ${units[i]}`;
},
percentages: (value) => {
return `${this.truncatePrecision(value * 100)}%`;
},
exponential: (value) => {
const vExponential = value.toExponential(this.precision + 2);
const vArr = vExponential.split("e");
return `${this.truncatePrecision(Number(vArr[0]))}e${vArr[1]}`;
}
};
this.truncateMethods = {
ceil: Math.ceil,
floor: Math.floor,
round: Math.round
};
this.isDiyParser = typeof parser !== "undefined";
this.content = content;
this.rule = rule;
this.precision = precision;
this.truncate = truncate;
this.parser = parser;
}
format() {
if (this.isDiyParser) {
return this.parser(this.content);
}
if (this.rule === "text") {
return extractNumbers(this.content).map((item) => checkIsNumeral(item) ? this.truncatePrecision(item) : item).join("");
}
if (this.rule === "numbers") {
return extractNumbers(this.content).filter((item) => checkIsNumeral(item)).map((item) => this.truncatePrecision(item)).join(",");
}
return extractNumbers(this.content).map((item) => checkIsNumeral(item) ? this.ruleMethods[this.rule](Number(item)) : item).join("");
}
truncatePrecision(content) {
const cTruncated = this.truncateMethods[this.truncate](Number(content) * Math.pow(10, this.precision)) / Math.pow(10, this.precision);
const cArr = cTruncated.toString().split(".");
if (cArr.length === 1) {
return cTruncated.toFixed(this.precision);
}
const cTLength = cArr[1].length;
if (cTLength < this.precision) {
return `${cArr[0]}.${cArr[1]}${"0".repeat(this.precision - cTLength)}`;
}
return cTruncated.toString();
}
};
function extractNumbers(content) {
const reg = /(-?[0-9]*\.?[0-9]+([eE]-?[0-9]+)?)|([^-\d\.]+)/g;
return content.match(reg) || [];
}
function checkIsNumeral(str) {
return !(isNaN(Number(str)) || str.replace(/\s+/g, "") === "");
}
// node_modules/@douyinfe/semi-ui/lib/es/typography/numeral.js
var Numeral = class extends import_react23.PureComponent {
formatNodeDFS(node) {
if (!Array.isArray(node)) {
node = [node];
}
node = node.map((item) => {
if (typeof item === "string" || typeof item === "number") {
return new FormatNumeral(String(item), this.props.rule, this.props.precision, this.props.truncate, this.props.parser).format();
}
if (typeof item === "function") {
return this.formatNodeDFS(item());
}
if (typeof item === "object" && "children" in item["props"]) {
return Object.assign(Object.assign({}, item), {
props: Object.assign(Object.assign({}, item["props"]), {
children: this.formatNodeDFS(item["props"]["children"])
})
});
}
return item;
});
return node.length === 1 ? node[0] : node;
}
render() {
const baseProps = Object.assign({}, this.props);
delete baseProps.rule;
delete baseProps.parser;
baseProps.children = this.formatNodeDFS(this.props.children);
return /* @__PURE__ */ import_react23.default.createElement(Base, Object.assign({
component: "span"
}, baseProps));
}
};
Numeral.propTypes = {
rule: import_prop_types14.default.oneOf(strings.RULE),
precision: import_prop_types14.default.number,
truncate: import_prop_types14.default.oneOf(strings.TRUNCATE),
parser: import_prop_types14.default.func,
copyable: import_prop_types14.default.oneOfType([import_prop_types14.default.object, import_prop_types14.default.bool]),
delete: import_prop_types14.default.bool,
disabled: import_prop_types14.default.bool,
icon: import_prop_types14.default.oneOfType([import_prop_types14.default.node, import_prop_types14.default.string]),
mark: import_prop_types14.default.bool,
underline: import_prop_types14.default.bool,
link: import_prop_types14.default.oneOfType([import_prop_types14.default.object, import_prop_types14.default.bool]),
strong: import_prop_types14.default.bool,
type: import_prop_types14.default.oneOf(strings.TYPE),
size: import_prop_types14.default.oneOf(strings.SIZE),
style: import_prop_types14.default.object,
className: import_prop_types14.default.string,
code: import_prop_types14.default.bool,
component: import_prop_types14.default.string
};
Numeral.defaultProps = {
rule: "text",
precision: 0,
truncate: "round",
parser: void 0,
copyable: false,
delete: false,
icon: "",
mark: false,
underline: false,
strong: false,
link: false,
type: "primary",
style: {},
size: "normal",
className: ""
};
// node_modules/@douyinfe/semi-ui/lib/es/typography/index.js
var Typography2 = typography_default;
Typography2.Text = Text;
Typography2.Title = Title;
Typography2.Paragraph = Paragraph;
Typography2.Numeral = Numeral;
var typography_default2 = Typography2;
// node_modules/@douyinfe/semi-ui/lib/es/spin/index.js
var import_react25 = __toModule(require_react());
var import_prop_types15 = __toModule(require_prop_types());
var import_classnames10 = __toModule(require_classnames());
// node_modules/@douyinfe/semi-foundation/lib/es/spin/constants.js
var PREFIX = `${BASE_CLASS_PREFIX}-spin`;
var cssClasses4 = {
PREFIX
};
var strings4 = {
SIZE: ["small", "middle", "large"]
};
// node_modules/@douyinfe/semi-foundation/lib/es/spin/foundation.js
var SpinFoundation = class extends foundation_default {
static get spinDefaultAdapter() {
return {
getProp: () => void 0,
setLoading: (val) => void 0
};
}
constructor(adapter) {
super(Object.assign(Object.assign({}, SpinFoundation.spinDefaultAdapter), adapter));
}
updateLoadingIfNeedDelay() {
const {
spinning: propsSpinning,
delay: propsDelay
} = this._adapter.getProps();
const {
delay
} = this._adapter.getStates();
if (delay) {
const self2 = this;
this._timer = setTimeout(() => {
self2._adapter.setState({
loading: propsSpinning,
delay: 0
});
}, propsDelay);
}
}
destroy() {
if (this._timer) {
clearTimeout(this._timer);
this._timer = null;
}
}
};
var foundation_default2 = SpinFoundation;
// node_modules/@douyinfe/semi-ui/lib/es/spin/icon.js
var import_react24 = __toModule(require_react());
var __rest10 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var _id = -1;
function Icon2() {
let props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
const {
id: propsId,
className
} = props, rest = __rest10(props, ["id", "className"]);
let _propsId = propsId;
if (isNullOrUndefined(_propsId)) {
_id++;
_propsId = _id;
}
const id = `linearGradient-${_propsId}`;
return /* @__PURE__ */ import_react24.default.createElement("svg", Object.assign({}, rest, {
className,
width: "48",
height: "48",
viewBox: "0 0 36 36",
version: "1.1",
xmlns: "http://www.w3.org/2000/svg",
"aria-hidden": true,
"data-icon": "spin"
}), /* @__PURE__ */ import_react24.default.createElement("defs", null, /* @__PURE__ */ import_react24.default.createElement("linearGradient", {
x1: "0%",
y1: "100%",
x2: "100%",
y2: "100%",
id
}, /* @__PURE__ */ import_react24.default.createElement("stop", {
stopColor: "currentColor",
stopOpacity: "0",
offset: "0%"
}), /* @__PURE__ */ import_react24.default.createElement("stop", {
stopColor: "currentColor",
stopOpacity: "0.50",
offset: "39.9430698%"
}), /* @__PURE__ */ import_react24.default.createElement("stop", {
stopColor: "currentColor",
offset: "100%"
}))), /* @__PURE__ */ import_react24.default.createElement("g", {
stroke: "none",
strokeWidth: "1",
fill: "none",
fillRule: "evenodd"
}, /* @__PURE__ */ import_react24.default.createElement("rect", {
fillOpacity: "0.01",
fill: "none",
x: "0",
y: "0",
width: "36",
height: "36"
}), /* @__PURE__ */ import_react24.default.createElement("path", {
d: "M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951",
stroke: `url(#${id})`,
strokeWidth: "4",
strokeLinecap: "round"
})));
}
var icon_default = Icon2;
// node_modules/@douyinfe/semi-ui/lib/es/spin/index.js
var __rest11 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixCls5 = cssClasses4.PREFIX;
var Spin = class extends BaseComponent {
constructor(props) {
super(props);
this.foundation = new foundation_default2(this.adapter);
this.state = {
delay: props.delay,
loading: true
};
}
static getDerivedStateFromProps(props) {
if (!props.delay) {
return {
loading: props.spinning
};
}
if (props.spinning === false) {
return {
delay: 0,
loading: false
};
}
return {
delay: props.delay
};
}
get adapter() {
return Object.assign(Object.assign({}, super.adapter), {
setLoading: (value) => {
this.setState({
loading: value
});
}
});
}
componentWillUnmount() {
this.foundation.destroy();
}
renderSpin() {
const {
indicator,
tip
} = this.props;
const {
loading
} = this.state;
return loading ? /* @__PURE__ */ import_react25.default.createElement("div", {
className: `${prefixCls5}-wrapper`
}, indicator ? /* @__PURE__ */ import_react25.default.createElement("div", {
className: `${prefixCls5}-animate`,
"x-semi-prop": "indicator"
}, indicator) : /* @__PURE__ */ import_react25.default.createElement(icon_default, null), tip ? /* @__PURE__ */ import_react25.default.createElement("div", {
"x-semi-prop": "tip"
}, tip) : null) : null;
}
render() {
this.foundation.updateLoadingIfNeedDelay();
const _a2 = this.props, {
children,
style,
wrapperClassName,
childStyle,
size
} = _a2, rest = __rest11(_a2, ["children", "style", "wrapperClassName", "childStyle", "size"]);
const {
loading
} = this.state;
const spinCls = (0, import_classnames10.default)(prefixCls5, wrapperClassName, {
[`${prefixCls5}-${size}`]: size,
[`${prefixCls5}-block`]: children,
[`${prefixCls5}-hidden`]: !loading
});
return /* @__PURE__ */ import_react25.default.createElement("div", Object.assign({
className: spinCls,
style
}, this.getDataAttr(rest)), this.renderSpin(), /* @__PURE__ */ import_react25.default.createElement("div", {
className: `${prefixCls5}-children`,
style: childStyle,
"x-semi-prop": "children"
}, children));
}
};
Spin.propTypes = {
size: import_prop_types15.default.oneOf(strings4.SIZE),
spinning: import_prop_types15.default.bool,
children: import_prop_types15.default.node,
indicator: import_prop_types15.default.node,
delay: import_prop_types15.default.number,
tip: import_prop_types15.default.node,
wrapperClassName: import_prop_types15.default.string,
childStyle: import_prop_types15.default.object,
style: import_prop_types15.default.object
};
Spin.defaultProps = {
size: "middle",
spinning: true,
children: null,
indicator: null,
delay: 0
};
var spin_default = Spin;
// node_modules/@douyinfe/semi-ui/lib/es/avatar/index.js
var import_react27 = __toModule(require_react());
var import_classnames11 = __toModule(require_classnames());
var import_prop_types16 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/avatar/constants.js
var cssClasses5 = {
PREFIX: `${BASE_CLASS_PREFIX}-avatar`
};
var strings5 = {
SHAPE: ["circle", "square"],
SIZE: ["extra-extra-small", "extra-small", "small", "default", "medium", "large", "extra-large"],
COLOR: ["grey", "red", "pink", "purple", "violet", "indigo", "blue", "light-blue", "cyan", "teal", "green", "light-green", "lime", "yellow", "amber", "orange", "white"],
OVERLAP_FROM: ["start", "end"]
};
// node_modules/@douyinfe/semi-foundation/lib/es/avatar/foundation.js
var AvatarFoundation = class extends foundation_default {
constructor(adapter) {
super(Object.assign({}, adapter));
this.handleFocusVisible = (event) => {
const {
target
} = event;
try {
if (target.matches(":focus-visible")) {
this._adapter.setFocusVisible(true);
}
} catch (error) {
warning(true, "Warning: [Semi Avatar] The current browser does not support the focus-visible");
}
};
this.handleBlur = () => {
this._adapter.setFocusVisible(false);
};
this.changeScale = () => {
const {
gap
} = this.getProps();
const node = this._adapter.getAvatarNode();
const stringNode = node === null || node === void 0 ? void 0 : node.firstChild;
const [nodeWidth, stringNodeWidth] = [(node === null || node === void 0 ? void 0 : node.offsetWidth) || 0, (stringNode === null || stringNode === void 0 ? void 0 : stringNode.offsetWidth) || 0];
if (nodeWidth !== 0 && stringNodeWidth !== 0 && gap * 2 < nodeWidth) {
const scale = nodeWidth - gap * 2 > stringNodeWidth ? 1 : (nodeWidth - gap * 2) / stringNodeWidth;
this._adapter.setScale(scale);
}
};
}
init() {
const {
children
} = this.getProps();
if (typeof children === "string") {
this.changeScale();
}
}
destroy() {
}
handleImgLoadError() {
const {
onError
} = this.getProps();
const errorFlag = onError ? onError() : void 0;
if (errorFlag !== false) {
this._adapter.notifyImgState(false);
}
}
handleEnter(e) {
this._adapter.notifyEnter(e);
}
handleLeave(e) {
this._adapter.notifyLeave(e);
}
};
// node_modules/@douyinfe/semi-ui/lib/es/avatar/TopSlotSvg.js
var import_react26 = __toModule(require_react());
var TopSlotSvg = (_ref) => {
let {
gradientStart,
gradientEnd
} = _ref;
const id = getUuidShort();
return /* @__PURE__ */ import_react26.default.createElement("svg", {
xmlns: "http://www.w3.org/2000/svg",
width: "51",
height: "52",
viewBox: "0 0 51 52",
fill: "none"
}, /* @__PURE__ */ import_react26.default.createElement("g", {
filter: "url(#filter0_d_6_2)"
}, /* @__PURE__ */ import_react26.default.createElement("path", {
d: "M40.4918 46.5592C44.6795 43.176 46.261 34.1333 47.5301 25.6141C49.5854 11.8168 39.6662 1 25.8097 1C11.2857 1 3 11.4279 3 25.3518C3 33.7866 6.29361 43.8947 10.4602 46.5592C12.5868 47.9192 12.5868 47.9051 25.8097 47.9192C38.3651 47.9282 38.5352 48.14 40.4918 46.5592Z",
fill: `url(#${id})`
})), /* @__PURE__ */ import_react26.default.createElement("defs", null, /* @__PURE__ */ import_react26.default.createElement("filter", {
id: "filter0_d_6_2",
x: "0.789215",
y: "0.447304",
width: "49.2216",
height: "51.3549",
filterUnits: "userSpaceOnUse",
colorInterpolationFilters: "sRGB"
}, /* @__PURE__ */ import_react26.default.createElement("feFlood", {
floodOpacity: "0",
result: "BackgroundImageFix"
}), /* @__PURE__ */ import_react26.default.createElement("feColorMatrix", {
in: "SourceAlpha",
type: "matrix",
values: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
result: "hardAlpha"
}), /* @__PURE__ */ import_react26.default.createElement("feOffset", {
dy: "1.65809"
}), /* @__PURE__ */ import_react26.default.createElement("feGaussianBlur", {
stdDeviation: "1.10539"
}), /* @__PURE__ */ import_react26.default.createElement("feColorMatrix", {
type: "matrix",
values: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"
}), /* @__PURE__ */ import_react26.default.createElement("feBlend", {
mode: "normal",
in2: "BackgroundImageFix",
result: "effect1_dropShadow_6_2"
}), /* @__PURE__ */ import_react26.default.createElement("feBlend", {
mode: "normal",
in: "SourceGraphic",
in2: "effect1_dropShadow_6_2",
result: "shape"
})), /* @__PURE__ */ import_react26.default.createElement("linearGradient", {
id,
x1: "17.671",
y1: "31.7392",
x2: "17.671",
y2: "47.9333",
gradientUnits: "userSpaceOnUse"
}, /* @__PURE__ */ import_react26.default.createElement("stop", {
stopColor: gradientStart
}), /* @__PURE__ */ import_react26.default.createElement("stop", {
offset: "1",
stopColor: gradientEnd
}))));
};
var TopSlotSvg_default = TopSlotSvg;
// node_modules/@douyinfe/semi-ui/lib/es/avatar/index.js
var __rest12 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var sizeSet = strings5.SIZE;
var shapeSet = strings5.SHAPE;
var colorSet = strings5.COLOR;
var prefixCls6 = cssClasses5.PREFIX;
var Avatar = class extends BaseComponent {
constructor(props) {
super(props);
this.handleFocusVisible = (event) => {
this.foundation.handleFocusVisible(event);
};
this.handleBlur = (event) => {
this.foundation.handleBlur();
};
this.getContent = () => {
const {
children,
onClick,
imgAttr,
src,
srcSet,
alt
} = this.props;
const {
isImgExist
} = this.state;
let content = children;
const clickable = onClick !== noop2;
const isImg = src && isImgExist;
const a11yFocusProps = {
tabIndex: 0,
onKeyDown: this.handleKeyDown,
onFocus: this.handleFocusVisible,
onBlur: this.handleBlur
};
if (isImg) {
const finalAlt = clickable ? `clickable Avatar: ${alt}` : alt;
const imgBasicProps = Object.assign(Object.assign({
src,
srcSet,
onError: this.handleError
}, imgAttr), {
className: (0, import_classnames11.default)({
[`${prefixCls6}-no-focus-visible`]: clickable
})
});
const imgProps = clickable ? Object.assign(Object.assign({}, imgBasicProps), a11yFocusProps) : imgBasicProps;
content = /* @__PURE__ */ import_react27.default.createElement("img", Object.assign({
alt: finalAlt
}, imgProps));
} else if (typeof children === "string") {
const tempAlt = alt !== null && alt !== void 0 ? alt : children;
const finalAlt = clickable ? `clickable Avatar: ${tempAlt}` : tempAlt;
const props2 = {
role: "img",
"aria-label": finalAlt,
className: (0, import_classnames11.default)(`${prefixCls6}-label`, {
[`${prefixCls6}-no-focus-visible`]: clickable
})
};
const finalProps = clickable ? Object.assign(Object.assign({}, props2), a11yFocusProps) : props2;
const stringStyle = {
transform: `scale(${this.state.scale})`
};
content = /* @__PURE__ */ import_react27.default.createElement("span", {
className: `${prefixCls6}-content`,
style: stringStyle
}, /* @__PURE__ */ import_react27.default.createElement("span", Object.assign({}, finalProps, {
"x-semi-prop": "children"
}), children));
}
return content;
};
this.renderBottomSlot = () => {
var _a2, _b;
if (!this.props.bottomSlot) {
return null;
}
if (this.props.bottomSlot.render) {
return this.props.bottomSlot.render();
}
const renderContent = (_a2 = this.props.bottomSlot.render) !== null && _a2 !== void 0 ? _a2 : () => {
var _a3;
const style = {};
if (this.props.bottomSlot.bgColor) {
style["backgroundColor"] = this.props.bottomSlot.bgColor;
}
if (this.props.bottomSlot.textColor) {
style["color"] = this.props.bottomSlot.textColor;
}
return /* @__PURE__ */ import_react27.default.createElement("span", {
style,
className: (0, import_classnames11.default)(`${prefixCls6}-bottom_slot-shape_${this.props.bottomSlot.shape}`, `${prefixCls6}-bottom_slot-shape_${this.props.bottomSlot.shape}-${this.props.size}`, (_a3 = this.props.bottomSlot.className) !== null && _a3 !== void 0 ? _a3 : "")
}, this.props.bottomSlot.text);
};
return /* @__PURE__ */ import_react27.default.createElement("div", {
className: (0, import_classnames11.default)([`${prefixCls6}-bottom_slot`]),
style: (_b = this.props.bottomSlot.style) !== null && _b !== void 0 ? _b : {}
}, renderContent());
};
this.renderTopSlot = () => {
var _a2, _b, _c, _d;
if (!this.props.topSlot) {
return null;
}
if (this.props.topSlot.render) {
return this.props.topSlot.render();
}
const textStyle = {};
if (this.props.topSlot.textColor) {
textStyle["color"] = this.props.topSlot.textColor;
}
return /* @__PURE__ */ import_react27.default.createElement("div", {
style: (_a2 = this.props.topSlot.style) !== null && _a2 !== void 0 ? _a2 : {},
className: (0, import_classnames11.default)([`${prefixCls6}-top_slot-wrapper`, (_b = this.props.topSlot.className) !== null && _b !== void 0 ? _b : "", {
[`${prefixCls6}-animated`]: this.props.contentMotion
}])
}, /* @__PURE__ */ import_react27.default.createElement("div", {
className: (0, import_classnames11.default)([`${prefixCls6}-top_slot-bg`, `${prefixCls6}-top_slot-bg-${this.props.size}`])
}, /* @__PURE__ */ import_react27.default.createElement("div", {
className: (0, import_classnames11.default)([`${prefixCls6}-top_slot-bg-svg`, `${prefixCls6}-top_slot-bg-svg-${this.props.size}`])
}, /* @__PURE__ */ import_react27.default.createElement(TopSlotSvg_default, {
gradientStart: (_c = this.props.topSlot.gradientStart) !== null && _c !== void 0 ? _c : "var(--semi-color-primary)",
gradientEnd: (_d = this.props.topSlot.gradientEnd) !== null && _d !== void 0 ? _d : "var(--semi-color-primary)"
}))), /* @__PURE__ */ import_react27.default.createElement("div", {
className: (0, import_classnames11.default)([`${prefixCls6}-top_slot`])
}, /* @__PURE__ */ import_react27.default.createElement("div", {
style: textStyle,
className: (0, import_classnames11.default)([`${prefixCls6}-top_slot-content`, `${prefixCls6}-top_slot-content-${this.props.size}`])
}, this.props.topSlot.text)));
};
this.state = {
isImgExist: true,
hoverContent: "",
focusVisible: false,
scale: 1
};
this.onEnter = this.onEnter.bind(this);
this.onLeave = this.onLeave.bind(this);
this.handleError = this.handleError.bind(this);
this.handleKeyDown = this.handleKeyDown.bind(this);
this.getContent = this.getContent.bind(this);
this.avatarRef = /* @__PURE__ */ import_react27.default.createRef();
}
get adapter() {
return Object.assign(Object.assign({}, super.adapter), {
notifyImgState: (isImgExist) => {
this.setState({
isImgExist
});
},
notifyEnter: (e) => {
const {
hoverMask
} = this.props;
const hoverContent = hoverMask;
this.setState({
hoverContent
}, () => {
const {
onMouseEnter
} = this.props;
onMouseEnter && onMouseEnter(e);
});
},
notifyLeave: (e) => {
this.setState({
hoverContent: ""
}, () => {
const {
onMouseLeave
} = this.props;
onMouseLeave && onMouseLeave(e);
});
},
setFocusVisible: (focusVisible) => {
this.setState({
focusVisible
});
},
setScale: (scale) => {
this.setState({
scale
});
},
getAvatarNode: () => {
var _a2;
return (_a2 = this.avatarRef) === null || _a2 === void 0 ? void 0 : _a2.current;
}
});
}
componentDidMount() {
this.foundation = new AvatarFoundation(this.adapter);
this.foundation.init();
}
componentDidUpdate(prevProps) {
if (this.props.src && this.props.src !== prevProps.src) {
const image = new Image(0, 0);
image.src = this.props.src;
image.onload = () => {
this.setState({
isImgExist: true
});
};
image.onerror = () => {
this.setState({
isImgExist: false
});
};
image.onabort = () => {
this.setState({
isImgExist: false
});
};
}
if (typeof this.props.children === "string" && this.props.children !== prevProps.children) {
this.foundation.changeScale();
}
}
componentWillUnmount() {
this.foundation.destroy();
}
onEnter(e) {
this.foundation.handleEnter(e);
}
onLeave(e) {
this.foundation.handleLeave(e);
}
handleError() {
this.foundation.handleImgLoadError();
}
handleKeyDown(event) {
const {
onClick
} = this.props;
switch (event.key) {
case "Enter":
onClick(event);
handlePrevent(event);
break;
case "Escape":
event.target.blur();
break;
default:
break;
}
}
render() {
var _a2;
const _b = this.props, {
shape,
children,
size,
color,
className,
hoverMask,
onClick,
imgAttr,
src,
srcSet,
style,
alt,
gap,
bottomSlot,
topSlot,
border,
contentMotion
} = _b, others = __rest12(_b, ["shape", "children", "size", "color", "className", "hoverMask", "onClick", "imgAttr", "src", "srcSet", "style", "alt", "gap", "bottomSlot", "topSlot", "border", "contentMotion"]);
const {
isImgExist,
hoverContent,
focusVisible
} = this.state;
let customStyle = {};
if (!strings5.SIZE.includes(size)) {
customStyle = {
width: size,
height: size
};
}
customStyle = Object.assign(Object.assign({}, customStyle), style);
const shouldWrap = bottomSlot || topSlot || border;
const mouseEvent = {
onClick,
onMouseEnter: this.onEnter,
onMouseLeave: this.onLeave
};
const isImg = src && isImgExist;
const avatarCls = (0, import_classnames11.default)(prefixCls6, {
[`${prefixCls6}-${shape}`]: shape,
[`${prefixCls6}-${size}`]: size,
[`${prefixCls6}-${color}`]: color && !isImg,
[`${prefixCls6}-img`]: isImg,
[`${prefixCls6}-focus`]: focusVisible,
[`${prefixCls6}-animated`]: contentMotion
}, className);
const hoverRender = hoverContent ? /* @__PURE__ */ import_react27.default.createElement("div", {
className: `${prefixCls6}-hover`,
"x-semi-prop": "hoverContent"
}, hoverContent) : null;
let avatar = /* @__PURE__ */ import_react27.default.createElement("span", Object.assign({}, others, {
style: shouldWrap ? {} : customStyle,
className: avatarCls
}, shouldWrap ? {} : mouseEvent, {
role: "listitem",
ref: this.avatarRef
}), this.getContent(), hoverRender);
if (border) {
const borderStyle = {};
if (typeof border === "object" && (border === null || border === void 0 ? void 0 : border.color)) {
borderStyle["borderColor"] = border === null || border === void 0 ? void 0 : border.color;
}
avatar = /* @__PURE__ */ import_react27.default.createElement("div", {
style: Object.assign({
position: "relative"
}, customStyle)
}, avatar, /* @__PURE__ */ import_react27.default.createElement("span", {
style: borderStyle,
className: (0, import_classnames11.default)([`${prefixCls6}-additionalBorder`, `${prefixCls6}-additionalBorder-${size}`, {
[`${prefixCls6}-${shape}`]: shape
}])
}), typeof this.props.border === "object" && this.props.border.motion && /* @__PURE__ */ import_react27.default.createElement("span", {
style: borderStyle,
className: (0, import_classnames11.default)([`${prefixCls6}-additionalBorder`, `${prefixCls6}-additionalBorder-${size}`, {
[`${prefixCls6}-${shape}`]: shape,
[`${prefixCls6}-additionalBorder-animated`]: typeof this.props.border === "object" && ((_a2 = this.props.border) === null || _a2 === void 0 ? void 0 : _a2.motion)
}])
}));
}
if (shouldWrap) {
return /* @__PURE__ */ import_react27.default.createElement("span", Object.assign({
className: (0, import_classnames11.default)([`${prefixCls6}-wrapper`]),
style: customStyle
}, mouseEvent), avatar, topSlot && ["extra-small", "small", "default", "medium", "large", "extra-large"].includes(size) && shape === "circle" && this.renderTopSlot(), bottomSlot && ["extra-small", "small", "default", "medium", "large", "extra-large"].includes(size) && this.renderBottomSlot());
} else {
return avatar;
}
}
};
Avatar.__SemiComponentName__ = "Avatar";
Avatar.defaultProps = getDefaultPropsFromGlobalConfig(Avatar.__SemiComponentName__, {
size: "medium",
color: "grey",
shape: "circle",
gap: 3,
onClick: noop2,
onMouseEnter: noop2,
onMouseLeave: noop2
});
Avatar.propTypes = {
children: import_prop_types16.default.node,
color: import_prop_types16.default.oneOf(colorSet),
shape: import_prop_types16.default.oneOf(shapeSet),
size: import_prop_types16.default.oneOf(sizeSet),
hoverMask: import_prop_types16.default.node,
className: import_prop_types16.default.string,
style: import_prop_types16.default.object,
gap: import_prop_types16.default.number,
imgAttr: import_prop_types16.default.object,
src: import_prop_types16.default.string,
srcSet: import_prop_types16.default.string,
alt: import_prop_types16.default.string,
onError: import_prop_types16.default.func,
onClick: import_prop_types16.default.func,
onMouseEnter: import_prop_types16.default.func,
onMouseLeave: import_prop_types16.default.func,
bottomSlot: import_prop_types16.default.shape({
render: import_prop_types16.default.func,
shape: import_prop_types16.default.oneOf(["circle", "square"]),
text: import_prop_types16.default.node,
bgColor: import_prop_types16.default.string,
textColor: import_prop_types16.default.string,
className: import_prop_types16.default.string,
style: import_prop_types16.default.object
}),
topSlot: import_prop_types16.default.shape({
render: import_prop_types16.default.func,
gradientStart: import_prop_types16.default.string,
gradientEnd: import_prop_types16.default.string,
text: import_prop_types16.default.node,
textColor: import_prop_types16.default.string,
className: import_prop_types16.default.string,
style: import_prop_types16.default.object
}),
border: import_prop_types16.default.oneOfType([import_prop_types16.default.shape({
color: import_prop_types16.default.string,
motion: import_prop_types16.default.bool
}), import_prop_types16.default.bool]),
contentMotion: import_prop_types16.default.bool
};
Avatar.elementType = "Avatar";
// node_modules/@douyinfe/semi-ui/lib/es/iconButton/index.js
var import_noop4 = __toModule(require_noop());
var import_react29 = __toModule(require_react());
var import_classnames14 = __toModule(require_classnames());
var import_prop_types18 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/button/constants.js
var cssClasses6 = {
PREFIX: `${BASE_CLASS_PREFIX}-button`
};
var strings6 = {
sizes: ["default", "small", "large"],
iconPositions: ["left", "right"],
htmlTypes: ["button", "reset", "submit"],
btnTypes: ["primary", "secondary", "tertiary", "warning", "danger"],
themes: ["solid", "borderless", "light", "outline"],
DEFAULT_ICON_SIZE: "default",
DEFAULT_ICON_POSITION: "left"
};
// node_modules/@douyinfe/semi-foundation/lib/es/icons/constants.js
var cssClasses7 = {
PREFIX: `${BASE_CLASS_PREFIX}-icon`
};
var strings7 = {
SIZE: ["extra-small", "small", "default", "large", "extra-large", "custom"],
ICON_PREFIX: "semi-icon-"
};
// node_modules/@douyinfe/semi-ui/lib/es/button/Button.js
var import_omit4 = __toModule(require_omit());
var import_react28 = __toModule(require_react());
var import_classnames12 = __toModule(require_classnames());
var import_prop_types17 = __toModule(require_prop_types());
var import_classnames13 = __toModule(require_classnames());
var __rest13 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var btnSizes = strings6.sizes;
var {
htmlTypes,
btnTypes
} = strings6;
var Button = class extends import_react28.PureComponent {
render() {
const _a2 = this.props, {
children,
block,
htmlType,
loading,
circle,
className,
style,
disabled,
size,
theme,
type,
prefixCls: prefixCls17,
iconPosition
} = _a2, attr = __rest13(_a2, ["children", "block", "htmlType", "loading", "circle", "className", "style", "disabled", "size", "theme", "type", "prefixCls", "iconPosition"]);
const baseProps = Object.assign(Object.assign({
disabled
}, (0, import_omit4.default)(attr, ["x-semi-children-alias"])), {
className: (0, import_classnames12.default)(prefixCls17, {
[`${prefixCls17}-${type}`]: !disabled && type,
[`${prefixCls17}-disabled`]: disabled,
[`${prefixCls17}-size-large`]: size === "large",
[`${prefixCls17}-size-small`]: size === "small",
[`${prefixCls17}-light`]: theme === "light",
[`${prefixCls17}-block`]: block,
[`${prefixCls17}-circle`]: circle,
[`${prefixCls17}-borderless`]: theme === "borderless",
[`${prefixCls17}-outline`]: theme === "outline",
[`${prefixCls17}-${type}-disabled`]: disabled && type
}, className),
type: htmlType,
"aria-disabled": disabled
});
const xSemiProps = {};
if (!(className && className.includes("-with-icon"))) {
xSemiProps["x-semi-prop"] = this.props["x-semi-children-alias"] || "children";
}
return /* @__PURE__ */ import_react28.default.createElement("button", Object.assign({}, baseProps, {
onClick: this.props.onClick,
onMouseDown: this.props.onMouseDown,
style
}), /* @__PURE__ */ import_react28.default.createElement("span", Object.assign({
className: (0, import_classnames13.default)(`${prefixCls17}-content`, this.props.contentClassName),
onClick: (e) => disabled && e.stopPropagation()
}, xSemiProps), children));
}
};
Button.defaultProps = {
disabled: false,
size: "default",
type: "primary",
theme: "light",
block: false,
htmlType: "button",
onMouseDown: noop2,
onClick: noop2,
onMouseEnter: noop2,
onMouseLeave: noop2,
prefixCls: cssClasses6.PREFIX
};
Button.propTypes = {
children: import_prop_types17.default.node,
disabled: import_prop_types17.default.bool,
prefixCls: import_prop_types17.default.string,
style: import_prop_types17.default.object,
size: import_prop_types17.default.oneOf(btnSizes),
type: import_prop_types17.default.oneOf(btnTypes),
block: import_prop_types17.default.bool,
onClick: import_prop_types17.default.func,
onMouseDown: import_prop_types17.default.func,
circle: import_prop_types17.default.bool,
loading: import_prop_types17.default.bool,
htmlType: import_prop_types17.default.oneOf(htmlTypes),
theme: import_prop_types17.default.oneOf(strings6.themes),
className: import_prop_types17.default.string,
onMouseEnter: import_prop_types17.default.func,
onMouseLeave: import_prop_types17.default.func,
"aria-label": import_prop_types17.default.string,
contentClassName: import_prop_types17.default.string
};
// node_modules/@douyinfe/semi-ui/lib/es/iconButton/index.js
var __rest14 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var iconSizes = strings7.SIZE;
var IconButton = class extends import_react29.PureComponent {
render() {
const _a2 = this.props, {
children: originChildren,
iconPosition,
iconSize,
iconStyle,
style: originStyle,
icon,
noHorizontalPadding,
theme,
className,
prefixCls: prefixCls17,
loading
} = _a2, otherProps = __rest14(_a2, ["children", "iconPosition", "iconSize", "iconStyle", "style", "icon", "noHorizontalPadding", "theme", "className", "prefixCls", "loading"]);
const style = Object.assign({}, originStyle);
if (Array.isArray(noHorizontalPadding)) {
noHorizontalPadding.includes("left") && (style.paddingLeft = 0);
noHorizontalPadding.includes("right") && (style.paddingRight = 0);
} else if (noHorizontalPadding === true) {
style.paddingLeft = 0;
style.paddingRight = 0;
} else if (typeof noHorizontalPadding === "string") {
noHorizontalPadding === "left" && (style.paddingLeft = 0);
noHorizontalPadding === "right" && (style.paddingRight = 0);
}
let finalChildren = null;
let IconElem = null;
if (loading && !otherProps.disabled) {
IconElem = /* @__PURE__ */ import_react29.default.createElement(icon_default, null);
} else if (/* @__PURE__ */ import_react29.default.isValidElement(icon)) {
IconElem = icon;
}
const btnTextCls = (0, import_classnames14.default)({
[`${prefixCls17}-content-left`]: iconPosition === "right",
[`${prefixCls17}-content-right`]: iconPosition === "left"
});
const xSemiProp = this.props["x-semi-children-alias"] || "children";
const children = originChildren != null ? /* @__PURE__ */ import_react29.default.createElement("span", {
className: btnTextCls,
"x-semi-prop": xSemiProp
}, originChildren) : null;
if (iconPosition === "left") {
finalChildren = /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, IconElem, children);
} else {
finalChildren = /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, children, IconElem);
}
const iconBtnCls = (0, import_classnames14.default)(className, `${prefixCls17}-with-icon`, {
[`${prefixCls17}-with-icon-only`]: children == null || children === "",
[`${prefixCls17}-loading`]: loading
});
return /* @__PURE__ */ import_react29.default.createElement(Button, Object.assign({}, otherProps, {
className: iconBtnCls,
theme,
style
}), finalChildren);
}
};
IconButton.defaultProps = {
iconPosition: strings6.DEFAULT_ICON_POSITION,
prefixCls: cssClasses6.PREFIX,
loading: false,
noHorizontalPadding: false,
onMouseEnter: import_noop4.default,
onMouseLeave: import_noop4.default
};
IconButton.elementType = "IconButton";
IconButton.propTypes = {
iconStyle: import_prop_types18.default.object,
style: import_prop_types18.default.object,
loading: import_prop_types18.default.bool,
prefixCls: import_prop_types18.default.string,
icon: import_prop_types18.default.oneOfType([import_prop_types18.default.object, import_prop_types18.default.string, import_prop_types18.default.node]),
iconSize: import_prop_types18.default.oneOf(iconSizes),
noHorizontalPadding: import_prop_types18.default.oneOfType([import_prop_types18.default.bool, import_prop_types18.default.string, import_prop_types18.default.array]),
children: import_prop_types18.default.node,
theme: import_prop_types18.default.string,
iconPosition: import_prop_types18.default.oneOf(strings6.iconPositions),
className: import_prop_types18.default.string,
onMouseEnter: import_prop_types18.default.func,
onMouseLeave: import_prop_types18.default.func
};
var iconButton_default = IconButton;
// node_modules/@douyinfe/semi-ui/lib/es/button/index.js
var import_react30 = __toModule(require_react());
var Button2 = class extends import_react30.default.PureComponent {
constructor() {
let props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
super(props);
}
render() {
const props = Object.assign({}, this.props);
const hasIcon = Boolean(props.icon);
const isLoading = Boolean(props.loading);
const isDisabled = Boolean(props.disabled);
if (hasIcon || isLoading && !isDisabled) {
return /* @__PURE__ */ import_react30.default.createElement(iconButton_default, Object.assign({}, props));
} else {
return /* @__PURE__ */ import_react30.default.createElement(Button, Object.assign({}, props));
}
}
};
Button2.__SemiComponentName__ = "Button";
Button2.propTypes = Object.assign(Object.assign({}, Button.propTypes), iconButton_default.propTypes);
Button2.defaultProps = getDefaultPropsFromGlobalConfig(Button2.__SemiComponentName__);
Button2.elementType = "Button";
var button_default = Button2;
// node_modules/@douyinfe/semi-ui/lib/es/card/index.js
var import_isString3 = __toModule(require_isString());
var import_omit5 = __toModule(require_omit());
var import_react36 = __toModule(require_react());
var import_prop_types23 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/card/constants.js
var cssClasses8 = {
PREFIX: `${BASE_CLASS_PREFIX}-card`
};
var strings8 = {
SHADOWS: ["hover", "always"],
TYPE: ["grid"]
};
// node_modules/@douyinfe/semi-ui/lib/es/card/meta.js
var import_react31 = __toModule(require_react());
var import_prop_types19 = __toModule(require_prop_types());
var import_classnames15 = __toModule(require_classnames());
var __rest15 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixcls = cssClasses8.PREFIX;
var Meta = class extends import_react31.PureComponent {
render() {
const _a2 = this.props, {
avatar,
className,
description,
style,
title
} = _a2, others = __rest15(_a2, ["avatar", "className", "description", "style", "title"]);
const metaCls = (0, import_classnames15.default)(`${prefixcls}-meta`, className);
const avatarNode = avatar && /* @__PURE__ */ import_react31.default.createElement("div", {
className: `${prefixcls}-meta-avatar`
}, avatar);
const titleNode = title && /* @__PURE__ */ import_react31.default.createElement("div", {
className: `${prefixcls}-meta-wrapper-title`
}, title);
const descriptionNode = description && /* @__PURE__ */ import_react31.default.createElement("div", {
className: `${prefixcls}-meta-wrapper-description`
}, description);
const wrapper = title || description ? /* @__PURE__ */ import_react31.default.createElement("div", {
className: `${prefixcls}-meta-wrapper`
}, titleNode, descriptionNode) : null;
return /* @__PURE__ */ import_react31.default.createElement("div", Object.assign({}, others, {
className: metaCls,
style
}), avatarNode, wrapper);
}
};
Meta.propTypes = {
avatar: import_prop_types19.default.node,
className: import_prop_types19.default.string,
description: import_prop_types19.default.node,
style: import_prop_types19.default.object,
title: import_prop_types19.default.node
};
var meta_default = Meta;
// node_modules/@douyinfe/semi-ui/lib/es/card/index.js
var import_classnames19 = __toModule(require_classnames());
// node_modules/@douyinfe/semi-ui/lib/es/skeleton/index.js
var import_react33 = __toModule(require_react());
var import_classnames17 = __toModule(require_classnames());
var import_prop_types21 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/skeleton/constants.js
var cssClasses9 = {
PREFIX: `${BASE_CLASS_PREFIX}-skeleton`
};
// node_modules/@douyinfe/semi-ui/lib/es/skeleton/item.js
var import_react32 = __toModule(require_react());
var import_classnames16 = __toModule(require_classnames());
var import_prop_types20 = __toModule(require_prop_types());
var __rest16 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var sizeSet2 = strings5.SIZE;
var shapeSet2 = strings5.SHAPE;
var generator = (type) => (BasicComponent) => (props) => /* @__PURE__ */ import_react32.default.createElement(BasicComponent, Object.assign({
type
}, props));
var Generic = class extends import_react32.PureComponent {
render() {
const _a2 = this.props, {
prefixCls: prefixCls17,
className,
type,
size,
shape
} = _a2, others = __rest16(_a2, ["prefixCls", "className", "type", "size", "shape"]);
const classString = (0, import_classnames16.default)(className, `${prefixCls17}-${type}`, {
[`${prefixCls17}-${type}-${size}`]: type.toUpperCase() === "AVATAR"
}, {
[`${prefixCls17}-${type}-${shape}`]: type.toUpperCase() === "AVATAR"
});
return /* @__PURE__ */ import_react32.default.createElement("div", Object.assign({
className: classString
}, others));
}
};
Generic.propTypes = {
type: import_prop_types20.default.string,
prefixCls: import_prop_types20.default.string,
style: import_prop_types20.default.object,
className: import_prop_types20.default.string,
size: import_prop_types20.default.oneOf(sizeSet2),
shape: import_prop_types20.default.oneOf(shapeSet2)
};
Generic.defaultProps = {
prefixCls: cssClasses9.PREFIX,
size: "medium",
shape: "circle"
};
var Avatar2 = generator("avatar")(Generic);
var Image2 = generator("image")(Generic);
var Title2 = generator("title")(Generic);
var Button3 = generator("button")(Generic);
var Paragraph2 = class extends import_react32.PureComponent {
render() {
const {
prefixCls: prefixCls17,
className,
style,
rows
} = this.props;
const classString = (0, import_classnames16.default)(className, `${prefixCls17}-paragraph`);
return /* @__PURE__ */ import_react32.default.createElement("ul", {
className: classString,
style
}, [...Array(rows)].map((e, i) => /* @__PURE__ */ import_react32.default.createElement("li", {
key: i
})));
}
};
Paragraph2.propTypes = {
rows: import_prop_types20.default.number,
prefixCls: import_prop_types20.default.string,
style: import_prop_types20.default.object,
className: import_prop_types20.default.string
};
Paragraph2.defaultProps = {
prefixCls: cssClasses9.PREFIX,
rows: 4
};
// node_modules/@douyinfe/semi-ui/lib/es/skeleton/index.js
var __rest17 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixCls7 = cssClasses9.PREFIX;
var Skeleton = class extends import_react33.PureComponent {
render() {
const _a2 = this.props, {
placeholder,
active,
children,
className,
loading,
style
} = _a2, others = __rest17(_a2, ["placeholder", "active", "children", "className", "loading", "style"]);
const skCls = (0, import_classnames17.default)(prefixCls7, {
[`${prefixCls7}-active`]: Boolean(active)
}, className);
let content;
if (loading) {
content = /* @__PURE__ */ import_react33.default.createElement("div", Object.assign({
className: skCls,
style
}, others, {
"x-semi-prop": "placeholder"
}), placeholder);
} else {
content = children;
}
return content;
}
};
Skeleton.Avatar = Avatar2;
Skeleton.Title = Title2;
Skeleton.Button = Button3;
Skeleton.Paragraph = Paragraph2;
Skeleton.Image = Image2;
Skeleton.defaultProps = {
loading: true
};
Skeleton.propTypes = {
active: import_prop_types21.default.bool,
placeholder: import_prop_types21.default.node,
style: import_prop_types21.default.object,
className: import_prop_types21.default.string,
loading: import_prop_types21.default.bool,
children: import_prop_types21.default.node
};
var skeleton_default = Skeleton;
// node_modules/@douyinfe/semi-ui/lib/es/space/index.js
var import_isNumber = __toModule(require_isNumber());
var import_isArray = __toModule(require_isArray());
var import_isString2 = __toModule(require_isString());
var import_react35 = __toModule(require_react());
var import_classnames18 = __toModule(require_classnames());
var import_prop_types22 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/space/constants.js
var cssClasses10 = {
PREFIX: `${BASE_CLASS_PREFIX}-space`
};
var strings9 = {
ALIGN_SET: ["start", "end", "center", "baseline"],
SPACING_LOOSE: "loose",
SPACING_MEDIUM: "medium",
SPACING_TIGHT: "tight"
};
// node_modules/@douyinfe/semi-ui/lib/es/space/utils.js
var import_react34 = __toModule(require_react());
var REACT_FRAGMENT_TYPE = "Symbol(react.fragment)";
var flatten = (children) => {
let res = [];
import_react34.default.Children.forEach(children, (child) => {
if (child === void 0 || child === null) {
return;
}
if (Array.isArray(child)) {
res = res.concat(flatten(child));
} else if (/* @__PURE__ */ (0, import_react34.isValidElement)(child) && child.type && child.type.toString() === REACT_FRAGMENT_TYPE && child.props) {
res = res.concat(flatten(child.props.children));
} else {
res.push(child);
}
});
return res;
};
// node_modules/@douyinfe/semi-ui/lib/es/space/index.js
var prefixCls8 = cssClasses10.PREFIX;
var Space = class extends import_react35.PureComponent {
render() {
const {
children = null,
style,
className,
spacing,
wrap,
align,
vertical
} = this.props;
const isWrap = wrap && vertical ? false : wrap;
const realStyle = Object.assign({}, style);
let spacingHorizontalType = "";
let spacingVerticalType = "";
if ((0, import_isString2.default)(spacing)) {
spacingHorizontalType = spacing;
spacingVerticalType = spacing;
} else if ((0, import_isNumber.default)(spacing)) {
realStyle.rowGap = spacing;
realStyle.columnGap = spacing;
} else if ((0, import_isArray.default)(spacing)) {
if ((0, import_isString2.default)(spacing[0])) {
spacingHorizontalType = spacing[0];
} else if ((0, import_isNumber.default)(spacing[0])) {
realStyle.columnGap = `${spacing[0]}px`;
}
if ((0, import_isString2.default)(spacing[1])) {
spacingVerticalType = spacing[1];
} else if ((0, import_isNumber.default)(spacing[1])) {
realStyle.rowGap = `${spacing[1]}px`;
}
}
const classNames5 = (0, import_classnames18.default)(prefixCls8, className, {
[`${prefixCls8}-align-${align}`]: align,
[`${prefixCls8}-vertical`]: vertical,
[`${prefixCls8}-horizontal`]: !vertical,
[`${prefixCls8}-wrap`]: isWrap,
[`${prefixCls8}-tight-horizontal`]: spacingHorizontalType === strings9.SPACING_TIGHT,
[`${prefixCls8}-tight-vertical`]: spacingVerticalType === strings9.SPACING_TIGHT,
[`${prefixCls8}-medium-horizontal`]: spacingHorizontalType === strings9.SPACING_MEDIUM,
[`${prefixCls8}-medium-vertical`]: spacingVerticalType === strings9.SPACING_MEDIUM,
[`${prefixCls8}-loose-horizontal`]: spacingHorizontalType === strings9.SPACING_LOOSE,
[`${prefixCls8}-loose-vertical`]: spacingVerticalType === strings9.SPACING_LOOSE
});
const childrenNodes = flatten(children);
const dataAttributes = getDataAttr(this.props);
return /* @__PURE__ */ import_react35.default.createElement("div", Object.assign({}, dataAttributes, {
className: classNames5,
style: realStyle,
"x-semi-prop": "children"
}), childrenNodes);
}
};
Space.propTypes = {
wrap: import_prop_types22.default.bool,
align: import_prop_types22.default.oneOf(strings9.ALIGN_SET),
vertical: import_prop_types22.default.bool,
spacing: import_prop_types22.default.oneOfType([import_prop_types22.default.string, import_prop_types22.default.number, import_prop_types22.default.array]),
children: import_prop_types22.default.node,
style: import_prop_types22.default.object,
className: import_prop_types22.default.string
};
Space.defaultProps = {
vertical: false,
wrap: false,
spacing: "tight",
align: "center"
};
var space_default = Space;
// node_modules/@douyinfe/semi-ui/lib/es/card/index.js
var __rest18 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixcls2 = cssClasses8.PREFIX;
var Card = class extends import_react36.PureComponent {
constructor() {
super(...arguments);
this.renderHeader = () => {
const {
title,
headerExtraContent,
header,
headerLine,
headerStyle
} = this.props;
const headerCls = (0, import_classnames19.default)(`${prefixcls2}-header`, {
[`${prefixcls2}-header-bordered`]: Boolean(headerLine)
});
const headerWrapperCls = (0, import_classnames19.default)(`${prefixcls2}-header-wrapper`);
const titleCls = (0, import_classnames19.default)(`${prefixcls2}-header-wrapper-title`, {
[`${prefixcls2}-header-wrapper-spacing`]: Boolean(headerExtraContent)
});
if (header || headerExtraContent || title) {
return /* @__PURE__ */ import_react36.default.createElement("div", {
style: headerStyle,
className: headerCls
}, header || /* @__PURE__ */ import_react36.default.createElement("div", {
className: headerWrapperCls
}, headerExtraContent && /* @__PURE__ */ import_react36.default.createElement("div", {
className: `${prefixcls2}-header-wrapper-extra`,
"x-semi-prop": "headerExtraContent"
}, headerExtraContent), title && /* @__PURE__ */ import_react36.default.createElement("div", {
className: titleCls
}, (0, import_isString3.default)(title) ? /* @__PURE__ */ import_react36.default.createElement(typography_default2.Title, {
heading: 6,
ellipsis: {
showTooltip: true,
rows: 1
},
"x-semi-prop": "title"
}, title) : title)));
}
return null;
};
this.renderCover = () => {
const {
cover
} = this.props;
const coverCls = (0, import_classnames19.default)(`${prefixcls2}-cover`);
return cover && /* @__PURE__ */ import_react36.default.createElement("div", {
className: coverCls,
"x-semi-prop": "cover"
}, cover);
};
this.renderBody = () => {
const {
bodyStyle,
children,
actions,
loading
} = this.props;
const bodyCls = (0, import_classnames19.default)(`${prefixcls2}-body`);
const actionsCls = (0, import_classnames19.default)(`${prefixcls2}-body-actions`);
const actionsItemCls = (0, import_classnames19.default)(`${prefixcls2}-body-actions-item`);
const placeholder = /* @__PURE__ */ import_react36.default.createElement("div", null, /* @__PURE__ */ import_react36.default.createElement(skeleton_default.Title, null), /* @__PURE__ */ import_react36.default.createElement("br", null), /* @__PURE__ */ import_react36.default.createElement(skeleton_default.Paragraph, {
rows: 3
}));
return /* @__PURE__ */ import_react36.default.createElement("div", {
style: bodyStyle,
className: bodyCls
}, children && /* @__PURE__ */ import_react36.default.createElement(skeleton_default, {
placeholder,
loading,
active: true
}, children), Array.isArray(actions) && /* @__PURE__ */ import_react36.default.createElement("div", {
className: actionsCls
}, /* @__PURE__ */ import_react36.default.createElement(space_default, {
spacing: 12
}, actions.map((item, idx) => /* @__PURE__ */ import_react36.default.createElement("div", {
key: idx,
className: actionsItemCls,
"x-semi-prop": `actions.${idx}`
}, item)))));
};
this.renderFooter = () => {
const {
footer,
footerLine,
footerStyle
} = this.props;
const footerCls = (0, import_classnames19.default)(`${prefixcls2}-footer`, {
[`${prefixcls2}-footer-bordered`]: footerLine
});
return footer && /* @__PURE__ */ import_react36.default.createElement("div", {
style: footerStyle,
className: footerCls,
"x-semi-prop": "footer"
}, footer);
};
}
render() {
const _a2 = this.props, {
bordered,
shadows,
style,
className
} = _a2, otherProps = __rest18(_a2, ["bordered", "shadows", "style", "className"]);
const others = (0, import_omit5.default)(otherProps, ["actions", "bodyStyle", "cover", "headerExtraContent", "footer", "footerLine", "footerStyle", "header", "headerLine", "headerStyle", "loading", "title"]);
const cardCls = (0, import_classnames19.default)(prefixcls2, className, {
[`${prefixcls2}-bordered`]: bordered,
[`${prefixcls2}-shadows`]: shadows,
[`${prefixcls2}-shadows-${shadows}`]: shadows
});
return /* @__PURE__ */ import_react36.default.createElement("div", Object.assign({}, others, {
"aria-busy": this.props.loading,
className: cardCls,
style
}), this.renderHeader(), this.renderCover(), this.renderBody(), this.renderFooter());
}
};
Card.Meta = meta_default;
Card.propTypes = {
actions: import_prop_types23.default.array,
bodyStyle: import_prop_types23.default.object,
bordered: import_prop_types23.default.bool,
children: import_prop_types23.default.node,
className: import_prop_types23.default.string,
cover: import_prop_types23.default.node,
footer: import_prop_types23.default.node,
footerLine: import_prop_types23.default.bool,
footerStyle: import_prop_types23.default.object,
header: import_prop_types23.default.node,
headerExtraContent: import_prop_types23.default.node,
headerLine: import_prop_types23.default.bool,
headerStyle: import_prop_types23.default.object,
loading: import_prop_types23.default.bool,
shadows: import_prop_types23.default.oneOf(strings8.SHADOWS),
style: import_prop_types23.default.object,
title: import_prop_types23.default.node,
"aria-label": import_prop_types23.default.string
};
Card.defaultProps = {
bordered: true,
footerLine: false,
headerLine: true,
loading: false
};
var card_default = Card;
// node_modules/fast-copy/dist/esm/index.mjs
var toStringFunction = Function.prototype.toString;
var create = Object.create;
var toStringObject = Object.prototype.toString;
var LegacyCache = function() {
function LegacyCache2() {
this._keys = [];
this._values = [];
}
LegacyCache2.prototype.has = function(key) {
return !!~this._keys.indexOf(key);
};
LegacyCache2.prototype.get = function(key) {
return this._values[this._keys.indexOf(key)];
};
LegacyCache2.prototype.set = function(key, value) {
this._keys.push(key);
this._values.push(value);
};
return LegacyCache2;
}();
function createCacheLegacy() {
return new LegacyCache();
}
function createCacheModern() {
return new WeakMap();
}
var createCache = typeof WeakMap !== "undefined" ? createCacheModern : createCacheLegacy;
function getCleanClone(prototype3) {
if (!prototype3) {
return create(null);
}
var Constructor = prototype3.constructor;
if (Constructor === Object) {
return prototype3 === Object.prototype ? {} : create(prototype3);
}
if (Constructor && ~toStringFunction.call(Constructor).indexOf("[native code]")) {
try {
return new Constructor();
} catch (_a2) {
}
}
return create(prototype3);
}
function getRegExpFlagsLegacy(regExp) {
var flags = "";
if (regExp.global) {
flags += "g";
}
if (regExp.ignoreCase) {
flags += "i";
}
if (regExp.multiline) {
flags += "m";
}
if (regExp.unicode) {
flags += "u";
}
if (regExp.sticky) {
flags += "y";
}
return flags;
}
function getRegExpFlagsModern(regExp) {
return regExp.flags;
}
var getRegExpFlags = /test/g.flags === "g" ? getRegExpFlagsModern : getRegExpFlagsLegacy;
function getTagLegacy(value) {
var type = toStringObject.call(value);
return type.substring(8, type.length - 1);
}
function getTagModern(value) {
return value[Symbol.toStringTag] || getTagLegacy(value);
}
var getTag = typeof Symbol !== "undefined" ? getTagModern : getTagLegacy;
var defineProperty = Object.defineProperty;
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var getOwnPropertyNames = Object.getOwnPropertyNames;
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var _a = Object.prototype;
var hasOwnProperty3 = _a.hasOwnProperty;
var propertyIsEnumerable = _a.propertyIsEnumerable;
var SUPPORTS_SYMBOL = typeof getOwnPropertySymbols === "function";
function getStrictPropertiesModern(object) {
return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));
}
var getStrictProperties = SUPPORTS_SYMBOL ? getStrictPropertiesModern : getOwnPropertyNames;
function copyOwnPropertiesStrict(value, clone, state) {
var properties = getStrictProperties(value);
for (var index2 = 0, length_1 = properties.length, property = void 0, descriptor = void 0; index2 < length_1; ++index2) {
property = properties[index2];
if (property === "callee" || property === "caller") {
continue;
}
descriptor = getOwnPropertyDescriptor(value, property);
if (!descriptor) {
clone[property] = state.copier(value[property], state);
continue;
}
if (!descriptor.get && !descriptor.set) {
descriptor.value = state.copier(descriptor.value, state);
}
try {
defineProperty(clone, property, descriptor);
} catch (error) {
clone[property] = descriptor.value;
}
}
return clone;
}
function copyArrayLoose(array, state) {
var clone = new state.Constructor();
state.cache.set(array, clone);
for (var index2 = 0, length_2 = array.length; index2 < length_2; ++index2) {
clone[index2] = state.copier(array[index2], state);
}
return clone;
}
function copyArrayStrict(array, state) {
var clone = new state.Constructor();
state.cache.set(array, clone);
return copyOwnPropertiesStrict(array, clone, state);
}
function copyArrayBuffer(arrayBuffer, _state) {
return arrayBuffer.slice(0);
}
function copyBlob(blob, _state) {
return blob.slice(0, blob.size, blob.type);
}
function copyDataView(dataView, state) {
return new state.Constructor(copyArrayBuffer(dataView.buffer));
}
function copyDate(date, state) {
return new state.Constructor(date.getTime());
}
function copyMapLoose(map, state) {
var clone = new state.Constructor();
state.cache.set(map, clone);
map.forEach(function(value, key) {
clone.set(key, state.copier(value, state));
});
return clone;
}
function copyMapStrict(map, state) {
return copyOwnPropertiesStrict(map, copyMapLoose(map, state), state);
}
function copyObjectLooseLegacy(object, state) {
var clone = getCleanClone(state.prototype);
state.cache.set(object, clone);
for (var key in object) {
if (hasOwnProperty3.call(object, key)) {
clone[key] = state.copier(object[key], state);
}
}
return clone;
}
function copyObjectLooseModern(object, state) {
var clone = getCleanClone(state.prototype);
state.cache.set(object, clone);
for (var key in object) {
if (hasOwnProperty3.call(object, key)) {
clone[key] = state.copier(object[key], state);
}
}
var symbols = getOwnPropertySymbols(object);
for (var index2 = 0, length_3 = symbols.length, symbol = void 0; index2 < length_3; ++index2) {
symbol = symbols[index2];
if (propertyIsEnumerable.call(object, symbol)) {
clone[symbol] = state.copier(object[symbol], state);
}
}
return clone;
}
var copyObjectLoose = SUPPORTS_SYMBOL ? copyObjectLooseModern : copyObjectLooseLegacy;
function copyObjectStrict(object, state) {
var clone = getCleanClone(state.prototype);
state.cache.set(object, clone);
return copyOwnPropertiesStrict(object, clone, state);
}
function copyPrimitiveWrapper(primitiveObject, state) {
return new state.Constructor(primitiveObject.valueOf());
}
function copyRegExp(regExp, state) {
var clone = new state.Constructor(regExp.source, getRegExpFlags(regExp));
clone.lastIndex = regExp.lastIndex;
return clone;
}
function copySelf(value, _state) {
return value;
}
function copySetLoose(set, state) {
var clone = new state.Constructor();
state.cache.set(set, clone);
set.forEach(function(value) {
clone.add(state.copier(value, state));
});
return clone;
}
function copySetStrict(set, state) {
return copyOwnPropertiesStrict(set, copySetLoose(set, state), state);
}
var isArray2 = Array.isArray;
var assign = Object.assign;
var getPrototypeOf2 = Object.getPrototypeOf || function(obj) {
return obj.__proto__;
};
var DEFAULT_LOOSE_OPTIONS = {
array: copyArrayLoose,
arrayBuffer: copyArrayBuffer,
blob: copyBlob,
dataView: copyDataView,
date: copyDate,
error: copySelf,
map: copyMapLoose,
object: copyObjectLoose,
regExp: copyRegExp,
set: copySetLoose
};
var DEFAULT_STRICT_OPTIONS = assign({}, DEFAULT_LOOSE_OPTIONS, {
array: copyArrayStrict,
map: copyMapStrict,
object: copyObjectStrict,
set: copySetStrict
});
function getTagSpecificCopiers(options) {
return {
Arguments: options.object,
Array: options.array,
ArrayBuffer: options.arrayBuffer,
Blob: options.blob,
Boolean: copyPrimitiveWrapper,
DataView: options.dataView,
Date: options.date,
Error: options.error,
Float32Array: options.arrayBuffer,
Float64Array: options.arrayBuffer,
Int8Array: options.arrayBuffer,
Int16Array: options.arrayBuffer,
Int32Array: options.arrayBuffer,
Map: options.map,
Number: copyPrimitiveWrapper,
Object: options.object,
Promise: copySelf,
RegExp: options.regExp,
Set: options.set,
String: copyPrimitiveWrapper,
WeakMap: copySelf,
WeakSet: copySelf,
Uint8Array: options.arrayBuffer,
Uint8ClampedArray: options.arrayBuffer,
Uint16Array: options.arrayBuffer,
Uint32Array: options.arrayBuffer,
Uint64Array: options.arrayBuffer
};
}
function createCopier(options) {
var normalizedOptions = assign({}, DEFAULT_LOOSE_OPTIONS, options);
var tagSpecificCopiers = getTagSpecificCopiers(normalizedOptions);
var array = tagSpecificCopiers.Array, object = tagSpecificCopiers.Object;
function copier(value, state) {
state.prototype = state.Constructor = void 0;
if (!value || typeof value !== "object") {
return value;
}
if (state.cache.has(value)) {
return state.cache.get(value);
}
state.prototype = getPrototypeOf2(value);
state.Constructor = state.prototype && state.prototype.constructor;
if (!state.Constructor || state.Constructor === Object) {
return object(value, state);
}
if (isArray2(value)) {
return array(value, state);
}
var tagSpecificCopier = tagSpecificCopiers[getTag(value)];
if (tagSpecificCopier) {
return tagSpecificCopier(value, state);
}
return typeof value.then === "function" ? value : object(value, state);
}
return function copy2(value) {
return copier(value, {
Constructor: void 0,
cache: createCache(),
copier,
prototype: void 0
});
};
}
function createStrictCopier(options) {
return createCopier(assign({}, DEFAULT_STRICT_OPTIONS, options));
}
var copyStrict = createStrictCopier({});
var index = createCopier({});
// node_modules/@douyinfe/semi-ui/lib/es/empty/index.js
var import_react37 = __toModule(require_react());
var import_classnames20 = __toModule(require_classnames());
// node_modules/@douyinfe/semi-foundation/lib/es/empty/constants.js
var cssClasses11 = {
PREFIX: `${BASE_CLASS_PREFIX}-empty`
};
// node_modules/@douyinfe/semi-ui/lib/es/empty/index.js
var __rest19 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixCls9 = cssClasses11.PREFIX;
var Empty = class extends BaseComponent {
constructor(props) {
super(props);
this.observe = (mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === "attributes" && mutation.attributeName === "theme-mode") {
this.updateMode();
}
}
};
this.updateMode = () => {
const val = this.body.getAttribute("theme-mode");
if (val !== this.state.mode) {
this.setState({
mode: val
});
}
};
this.state = {
mode: null
};
}
componentDidMount() {
if (this.props.darkModeImage) {
this.body = window.document.body;
this.updateMode();
const config = {
attributes: true,
childList: false,
subtree: false
};
this.observer = new MutationObserver(this.observe);
this.observer.observe(this.body, config);
}
}
componentWillUnmount() {
this.observer && this.observer.disconnect();
}
render() {
const _a2 = this.props, {
className,
image,
description,
style,
title,
imageStyle,
children,
layout,
darkModeImage
} = _a2, rest = __rest19(_a2, ["className", "image", "description", "style", "title", "imageStyle", "children", "layout", "darkModeImage"]);
const alt = typeof description === "string" ? description : "empty";
const imgSrc = this.state.mode === "dark" && darkModeImage ? darkModeImage : image;
let imageNode = null;
if (typeof imgSrc === "string") {
imageNode = /* @__PURE__ */ import_react37.default.createElement("img", {
alt,
src: imgSrc
});
} else if (imgSrc && "id" in imgSrc) {
imageNode = /* @__PURE__ */ import_react37.default.createElement("svg", {
"aria-hidden": "true"
}, /* @__PURE__ */ import_react37.default.createElement("use", {
xlinkHref: `#${imgSrc.id}`
}));
} else {
imageNode = imgSrc;
}
const wrapperCls = (0, import_classnames20.default)(className, prefixCls9, {
[`${prefixCls9}-${layout}`]: layout
});
const titleProps = imageNode ? {
heading: 4
} : {
heading: 6,
style: {
fontWeight: 400
}
};
return /* @__PURE__ */ import_react37.default.createElement("div", Object.assign({
className: wrapperCls,
style
}, this.getDataAttr(rest)), /* @__PURE__ */ import_react37.default.createElement("div", {
className: `${prefixCls9}-image`,
style: imageStyle,
"x-semi-prop": "image,darkModeImage"
}, imageNode), /* @__PURE__ */ import_react37.default.createElement("div", {
className: `${prefixCls9}-content`
}, title ? /* @__PURE__ */ import_react37.default.createElement(typography_default2.Title, Object.assign({}, titleProps, {
className: `${prefixCls9}-title`,
"x-semi-prop": "title"
}), title) : null, description ? /* @__PURE__ */ import_react37.default.createElement("div", {
className: `${prefixCls9}-description`,
"x-semi-prop": "description"
}, description) : null, children ? /* @__PURE__ */ import_react37.default.createElement("div", {
className: `${prefixCls9}-footer`,
"x-semi-prop": "children"
}, children) : null));
}
};
Empty.defaultProps = {
layout: "vertical"
};
// node_modules/@douyinfe/semi-ui/lib/es/dropdown/index.js
var import_get9 = __toModule(require_get2());
var import_noop6 = __toModule(require_noop());
var import_react43 = __toModule(require_react());
var import_classnames25 = __toModule(require_classnames());
var import_prop_types28 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/dropdown/constants.js
var cssClasses12 = {
PREFIX: `${BASE_CLASS_PREFIX}-dropdown`,
SELECTED: `${BASE_CLASS_PREFIX}-dropdown-item-selected`,
DISABLED: `${BASE_CLASS_PREFIX}-dropdown-item-disabled`
};
var strings10 = {
POSITION_SET: strings2.POSITION_SET,
TRIGGER_SET: ["hover", "focus", "click", "custom", "contextMenu"],
DEFAULT_LEAVE_DELAY: 100,
ITEM_TYPE: ["primary", "secondary", "tertiary", "warning", "danger"]
};
var numbers3 = {
SPACING: 4,
NESTED_SPACING: 2
};
// node_modules/@douyinfe/semi-foundation/lib/es/dropdown/foundation.js
var DropdownFoundation = class extends foundation_default {
handleVisibleChange(visible) {
this._adapter.setPopVisible(visible);
this._adapter.notifyVisibleChange(visible);
const {
trigger
} = this.getProps();
if (visible && trigger === "click") {
const popupId = this._adapter.getPopupId();
this.setFocusToFirstMenuItem(popupId);
}
}
getMenuItemNodes(id) {
const menuWrapper = document.getElementById(id);
return menuWrapper ? Array.from(menuWrapper.getElementsByTagName("li")).filter((item) => item.ariaDisabled === "false") : null;
}
setFocusToFirstMenuItem(id) {
const menuItemNodes = this.getMenuItemNodes(id);
menuItemNodes && setFocusToFirstItem(menuItemNodes);
}
setFocusToLastMenuItem(id) {
const menuItemNodes = this.getMenuItemNodes(id);
menuItemNodes && setFocusToLastItem(menuItemNodes);
}
handleKeyDown(event) {
var _a2, _b;
const id = (_b = (_a2 = event.target) === null || _a2 === void 0 ? void 0 : _a2.attributes["data-popupid"]) === null || _b === void 0 ? void 0 : _b.value;
const {
visible
} = this._adapter.getStates();
switch (event.key) {
case " ":
case "Enter":
event.target.click();
break;
case "ArrowDown":
this.setFocusToFirstMenuItem(id);
visible && handlePrevent(event);
break;
case "ArrowUp":
this.setFocusToLastMenuItem(id);
visible && handlePrevent(event);
break;
default:
break;
}
}
};
// node_modules/@douyinfe/semi-ui/lib/es/dropdown/dropdownMenu.js
var import_react39 = __toModule(require_react());
var import_prop_types24 = __toModule(require_prop_types());
var import_classnames21 = __toModule(require_classnames());
// node_modules/@douyinfe/semi-foundation/lib/es/dropdown/menuFoundation.js
var DropdownMenuFoundation = class extends foundation_default {
constructor() {
super(...arguments);
this.menuItemNodes = null;
this.firstChars = [];
}
handleEscape(menu) {
const trigger = this._adapter.getContext("trigger");
if (trigger === "custom") {
const menuButton = menu && getMenuButton(document.querySelectorAll(`[data-popupid]`), menu.id);
menuButton.focus();
}
}
setFocusByFirstCharacter(curItem, char) {
const index2 = findIndexByCharacter(this.menuItemNodes, curItem, this.firstChars, char);
if (index2 >= 0) {
setFocusToItem(this.menuItemNodes, this.menuItemNodes[index2]);
}
}
onMenuKeydown(event) {
const menu = getAncestorNodeByRole(event.target, "tooltip");
if (!this.menuItemNodes) {
this.menuItemNodes = [...event.target.parentNode.getElementsByTagName("li")].filter((item) => item.ariaDisabled !== "true");
}
if (this.firstChars.length === 0) {
this.menuItemNodes.forEach((item) => {
var _a2;
this.firstChars.push((_a2 = item.textContent.trim()[0]) === null || _a2 === void 0 ? void 0 : _a2.toLowerCase());
});
}
const curItem = this.menuItemNodes.find((item) => item.tabIndex === 0);
switch (event.key) {
case " ":
case "Enter":
event.target.click();
break;
case "Escape":
this.handleEscape(menu);
break;
case "ArrowUp":
setFocusToPreviousMenuItem(this.menuItemNodes, curItem);
handlePrevent(event);
break;
case "ArrowDown":
setFocusToNextMenuitem(this.menuItemNodes, curItem);
handlePrevent(event);
break;
default:
if (isPrintableCharacter(event.key)) {
this.setFocusByFirstCharacter(curItem, event.key);
}
break;
}
}
};
// node_modules/@douyinfe/semi-ui/lib/es/dropdown/context.js
var import_react38 = __toModule(require_react());
var DropdownContext = /* @__PURE__ */ import_react38.default.createContext({
level: 0
});
var context_default4 = DropdownContext;
// node_modules/@douyinfe/semi-ui/lib/es/dropdown/dropdownMenu.js
var __rest20 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixCls10 = cssClasses12.PREFIX;
var DropdownMenu = class extends BaseComponent {
constructor(props) {
super(props);
this.foundation = new DropdownMenuFoundation(this.adapter);
}
get adapter() {
return Object.assign({}, super.adapter);
}
render() {
const _a2 = this.props, {
children,
className,
style
} = _a2, rest = __rest20(_a2, ["children", "className", "style"]);
return /* @__PURE__ */ import_react39.default.createElement("ul", Object.assign({
role: "menu",
"aria-orientation": "vertical"
}, rest, {
className: (0, import_classnames21.default)(`${prefixCls10}-menu`, className),
style,
onKeyDown: (e) => this.foundation.onMenuKeydown(e)
}), children);
}
};
DropdownMenu.propTypes = {
children: import_prop_types24.default.node,
className: import_prop_types24.default.string,
style: import_prop_types24.default.object
};
DropdownMenu.contextType = context_default4;
var dropdownMenu_default = DropdownMenu;
// node_modules/@douyinfe/semi-ui/lib/es/dropdown/dropdownItem.js
var import_noop5 = __toModule(require_noop());
var import_react40 = __toModule(require_react());
var import_classnames22 = __toModule(require_classnames());
var import_prop_types25 = __toModule(require_prop_types());
var prefixCls11 = cssClasses12.PREFIX;
var DropdownItem = class extends BaseComponent {
render() {
const {
children,
disabled,
className,
forwardRef: forwardRef2,
style,
type,
active,
icon,
onKeyDown,
showTick,
hover
} = this.props;
const {
showTick: contextShowTick
} = this.context;
const realShowTick = contextShowTick !== null && contextShowTick !== void 0 ? contextShowTick : showTick;
const itemclass = (0, import_classnames22.default)(className, {
[`${prefixCls11}-item`]: true,
[`${prefixCls11}-item-disabled`]: disabled,
[`${prefixCls11}-item-hover`]: hover,
[`${prefixCls11}-item-withTick`]: realShowTick,
[`${prefixCls11}-item-${type}`]: type,
[`${prefixCls11}-item-active`]: active
});
const events = {};
if (!disabled) {
["onClick", "onMouseEnter", "onMouseLeave", "onContextMenu"].forEach((eventName) => {
const isInAnotherDropdown = this.context.level !== 1;
if (isInAnotherDropdown && eventName === "onClick") {
events["onMouseDown"] = (e) => {
var _a2, _b;
if (e.button === 0) {
(_b = (_a2 = this.props)[eventName]) === null || _b === void 0 ? void 0 : _b.call(_a2, e);
}
};
} else {
events[eventName] = this.props[eventName];
}
});
}
let tick = null;
switch (true) {
case (realShowTick && active):
tick = /* @__PURE__ */ import_react40.default.createElement(IconTick_default, null);
break;
case (realShowTick && !active):
tick = /* @__PURE__ */ import_react40.default.createElement(IconTick_default, {
style: {
color: "transparent"
}
});
break;
default:
tick = null;
break;
}
let iconContent = null;
if (icon) {
iconContent = /* @__PURE__ */ import_react40.default.createElement("div", {
className: `${prefixCls11}-item-icon`
}, icon);
}
return /* @__PURE__ */ import_react40.default.createElement("li", Object.assign({
role: "menuitem",
tabIndex: -1,
"aria-disabled": disabled
}, events, {
onKeyDown,
ref: (ref) => forwardRef2(ref),
className: itemclass,
style
}, this.getDataAttr(this.props)), tick, iconContent, children);
}
};
DropdownItem.propTypes = {
children: import_prop_types25.default.oneOfType([import_prop_types25.default.string, import_prop_types25.default.node]),
name: import_prop_types25.default.string,
disabled: import_prop_types25.default.bool,
selected: import_prop_types25.default.bool,
onClick: import_prop_types25.default.func,
onMouseEnter: import_prop_types25.default.func,
onMouseLeave: import_prop_types25.default.func,
onContextMenu: import_prop_types25.default.func,
className: import_prop_types25.default.string,
style: import_prop_types25.default.object,
forwardRef: import_prop_types25.default.func,
type: import_prop_types25.default.oneOf(strings10.ITEM_TYPE),
active: import_prop_types25.default.bool,
icon: import_prop_types25.default.node
};
DropdownItem.contextType = context_default4;
DropdownItem.defaultProps = {
disabled: false,
divided: false,
selected: false,
onMouseEnter: import_noop5.default,
onMouseLeave: import_noop5.default,
forwardRef: import_noop5.default
};
DropdownItem.elementType = "Dropdown.Item";
var dropdownItem_default = DropdownItem;
// node_modules/@douyinfe/semi-ui/lib/es/dropdown/dropdownDivider.js
var import_react41 = __toModule(require_react());
var import_classnames23 = __toModule(require_classnames());
var import_prop_types26 = __toModule(require_prop_types());
var prefixCls12 = cssClasses12.PREFIX;
var DropdownDivider = function() {
let props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
const {
style,
className
} = props;
return /* @__PURE__ */ import_react41.default.createElement("div", {
className: (0, import_classnames23.default)(`${prefixCls12}-divider`, className),
style
});
};
DropdownDivider.propTypes = {
style: import_prop_types26.default.object,
className: import_prop_types26.default.string
};
var dropdownDivider_default = DropdownDivider;
// node_modules/@douyinfe/semi-ui/lib/es/dropdown/dropdownTitle.js
var import_react42 = __toModule(require_react());
var import_prop_types27 = __toModule(require_prop_types());
var import_classnames24 = __toModule(require_classnames());
var prefixCls13 = cssClasses12.PREFIX;
var DropdownTitle = class extends import_react42.PureComponent {
render() {
const {
className,
style,
children
} = this.props;
const {
showTick
} = this.context;
const titleCls = (0, import_classnames24.default)({
[`${prefixCls13}-title`]: true,
[`${prefixCls13}-title-withTick`]: showTick
}, className);
return /* @__PURE__ */ import_react42.default.createElement("div", {
className: titleCls,
style
}, children);
}
};
DropdownTitle.propTypes = {
children: import_prop_types27.default.node,
className: import_prop_types27.default.string,
style: import_prop_types27.default.object
};
DropdownTitle.contextType = context_default4;
var dropdownTitle_default = DropdownTitle;
// node_modules/@douyinfe/semi-ui/lib/es/dropdown/index.js
var __rest21 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var positionSet3 = strings10.POSITION_SET;
var triggerSet3 = strings10.TRIGGER_SET;
var Dropdown = class extends BaseComponent {
constructor(props) {
super(props);
this.handleVisibleChange = (visible) => this.foundation.handleVisibleChange(visible);
this.state = {
popVisible: props.visible
};
this.foundation = new DropdownFoundation(this.adapter);
this.tooltipRef = /* @__PURE__ */ import_react43.default.createRef();
}
get adapter() {
return Object.assign(Object.assign({}, super.adapter), {
setPopVisible: (popVisible) => this.setState({
popVisible
}),
notifyVisibleChange: (visible) => {
var _a2, _b;
return (_b = (_a2 = this.props).onVisibleChange) === null || _b === void 0 ? void 0 : _b.call(_a2, visible);
},
getPopupId: () => this.tooltipRef.current.getPopupId()
});
}
renderContent() {
const {
render,
menu,
contentClassName,
style,
showTick,
prefixCls: prefixCls17,
trigger
} = this.props;
const className = (0, import_classnames25.default)(prefixCls17, contentClassName);
const {
level = 0
} = this.context;
const contextValue = {
showTick,
level: level + 1,
trigger
};
let content = null;
if (/* @__PURE__ */ import_react43.default.isValidElement(render)) {
content = render;
} else if (Array.isArray(menu)) {
content = this.renderMenu();
}
return /* @__PURE__ */ import_react43.default.createElement(context_default4.Provider, {
value: contextValue
}, /* @__PURE__ */ import_react43.default.createElement("div", {
className,
style
}, /* @__PURE__ */ import_react43.default.createElement("div", {
className: `${prefixCls17}-content`,
"x-semi-prop": "render"
}, content)));
}
renderMenu() {
const {
menu
} = this.props;
const content = menu.map((m, index2) => {
switch (m.node) {
case "title": {
const {
name,
node
} = m, rest = __rest21(m, ["name", "node"]);
return /* @__PURE__ */ import_react43.default.createElement(Dropdown.Title, Object.assign({}, rest, {
key: node + name + index2
}), name);
}
case "item": {
const {
node,
name
} = m, rest = __rest21(m, ["node", "name"]);
return /* @__PURE__ */ import_react43.default.createElement(Dropdown.Item, Object.assign({}, rest, {
key: node + name + index2
}), name);
}
case "divider": {
return /* @__PURE__ */ import_react43.default.createElement(Dropdown.Divider, {
key: m.node + index2
});
}
default:
return null;
}
});
return /* @__PURE__ */ import_react43.default.createElement(Dropdown.Menu, null, content);
}
renderPopCard() {
const {
render,
contentClassName,
style,
showTick,
prefixCls: prefixCls17
} = this.props;
const className = (0, import_classnames25.default)(prefixCls17, contentClassName);
const {
level = 0
} = this.context;
const contextValue = {
showTick,
level: level + 1
};
return /* @__PURE__ */ import_react43.default.createElement(context_default4.Provider, {
value: contextValue
}, /* @__PURE__ */ import_react43.default.createElement("div", {
className,
style
}, /* @__PURE__ */ import_react43.default.createElement("div", {
className: `${prefixCls17}-content`
}, render)));
}
render() {
const _a2 = this.props, {
children,
position,
trigger,
onVisibleChange,
zIndex,
className,
motion,
margin,
style,
prefixCls: prefixCls17
} = _a2, attr = __rest21(_a2, ["children", "position", "trigger", "onVisibleChange", "zIndex", "className", "motion", "margin", "style", "prefixCls"]);
let {
spacing
} = this.props;
const {
level
} = this.context;
const {
popVisible
} = this.state;
const pop = this.renderContent();
if (level > 0) {
spacing = typeof spacing === "number" ? spacing : numbers3.NESTED_SPACING;
} else if (spacing === null || typeof spacing === "undefined") {
spacing = numbers3.SPACING;
}
return /* @__PURE__ */ import_react43.default.createElement(Tooltip2, Object.assign({
zIndex,
motion,
margin,
content: pop,
className,
prefixCls: prefixCls17,
spacing,
position,
trigger,
onVisibleChange: this.handleVisibleChange,
showArrow: false,
returnFocusOnClose: true,
ref: this.tooltipRef
}, attr), /* @__PURE__ */ import_react43.default.isValidElement(children) ? /* @__PURE__ */ import_react43.default.cloneElement(children, {
className: (0, import_classnames25.default)((0, import_get9.default)(children, "props.className"), {
[`${prefixCls17}-showing`]: popVisible
}),
"aria-haspopup": true,
"aria-expanded": popVisible,
onKeyDown: (e) => {
this.foundation.handleKeyDown(e);
const childrenKeyDown = (0, import_get9.default)(children, "props.onKeyDown");
childrenKeyDown && childrenKeyDown(e);
}
}) : children);
}
};
Dropdown.Menu = dropdownMenu_default;
Dropdown.Item = dropdownItem_default;
Dropdown.Divider = dropdownDivider_default;
Dropdown.Title = dropdownTitle_default;
Dropdown.contextType = context_default4;
Dropdown.propTypes = {
children: import_prop_types28.default.node,
contentClassName: import_prop_types28.default.oneOfType([import_prop_types28.default.string, import_prop_types28.default.array]),
className: import_prop_types28.default.string,
getPopupContainer: import_prop_types28.default.func,
margin: import_prop_types28.default.oneOfType([import_prop_types28.default.number, import_prop_types28.default.object]),
mouseEnterDelay: import_prop_types28.default.number,
mouseLeaveDelay: import_prop_types28.default.number,
menu: import_prop_types28.default.array,
motion: import_prop_types28.default.oneOfType([import_prop_types28.default.bool, import_prop_types28.default.func, import_prop_types28.default.object]),
onVisibleChange: import_prop_types28.default.func,
prefixCls: import_prop_types28.default.string,
position: import_prop_types28.default.oneOf(positionSet3),
rePosKey: import_prop_types28.default.oneOfType([import_prop_types28.default.string, import_prop_types28.default.number]),
render: import_prop_types28.default.node,
spacing: import_prop_types28.default.oneOfType([import_prop_types28.default.number, import_prop_types28.default.object]),
showTick: import_prop_types28.default.bool,
style: import_prop_types28.default.object,
trigger: import_prop_types28.default.oneOf(triggerSet3),
visible: import_prop_types28.default.bool,
zIndex: import_prop_types28.default.number
};
Dropdown.__SemiComponentName__ = "Dropdown";
Dropdown.defaultProps = getDefaultPropsFromGlobalConfig(Dropdown.__SemiComponentName__, {
onVisibleChange: import_noop6.default,
prefixCls: cssClasses12.PREFIX,
zIndex: numbers.DEFAULT_Z_INDEX,
motion: true,
trigger: "hover",
position: "bottom",
mouseLeaveDelay: strings10.DEFAULT_LEAVE_DELAY,
showTick: false,
closeOnEsc: true,
onEscKeyDown: import_noop6.default
});
var dropdown_default = Dropdown;
// node_modules/@douyinfe/semi-ui/lib/es/grid/row.js
var import_react44 = __toModule(require_react());
var import_classnames26 = __toModule(require_classnames());
var import_prop_types29 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/grid/constants.js
var cssClasses13 = {
PREFIX: `${BASE_CLASS_PREFIX}`
};
// node_modules/@douyinfe/semi-ui/lib/es/grid/row.js
var __rest22 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var responsiveArray = ["xxl", "xl", "lg", "md", "sm", "xs"];
var RowContext = /* @__PURE__ */ import_react44.default.createContext(null);
var responsiveMap = {
xs: "(max-width: 575px)",
sm: "(min-width: 576px)",
md: "(min-width: 768px)",
lg: "(min-width: 992px)",
xl: "(min-width: 1200px)",
xxl: "(min-width: 1600px)"
};
var Row = class extends import_react44.default.Component {
constructor() {
super(...arguments);
this.state = {
screens: {
xs: true,
sm: true,
md: true,
lg: true,
xl: true,
xxl: true
}
};
this.unRegisters = [];
}
componentDidMount() {
this.unRegisters = Object.keys(responsiveMap).map((screen) => registerMediaQuery(responsiveMap[screen], {
match: () => {
if (typeof this.props.gutter !== "object") {
return;
}
this.setState((prevState) => ({
screens: Object.assign(Object.assign({}, prevState.screens), {
[screen]: true
})
}));
},
unmatch: () => {
if (typeof this.props.gutter !== "object") {
return;
}
this.setState((prevState) => ({
screens: Object.assign(Object.assign({}, prevState.screens), {
[screen]: false
})
}));
}
}));
}
componentWillUnmount() {
this.unRegisters.forEach((unRegister) => unRegister());
}
getGutter() {
const {
gutter = 0
} = this.props;
const results = [0, 0];
const normalizedGutter = Array.isArray(gutter) ? gutter.slice(0, 2) : [gutter, 0];
normalizedGutter.forEach((g, index2) => {
if (typeof g === "object") {
for (let i = 0; i < responsiveArray.length; i++) {
const breakpoint = responsiveArray[i];
if (this.state.screens[breakpoint] && g[breakpoint] !== void 0) {
results[index2] = g[breakpoint];
break;
}
}
} else {
results[index2] = g || 0;
}
});
return results;
}
render() {
const _a2 = this.props, {
prefixCls: prefixCls17,
type,
justify,
align,
className,
style,
children
} = _a2, others = __rest22(_a2, ["prefixCls", "type", "justify", "align", "className", "style", "children"]);
const gutters = this.getGutter();
const prefix2 = `${prefixCls17}-row`;
const classes = (0, import_classnames26.default)({
[prefix2]: type !== "flex",
[`${prefix2}-${type}`]: type,
[`${prefix2}-${type}-${justify}`]: type && justify,
[`${prefix2}-${type}-${align}`]: type && align
}, className);
const rowStyle = Object.assign(Object.assign(Object.assign({}, gutters[0] > 0 ? {
marginLeft: gutters[0] / -2,
marginRight: gutters[0] / -2
} : {}), gutters[1] > 0 ? {
marginTop: gutters[1] / -2,
marginBottom: gutters[1] / -2
} : {}), style);
const otherProps = Object.assign({}, others);
delete otherProps.gutter;
return /* @__PURE__ */ import_react44.default.createElement(RowContext.Provider, {
value: {
gutters
}
}, /* @__PURE__ */ import_react44.default.createElement("div", Object.assign({}, otherProps, {
className: classes,
style: rowStyle,
"x-semi-prop": "children"
}), children));
}
};
Row.propTypes = {
type: import_prop_types29.default.oneOf(["flex"]),
align: import_prop_types29.default.oneOf(["top", "middle", "bottom"]),
justify: import_prop_types29.default.oneOf(["start", "end", "center", "space-around", "space-between"]),
className: import_prop_types29.default.string,
style: import_prop_types29.default.object,
children: import_prop_types29.default.node,
gutter: import_prop_types29.default.oneOfType([import_prop_types29.default.object, import_prop_types29.default.number, import_prop_types29.default.array]),
prefixCls: import_prop_types29.default.string
};
Row.defaultProps = {
prefixCls: cssClasses13.PREFIX
};
Row.RowContext = {
gutters: import_prop_types29.default.any
};
var row_default = Row;
// node_modules/@douyinfe/semi-ui/lib/es/grid/col.js
var import_react45 = __toModule(require_react());
var import_prop_types30 = __toModule(require_prop_types());
var import_classnames27 = __toModule(require_classnames());
var __rest23 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var objectOrNumber = import_prop_types30.default.oneOfType([import_prop_types30.default.object, import_prop_types30.default.number]);
var Col = class extends import_react45.default.Component {
render() {
const {
props
} = this;
const {
prefixCls: prefixCls17,
span,
order,
offset,
push,
pull,
className,
children
} = props, others = __rest23(props, ["prefixCls", "span", "order", "offset", "push", "pull", "className", "children"]);
let sizeClassObj = {};
const prefix2 = `${prefixCls17}-col`;
["xs", "sm", "md", "lg", "xl", "xxl"].forEach((size) => {
let sizeProps = {};
if (typeof props[size] === "number") {
sizeProps.span = props[size];
} else if (typeof props[size] === "object") {
sizeProps = props[size] || {};
}
delete others[size];
sizeClassObj = Object.assign(Object.assign({}, sizeClassObj), {
[`${prefix2}-${size}-${sizeProps.span}`]: sizeProps.span !== void 0,
[`${prefix2}-${size}-order-${sizeProps.order}`]: sizeProps.order || sizeProps.order === 0,
[`${prefix2}-${size}-offset-${sizeProps.offset}`]: sizeProps.offset || sizeProps.offset === 0,
[`${prefix2}-${size}-push-${sizeProps.push}`]: sizeProps.push || sizeProps.push === 0,
[`${prefix2}-${size}-pull-${sizeProps.pull}`]: sizeProps.pull || sizeProps.pull === 0
});
});
const classes = (0, import_classnames27.default)(prefix2, {
[`${prefix2}-${span}`]: span !== void 0,
[`${prefix2}-order-${order}`]: order,
[`${prefix2}-offset-${offset}`]: offset,
[`${prefix2}-push-${push}`]: push,
[`${prefix2}-pull-${pull}`]: pull
}, className, sizeClassObj);
let {
style
} = others;
let gutters;
try {
gutters = this.context.gutters;
} catch (error) {
throw new Error("please make sure <Col> inside <Row>");
}
style = Object.assign(Object.assign(Object.assign({}, gutters[0] > 0 ? {
paddingLeft: gutters[0] / 2,
paddingRight: gutters[0] / 2
} : {}), gutters[1] > 0 ? {
paddingTop: gutters[1] / 2,
paddingBottom: gutters[1] / 2
} : {}), style);
return /* @__PURE__ */ import_react45.default.createElement("div", Object.assign({}, others, {
style,
className: classes,
"x-semi-prop": "children"
}), children);
}
};
Col.contextType = RowContext;
Col.propTypes = {
span: import_prop_types30.default.number,
order: import_prop_types30.default.number,
offset: import_prop_types30.default.number,
push: import_prop_types30.default.number,
pull: import_prop_types30.default.number,
className: import_prop_types30.default.string,
children: import_prop_types30.default.node,
xs: objectOrNumber,
sm: objectOrNumber,
md: objectOrNumber,
lg: objectOrNumber,
xl: objectOrNumber,
xxl: objectOrNumber,
prefixCls: import_prop_types30.default.string
};
Col.defaultProps = {
prefixCls: cssClasses13.PREFIX
};
var col_default = Col;
// node_modules/@douyinfe/semi-ui/lib/es/layout/index.js
var import_react48 = __toModule(require_react());
var import_classnames29 = __toModule(require_classnames());
var import_prop_types32 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/layout/constants.js
var cssClasses14 = {
PREFIX: `${BASE_CLASS_PREFIX}-layout`
};
var strings11 = {
BREAKPOINT: ["xs", "sm", "md", "lg", "xl", "xxl"]
};
// node_modules/@douyinfe/semi-ui/lib/es/layout/layout-context.js
var import_react46 = __toModule(require_react());
var LayoutContext = /* @__PURE__ */ import_react46.default.createContext({
siderHook: {
addSider: noop2,
removeSider: noop2
}
});
var layout_context_default = LayoutContext;
// node_modules/@douyinfe/semi-ui/lib/es/layout/Sider.js
var import_react47 = __toModule(require_react());
var import_classnames28 = __toModule(require_classnames());
var import_prop_types31 = __toModule(require_prop_types());
var __rest24 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var responsiveMap2 = {
xs: "(max-width: 575px)",
sm: "(min-width: 576px)",
md: "(min-width: 768px)",
lg: "(min-width: 992px)",
xl: "(min-width: 1200px)",
xxl: "(min-width: 1600px)"
};
var generateId = (() => {
let i = 0;
return () => {
i += 1;
return `${cssClasses14.PREFIX}-sider-${i}`;
};
})();
var bpt = strings11.BREAKPOINT;
var Sider = class extends import_react47.default.PureComponent {
constructor(props) {
super(props);
this.unRegisters = [];
this.uniqueId = "";
this.uniqueId = generateId();
}
componentDidMount() {
const {
breakpoint
} = this.props;
const matchBpt = Object.keys(responsiveMap2).filter((item) => breakpoint && breakpoint.indexOf(item) !== -1);
const unRegisters = matchBpt.map((screen) => registerMediaQuery(responsiveMap2[screen], {
match: () => {
this.responsiveHandler(screen, true);
},
unmatch: () => {
this.responsiveHandler(screen, false);
}
}));
this.unRegisters = unRegisters;
if (this.context.siderHook) {
this.context.siderHook.addSider(this.uniqueId);
}
}
componentWillUnmount() {
this.unRegisters.forEach((unRegister) => unRegister());
if (this.context.siderHook) {
this.context.siderHook.removeSider(this.uniqueId);
}
}
responsiveHandler(screen, matches) {
const {
onBreakpoint
} = this.props;
if (onBreakpoint) {
onBreakpoint(screen, matches);
}
}
render() {
const _a2 = this.props, {
prefixCls: prefixCls17,
className,
children,
style
} = _a2, others = __rest24(_a2, ["prefixCls", "className", "children", "style"]);
const classString = (0, import_classnames28.default)(className, {
[`${prefixCls17}-sider`]: true
});
return /* @__PURE__ */ import_react47.default.createElement("aside", Object.assign({
className: classString,
"aria-label": this.props["aria-label"],
style
}, getDataAttr(others)), /* @__PURE__ */ import_react47.default.createElement("div", {
className: `${prefixCls17}-sider-children`
}, children));
}
};
Sider.propTypes = {
prefixCls: import_prop_types31.default.string,
style: import_prop_types31.default.object,
className: import_prop_types31.default.string,
breakpoint: import_prop_types31.default.arrayOf(import_prop_types31.default.oneOf(bpt)),
onBreakpoint: import_prop_types31.default.func,
"aria-label": import_prop_types31.default.string,
role: import_prop_types31.default.string
};
Sider.defaultProps = {
prefixCls: cssClasses14.PREFIX
};
Sider.contextType = layout_context_default;
Sider.elementType = "Layout.Sider";
var Sider_default = Sider;
// node_modules/@douyinfe/semi-ui/lib/es/layout/index.js
var __rest25 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var htmlTag = {
Header: "header",
Footer: "footer",
Content: "main",
Layout: "section"
};
function generator2(type) {
const tagName = htmlTag[type];
const typeName = type.toLowerCase();
return (BasicComponent) => class Adapter extends import_react48.default.PureComponent {
render() {
return /* @__PURE__ */ import_react48.default.createElement(BasicComponent, Object.assign({
role: this.props.role,
"aria-label": this.props["aria-label"],
type: typeName,
tagName
}, this.props));
}
};
}
var Basic = class extends import_react48.default.PureComponent {
render() {
const _a2 = this.props, {
prefixCls: prefixCls17,
type,
className,
children,
tagName
} = _a2, others = __rest25(_a2, ["prefixCls", "type", "className", "children", "tagName"]);
const classString = (0, import_classnames29.default)(className, `${prefixCls17}-${type}`);
return /* @__PURE__ */ import_react48.default.createElement(tagName, Object.assign({
className: classString
}, others), children);
}
};
Basic.propTypes = {
prefixCls: import_prop_types32.default.string,
style: import_prop_types32.default.object,
className: import_prop_types32.default.string
};
Basic.defaultProps = {
prefixCls: cssClasses14.PREFIX
};
var Header = generator2("Header")(Basic);
var Footer = generator2("Footer")(Basic);
var Content = generator2("Content")(Basic);
var Layout = class extends import_react48.default.Component {
constructor(props) {
super(props);
this.state = {
siders: []
};
}
getSiderHook() {
return {
addSider: (id) => {
this.setState((state) => ({
siders: [...state.siders, id]
}));
},
removeSider: (id) => {
this.setState((state) => ({
siders: state.siders.filter((curr) => curr !== id)
}));
}
};
}
render() {
const _a2 = this.props, {
prefixCls: prefixCls17,
className,
children,
hasSider,
tagName
} = _a2, others = __rest25(_a2, ["prefixCls", "className", "children", "hasSider", "tagName"]);
const {
siders
} = this.state;
const classString = (0, import_classnames29.default)(className, prefixCls17, {
[`${prefixCls17}-has-sider`]: typeof hasSider === "boolean" && hasSider || siders.length > 0 || import_react48.default.Children.toArray(children).some((child) => {
return /* @__PURE__ */ import_react48.default.isValidElement(child) && child.type && child.type.elementType === "Layout.Sider";
})
});
const Tag = tagName;
return /* @__PURE__ */ import_react48.default.createElement(layout_context_default.Provider, {
value: {
siderHook: this.getSiderHook()
}
}, /* @__PURE__ */ import_react48.default.createElement(Tag, Object.assign({
className: classString
}, others), children));
}
};
Layout.propTypes = {
prefixCls: import_prop_types32.default.string,
style: import_prop_types32.default.object,
className: import_prop_types32.default.string
};
Layout.defaultProps = {
prefixCls: cssClasses14.PREFIX,
tagName: "section"
};
Layout.Header = Header;
Layout.Footer = Footer;
Layout.Content = Content;
Layout.Sider = Sider_default;
// node_modules/@douyinfe/semi-ui/lib/es/list/index.js
var import_noop8 = __toModule(require_noop());
var import_react51 = __toModule(require_react());
var import_classnames31 = __toModule(require_classnames());
var import_prop_types34 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/list/constants.js
var cssClasses15 = {
PREFIX: `${BASE_CLASS_PREFIX}-list`
};
var strings12 = {
SIZE: ["large", "small", "default"],
LAYOUT: ["vertical", "horizontal"],
ALIGN: ["flex-start", "flex-end", "center", "baseline", "stretch"]
};
// node_modules/@douyinfe/semi-ui/lib/es/list/item.js
var import_noop7 = __toModule(require_noop());
var import_react50 = __toModule(require_react());
var import_classnames30 = __toModule(require_classnames());
var import_prop_types33 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-ui/lib/es/list/list-context.js
var import_react49 = __toModule(require_react());
var ListContext = /* @__PURE__ */ import_react49.default.createContext(null);
var list_context_default = ListContext;
// node_modules/@douyinfe/semi-ui/lib/es/list/item.js
var __rest26 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixCls14 = cssClasses15.PREFIX;
var ListItem = class extends import_react50.PureComponent {
wrapWithGrid(content) {
const {
grid
} = this.context;
const {
gutter,
justify,
type,
align
} = grid, rest = __rest26(grid, ["gutter", "justify", "type", "align"]);
return /* @__PURE__ */ import_react50.default.createElement(col_default, Object.assign({}, rest), content);
}
render() {
const _a2 = this.props, {
header,
main,
className,
style,
extra,
children,
align,
onClick,
onRightClick,
onMouseEnter,
onMouseLeave
} = _a2, rest = __rest26(_a2, ["header", "main", "className", "style", "extra", "children", "align", "onClick", "onRightClick", "onMouseEnter", "onMouseLeave"]);
const {
onRightClick: contextOnRightClick,
onClick: contextOnClick,
grid: contextGrid
} = this.context;
const handleContextMenu = onRightClick ? onRightClick : contextOnRightClick;
const handleClick = onClick ? onClick : contextOnClick;
const itemCls = (0, import_classnames30.default)(`${prefixCls14}-item`, className);
const bodyCls = (0, import_classnames30.default)(`${prefixCls14}-item-body`, {
[`${prefixCls14}-item-body-${align}`]: align
});
let body;
if (header || main) {
body = /* @__PURE__ */ import_react50.default.createElement("div", {
className: bodyCls
}, header ? /* @__PURE__ */ import_react50.default.createElement("div", {
className: `${prefixCls14}-item-body-header`
}, header) : null, main ? /* @__PURE__ */ import_react50.default.createElement("div", {
className: `${prefixCls14}-item-body-main`
}, main) : null);
}
let content = /* @__PURE__ */ import_react50.default.createElement("li", Object.assign({
className: itemCls,
style,
onClick: handleClick,
onContextMenu: handleContextMenu,
onMouseEnter,
onMouseLeave
}, getDataAttr(rest)), body ? body : null, children, extra ? /* @__PURE__ */ import_react50.default.createElement("div", {
className: `${prefixCls14}-item-extra`
}, extra) : null);
if (this.context && contextGrid) {
content = this.wrapWithGrid(content);
}
return content;
}
};
ListItem.contextType = list_context_default;
ListItem.propTypes = {
extra: import_prop_types33.default.node,
header: import_prop_types33.default.node,
main: import_prop_types33.default.node,
align: import_prop_types33.default.oneOf(strings12.ALIGN),
className: import_prop_types33.default.string,
children: import_prop_types33.default.node,
style: import_prop_types33.default.object,
onClick: import_prop_types33.default.func,
onRightClick: import_prop_types33.default.func,
onMouseEnter: import_prop_types33.default.func,
onMouseLeave: import_prop_types33.default.func
};
ListItem.defaultProps = {
align: "flex-start",
onMouseEnter: import_noop7.default,
onMouseLeave: import_noop7.default
};
// node_modules/@douyinfe/semi-ui/lib/es/list/index.js
var __rest27 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var prefixCls15 = cssClasses15.PREFIX;
var List = class extends BaseComponent {
constructor() {
super(...arguments);
this.renderEmpty = () => {
const {
emptyContent
} = this.props;
if (emptyContent) {
return /* @__PURE__ */ import_react51.default.createElement("div", {
className: `${cssClasses15.PREFIX}-empty`,
"x-semi-prop": "emptyContent"
}, emptyContent);
} else {
return /* @__PURE__ */ import_react51.default.createElement(LocaleConsumer, {
componentName: "List"
}, (locale2) => /* @__PURE__ */ import_react51.default.createElement("div", {
className: `${cssClasses15.PREFIX}-empty`
}, locale2.emptyText));
}
};
}
wrapChildren(childrenList, children) {
const {
grid
} = this.props;
if (grid) {
const rowProps = {};
["align", "gutter", "justify", "type"].forEach((key) => {
if (key in grid) {
rowProps[key] = grid[key];
}
});
return /* @__PURE__ */ import_react51.default.createElement(row_default, Object.assign({
type: "flex"
}, rowProps), childrenList ? childrenList : null, children);
}
return /* @__PURE__ */ import_react51.default.createElement("ul", {
className: `${prefixCls15}-items`
}, childrenList ? childrenList : null, children);
}
render() {
const _a2 = this.props, {
style,
className,
header,
loading,
onRightClick,
onClick,
footer,
layout,
grid,
size,
split,
loadMore,
bordered,
dataSource,
renderItem,
children
} = _a2, rest = __rest27(_a2, ["style", "className", "header", "loading", "onRightClick", "onClick", "footer", "layout", "grid", "size", "split", "loadMore", "bordered", "dataSource", "renderItem", "children"]);
const wrapperCls = (0, import_classnames31.default)(prefixCls15, className, {
[`${prefixCls15}-flex`]: layout === "horizontal",
[`${prefixCls15}-${size}`]: size,
[`${prefixCls15}-grid`]: grid,
[`${prefixCls15}-split`]: split,
[`${prefixCls15}-bordered`]: bordered
});
let childrenList;
if (dataSource && dataSource.length) {
childrenList = [];
const items = renderItem ? dataSource.map((item, index2) => renderItem(item, index2)) : [];
import_react51.default.Children.forEach(items, (child, index2) => {
const itemKey = child.key || `list-item-${index2}`;
childrenList.push(/* @__PURE__ */ import_react51.default.cloneElement(child, {
key: itemKey
}));
});
} else if (!children) {
childrenList = this.renderEmpty();
}
return /* @__PURE__ */ import_react51.default.createElement("div", Object.assign({
className: wrapperCls,
style
}, this.getDataAttr(rest)), header ? /* @__PURE__ */ import_react51.default.createElement("div", {
className: `${cssClasses15.PREFIX}-header`,
"x-semi-prop": "header"
}, header) : null, /* @__PURE__ */ import_react51.default.createElement(list_context_default.Provider, {
value: {
grid,
onRightClick,
onClick
}
}, /* @__PURE__ */ import_react51.default.createElement(spin_default, {
spinning: loading,
size: "large"
}, this.wrapChildren(childrenList, children))), footer ? /* @__PURE__ */ import_react51.default.createElement("div", {
className: `${cssClasses15.PREFIX}-footer`,
"x-semi-prop": "footer"
}, footer) : null, loadMore ? loadMore : null);
}
};
List.Item = ListItem;
List.propTypes = {
style: import_prop_types34.default.object,
className: import_prop_types34.default.string,
bordered: import_prop_types34.default.bool,
footer: import_prop_types34.default.node,
header: import_prop_types34.default.node,
layout: import_prop_types34.default.oneOf(strings12.LAYOUT),
size: import_prop_types34.default.oneOf(strings12.SIZE),
split: import_prop_types34.default.bool,
emptyContent: import_prop_types34.default.node,
dataSource: import_prop_types34.default.array,
renderItem: import_prop_types34.default.func,
grid: import_prop_types34.default.object,
loading: import_prop_types34.default.bool,
loadMore: import_prop_types34.default.node,
onRightClick: import_prop_types34.default.func,
onClick: import_prop_types34.default.func
};
List.defaultProps = {
bordered: false,
split: true,
loading: false,
layout: "vertical",
size: "default",
onRightClick: import_noop8.default,
onClick: import_noop8.default
};
var list_default = List;
// node_modules/@douyinfe/semi-ui/lib/es/overflowList/index.js
var import_get11 = __toModule(require_get2());
var import_isFunction4 = __toModule(require_isFunction());
var import_isEqual4 = __toModule(require_isEqual());
var import_react53 = __toModule(require_react());
var import_classnames32 = __toModule(require_classnames());
var import_prop_types36 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/overflowList/constants.js
var cssClasses16 = {
PREFIX: BASE_CLASS_PREFIX + "-overflow-list"
};
var MODE_MAP = {
COLLAPSE: "collapse",
SCROLL: "scroll"
};
var BOUNDARY_MAP = {
START: "start",
END: "end"
};
var OVERFLOW_DIR = {
NONE: 0,
GROW: 1,
SHRINK: 2
};
var strings13 = {
BOUNDARY_SET: Object.values(BOUNDARY_MAP),
POSITION_SET: ["vertical", "horizontal"],
MODE_SET: Object.values(MODE_MAP),
MODE_MAP,
BOUNDARY_MAP,
OVERFLOW_DIR
};
var numbers4 = {
MINIMUM_HTML_ELEMENT_WIDTH: 4
};
// node_modules/@douyinfe/semi-ui/lib/es/overflowList/intersectionObserver.js
var import_isEmpty3 = __toModule(require_isEmpty());
var import_isEqual3 = __toModule(require_isEqual());
var import_react52 = __toModule(require_react());
var import_prop_types35 = __toModule(require_prop_types());
var ReactIntersectionObserver = class extends import_react52.default.PureComponent {
componentDidMount() {
const {
items
} = this.props;
this.cachedKeys = Object.keys(items);
const {
root,
threshold,
rootMargin,
option,
onIntersect
} = this.props;
this.observer = new IntersectionObserver(onIntersect, Object.assign({
root,
threshold,
rootMargin
}, option));
this.observeElement();
}
componentDidUpdate() {
const {
items
} = this.props;
const itemKeys = Object.keys(items);
if (!(0, import_isEqual3.default)(this.cachedKeys, itemKeys)) {
this.observeElement(true);
this.cachedKeys = itemKeys;
}
}
componentWillUnmount() {
if (this.observer) {
this.observer.disconnect();
this.observer = null;
}
}
observeElement() {
let force = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
const {
items
} = this.props;
if ((0, import_isEmpty3.default)(items)) {
this.observer.disconnect();
return;
}
if (force) {
this.observer.disconnect();
}
Object.keys(items).forEach((key) => {
const node = items[key];
if (!(node && isElement(node))) {
return;
}
this.observer.observe(node);
});
}
render() {
const {
children
} = this.props;
return children;
}
};
ReactIntersectionObserver.propTypes = {
onIntersect: import_prop_types35.default.func,
option: import_prop_types35.default.object,
root: import_prop_types35.default.any,
threshold: import_prop_types35.default.number,
rootMargin: import_prop_types35.default.string,
items: import_prop_types35.default.object
};
ReactIntersectionObserver.defaultProps = {
onIntersect: () => void 0,
threshold: 0.75,
rootMargin: "0px",
option: {},
items: {}
};
// node_modules/@douyinfe/semi-foundation/lib/es/overflowList/foundation.js
var import_get10 = __toModule(require_get2());
var Boundary = strings13.BOUNDARY_MAP;
var OverflowDirection = strings13.OVERFLOW_DIR;
var OverflowListFoundation = class extends foundation_default {
constructor(adapter) {
super(Object.assign({}, adapter));
this.previousY = void 0;
this.isScrollMode = () => {
const {
renderMode
} = this.getProps();
return renderMode === "scroll";
};
this.getReversedItems = () => {
const {
items
} = this.getProps();
return index(items).reverse();
};
}
getOverflowItem() {
const {
items
} = this.getProps();
const {
visibleState,
overflow
} = this.getStates();
if (!this.isScrollMode()) {
return overflow;
}
const visibleStateArr = items.map((_ref) => {
let {
key
} = _ref;
return Boolean(visibleState.get(key));
});
const visibleStart = visibleStateArr.indexOf(true);
const visibleEnd = visibleStateArr.lastIndexOf(true);
const overflowList = [];
overflowList[0] = visibleStart >= 0 ? items.slice(0, visibleStart) : [];
overflowList[1] = visibleEnd >= 0 ? items.slice(visibleEnd + 1, items.length) : items.slice();
return overflowList;
}
handleIntersect(entries) {
const visibleState = index(this.getState("visibleState"));
const res = {};
entries.forEach((entry) => {
const itemKey = (0, import_get10.default)(entry, "target.dataset.scrollkey");
const visible = entry.isIntersecting;
res[itemKey] = entry;
visibleState.set(itemKey, visible);
});
let someItemVisible = false;
for (const value of visibleState.values()) {
if (value) {
someItemVisible = true;
break;
}
}
const wholeListVisible = someItemVisible;
const [entry1] = entries;
const currentY = entry1.boundingClientRect.y;
if (!wholeListVisible && this.previousY !== void 0 && currentY !== this.previousY) {
this.previousY = currentY;
return;
}
this.previousY = currentY;
this._adapter.updateVisibleState(visibleState);
this._adapter.notifyIntersect(res);
}
handleCollapseOverflow() {
const {
minVisibleItems,
collapseFrom
} = this.getProps();
const {
overflowWidth,
containerWidth,
pivot: statePivot,
overflowStatus
} = this.getStates();
const {
items,
onOverflow
} = this.getProps();
let itemWidths = overflowWidth, _pivot = 0;
let overflowed = false;
for (const size of this._adapter.getItemSizeMap().values()) {
itemWidths += size;
if (itemWidths > containerWidth) {
overflowed = true;
break;
}
if (_pivot === items.length - 1) {
this._adapter.updateStates({
overflowStatus: "normal",
pivot: items.length - 1,
visible: items,
overflow: []
});
break;
}
_pivot++;
}
if (overflowed) {
const pivot = Math.max(minVisibleItems, _pivot);
const isCollapseFromStart = collapseFrom === Boundary.START;
const visible = isCollapseFromStart ? this.getReversedItems().slice(0, pivot).reverse() : items.slice(0, pivot);
const overflow = isCollapseFromStart ? this.getReversedItems().slice(pivot).reverse() : items.slice(pivot);
this._adapter.updateStates({
overflowStatus: "overflowed",
pivot,
visible,
overflow
});
if (statePivot !== pivot) {
onOverflow(overflow);
}
return;
}
}
};
var foundation_default3 = OverflowListFoundation;
// node_modules/@douyinfe/semi-ui/lib/es/overflowList/index.js
var prefixCls16 = cssClasses16.PREFIX;
var Boundary2 = strings13.BOUNDARY_MAP;
var OverflowDirection2 = strings13.OVERFLOW_DIR;
var RenderMode = strings13.MODE_MAP;
var OverflowList = class extends BaseComponent {
constructor(props) {
var _this;
super(props);
_this = this;
this.scroller = null;
this.spacer = null;
this.isScrollMode = () => {
const {
renderMode
} = this.props;
return renderMode === RenderMode.SCROLL;
};
this.resize = function() {
let entries = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
var _a2;
const containerWidth = (_a2 = entries[0]) === null || _a2 === void 0 ? void 0 : _a2.target.clientWidth;
_this.setState({
containerWidth,
overflowStatus: "calculating"
});
};
this.reintersect = (entries) => {
this.foundation.handleIntersect(entries);
};
this.mergeRef = (ref, node, key) => {
this.itemRefs[key] = node;
if (typeof ref === "function") {
ref(node);
} else if (typeof ref === "object" && ref && "current" in ref) {
ref.current = node;
}
};
this.renderOverflow = () => {
const overflow = this.foundation.getOverflowItem();
return this.props.overflowRenderer(overflow);
};
this.getItemKey = (item, defaultKey) => {
const {
itemKey
} = this.props;
if ((0, import_isFunction4.default)(itemKey)) {
return itemKey(item);
}
return (0, import_get11.default)(item, itemKey || "key", defaultKey);
};
this.renderItemList = () => {
const {
className,
wrapperClassName,
wrapperStyle,
style,
visibleItemRenderer,
renderMode,
collapseFrom
} = this.props;
const {
visible,
overflowStatus
} = this.state;
let overflow = this.renderOverflow();
if (!this.isScrollMode()) {
if (Array.isArray(overflow)) {
overflow = /* @__PURE__ */ import_react53.default.createElement(import_react53.default.Fragment, null, overflow);
}
if (/* @__PURE__ */ import_react53.default.isValidElement(overflow)) {
const child = /* @__PURE__ */ import_react53.default.cloneElement(overflow);
overflow = /* @__PURE__ */ import_react53.default.createElement(ReactResizeObserver, {
onResize: (_ref) => {
let [entry] = _ref;
this.setState({
overflowWidth: entry.target.clientWidth,
overflowStatus: "calculating"
});
}
}, /* @__PURE__ */ import_react53.default.createElement("div", {
className: `${prefixCls16}-overflow`
}, child));
}
}
const inner = renderMode === RenderMode.SCROLL ? (() => {
const list3 = [/* @__PURE__ */ import_react53.default.createElement("div", {
className: (0, import_classnames32.default)(wrapperClassName, `${prefixCls16}-scroll-wrapper`),
ref: (ref) => {
this.scroller = ref;
},
style: Object.assign({}, wrapperStyle),
key: `${prefixCls16}-scroll-wrapper`
}, visible.map(visibleItemRenderer).map((item) => {
const {
forwardRef: forwardRef2,
key
} = item;
return /* @__PURE__ */ import_react53.default.cloneElement(item, {
ref: (node) => this.mergeRef(forwardRef2, node, key),
"data-scrollkey": `${key}`,
key
});
}))];
if (this.props.overflowRenderDirection === "both") {
list3.unshift(overflow[0]);
list3.push(overflow[1]);
} else if (this.props.overflowRenderDirection === "start") {
list3.unshift(overflow[1]);
list3.unshift(overflow[0]);
} else {
list3.push(overflow[0]);
list3.push(overflow[1]);
}
return list3;
})() : [collapseFrom === Boundary2.START ? overflow : null, visible.map((item, idx) => {
const {
key
} = item;
const element = visibleItemRenderer(item, idx);
const child = /* @__PURE__ */ import_react53.default.cloneElement(element);
return /* @__PURE__ */ import_react53.default.createElement(ReactResizeObserver, {
key: key !== null && key !== void 0 ? key : idx,
onResize: (_ref2) => {
let [entry] = _ref2;
return this.onItemResize(entry, item, idx);
}
}, /* @__PURE__ */ import_react53.default.createElement("div", {
key: key !== null && key !== void 0 ? key : idx,
className: `${prefixCls16}-item`
}, child));
}), collapseFrom === Boundary2.END ? overflow : null];
const list2 = /* @__PURE__ */ import_react53.default.createElement("div", {
className: (0, import_classnames32.default)(`${prefixCls16}`, className),
style: Object.assign(Object.assign({}, style), renderMode === RenderMode.COLLAPSE ? {
maxWidth: "100%",
visibility: overflowStatus === "calculating" ? "hidden" : "visible"
} : null)
}, ...inner);
return list2;
};
this.onItemResize = (entry, item, idx) => {
const key = this.getItemKey(item, idx);
const width = this.itemSizeMap.get(key);
if (!width) {
this.itemSizeMap.set(key, entry.target.clientWidth);
} else if (width !== entry.target.clientWidth) {
this.itemSizeMap.set(key, entry.target.clientWidth);
this.setState({
overflowStatus: "calculating"
});
}
const {
maxCount
} = this.state;
if (this.itemSizeMap.size === maxCount) {
this.setState({
overflowStatus: "calculating"
});
}
};
this.state = {
direction: OverflowDirection2.GROW,
lastOverflowCount: 0,
overflow: [],
visible: [],
containerWidth: 0,
visibleState: new Map(),
itemSizeMap: new Map(),
overflowStatus: "calculating",
pivot: -1,
overflowWidth: 0,
maxCount: 0
};
this.foundation = new foundation_default3(this.adapter);
this.previousWidths = new Map();
this.itemRefs = {};
this.itemSizeMap = new Map();
}
static getDerivedStateFromProps(props, prevState) {
const {
prevProps
} = prevState;
const newState = {};
newState.prevProps = props;
const needUpdate = (name) => {
return !prevProps && name in props || prevProps && !(0, import_isEqual4.default)(prevProps[name], props[name]);
};
if (needUpdate("items") || needUpdate("style")) {
newState.direction = OverflowDirection2.GROW;
newState.lastOverflowCount = 0;
newState.maxCount = 0;
if (props.renderMode === RenderMode.SCROLL) {
newState.visible = props.items;
newState.overflow = [];
} else {
let maxCount = props.items.length;
if (Math.floor(prevState.containerWidth / numbers4.MINIMUM_HTML_ELEMENT_WIDTH) !== 0) {
maxCount = Math.min(maxCount, Math.floor(prevState.containerWidth / numbers4.MINIMUM_HTML_ELEMENT_WIDTH));
}
const isCollapseFromStart = props.collapseFrom === Boundary2.START;
const visible = isCollapseFromStart ? index(props.items).reverse().slice(0, maxCount) : props.items.slice(0, maxCount);
const overflow = isCollapseFromStart ? index(props.items).reverse().slice(maxCount) : props.items.slice(maxCount);
newState.visible = visible;
newState.overflow = overflow;
newState.maxCount = maxCount;
}
newState.pivot = -1;
newState.overflowStatus = "calculating";
}
return newState;
}
get adapter() {
return Object.assign(Object.assign({}, super.adapter), {
updateVisibleState: (visibleState) => {
this.setState({
visibleState
}, () => {
var _a2, _b;
(_b = (_a2 = this.props).onVisibleStateChange) === null || _b === void 0 ? void 0 : _b.call(_a2, visibleState);
});
},
updateStates: (states) => {
this.setState(Object.assign({}, states));
},
notifyIntersect: (res) => {
this.props.onIntersect && this.props.onIntersect(res);
},
getItemSizeMap: () => this.itemSizeMap
});
}
componentDidUpdate(prevProps, prevState) {
const prevItemsKeys = prevProps.items.map((item) => item.key);
const nowItemsKeys = this.props.items.map((item) => item.key);
if (!(0, import_isEqual4.default)(prevItemsKeys, nowItemsKeys)) {
this.itemRefs = {};
this.setState({
visibleState: new Map()
});
}
const {
overflow,
containerWidth,
visible,
overflowStatus
} = this.state;
if (this.isScrollMode() || overflowStatus !== "calculating") {
return;
}
this.foundation.handleCollapseOverflow();
}
render() {
const list2 = this.renderItemList();
const {
renderMode
} = this.props;
if (renderMode === RenderMode.SCROLL) {
return /* @__PURE__ */ import_react53.default.createElement(ReactIntersectionObserver, {
onIntersect: this.reintersect,
root: this.scroller,
threshold: this.props.threshold,
items: this.itemRefs
}, list2);
}
return /* @__PURE__ */ import_react53.default.createElement(ReactResizeObserver, {
onResize: this.resize
}, list2);
}
};
OverflowList.__SemiComponentName__ = "OverflowList";
OverflowList.defaultProps = getDefaultPropsFromGlobalConfig(OverflowList.__SemiComponentName__, {
collapseFrom: "end",
minVisibleItems: 0,
overflowRenderer: () => null,
renderMode: "collapse",
threshold: 0.75,
visibleItemRenderer: () => null,
onOverflow: () => null,
overflowRenderDirection: "both"
});
OverflowList.propTypes = {
className: import_prop_types36.default.string,
collapseFrom: import_prop_types36.default.oneOf(strings13.BOUNDARY_SET),
direction: import_prop_types36.default.oneOf(strings13.POSITION_SET),
items: import_prop_types36.default.array,
minVisibleItems: import_prop_types36.default.number,
onIntersect: import_prop_types36.default.func,
onOverflow: import_prop_types36.default.func,
overflowRenderer: import_prop_types36.default.func,
renderMode: import_prop_types36.default.oneOf(strings13.MODE_SET),
style: import_prop_types36.default.object,
threshold: import_prop_types36.default.number,
visibleItemRenderer: import_prop_types36.default.func,
wrapperClassName: import_prop_types36.default.string,
wrapperStyle: import_prop_types36.default.object,
collapseMask: import_prop_types36.default.object,
overflowRenderDirection: import_prop_types36.default.string
};
var overflowList_default = OverflowList;
// node_modules/@douyinfe/semi-ui/lib/es/tabs/index.js
var import_pick2 = __toModule(require_pick());
var import_isEqual5 = __toModule(require_isEqual());
var import_react58 = __toModule(require_react());
var import_classnames36 = __toModule(require_classnames());
var import_prop_types39 = __toModule(require_prop_types());
// node_modules/@douyinfe/semi-foundation/lib/es/tabs/constants.js
var cssClasses17 = {
TABS: `${BASE_CLASS_PREFIX}-tabs`,
TABS_BAR: `${BASE_CLASS_PREFIX}-tabs-bar`,
TABS_BAR_LINE: `${BASE_CLASS_PREFIX}-tabs-bar-line`,
TABS_BAR_CARD: `${BASE_CLASS_PREFIX}-tabs-bar-card`,
TABS_BAR_BUTTON: `${BASE_CLASS_PREFIX}-tabs-bar-button`,
TABS_BAR_SLASH: `${BASE_CLASS_PREFIX}-tabs-bar-slash`,
TABS_BAR_EXTRA: `${BASE_CLASS_PREFIX}-tabs-bar-extra`,
TABS_TAB: `${BASE_CLASS_PREFIX}-tabs-tab`,
TABS_TAB_ACTIVE: `${BASE_CLASS_PREFIX}-tabs-tab-active`,
TABS_TAB_DISABLED: `${BASE_CLASS_PREFIX}-tabs-tab-disabled`,
TABS_CONTENT: `${BASE_CLASS_PREFIX}-tabs-content`,
TABS_CONTENT_ANIMATED: `${BASE_CLASS_PREFIX}-tabs-content-animated`,
TABS_CONTENT_NO_ANIMATED: `${BASE_CLASS_PREFIX}-tabs-content-no-animated`,
TABS_PANE: `${BASE_CLASS_PREFIX}-tabs-pane`,
TABS_PANE_INACTIVE: `${BASE_CLASS_PREFIX}-tabs-pane-inactive`,
TABS_PANE_ACTIVE: `${BASE_CLASS_PREFIX}-tabs-pane-active`,
TABS_PANE_MOTION_OVERLAY: `${BASE_CLASS_PREFIX}-tabs-pane-motion-overlay`,
TABS_PANE_ANIMATING: `${BASE_CLASS_PREFIX}-tabs-pane-animating`,
"TABS_PANE_ANIMATE_LEFT_SHOW": `${BASE_CLASS_PREFIX}-tabs-pane-animate-leftShow`,
"TABS_PANE_ANIMATE_RIGHT_SHOW": `${BASE_CLASS_PREFIX}-tabs-pane-animate-rightShow`,
"TABS_PANE_ANIMATE_TOP_SHOW": `${BASE_CLASS_PREFIX}-tabs-pane-animate-topShow`,
"TABS_PANE_ANIMATE_BOTTOM_SHOW": `${BASE_CLASS_PREFIX}-tabs-pane-animate-bottomShow`
};
var strings14 = {
TYPE_MAP: ["line", "card", "button", "slash"],
SIZE: ["small", "medium", "large"],
POSITION_MAP: ["top", "left"]
};
// node_modules/@douyinfe/semi-foundation/lib/es/tabs/foundation.js
var import_noop9 = __toModule(require_noop());
var import_get12 = __toModule(require_get2());
var TabsFoundation = class extends foundation_default {
constructor(adapter) {
super(Object.assign({}, adapter));
this.destroy = import_noop9.default;
this.handlePrevent = (event) => {
event.stopPropagation();
event.preventDefault();
};
this.handleKeyDown = (event, itemKey, closable) => {
const {
preventScroll
} = this.getProps();
const tabs = [...event.target.parentNode.childNodes].filter((item) => {
return (0, import_get12.default)(item, "attributes.data-tabkey.value", "").includes("semiTab") && (0, import_get12.default)(item, "attributes.aria-disabled.value", "") !== "true";
});
switch (event.key) {
case "ArrowLeft":
case "ArrowRight":
case "ArrowUp":
case "ArrowDown":
this.determineOrientation(event, tabs);
break;
case "Backspace":
case "Delete":
this.handleDeleteKeyDown(event, tabs, itemKey, closable);
break;
case "Enter":
case " ":
this.handleTabClick(itemKey, event);
this.handlePrevent(event);
break;
case "Home":
tabs[0].focus({
preventScroll
});
this.handlePrevent(event);
break;
case "End":
tabs[tabs.length - 1].focus({
preventScroll
});
this.handlePrevent(event);
break;
}
};
}
init() {
this._adapter.collectPane();
}
_notifyChange(activeKey) {
const {
activeKey: stateActiveKey
} = this.getStates();
if (stateActiveKey !== activeKey) {
this._adapter.notifyChange(activeKey);
}
}
handleTabClick(activeKey, event) {
const isControlledComponent = this._isInProps("activeKey");
if (isControlledComponent) {
this._notifyChange(activeKey);
} else {
this._notifyChange(activeKey);
this.handleNewActiveKey(activeKey);
}
this._adapter.notifyTabClick(activeKey, event);
}
handleNewActiveKey(activeKey) {
const {
activeKey: stateActiveKey
} = this.getStates();
if (stateActiveKey !== activeKey) {
this._adapter.setNewActiveKey(activeKey);
}
}
getDefaultActiveKey() {
let activeKey;
const props = this.getProps();
if ("activeKey" in props) {
activeKey = props.activeKey;
} else if ("defaultActiveKey" in props) {
activeKey = props.defaultActiveKey;
} else {
activeKey = this._adapter.getDefaultActiveKeyFromChildren();
}
return activeKey;
}
handleTabListChange() {
this._adapter.collectPane();
}
handleTabPanesChange() {
this._adapter.collectPane();
this._adapter.collectActiveKey();
}
handleTabDelete(tabKey) {
this._adapter.notifyTabDelete(tabKey);
}
determineOrientation(event, tabs) {
const {
tabPosition
} = this.getProps();
const isVertical = tabPosition === "left";
if (isVertical) {
if (event.key === "ArrowUp" || event.key === "ArrowDown") {
this.switchTabOnArrowPress(event, tabs);
this.handlePrevent(event);
}
} else {
if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
this.switchTabOnArrowPress(event, tabs);
this.handlePrevent(event);
}
}
}
handleDeleteKeyDown(event, tabs, itemKey, closable) {
const {
preventScroll
} = this.getProps();
if (closable) {
this.handleTabDelete(itemKey);
const index2 = tabs.indexOf(event.target);
if (tabs.length !== 1) {
tabs[index2 + 1 >= tabs.length ? index2 - 1 : index2 + 1].focus({
preventScroll
});
}
}
}
switchTabOnArrowPress(event, tabs) {
const {
preventScroll
} = this.getProps();
const index2 = tabs.indexOf(event.target);
const direction = {
"ArrowLeft": -1,
"ArrowUp": -1,
"ArrowRight": 1,
"ArrowDown": 1
};
if (direction[event.key]) {
if (index2 !== void 0) {
if (tabs[index2 + direction[event.key]]) {
tabs[index2 + direction[event.key]].focus({
preventScroll
});
} else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
tabs[tabs.length - 1].focus({
preventScroll
});
} else if (event.key === "ArrowRight" || event.key == "ArrowDown") {
tabs[0].focus({
preventScroll
});
}
}
}
}
};
var foundation_default4 = TabsFoundation;
// node_modules/@douyinfe/semi-ui/lib/es/tabs/TabBar.js
var import_pick = __toModule(require_pick());
var import_isEmpty4 = __toModule(require_isEmpty());
var import_react55 = __toModule(require_react());
var import_prop_types37 = __toModule(require_prop_types());
var import_classnames34 = __toModule(require_classnames());
// node_modules/@douyinfe/semi-ui/lib/es/tabs/TabItem.js
var import_react54 = __toModule(require_react());
var import_classnames33 = __toModule(require_classnames());
var __rest28 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var TabItem = (props, ref) => {
const {
tab,
size,
type,
icon,
selected,
closable,
disabled,
itemKey,
deleteTabItem,
tabPosition,
handleKeyDown,
onClick
} = props, restProps = __rest28(props, ["tab", "size", "type", "icon", "selected", "closable", "disabled", "itemKey", "deleteTabItem", "tabPosition", "handleKeyDown", "onClick"]);
const closableIcon = (0, import_react54.useMemo)(() => {
return closable ? /* @__PURE__ */ import_react54.default.createElement(IconClose_default, {
"aria-label": "Close",
role: "button",
className: `${cssClasses17.TABS_TAB}-icon-close`,
onClick: (e) => deleteTabItem(itemKey, e)
}) : null;
}, [type, closable, deleteTabItem, itemKey]);
const renderIcon = (0, import_react54.useCallback)((icon2) => /* @__PURE__ */ import_react54.default.createElement("span", {
className: `${cssClasses17.TABS_BAR}-icon`
}, icon2), []);
const handleKeyDownInItem = (0, import_react54.useCallback)((event) => {
handleKeyDown && handleKeyDown(event, itemKey, closable);
}, [handleKeyDown, itemKey, closable]);
const handleItemClick = (0, import_react54.useCallback)((e) => {
!disabled && onClick && onClick(itemKey, e);
}, [itemKey, disabled, onClick]);
const panelIcon = icon ? renderIcon(icon) : null;
const className = (0, import_classnames33.default)(cssClasses17.TABS_TAB, `${cssClasses17.TABS_TAB}-${type}`, `${cssClasses17.TABS_TAB}-${tabPosition}`, `${cssClasses17.TABS_TAB}-single`, {
[cssClasses17.TABS_TAB_ACTIVE]: selected,
[cssClasses17.TABS_TAB_DISABLED]: disabled,
[`${cssClasses17.TABS_TAB}-small`]: size === "small",
[`${cssClasses17.TABS_TAB}-medium`]: size === "medium"
});
return /* @__PURE__ */ import_react54.default.createElement("div", Object.assign({
role: "tab",
id: `semiTab${itemKey}`,
"data-tabkey": `semiTab${itemKey}`,
"aria-controls": `semiTabPanel${itemKey}`,
"aria-disabled": disabled ? "true" : "false",
"aria-selected": selected ? "true" : "false",
tabIndex: selected ? 0 : -1,
onKeyDown: handleKeyDownInItem,
onClick: handleItemClick,
className
}, restProps, {
ref
}), panelIcon, tab, closableIcon);
};
var ForwardTabItem = /* @__PURE__ */ (0, import_react54.forwardRef)(TabItem);
ForwardTabItem.elementType = "Tabs.TabItem";
var TabItem_default = ForwardTabItem;
// node_modules/@douyinfe/semi-ui/lib/es/tabs/TabBar.js
var __rest29 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var TabBar = class extends import_react55.default.Component {
constructor(props) {
var _this;
super(props);
_this = this;
this.handleItemClick = (itemKey, e) => {
this.props.onTabClick(itemKey, e);
};
this.handleKeyDown = (event, itemKey, closable) => {
this.props.handleKeyDown(event, itemKey, closable);
};
this.renderTabItem = (panel) => {
const {
size,
type,
deleteTabItem,
handleKeyDown,
tabPosition
} = this.props;
const isSelected = this._isActive(panel.itemKey);
return /* @__PURE__ */ import_react55.default.createElement(TabItem_default, Object.assign({}, (0, import_pick.default)(panel, ["disabled", "icon", "itemKey", "tab", "closable"]), {
key: this._getBarItemKeyByItemKey(panel.itemKey),
selected: isSelected,
size,
type,
tabPosition,
handleKeyDown,
deleteTabItem,
onClick: this.handleItemClick
}));
};
this.scrollTabItemIntoViewByKey = function(key) {
let logicalPosition = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "nearest";
const tabItem = document.querySelector(`[data-uuid="${_this.state.uuid}"] .${cssClasses17.TABS_TAB}[data-scrollkey="${key}"]`);
tabItem === null || tabItem === void 0 ? void 0 : tabItem.scrollIntoView({
behavior: "smooth",
block: logicalPosition,
inline: logicalPosition
});
};
this.scrollActiveTabItemIntoView = (logicalPosition) => {
const key = this._getBarItemKeyByItemKey(this.props.activeKey);
this.scrollTabItemIntoViewByKey(key, logicalPosition);
};
this.renderTabComponents = (list2) => list2.map((panel) => this.renderTabItem(panel));
this.handleArrowClick = (items, pos) => {
const lastItem = pos === "start" ? items.pop() : items.shift();
if (!lastItem) {
return;
}
const key = this._getBarItemKeyByItemKey(lastItem.itemKey);
this.scrollTabItemIntoViewByKey(key);
};
this.renderCollapse = (items, icon, pos) => {
var _a2;
const arrowCls = (0, import_classnames34.default)({
[`${cssClasses17.TABS_BAR}-arrow-${pos}`]: pos,
[`${cssClasses17.TABS_BAR}-arrow`]: true
});
if ((0, import_isEmpty4.default)(items)) {
return /* @__PURE__ */ import_react55.default.createElement("div", {
role: "presentation",
className: arrowCls
}, /* @__PURE__ */ import_react55.default.createElement(button_default, {
disabled: true,
icon,
theme: "borderless"
}));
}
const {
dropdownClassName,
dropdownStyle,
showRestInDropdown,
dropdownProps
} = this.props;
const {
rePosKey
} = this.state;
const disabled = !items.length;
const menu = /* @__PURE__ */ import_react55.default.createElement(dropdown_default.Menu, null, items.map((panel) => {
const {
icon: i,
tab,
itemKey
} = panel;
const panelIcon = i ? this.renderIcon(panel.icon) : null;
return /* @__PURE__ */ import_react55.default.createElement(dropdown_default.Item, {
key: itemKey,
onClick: (e) => this.handleItemClick(itemKey, e),
active: this._isActive(itemKey)
}, panelIcon, tab);
}));
const button = /* @__PURE__ */ import_react55.default.createElement("div", {
role: "presentation",
className: arrowCls,
onClick: (e) => this.handleArrowClick(items, pos)
}, /* @__PURE__ */ import_react55.default.createElement(button_default, {
disabled,
icon,
theme: "borderless"
}));
const dropdownCls = (0, import_classnames34.default)(dropdownClassName, {
[`${cssClasses17.TABS_BAR}-dropdown`]: true
});
const customDropdownProps = (_a2 = dropdownProps === null || dropdownProps === void 0 ? void 0 : dropdownProps[pos]) !== null && _a2 !== void 0 ? _a2 : {};
return /* @__PURE__ */ import_react55.default.createElement(import_react55.default.Fragment, null, showRestInDropdown ? /* @__PURE__ */ import_react55.default.createElement(dropdown_default, Object.assign({
className: dropdownCls,
clickToHide: true,
clickTriggerToHide: true,
key: `${rePosKey}-${pos}`,
position: pos === "start" ? "bottomLeft" : "bottomRight",
render: disabled ? null : menu,
showTick: true,
style: dropdownStyle,
trigger: "hover",
disableFocusListener: true
}, customDropdownProps), button) : button);
};
this.renderOverflow = (items) => items.map((item, index2) => {
const pos = index2 === 0 ? "start" : "end";
const icon = index2 === 0 ? /* @__PURE__ */ import_react55.default.createElement(IconChevronLeft_default, null) : /* @__PURE__ */ import_react55.default.createElement(IconChevronRight_default, null);
const overflowNode = this.renderCollapse(item, icon, pos);
if (this.props.renderArrow) {
return this.props.renderArrow(item, pos, () => this.handleArrowClick(item, pos), overflowNode);
}
return overflowNode;
});
this.renderCollapsedTab = () => {
const {
list: list2
} = this.props;
const renderedList = list2.map((item) => {
const {
itemKey
} = item;
return Object.assign({
key: this._getBarItemKeyByItemKey(itemKey),
active: this._isActive(itemKey)
}, item);
});
return /* @__PURE__ */ import_react55.default.createElement(overflowList_default, {
items: renderedList,
overflowRenderDirection: this.props.arrowPosition,
wrapperStyle: this.props.visibleTabsStyle,
overflowRenderer: this.renderOverflow,
renderMode: "scroll",
className: `${cssClasses17.TABS_BAR}-overflow-list`,
visibleItemRenderer: this.renderTabItem,
onVisibleStateChange: (visibleMap) => {
var _a2, _b;
const visibleMapWithItemKey = new Map();
visibleMap.forEach((v, k) => {
visibleMapWithItemKey.set(this._getItemKeyByBarItemKey(k), v);
});
(_b = (_a2 = this.props).onVisibleTabsChange) === null || _b === void 0 ? void 0 : _b.call(_a2, visibleMapWithItemKey);
}
});
};
this.renderWithMoreTrigger = () => {
const {
list: list2,
more
} = this.props;
let tabElements = [];
let moreTrigger = /* @__PURE__ */ import_react55.default.createElement("div", {
className: (0, import_classnames34.default)({
[`${cssClasses17.TABS_BAR}-more-trigger`]: true,
[`${cssClasses17.TABS_BAR}-more-trigger-${this.props.type}`]: true
})
}, /* @__PURE__ */ import_react55.default.createElement(LocaleConsumer, {
componentName: "Tabs"
}, (locale2, localeCode) => /* @__PURE__ */ import_react55.default.createElement("div", {
className: `${cssClasses17.TABS_BAR}-more-trigger-content`
}, /* @__PURE__ */ import_react55.default.createElement("div", null, locale2.more), /* @__PURE__ */ import_react55.default.createElement(IconChevronDown_default, {
className: `${cssClasses17.TABS_BAR}-more-trigger-content-icon`
}))));
let keepCount;
if (typeof more === "number") {
keepCount = list2.length - Math.min(more, list2.length);
tabElements = list2.slice(0, keepCount).map((panel) => this.renderTabItem(panel));
} else if (typeof more === "object") {
keepCount = list2.length - Math.min(more.count, list2.length);
tabElements = list2.slice(0, keepCount).map((panel) => this.renderTabItem(panel));
if (more.render) {
moreTrigger = more.render();
}
} else if (more !== void 0) {
throw new Error("[Semi Tabs]: invalid tab props format: more");
}
return /* @__PURE__ */ import_react55.default.createElement(import_react55.default.Fragment, null, tabElements, this.renderMoreDropdown(list2.slice(keepCount), more === null || more === void 0 ? void 0 : more["dropdownProps"], moreTrigger));
};
this.renderMoreDropdown = (panels, dropDownProps, trigger) => {
return /* @__PURE__ */ import_react55.default.createElement(dropdown_default, Object.assign({
trigger: "hover",
showTick: true,
position: "bottomLeft",
className: `${cssClasses17.TABS_BAR}-more-dropdown-${this.props.type}`,
clickToHide: true,
menu: panels.map((panel) => ({
node: "item",
name: panel.tab,
icon: panel.icon,
onClick: (e) => this.props.onTabClick(panel.itemKey, e),
active: this.props.activeKey === panel.itemKey
}))
}, dropDownProps), trigger);
};
this._isActive = (key) => key === this.props.activeKey;
this._getBarItemKeyByItemKey = (key) => `${key}-bar`;
this._getItemKeyByBarItemKey = (key) => key.replace(/-bar$/, "");
this.state = {
endInd: props.list.length,
rePosKey: 0,
startInd: 0,
uuid: "",
currentVisibleItems: []
};
}
componentDidMount() {
this.setState({
uuid: getUuidv4()
}, () => {
if (this.props.collapsible) {
requestAnimationFrame(() => {
this.scrollActiveTabItemIntoView();
});
}
});
}
componentDidUpdate(prevProps) {
if (prevProps.activeKey !== this.props.activeKey) {
if (this.props.collapsible) {
this.scrollActiveTabItemIntoView();
}
}
}
renderIcon(icon) {
return /* @__PURE__ */ import_react55.default.createElement("span", null, icon);
}
renderExtra() {
const {
tabBarExtraContent,
type,
size
} = this.props;
const tabBarExtraContentDefaultStyle = {
float: "right"
};
const tabBarExtraContentStyle = tabBarExtraContent && tabBarExtraContent.props ? tabBarExtraContent.props.style : {};
const extraCls = (0, import_classnames34.default)(cssClasses17.TABS_BAR_EXTRA, {
[`${cssClasses17.TABS_BAR}-${type}-extra`]: type,
[`${cssClasses17.TABS_BAR}-${type}-extra-${size}`]: size
});
if (tabBarExtraContent) {
const tabBarStyle = Object.assign(Object.assign({}, tabBarExtraContentDefaultStyle), tabBarExtraContentStyle);
return /* @__PURE__ */ import_react55.default.createElement("div", {
className: extraCls,
style: tabBarStyle,
"x-semi-prop": "tabBarExtraContent"
}, tabBarExtraContent);
}
return null;
}
render() {
const _a2 = this.props, {
type,
style,
className,
list: list2,
tabPosition,
more,
collapsible
} = _a2, restProps = __rest29(_a2, ["type", "style", "className", "list", "tabPosition", "more", "collapsible"]);
const classNames5 = (0, import_classnames34.default)(className, {
[cssClasses17.TABS_BAR]: true,
[cssClasses17.TABS_BAR_LINE]: type === "line",
[cssClasses17.TABS_BAR_CARD]: type === "card",
[cssClasses17.TABS_BAR_BUTTON]: type === "button",
[cssClasses17.TABS_BAR_SLASH]: type === "slash",
[`${cssClasses17.TABS_BAR}-${tabPosition}`]: tabPosition,
[`${cssClasses17.TABS_BAR}-collapse`]: collapsible
});
const extra = this.renderExtra();
const contents = collapsible ? this.renderCollapsedTab() : more ? this.renderWithMoreTrigger() : this.renderTabComponents(list2);
return /* @__PURE__ */ import_react55.default.createElement("div", Object.assign({
role: "tablist",
"aria-orientation": tabPosition === "left" ? "vertical" : "horizontal",
className: classNames5,
style
}, getDataAttr(restProps), {
"data-uuid": this.state.uuid
}), contents, extra);
}
};
TabBar.propTypes = {
activeKey: import_prop_types37.default.string,
className: import_prop_types37.default.string,
collapsible: import_prop_types37.default.bool,
list: import_prop_types37.default.array,
onTabClick: import_prop_types37.default.func,
size: import_prop_types37.default.oneOf(strings14.SIZE),
style: import_prop_types37.default.object,
tabBarExtraContent: import_prop_types37.default.node,
tabPosition: import_prop_types37.default.oneOf(strings14.POSITION_MAP),
type: import_prop_types37.default.oneOf(strings14.TYPE_MAP),
closable: import_prop_types37.default.bool,
deleteTabItem: import_prop_types37.default.func,
more: import_prop_types37.default.oneOfType([import_prop_types37.default.number, import_prop_types37.default.object])
};
var TabBar_default = TabBar;
// node_modules/@douyinfe/semi-ui/lib/es/tabs/TabPane.js
var import_react57 = __toModule(require_react());
var import_prop_types38 = __toModule(require_prop_types());
var import_classnames35 = __toModule(require_classnames());
// node_modules/@douyinfe/semi-ui/lib/es/tabs/tabs-context.js
var import_react56 = __toModule(require_react());
var TabsContext = /* @__PURE__ */ import_react56.default.createContext({});
var tabs_context_default = TabsContext;
// node_modules/@douyinfe/semi-ui/lib/es/tabs/TabPane.js
var __rest30 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var TabPane = class extends import_react57.PureComponent {
constructor() {
super(...arguments);
this.ref = /* @__PURE__ */ (0, import_react57.createRef)();
this.getDirection = (activeKey, itemKey, panes, lastActiveKey) => {
if (itemKey !== null && activeKey !== null && Array.isArray(panes) && panes.length) {
const activeIndex = panes.findIndex((pane) => pane.itemKey === activeKey);
const itemIndex = panes.findIndex((pane) => pane.itemKey === itemKey);
const lastActiveIndex = panes.findIndex((pane) => pane.itemKey === lastActiveKey);
if (activeIndex === itemIndex) {
return lastActiveIndex > activeIndex;
} else {
return itemIndex < activeIndex;
}
}
return false;
};
this.shouldRender = () => {
const {
itemKey
} = this.props;
const {
activeKey,
lazyRender
} = this.context;
const active = activeKey === itemKey;
this._active = this._active || active;
return lazyRender ? this._active : true;
};
}
render() {
const {
tabPaneMotion: motion,
tabPosition,
prevActiveKey
} = this.context;
const _a2 = this.props, {
className,
style,
children,
itemKey,
tabIndex
} = _a2, restProps = __rest30(_a2, ["className", "style", "children", "itemKey", "tabIndex"]);
const active = this.context.activeKey === itemKey;
const classNames5 = (0, import_classnames35.default)(className, {
[cssClasses17.TABS_PANE_INACTIVE]: !active,
[cssClasses17.TABS_PANE_ACTIVE]: active,
[cssClasses17.TABS_PANE]: true
});
const shouldRender = this.shouldRender();
const startClassName = (() => {
const direction = this.getDirection(this.context.activeKey, itemKey, this.context.panes, prevActiveKey);
if (tabPosition === "top") {
if (direction) {
return cssClasses17.TABS_PANE_ANIMATE_RIGHT_SHOW;
} else {
return cssClasses17.TABS_PANE_ANIMATE_LEFT_SHOW;
}
} else {
if (direction) {
return cssClasses17.TABS_PANE_ANIMATE_BOTTOM_SHOW;
} else {
return cssClasses17.TABS_PANE_ANIMATE_TOP_SHOW;
}
}
})();
const isActivatedBecauseOtherTabPaneRemoved = !this.context.panes.find((tabPane) => tabPane.itemKey === prevActiveKey);
const hasMotion = motion && active && !isActivatedBecauseOtherTabPaneRemoved && !this.context.forceDisableMotion;
return /* @__PURE__ */ import_react57.default.createElement("div", Object.assign({
ref: this.ref,
role: "tabpanel",
id: `semiTabPanel${itemKey}`,
"aria-labelledby": `semiTab${itemKey}`,
className: classNames5,
style,
"aria-hidden": active ? "false" : "true",
tabIndex: tabIndex ? tabIndex : 0
}, getDataAttr(restProps), {
"x-semi-prop": "children"
}), /* @__PURE__ */ import_react57.default.createElement(cssAnimation_default, {
motion: hasMotion,
animationState: active ? "enter" : "leave",
startClassName
}, (_ref) => {
let {
animationClassName,
animationEventsNeedBind
} = _ref;
return /* @__PURE__ */ import_react57.default.createElement("div", Object.assign({
className: (0, import_classnames35.default)(cssClasses17.TABS_PANE_MOTION_OVERLAY, animationClassName),
"x-semi-prop": "children"
}, animationEventsNeedBind), shouldRender ? children : null);
}));
}
};
TabPane.isTabPane = true;
TabPane.contextType = tabs_context_default;
TabPane.propTypes = {
className: import_prop_types38.default.string,
style: import_prop_types38.default.object,
children: import_prop_types38.default.node,
disabled: import_prop_types38.default.bool,
itemKey: import_prop_types38.default.string,
tab: import_prop_types38.default.node,
icon: import_prop_types38.default.node,
closable: import_prop_types38.default.bool
};
var TabPane_default = TabPane;
// node_modules/@douyinfe/semi-ui/lib/es/tabs/index.js
var __rest31 = function(s, e) {
var t2 = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t2[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t2[p[i]] = s[p[i]];
}
return t2;
};
var panePickKeys = ["className", "style", "disabled", "itemKey", "tab", "icon"];
var Tabs = class extends BaseComponent {
constructor(props) {
super(props);
this.setContentRef = (ref) => {
this.contentRef = {
current: ref
};
};
this.getPanes = () => {
const {
tabList,
children
} = this.props;
if (Array.isArray(tabList) && tabList.length) {
return tabList;
}
return import_react58.default.Children.map(children, (child) => {
if (child) {
const {
tab,
icon,
disabled,
itemKey,
closable
} = child.props;
return {
tab,
icon,
disabled,
itemKey,
closable
};
}
return void 0;
});
};
this.onTabClick = (activeKey, event) => {
this.foundation.handleTabClick(activeKey, event);
};
this.rePosChildren = (children, activeKey) => {
const newChildren = [];
const falttenChildren = import_react58.default.Children.toArray(children);
if (children.length) {
newChildren.push(...falttenChildren.filter((child) => child.props && child.props.itemKey === activeKey));
newChildren.push(...falttenChildren.filter((child) => child.props && child.props.itemKey !== activeKey));
}
return newChildren;
};
this.getActiveItem = () => {
const {
activeKey
} = this.state;
const {
children,
tabList
} = this.props;
if (tabList || !Array.isArray(children)) {
return children;
}
return import_react58.default.Children.toArray(children).filter((pane) => {
if (/* @__PURE__ */ (0, import_react58.isValidElement)(pane) && pane.type && pane.type.isTabPane) {
return pane.props.itemKey === activeKey;
}
return true;
});
};
this.deleteTabItem = (tabKey, event) => {
event.stopPropagation();
this.foundation.handleTabDelete(tabKey);
};
this.foundation = new foundation_default4(this.adapter);
this.state = {
activeKey: this.foundation.getDefaultActiveKey(),
panes: this.getPanes(),
prevActiveKey: null,
forceDisableMotion: false
};
this.contentRef = /* @__PURE__ */ (0, import_react58.createRef)();
this.contentHeight = "auto";
}
get adapter() {
return Object.assign(Object.assign({}, super.adapter), {
collectPane: () => {
const panes = this.getPanes();
this.setState({
panes
});
},
collectActiveKey: () => {
const {
tabList,
children,
activeKey: propsActiveKey
} = this.props;
if (typeof propsActiveKey !== "undefined") {
return;
}
const {
activeKey
} = this.state;
const panes = this.getPanes();
if (panes.findIndex((p) => p.itemKey === activeKey) === -1) {
if (panes.length > 0) {
this.setState({
activeKey: panes[0].itemKey
});
} else {
this.setState({
activeKey: ""
});
}
}
},
notifyTabClick: (activeKey, event) => {
this.props.onTabClick(activeKey, event);
},
notifyChange: (activeKey) => {
this.props.onChange(activeKey);
},
setNewActiveKey: (activeKey) => {
this.setState({
activeKey
});
},
getDefaultActiveKeyFromChildren: () => {
const {
tabList,
children
} = this.props;
let activeKey = "";
const list2 = tabList ? tabList : import_react58.default.Children.toArray(children).map((child) => /* @__PURE__ */ (0, import_react58.isValidElement)(child) ? child.props : null);
list2.forEach((item) => {
if (item && !activeKey && !item.disabled) {
activeKey = item.itemKey;
}
});
return activeKey;
},
notifyTabDelete: (tabKey) => {
this.props.onTabClose && this.props.onTabClose(tabKey);
}
});
}
static getDerivedStateFromProps(props, state) {
const states = {};
if (!isNullOrUndefined(props.activeKey) && props.activeKey !== state.activeKey) {
state.prevActiveKey = state.activeKey;
states.activeKey = props.activeKey;
}
return states;
}
componentDidUpdate(prevProps, prevState) {
const prevChildrenProps = import_react58.default.Children.toArray(prevProps.children).map((child) => (0, import_pick2.default)(/* @__PURE__ */ (0, import_react58.isValidElement)(child) ? child.props : null, panePickKeys));
const nowChildrenProps = import_react58.default.Children.toArray(this.props.children).map((child) => (0, import_pick2.default)(/* @__PURE__ */ (0, import_react58.isValidElement)(child) ? child.props : null, panePickKeys));
const isTabListType = this.props.tabList || prevProps.tabList;
if (!(0, import_isEqual5.default)(this.props.tabList, prevProps.tabList)) {
this.foundation.handleTabListChange();
}
if (prevState.activeKey !== this.state.activeKey && prevState.activeKey !== this.state.prevActiveKey) {
this.setState({
prevActiveKey: prevState.activeKey
});
}
if (prevProps.activeKey !== this.props.activeKey) {
const newAddedPanelItemKey = (() => {
const prevItemKeys = new Set(prevChildrenProps.map((p) => p.itemKey));
return nowChildrenProps.map((p) => p.itemKey).filter((itemKey) => !prevItemKeys.has(itemKey));
})();
this.setState({
forceDisableMotion: newAddedPanelItemKey.includes(this.props.activeKey)
});
}
if (!(0, import_isEqual5.default)(prevChildrenProps, nowChildrenProps) && !isTabListType) {
this.foundation.handleTabPanesChange();
}
}
render() {
const _a2 = this.props, {
children,
className,
collapsible,
contentStyle,
keepDOM,
lazyRender,
renderTabBar,
showRestInDropdown,
size,
style,
tabBarClassName,
tabBarExtraContent,
tabBarStyle,
tabPaneMotion,
tabPosition,
type,
more,
onVisibleTabsChange,
visibleTabsStyle,
arrowPosition,
renderArrow,
dropdownProps
} = _a2, restProps = __rest31(_a2, ["children", "className", "collapsible", "contentStyle", "keepDOM", "lazyRender", "renderTabBar", "showRestInDropdown", "size", "style", "tabBarClassName", "tabBarExtraContent", "tabBarStyle", "tabPaneMotion", "tabPosition", "type", "more", "onVisibleTabsChange", "visibleTabsStyle", "arrowPosition", "renderArrow", "dropdownProps"]);
const {
panes,
activeKey
} = this.state;
const tabWrapperCls = (0, import_classnames36.default)(className, {
[cssClasses17.TABS]: true,
[`${cssClasses17.TABS}-${tabPosition}`]: tabPosition
});
const tabContentCls = (0, import_classnames36.default)({
[cssClasses17.TABS_CONTENT]: true,
[`${cssClasses17.TABS_CONTENT}-${tabPosition}`]: tabPosition
});
const tabBarProps = {
activeKey,
className: tabBarClassName,
collapsible,
list: panes,
onTabClick: this.onTabClick,
showRestInDropdown,
size,
style: tabBarStyle,
tabBarExtraContent,
tabPosition,
type,
deleteTabItem: this.deleteTabItem,
handleKeyDown: this.foundation.handleKeyDown,
more,
onVisibleTabsChange,
visibleTabsStyle,
arrowPosition,
renderArrow,
dropdownProps
};
const tabBar = renderTabBar ? renderTabBar(tabBarProps, TabBar_default) : /* @__PURE__ */ import_react58.default.createElement(TabBar_default, Object.assign({}, tabBarProps));
const content = keepDOM ? children : this.getActiveItem();
return /* @__PURE__ */ import_react58.default.createElement("div", Object.assign({
className: tabWrapperCls,
style
}, this.getDataAttr(restProps)), tabBar, /* @__PURE__ */ import_react58.default.createElement(tabs_context_default.Provider, {
value: {
activeKey,
lazyRender,
panes,
tabPaneMotion,
tabPosition,
prevActiveKey: this.state.prevActiveKey,
forceDisableMotion: this.state.forceDisableMotion
}
}, /* @__PURE__ */ import_react58.default.createElement("div", {
ref: this.setContentRef,
className: tabContentCls,
style: Object.assign({}, contentStyle)
}, content)));
}
};
Tabs.TabPane = TabPane_default;
Tabs.TabItem = TabItem_default;
Tabs.propTypes = {
activeKey: import_prop_types39.default.string,
className: import_prop_types39.default.string,
collapsible: import_prop_types39.default.bool,
contentStyle: import_prop_types39.default.oneOfType([import_prop_types39.default.object]),
defaultActiveKey: import_prop_types39.default.string,
keepDOM: import_prop_types39.default.bool,
lazyRender: import_prop_types39.default.bool,
onChange: import_prop_types39.default.func,
onTabClick: import_prop_types39.default.func,
renderTabBar: import_prop_types39.default.func,
showRestInDropdown: import_prop_types39.default.bool,
size: import_prop_types39.default.oneOf(strings14.SIZE),
style: import_prop_types39.default.object,
tabBarClassName: import_prop_types39.default.string,
tabBarExtraContent: import_prop_types39.default.node,
tabBarStyle: import_prop_types39.default.object,
tabList: import_prop_types39.default.array,
tabPaneMotion: import_prop_types39.default.bool,
tabPosition: import_prop_types39.default.oneOf(strings14.POSITION_MAP),
type: import_prop_types39.default.oneOf(strings14.TYPE_MAP),
onTabClose: import_prop_types39.default.func,
preventScroll: import_prop_types39.default.bool,
more: import_prop_types39.default.oneOfType([import_prop_types39.default.number, import_prop_types39.default.object]),
arrowPosition: import_prop_types39.default.string,
renderArrow: import_prop_types39.default.func,
dropdownProps: import_prop_types39.default.object
};
Tabs.__SemiComponentName__ = "Tabs";
Tabs.defaultProps = getDefaultPropsFromGlobalConfig(Tabs.__SemiComponentName__, {
children: [],
collapsible: false,
keepDOM: true,
lazyRender: false,
onChange: () => void 0,
onTabClick: () => void 0,
size: "large",
tabPaneMotion: true,
tabPosition: "top",
type: "line",
onTabClose: () => void 0,
showRestInDropdown: true,
arrowPosition: "both"
});
var tabs_default = Tabs;
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationConstructionDark.js
var React65 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationConstruction.js
var React66 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationFailureDark.js
var React67 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationFailure.js
var React68 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationIdleDark.js
var React69 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationIdle.js
var React70 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationNoAccessDark.js
var React71 = __toModule(require_react());
var __defProp2 = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp2.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
function SvgComponent9(props) {
return /* @__PURE__ */ React71.createElement("svg", __spreadValues({
width: 200,
height: 200,
viewBox: "0 0 200 200",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React71.createElement("path", {
d: "M109.53 54.91a40.4 40.4 0 1 1 80.8 0v113.7h-80.8V54.92Z",
fill: "#2E3238",
stroke: "#1C1F23"
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M135.9 60.08c-5.94-.68-11.3 3.42-11.96 9.16l-2.39 20.77c-.66 5.75 3.63 10.96 9.58 11.64l25.85 2.97c5.95.68 11.3-3.42 11.97-9.16l2.38-20.77c.66-5.75-3.63-10.96-9.58-11.64l-25.84-2.97Z",
fill: "var(--semi-color-primary)",
fillOpacity: 0.2
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "m158.96 62.73 1.5-11.41a9.47 9.47 0 0 0-18.76-2.47l-1.54 11.72-4.25-.49a11.4 11.4 0 0 0-1.25-.07l1.56-11.88a14.98 14.98 0 0 1 16.8-12.9h.03a14.98 14.98 0 0 1 12.9 16.81l-1.54 11.65c-.84-.31-1.73-.53-2.66-.64l-2.8-.32Z",
fill: "var(--semi-color-primary)"
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M148.62 80.9a4.67 4.67 0 1 0-3.29-.43l-4.17 7.63a1 1 0 0 0 .75 1.47l7.65 1.01a1 1 0 0 0 1.1-1.23l-2.04-8.45Z",
fill: "var(--semi-color-primary)"
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M180.37 95.24a5 5 0 1 0 0-10 5 5 0 0 0 0 10Z",
fill: "#6B7075"
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M88.47 52.87h-.04l-.04.02c-.37.23-.83.47-1.36.74l-1.04.54c-.94.5-1.98 1.12-2.93 1.95-1.88 1.63-3.4 4.05-3.2 7.92a21 21 0 0 0-8.14 3.22c-2.78 1.9-5.04 4.74-5.13 8.74v.05l.04.04c4.26 5.01 18.1 12.42 39.5 2.34l.08-.03v-.09c.02-1.7-.4-4.33-1.73-6.7a9.9 9.9 0 0 0-7-5.09c.38-2.17.4-5.4-.79-8.17a8.75 8.75 0 0 0-2.86-3.7 9.83 9.83 0 0 0-5.36-1.78Z",
fill: "#1C1F23"
}), /* @__PURE__ */ React71.createElement("path", {
d: "M112.1 185.6c-7.72 1.83-19.84 2.4-29.06 1.54-3.12-.24-9.65-1.04-10.76-2.36-1.38-1.64-3.68-6.76-3.94-11.91-.27-5.15 2.03-23.08 3.76-27.51-2.42-.68-8.08-3.12-12.12-5.25-1.94-1.02-6.2-3.28-11.32-6.28.26 6.71.04 12.95-1.08 18.14-1.29 5.97-3.75 11.3-5.82 16.06-1.75 4.04-.35 6.49 3.27 9.59 2.57 2.2 6.89 2.95 9.22 4.4.52.35 1.51 1.23 1.53 2.15.02.52-.87 1-2.12 1.4-1.53.5-3.59.87-5.18 1.06-9.37 1.1-29.55 1.64-35.97-1.73-.65-.34-1.68-1.01-.78-6.5 1.71-10.37 7.64-27.22 8.46-32.06 1.03-6.05-1.16-11.92-2.42-16.72-1.26-4.8-3.6-22.67 0-32.82.49-1.39 1.1-2.87 1.81-4.42a71.08 71.08 0 0 1 17.73-23.3c-10.33-7.37-23.14-18.28-24.1-28-.96-9.7 7.86-20.62 16.3-20.16 8.64.46 29.33 12.88 43.22 28.83 4.81-6.9 14.63-8.64 20.7-5.28 3.58 1.98.72 4.5-.5 5.26-.97.62-11.77 12.45-16.78 17.65 5.5 3.46 17.76 10 21.47 19.94 1.3 3.45 1.38 4.95 1.63 8.1.54 6.84 2.57 21.55 2.57 23.95 2.32-3.28 4.7-5.83 9.38-10.66 4.69-4.83 8.49-12.39 9.94-16.94 1.33-4.2 2-8.09 4.46-7.47 2.38.6 2.05 10.5 1.44 15.34 4.25-.33 15.6-.28 22.69 1.63 7.08 1.9 8.24 4.37 8.14 4.97-.1.6-1.36 2.5-10.2 2.2.3 1.02-.04 3.19-3.88 3.75 2.03 1.24 2.2 1.94 2.16 2.67-.03.73-.44 2-4.93 2.58.62.94 1.45 2.37-2.43 3.63-3.88 1.26-9.62.37-9.97.34-1.87 6.27-7.23 18.73-15.8 24.83-5.36 3.81-11.91 3.95-14.22 3.95.66 13.61.25 20.85 2.22 24.47 2.76 5.05 20.35 8.8 11.28 10.94Z",
fill: "#C6CACD"
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "m78.15 68.61-2-1.23C69.45 63.17 58.55 55.8 48.49 49l-8.92-6.02c-7.1 5.64-8.43 14.8-8.89 21.08 2.23 1.8 4.48 3.48 6.63 5.01a71.08 71.08 0 0 0-17.73 23.3c-2.24 4.84-2.8 6.98-3.43 12 0 7.8 25.31 14.54 50.1 1.19.03.4 6.26 3.8 6.26 3.8l.23 5.49c11.85 0 24.1-5.82 27.4-11.12l-.15-1.33c-.27-2.4-.63-5.54-.74-6.98l-.02-.25c-.23-3-.35-4.5-1.6-7.86C94.3 78.45 84.2 72.29 78.14 68.6Zm-5.78 28.38-6.1 8.57 6.24 3.82c-.14-4-.14-7.65-.14-11.68V97Z",
fill: "#6B7075"
}), /* @__PURE__ */ React71.createElement("path", {
d: "M98.6 150.19c.66 13.61.25 20.85 2.22 24.47 2.76 5.05 20.35 8.8 11.28 10.94-7.72 1.83-19.84 2.4-29.06 1.54-3.12-.24-9.65-1.04-10.76-2.36-1.38-1.64-3.68-6.76-3.94-11.91-.27-5.15 2.03-23.08 3.76-27.51m26.5 4.83c2.3 0 8.86-.14 14.22-3.95 8.58-6.1 13.93-18.57 15.8-24.83.35.03 6.09.92 9.97-.34 3.88-1.26 3.05-2.69 2.43-3.63M98.6 150.19c-2.64 0-12.21-.41-19.36-10.08a30.3 30.3 0 0 1-4.4-8.95c-1.46-5.14-2.07-13.49-2.32-21.72m-.42 35.92c1.74-4.44 3.88-3.34 4.6-2.64.71.68 1.58 2.62 0 3.06-1.68.47-4.08-.28-4.6-.42Zm0 0c-2.42-.68-8.08-3.12-12.12-5.25-1.94-1.02-6.2-3.28-11.32-6.28M28.34 120.1c6.25 5.11 13.95 10 20.32 13.73m0 0c.26 6.71.04 12.95-1.08 18.14-1.29 5.97-3.75 11.3-5.82 16.06-1.75 4.04-.35 6.49 3.27 9.59 2.57 2.2 6.89 2.95 9.22 4.4.52.35 1.51 1.23 1.53 2.15.02.52-.87 1-2.12 1.4m-5.9-123.86a65 65 0 0 0-10.45 7.37m16.35 116.5c-1.53.48-3.59.86-5.18 1.05-9.37 1.1-29.55 1.64-35.97-1.73-.65-.34-1.68-1.01-.78-6.5 1.71-10.37 7.64-27.22 8.46-32.06 1.03-6.05-1.16-11.92-2.42-16.72-1.26-4.8-3.6-22.67 0-32.82.49-1.39 1.1-2.87 1.81-4.42a71.08 71.08 0 0 1 17.73-23.3m16.35 116.5c.16-1.9-1.37-4.1-4.73-3.82M37.3 69.08c-10.33-7.37-23.14-18.28-24.1-28-.96-9.7 7.86-20.62 16.3-20.16 8.64.46 29.33 12.88 43.22 28.83 4.81-6.9 14.63-8.64 20.7-5.28 3.58 1.98.72 4.5-.5 5.26-.97.62-11.77 12.45-16.78 17.65m0 0C65.7 60.8 44.98 46.54 33.2 38.73m42.95 28.65c5.5 3.46 17.76 10 21.47 19.94 1.3 3.45 1.38 4.95 1.63 8.1.54 6.84 2.57 21.55 2.57 23.95m0 0c0 1.85.77 8.03-1.87 8.03-2.44 0-.4-4.93 1.87-8.03Zm0 0c2.32-3.28 4.7-5.83 9.38-10.66 4.69-4.83 8.49-12.39 9.94-16.94 1.33-4.2 2-8.09 4.46-7.47 2.38.6 2.05 10.5 1.44 15.34m0 0-2.66.26m2.66-.26c4.25-.33 15.6-.28 22.69 1.63 7.08 1.9 8.24 4.37 8.14 4.97-.1.6-1.36 2.5-10.2 2.2m0 0c-7.62-.25-10.66-1.56-10.76-2.11-.1-.55 2.82-1.1 5.38-.6 2.57.5 5.03 1.36 5.38 2.72Zm0 0c.3 1.02-.04 3.19-3.88 3.75m0 0c-4.8.7-5.63.28-5.67 0-.03-.29 3.98-.83 5.67 0Zm0 0c2.03 1.24 2.2 1.94 2.16 2.67-.03.73-.44 2-4.93 2.58m0 0c-4.49.57-4.59-.63-3.33-.88 1.26-.24 2.97.41 3.33.88ZM72.38 89.58 72.36 97m0 0-6.1 8.57 6.26 3.87M72.36 97c0 3.8.03 8.1.16 12.44",
stroke: "#1C1F23"
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M72.23 97.11v-7l-.3.33a12.64 12.64 0 0 0-2.98 10.24l.14.87 3.14-4.44Z",
fill: "#1C1F23"
}), /* @__PURE__ */ React71.createElement("path", {
d: "M48.62 148.14c-.87-9.7-11.15-14.82-18.68-26.25 7.45 5.14 13.85 8.6 19.21 11.73 0 0-.08 9.49-.53 14.52Z",
fill: "#1C1F23"
}), /* @__PURE__ */ React71.createElement("path", {
d: "M97.1 56a8.64 8.64 0 0 1-7.94 9.29c-4.8.42-9-3.1-9.41-7.79a8.64 8.64 0 0 1 7.94-9.29c4.8-.41 9 3.1 9.41 7.8Z",
fill: "#C6CACD",
stroke: "#1C1F23",
strokeWidth: 3
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M91.3 54.15a.41.41 0 0 0-.58-.07 8.14 8.14 0 0 1-3 1.44.41.41 0 0 0 .16.81c.6-.12 2.09-.6 3.35-1.6.18-.14.21-.4.07-.58Zm-1.78 3.68a.81.81 0 1 1 1.57-.44.81.81 0 0 1-1.57.44Zm6.23-2.16a.81.81 0 1 0 .44 1.56.81.81 0 0 0-.44-1.56Z",
fill: "#1C1F23"
}), /* @__PURE__ */ React71.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M76.82 48.05a5.32 5.32 0 1 0 1.37-10.55 5.32 5.32 0 0 0-1.37 10.55Zm10.68-1.4c-3.39.3-6.26 2.16-7.92 4.81l-1.06-.12c-.36-.04-.74-.1-1.16-.13a15.88 15.88 0 0 0-3.52-.03c-2.47.29-5.09 1.44-7.1 4.76-4.05-1.86-10.53-.9-15.08 5.52l-.05.07.03.07c4.04 8.83 11.93 18.8 28.78 21h.08l.05-.06c.97-1.4 2.09-3.81 2.32-6.51a9.9 9.9 0 0 0-2.93-8.14 15.3 15.3 0 0 0 3.93-7.22 8.75 8.75 0 0 0-.32-4.78c1.46-.01 3.22-.75 4.74-1.9a9.8 9.8 0 0 0 3.37-4.34 8.67 8.67 0 0 0 5.42 2.03h.25l-.13-.2a10.36 10.36 0 0 0-9.7-4.83Z",
fill: "#1C1F23"
}), /* @__PURE__ */ React71.createElement("circle", {
cx: 80.6887,
cy: 61.9553,
r: 6.1823,
transform: "rotate(-4.93845 80.6887 61.9553)",
stroke: "#6B7075"
}), /* @__PURE__ */ React71.createElement("path", {
d: "M174.02 106c-.5 1.8-2.7 5.73-7.47 7.05",
stroke: "var(--semi-color-primary)",
strokeLinecap: "round"
}), /* @__PURE__ */ React71.createElement("path", {
d: "M181.21 110.24c-.87 2.88-4.54 9.14-12.27 11.13",
stroke: "var(--semi-color-primary)",
strokeLinecap: "round"
}));
}
var IllustrationNoAccessDark_default = SvgComponent9;
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationNoAccess.js
var React72 = __toModule(require_react());
var __defProp3 = Object.defineProperty;
var __getOwnPropSymbols2 = Object.getOwnPropertySymbols;
var __hasOwnProp3 = Object.prototype.hasOwnProperty;
var __propIsEnum2 = Object.prototype.propertyIsEnumerable;
var __defNormalProp2 = (obj, key, value) => key in obj ? __defProp3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues2 = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp3.call(b, prop))
__defNormalProp2(a, prop, b[prop]);
if (__getOwnPropSymbols2)
for (var prop of __getOwnPropSymbols2(b)) {
if (__propIsEnum2.call(b, prop))
__defNormalProp2(a, prop, b[prop]);
}
return a;
};
function SvgComponent10(props) {
return /* @__PURE__ */ React72.createElement("svg", __spreadValues2({
width: 200,
height: 200,
viewBox: "0 0 200 200",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React72.createElement("rect", {
width: 200,
height: 200,
fill: "transparent"
}), /* @__PURE__ */ React72.createElement("path", {
d: "M109.53 54.91a40.4 40.4 0 1 1 80.8 0v113.7h-80.8V54.92Z",
fill: "white",
stroke: "#515151"
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M145.5 92.62a9.47 9.47 0 0 0 10.6-8.16l4.36-33.14a9.47 9.47 0 1 0-18.76-2.47l-4.36 33.14a9.47 9.47 0 0 0 8.15 10.63Zm7.52-57.39h.02a14.98 14.98 0 0 1 12.9 16.81l-4.36 33.14a14.98 14.98 0 0 1-16.8 12.9h-.02a14.98 14.98 0 0 1-12.9-16.8l4.36-33.15a14.98 14.98 0 0 1 16.8-12.9Z",
fill: "var(--semi-color-primary)"
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M135.9 60.08c-5.94-.68-11.3 3.42-11.96 9.16l-2.39 20.77c-.66 5.75 3.63 10.96 9.58 11.64l25.85 2.97c5.95.68 11.3-3.42 11.97-9.16l2.38-20.77c.66-5.75-3.63-10.96-9.58-11.64l-25.84-2.97Z",
fill: "var(--semi-color-primary-light-default)"
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M148.62 80.9a4.67 4.67 0 1 0-3.29-.43l-4.17 7.63a1 1 0 0 0 .75 1.47l7.65 1.01a1 1 0 0 0 1.1-1.23l-2.04-8.45Z",
fill: "var(--semi-color-primary)"
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M180.37 95.24a5 5 0 1 0 0-10 5 5 0 0 0 0 10Z",
fill: "#E6E8EA"
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M88.47 52.87h-.04l-.04.02c-.37.23-.83.47-1.36.74l-1.04.54c-.94.5-1.98 1.12-2.93 1.95-1.88 1.63-3.4 4.05-3.2 7.92-2.2.35-5.42 1.34-8.14 3.22-2.78 1.9-5.04 4.74-5.13 8.74v.05l.04.04c4.26 5.01 18.1 12.42 39.5 2.34l.08-.03v-.09c.02-1.7-.4-4.33-1.73-6.7a9.9 9.9 0 0 0-7-5.09c.38-2.17.4-5.4-.79-8.17a8.75 8.75 0 0 0-2.86-3.7 9.83 9.83 0 0 0-5.36-1.78Z",
fill: "#515151"
}), /* @__PURE__ */ React72.createElement("path", {
d: "M33.22 38.73C46.6 47.75 67.28 61.68 75.28 66.8",
stroke: "#EE2F2F",
strokeWidth: 3
}), /* @__PURE__ */ React72.createElement("path", {
d: "M112.1 185.6c-7.72 1.83-19.84 2.4-29.06 1.54-3.13-.24-9.65-1.04-10.76-2.36-1.38-1.64-3.68-6.76-3.94-11.91-.27-5.15 2.03-23.08 3.76-27.51-2.42-.68-8.08-3.12-12.12-5.25a289.8 289.8 0 0 1-11.32-6.28c.25 6.71.04 12.95-1.08 18.14-1.29 5.97-3.75 11.3-5.82 16.06-1.75 4.04-.35 6.49 3.27 9.59 2.57 2.2 6.89 2.95 9.22 4.4.52.35 1.51 1.23 1.53 2.15.02.52-.87 1-2.12 1.4-1.53.5-3.59.87-5.18 1.06-9.37 1.1-29.55 1.64-35.97-1.73-.65-.34-1.68-1.01-.78-6.5 1.71-10.37 7.64-27.22 8.46-32.06 1.02-6.05-1.16-11.92-2.42-16.72-1.26-4.8-3.6-22.67 0-32.82.49-1.39 1.1-2.87 1.81-4.42a71.08 71.08 0 0 1 17.73-23.3c-10.33-7.37-23.14-18.28-24.1-28-.96-9.7 7.85-20.62 16.3-20.16 8.64.46 29.33 12.88 43.22 28.83 4.81-6.9 14.63-8.64 20.7-5.28 3.58 1.98.72 4.5-.5 5.26-.97.62-11.77 12.45-16.78 17.65 5.5 3.46 17.76 10 21.47 19.94 1.3 3.45 1.38 4.95 1.63 8.1.54 6.84 2.57 21.55 2.57 23.95 2.32-3.28 4.7-5.83 9.38-10.66 4.69-4.83 8.49-12.39 9.94-16.94 1.33-4.2 2-8.09 4.46-7.47 2.38.6 2.05 10.5 1.44 15.34 4.25-.33 15.6-.28 22.69 1.63 7.08 1.9 8.24 4.37 8.14 4.97-.1.6-1.36 2.5-10.2 2.2.3 1.02-.04 3.19-3.88 3.75 2.03 1.24 2.2 1.94 2.16 2.67-.03.73-.44 2-4.93 2.58.62.94 1.45 2.37-2.43 3.63-3.89 1.26-9.62.37-9.97.34-1.87 6.27-7.23 18.73-15.8 24.83-5.36 3.81-11.91 3.95-14.22 3.95.66 13.61.25 20.85 2.22 24.47 2.76 5.05 20.35 8.8 11.28 10.94Z",
fill: "white"
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "m78.15 68.61-2-1.23C69.45 63.17 58.55 55.8 48.49 49l-8.92-6.02c-7.1 5.64-8.43 14.8-8.89 21.08 2.23 1.8 4.48 3.48 6.63 5.01a71.08 71.08 0 0 0-17.73 23.3c-2.24 4.84-2.8 6.98-3.43 12 0 7.8 25.31 14.54 50.1 1.19.03.4 6.26 3.8 6.26 3.8l.23 5.49c11.84 0 24.1-5.82 27.4-11.12l-.15-1.33c-.27-2.4-.63-5.54-.74-6.98l-.02-.25c-.23-3-.35-4.5-1.6-7.86C94.3 78.45 84.2 72.29 78.14 68.6Zm-5.78 28.38-6.1 8.57 6.24 3.82c-.14-4-.14-7.65-.14-11.68V97Z",
fill: "#E6E8EA"
}), /* @__PURE__ */ React72.createElement("path", {
d: "M98.6 150.19c.66 13.61.25 20.85 2.22 24.47 2.76 5.05 20.35 8.8 11.28 10.94-7.72 1.83-19.84 2.4-29.06 1.54-3.13-.24-9.65-1.04-10.76-2.36-1.38-1.64-3.68-6.76-3.94-11.91-.27-5.15 2.03-23.08 3.76-27.51m26.5 4.83c2.3 0 8.86-.14 14.22-3.95 8.58-6.1 13.93-18.57 15.8-24.83.35.03 6.08.92 9.97-.34 3.88-1.26 3.05-2.69 2.43-3.63M98.6 150.19c-2.64 0-12.21-.41-19.36-10.08a30.3 30.3 0 0 1-4.4-8.95c-1.47-5.14-2.07-13.49-2.32-21.72m-.42 35.92c1.74-4.44 3.88-3.34 4.6-2.64.71.68 1.58 2.62 0 3.06-1.68.47-4.08-.28-4.6-.42Zm0 0c-2.42-.68-8.08-3.12-12.12-5.25a289.8 289.8 0 0 1-11.32-6.28M28.34 120.1c6.25 5.11 13.95 10 20.32 13.73m0 0c.25 6.71.04 12.95-1.08 18.14-1.29 5.97-3.75 11.3-5.82 16.06-1.75 4.04-.35 6.49 3.27 9.59 2.57 2.2 6.89 2.95 9.22 4.4.52.35 1.51 1.23 1.53 2.15.02.52-.87 1-2.12 1.4m-5.9-123.86a65.01 65.01 0 0 0-10.45 7.37m16.35 116.5c-1.53.48-3.59.86-5.18 1.05-9.37 1.1-29.55 1.64-35.97-1.73-.65-.34-1.68-1.01-.78-6.5 1.71-10.37 7.64-27.22 8.46-32.06 1.02-6.05-1.16-11.92-2.42-16.72-1.26-4.8-3.6-22.67 0-32.82.49-1.39 1.1-2.87 1.81-4.42a71.08 71.08 0 0 1 17.73-23.3m16.35 116.5c.16-1.9-1.37-4.1-4.73-3.82M37.3 69.08c-10.33-7.37-23.14-18.28-24.1-28-.96-9.7 7.85-20.62 16.3-20.16 8.64.46 29.33 12.88 43.22 28.83 4.81-6.9 14.63-8.64 20.7-5.28 3.58 1.98.72 4.5-.5 5.26-.97.62-11.77 12.45-16.78 17.65m0 0C65.7 60.8 44.98 46.54 33.2 38.73m42.95 28.65c5.5 3.46 17.76 10 21.47 19.94 1.3 3.45 1.38 4.95 1.63 8.1.54 6.84 2.57 21.55 2.57 23.95m0 0c0 1.85.77 8.03-1.87 8.03-2.44 0-.4-4.93 1.87-8.03Zm0 0c2.32-3.28 4.7-5.83 9.38-10.66 4.69-4.83 8.49-12.39 9.94-16.94 1.33-4.2 2-8.09 4.46-7.47 2.38.6 2.05 10.5 1.44 15.34m0 0-2.66.26m2.66-.26c4.25-.33 15.6-.28 22.69 1.63 7.08 1.9 8.24 4.37 8.14 4.97-.1.6-1.36 2.5-10.2 2.2m0 0c-7.62-.25-10.66-1.56-10.76-2.11-.1-.55 2.82-1.1 5.38-.6 2.56.5 5.03 1.36 5.38 2.72Zm0 0c.3 1.02-.04 3.19-3.88 3.75m0 0c-4.8.7-5.63.28-5.67 0-.03-.29 3.98-.83 5.67 0Zm0 0c2.03 1.24 2.2 1.94 2.16 2.67-.03.73-.44 2-4.93 2.58m0 0c-4.49.57-4.59-.63-3.33-.88 1.26-.24 2.97.41 3.33.88ZM72.38 89.58 72.36 97m0 0-6.1 8.57 6.26 3.87M72.36 97c0 3.8.03 8.1.16 12.44",
stroke: "#515151"
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M72.23 97.11v-7l-.3.33a12.64 12.64 0 0 0-2.98 10.24l.14.87 3.14-4.44Z",
fill: "#515151"
}), /* @__PURE__ */ React72.createElement("path", {
d: "M48.62 148.14c-.87-9.7-11.15-14.82-18.68-26.25 7.45 5.14 13.85 8.6 19.21 11.73 0 0-.08 9.49-.53 14.52Z",
fill: "#515151"
}), /* @__PURE__ */ React72.createElement("path", {
d: "M97.1 56a8.64 8.64 0 0 1-7.94 9.29c-4.8.42-9-3.1-9.41-7.79a8.64 8.64 0 0 1 7.94-9.29c4.8-.41 9 3.1 9.41 7.8Z",
fill: "white",
stroke: "#515151",
strokeWidth: 3
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M91.3 54.15a.41.41 0 0 0-.58-.07 8.14 8.14 0 0 1-3 1.44.41.41 0 1 0 .16.8c.6-.11 2.09-.6 3.35-1.59.18-.14.21-.4.07-.58Zm-1.78 3.68a.81.81 0 1 1 1.57-.44.81.81 0 0 1-1.57.44Zm6.23-2.16a.81.81 0 1 0 .44 1.56.81.81 0 0 0-.44-1.56Z",
fill: "#515151"
}), /* @__PURE__ */ React72.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M76.82 48.05a5.32 5.32 0 1 0 1.37-10.55 5.32 5.32 0 0 0-1.37 10.55Zm10.68-1.4c-3.39.3-6.26 2.16-7.92 4.81l-1.06-.12c-.36-.04-.74-.1-1.16-.13a15.88 15.88 0 0 0-3.52-.03c-2.47.29-5.09 1.44-7.1 4.76-4.05-1.86-10.53-.9-15.08 5.52l-.05.07.03.07c4.04 8.83 11.93 18.8 28.78 21h.08l.05-.06c.97-1.4 2.09-3.81 2.32-6.51a9.9 9.9 0 0 0-2.93-8.14 15.3 15.3 0 0 0 3.93-7.22 8.75 8.75 0 0 0-.32-4.78c1.46-.01 3.22-.75 4.74-1.9a9.8 9.8 0 0 0 3.37-4.34 8.67 8.67 0 0 0 5.42 2.03h.25l-.13-.2a10.36 10.36 0 0 0-9.7-4.83Z",
fill: "#515151"
}), /* @__PURE__ */ React72.createElement("circle", {
cx: 80.6886,
cy: 61.9548,
r: 6.1823,
transform: "rotate(-4.93845 80.6886 61.9548)",
stroke: "#C6CACD"
}), /* @__PURE__ */ React72.createElement("path", {
d: "M174.02 106c-.5 1.8-2.7 5.73-7.47 7.05",
stroke: "var(--semi-color-primary)",
strokeLinecap: "round"
}), /* @__PURE__ */ React72.createElement("path", {
d: "M181.21 110.24c-.87 2.88-4.54 9.14-12.27 11.13",
stroke: "var(--semi-color-primary)",
strokeLinecap: "round"
}));
}
var IllustrationNoAccess_default = SvgComponent10;
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationNoContentDark.js
var React73 = __toModule(require_react());
var __defProp4 = Object.defineProperty;
var __getOwnPropSymbols3 = Object.getOwnPropertySymbols;
var __hasOwnProp4 = Object.prototype.hasOwnProperty;
var __propIsEnum3 = Object.prototype.propertyIsEnumerable;
var __defNormalProp3 = (obj, key, value) => key in obj ? __defProp4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues3 = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp4.call(b, prop))
__defNormalProp3(a, prop, b[prop]);
if (__getOwnPropSymbols3)
for (var prop of __getOwnPropSymbols3(b)) {
if (__propIsEnum3.call(b, prop))
__defNormalProp3(a, prop, b[prop]);
}
return a;
};
function SvgComponent11(props) {
return /* @__PURE__ */ React73.createElement("svg", __spreadValues3({
width: 200,
height: 200,
viewBox: "0 0 200 200",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React73.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "m123.17 114.66-.2-.18-34.6 27.1.46-.04c10.03-.9 16.71-.38 18.79 0l.1.02 15.45-26.9Z",
fill: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("rect", {
x: 67.706,
y: 73.871,
width: 55.6333,
height: 39.8004,
fill: "#C6CACD",
stroke: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("path", {
d: "m49.97 136.5 17.7-22.44h55.44l-17.7 22.45H49.97Z",
fill: "#888D92",
stroke: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M101.67 78.57H75.75v21.45h18.77v6.25h14.6v-13.7h-7.45v-14Z",
fill: "#888D92"
}), /* @__PURE__ */ React73.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M76.66 79.43h24.26v13.14h-6.4v6.65H76.66v-19.8Zm17.86 20.62H75.74V78.6h26.01v13.97h7.36v13.7h-14.6v-6.22Zm7.23-6.65h6.54v12.05H95.34v-5.4h6.41V93.4Zm-.83 0v5.82h-5.58V93.4h5.58Z",
fill: "#C6CACD"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M43.29 174.89h-9.78c4.19-1.22 4.04-11.99 3.44-17.22.89 5.73 4.6 13.87 6.34 17.22Z",
fill: "#1C1F23",
stroke: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M75.93 40.59a32.78 32.78 0 1 1-65.56 0 32.78 32.78 0 0 1 65.56 0Z",
fill: "var(--semi-color-primary)",
fillOpacity: 0.2
}), /* @__PURE__ */ React73.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M47.56 25.12a4.4 4.4 0 0 0-8.82 0v11.06H27.68a4.4 4.4 0 0 0 0 8.82h11.06v11.06a4.4 4.4 0 0 0 8.82 0V45h11.06a4.4 4.4 0 1 0 0-8.82H47.56V25.12Z",
fill: "var(--semi-color-primary)"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M63.82 83.33C59.3 81.5 50.3 75.37 50.44 65.54",
stroke: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M52.59 110.23c2.88.1 6.5.91 9.97 4.88 2.48 2.84 4.67 7.21 7.45 14.5a73.5 73.5 0 0 1 4.27-16.32c1.2-3.07 5.29-10.25 9.35-10.52 4.06-.26 4.47 3.57 2.57 4.65-1.9 1.08-3 .96-4.8 3.41-1.77 2.46-2.95 4.95-2 11.34.72-2.94 1.76-4.59 2.77-5.7 1-1.13 8.8-8.07 14.36-8.36 3.86-.2 5.2.7 4.78 1.73a9.27 9.27 0 0 1 4.08-.32c2.08.4 2.78 1.9 1.83 3.17 2.19-.16 4.28.23 5.36 1.84.33.49.24 1.64-.56 2.59-.77.91-2.25 1.63-2.83 1.94-1.2.63-5.94 3.72-7.35 8.1-1.41 4.4-2.73 7.47 3.46 20.83 4.71 10.16 5.64 21.33 1.87 29.6 8.96-.27 16.89-2.14 22.02-5.04 4.39-2.48 8.27-5.5 10.39-10.5-2.33-19.66-2.27-57.26.91-57.43 4.5-.23 1.73 48 0 54.7a19.5 19.5 0 0 1-.91 2.72c.67 5.67 1.54 9.84 2.59 11.2 1.7 2.19 40.44 4.76 50.2 1.59 1.28-.41 2.07-.93 2.2-1.55 1.02-4.54-14.79-8.26-20.87-13.96-4.19-3.91-2.77-32.42-4.97-50.45-2.2-18.04-7.9-36.48-25.26-40.71-13.62-3.33-24.98 1.73-30.14 5.64H85.62c2.71-5.6 10.46-16.06 26.4-19.18 19.26-3.78 36.18 5.19 46.96 17.46 4.95 5.25 7.75 8.71 9.23 8.71 1.48 0 9.22-4.68 17.6-5.22 2.5-.16 2.46 2.64 1.19 6.8a30.9 30.9 0 0 1-2.09 5.07c-2.44 4.94-7.83 14.3-16.18 21.42 2.2 18.04.78 46.55 4.97 50.46 6.08 5.7 21.89 9.42 20.88 13.96-.14.62-.93 1.14-2.2 1.55-9.77 3.17-48.51.6-50.21-1.59-1.05-1.36-1.92-5.53-2.6-11.2-2.1 5.02-5.99 8.03-10.38 10.51-5.13 2.9-13.06 4.77-22.02 5.05a20.4 20.4 0 0 1-5.01 6.87c-9 7.98-28.99 11.67-47.77 1.67-9.57-5.08-14.72-17.62-17.5-30.17v.06c.85 8.92 1.34 14.13-2.18 18.52a49.9 49.9 0 0 1-19.58-1.92c-5.22-1.61-12.91-8.31-8.38-22.61 4.54-14.3 27.98-32.78 30.14-34.21 2.15-1.44 7.96-5.58 15.7-5.58Z",
fill: "#C6CACD"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M70.01 129.61c-1.78 10.7.14 28.07 3.33 27.29 1-.25 1.57-1.58 1.67-3.9 7.16.34 27.77 7.99 34.47 11.8.15 4.62-.59 9.01-2.31 12.8a20.38 20.38 0 0 1-5.01 6.87c-9 7.98-28.99 11.67-47.77 1.67-9.57-5.09-14.72-17.62-17.5-30.17v.06c.85 8.92 1.34 14.13-2.18 18.52a49.9 49.9 0 0 1-19.58-1.92c-5.22-1.61-12.91-8.31-8.38-22.61 4.54-14.3 27.98-32.78 30.14-34.21 2.15-1.44 7.96-5.58 15.7-5.58 2.88.1 6.5.91 9.97 4.88 2.48 2.84 4.67 7.21 7.45 14.5Z",
fill: "#888D92"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M105.3 148c4.71 10.15 5.64 21.32 1.87 29.6 8.96-.28 16.89-2.15 22.02-5.05 4.39-2.48 8.27-5.5 10.39-10.5-2.33-19.66-2.27-57.26.91-57.43 4.5-.23 1.73 48 0 54.7a19.5 19.5 0 0 1-.91 2.72c.67 5.67 1.54 9.84 2.59 11.2 1.7 2.19 40.44 4.76 50.2 1.59 1.28-.41 2.07-.93 2.2-1.55 1.02-4.54-14.79-8.26-20.87-13.96-4.19-3.91-2.77-32.42-4.97-50.45-2.2-18.04-7.9-36.48-25.26-40.71-13.62-3.33-24.98 1.73-30.14 5.64h10.17v39.9l-16 27.8-4.96-.07a86.47 86.47 0 0 0 2.76 6.56Z",
fill: "#C6CACD"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M70.01 129.61c5.5 16.51 6.26 26.57 3.33 27.29-3.2.78-5.1-16.59-3.33-27.29Zm0 0c-2.78-7.29-4.97-11.66-7.45-14.5-3.46-3.97-7.09-4.79-9.97-4.88-7.74 0-13.55 4.14-15.7 5.58-2.16 1.43-25.6 19.9-30.14 34.2-4.53 14.3 3.16 21 8.38 22.62 6.19 1.92 12.5 2.54 19.58 1.92 3.53-4.4 3.03-9.62 2.18-18.58M70 129.61a73.5 73.5 0 0 1 4.27-16.32c1.2-3.07 5.29-10.25 9.35-10.52 4.06-.26 4.47 3.57 2.57 4.65-1.9 1.08-3 .96-4.8 3.41-1.77 2.46-2.95 4.95-2 11.34.72-2.94 1.76-4.59 2.77-5.7 1-1.13 8.8-8.07 14.36-8.36 5.57-.29 5.88 1.73 3.28 3.08-2.6 1.34-7.62 2.6-14.34 12.16 0 0-.6-5.24 10-11.04 2.88-1.57 7-3.36 9.92-2.8 3.14.62 3.12 3.7-.94 4.81a15.88 15.88 0 0 0-5.09 2.92 30.45 30.45 0 0 0-5.78 6.54c.43-3.53 4.31-8.52 8.96-10.08 3.21-1.08 8.15-1.98 10.04.83.33.49.24 1.64-.56 2.59-.77.91-2.25 1.63-2.83 1.94-1.2.63-5.94 3.72-7.35 8.1-1.15 3.57-2.23 6.26.7 14.27m-68.88-15.17c.08 5.48.55 17.6 3.23 29.71m0 0c2.78 12.55 7.93 25.09 17.5 30.17 18.78 10 38.78 6.3 47.77-1.67a20.4 20.4 0 0 0 5-6.87m0 0c3.78-8.28 2.85-19.45-1.86-29.6a86.47 86.47 0 0 1-2.76-6.57m4.63 36.17c8.96-.28 16.89-2.15 22.02-5.05 4.39-2.48 8.27-5.5 10.39-10.5m29.15-53.19c2.2 18.04.78 46.55 4.97 50.46 6.08 5.7 21.89 9.42 20.88 13.96-.14.62-.93 1.14-2.2 1.55m-23.65-65.97c-2.2-18.03-7.9-36.47-25.26-40.7-13.62-3.33-24.98 1.73-30.14 5.64m55.4 35.06c8.35-7.12 13.74-16.48 16.18-21.42 1-2 1.57-3.36 2.09-5.07m5.38 92.46c-9.77 3.17-48.51.6-50.21-1.59-1.05-1.36-1.92-5.53-2.6-11.2m52.8 12.79c-.42-2.92-1.24-3.56-4.8-4.6M187 82.37c1.27-4.16 1.3-6.96-1.19-6.8-8.38.54-16.12 5.22-17.6 5.22-1.49 0-4.28-3.46-9.23-8.7-10.78-12.28-27.7-21.25-46.96-17.47-15.94 3.12-23.69 13.58-26.4 19.18h27.7M187 82.37c.01-1 .15-2.07-.43-2.74-1.77-2.02-5.89-2.07-6.46 1.98m-66.79-7.81h10.18v39.9l-16 27.8-4.96-.07m37.04 20.61c-2.33-19.65-2.27-57.25.91-57.42 4.5-.23 1.73 48 0 54.7a19.5 19.5 0 0 1-.91 2.72Z",
stroke: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M58.12 104.22A10.5 10.5 0 0 1 47.7 114.8a10.5 10.5 0 0 1-10.43-10.58A10.5 10.5 0 0 1 47.7 93.65a10.5 10.5 0 0 1 10.43 10.57Z",
fill: "#C6CACD",
stroke: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("mask", {
id: "path-15-inside-1",
fill: "white"
}, /* @__PURE__ */ React73.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M49.01 93.79c6.18.59 4.56 12.3.6 17.58-2.89 3.82-1.18 7.13.9 11.15a77 77 0 0 1 1.28 2.56 17.5 17.5 0 0 1 3.1 9.92c0 10.25-8.96 18.55-20 18.55S14.9 145.25 14.9 135c0-7.89 5.3-14.63 12.79-17.31 7.3-4.04 9.58-8.08 9.85-15.11.24-6.1 5.3-9.38 11.47-8.79Z"
})), /* @__PURE__ */ React73.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M49.01 93.79c6.18.59 4.56 12.3.6 17.58-2.89 3.82-1.18 7.13.9 11.15a77 77 0 0 1 1.28 2.56 17.5 17.5 0 0 1 3.1 9.92c0 10.25-8.96 18.55-20 18.55S14.9 145.25 14.9 135c0-7.89 5.3-14.63 12.79-17.31 7.3-4.04 9.58-8.08 9.85-15.11.24-6.1 5.3-9.38 11.47-8.79Z",
fill: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("path", {
d: "m49.6 111.37 2.4 1.8-2.4-1.8Zm-.59-17.58-.28 2.99.28-2.99Zm1.5 28.73 2.67-1.38-2.67 1.38Zm1.28 2.56-2.71 1.28.1.21.13.2 2.48-1.69Zm-24.1-7.4 1.01 2.83.23-.08.2-.12-1.44-2.62Zm9.85-15.1 3 .11-3-.11ZM52 113.18c2.4-3.2 3.97-8.06 4.11-12.25.08-2.1-.2-4.37-1.18-6.27a6.93 6.93 0 0 0-5.63-3.86l-.57 5.98c.4.03.63.16.88.64.32.63.56 1.74.5 3.3-.1 3.13-1.34 6.76-2.9 8.84l4.79 3.61Zm1.18 7.96c-1.1-2.12-1.8-3.53-2.03-4.8-.18-1-.08-1.94.85-3.17l-4.8-3.6a9.65 9.65 0 0 0-1.95 7.83c.42 2.34 1.61 4.6 2.6 6.5l5.33-2.76Zm1.33 2.66c-.45-.94-.91-1.84-1.33-2.66l-5.34 2.76c.43.82.85 1.63 1.24 2.46l5.43-2.56Zm-5.2 2.97A14.5 14.5 0 0 1 51.9 135h6a20.5 20.5 0 0 0-3.62-11.61l-4.96 3.38ZM51.9 135c0 8.38-7.4 15.55-17 15.55v6c12.49 0 23-9.44 23-21.55h-6Zm-17 15.55c-9.6 0-16.99-7.17-16.99-15.55h-6c0 12.11 10.51 21.55 23 21.55v-6ZM17.9 135c0-6.47 4.36-12.18 10.8-14.49l-2.03-5.65C18.15 117.92 11.9 125.7 11.9 135h6Zm16.64-32.54c-.12 3.22-.7 5.4-1.82 7.2-1.15 1.8-3.07 3.51-6.49 5.4l2.9 5.25c3.9-2.14 6.77-4.47 8.65-7.45 1.9-3 2.61-6.35 2.76-10.17l-6-.23ZM49.3 90.8c-3.67-.34-7.25.43-10.02 2.46a11.64 11.64 0 0 0-4.74 9.2l6 .23a5.65 5.65 0 0 1 2.28-4.59c1.36-1 3.4-1.56 5.91-1.32l.57-5.98Z",
fill: "#1C1F23",
mask: "url(#path-15-inside-1)"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M54.1 105.95c0 1.69-1.43 3.1-3.24 3.1-1.8 0-3.24-1.41-3.24-3.1 0-1.7 1.43-3.1 3.24-3.1 1.8 0 3.24 1.4 3.24 3.1Z",
fill: "#C6CACD",
stroke: "#1C1F23"
}), /* @__PURE__ */ React73.createElement("path", {
d: "M37.12 95.07a3.46 3.46 0 0 1-3.53 3.39c-2 0-3.54-1.56-3.54-3.4a3.46 3.46 0 0 1 3.54-3.38c1.99 0 3.53 1.55 3.53 3.39Z",
fill: "#1C1F23",
stroke: "#1C1F23",
strokeWidth: 3
}), /* @__PURE__ */ React73.createElement("path", {
d: "M147.22 155.65c-.1 3.58 1.27 4.88 4.7 6.08",
stroke: "#1C1F23"
}));
}
var IllustrationNoContentDark_default = SvgComponent11;
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationNoContent.js
var React74 = __toModule(require_react());
var __defProp5 = Object.defineProperty;
var __getOwnPropSymbols4 = Object.getOwnPropertySymbols;
var __hasOwnProp5 = Object.prototype.hasOwnProperty;
var __propIsEnum4 = Object.prototype.propertyIsEnumerable;
var __defNormalProp4 = (obj, key, value) => key in obj ? __defProp5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues4 = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp5.call(b, prop))
__defNormalProp4(a, prop, b[prop]);
if (__getOwnPropSymbols4)
for (var prop of __getOwnPropSymbols4(b)) {
if (__propIsEnum4.call(b, prop))
__defNormalProp4(a, prop, b[prop]);
}
return a;
};
function SvgComponent12(props) {
return /* @__PURE__ */ React74.createElement("svg", __spreadValues4({
width: 200,
height: 200,
viewBox: "0 0 200 200",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
focusable: false,
"aria-hidden": true
}, props), /* @__PURE__ */ React74.createElement("rect", {
width: 200,
height: 200,
fill: "transparent"
}), /* @__PURE__ */ React74.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "m123.17 114.66-.2-.18-34.6 27.1.46-.04c10.03-.9 16.71-.38 18.79 0l.1.02 15.45-26.9Z",
fill: "#515151"
}), /* @__PURE__ */ React74.createElement("rect", {
x: 67.706,
y: 73.871,
width: 55.6333,
height: 39.8004,
fill: "white",
stroke: "#515151"
}), /* @__PURE__ */ React74.createElement("path", {
d: "m49.97 136.5 17.7-22.44h55.44l-17.7 22.45H49.97Z",
fill: "#E6E8EA",
stroke: "#515151"
}), /* @__PURE__ */ React74.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M101.67 78.57H75.75v21.45h18.77v6.25h14.6v-13.7h-7.45v-14Z",
fill: "#C6CACD"
}), /* @__PURE__ */ React74.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M76.66 79.43h24.26v13.14h-6.4v6.65H76.66v-19.8Zm17.86 20.62H75.74V78.6h26.01v13.97h7.36v13.7h-14.6v-6.22Zm7.23-6.65h6.54v12.05H95.34v-5.4h6.41V93.4Zm-.83 0v5.82h-5.58V93.4h5.58Z",
fill: "white"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M43.29 174.89H33.5c4.19-1.22 4.04-11.99 3.44-17.22.88 5.73 4.6 13.87 6.34 17.22Z",
fill: "#515151",
stroke: "black"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M75.93 40.59a32.78 32.78 0 1 1-65.56 0 32.78 32.78 0 0 1 65.56 0Z",
fill: "var(--semi-color-primary-light-default)"
}), /* @__PURE__ */ React74.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M47.56 25.12a4.4 4.4 0 0 0-8.82 0v11.06H27.68a4.4 4.4 0 0 0 0 8.82h11.06v11.06a4.4 4.4 0 0 0 8.82 0V45h11.06a4.4 4.4 0 0 0 0-8.82H47.56V25.12Z",
fill: "var(--semi-color-primary)"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M63.82 83.33c-4.52-1.84-13.53-7.96-13.38-17.79",
stroke: "#515151"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M52.59 110.23c2.88.1 6.5.91 9.97 4.88 2.48 2.84 4.67 7.21 7.45 14.5a73.53 73.53 0 0 1 4.27-16.32c1.2-3.07 5.29-10.25 9.35-10.52 4.06-.26 4.47 3.57 2.57 4.65-1.9 1.08-3 .96-4.8 3.41-1.77 2.46-2.95 4.95-2 11.34.72-2.94 1.76-4.59 2.77-5.71 1-1.12 8.8-8.06 14.36-8.35 3.86-.2 5.2.7 4.78 1.73a9.27 9.27 0 0 1 4.08-.33c2.08.41 2.78 1.9 1.83 3.18 2.19-.16 4.28.23 5.36 1.84.33.49.24 1.64-.56 2.58-.77.92-2.25 1.64-2.83 1.95-1.2.63-5.94 3.72-7.35 8.1-1.41 4.4-2.73 7.47 3.46 20.83 4.71 10.16 5.64 21.33 1.87 29.6 8.96-.27 16.89-2.14 22.02-5.04 4.39-2.48 8.27-5.5 10.39-10.5-2.33-19.66-2.27-57.26.91-57.43 4.5-.23 1.73 48 0 54.7a19.5 19.5 0 0 1-.91 2.72c.67 5.67 1.54 9.84 2.59 11.2 1.7 2.19 40.44 4.76 50.2 1.59 1.28-.42 2.07-.93 2.2-1.55 1.02-4.54-14.79-8.26-20.87-13.96-4.19-3.91-2.77-32.42-4.97-50.45-2.2-18.04-7.9-36.48-25.26-40.71-13.62-3.33-24.98 1.73-30.14 5.64H85.62c2.71-5.6 10.46-16.06 26.4-19.18 19.26-3.78 36.18 5.19 46.96 17.46 4.95 5.24 7.75 8.71 9.23 8.71 1.48 0 9.22-4.68 17.6-5.22 2.5-.16 2.46 2.64 1.19 6.8a30.8 30.8 0 0 1-2.09 5.07c-2.44 4.94-7.84 14.3-16.18 21.42 2.2 18.04.78 46.55 4.97 50.46 6.08 5.7 21.89 9.42 20.88 13.96-.14.62-.93 1.13-2.2 1.55-9.77 3.17-48.51.6-50.21-1.59-1.05-1.36-1.92-5.53-2.6-11.2-2.1 5.01-5.99 8.03-10.38 10.51-5.13 2.9-13.06 4.77-22.02 5.05a20.37 20.37 0 0 1-5.01 6.87c-9 7.98-28.99 11.67-47.77 1.67-9.57-5.09-14.72-17.62-17.5-30.17v.06c.85 8.92 1.34 14.13-2.18 18.52a49.9 49.9 0 0 1-19.58-1.92c-5.22-1.61-12.91-8.31-8.38-22.61 4.54-14.3 27.98-32.78 30.14-34.21 2.15-1.44 7.96-5.58 15.7-5.58Z",
fill: "white"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M70.01 129.61c-1.78 10.7.14 28.07 3.33 27.29 1-.25 1.57-1.58 1.67-3.9 7.16.34 27.77 7.99 34.47 11.8.15 4.62-.59 9.01-2.31 12.8a20.38 20.38 0 0 1-5.01 6.87c-9 7.98-28.99 11.67-47.77 1.67-9.57-5.09-14.72-17.62-17.5-30.17v.06c.85 8.92 1.34 14.13-2.18 18.52a49.9 49.9 0 0 1-19.58-1.92c-5.22-1.61-12.91-8.31-8.38-22.61 4.54-14.3 27.98-32.78 30.14-34.21 2.15-1.44 7.96-5.58 15.7-5.58 2.88.1 6.5.91 9.97 4.88 2.48 2.84 4.67 7.21 7.45 14.5Z",
fill: "#E6E8EA"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M105.3 148c4.71 10.15 5.64 21.32 1.87 29.6 8.96-.28 16.89-2.15 22.02-5.05 4.39-2.48 8.27-5.5 10.39-10.5-2.33-19.66-2.27-57.26.91-57.43 4.5-.23 1.73 48 0 54.7a19.5 19.5 0 0 1-.91 2.72c.67 5.67 1.54 9.84 2.59 11.2 1.7 2.19 40.44 4.76 50.2 1.59 1.28-.41 2.07-.93 2.2-1.55 1.02-4.54-14.79-8.26-20.87-13.96-4.19-3.91-2.77-32.42-4.97-50.45-2.2-18.04-7.9-36.48-25.26-40.71-13.62-3.33-24.98 1.73-30.14 5.64h10.17v39.9l-16 27.8-4.96-.07a86.47 86.47 0 0 0 2.76 6.56Z",
fill: "white",
className: ""
}), /* @__PURE__ */ React74.createElement("path", {
d: "M70.01 129.61c5.5 16.51 6.26 26.57 3.33 27.29-3.2.78-5.1-16.59-3.33-27.29Zm0 0c-2.78-7.29-4.97-11.66-7.45-14.5-3.46-3.97-7.09-4.79-9.97-4.88-7.74 0-13.55 4.14-15.7 5.58-2.16 1.43-25.6 19.9-30.14 34.2-4.53 14.3 3.16 21 8.38 22.62 6.19 1.92 12.5 2.54 19.58 1.92 3.53-4.4 3.03-9.62 2.18-18.58M70 129.61a73.5 73.5 0 0 1 4.27-16.32c1.2-3.07 5.29-10.25 9.35-10.52 4.06-.26 4.47 3.57 2.57 4.65-1.9 1.08-3 .96-4.8 3.41-1.77 2.46-2.95 4.95-2 11.34.72-2.94 1.76-4.59 2.77-5.7 1-1.13 8.8-8.07 14.36-8.36 5.57-.29 5.88 1.73 3.28 3.08-2.6 1.34-7.62 2.6-14.34 12.16 0 0-.6-5.24 10-11.04 2.88-1.57 7-3.36 9.92-2.8 3.14.62 3.12 3.7-.94 4.81a15.88 15.88 0 0 0-5.09 2.92 30.45 30.45 0 0 0-5.78 6.54c.43-3.53 4.31-8.52 8.96-10.08 3.21-1.08 8.15-1.98 10.04.83.33.49.24 1.64-.56 2.59-.77.91-2.25 1.63-2.83 1.94-1.2.63-5.94 3.72-7.35 8.1-1.15 3.57-2.23 6.26.7 14.27m-68.88-15.17c.08 5.48.55 17.6 3.23 29.71m0 0c2.78 12.55 7.93 25.09 17.5 30.17 18.78 10 38.78 6.3 47.77-1.67a20.4 20.4 0 0 0 5-6.87m0 0c3.78-8.28 2.85-19.45-1.86-29.6a86.47 86.47 0 0 1-2.76-6.57m4.63 36.17c8.96-.28 16.89-2.15 22.02-5.05 4.39-2.48 8.27-5.5 10.39-10.5m29.15-53.19c2.2 18.04.78 46.55 4.97 50.46 6.08 5.7 21.89 9.42 20.88 13.96-.14.62-.93 1.14-2.2 1.55m-23.65-65.97c-2.2-18.03-7.9-36.47-25.26-40.7-13.62-3.33-24.98 1.73-30.14 5.64m55.4 35.06c8.35-7.12 13.74-16.48 16.18-21.42 1-2 1.57-3.36 2.09-5.07m5.38 92.46c-9.77 3.17-48.51.6-50.21-1.59-1.05-1.36-1.92-5.53-2.6-11.2m52.8 12.79c-.42-2.92-1.24-3.56-4.8-4.6M187 82.37c1.27-4.16 1.3-6.96-1.19-6.8-8.38.54-16.12 5.22-17.6 5.22-1.49 0-4.28-3.46-9.23-8.7-10.78-12.28-27.7-21.25-46.96-17.47-15.94 3.12-23.69 13.58-26.4 19.18h27.7M187 82.37c.01-1 .15-2.07-.43-2.74-1.77-2.02-5.89-2.07-6.46 1.98m-66.79-7.81h10.18v39.9l-16 27.8-4.96-.07m37.04 20.61c-2.33-19.65-2.27-57.25.91-57.42 4.5-.23 1.73 48 0 54.7a19.5 19.5 0 0 1-.91 2.72Z",
stroke: "#1C1F23"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M58.12 104.22A10.5 10.5 0 0 1 47.7 114.8a10.5 10.5 0 0 1-10.43-10.58A10.5 10.5 0 0 1 47.7 93.65a10.5 10.5 0 0 1 10.43 10.57Z",
fill: "white",
stroke: "#515151"
}), /* @__PURE__ */ React74.createElement("mask", {
id: "path-16-inside-1",
fill: "white"
}, /* @__PURE__ */ React74.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M49.01 93.79c6.18.59 4.56 12.3.6 17.58-2.89 3.82-1.18 7.13.9 11.15a77 77 0 0 1 1.28 2.56 17.5 17.5 0 0 1 3.1 9.92c0 10.25-8.96 18.55-20 18.55S14.9 145.25 14.9 135c0-7.89 5.3-14.63 12.79-17.31 7.3-4.04 9.58-8.08 9.85-15.11.24-6.1 5.3-9.38 11.47-8.79Z"
})), /* @__PURE__ */ React74.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M49.01 93.79c6.18.59 4.56 12.3.6 17.58-2.89 3.82-1.18 7.13.9 11.15a77 77 0 0 1 1.28 2.56 17.5 17.5 0 0 1 3.1 9.92c0 10.25-8.96 18.55-20 18.55S14.9 145.25 14.9 135c0-7.89 5.3-14.63 12.79-17.31 7.3-4.04 9.58-8.08 9.85-15.11.24-6.1 5.3-9.38 11.47-8.79Z",
fill: "#515151"
}), /* @__PURE__ */ React74.createElement("path", {
d: "m49.6 111.37 2.4 1.8-2.4-1.8Zm-.59-17.58-.28 2.99.28-2.99Zm1.5 28.73 2.67-1.38-2.67 1.38Zm1.28 2.56-2.71 1.28.1.21.13.2 2.48-1.69Zm-24.1-7.4 1.01 2.83.23-.08.2-.12-1.44-2.62Zm9.85-15.1-3-.12 3 .12ZM52 113.18c2.4-3.2 3.97-8.06 4.11-12.25.08-2.1-.2-4.37-1.18-6.27a6.93 6.93 0 0 0-5.63-3.86l-.57 5.98c.4.03.63.16.88.64.32.63.56 1.74.5 3.3-.1 3.13-1.34 6.76-2.9 8.84l4.79 3.61Zm1.18 7.96c-1.1-2.12-1.8-3.53-2.03-4.8-.18-1-.08-1.94.85-3.17l-4.8-3.6a9.65 9.65 0 0 0-1.96 7.83c.43 2.34 1.62 4.6 2.6 6.5l5.34-2.76Zm1.33 2.66c-.45-.94-.91-1.84-1.33-2.66l-5.34 2.76c.43.82.85 1.63 1.24 2.46l5.43-2.56Zm-5.2 2.97a14.51 14.51 0 0 1 2.57 8.23h6a20.5 20.5 0 0 0-3.61-11.61l-4.96 3.38Zm2.57 8.23c0 8.38-7.39 15.55-16.99 15.55v6c12.49 0 23-9.44 23-21.55h-6ZM34.9 150.55c-9.6 0-16.99-7.17-16.99-15.55h-6c0 12.11 10.51 21.55 23 21.55v-6ZM17.9 135c0-6.47 4.36-12.18 10.8-14.49l-2.03-5.65C18.15 117.92 11.9 125.7 11.9 135h6Zm16.64-32.54c-.12 3.22-.7 5.4-1.82 7.2-1.15 1.8-3.07 3.51-6.49 5.4l2.9 5.25c3.9-2.14 6.77-4.47 8.65-7.45 1.9-3 2.61-6.35 2.76-10.17l-6-.23ZM49.3 90.8c-3.67-.34-7.25.43-10.02 2.46a11.64 11.64 0 0 0-4.74 9.2l6 .23a5.65 5.65 0 0 1 2.28-4.59c1.36-1 3.4-1.56 5.91-1.32l.57-5.98Z",
fill: "#515151",
mask: "url(#path-16-inside-1)"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M54.1 105.95c0 1.69-1.43 3.1-3.24 3.1-1.81 0-3.24-1.41-3.24-3.1 0-1.7 1.43-3.1 3.24-3.1 1.8 0 3.24 1.4 3.24 3.1Z",
fill: "white",
stroke: "#515151"
}), /* @__PURE__ */ React74.createElement("path", {
d: "M37.12 95.07a3.46 3.46 0 0 1-3.53 3.39c-2 0-3.54-1.56-3.54-3.4a3.46 3.46 0 0 1 3.54-3.38c1.99 0 3.53 1.55 3.53 3.39Z",
fill: "#515151",
stroke: "#515151",
strokeWidth: 3
}), /* @__PURE__ */ React74.createElement("path", {
d: "M147.22 155.65c-.1 3.58 1.27 4.88 4.7 6.08",
stroke: "#515151"
}));
}
var IllustrationNoContent_default = SvgComponent12;
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationNoResultDark.js
var React75 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationNoResult.js
var React76 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationNotFoundDark.js
var React77 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationNotFound.js
var React78 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationSuccessDark.js
var React79 = __toModule(require_react());
// node_modules/@douyinfe/semi-illustrations/lib/es/illustrations/IllustrationSuccess.js
var React80 = __toModule(require_react());
// src/views/components/list_view.tsx
var import_react59 = __toModule(require_react());
var import_react_infinite_scroller = __toModule(require_react_infinite_scroller());
var defaultPageInfo = {
pageNo: 1,
pageSize: 20,
totalPages: -1
};
var list = (props, ref) => {
const [loading, setLoading] = (0, import_react59.useState)(false);
const [listData, setListData] = (0, import_react59.useState)([]);
const [pageInfo, setPageInfo] = (0, import_react59.useState)(defaultPageInfo);
(0, import_react59.useEffect)(() => {
loadData();
}, []);
const loadData = async () => {
try {
setLoading(true);
const res = await props.loadData(pageInfo.pageNo, pageInfo.pageSize);
const result = res.data?.result ?? {};
const _pageInfo = result.pageInfo || defaultPageInfo;
if (_pageInfo.pageNo <= 1) {
setListData(result.data ?? []);
} else {
setListData([...listData, ...result.data]);
}
setPageInfo(_pageInfo);
} catch (error) {
console.error(error);
} finally {
setLoading(false);
}
};
const refreshData = () => {
setPageInfo(defaultPageInfo);
loadData();
};
const removeDataById = (id, key) => {
if (!id || !id.length || !listData || !listData.length)
return;
let newList = [...listData];
const index2 = newList.findIndex((item) => item[key ?? "id"] === id);
newList.splice(index2, 1);
setListData(newList);
};
(0, import_react59.useImperativeHandle)(ref, () => ({
refreshData,
removeDataById
}));
return /* @__PURE__ */ import_react59.default.createElement(import_react59.default.Fragment, null, /* @__PURE__ */ import_react59.default.createElement(import_react_infinite_scroller.default, {
initialLoad: false,
pageStart: 1,
threshold: 10,
loadMore: loadData,
hasMore: !loading && (pageInfo.totalPages === -1 || pageInfo.pageNo < pageInfo.totalPages),
useWindow: false
}, listData && listData.length ? /* @__PURE__ */ import_react59.default.createElement(list_default, {
dataSource: listData,
renderItem: props.renderItem
}) : /* @__PURE__ */ import_react59.default.createElement(Empty, {
style: { marginTop: 20 },
image: /* @__PURE__ */ import_react59.default.createElement(IllustrationNoContent_default, {
style: { width: 150, height: 150 }
}),
darkModeImage: /* @__PURE__ */ import_react59.default.createElement(IllustrationNoContentDark_default, {
style: { width: 150, height: 150 }
}),
description: props.emptyDescription ?? "\u6682\u65E0\u5185\u5BB9"
})));
};
var list_view_default = import_react59.default.forwardRef(list);
// src/views/components/article_item.tsx
var import_react60 = __toModule(require_react());
var handleAction = (e, action, onAction) => {
e.stopPropagation();
onAction?.(action);
};
var articleItem = ({
avatar,
title,
description,
actions,
onClick
}) => {
return /* @__PURE__ */ import_react60.default.createElement(list_default.Item, {
style: { cursor: "pointer" },
align: "center",
header: avatar && avatar.length && /* @__PURE__ */ import_react60.default.createElement(Avatar, {
src: avatar,
size: "small"
}),
main: /* @__PURE__ */ import_react60.default.createElement(import_react60.default.Fragment, null, title && title.length && /* @__PURE__ */ import_react60.default.createElement("span", {
style: { color: "var(--semi-color-text-0)", fontWeight: 500 }
}, title), description && description.length && /* @__PURE__ */ import_react60.default.createElement("p", {
style: { color: "var(--semi-color-text-2)", margin: "4px 0" }
}, description)),
extra: actions,
onClick
});
};
var followingItem = (item, onClick, onAction) => {
return /* @__PURE__ */ import_react60.default.createElement(import_react60.default.Fragment, null, articleItem({
title: item.title ?? "\u672A\u77E5",
description: `${item.authorName ?? "\u672A\u77E5"}\xA0\xA0\xA0\xA0${item.updateAt ?? ""}`,
actions: /* @__PURE__ */ import_react60.default.createElement(space_default, null, /* @__PURE__ */ import_react60.default.createElement(button_default, {
icon: /* @__PURE__ */ import_react60.default.createElement(IconLink_default, null),
"aria-label": "\u590D\u5236\u94FE\u63A5",
onClick: (e) => handleAction(e, "copyLink", onAction)
})),
onClick
}));
};
var collectionItem = (item, onClick, onAction) => {
return /* @__PURE__ */ import_react60.default.createElement(import_react60.default.Fragment, null, articleItem({
title: item.title ?? "\u672A\u77E5",
description: `${item.authorName ?? "\u672A\u77E5"}\xA0\xA0\xA0\xA0${item.updateAt ?? ""}`,
actions: /* @__PURE__ */ import_react60.default.createElement(space_default, null, /* @__PURE__ */ import_react60.default.createElement(button_default, {
icon: /* @__PURE__ */ import_react60.default.createElement(IconLink_default, null),
"aria-label": "\u590D\u5236\u94FE\u63A5",
onClick: (e) => handleAction(e, "copyLink", onAction)
}), /* @__PURE__ */ import_react60.default.createElement(button_default, {
icon: /* @__PURE__ */ import_react60.default.createElement(IconDelete_default, null),
"aria-label": "\u53D6\u6D88\u6536\u85CF",
onClick: (e) => handleAction(e, "cancelCollection", onAction)
})),
onClick
}));
};
var followersItem = (item, onClick, onAction) => {
return /* @__PURE__ */ import_react60.default.createElement(import_react60.default.Fragment, null, articleItem({
avatar: item.authorAvatar && item.authorAvatar.length ? item.authorAvatar : "https://joesch.moe/api/v1/josh",
title: item.authorName && item.authorName.length ? item.authorName : "\u672A\u77E5",
actions: /* @__PURE__ */ import_react60.default.createElement(space_default, null, /* @__PURE__ */ import_react60.default.createElement(button_default, {
icon: /* @__PURE__ */ import_react60.default.createElement(IconDelete_default, null),
"aria-label": "\u53D6\u6D88\u5173\u6CE8",
onClick: (e) => handleAction(e, "cancelFollow", onAction)
})),
onClick
}));
};
var publishItem = (item, onClick, onAction) => {
return /* @__PURE__ */ import_react60.default.createElement(import_react60.default.Fragment, null, articleItem({
title: item.title ?? "\u672A\u77E5",
description: `${item.authorName ?? "\u672A\u77E5"}\xA0\xA0\xA0\xA0${item.updateAt ?? ""}`,
actions: /* @__PURE__ */ import_react60.default.createElement(space_default, null, /* @__PURE__ */ import_react60.default.createElement(button_default, {
icon: /* @__PURE__ */ import_react60.default.createElement(IconLink_default, null),
"aria-label": "\u590D\u5236\u94FE\u63A5",
onClick: (e) => handleAction(e, "copyLink", onAction)
}), /* @__PURE__ */ import_react60.default.createElement(button_default, {
icon: /* @__PURE__ */ import_react60.default.createElement(IconDelete_default, null),
"aria-label": "\u53D6\u6D88\u53D1\u5E03",
onClick: (e) => handleAction(e, "cancelPublish", onAction)
})),
onClick
}));
};
// src/views/article_detail.ts
var import_obsidian6 = __toModule(require("obsidian"));
var VIEW_ARTICLE_DETAIL = "OPP Article Detail View";
var ArticleDetailView = class extends BaseItemView {
constructor(leaf) {
super(leaf);
this.actions = [
{ id: "like", icon: "thumbs-up", text: "\u70B9\u8D5E" },
{ id: "collect", icon: "heart", text: "\u6536\u85CF" },
{ id: "follow", icon: "user-round-plus", text: "\u5173\u6CE8" }
];
try {
this.containerEl.children[0].children[0].setAttr("style", "display:none");
this.containerEl.children[0].children[2].setAttr("style", "display:none");
} catch (error) {
}
}
getViewType() {
return VIEW_ARTICLE_DETAIL;
}
getDisplayText() {
return "Article Detail";
}
setArticleId(articleId) {
if (this.articleId && this.articleId === articleId)
return;
this.articleId = articleId;
this.onRefresh();
}
async onRefresh() {
if (!this.articleId?.length)
return;
try {
const { data } = await getArticleDetail(this.articleId);
this.article = data.result || {};
const title = this.article.title || "";
this.leaf.tabHeaderInnerTitleEl.setText(title);
this.containerEl.children[0].children[1].setText(title);
this.previewContent();
this.previewFooter();
} catch (error) {
console.log(error);
}
}
previewContent() {
if (!this.previewView) {
this.previewView = new import_obsidian6.MarkdownPreviewView(this);
}
this.previewView.set(this.article?.content ?? "", false);
}
previewFooter() {
if (!this.footer) {
this.footer = this.containerEl.createDiv("preview-footer");
const left = this.footer.createDiv("preview-footer-left");
this.authorAvatar = left.createDiv("preview-footer-author-avatar").createEl("img");
this.authorName = left.createDiv("preview-footer-author-name");
const right = this.footer.createDiv("preview-footer-right");
this.actions.forEach((action) => {
const actionItem = right.createDiv("preview-footer-action clickable-icon");
(0, import_obsidian6.setIcon)(actionItem, action.icon);
actionItem.setAttr("title", action.text);
const actionText = actionItem.createDiv("preview-footer-action-text");
actionText.setText(action.text);
actionItem.addEventListener("click", () => this.handleAction({ ...action, item: actionItem }));
action.item = actionItem;
});
}
const avatar = this.article?.authorAvatar?.length ? this.article?.authorAvatar : "https://joesch.moe/api/v1/josh";
this.authorAvatar.setAttr("src", avatar);
this.authorName.setText(this.article?.authorName ?? "\u672A\u77E5");
this.actions.forEach((action) => this.updateAction(action));
}
updateAction(action) {
let active = false;
let counts = 0;
switch (action.id) {
case "like":
active = this.article?.liked ?? false;
counts = this.article?.likeCounts ?? 0;
break;
case "collect":
active = this.article?.collected ?? false;
counts = this.article?.collectCounts ?? 0;
break;
case "follow":
active = this.article?.followed ?? false;
counts = this.article?.followCounts ?? 0;
break;
default:
break;
}
action.item?.setAttr("style", active ? "color: var(--text-accent);" : "");
action.item?.children[1]?.setText(counts > 99 ? "99+" : counts.toString());
}
async handleAction(action) {
if (!this.article)
return;
try {
switch (action.id) {
case "like":
this.article.liked ? await unlikeArticle(this.articleId) : await likeArticle(this.articleId);
this.article.liked = !this.article.liked;
this.article.likeCounts = this.article.liked ? (this.article.likeCounts ?? 0) + 1 : (this.article.likeCounts ?? 1) - 1;
break;
case "collect":
this.article.collected ? await unCollectArticle(this.articleId) : await collectArticle(this.articleId);
this.article.collected = !this.article.collected;
this.article.collectCounts = this.article.collected ? (this.article.collectCounts ?? 0) + 1 : (this.article.collectCounts ?? 1) - 1;
break;
case "follow":
if (!this.article.authorId)
return;
this.article.followed ? await unfollowUser(this.article.authorId) : await followUser(this.article.authorId);
this.article.followed = !this.article.followed;
this.article.followCounts = this.article.followed ? (this.article.followCounts ?? 0) + 1 : (this.article.followCounts ?? 1) - 1;
break;
default:
break;
}
this.updateAction(action);
} catch (error) {
console.log(error);
}
}
};
// src/views/components/profile_view.tsx
var profile_view_default = (app) => {
const plugin = app.plugins.plugins["publish"];
const { Header: Header2, Content: Content2 } = Layout;
const { Meta: Meta2 } = card_default;
const { Title: Title3, Text: Text2 } = typography_default2;
useAccountStore.subscribe(() => updateLoginStatus());
const [isLogin, setIsLogin] = (0, import_react61.useState)(useAccountStore.getState().isLogin());
const [accountInfo, setAccountInfo] = (0, import_react61.useState)({
account: { ...useAccountStore.getState().accountInfo },
subscriptionInfo: {}
});
const [avatarMotion, setAvatarMotion] = (0, import_react61.useState)(false);
const accountStats = [
{ key: "receivedLikes", label: "\u83B7\u8D5E" },
{ key: "cntAuthorSubscriptions", label: "\u5173\u6CE8" },
{ key: "cntFellows", label: "\u7C89\u4E1D" }
];
const tabs = [
{
key: "following",
tab: "\u8BA2\u9605",
ref: (0, import_react61.useRef)(null),
loadData: followArticleList,
renderItem: followingItem
},
{
key: "collection",
tab: "\u6536\u85CF",
ref: (0, import_react61.useRef)(null),
loadData: collectArticleList,
renderItem: collectionItem
},
{
key: "followers",
tab: "\u5173\u6CE8",
ref: (0, import_react61.useRef)(null),
loadData: followUserList,
renderItem: followersItem
},
{
key: "publish",
tab: "\u53D1\u5E03",
ref: (0, import_react61.useRef)(null),
loadData: getArticleList,
renderItem: publishItem
}
];
(0, import_react61.useEffect)(() => {
loadAccountInfo();
}, [isLogin]);
const updateLoginStatus = () => {
setIsLogin(useAccountStore.getState().isLogin());
};
const loadAccountInfo = async () => {
if (!isLogin)
return;
try {
const { data = {} } = await getAccountInfo();
setAccountInfo(data.result);
} catch (error) {
}
};
const handleTabChange = (activeKey) => {
currentListRef(activeKey)?.refreshData();
};
const currentListRef = (activeKey) => {
const currentTab = tabs.find((tab) => tab.key === activeKey);
return currentTab?.ref.current;
};
const handleItemClick = (type, id) => {
if (!id?.length)
return;
if (type === "followers") {
} else {
plugin.activateView(VIEW_ARTICLE_DETAIL, "center");
plugin.articleDetailView?.setArticleId(id);
}
};
const handleItemAction = async (type, action, item) => {
try {
switch (action) {
case "copyLink":
{
const { link = "" } = item;
await navigator.clipboard.writeText(link);
new import_obsidian7.Notice("\u94FE\u63A5\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F" + link);
}
break;
case "cancelPublish":
{
const { id = "" } = item;
await unPublishArticle(id);
currentListRef(type)?.removeDataById(id);
new import_obsidian7.Notice("\u53D1\u5E03\u5DF2\u53D6\u6D88");
}
break;
case "cancelCollection":
{
const { id = "" } = item;
await unCollectArticle(id);
currentListRef(type)?.removeDataById(id);
new import_obsidian7.Notice("\u6536\u85CF\u5DF2\u53D6\u6D88");
}
break;
case "cancelFollow":
{
const { authorId = "" } = item;
await unfollowUser(authorId);
currentListRef(type)?.removeDataById(authorId, "authorId");
new import_obsidian7.Notice("\u5173\u6CE8\u5DF2\u53D6\u6D88");
}
break;
default:
break;
}
} catch (error) {
console.error("\u64CD\u4F5C\u5931\u8D25:", error);
new import_obsidian7.Notice("\u64CD\u4F5C\u5931\u8D25");
}
};
return /* @__PURE__ */ import_react61.default.createElement(import_react61.default.Fragment, null, isLogin ? /* @__PURE__ */ import_react61.default.createElement(Layout, null, /* @__PURE__ */ import_react61.default.createElement(Header2, null, /* @__PURE__ */ import_react61.default.createElement(card_default, {
bodyStyle: { display: "flex", alignItems: "flex-start", justifyContent: "space-between" }
}, /* @__PURE__ */ import_react61.default.createElement(Meta2, {
avatar: /* @__PURE__ */ import_react61.default.createElement(Avatar, {
size: "large",
src: accountInfo.account.avatar?.length ? accountInfo.account.avatar : "https://joesch.moe/api/v1/josh",
alt: accountInfo.account.nickname ?? "",
style: { margin: 4 },
border: { color: "var(--color-accent)", motion: avatarMotion },
contentMotion: avatarMotion,
onMouseEnter: () => setAvatarMotion(true),
onMouseLeave: () => setAvatarMotion(false)
}),
title: /* @__PURE__ */ import_react61.default.createElement(Title3, {
heading: 3
}, accountInfo.account.nickname?.length ? accountInfo.account.nickname : "Hello, nice to meet you!"),
description: /* @__PURE__ */ import_react61.default.createElement(space_default, {
spacing: 30,
style: { marginTop: "8px" }
}, accountStats.map((stat) => /* @__PURE__ */ import_react61.default.createElement("div", {
className: "account-stat",
key: stat.key
}, /* @__PURE__ */ import_react61.default.createElement(Title3, {
heading: 6
}, accountInfo.subscriptionInfo[stat.key] ?? 0), /* @__PURE__ */ import_react61.default.createElement(Text2, null, stat.label))))
}), /* @__PURE__ */ import_react61.default.createElement(Text2, {
link: true
}, "Edit"))), /* @__PURE__ */ import_react61.default.createElement(Content2, {
style: { padding: "0 8px" }
}, /* @__PURE__ */ import_react61.default.createElement(tabs_default, {
defaultActiveKey: "following",
onChange: handleTabChange
}, tabs.map((tab) => /* @__PURE__ */ import_react61.default.createElement(TabPane_default, {
tab: tab.tab,
itemKey: tab.key,
key: tab.key
}, /* @__PURE__ */ import_react61.default.createElement(list_view_default, {
ref: tab.ref,
loadData: tab.loadData,
renderItem: (item) => tab.renderItem(item, () => handleItemClick(tab.key, item.id), (action) => handleItemAction(tab.key, action, item)),
emptyDescription: `\u6682\u65E0${tab.tab}\u5185\u5BB9`
})))))) : /* @__PURE__ */ import_react61.default.createElement(Empty, {
style: { marginTop: 120 },
image: /* @__PURE__ */ import_react61.default.createElement(IllustrationNoAccess_default, {
style: { width: 150, height: 150 }
}),
darkModeImage: /* @__PURE__ */ import_react61.default.createElement(IllustrationNoAccessDark_default, {
style: { width: 150, height: 150 }
}),
description: "\u8BF7\u6253\u5F00Obsidian\u914D\u7F6E\uFF0C\u6DFB\u5199\u5E10\u6237\u4FE1\u606F"
}));
};
// src/views/opp_profile.ts
var VIEW_PROFILE = "OPP Profile View";
var OppProfileView = class extends BaseItemView {
getViewType() {
return VIEW_PROFILE;
}
getDisplayText() {
return "OPP Profile View";
}
async onOpen() {
this.reactComponent = import_react62.default.createElement(profile_view_default, this.app);
this.contentEl.classList.add("publish-plugin");
const root = (0, import_client.createRoot)(this.contentEl);
root.render(this.reactComponent);
}
};
// src/i18n/index.ts
var import_obsidian8 = __toModule(require("obsidian"));
// src/i18n/en.ts
var en_default = {
"Select the AI service provider": "Select the AI service provider.",
"Ollama (Local)": "Ollama (local)",
Model: "Model",
"Failed to fetch models": "Failed to fetch models.",
"API Key": "API key",
"Custom API Address": "Custom API address",
"If using a custom API proxy, please enter the full API address": "If using a custom API proxy, please enter the full API address.",
"Please enter your API Key": "Please enter your API key.",
"Validating API Key...": "Validating API key...",
"API Key verification successful!": "API key verification successful!",
"API Key verification failed. Please check your API Key.": "API key verification failed. Please check your API key.",
Save: "Save",
Cancel: "Cancel",
Edit: "Edit",
Delete: "Delete",
"Custom Model": "Custom model",
"API Key is valid!": "API Key is valid!",
"Failed to validate API Key. Please check your key and try again.": "Failed to validate API Key. Please check your key and try again.",
"Please enter an API Key first": "Please enter an API Key first.",
"Checking...": "Checking...",
"API Key and the current model are both available!": "API Key and the current model are both available!",
"API Key is invalid or there is a server error. Please check if your API Key is correct.": "API Key is invalid or there is a server error. Please check if your API Key is correct.",
"Select the OpenAI model to use": "Select the OpenAI model to use.",
"OpenAI Settings": "OpenAI service",
"Enter your OpenAI API Key.": "Enter your OpenAI API key.",
"No available models found.": "No available models found.",
"API Key validated successfully!": "API Key validated successfully!",
"No models available. Please check your API Key.": "No models available. Please check your API Key.",
"Anthropic Settings": "Anthropic service",
"Enter your Anthropic API Key.": "Enter your Anthropic API key.",
"Select the Anthropic model to use": "Select the Anthropic model to use.",
"Select a model or use a custom one": "Select a model or use a custom one.",
"Model ID can only contain letters, numbers, underscores, dots and hyphens": "Model ID can only contain letters, numbers, underscores, dots and hyphens.",
"Select the Gemini model to use": "Select the Gemini model to use.",
"Unable to create model selection dropdown menu.": "Unable to create model selection dropdown menu.",
"Gemini Settings": "Gemini service",
"Enter your Gemini API Key": "Enter your Gemini API key.",
"Deepseek Settings": "Deepseek service",
"Enter your Deepseek API Key": "Enter your Deepseek API key.",
"Ollama Settings": "Ollama service",
"Server Address": "Server address",
"Ollama server address (default: http://localhost:11434)": "Ollama server address (default: http://localhost:11434)",
Check: "Check",
"Successfully connected to Ollama service": "Successfully connected to Ollama service.",
"No models found. Please download models using ollama": "No models found. Please download models using ollama.",
"Could not connect to Ollama service": "Could not connect to Ollama service",
"Failed to connect to Ollama service. Please check the server address.": "Failed to connect to Ollama service. Please check the server address.",
"Currently selected model (Test connection to see all available models)": "Currently selected model (Test connection to see all available models)",
"Select a model to use": "Select a model to use",
"No models available. Please load an available model first.": "No models available. Please load an available model first.",
"No models available": "No models available",
"Prompt settings": "Custom prompt",
"Add Prompt": "Add prompt",
"Input Prompt Name": "Input prompt name",
"Input Prompt Content\nAvailable parameters:\n{{highlight}} - Current highlighted text\n{{comment}} - Existing comment": "Input prompt content\nAvailable parameters:\n{{highlight}} - Current highlighted text\n{{comment}} - Existing comment",
"Prompt added": "Prompt added",
"Prompt updated": "Prompt updated",
"Shift + Enter Wrap, Enter Save": "Shift + Enter Wrap, Enter Save",
"Delete comment": "Delete",
"Add Comment": "Add comment",
"Export as Image": "Export as image",
"Select Prompt": "Select prompt",
"Please add Prompt in the settings first": "Please add prompt in the settings first",
"AI comments have been added": "AI comments have been added",
"AI comments failed:": "AI comments failed:",
Chat: "Chat",
"Failed to process dropped highlight:": "Failed to process dropped highlight:",
"highlighted notes": " highlighted notes",
"Input message...": "Input message...",
"Unable to access the Ollama model, please check the service.": "Unable to access the Ollama model, please check the service.",
"Unable to get Gemini model list, please check API Key and network connection.": "Unable to get Gemini model list, please check API key and network connection.",
Download: "Download",
"Export successful!": "Export successful!",
"Export failed, please try again.": "Export failed, please try again.",
"Loading...": "Loading...",
"Search...": "Search...",
"No matching content found.": "No matching content found.",
"The current document has no highlighted content.": "The current document has no highlighted content.",
"No corresponding file found.": "No corresponding file found.",
"Export failed: Failed to load necessary components.": "Export failed: Failed to load necessary components.",
"All Highlight": "All highlight",
"Export as notes": "Export as notes",
"Add File Comment": "Add file comment",
"File Comment": "File comment",
"Successfully exported highlights to: ": "Successfully exported highlights to: ",
"Failed to export highlights: ": "Failed to export highlights: ",
"Default Template": "Default template",
"Modern minimalist knowledge card style": "Modern minimalist knowledge card style",
"Academic Template": "Academic template",
"Formal style suitable for academic citations": "Formal style suitable for academic citations",
"Social Template": "Social template",
"Modern style suitable for social media sharing": "Modern style suitable for social media sharing",
"Open AI chat window": "Open AI chat window",
"Open HiNote window": "Open HiNote window",
General: "Highlight",
"Export Path": "Export path",
"Set the path for exported highlight notes. Leave empty to use vault root. The path should be relative to your vault root.": "Set the path for exported highlight notes. Leave empty to use vault root. The path should be relative to your vault root.",
Exclusions: "Exclusions",
"Comma separated list of paths, tags, note titles or file extensions that will be excluded from highlighting. e.g. folder1, folder1/folder2, [[note1]], [[note2]], *.excalidraw.md": "Comma separated list of paths, tags, note titles or file extensions that will be excluded from highlighting. e.g. folder1, folder1/folder2, [[note1]], [[note2]], *.excalidraw.md",
"Custom text extraction": "Custom text extraction",
"Use Custom Pattern": "Use custom pattern",
"Enable to use a custom regular expression for extracting text.": "Enable to use a custom regular expression for extracting text.",
"Custom Pattern": "Custom pattern",
"Enter a custom regular expression for extracting text. Use capture groups () to specify the text to extract. The first non-empty capture group will be used as the extracted text.": "Enter a custom regular expression for extracting text. Use capture groups () to specify the text to extract. The first non-empty capture group will be used as the extracted text.",
"Default Color": "Default color",
"Set the default color for decorators when no color is specified. Leave empty to use system default.": "Set the default color for decorators when no color is specified. Leave empty to use system default.",
"Export template": "Export template",
"Clean orphaned data": "Clean orphaned data",
"Remove highlights and comments that no longer exist in your documents. This is useful if you have deleted highlights but their comments are still stored in the data file.": "Remove highlights and comments that no longer exist in your documents. This is useful if you have deleted highlights but their comments are still stored in the data file.",
"Flashcard learning": "Flashcard learning",
"New cards per day": "New cards per day",
"Maximum number of new cards to learn each day": "Maximum number of new cards to learn each day.",
"Reviews per day": "Reviews per day",
"Maximum number of cards to review each day": "Maximum number of cards to review each day.",
"Target retention": "Target retention",
"Target memory retention rate (0.8 = 80%)": "Target memory retention rate (0.8 = 80%).",
"Maximum interval": "Maximum interval",
"Maximum interval in days between reviews": "Maximum interval in days between reviews.",
"Reset daily stats": "Reset daily stats",
"Reset today's learning statistics": "Reset today's learning statistics.",
Reset: "Reset",
"Daily statistics have been reset": "Daily statistics have been reset",
"No statistics to reset for today": "No statistics to reset for today",
Advanced: "Advanced",
"These settings control the FSRS algorithm parameters. Only change them if you understand the algorithm.": "These settings control the FSRS algorithm parameters. Only change them if you understand the algorithm.",
"Reset algorithm parameters": "Reset algorithm parameters",
"Reset the FSRS algorithm parameters to default values": "Reset the FSRS algorithm parameters to default values.",
"Reset to Default": "Reset to default",
"FSRS parameters have been reset to default values": "FSRS parameters have been reset to default values.",
days: "days",
"Activate HiCard": "Activate HiCard",
"Enter your license key to activate HiCard feature.": "Enter your license key to activate HiCard feature.",
"Enter license key": "Enter license key",
Activate: "Activate",
"Please enter a license key": "Please enter a license key",
"HiCard activated successfully!": "HiCard activated successfully!",
"Invalid license key": "Invalid license key",
"Use global settings": "Use global settings",
"New cards per day:": "New cards per day:",
"Reviews per day:": "Reviews per day:",
"All Cards": "All cards",
"Due Today": "Due today",
"New Cards": "New cards",
Learned: "Learned",
"Create Group": "Create group",
"Group name": "Group name",
Create: "Create",
Again: "Again",
Hard: "Hard",
Good: "Good",
Easy: "Easy",
Card: "Card",
of: "of",
Settings: "Settings",
"Are you sure you want to delete this group?": "Are you sure you want to delete this group?",
Yes: "Yes",
No: "No",
"You've completed all cards for today!": "You've completed all cards for today!",
"No cards available.": "No cards available.",
"Return to First Card": "Return to First Card",
"Edit Group": "Edit group",
"Create New Group": "Create new group",
"Group Name": "Group name",
"Please fill in all fields": "Please fill in all fields",
"Saving...": "Saving...",
"Creating...": "Creating...",
"Group updated successfully": "Group updated successfully",
"Failed to update group": "Failed to update group",
"Group created successfully": "Group created successfully",
"Failed to create or update group": "Failed to create or update group",
Due: "Due",
New: "New",
Review: "Review",
Retention: "Retention",
"Limits:": "Limits:",
"\u6BCF\u65E5\u5B66\u4E60\u9650\u5236\n": "Daily learning limits\n",
"\u65B0\u5361\u7247:": "New cards:",
"\u590D\u4E60\u5361\u7247:": "Review cards:",
"\u5B66\u4E60\u5B8C\u6210\uFF01": "Learning completed!",
\u8FD4\u56DE\u7B2C\u4E00\u5F20\u5361\u7247: "Return to first card",
"\u60A8\u4ECA\u5929\u7684\u65B0\u5361\u7247\u5B66\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u5B66\u4E60\u5427\u3002": "You've reached your daily quota for new cards! Come back tomorrow.",
"\u60A8\u4ECA\u5929\u7684\u590D\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u590D\u4E60\u5427\u3002": "You've reached your daily quota for reviews! Come back tomorrow.",
'\u60A8\u4ECA\u5929\u5728 "': `You've reached your daily quota in "`,
'" \u5206\u7EC4\u7684\u65B0\u5361\u7247\u5B66\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u5B66\u4E60\u5427\u3002': '" group for new cards! Come back tomorrow.',
'" \u5206\u7EC4\u7684\u590D\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u590D\u4E60\u5427\u3002': '" group for reviews! Come back tomorrow.',
'\u606D\u559C\uFF01\u60A8\u5DF2\u5B8C\u6210 "': `Congratulations! You've completed all cards in "`,
'" \u4E2D\u7684\u6240\u6709\u5361\u7247\u5B66\u4E60\u3002': '" group.',
'\u786E\u5B9A\u8981\u5220\u9664\u5206\u7EC4 "': 'Are you sure you want to delete group "',
'" \u5417\uFF1F': '"?',
\u5206\u7EC4\u5220\u9664\u6210\u529F: "Group deleted successfully",
\u5220\u9664\u5206\u7EC4\u5931\u8D25: "Failed to delete group",
"\u652F\u6301\u4EE5\u4E0B\u683C\u5F0F\uFF1A\n- \u6587\u4EF6\u5939\uFF1Afolder1, folder1/folder2\n- \u7B14\u8BB0\uFF1A[[note1]], [[note2]]\n- \u6807\u7B7E\uFF1A#tag1, #tag2\n- \u901A\u914D\u7B26\uFF1A*.excalidraw.md\n- \u5185\u5BB9\uFF1A\u76F4\u63A5\u8F93\u5165\u8981\u641C\u7D22\u7684\u6587\u672C": "Supports the following formats:\n- Folders: folder1, folder1/folder2\n- Notes: [[note1]], [[note2]]\n- Tags: #tag1, #tag2\n- Wildcards: *.excalidraw.md\n- Content: directly enter text to search for",
"\u53CD\u8F6C\u5361\u7247\uFF08\u4F7F\u7528\u8BC4\u8BBA\u4F5C\u4E3A\u95EE\u9898\uFF09": "Reverse cards (use comments as questions)",
"Learning settings": "Learning settings",
"\u8BB0\u5FC6\u4FDD\u6301\u7387 = (\u603B\u590D\u4E60\u6B21\u6570 - \u9057\u5FD8\u6B21\u6570) / \u603B\u590D\u4E60\u6B21\u6570\n\u8BE5\u6307\u6807\u53CD\u6620\u4E86\u4F60\u7684\u5B66\u4E60\u6548\u679C\uFF0C\u8D8A\u9AD8\u8BF4\u660E\u8BB0\u5FC6\u6548\u679C\u8D8A\u597D": "Memory retention = (total reviews - forgotten reviews) / total reviews\nThis metric reflects your learning effectiveness. Higher means better memory retention",
"Open (DoubleClick)": "Open (double-click)"
};
// src/i18n/zh.ts
var zh_default = {
"Select the AI service provider": "\u9009\u62E9 AI \u670D\u52A1\u63D0\u4F9B\u5546\u3002",
"Ollama (Local)": "Ollama (\u672C\u5730)",
Model: "\u6A21\u578B",
"Failed to fetch models": "\u83B7\u53D6\u6A21\u578B\u5931\u8D25",
"API Key": "API \u5BC6\u94A5",
"Custom API Address": "\u81EA\u5B9A\u4E49 API \u5730\u5740",
"If using a custom API proxy, please enter the full API address": "\u5982\u679C\u4F7F\u7528\u81EA\u5B9A\u4E49 API \u4EE3\u7406\uFF0C\u8BF7\u8F93\u5165\u5B8C\u6574\u7684 API \u5730\u5740",
"Please enter your API Key": "\u8BF7\u8F93\u5165\u60A8\u7684 API \u5BC6\u94A5",
"Validating API Key...": "\u6B63\u5728\u9A8C\u8BC1 API \u5BC6\u94A5...",
"API Key verification successful!": "API \u5BC6\u94A5\u9A8C\u8BC1\u6210\u529F\uFF01",
"API Key verification failed. Please check your API Key.": "API \u5BC6\u94A5\u9A8C\u8BC1\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u60A8\u7684 API \u5BC6\u94A5\u3002",
Save: "\u4FDD\u5B58",
Cancel: "\u53D6\u6D88",
Edit: "\u7F16\u8F91",
Delete: "\u5220\u9664",
"Custom Model": "\u81EA\u5B9A\u4E49\u6A21\u578B",
"API Key is valid!": "API \u5BC6\u94A5\u6709\u6548\uFF01",
"Failed to validate API Key. Please check your key and try again.": "API \u5BC6\u94A5\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684\u5BC6\u94A5\u5E76\u91CD\u8BD5",
"Please enter an API Key first": "\u8BF7\u5148\u8F93\u5165 API \u5BC6\u94A5",
"Checking...": "\u68C0\u67E5\u4E2D...",
"API Key and the current model are both available!": "API \u5BC6\u94A5\u548C\u5F53\u524D\u6A21\u578B\u90FD\u53EF\u7528\uFF01",
"API Key is invalid or there is a server error. Please check if your API Key is correct.": "API \u5BC6\u94A5\u65E0\u6548\u6216\u670D\u52A1\u5668\u9519\u8BEF\u3002\u8BF7\u68C0\u67E5\u60A8\u7684 API \u5BC6\u94A5\u662F\u5426\u6B63\u786E\u3002",
"Select the OpenAI model to use": "\u9009\u62E9 OpenAI \u6A21\u578B",
"OpenAI Settings": "OpenAI \u670D\u52A1",
"Enter your OpenAI API Key.": "\u8F93\u5165\u60A8\u7684 OpenAI API \u5BC6\u94A5\u3002",
"No available models found.": "\u672A\u627E\u5230\u53EF\u7528\u6A21\u578B\u3002",
"API Key validated successfully!": "API \u5BC6\u94A5\u9A8C\u8BC1\u6210\u529F\uFF01",
"No models available. Please check your API Key.": "\u6CA1\u6709\u53EF\u7528\u7684\u6A21\u578B\u3002\u8BF7\u68C0\u67E5\u60A8\u7684 API \u5BC6\u94A5\u3002",
"Anthropic Settings": "Anthropic \u670D\u52A1",
"Enter your Anthropic API Key.": "\u8F93\u5165\u60A8\u7684 Anthropic API \u5BC6\u94A5\u3002",
"Select the Anthropic model to use": "\u9009\u62E9 Anthropic \u6A21\u578B",
"Select a model or use a custom one": "\u9009\u62E9\u6A21\u578B\u6216\u4F7F\u7528\u81EA\u5B9A\u4E49\u6A21\u578B",
"Model ID can only contain letters, numbers, underscores, dots and hyphens": "\u6A21\u578B ID \u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u3001\u70B9\u548C\u8FDE\u5B57\u7B26",
"Select the Gemini model to use": "\u9009\u62E9 Gemini \u6A21\u578B",
"Unable to create model selection dropdown menu.": "\u65E0\u6CD5\u521B\u5EFA\u6A21\u578B\u9009\u62E9\u4E0B\u62C9\u83DC\u5355\u3002",
"Gemini Settings": "Gemini \u670D\u52A1",
"Enter your Gemini API Key": "\u8F93\u5165\u60A8\u7684 Gemini API \u5BC6\u94A5",
"Deepseek Settings": "Deepseek \u670D\u52A1",
"Enter your Deepseek API Key": "\u8F93\u5165\u60A8\u7684 Deepseek API \u5BC6\u94A5",
"Ollama Settings": "Ollama \u670D\u52A1",
"Server Address": "\u670D\u52A1\u5668\u5730\u5740",
"Ollama server address (default: http://localhost:11434)": "Ollama \u670D\u52A1\u5668\u5730\u5740\uFF08\u9ED8\u8BA4\uFF1Ahttp://localhost:11434\uFF09",
Check: "\u9A8C\u8BC1",
"Successfully connected to Ollama service": "\u6210\u529F\u8FDE\u63A5\u5230 Ollama \u670D\u52A1",
"No models found. Please download models using ollama": "\u672A\u627E\u5230\u6A21\u578B\u3002\u8BF7\u4F7F\u7528 ollama \u4E0B\u8F7D\u6A21\u578B",
"Could not connect to Ollama service": "\u65E0\u6CD5\u8FDE\u63A5\u5230 Ollama \u670D\u52A1",
"Failed to connect to Ollama service. Please check the server address.": "\u65E0\u6CD5\u8FDE\u63A5\u5230 Ollama \u670D\u52A1\uFF0C\u8BF7\u68C0\u67E5\u670D\u52A1\u5668\u5730\u5740\u3002",
"Currently selected model (Test connection to see all available models)": "\u5F53\u524D\u9009\u62E9\u7684\u6A21\u578B\uFF08\u6D4B\u8BD5\u8FDE\u63A5\u4EE5\u67E5\u770B\u53EF\u7528\u6A21\u578B\uFF09",
"Select a model to use": "\u9009\u62E9\u4E00\u4E2A\u6A21\u578B",
"No models available. Please load an available model first.": "\u65E0\u53EF\u7528\u6A21\u578B\uFF0C\u8BF7\u5148\u52A0\u8F7D\u53EF\u7528\u6A21\u578B\u3002",
"No models available": "\u65E0\u53EF\u7528\u6A21\u578B",
"Prompt settings": "\u81EA\u5B9A\u4E49 Prompt",
"Add Prompt": "\u6DFB\u52A0 Prompt",
"Input Prompt Name": "\u8F93\u5165 Prompt \u540D\u79F0",
"Input Prompt Content\nAvailable parameters:\n{{highlight}} - Current highlighted text\n{{comment}} - Existing comment": "\u8F93\u5165 Prompt \u5185\u5BB9\n\u53EF\u7528\u53C2\u6570:\n{{highlight}} - \u5F53\u524D\u9AD8\u4EAE\u6587\u672C\n{{comment}} - \u5DF2\u5B58\u5728\u7684\u6CE8\u91CA",
"Prompt added": "Prompt \u5DF2\u6DFB\u52A0",
"Prompt updated": "Prompt \u5DF2\u66F4\u65B0",
"Shift + Enter Wrap, Enter Save": "Shift + Enter \u6362\u884C\uFF0CEnter \u4FDD\u5B58",
"Delete comment": "\u5220\u9664\u8BC4\u8BBA",
"Add Comment": "\u6DFB\u52A0\u8BC4\u8BBA",
"Export as Image": "\u5BFC\u51FA\u4E3A\u56FE\u7247",
"Select Prompt": "\u9009\u62E9 Prompt",
"Please add Prompt in the settings first": "\u8BF7\u5148\u5728\u8BBE\u7F6E\u4E2D\u6DFB\u52A0 Prompt",
"AI comments have been added": "AI \u8BC4\u8BBA\u5DF2\u6DFB\u52A0",
"AI comments failed:": "AI \u8BC4\u8BBA\u5931\u8D25\uFF1A",
Chat: "\u5BF9\u8BDD",
"Failed to process dropped highlight:": "\u65E0\u6CD5\u5904\u7406\u5220\u9664\u7684\u9AD8\u4EAE\uFF1A",
"highlighted notes": " \u6761\u9AD8\u4EAE\u7B14\u8BB0",
"Input message...": "\u8F93\u5165\u6D88\u606F...",
"Unable to access the Ollama model, please check the service.": "\u65E0\u6CD5\u8BBF\u95EE Ollama \u6A21\u578B\uFF0C\u8BF7\u68C0\u67E5\u670D\u52A1\u662F\u5426\u6B63\u5E38\u8FD0\u884C",
"Unable to get Gemini model list, please check API Key and network connection.": "\u65E0\u6CD5\u83B7\u53D6 Gemini \u6A21\u578B\u5217\u8868\uFF0C\u8BF7\u68C0\u67E5 API Key \u548C\u7F51\u7EDC\u8FDE\u63A5",
Download: "\u4E0B\u8F7D",
"Export successful!": "\u5BFC\u51FA\u6210\u529F\uFF01",
"Export failed, please try again.": "\u5BFC\u51FA\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5",
"Loading...": "\u52A0\u8F7D\u4E2D...",
"Search...": "\u641C\u7D22\u9AD8\u4EAE\u6216\u8BC4\u8BBA...",
"No matching content found.": "\u672A\u627E\u5230\u5339\u914D\u7684\u5185\u5BB9\u3002",
"The current document has no highlighted content.": "\u5F53\u524D\u6587\u6863\u6CA1\u6709\u9AD8\u4EAE\u5185\u5BB9\u3002",
"No corresponding file found.": "\u672A\u627E\u5230\u76F8\u5E94\u7684\u6587\u4EF6\u3002",
"Export failed: Failed to load necessary components.": "\u5BFC\u51FA\u5931\u8D25\uFF1A\u52A0\u8F7D\u5FC5\u8981\u7EC4\u4EF6\u5931\u8D25\u3002",
"All Highlight": "\u5168\u90E8\u9AD8\u4EAE",
"Export as notes": "\u5BFC\u51FA\u4E3A\u7B14\u8BB0",
"Add File Comment": "\u6DFB\u52A0\u6587\u4EF6\u8BC4\u8BBA",
"File Comment": "\u6587\u4EF6\u8BC4\u8BBA",
"Successfully exported highlights to: ": "\u6210\u529F\u5BFC\u51FA\u9AD8\u4EAE\u5230\uFF1A",
"Failed to export highlights: ": "\u65E0\u6CD5\u5BFC\u51FA\u9AD8\u4EAE\uFF1A",
"Default Template": "\u9ED8\u8BA4\u6A21\u677F",
"Modern minimalist knowledge card style": "\u73B0\u4EE3\u6781\u7B80\u77E5\u8BC6\u5361\u7247\u98CE\u683C",
"Academic Template": "\u5B66\u672F\u6A21\u677F",
"Formal style suitable for academic citations": "\u9002\u7528\u4E8E\u5B66\u672F\u5F15\u7528\u7684\u6B63\u5F0F\u98CE\u683C",
"Social Template": "\u793E\u4EA4\u6A21\u677F",
"Modern style suitable for social media sharing": "\u9002\u7528\u4E8E\u793E\u4EA4\u5A92\u4F53\u5206\u4EAB\u7684\u73B0\u4EE3\u98CE\u683C",
"Open AI chat window": "\u6253\u5F00 AI \u5BF9\u8BDD\u7A97\u53E3",
"Open HiNote window": "\u6253\u5F00 HiNote \u7A97\u53E3",
"General Settings": "\u901A\u7528\u8BBE\u7F6E",
"Export Path": "\u5BFC\u51FA\u8DEF\u5F84",
"Set the path for exported highlight notes. Leave empty to use vault root. The path should be relative to your vault root.": "\u8BBE\u7F6E\u9AD8\u4EAE\u7B14\u8BB0\u7684\u5BFC\u51FA\u8DEF\u5F84\u3002\u7559\u7A7A\u5219\u4F7F\u7528 vault \u6839\u76EE\u5F55\u3002\u8DEF\u5F84\u5E94\u76F8\u5BF9\u4E8E vault \u6839\u76EE\u5F55\u3002",
Exclusions: "\u6392\u9664",
"Comma separated list of paths, tags, note titles or file extensions that will be excluded from highlighting. e.g. folder1, folder1/folder2, [[note1]], [[note2]], *.excalidraw.md": "\u9017\u53F7\u5206\u9694\u7684\u8DEF\u5F84\uFF0C\u6807\u7B7E\uFF0C\u7B14\u8BB0\u6807\u9898\u6216\u6587\u4EF6\u6269\u5C55\u540D\uFF0C\u5C06\u4ECE\u9AD8\u4EAE\u4E2D\u6392\u9664\u3002\u4F8B\u5982\uFF1Afolder1, folder1/folder2, [[note1]], [[note2]], *.excalidraw.md",
"Custom text extraction": "\u81EA\u5B9A\u4E49\u6587\u672C\u63D0\u53D6",
"Use Custom Pattern": "\u4F7F\u7528\u81EA\u5B9A\u4E49\u6A21\u5F0F",
"Enable to use a custom regular expression for extracting text.": "\u542F\u7528\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u4EE5\u63D0\u53D6\u6587\u672C\u3002",
"Custom Pattern": "\u81EA\u5B9A\u4E49\u6A21\u5F0F",
"Enter a custom regular expression for extracting text. Use capture groups () to specify the text to extract. The first non-empty capture group will be used as the extracted text.": "\u8F93\u5165\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u4EE5\u63D0\u53D6\u6587\u672C\u3002\u4F7F\u7528\u6355\u83B7\u7EC4 () \u6307\u5B9A\u8981\u63D0\u53D6\u7684\u6587\u672C\u3002\u7B2C\u4E00\u4E2A\u975E\u7A7A\u6355\u83B7\u7EC4\u5C06\u7528\u4F5C\u63D0\u53D6\u7684\u6587\u672C\u3002",
"Default Color": "\u9ED8\u8BA4\u989C\u8272",
"Set the default color for decorators when no color is specified. Leave empty to use system default.": "\u8BBE\u7F6E\u5F53\u672A\u6307\u5B9A\u989C\u8272\u65F6\u7684\u88C5\u9970\u5668\u7684\u9ED8\u8BA4\u989C\u8272\u3002\u7559\u7A7A\u4EE5\u4F7F\u7528\u7CFB\u7EDF\u9ED8\u8BA4\u989C\u8272\u3002",
"Export template": "\u5BFC\u51FA\u6A21\u677F",
"Clean orphaned data": "\u6E05\u7406\u5B64\u7ACB\u6570\u636E",
"Remove highlights and comments that no longer exist in your documents. This is useful if you have deleted highlights but their comments are still stored in the data file.": "\u5220\u9664\u4E0D\u518D\u5B58\u5728\u4E8E\u60A8\u7684\u6587\u6863\u4E2D\u7684\u9AD8\u4EAE\u548C\u6CE8\u91CA\u3002\u8FD9\u5728\u60A8\u5220\u9664\u9AD8\u4EAE\u4F46\u6CE8\u91CA\u4ECD\u7136\u5B58\u50A8\u5728\u6570\u636E\u6587\u4EF6\u4E2D\u65F6\u5F88\u6709\u7528\u3002",
"Flashcard learning": "\u95EA\u5361\u5B66\u4E60\u8BBE\u7F6E",
"New cards per day": "\u6BCF\u65E5\u65B0\u5361\u7247\u6570\u91CF",
"Maximum number of new cards to learn each day": "\u6BCF\u5929\u5B66\u4E60\u7684\u65B0\u5361\u7247\u6700\u5927\u6570\u91CF",
"Reviews per day": "\u6BCF\u65E5\u590D\u4E60\u6570\u91CF",
"Maximum number of cards to review each day": "\u6BCF\u5929\u590D\u4E60\u7684\u5361\u7247\u6700\u5927\u6570\u91CF",
"Target retention": "\u76EE\u6807\u8BB0\u5FC6\u4FDD\u6301\u7387",
"Target memory retention rate (0.8 = 80%)": "\u76EE\u6807\u8BB0\u5FC6\u4FDD\u6301\u7387\uFF080.8 = 80%\uFF09",
"Maximum interval": "\u6700\u5927\u95F4\u9694",
"Maximum interval in days between reviews": "\u590D\u4E60\u4E4B\u95F4\u7684\u6700\u5927\u95F4\u9694\u5929\u6570",
"Reset daily stats": "\u91CD\u7F6E\u4ECA\u65E5\u7EDF\u8BA1",
"Reset today's learning statistics": "\u91CD\u7F6E\u4ECA\u5929\u7684\u5B66\u4E60\u7EDF\u8BA1\u6570\u636E",
Reset: "\u91CD\u7F6E",
"Daily statistics have been reset": "\u4ECA\u65E5\u7EDF\u8BA1\u5DF2\u91CD\u7F6E",
"No statistics to reset for today": "\u4ECA\u5929\u6CA1\u6709\u53EF\u91CD\u7F6E\u7684\u7EDF\u8BA1\u6570\u636E",
Advanced: "\u9AD8\u7EA7\u8BBE\u7F6E",
"These settings control the FSRS algorithm parameters. Only change them if you understand the algorithm.": "\u8FD9\u4E9B\u8BBE\u7F6E\u63A7\u5236FSRS\u7B97\u6CD5\u53C2\u6570\u3002\u4EC5\u5728\u7406\u89E3\u7B97\u6CD5\u7684\u60C5\u51B5\u4E0B\u66F4\u6539\u5B83\u4EEC\u3002",
"Reset algorithm parameters": "\u91CD\u7F6E\u7B97\u6CD5\u53C2\u6570",
"Reset the FSRS algorithm parameters to default values": "\u5C06FSRS\u7B97\u6CD5\u53C2\u6570\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u503C",
"Reset to Default": "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u503C",
"FSRS parameters have been reset to default values": "FSRS\u53C2\u6570\u5DF2\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u503C",
days: "\u5929",
"Activate HiCard": "\u6FC0\u6D3B HiCard",
"Enter your license key to activate HiCard feature.": "\u8F93\u5165\u60A8\u7684\u8BB8\u53EF\u8BC1\u5BC6\u94A5\u4EE5\u6FC0\u6D3B HiCard \u529F\u80FD\u3002",
"Enter license key": "\u8F93\u5165\u8BB8\u53EF\u8BC1\u5BC6\u94A5",
Activate: "\u6FC0\u6D3B",
"Please enter a license key": "\u8BF7\u8F93\u5165\u8BB8\u53EF\u8BC1\u5BC6\u94A5",
"HiCard activated successfully!": "HiCard \u6FC0\u6D3B\u6210\u529F\uFF01",
"Invalid license key": "\u65E0\u6548\u7684\u8BB8\u53EF\u8BC1\u5BC6\u94A5",
"Use global settings": "\u4F7F\u7528\u5168\u5C40\u8BBE\u7F6E",
"New cards per day:": "\u6BCF\u65E5\u65B0\u5361\u6570\u91CF:",
"Reviews per day:": "\u6BCF\u65E5\u590D\u4E60\u6570\u91CF:",
"All Cards": "\u5168\u90E8\u5361\u7247",
"Due Today": "\u4ECA\u65E5\u5230\u671F",
"New Cards": "\u65B0\u5361\u7247",
Learned: "\u5DF2\u5B66\u4E60",
"Create Group": "\u521B\u5EFA\u5206\u7EC4",
"Group name": "\u5206\u7EC4\u540D\u79F0",
Create: "\u521B\u5EFA",
Again: "\u91CD\u6765",
Hard: "\u56F0\u96BE",
Good: "\u826F\u597D",
Easy: "\u7B80\u5355",
Card: "\u5361\u7247",
of: "\u5171",
Settings: "\u8BBE\u7F6E",
"Are you sure you want to delete this group?": "\u786E\u5B9A\u8981\u5220\u9664\u6B64\u5206\u7EC4\u5417\uFF1F",
Yes: "\u662F",
No: "\u5426",
"You've completed all cards for today!": "\u60A8\u4ECA\u5929\u5DF2\u5B8C\u6210\u6240\u6709\u5361\u7247\uFF01",
"No cards available.": "\u6CA1\u6709\u53EF\u7528\u7684\u5361\u7247\u3002",
"Return to First Card": "\u8FD4\u56DE\u7B2C\u4E00\u5F20\u5361\u7247",
"Edit Group": "\u7F16\u8F91\u5206\u7EC4",
"Create New Group": "\u521B\u5EFA\u65B0\u5206\u7EC4",
"Group Name": "\u5206\u7EC4\u540D\u79F0",
"Please fill in all fields": "\u8BF7\u586B\u5199\u6240\u6709\u5B57\u6BB5",
"Saving...": "\u4FDD\u5B58\u4E2D...",
"Creating...": "\u521B\u5EFA\u4E2D...",
"Group updated successfully": "\u5206\u7EC4\u66F4\u65B0\u6210\u529F",
"Failed to update group": "\u5206\u7EC4\u66F4\u65B0\u5931\u8D25",
"Group created successfully": "\u5206\u7EC4\u521B\u5EFA\u6210\u529F",
"Failed to create or update group": "\u521B\u5EFA\u6216\u66F4\u65B0\u5206\u7EC4\u5931\u8D25",
Due: "\u5230\u671F",
New: "\u65B0\u7684",
Review: "\u590D\u4E60",
Retention: "\u4FDD\u7559\u7387",
"Limits:": "\u9650\u5236\uFF1A",
"\u6BCF\u65E5\u5B66\u4E60\u9650\u5236\n": "\u6BCF\u65E5\u5B66\u4E60\u9650\u5236\n",
"\u65B0\u5361\u7247:": "\u65B0\u5361\u7247:",
"\u590D\u4E60\u5361\u7247:": "\u590D\u4E60\u5361\u7247:",
"\u5B66\u4E60\u5B8C\u6210\uFF01": "\u5B66\u4E60\u5B8C\u6210\uFF01",
\u8FD4\u56DE\u7B2C\u4E00\u5F20\u5361\u7247: "\u8FD4\u56DE\u7B2C\u4E00\u5F20\u5361\u7247",
"\u60A8\u4ECA\u5929\u7684\u65B0\u5361\u7247\u5B66\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u5B66\u4E60\u5427\u3002": "\u60A8\u4ECA\u5929\u7684\u65B0\u5361\u7247\u5B66\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u5B66\u4E60\u5427\u3002",
"\u60A8\u4ECA\u5929\u7684\u590D\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u590D\u4E60\u5427\u3002": "\u60A8\u4ECA\u5929\u7684\u590D\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u590D\u4E60\u5427\u3002",
'\u60A8\u4ECA\u5929\u5728 "': '\u60A8\u4ECA\u5929\u5728 "',
'" \u5206\u7EC4\u7684\u65B0\u5361\u7247\u5B66\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u5B66\u4E60\u5427\u3002': '" \u5206\u7EC4\u7684\u65B0\u5361\u7247\u5B66\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u5B66\u4E60\u5427\u3002',
'" \u5206\u7EC4\u7684\u590D\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u590D\u4E60\u5427\u3002': '" \u5206\u7EC4\u7684\u590D\u4E60\u914D\u989D\u5DF2\u7528\u5B8C\uFF01\u660E\u5929\u518D\u6765\u590D\u4E60\u5427\u3002',
'\u606D\u559C\uFF01\u60A8\u5DF2\u5B8C\u6210 "': '\u606D\u559C\uFF01\u60A8\u5DF2\u5B8C\u6210 "',
'" \u4E2D\u7684\u6240\u6709\u5361\u7247\u5B66\u4E60\u3002': '" \u4E2D\u7684\u6240\u6709\u5361\u7247\u5B66\u4E60\u3002',
'\u786E\u5B9A\u8981\u5220\u9664\u5206\u7EC4 "': '\u786E\u5B9A\u8981\u5220\u9664\u5206\u7EC4 "',
'" \u5417\uFF1F': '" \u5417\uFF1F',
\u5206\u7EC4\u5220\u9664\u6210\u529F: "\u5206\u7EC4\u5220\u9664\u6210\u529F",
\u5220\u9664\u5206\u7EC4\u5931\u8D25: "\u5220\u9664\u5206\u7EC4\u5931\u8D25",
"\u652F\u6301\u4EE5\u4E0B\u683C\u5F0F\uFF1A\n- \u6587\u4EF6\u5939\uFF1Afolder1, folder1/folder2\n- \u7B14\u8BB0\uFF1A[[note1]], [[note2]]\n- \u6807\u7B7E\uFF1A#tag1, #tag2\n- \u901A\u914D\u7B26\uFF1A*.excalidraw.md\n- \u5185\u5BB9\uFF1A\u76F4\u63A5\u8F93\u5165\u8981\u641C\u7D22\u7684\u6587\u672C": "\u652F\u6301\u4EE5\u4E0B\u683C\u5F0F\uFF1A\n- \u6587\u4EF6\u5939\uFF1Afolder1, folder1/folder2\n- \u7B14\u8BB0\uFF1A[[note1]], [[note2]]\n- \u6807\u7B7E\uFF1A#tag1, #tag2\n- \u901A\u914D\u7B26\uFF1A*.excalidraw.md\n- \u5185\u5BB9\uFF1A\u76F4\u63A5\u8F93\u5165\u8981\u641C\u7D22\u7684\u6587\u672C",
"\u53CD\u8F6C\u5361\u7247\uFF08\u4F7F\u7528\u8BC4\u8BBA\u4F5C\u4E3A\u95EE\u9898\uFF09": "\u53CD\u8F6C\u5361\u7247\uFF08\u4F7F\u7528\u8BC4\u8BBA\u4F5C\u4E3A\u95EE\u9898\uFF09",
"Learning settings": "\u5B66\u4E60\u8BBE\u7F6E",
"\u8BB0\u5FC6\u4FDD\u6301\u7387 = (\u603B\u590D\u4E60\u6B21\u6570 - \u9057\u5FD8\u6B21\u6570) / \u603B\u590D\u4E60\u6B21\u6570\n\u8BE5\u6307\u6807\u53CD\u6620\u4E86\u4F60\u7684\u5B66\u4E60\u6548\u679C\uFF0C\u8D8A\u9AD8\u8BF4\u660E\u8BB0\u5FC6\u6548\u679C\u8D8A\u597D": "\u8BB0\u5FC6\u4FDD\u6301\u7387 = (\u603B\u590D\u4E60\u6B21\u6570 - \u9057\u5FD8\u6B21\u6570) / \u603B\u590D\u4E60\u6B21\u6570\n\u8BE5\u6307\u6807\u53CD\u6620\u4E86\u4F60\u7684\u5B66\u4E60\u6548\u679C\uFF0C\u8D8A\u9AD8\u8BF4\u660E\u8BB0\u5FC6\u6548\u679C\u8D8A\u597D",
"Open (double-click)": "\u53CC\u51FB\u6253\u5F00"
};
// src/i18n/index.ts
var translations = {
en: en_default,
zh: zh_default
};
function t(key) {
const locale2 = import_obsidian8.moment.locale();
const currentTranslations = locale2.startsWith("zh") ? translations.zh : translations.en;
const translation = currentTranslations[key];
if (translation) {
return translation;
}
return key;
}
// src/views/article_list.ts
var VIEW_ARTICLE_LIST = "OPP Article List View";
var ArticleListView = class extends BaseItemView {
getViewType() {
return VIEW_ARTICLE_LIST;
}
getDisplayText() {
return t("Article List");
}
async onOpen() {
const container = this.containerEl.children[1];
container.empty();
container.addClass("article-list-container");
const titleBar = container.createDiv({ cls: "container-title" });
titleBar.createEl("h4", { text: t("My Published Articles") });
this.listContainer = container.createDiv({ cls: "article-list" });
const sampleArticles = [
{ title: "\u793A\u4F8B\u6587\u7AE01", date: new Date(), views: 100 },
{ title: "\u793A\u4F8B\u6587\u7AE02", date: new Date(), views: 200 }
];
sampleArticles.forEach((article) => {
const card = this.listContainer.createDiv({ cls: "article-card" });
card.createEl("div", {
cls: "article-title",
text: article.title
});
card.createEl("div", {
cls: "article-meta",
text: `${article.date.toLocaleDateString()} \u2022 ${article.views}\u6B21\u9605\u8BFB`
});
});
this.paginationContainer = container.createDiv({ cls: "pagination-container" });
this.renderPagination({
currentPage: 1,
pageSize: 5,
totalItems: 50
});
}
renderPagination(options) {
const totalPages = Math.ceil(options.totalItems / options.pageSize);
const controls = this.paginationContainer.createDiv({ cls: "pagination-controls" });
const prevBtn = controls.createEl("button", {
cls: "pagination-btn",
text: "\u2190",
attr: { disabled: options.currentPage === 1 }
});
prevBtn.onclick = () => this.handlePageChange(options.currentPage - 1);
controls.createEl("span", {
cls: "page-info",
text: `${options.currentPage} / ${totalPages}`
});
const nextBtn = controls.createEl("button", {
cls: "pagination-btn",
text: "\u2192",
attr: { disabled: options.currentPage === totalPages }
});
nextBtn.onclick = () => this.handlePageChange(options.currentPage + 1);
}
handlePageChange(newPage) {
console.log(`Loading page ${newPage}`);
this.currentPage = newPage;
const container = this.containerEl.children[1];
const listContainer = container.querySelector(".article-list");
if (listContainer) {
listContainer.empty();
this.renderSampleArticles();
}
const paginationContainer = container.querySelector(".pagination-controls");
if (paginationContainer) {
paginationContainer.empty();
this.renderPagination({
currentPage: newPage,
pageSize: 5,
totalItems: 50
});
}
}
generateSampleArticles(count) {
return Array.from({ length: count }, (_, i) => ({
id: `article-${i + 1}`,
title: `${t("Example Article")} ${i + 1}`,
date: new Date(Date.now() - i * 864e5),
views: 100 + i * 50,
likes: Math.floor(i * 1.5)
}));
}
renderSampleArticles() {
const articles = this.generateSampleArticles(20);
this.listContainer.empty();
articles.forEach((article) => {
const card = this.listContainer.createDiv({ cls: "article-card" });
const content = card.createDiv({ cls: "article-content" });
content.createEl("div", {
cls: "article-title",
text: article.title
});
const metaContainer = content.createDiv({ cls: "meta-container" });
metaContainer.createEl("div", {
cls: "article-date",
text: article.date.toLocaleDateString()
});
metaContainer.createEl("div", {
cls: "article-views",
text: `${article.views}\u6B21\u9605\u8BFB`
});
metaContainer.createEl("div", {
cls: "article-likes",
text: `\u2665 ${article.likes}`
});
const actions = card.createDiv({ cls: "article-actions" });
actions.createEl("button", {
cls: "view-button",
text: t("View Detail")
});
});
}
async onClose() {
}
};
// src/main.ts
var PublishPlugin = class extends import_obsidian9.Plugin {
constructor() {
super(...arguments);
this.accountStore = useAccountStore.getState();
}
async onload() {
interceptor_default(this);
await this.registerPluginResources();
await this.accountStore.loginAccount();
}
async registerPluginResources() {
this.registerView(VIEW_PROFILE, (leaf) => this.profileView = new OppProfileView(leaf));
this.registerView(VIEW_ARTICLE_LIST, (leaf) => new ArticleListView(leaf));
this.registerView(VIEW_ARTICLE_DETAIL, (leaf) => this.articleDetailView = new ArticleDetailView(leaf));
this.addRibbonIcon("dice", "OPP Profile", () => this.activateView(VIEW_PROFILE));
this.settingsPage = new PublishSettingsTab(this);
this.addSettingTab(this.settingsPage);
this.registerEvent(this.app.workspace.on("file-menu", (menu, file) => {
menu.addItem((item) => {
item.setTitle("Publish").setIcon("Publish").onClick(async () => {
if (useAccountStore.getState().isLogin()) {
const f = file.vault.getFileByPath(file.path);
if (!f)
return;
const success = await publish(f, this.app);
if (success) {
new import_obsidian9.Notice("Publish success");
} else {
new import_obsidian9.Notice("Publish failed");
}
} else {
new import_obsidian9.Notice("Please login first");
}
});
});
}));
}
async activateView(viewType, position = "right") {
const { workspace } = this.app;
let leaf = null;
const leaves = workspace.getLeavesOfType(viewType);
if (leaves.length > 0) {
leaf = leaves[0];
} else {
const getRightLeaf = {
right: () => workspace.getRightLeaf(false),
left: () => workspace.getLeftLeaf(false),
center: () => workspace.getLeaf(false)
};
leaf = getRightLeaf[position]();
await leaf.setViewState({ type: viewType, active: true });
}
workspace.revealLeaf(leaf);
}
};
var main_default = PublishPlugin;
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {});
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/**
* @license React
* react-dom.development.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.development.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.development.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* Checks if an event is supported in the current execution environment.
*
* NOTE: This will not work correctly for non-generic events such as `change`,
* `reset`, `load`, `error`, and `select`.
*
* Borrows from Modernizr.
*
* @param {string} eventNameSuffix Event name, e.g. "click".
* @return {boolean} True if the event is supported.
* @internal
* @license Modernizr 3.0.0pre (Custom Build) | MIT
*/
/** @license React v16.13.1
* react-is.development.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9mb3JtLWRhdGEvbGliL2Jyb3dzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9wcm94eS1mcm9tLWVudi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZm9sbG93LXJlZGlyZWN0cy9kZWJ1Zy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2ZvbGxvdy1yZWRpcmVjdHMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL29iamVjdC1pbnNwZWN0L3V0aWwuaW5zcGVjdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL29iamVjdC1pbnNwZWN0L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsLWxpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9lcy1vYmplY3QtYXRvbXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yYW5nZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yZWYuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvc3ludGF4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3VyaS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9hYnMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvZmxvb3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvbWF4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL21pbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9wb3cuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvcm91bmQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvaXNOYU4uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvc2lnbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2dvcGQvZ09QRC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2dvcGQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9lcy1kZWZpbmUtcHJvcGVydHkvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZ2V0LXByb3RvL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9nZXQtcHJvdG8vT2JqZWN0LmdldFByb3RvdHlwZU9mLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkNhbGwuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkFwcGx5LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvcmVmbGVjdEFwcGx5LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYWN0dWFsQXBwbHkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2R1bmRlci1wcm90by9nZXQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9nZXQtcHJvdG8vaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9oYXNvd24vaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvY2FsbC1ib3VuZC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC1tYXAvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwtd2Vha21hcC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3FzL2xpYi9mb3JtYXRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm9vcC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hdGl2ZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VmFsdWUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hHZXQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hIYXMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0hhc2guanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZURlbGV0ZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlR2V0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZVNldC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXAuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlQ2xlYXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVEZWxldGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlR2V0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVTZXQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21lbW9pemVDYXBwZWQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvUGF0aC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlNYXAuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUb1N0cmluZy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1N0cmluZy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdFBhdGguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvS2V5LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2dldC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9ub3cuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RyaW1tZWRFbmRJbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRyaW0uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9OdW1iZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvZGVib3VuY2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvdGhyb3R0bGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9oYXMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2NoZWNrUHJvcFR5cGVzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNOdWxsLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3RyaW5nLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0RlbGV0ZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tHZXQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja1NldC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3RhY2suanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VGb3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQnVmZmVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19VaW50OEFycmF5LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUFycmF5QnVmZmVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlBcnJheS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUNyZWF0ZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzUGxhaW5PYmplY3QuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbm9kZVV0aWwuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19zYWZlR2V0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25WYWx1ZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weU9iamVjdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzSW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gva2V5c0luLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvUGxhaW5PYmplY3QuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZURlZXAuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXBwbHkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJSZXN0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2NvbnN0YW50LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0VG9TdHJpbmcuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Nob3J0T3V0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVBc3NpZ25lci5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZXJnZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlFYWNoLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduSW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RmlsdGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UHVzaC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9sc0luLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5U3ltYm9sc0luLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0QWxsS2V5cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5c0luLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19EYXRhVmlldy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fUHJvbWlzZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19XZWFrTWFwLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUFycmF5LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZURhdGFWaWV3LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVJlZ0V4cC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVTeW1ib2wuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUJ5VGFnLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXAuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNNYXAuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1NldC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1NldC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUNsb25lLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2xhc3QuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTbGljZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fcGFyZW50LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5zZXQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2N1c3RvbU9taXRDbG9uZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNGbGF0dGVuYWJsZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZsYXR0ZW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmxhdHRlbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZmxhdFJlc3QuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvb21pdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1VuZGVmaW5lZC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVBZGQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlTb21lLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxBcnJheXMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcFRvQXJyYXkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsQnlUYWcuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsT2JqZWN0cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWxEZWVwLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VxdWFsLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRW1wdHkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3JPd24uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VFYWNoLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRWFjaC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdEZ1bmN0aW9uLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZvckVhY2guanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvZWFjaC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zZXQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmVEZWVwV2l0aC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2NvcHktdGV4dC10by1jbGlwYm9hcmQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNOdW1iZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrQnkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VIYXNJbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzUGF0aC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9oYXNJbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVBpY2suanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9sb2Rhc2gvcGljay5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3JlYWN0LWluZmluaXRlLXNjcm9sbGVyL2Rpc3QvSW5maW5pdGVTY3JvbGwuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9yZWFjdC1pbmZpbml0ZS1zY3JvbGxlci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL21haW4udHMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3NFcnJvci5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9ub2RlL2NsYXNzZXMvRm9ybURhdGEuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b0Zvcm1EYXRhLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vbm9kZS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9ub2RlL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2NvbW1vbi91dGlscy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvVVJMRW5jb2RlZEZvcm0uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zSGVhZGVycy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy9odHRwLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2Vudi9kYXRhLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Zyb21EYXRhVVJJLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NUcmFuc2Zvcm1TdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvU3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcmVhZEJsb2IuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9abGliSGVhZGVyVHJhbnNmb3JtU3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY2FsbGJhY2tpZnkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcGVlZG9tZXRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Rocm90dGxlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbXBvc2VTaWduYWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdHJhY2tTdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvZmV0Y2guanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvYWRhcHRlcnMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy92YWxpZGF0b3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsVG9rZW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9IdHRwU3RhdHVzQ29kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9heGlvcy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL3V0aWxzL3JlcXVlc3QudHMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL3NyYy9jb21tb24vY29uZmlnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9zcmMvaW50ZXJjZXB0b3IvcmVxdWVzdC50cyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL2ludGVyY2VwdG9yL2luZGV4LnRzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvenVzdGFuZC9lc20vdmFuaWxsYS5tanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL3NyYy91dGlscy9jcnlwdG8udHMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL3NyYy9hcGkvYWNjb3VudC50cyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL21pZGRsZXdhcmUubWpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9zcmMvc3RvcmUvYWNjb3VudC50cyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL3N0b3JlL2luZGV4LnRzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9zcmMvc2VydmljZS9wdWJsaXNoX3Byb2Nlc3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL3NyYy9hcGkvYXJ0aWNsZS50cyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL2NvbXBvbmVudHMvbWVzc2FnZS50cyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL3ZpZXdzL3NldHRpbmdzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9zcmMvdmlld3Mvb3BwX3Byb2ZpbGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL3NyYy9jb21wb25lbnRzL2Jhc2VJdGVtVmlldy50cyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL3ZpZXdzL2NvbXBvbmVudHMvcHJvZmlsZV92aWV3LnRzeCIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2Jhc2UvZm91bmRhdGlvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3V0aWxzL2xvZy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9fYmFzZS9iYXNlQ29tcG9uZW50LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZ2V0RGF0YUF0dHIuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9iYXNlL2Vudi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy90eXBvZ3JhcGh5L3R5cG9ncmFwaHkuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy90eXBvZ3JhcGh5L2NvbnN0YW50cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy90eXBvZ3JhcGh5L3RleHQuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvdHlwb2dyYXBoeS9iYXNlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3R5cG9ncmFwaHkvY29weWFibGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvdG9vbHRpcC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3V0aWxzL3dhcm5pbmcuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy9pc051bGxPclVuZGVmaW5lZC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3V0aWxzL0V2ZW50LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvaXNFbGVtZW50LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZG9tLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdG9vbHRpcC9mb3VuZGF0aW9uLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvYTExeS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3Rvb2x0aXAvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvdXVpZC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9fYmFzZS9yZWFjdFV0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL191dGlscy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9fdXRpbHMvc2VtaS1nbG9iYWwuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvX3BvcnRhbC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9jb25maWdQcm92aWRlci9jb250ZXh0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3Rvb2x0aXAvVHJpYW5nbGVBcnJvdy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy90b29sdGlwL1RyaWFuZ2xlQXJyb3dWZXJ0aWNhbC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy90b29sdGlwL0Fycm93Qm91bmRpbmdTaGFwZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9fY3NzQW5pbWF0aW9uL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZnVuY3Rpb24uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvbG9jYWxlL2xvY2FsZUNvbnN1bWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL2xvY2FsZS9jb250ZXh0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkTG9jYWxpemVGbi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4vaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3RvSW50ZWdlci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS90b0RhdGUvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9kZWZhdWx0T3B0aW9ucy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvaXNTYW1lVVRDV2Vlay9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvemgtQ04vX2xpYi9mb3JtYXREaXN0YW5jZS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvemgtQ04vX2xpYi9mb3JtYXRMb25nL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS96aC1DTi9fbGliL2Zvcm1hdFJlbGF0aXZlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS96aC1DTi9fbGliL2xvY2FsaXplL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS96aC1DTi9fbGliL21hdGNoL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS96aC1DTi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9sb2NhbGUvc291cmNlL3poX0NOLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWNvbnMvbGliL2VzL2NvbXBvbmVudHMvSWNvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWljb25zL2xpYi9lcy9lbnYuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1pY29ucy9saWIvZXMvaWNvbnMvSWNvbkNoZXZyb25Eb3duLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWNvbnMvbGliL2VzL2ljb25zL0ljb25DaGV2cm9uTGVmdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWljb25zL2xpYi9lcy9pY29ucy9JY29uQ2hldnJvblJpZ2h0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWNvbnMvbGliL2VzL2ljb25zL0ljb25DbG9zZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWljb25zL2xpYi9lcy9pY29ucy9JY29uQ29weS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWljb25zL2xpYi9lcy9pY29ucy9JY29uRGVsZXRlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWNvbnMvbGliL2VzL2ljb25zL0ljb25MaW5rLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWNvbnMvbGliL2VzL2ljb25zL0ljb25UaWNrLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvaXNFbnRlclByZXNzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMva2V5Q29kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9wb3BvdmVyL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvcG9wb3Zlci9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvcG9wb3Zlci9BcnJvdy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy90eXBvZ3JhcGh5L3V0aWwuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvdHlwb2dyYXBoeS9jb250ZXh0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3Jlc2l6ZU9ic2VydmVyL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3R5cG9ncmFwaHkvdGl0bGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvdHlwb2dyYXBoeS9wYXJhZ3JhcGguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvdHlwb2dyYXBoeS9udW1lcmFsLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdHlwb2dyYXBoeS9mb3JtYXROdW1lcmFsLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3R5cG9ncmFwaHkvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvc3Bpbi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3NwaW4vY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvc3Bpbi9mb3VuZGF0aW9uLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3NwaW4vaWNvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9hdmF0YXIvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9hdmF0YXIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvYXZhdGFyL2ZvdW5kYXRpb24uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvYXZhdGFyL1RvcFNsb3RTdmcuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvaWNvbkJ1dHRvbi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2J1dHRvbi9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9pY29ucy9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvYnV0dG9uL0J1dHRvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9idXR0b24vaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvY2FyZC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2NhcmQvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL2NhcmQvbWV0YS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9za2VsZXRvbi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3NrZWxldG9uL2NvbnN0YW50cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9za2VsZXRvbi9pdGVtLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3NwYWNlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvc3BhY2UvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3NwYWNlL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9zcmMvdXRpbHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL3NyYy9jb3BpZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL3NyYy9pbmRleC50cyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9lbXB0eS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2VtcHR5L2NvbnN0YW50cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9kcm9wZG93bi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2Ryb3Bkb3duL2NvbnN0YW50cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2Ryb3Bkb3duL2ZvdW5kYXRpb24uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvZHJvcGRvd24vZHJvcGRvd25NZW51LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvZHJvcGRvd24vbWVudUZvdW5kYXRpb24uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvZHJvcGRvd24vY29udGV4dC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9kcm9wZG93bi9kcm9wZG93bkl0ZW0uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvZHJvcGRvd24vZHJvcGRvd25EaXZpZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL2Ryb3Bkb3duL2Ryb3Bkb3duVGl0bGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvZ3JpZC9yb3cuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9ncmlkL2NvbnN0YW50cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9ncmlkL2NvbC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9sYXlvdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9sYXlvdXQvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL2xheW91dC9sYXlvdXQtY29udGV4dC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9sYXlvdXQvU2lkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvbGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2xpc3QvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL2xpc3QvaXRlbS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9saXN0L2xpc3QtY29udGV4dC5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy9vdmVyZmxvd0xpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9vdmVyZmxvd0xpc3QvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL292ZXJmbG93TGlzdC9pbnRlcnNlY3Rpb25PYnNlcnZlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL292ZXJmbG93TGlzdC9mb3VuZGF0aW9uLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3RhYnMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy90YWJzL2NvbnN0YW50cy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3RhYnMvZm91bmRhdGlvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy90YWJzL1RhYkJhci5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLXVpL2xpYi9lcy90YWJzL1RhYkl0ZW0uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS11aS9saWIvZXMvdGFicy9UYWJQYW5lLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktdWkvbGliL2VzL3RhYnMvdGFicy1jb250ZXh0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucy9saWIvZXMvaWxsdXN0cmF0aW9ucy9JbGx1c3RyYXRpb25Db25zdHJ1Y3Rpb25EYXJrLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucy9saWIvZXMvaWxsdXN0cmF0aW9ucy9JbGx1c3RyYXRpb25Db25zdHJ1Y3Rpb24uanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1pbGx1c3RyYXRpb25zL2xpYi9lcy9pbGx1c3RyYXRpb25zL0lsbHVzdHJhdGlvbkZhaWx1cmVEYXJrLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucy9saWIvZXMvaWxsdXN0cmF0aW9ucy9JbGx1c3RyYXRpb25GYWlsdXJlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucy9saWIvZXMvaWxsdXN0cmF0aW9ucy9JbGx1c3RyYXRpb25JZGxlRGFyay5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWlsbHVzdHJhdGlvbnMvbGliL2VzL2lsbHVzdHJhdGlvbnMvSWxsdXN0cmF0aW9uSWRsZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWlsbHVzdHJhdGlvbnMvbGliL2VzL2lsbHVzdHJhdGlvbnMvSWxsdXN0cmF0aW9uTm9BY2Nlc3NEYXJrLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucy9saWIvZXMvaWxsdXN0cmF0aW9ucy9JbGx1c3RyYXRpb25Ob0FjY2Vzcy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWlsbHVzdHJhdGlvbnMvbGliL2VzL2lsbHVzdHJhdGlvbnMvSWxsdXN0cmF0aW9uTm9Db250ZW50RGFyay5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWlsbHVzdHJhdGlvbnMvbGliL2VzL2lsbHVzdHJhdGlvbnMvSWxsdXN0cmF0aW9uTm9Db250ZW50LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucy9saWIvZXMvaWxsdXN0cmF0aW9ucy9JbGx1c3RyYXRpb25Ob1Jlc3VsdERhcmsuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1pbGx1c3RyYXRpb25zL2xpYi9lcy9pbGx1c3RyYXRpb25zL0lsbHVzdHJhdGlvbk5vUmVzdWx0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucy9saWIvZXMvaWxsdXN0cmF0aW9ucy9JbGx1c3RyYXRpb25Ob3RGb3VuZERhcmsuanMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL25vZGVfbW9kdWxlcy9AZG91eWluZmUvc2VtaS1pbGx1c3RyYXRpb25zL2xpYi9lcy9pbGx1c3RyYXRpb25zL0lsbHVzdHJhdGlvbk5vdEZvdW5kLmpzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9ub2RlX21vZHVsZXMvQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucy9saWIvZXMvaWxsdXN0cmF0aW9ucy9JbGx1c3RyYXRpb25TdWNjZXNzRGFyay5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vbm9kZV9tb2R1bGVzL0Bkb3V5aW5mZS9zZW1pLWlsbHVzdHJhdGlvbnMvbGliL2VzL2lsbHVzdHJhdGlvbnMvSWxsdXN0cmF0aW9uU3VjY2Vzcy5qcyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL3ZpZXdzL2NvbXBvbmVudHMvbGlzdF92aWV3LnRzeCIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL3ZpZXdzL2NvbXBvbmVudHMvYXJ0aWNsZV9pdGVtLnRzeCIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL3ZpZXdzL2FydGljbGVfZGV0YWlsLnRzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9zcmMvaTE4bi9pbmRleC50cyIsICIuLi8uLi8uLi8uLi8uLi9Xb3Jrc3BhY2Uvb2JzaWRpYW5fcHVibGlzaF9wbHVnaW4vb2JzaWRpYW4tcHVibGlzaC1wbHVnaW4vc3JjL2kxOG4vZW4udHMiLCAiLi4vLi4vLi4vLi4vLi4vV29ya3NwYWNlL29ic2lkaWFuX3B1Ymxpc2hfcGx1Z2luL29ic2lkaWFuLXB1Ymxpc2gtcGx1Z2luL3NyYy9pMThuL3poLnRzIiwgIi4uLy4uLy4uLy4uLy4uL1dvcmtzcGFjZS9vYnNpZGlhbl9wdWJsaXNoX3BsdWdpbi9vYnNpZGlhbi1wdWJsaXNoLXBsdWdpbi9zcmMvdmlld3MvYXJ0aWNsZV9saXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2U7XG5cbnZhciBERUZBVUxUX1BPUlRTID0ge1xuICBmdHA6IDIxLFxuICBnb3BoZXI6IDcwLFxuICBodHRwOiA4MCxcbiAgaHR0cHM6IDQ0MyxcbiAgd3M6IDgwLFxuICB3c3M6IDQ0Myxcbn07XG5cbnZhciBzdHJpbmdFbmRzV2l0aCA9IFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGggfHwgZnVuY3Rpb24ocykge1xuICByZXR1cm4gcy5sZW5ndGggPD0gdGhpcy5sZW5ndGggJiZcbiAgICB0aGlzLmluZGV4T2YocywgdGhpcy5sZW5ndGggLSBzLmxlbmd0aCkgIT09IC0xO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHVybCAtIFRoZSBVUkwsIG9yIHRoZSByZXN1bHQgZnJvbSB1cmwucGFyc2UuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVUkwgb2YgdGhlIHByb3h5IHRoYXQgc2hvdWxkIGhhbmRsZSB0aGUgcmVxdWVzdCB0byB0aGVcbiAqICBnaXZlbiBVUkwuIElmIG5vIHByb3h5IGlzIHNldCwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJveHlGb3JVcmwodXJsKSB7XG4gIHZhciBwYXJzZWRVcmwgPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHBhcnNlVXJsKHVybCkgOiB1cmwgfHwge307XG4gIHZhciBwcm90byA9IHBhcnNlZFVybC5wcm90b2NvbDtcbiAgdmFyIGhvc3RuYW1lID0gcGFyc2VkVXJsLmhvc3Q7XG4gIHZhciBwb3J0ID0gcGFyc2VkVXJsLnBvcnQ7XG4gIGlmICh0eXBlb2YgaG9zdG5hbWUgIT09ICdzdHJpbmcnIHx8ICFob3N0bmFtZSB8fCB0eXBlb2YgcHJvdG8gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICcnOyAgLy8gRG9uJ3QgcHJveHkgVVJMcyB3aXRob3V0IGEgdmFsaWQgc2NoZW1lIG9yIGhvc3QuXG4gIH1cblxuICBwcm90byA9IHByb3RvLnNwbGl0KCc6JywgMSlbMF07XG4gIC8vIFN0cmlwcGluZyBwb3J0cyBpbiB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nIHBhcnNlZFVybC5ob3N0bmFtZSB0byBtYWtlXG4gIC8vIHN1cmUgdGhhdCB0aGUgYnJhY2tldHMgYXJvdW5kIElQdjYgYWRkcmVzc2VzIGFyZSBrZXB0LlxuICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoLzpcXGQqJC8sICcnKTtcbiAgcG9ydCA9IHBhcnNlSW50KHBvcnQpIHx8IERFRkFVTFRfUE9SVFNbcHJvdG9dIHx8IDA7XG4gIGlmICghc2hvdWxkUHJveHkoaG9zdG5hbWUsIHBvcnQpKSB7XG4gICAgcmV0dXJuICcnOyAgLy8gRG9uJ3QgcHJveHkgVVJMcyB0aGF0IG1hdGNoIE5PX1BST1hZLlxuICB9XG5cbiAgdmFyIHByb3h5ID1cbiAgICBnZXRFbnYoJ25wbV9jb25maWdfJyArIHByb3RvICsgJ19wcm94eScpIHx8XG4gICAgZ2V0RW52KHByb3RvICsgJ19wcm94eScpIHx8XG4gICAgZ2V0RW52KCducG1fY29uZmlnX3Byb3h5JykgfHxcbiAgICBnZXRFbnYoJ2FsbF9wcm94eScpO1xuICBpZiAocHJveHkgJiYgcHJveHkuaW5kZXhPZignOi8vJykgPT09IC0xKSB7XG4gICAgLy8gTWlzc2luZyBzY2hlbWUgaW4gcHJveHksIGRlZmF1bHQgdG8gdGhlIHJlcXVlc3RlZCBVUkwncyBzY2hlbWUuXG4gICAgcHJveHkgPSBwcm90byArICc6Ly8nICsgcHJveHk7XG4gIH1cbiAgcmV0dXJuIHByb3h5O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGdpdmVuIFVSTCBzaG91bGQgYmUgcHJveGllZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaG9zdG5hbWUgLSBUaGUgaG9zdCBuYW1lIG9mIHRoZSBVUkwuXG4gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBlZmZlY3RpdmUgcG9ydCBvZiB0aGUgVVJMLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIFVSTCBzaG91bGQgYmUgcHJveGllZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFByb3h5KGhvc3RuYW1lLCBwb3J0KSB7XG4gIHZhciBOT19QUk9YWSA9XG4gICAgKGdldEVudignbnBtX2NvbmZpZ19ub19wcm94eScpIHx8IGdldEVudignbm9fcHJveHknKSkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFOT19QUk9YWSkge1xuICAgIHJldHVybiB0cnVlOyAgLy8gQWx3YXlzIHByb3h5IGlmIE5PX1BST1hZIGlzIG5vdCBzZXQuXG4gIH1cbiAgaWYgKE5PX1BST1hZID09PSAnKicpIHtcbiAgICByZXR1cm4gZmFsc2U7ICAvLyBOZXZlciBwcm94eSBpZiB3aWxkY2FyZCBpcyBzZXQuXG4gIH1cblxuICByZXR1cm4gTk9fUFJPWFkuc3BsaXQoL1ssXFxzXS8pLmV2ZXJ5KGZ1bmN0aW9uKHByb3h5KSB7XG4gICAgaWYgKCFwcm94eSkge1xuICAgICAgcmV0dXJuIHRydWU7ICAvLyBTa2lwIHplcm8tbGVuZ3RoIGhvc3RzLlxuICAgIH1cbiAgICB2YXIgcGFyc2VkUHJveHkgPSBwcm94eS5tYXRjaCgvXiguKyk6KFxcZCspJC8pO1xuICAgIHZhciBwYXJzZWRQcm94eUhvc3RuYW1lID0gcGFyc2VkUHJveHkgPyBwYXJzZWRQcm94eVsxXSA6IHByb3h5O1xuICAgIHZhciBwYXJzZWRQcm94eVBvcnQgPSBwYXJzZWRQcm94eSA/IHBhcnNlSW50KHBhcnNlZFByb3h5WzJdKSA6IDA7XG4gICAgaWYgKHBhcnNlZFByb3h5UG9ydCAmJiBwYXJzZWRQcm94eVBvcnQgIT09IHBvcnQpIHtcbiAgICAgIHJldHVybiB0cnVlOyAgLy8gU2tpcCBpZiBwb3J0cyBkb24ndCBtYXRjaC5cbiAgICB9XG5cbiAgICBpZiAoIS9eWy4qXS8udGVzdChwYXJzZWRQcm94eUhvc3RuYW1lKSkge1xuICAgICAgLy8gTm8gd2lsZGNhcmRzLCBzbyBzdG9wIHByb3h5aW5nIGlmIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLlxuICAgICAgcmV0dXJuIGhvc3RuYW1lICE9PSBwYXJzZWRQcm94eUhvc3RuYW1lO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWRQcm94eUhvc3RuYW1lLmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICAvLyBSZW1vdmUgbGVhZGluZyB3aWxkY2FyZC5cbiAgICAgIHBhcnNlZFByb3h5SG9zdG5hbWUgPSBwYXJzZWRQcm94eUhvc3RuYW1lLnNsaWNlKDEpO1xuICAgIH1cbiAgICAvLyBTdG9wIHByb3h5aW5nIGlmIHRoZSBob3N0bmFtZSBlbmRzIHdpdGggdGhlIG5vX3Byb3h5IGhvc3QuXG4gICAgcmV0dXJuICFzdHJpbmdFbmRzV2l0aC5jYWxsKGhvc3RuYW1lLCBwYXJzZWRQcm94eUhvc3RuYW1lKTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldEVudihrZXkpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52W2tleS50b0xvd2VyQ2FzZSgpXSB8fCBwcm9jZXNzLmVudltrZXkudG9VcHBlckNhc2UoKV0gfHwgJyc7XG59XG5cbmV4cG9ydHMuZ2V0UHJveHlGb3JVcmwgPSBnZXRQcm94eUZvclVybDtcbiIsICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCAiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKi9cblxuZnVuY3Rpb24gc2V0dXAoZW52KSB7XG5cdGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmRlZmF1bHQgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuY29lcmNlID0gY29lcmNlO1xuXHRjcmVhdGVEZWJ1Zy5kaXNhYmxlID0gZGlzYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlID0gZW5hYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGVkID0gZW5hYmxlZDtcblx0Y3JlYXRlRGVidWcuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXHRjcmVhdGVEZWJ1Zy5kZXN0cm95ID0gZGVzdHJveTtcblxuXHRPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goa2V5ID0+IHtcblx0XHRjcmVhdGVEZWJ1Z1trZXldID0gZW52W2tleV07XG5cdH0pO1xuXG5cdC8qKlxuXHQqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuXHQqL1xuXG5cdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0LyoqXG5cdCogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuXHQqXG5cdCogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuXHQqL1xuXHRjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzID0ge307XG5cblx0LyoqXG5cdCogU2VsZWN0cyBhIGNvbG9yIGZvciBhIGRlYnVnIG5hbWVzcGFjZVxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBzdHJpbmcgZm9yIHRoZSBkZWJ1ZyBpbnN0YW5jZSB0byBiZSBjb2xvcmVkXG5cdCogQHJldHVybiB7TnVtYmVyfFN0cmluZ30gQW4gQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuXHRcdGxldCBoYXNoID0gMDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcblx0XHRcdGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNyZWF0ZURlYnVnLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGNyZWF0ZURlYnVnLmNvbG9ycy5sZW5ndGhdO1xuXHR9XG5cdGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yID0gc2VsZWN0Q29sb3I7XG5cblx0LyoqXG5cdCogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQHJldHVybiB7RnVuY3Rpb259XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cdFx0bGV0IHByZXZUaW1lO1xuXHRcdGxldCBlbmFibGVPdmVycmlkZSA9IG51bGw7XG5cdFx0bGV0IG5hbWVzcGFjZXNDYWNoZTtcblx0XHRsZXQgZW5hYmxlZENhY2hlO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0aWYgKGVuYWJsZU92ZXJyaWRlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVuYWJsZU92ZXJyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChuYW1lc3BhY2VzQ2FjaGUgIT09IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMpIHtcblx0XHRcdFx0XHRuYW1lc3BhY2VzQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzO1xuXHRcdFx0XHRcdGVuYWJsZWRDYWNoZSA9IGNyZWF0ZURlYnVnLmVuYWJsZWQobmFtZXNwYWNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbmFibGVkQ2FjaGU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiB2ID0+IHtcblx0XHRcdFx0ZW5hYmxlT3ZlcnJpZGUgPSB2O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcblx0XHRpZiAodHlwZW9mIGNyZWF0ZURlYnVnLmluaXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNyZWF0ZURlYnVnLmluaXQoZGVidWcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWJ1Zztcblx0fVxuXG5cdGZ1bmN0aW9uIGV4dGVuZChuYW1lc3BhY2UsIGRlbGltaXRlcikge1xuXHRcdGNvbnN0IG5ld0RlYnVnID0gY3JlYXRlRGVidWcodGhpcy5uYW1lc3BhY2UgKyAodHlwZW9mIGRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnOicgOiBkZWxpbWl0ZXIpICsgbmFtZXNwYWNlKTtcblx0XHRuZXdEZWJ1Zy5sb2cgPSB0aGlzLmxvZztcblx0XHRyZXR1cm4gbmV3RGVidWc7XG5cdH1cblxuXHQvKipcblx0KiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG5cdCogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcblx0XHRjcmVhdGVEZWJ1Zy5zYXZlKG5hbWVzcGFjZXMpO1xuXHRcdGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xuXG5cdFx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0XHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdFx0Y29uc3Qgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKVxuXHRcdFx0LnRyaW0oKVxuXHRcdFx0LnJlcGxhY2UoL1xccysvZywgJywnKVxuXHRcdFx0LnNwbGl0KCcsJylcblx0XHRcdC5maWx0ZXIoQm9vbGVhbik7XG5cblx0XHRmb3IgKGNvbnN0IG5zIG9mIHNwbGl0KSB7XG5cdFx0XHRpZiAobnNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5zLnNsaWNlKDEpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHN0cmluZyBtYXRjaGVzIGEgbmFtZXNwYWNlIHRlbXBsYXRlLCBob25vcmluZ1xuXHQgKiBhc3Rlcmlza3MgYXMgd2lsZGNhcmRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc2VhcmNoXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuXHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHQgKi9cblx0ZnVuY3Rpb24gbWF0Y2hlc1RlbXBsYXRlKHNlYXJjaCwgdGVtcGxhdGUpIHtcblx0XHRsZXQgc2VhcmNoSW5kZXggPSAwO1xuXHRcdGxldCB0ZW1wbGF0ZUluZGV4ID0gMDtcblx0XHRsZXQgc3RhckluZGV4ID0gLTE7XG5cdFx0bGV0IG1hdGNoSW5kZXggPSAwO1xuXG5cdFx0d2hpbGUgKHNlYXJjaEluZGV4IDwgc2VhcmNoLmxlbmd0aCkge1xuXHRcdFx0aWYgKHRlbXBsYXRlSW5kZXggPCB0ZW1wbGF0ZS5sZW5ndGggJiYgKHRlbXBsYXRlW3RlbXBsYXRlSW5kZXhdID09PSBzZWFyY2hbc2VhcmNoSW5kZXhdIHx8IHRlbXBsYXRlW3RlbXBsYXRlSW5kZXhdID09PSAnKicpKSB7XG5cdFx0XHRcdC8vIE1hdGNoIGNoYXJhY3RlciBvciBwcm9jZWVkIHdpdGggd2lsZGNhcmRcblx0XHRcdFx0aWYgKHRlbXBsYXRlW3RlbXBsYXRlSW5kZXhdID09PSAnKicpIHtcblx0XHRcdFx0XHRzdGFySW5kZXggPSB0ZW1wbGF0ZUluZGV4O1xuXHRcdFx0XHRcdG1hdGNoSW5kZXggPSBzZWFyY2hJbmRleDtcblx0XHRcdFx0XHR0ZW1wbGF0ZUluZGV4Kys7IC8vIFNraXAgdGhlICcqJ1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlYXJjaEluZGV4Kys7XG5cdFx0XHRcdFx0dGVtcGxhdGVJbmRleCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHN0YXJJbmRleCAhPT0gLTEpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZWdhdGVkLWNvbmRpdGlvblxuXHRcdFx0XHQvLyBCYWNrdHJhY2sgdG8gdGhlIGxhc3QgJyonIGFuZCB0cnkgdG8gbWF0Y2ggbW9yZSBjaGFyYWN0ZXJzXG5cdFx0XHRcdHRlbXBsYXRlSW5kZXggPSBzdGFySW5kZXggKyAxO1xuXHRcdFx0XHRtYXRjaEluZGV4Kys7XG5cdFx0XHRcdHNlYXJjaEluZGV4ID0gbWF0Y2hJbmRleDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTsgLy8gTm8gbWF0Y2hcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgdHJhaWxpbmcgJyonIGluIHRlbXBsYXRlXG5cdFx0d2hpbGUgKHRlbXBsYXRlSW5kZXggPCB0ZW1wbGF0ZS5sZW5ndGggJiYgdGVtcGxhdGVbdGVtcGxhdGVJbmRleF0gPT09ICcqJykge1xuXHRcdFx0dGVtcGxhdGVJbmRleCsrO1xuXHRcdH1cblxuXHRcdHJldHVybiB0ZW1wbGF0ZUluZGV4ID09PSB0ZW1wbGF0ZS5sZW5ndGg7XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRmb3IgKGNvbnN0IHNraXAgb2YgY3JlYXRlRGVidWcuc2tpcHMpIHtcblx0XHRcdGlmIChtYXRjaGVzVGVtcGxhdGUobmFtZSwgc2tpcCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgbnMgb2YgY3JlYXRlRGVidWcubmFtZXMpIHtcblx0XHRcdGlmIChtYXRjaGVzVGVtcGxhdGUobmFtZSwgbnMpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCAiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gbG9jYWxzdG9yYWdlKCk7XG5leHBvcnRzLmRlc3Ryb3kgPSAoKCkgPT4ge1xuXHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIXdhcm5lZCkge1xuXHRcdFx0d2FybmVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuXHQnIzAwMDBDQycsXG5cdCcjMDAwMEZGJyxcblx0JyMwMDMzQ0MnLFxuXHQnIzAwMzNGRicsXG5cdCcjMDA2NkNDJyxcblx0JyMwMDY2RkYnLFxuXHQnIzAwOTlDQycsXG5cdCcjMDA5OUZGJyxcblx0JyMwMENDMDAnLFxuXHQnIzAwQ0MzMycsXG5cdCcjMDBDQzY2Jyxcblx0JyMwMENDOTknLFxuXHQnIzAwQ0NDQycsXG5cdCcjMDBDQ0ZGJyxcblx0JyMzMzAwQ0MnLFxuXHQnIzMzMDBGRicsXG5cdCcjMzMzM0NDJyxcblx0JyMzMzMzRkYnLFxuXHQnIzMzNjZDQycsXG5cdCcjMzM2NkZGJyxcblx0JyMzMzk5Q0MnLFxuXHQnIzMzOTlGRicsXG5cdCcjMzNDQzAwJyxcblx0JyMzM0NDMzMnLFxuXHQnIzMzQ0M2NicsXG5cdCcjMzNDQzk5Jyxcblx0JyMzM0NDQ0MnLFxuXHQnIzMzQ0NGRicsXG5cdCcjNjYwMENDJyxcblx0JyM2NjAwRkYnLFxuXHQnIzY2MzNDQycsXG5cdCcjNjYzM0ZGJyxcblx0JyM2NkNDMDAnLFxuXHQnIzY2Q0MzMycsXG5cdCcjOTkwMENDJyxcblx0JyM5OTAwRkYnLFxuXHQnIzk5MzNDQycsXG5cdCcjOTkzM0ZGJyxcblx0JyM5OUNDMDAnLFxuXHQnIzk5Q0MzMycsXG5cdCcjQ0MwMDAwJyxcblx0JyNDQzAwMzMnLFxuXHQnI0NDMDA2NicsXG5cdCcjQ0MwMDk5Jyxcblx0JyNDQzAwQ0MnLFxuXHQnI0NDMDBGRicsXG5cdCcjQ0MzMzAwJyxcblx0JyNDQzMzMzMnLFxuXHQnI0NDMzM2NicsXG5cdCcjQ0MzMzk5Jyxcblx0JyNDQzMzQ0MnLFxuXHQnI0NDMzNGRicsXG5cdCcjQ0M2NjAwJyxcblx0JyNDQzY2MzMnLFxuXHQnI0NDOTkwMCcsXG5cdCcjQ0M5OTMzJyxcblx0JyNDQ0NDMDAnLFxuXHQnI0NDQ0MzMycsXG5cdCcjRkYwMDAwJyxcblx0JyNGRjAwMzMnLFxuXHQnI0ZGMDA2NicsXG5cdCcjRkYwMDk5Jyxcblx0JyNGRjAwQ0MnLFxuXHQnI0ZGMDBGRicsXG5cdCcjRkYzMzAwJyxcblx0JyNGRjMzMzMnLFxuXHQnI0ZGMzM2NicsXG5cdCcjRkYzMzk5Jyxcblx0JyNGRjMzQ0MnLFxuXHQnI0ZGMzNGRicsXG5cdCcjRkY2NjAwJyxcblx0JyNGRjY2MzMnLFxuXHQnI0ZGOTkwMCcsXG5cdCcjRkY5OTMzJyxcblx0JyNGRkNDMDAnLFxuXHQnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0Ly8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuXHQvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuXHQvLyBleHBsaWNpdGx5XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiAod2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCB3aW5kb3cucHJvY2Vzcy5fX253anMpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGxldCBtO1xuXG5cdC8vIElzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG5cdC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduXG5cdHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuXHRcdC8vIElzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcblx0XHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuXHRcdC8vIElzIGZpcmVmb3ggPj0gdjMxP1xuXHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIChtID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykpICYmIHBhcnNlSW50KG1bMV0sIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJykgfHwgZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ0RFQlVHJykgO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxuXG5cdC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcblx0aWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG5cdFx0ciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG5cblx0cmV0dXJuIHI7XG59XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuXHR0cnkge1xuXHRcdC8vIFRWTUxLaXQgKEFwcGxlIFRWIEpTIFJ1bnRpbWUpIGRvZXMgbm90IGhhdmUgYSB3aW5kb3cgb2JqZWN0LCBqdXN0IGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHRcblx0XHQvLyBUaGUgQnJvd3NlciBhbHNvIGhhcyBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0LlxuXHRcdHJldHVybiBsb2NhbFN0b3JhZ2U7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uICh2KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnJvci5tZXNzYWdlO1xuXHR9XG59O1xuIiwgInZhciBkZWJ1ZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghZGVidWcpIHtcbiAgICB0cnkge1xuICAgICAgLyogZXNsaW50IGdsb2JhbC1yZXF1aXJlOiBvZmYgKi9cbiAgICAgIGRlYnVnID0gcmVxdWlyZShcImRlYnVnXCIpKFwiZm9sbG93LXJlZGlyZWN0c1wiKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IC8qICovIH1cbiAgICBpZiAodHlwZW9mIGRlYnVnICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGRlYnVnID0gZnVuY3Rpb24gKCkgeyAvKiAqLyB9O1xuICAgIH1cbiAgfVxuICBkZWJ1Zy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufTtcbiIsICJ2YXIgdXJsID0gcmVxdWlyZShcInVybFwiKTtcbnZhciBVUkwgPSB1cmwuVVJMO1xudmFyIGh0dHAgPSByZXF1aXJlKFwiaHR0cFwiKTtcbnZhciBodHRwcyA9IHJlcXVpcmUoXCJodHRwc1wiKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoXCJzdHJlYW1cIikuV3JpdGFibGU7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZShcImFzc2VydFwiKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoXCIuL2RlYnVnXCIpO1xuXG4vLyBQcmV2ZW50aXZlIHBsYXRmb3JtIGRldGVjdGlvblxuLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbihmdW5jdGlvbiBkZXRlY3RVbnN1cHBvcnRlZEVudmlyb25tZW50KCkge1xuICB2YXIgbG9va3NMaWtlTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiO1xuICB2YXIgbG9va3NMaWtlQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xuICB2YXIgbG9va3NMaWtlVjggPSBpc0Z1bmN0aW9uKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKTtcbiAgaWYgKCFsb29rc0xpa2VOb2RlICYmIChsb29rc0xpa2VCcm93c2VyIHx8ICFsb29rc0xpa2VWOCkpIHtcbiAgICBjb25zb2xlLndhcm4oXCJUaGUgZm9sbG93LXJlZGlyZWN0cyBwYWNrYWdlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGJyb3dzZXIgYnVpbGRzLlwiKTtcbiAgfVxufSgpKTtcblxuLy8gV2hldGhlciB0byB1c2UgdGhlIG5hdGl2ZSBVUkwgb2JqZWN0IG9yIHRoZSBsZWdhY3kgdXJsIG1vZHVsZVxudmFyIHVzZU5hdGl2ZVVSTCA9IGZhbHNlO1xudHJ5IHtcbiAgYXNzZXJ0KG5ldyBVUkwoXCJcIikpO1xufVxuY2F0Y2ggKGVycm9yKSB7XG4gIHVzZU5hdGl2ZVVSTCA9IGVycm9yLmNvZGUgPT09IFwiRVJSX0lOVkFMSURfVVJMXCI7XG59XG5cbi8vIFVSTCBmaWVsZHMgdG8gcHJlc2VydmUgaW4gY29weSBvcGVyYXRpb25zXG52YXIgcHJlc2VydmVkVXJsRmllbGRzID0gW1xuICBcImF1dGhcIixcbiAgXCJob3N0XCIsXG4gIFwiaG9zdG5hbWVcIixcbiAgXCJocmVmXCIsXG4gIFwicGF0aFwiLFxuICBcInBhdGhuYW1lXCIsXG4gIFwicG9ydFwiLFxuICBcInByb3RvY29sXCIsXG4gIFwicXVlcnlcIixcbiAgXCJzZWFyY2hcIixcbiAgXCJoYXNoXCIsXG5dO1xuXG4vLyBDcmVhdGUgaGFuZGxlcnMgdGhhdCBwYXNzIGV2ZW50cyBmcm9tIG5hdGl2ZSByZXF1ZXN0c1xudmFyIGV2ZW50cyA9IFtcImFib3J0XCIsIFwiYWJvcnRlZFwiLCBcImNvbm5lY3RcIiwgXCJlcnJvclwiLCBcInNvY2tldFwiLCBcInRpbWVvdXRcIl07XG52YXIgZXZlbnRIYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnRIYW5kbGVyc1tldmVudF0gPSBmdW5jdGlvbiAoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHRoaXMuX3JlZGlyZWN0YWJsZS5lbWl0KGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgfTtcbn0pO1xuXG4vLyBFcnJvciB0eXBlcyB3aXRoIGNvZGVzXG52YXIgSW52YWxpZFVybEVycm9yID0gY3JlYXRlRXJyb3JUeXBlKFxuICBcIkVSUl9JTlZBTElEX1VSTFwiLFxuICBcIkludmFsaWQgVVJMXCIsXG4gIFR5cGVFcnJvclxuKTtcbnZhciBSZWRpcmVjdGlvbkVycm9yID0gY3JlYXRlRXJyb3JUeXBlKFxuICBcIkVSUl9GUl9SRURJUkVDVElPTl9GQUlMVVJFXCIsXG4gIFwiUmVkaXJlY3RlZCByZXF1ZXN0IGZhaWxlZFwiXG4pO1xudmFyIFRvb01hbnlSZWRpcmVjdHNFcnJvciA9IGNyZWF0ZUVycm9yVHlwZShcbiAgXCJFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTXCIsXG4gIFwiTWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3RzIGV4Y2VlZGVkXCIsXG4gIFJlZGlyZWN0aW9uRXJyb3Jcbik7XG52YXIgTWF4Qm9keUxlbmd0aEV4Y2VlZGVkRXJyb3IgPSBjcmVhdGVFcnJvclR5cGUoXG4gIFwiRVJSX0ZSX01BWF9CT0RZX0xFTkdUSF9FWENFRURFRFwiLFxuICBcIlJlcXVlc3QgYm9keSBsYXJnZXIgdGhhbiBtYXhCb2R5TGVuZ3RoIGxpbWl0XCJcbik7XG52YXIgV3JpdGVBZnRlckVuZEVycm9yID0gY3JlYXRlRXJyb3JUeXBlKFxuICBcIkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EXCIsXG4gIFwid3JpdGUgYWZ0ZXIgZW5kXCJcbik7XG5cbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG52YXIgZGVzdHJveSA9IFdyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95IHx8IG5vb3A7XG5cbi8vIEFuIEhUVFAoUykgcmVxdWVzdCB0aGF0IGNhbiBiZSByZWRpcmVjdGVkXG5mdW5jdGlvbiBSZWRpcmVjdGFibGVSZXF1ZXN0KG9wdGlvbnMsIHJlc3BvbnNlQ2FsbGJhY2spIHtcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVxdWVzdFxuICBXcml0YWJsZS5jYWxsKHRoaXMpO1xuICB0aGlzLl9zYW5pdGl6ZU9wdGlvbnMob3B0aW9ucyk7XG4gIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLl9lbmRlZCA9IGZhbHNlO1xuICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcbiAgdGhpcy5fcmVkaXJlY3RDb3VudCA9IDA7XG4gIHRoaXMuX3JlZGlyZWN0cyA9IFtdO1xuICB0aGlzLl9yZXF1ZXN0Qm9keUxlbmd0aCA9IDA7XG4gIHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycyA9IFtdO1xuXG4gIC8vIEF0dGFjaCBhIGNhbGxiYWNrIGlmIHBhc3NlZFxuICBpZiAocmVzcG9uc2VDYWxsYmFjaykge1xuICAgIHRoaXMub24oXCJyZXNwb25zZVwiLCByZXNwb25zZUNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIFJlYWN0IHRvIHJlc3BvbnNlcyBvZiBuYXRpdmUgcmVxdWVzdHNcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9vbk5hdGl2ZVJlc3BvbnNlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNlbGYuX3Byb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gICAgfVxuICAgIGNhdGNoIChjYXVzZSkge1xuICAgICAgc2VsZi5lbWl0KFwiZXJyb3JcIiwgY2F1c2UgaW5zdGFuY2VvZiBSZWRpcmVjdGlvbkVycm9yID9cbiAgICAgICAgY2F1c2UgOiBuZXcgUmVkaXJlY3Rpb25FcnJvcih7IGNhdXNlOiBjYXVzZSB9KSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFBlcmZvcm0gdGhlIGZpcnN0IHJlcXVlc3RcbiAgdGhpcy5fcGVyZm9ybVJlcXVlc3QoKTtcbn1cblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShXcml0YWJsZS5wcm90b3R5cGUpO1xuXG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgZGVzdHJveVJlcXVlc3QodGhpcy5fY3VycmVudFJlcXVlc3QpO1xuICB0aGlzLl9jdXJyZW50UmVxdWVzdC5hYm9ydCgpO1xuICB0aGlzLmVtaXQoXCJhYm9ydFwiKTtcbn07XG5cblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgZGVzdHJveVJlcXVlc3QodGhpcy5fY3VycmVudFJlcXVlc3QsIGVycm9yKTtcbiAgZGVzdHJveS5jYWxsKHRoaXMsIGVycm9yKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBXcml0ZXMgYnVmZmVyZWQgZGF0YSB0byB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIC8vIFdyaXRpbmcgaXMgbm90IGFsbG93ZWQgaWYgZW5kIGhhcyBiZWVuIGNhbGxlZFxuICBpZiAodGhpcy5fZW5kaW5nKSB7XG4gICAgdGhyb3cgbmV3IFdyaXRlQWZ0ZXJFbmRFcnJvcigpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgaW5wdXQgYW5kIHNoaWZ0IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5XG4gIGlmICghaXNTdHJpbmcoZGF0YSkgJiYgIWlzQnVmZmVyKGRhdGEpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImRhdGEgc2hvdWxkIGJlIGEgc3RyaW5nLCBCdWZmZXIgb3IgVWludDhBcnJheVwiKTtcbiAgfVxuICBpZiAoaXNGdW5jdGlvbihlbmNvZGluZykpIHtcbiAgICBjYWxsYmFjayA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIC8vIElnbm9yZSBlbXB0eSBidWZmZXJzLCBzaW5jZSB3cml0aW5nIHRoZW0gZG9lc24ndCBpbnZva2UgdGhlIGNhbGxiYWNrXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMjIwNjZcbiAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgLy8gT25seSB3cml0ZSB3aGVuIHdlIGRvbid0IGV4Y2VlZCB0aGUgbWF4aW11bSBib2R5IGxlbmd0aFxuICBpZiAodGhpcy5fcmVxdWVzdEJvZHlMZW5ndGggKyBkYXRhLmxlbmd0aCA8PSB0aGlzLl9vcHRpb25zLm1heEJvZHlMZW5ndGgpIHtcbiAgICB0aGlzLl9yZXF1ZXN0Qm9keUxlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICB0aGlzLl9yZXF1ZXN0Qm9keUJ1ZmZlcnMucHVzaCh7IGRhdGE6IGRhdGEsIGVuY29kaW5nOiBlbmNvZGluZyB9KTtcbiAgICB0aGlzLl9jdXJyZW50UmVxdWVzdC53cml0ZShkYXRhLCBlbmNvZGluZywgY2FsbGJhY2spO1xuICB9XG4gIC8vIEVycm9yIHdoZW4gd2UgZXhjZWVkIHRoZSBtYXhpbXVtIGJvZHkgbGVuZ3RoXG4gIGVsc2Uge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBNYXhCb2R5TGVuZ3RoRXhjZWVkZWRFcnJvcigpKTtcbiAgICB0aGlzLmFib3J0KCk7XG4gIH1cbn07XG5cbi8vIEVuZHMgdGhlIGN1cnJlbnQgbmF0aXZlIHJlcXVlc3RcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChkYXRhLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgLy8gU2hpZnQgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnlcbiAgaWYgKGlzRnVuY3Rpb24oZGF0YSkpIHtcbiAgICBjYWxsYmFjayA9IGRhdGE7XG4gICAgZGF0YSA9IGVuY29kaW5nID0gbnVsbDtcbiAgfVxuICBlbHNlIGlmIChpc0Z1bmN0aW9uKGVuY29kaW5nKSkge1xuICAgIGNhbGxiYWNrID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgLy8gV3JpdGUgZGF0YSBpZiBuZWVkZWQgYW5kIGVuZFxuICBpZiAoIWRhdGEpIHtcbiAgICB0aGlzLl9lbmRlZCA9IHRoaXMuX2VuZGluZyA9IHRydWU7XG4gICAgdGhpcy5fY3VycmVudFJlcXVlc3QuZW5kKG51bGwsIG51bGwsIGNhbGxiYWNrKTtcbiAgfVxuICBlbHNlIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGN1cnJlbnRSZXF1ZXN0ID0gdGhpcy5fY3VycmVudFJlcXVlc3Q7XG4gICAgdGhpcy53cml0ZShkYXRhLCBlbmNvZGluZywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5fZW5kZWQgPSB0cnVlO1xuICAgICAgY3VycmVudFJlcXVlc3QuZW5kKG51bGwsIG51bGwsIGNhbGxiYWNrKTtcbiAgICB9KTtcbiAgICB0aGlzLl9lbmRpbmcgPSB0cnVlO1xuICB9XG59O1xuXG4vLyBTZXRzIGEgaGVhZGVyIHZhbHVlIG9uIHRoZSBjdXJyZW50IG5hdGl2ZSByZXF1ZXN0XG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRIZWFkZXIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5fb3B0aW9ucy5oZWFkZXJzW25hbWVdID0gdmFsdWU7XG4gIHRoaXMuX2N1cnJlbnRSZXF1ZXN0LnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7XG59O1xuXG4vLyBDbGVhcnMgYSBoZWFkZXIgdmFsdWUgb24gdGhlIGN1cnJlbnQgbmF0aXZlIHJlcXVlc3RcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLnJlbW92ZUhlYWRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGRlbGV0ZSB0aGlzLl9vcHRpb25zLmhlYWRlcnNbbmFtZV07XG4gIHRoaXMuX2N1cnJlbnRSZXF1ZXN0LnJlbW92ZUhlYWRlcihuYW1lKTtcbn07XG5cbi8vIEdsb2JhbCB0aW1lb3V0IGZvciBhbGwgdW5kZXJseWluZyByZXF1ZXN0c1xuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUuc2V0VGltZW91dCA9IGZ1bmN0aW9uIChtc2VjcywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIERlc3Ryb3lzIHRoZSBzb2NrZXQgb24gdGltZW91dFxuICBmdW5jdGlvbiBkZXN0cm95T25UaW1lb3V0KHNvY2tldCkge1xuICAgIHNvY2tldC5zZXRUaW1lb3V0KG1zZWNzKTtcbiAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoXCJ0aW1lb3V0XCIsIHNvY2tldC5kZXN0cm95KTtcbiAgICBzb2NrZXQuYWRkTGlzdGVuZXIoXCJ0aW1lb3V0XCIsIHNvY2tldC5kZXN0cm95KTtcbiAgfVxuXG4gIC8vIFNldHMgdXAgYSB0aW1lciB0byB0cmlnZ2VyIGEgdGltZW91dCBldmVudFxuICBmdW5jdGlvbiBzdGFydFRpbWVyKHNvY2tldCkge1xuICAgIGlmIChzZWxmLl90aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoc2VsZi5fdGltZW91dCk7XG4gICAgfVxuICAgIHNlbGYuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuZW1pdChcInRpbWVvdXRcIik7XG4gICAgICBjbGVhclRpbWVyKCk7XG4gICAgfSwgbXNlY3MpO1xuICAgIGRlc3Ryb3lPblRpbWVvdXQoc29ja2V0KTtcbiAgfVxuXG4gIC8vIFN0b3BzIGEgdGltZW91dCBmcm9tIHRyaWdnZXJpbmdcbiAgZnVuY3Rpb24gY2xlYXJUaW1lcigpIHtcbiAgICAvLyBDbGVhciB0aGUgdGltZW91dFxuICAgIGlmIChzZWxmLl90aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoc2VsZi5fdGltZW91dCk7XG4gICAgICBzZWxmLl90aW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCBhbGwgYXR0YWNoZWQgbGlzdGVuZXJzXG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcihcImFib3J0XCIsIGNsZWFyVGltZXIpO1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBjbGVhclRpbWVyKTtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKFwicmVzcG9uc2VcIiwgY2xlYXJUaW1lcik7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsIGNsZWFyVGltZXIpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgc2VsZi5yZW1vdmVMaXN0ZW5lcihcInRpbWVvdXRcIiwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBpZiAoIXNlbGYuc29ja2V0KSB7XG4gICAgICBzZWxmLl9jdXJyZW50UmVxdWVzdC5yZW1vdmVMaXN0ZW5lcihcInNvY2tldFwiLCBzdGFydFRpbWVyKTtcbiAgICB9XG4gIH1cblxuICAvLyBBdHRhY2ggY2FsbGJhY2sgaWYgcGFzc2VkXG4gIGlmIChjYWxsYmFjaykge1xuICAgIHRoaXMub24oXCJ0aW1lb3V0XCIsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIFN0YXJ0IHRoZSB0aW1lciBpZiBvciB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbmVkXG4gIGlmICh0aGlzLnNvY2tldCkge1xuICAgIHN0YXJ0VGltZXIodGhpcy5zb2NrZXQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuX2N1cnJlbnRSZXF1ZXN0Lm9uY2UoXCJzb2NrZXRcIiwgc3RhcnRUaW1lcik7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBvbiBldmVudHNcbiAgdGhpcy5vbihcInNvY2tldFwiLCBkZXN0cm95T25UaW1lb3V0KTtcbiAgdGhpcy5vbihcImFib3J0XCIsIGNsZWFyVGltZXIpO1xuICB0aGlzLm9uKFwiZXJyb3JcIiwgY2xlYXJUaW1lcik7XG4gIHRoaXMub24oXCJyZXNwb25zZVwiLCBjbGVhclRpbWVyKTtcbiAgdGhpcy5vbihcImNsb3NlXCIsIGNsZWFyVGltZXIpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gUHJveHkgYWxsIG90aGVyIHB1YmxpYyBDbGllbnRSZXF1ZXN0IG1ldGhvZHNcbltcbiAgXCJmbHVzaEhlYWRlcnNcIiwgXCJnZXRIZWFkZXJcIixcbiAgXCJzZXROb0RlbGF5XCIsIFwic2V0U29ja2V0S2VlcEFsaXZlXCIsXG5dLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICBSZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFJlcXVlc3RbbWV0aG9kXShhLCBiKTtcbiAgfTtcbn0pO1xuXG4vLyBQcm94eSBhbGwgcHVibGljIENsaWVudFJlcXVlc3QgcHJvcGVydGllc1xuW1wiYWJvcnRlZFwiLCBcImNvbm5lY3Rpb25cIiwgXCJzb2NrZXRcIl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLCBwcm9wZXJ0eSwge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fY3VycmVudFJlcXVlc3RbcHJvcGVydHldOyB9LFxuICB9KTtcbn0pO1xuXG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS5fc2FuaXRpemVPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgLy8gRW5zdXJlIGhlYWRlcnMgYXJlIGFsd2F5cyBwcmVzZW50XG4gIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgb3B0aW9ucy5oZWFkZXJzID0ge307XG4gIH1cblxuICAvLyBTaW5jZSBodHRwLnJlcXVlc3QgdHJlYXRzIGhvc3QgYXMgYW4gYWxpYXMgb2YgaG9zdG5hbWUsXG4gIC8vIGJ1dCB0aGUgdXJsIG1vZHVsZSBpbnRlcnByZXRzIGhvc3QgYXMgaG9zdG5hbWUgcGx1cyBwb3J0LFxuICAvLyBlbGltaW5hdGUgdGhlIGhvc3QgcHJvcGVydHkgdG8gYXZvaWQgY29uZnVzaW9uLlxuICBpZiAob3B0aW9ucy5ob3N0KSB7XG4gICAgLy8gVXNlIGhvc3RuYW1lIGlmIHNldCwgYmVjYXVzZSBpdCBoYXMgcHJlY2VkZW5jZVxuICAgIGlmICghb3B0aW9ucy5ob3N0bmFtZSkge1xuICAgICAgb3B0aW9ucy5ob3N0bmFtZSA9IG9wdGlvbnMuaG9zdDtcbiAgICB9XG4gICAgZGVsZXRlIG9wdGlvbnMuaG9zdDtcbiAgfVxuXG4gIC8vIENvbXBsZXRlIHRoZSBVUkwgb2JqZWN0IHdoZW4gbmVjZXNzYXJ5XG4gIGlmICghb3B0aW9ucy5wYXRobmFtZSAmJiBvcHRpb25zLnBhdGgpIHtcbiAgICB2YXIgc2VhcmNoUG9zID0gb3B0aW9ucy5wYXRoLmluZGV4T2YoXCI/XCIpO1xuICAgIGlmIChzZWFyY2hQb3MgPCAwKSB7XG4gICAgICBvcHRpb25zLnBhdGhuYW1lID0gb3B0aW9ucy5wYXRoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG9wdGlvbnMucGF0aG5hbWUgPSBvcHRpb25zLnBhdGguc3Vic3RyaW5nKDAsIHNlYXJjaFBvcyk7XG4gICAgICBvcHRpb25zLnNlYXJjaCA9IG9wdGlvbnMucGF0aC5zdWJzdHJpbmcoc2VhcmNoUG9zKTtcbiAgICB9XG4gIH1cbn07XG5cblxuLy8gRXhlY3V0ZXMgdGhlIG5leHQgbmF0aXZlIHJlcXVlc3QgKGluaXRpYWwgb3IgcmVkaXJlY3QpXG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS5fcGVyZm9ybVJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIExvYWQgdGhlIG5hdGl2ZSBwcm90b2NvbFxuICB2YXIgcHJvdG9jb2wgPSB0aGlzLl9vcHRpb25zLnByb3RvY29sO1xuICB2YXIgbmF0aXZlUHJvdG9jb2wgPSB0aGlzLl9vcHRpb25zLm5hdGl2ZVByb3RvY29sc1twcm90b2NvbF07XG4gIGlmICghbmF0aXZlUHJvdG9jb2wpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgXCIgKyBwcm90b2NvbCk7XG4gIH1cblxuICAvLyBJZiBzcGVjaWZpZWQsIHVzZSB0aGUgYWdlbnQgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdG9jb2xcbiAgLy8gKEhUVFAgYW5kIEhUVFBTIHVzZSBkaWZmZXJlbnQgdHlwZXMgb2YgYWdlbnRzKVxuICBpZiAodGhpcy5fb3B0aW9ucy5hZ2VudHMpIHtcbiAgICB2YXIgc2NoZW1lID0gcHJvdG9jb2wuc2xpY2UoMCwgLTEpO1xuICAgIHRoaXMuX29wdGlvbnMuYWdlbnQgPSB0aGlzLl9vcHRpb25zLmFnZW50c1tzY2hlbWVdO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHRoZSBuYXRpdmUgcmVxdWVzdCBhbmQgc2V0IHVwIGl0cyBldmVudCBoYW5kbGVyc1xuICB2YXIgcmVxdWVzdCA9IHRoaXMuX2N1cnJlbnRSZXF1ZXN0ID1cbiAgICAgICAgbmF0aXZlUHJvdG9jb2wucmVxdWVzdCh0aGlzLl9vcHRpb25zLCB0aGlzLl9vbk5hdGl2ZVJlc3BvbnNlKTtcbiAgcmVxdWVzdC5fcmVkaXJlY3RhYmxlID0gdGhpcztcbiAgZm9yICh2YXIgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgcmVxdWVzdC5vbihldmVudCwgZXZlbnRIYW5kbGVyc1tldmVudF0pO1xuICB9XG5cbiAgLy8gUkZDNzIzMFx1MDBBNzUuMy4xOiBXaGVuIG1ha2luZyBhIHJlcXVlc3QgZGlyZWN0bHkgdG8gYW4gb3JpZ2luIHNlcnZlciwgW1x1MjAyNl1cbiAgLy8gYSBjbGllbnQgTVVTVCBzZW5kIG9ubHkgdGhlIGFic29sdXRlIHBhdGggW1x1MjAyNl0gYXMgdGhlIHJlcXVlc3QtdGFyZ2V0LlxuICB0aGlzLl9jdXJyZW50VXJsID0gL15cXC8vLnRlc3QodGhpcy5fb3B0aW9ucy5wYXRoKSA/XG4gICAgdXJsLmZvcm1hdCh0aGlzLl9vcHRpb25zKSA6XG4gICAgLy8gV2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGEgcHJveHksIFtcdTIwMjZdXG4gICAgLy8gYSBjbGllbnQgTVVTVCBzZW5kIHRoZSB0YXJnZXQgVVJJIGluIGFic29sdXRlLWZvcm0gW1x1MjAyNl0uXG4gICAgdGhpcy5fb3B0aW9ucy5wYXRoO1xuXG4gIC8vIEVuZCBhIHJlZGlyZWN0ZWQgcmVxdWVzdFxuICAvLyAoVGhlIGZpcnN0IHJlcXVlc3QgbXVzdCBiZSBlbmRlZCBleHBsaWNpdGx5IHdpdGggUmVkaXJlY3RhYmxlUmVxdWVzdCNlbmQpXG4gIGlmICh0aGlzLl9pc1JlZGlyZWN0KSB7XG4gICAgLy8gV3JpdGUgdGhlIHJlcXVlc3QgZW50aXR5IGFuZCBlbmRcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBidWZmZXJzID0gdGhpcy5fcmVxdWVzdEJvZHlCdWZmZXJzO1xuICAgIChmdW5jdGlvbiB3cml0ZU5leHQoZXJyb3IpIHtcbiAgICAgIC8vIE9ubHkgd3JpdGUgaWYgdGhpcyByZXF1ZXN0IGhhcyBub3QgYmVlbiByZWRpcmVjdGVkIHlldFxuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgIGlmIChyZXF1ZXN0ID09PSBzZWxmLl9jdXJyZW50UmVxdWVzdCkge1xuICAgICAgICAvLyBSZXBvcnQgYW55IHdyaXRlIGVycm9yc1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgc2VsZi5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIHRoZSBuZXh0IGJ1ZmZlciBpZiB0aGVyZSBhcmUgc3RpbGwgbGVmdFxuICAgICAgICBlbHNlIGlmIChpIDwgYnVmZmVycy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc1tpKytdO1xuICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgICAgICAgaWYgKCFyZXF1ZXN0LmZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LndyaXRlKGJ1ZmZlci5kYXRhLCBidWZmZXIuZW5jb2RpbmcsIHdyaXRlTmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuZCB0aGUgcmVxdWVzdCBpZiBgZW5kYCBoYXMgYmVlbiBjYWxsZWQgb24gdXNcbiAgICAgICAgZWxzZSBpZiAoc2VsZi5fZW5kZWQpIHtcbiAgICAgICAgICByZXF1ZXN0LmVuZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSgpKTtcbiAgfVxufTtcblxuLy8gUHJvY2Vzc2VzIGEgcmVzcG9uc2UgZnJvbSB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUuX3Byb2Nlc3NSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAvLyBTdG9yZSB0aGUgcmVkaXJlY3RlZCByZXNwb25zZVxuICB2YXIgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c0NvZGU7XG4gIGlmICh0aGlzLl9vcHRpb25zLnRyYWNrUmVkaXJlY3RzKSB7XG4gICAgdGhpcy5fcmVkaXJlY3RzLnB1c2goe1xuICAgICAgdXJsOiB0aGlzLl9jdXJyZW50VXJsLFxuICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBSRkM3MjMxXHUwMEE3Ni40OiBUaGUgM3h4IChSZWRpcmVjdGlvbikgY2xhc3Mgb2Ygc3RhdHVzIGNvZGUgaW5kaWNhdGVzXG4gIC8vIHRoYXQgZnVydGhlciBhY3Rpb24gbmVlZHMgdG8gYmUgdGFrZW4gYnkgdGhlIHVzZXIgYWdlbnQgaW4gb3JkZXIgdG9cbiAgLy8gZnVsZmlsbCB0aGUgcmVxdWVzdC4gSWYgYSBMb2NhdGlvbiBoZWFkZXIgZmllbGQgaXMgcHJvdmlkZWQsXG4gIC8vIHRoZSB1c2VyIGFnZW50IE1BWSBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0IGl0cyByZXF1ZXN0IHRvIHRoZSBVUklcbiAgLy8gcmVmZXJlbmNlZCBieSB0aGUgTG9jYXRpb24gZmllbGQgdmFsdWUsXG4gIC8vIGV2ZW4gaWYgdGhlIHNwZWNpZmljIHN0YXR1cyBjb2RlIGlzIG5vdCB1bmRlcnN0b29kLlxuXG4gIC8vIElmIHRoZSByZXNwb25zZSBpcyBub3QgYSByZWRpcmVjdDsgcmV0dXJuIGl0IGFzLWlzXG4gIHZhciBsb2NhdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMubG9jYXRpb247XG4gIGlmICghbG9jYXRpb24gfHwgdGhpcy5fb3B0aW9ucy5mb2xsb3dSZWRpcmVjdHMgPT09IGZhbHNlIHx8XG4gICAgICBzdGF0dXNDb2RlIDwgMzAwIHx8IHN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgcmVzcG9uc2UucmVzcG9uc2VVcmwgPSB0aGlzLl9jdXJyZW50VXJsO1xuICAgIHJlc3BvbnNlLnJlZGlyZWN0cyA9IHRoaXMuX3JlZGlyZWN0cztcbiAgICB0aGlzLmVtaXQoXCJyZXNwb25zZVwiLCByZXNwb25zZSk7XG5cbiAgICAvLyBDbGVhbiB1cFxuICAgIHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycyA9IFtdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSByZXNwb25zZSBpcyBhIHJlZGlyZWN0LCBzbyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0XG4gIGRlc3Ryb3lSZXF1ZXN0KHRoaXMuX2N1cnJlbnRSZXF1ZXN0KTtcbiAgLy8gRGlzY2FyZCB0aGUgcmVtYWluZGVyIG9mIHRoZSByZXNwb25zZSB0byBhdm9pZCB3YWl0aW5nIGZvciBkYXRhXG4gIHJlc3BvbnNlLmRlc3Ryb3koKTtcblxuICAvLyBSRkM3MjMxXHUwMEE3Ni40OiBBIGNsaWVudCBTSE9VTEQgZGV0ZWN0IGFuZCBpbnRlcnZlbmVcbiAgLy8gaW4gY3ljbGljYWwgcmVkaXJlY3Rpb25zIChpLmUuLCBcImluZmluaXRlXCIgcmVkaXJlY3Rpb24gbG9vcHMpLlxuICBpZiAoKyt0aGlzLl9yZWRpcmVjdENvdW50ID4gdGhpcy5fb3B0aW9ucy5tYXhSZWRpcmVjdHMpIHtcbiAgICB0aHJvdyBuZXcgVG9vTWFueVJlZGlyZWN0c0Vycm9yKCk7XG4gIH1cblxuICAvLyBTdG9yZSB0aGUgcmVxdWVzdCBoZWFkZXJzIGlmIGFwcGxpY2FibGVcbiAgdmFyIHJlcXVlc3RIZWFkZXJzO1xuICB2YXIgYmVmb3JlUmVkaXJlY3QgPSB0aGlzLl9vcHRpb25zLmJlZm9yZVJlZGlyZWN0O1xuICBpZiAoYmVmb3JlUmVkaXJlY3QpIHtcbiAgICByZXF1ZXN0SGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgLy8gVGhlIEhvc3QgaGVhZGVyIHdhcyBzZXQgYnkgbmF0aXZlUHJvdG9jb2wucmVxdWVzdFxuICAgICAgSG9zdDogcmVzcG9uc2UucmVxLmdldEhlYWRlcihcImhvc3RcIiksXG4gICAgfSwgdGhpcy5fb3B0aW9ucy5oZWFkZXJzKTtcbiAgfVxuXG4gIC8vIFJGQzcyMzFcdTAwQTc2LjQ6IEF1dG9tYXRpYyByZWRpcmVjdGlvbiBuZWVkcyB0byBkb25lIHdpdGhcbiAgLy8gY2FyZSBmb3IgbWV0aG9kcyBub3Qga25vd24gdG8gYmUgc2FmZSwgW1x1MjAyNl1cbiAgLy8gUkZDNzIzMVx1MDBBNzYuNC4yXHUyMDEzMzogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgYSB1c2VyIGFnZW50IE1BWSBjaGFuZ2VcbiAgLy8gdGhlIHJlcXVlc3QgbWV0aG9kIGZyb20gUE9TVCB0byBHRVQgZm9yIHRoZSBzdWJzZXF1ZW50IHJlcXVlc3QuXG4gIHZhciBtZXRob2QgPSB0aGlzLl9vcHRpb25zLm1ldGhvZDtcbiAgaWYgKChzdGF0dXNDb2RlID09PSAzMDEgfHwgc3RhdHVzQ29kZSA9PT0gMzAyKSAmJiB0aGlzLl9vcHRpb25zLm1ldGhvZCA9PT0gXCJQT1NUXCIgfHxcbiAgICAgIC8vIFJGQzcyMzFcdTAwQTc2LjQuNDogVGhlIDMwMyAoU2VlIE90aGVyKSBzdGF0dXMgY29kZSBpbmRpY2F0ZXMgdGhhdFxuICAgICAgLy8gdGhlIHNlcnZlciBpcyByZWRpcmVjdGluZyB0aGUgdXNlciBhZ2VudCB0byBhIGRpZmZlcmVudCByZXNvdXJjZSBbXHUyMDI2XVxuICAgICAgLy8gQSB1c2VyIGFnZW50IGNhbiBwZXJmb3JtIGEgcmV0cmlldmFsIHJlcXVlc3QgdGFyZ2V0aW5nIHRoYXQgVVJJXG4gICAgICAvLyAoYSBHRVQgb3IgSEVBRCByZXF1ZXN0IGlmIHVzaW5nIEhUVFApIFtcdTIwMjZdXG4gICAgICAoc3RhdHVzQ29kZSA9PT0gMzAzKSAmJiAhL14oPzpHRVR8SEVBRCkkLy50ZXN0KHRoaXMuX29wdGlvbnMubWV0aG9kKSkge1xuICAgIHRoaXMuX29wdGlvbnMubWV0aG9kID0gXCJHRVRcIjtcbiAgICAvLyBEcm9wIGEgcG9zc2libGUgZW50aXR5IGFuZCBoZWFkZXJzIHJlbGF0ZWQgdG8gaXRcbiAgICB0aGlzLl9yZXF1ZXN0Qm9keUJ1ZmZlcnMgPSBbXTtcbiAgICByZW1vdmVNYXRjaGluZ0hlYWRlcnMoL15jb250ZW50LS9pLCB0aGlzLl9vcHRpb25zLmhlYWRlcnMpO1xuICB9XG5cbiAgLy8gRHJvcCB0aGUgSG9zdCBoZWFkZXIsIGFzIHRoZSByZWRpcmVjdCBtaWdodCBsZWFkIHRvIGEgZGlmZmVyZW50IGhvc3RcbiAgdmFyIGN1cnJlbnRIb3N0SGVhZGVyID0gcmVtb3ZlTWF0Y2hpbmdIZWFkZXJzKC9eaG9zdCQvaSwgdGhpcy5fb3B0aW9ucy5oZWFkZXJzKTtcblxuICAvLyBJZiB0aGUgcmVkaXJlY3QgaXMgcmVsYXRpdmUsIGNhcnJ5IG92ZXIgdGhlIGhvc3Qgb2YgdGhlIGxhc3QgcmVxdWVzdFxuICB2YXIgY3VycmVudFVybFBhcnRzID0gcGFyc2VVcmwodGhpcy5fY3VycmVudFVybCk7XG4gIHZhciBjdXJyZW50SG9zdCA9IGN1cnJlbnRIb3N0SGVhZGVyIHx8IGN1cnJlbnRVcmxQYXJ0cy5ob3N0O1xuICB2YXIgY3VycmVudFVybCA9IC9eXFx3KzovLnRlc3QobG9jYXRpb24pID8gdGhpcy5fY3VycmVudFVybCA6XG4gICAgdXJsLmZvcm1hdChPYmplY3QuYXNzaWduKGN1cnJlbnRVcmxQYXJ0cywgeyBob3N0OiBjdXJyZW50SG9zdCB9KSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSByZWRpcmVjdGVkIHJlcXVlc3RcbiAgdmFyIHJlZGlyZWN0VXJsID0gcmVzb2x2ZVVybChsb2NhdGlvbiwgY3VycmVudFVybCk7XG4gIGRlYnVnKFwicmVkaXJlY3RpbmcgdG9cIiwgcmVkaXJlY3RVcmwuaHJlZik7XG4gIHRoaXMuX2lzUmVkaXJlY3QgPSB0cnVlO1xuICBzcHJlYWRVcmxPYmplY3QocmVkaXJlY3RVcmwsIHRoaXMuX29wdGlvbnMpO1xuXG4gIC8vIERyb3AgY29uZmlkZW50aWFsIGhlYWRlcnMgd2hlbiByZWRpcmVjdGluZyB0byBhIGxlc3Mgc2VjdXJlIHByb3RvY29sXG4gIC8vIG9yIHRvIGEgZGlmZmVyZW50IGRvbWFpbiB0aGF0IGlzIG5vdCBhIHN1cGVyZG9tYWluXG4gIGlmIChyZWRpcmVjdFVybC5wcm90b2NvbCAhPT0gY3VycmVudFVybFBhcnRzLnByb3RvY29sICYmXG4gICAgIHJlZGlyZWN0VXJsLnByb3RvY29sICE9PSBcImh0dHBzOlwiIHx8XG4gICAgIHJlZGlyZWN0VXJsLmhvc3QgIT09IGN1cnJlbnRIb3N0ICYmXG4gICAgICFpc1N1YmRvbWFpbihyZWRpcmVjdFVybC5ob3N0LCBjdXJyZW50SG9zdCkpIHtcbiAgICByZW1vdmVNYXRjaGluZ0hlYWRlcnMoL14oPzooPzpwcm94eS0pP2F1dGhvcml6YXRpb258Y29va2llKSQvaSwgdGhpcy5fb3B0aW9ucy5oZWFkZXJzKTtcbiAgfVxuXG4gIC8vIEV2YWx1YXRlIHRoZSBiZWZvcmVSZWRpcmVjdCBjYWxsYmFja1xuICBpZiAoaXNGdW5jdGlvbihiZWZvcmVSZWRpcmVjdCkpIHtcbiAgICB2YXIgcmVzcG9uc2VEZXRhaWxzID0ge1xuICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUsXG4gICAgfTtcbiAgICB2YXIgcmVxdWVzdERldGFpbHMgPSB7XG4gICAgICB1cmw6IGN1cnJlbnRVcmwsXG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgIH07XG4gICAgYmVmb3JlUmVkaXJlY3QodGhpcy5fb3B0aW9ucywgcmVzcG9uc2VEZXRhaWxzLCByZXF1ZXN0RGV0YWlscyk7XG4gICAgdGhpcy5fc2FuaXRpemVPcHRpb25zKHRoaXMuX29wdGlvbnMpO1xuICB9XG5cbiAgLy8gUGVyZm9ybSB0aGUgcmVkaXJlY3RlZCByZXF1ZXN0XG4gIHRoaXMuX3BlcmZvcm1SZXF1ZXN0KCk7XG59O1xuXG4vLyBXcmFwcyB0aGUga2V5L3ZhbHVlIG9iamVjdCBvZiBwcm90b2NvbHMgd2l0aCByZWRpcmVjdCBmdW5jdGlvbmFsaXR5XG5mdW5jdGlvbiB3cmFwKHByb3RvY29scykge1xuICAvLyBEZWZhdWx0IHNldHRpbmdzXG4gIHZhciBleHBvcnRzID0ge1xuICAgIG1heFJlZGlyZWN0czogMjEsXG4gICAgbWF4Qm9keUxlbmd0aDogMTAgKiAxMDI0ICogMTAyNCxcbiAgfTtcblxuICAvLyBXcmFwIGVhY2ggcHJvdG9jb2xcbiAgdmFyIG5hdGl2ZVByb3RvY29scyA9IHt9O1xuICBPYmplY3Qua2V5cyhwcm90b2NvbHMpLmZvckVhY2goZnVuY3Rpb24gKHNjaGVtZSkge1xuICAgIHZhciBwcm90b2NvbCA9IHNjaGVtZSArIFwiOlwiO1xuICAgIHZhciBuYXRpdmVQcm90b2NvbCA9IG5hdGl2ZVByb3RvY29sc1twcm90b2NvbF0gPSBwcm90b2NvbHNbc2NoZW1lXTtcbiAgICB2YXIgd3JhcHBlZFByb3RvY29sID0gZXhwb3J0c1tzY2hlbWVdID0gT2JqZWN0LmNyZWF0ZShuYXRpdmVQcm90b2NvbCk7XG5cbiAgICAvLyBFeGVjdXRlcyBhIHJlcXVlc3QsIGZvbGxvd2luZyByZWRpcmVjdHNcbiAgICBmdW5jdGlvbiByZXF1ZXN0KGlucHV0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgLy8gUGFyc2UgcGFyYW1ldGVycywgZW5zdXJpbmcgdGhhdCBpbnB1dCBpcyBhbiBvYmplY3RcbiAgICAgIGlmIChpc1VSTChpbnB1dCkpIHtcbiAgICAgICAgaW5wdXQgPSBzcHJlYWRVcmxPYmplY3QoaW5wdXQpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgIGlucHV0ID0gc3ByZWFkVXJsT2JqZWN0KHBhcnNlVXJsKGlucHV0KSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0gdmFsaWRhdGVVcmwoaW5wdXQpO1xuICAgICAgICBpbnB1dCA9IHsgcHJvdG9jb2w6IHByb3RvY29sIH07XG4gICAgICB9XG4gICAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgZGVmYXVsdHNcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgbWF4UmVkaXJlY3RzOiBleHBvcnRzLm1heFJlZGlyZWN0cyxcbiAgICAgICAgbWF4Qm9keUxlbmd0aDogZXhwb3J0cy5tYXhCb2R5TGVuZ3RoLFxuICAgICAgfSwgaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5uYXRpdmVQcm90b2NvbHMgPSBuYXRpdmVQcm90b2NvbHM7XG4gICAgICBpZiAoIWlzU3RyaW5nKG9wdGlvbnMuaG9zdCkgJiYgIWlzU3RyaW5nKG9wdGlvbnMuaG9zdG5hbWUpKSB7XG4gICAgICAgIG9wdGlvbnMuaG9zdG5hbWUgPSBcIjo6MVwiO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQuZXF1YWwob3B0aW9ucy5wcm90b2NvbCwgcHJvdG9jb2wsIFwicHJvdG9jb2wgbWlzbWF0Y2hcIik7XG4gICAgICBkZWJ1ZyhcIm9wdGlvbnNcIiwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gbmV3IFJlZGlyZWN0YWJsZVJlcXVlc3Qob3B0aW9ucywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGVzIGEgR0VUIHJlcXVlc3QsIGZvbGxvd2luZyByZWRpcmVjdHNcbiAgICBmdW5jdGlvbiBnZXQoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgd3JhcHBlZFJlcXVlc3QgPSB3cmFwcGVkUHJvdG9jb2wucmVxdWVzdChpbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICAgICAgd3JhcHBlZFJlcXVlc3QuZW5kKCk7XG4gICAgICByZXR1cm4gd3JhcHBlZFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSB3cmFwcGVkIHByb3RvY29sXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod3JhcHBlZFByb3RvY29sLCB7XG4gICAgICByZXF1ZXN0OiB7IHZhbHVlOiByZXF1ZXN0LCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0sXG4gICAgICBnZXQ6IHsgdmFsdWU6IGdldCwgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9LFxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIGV4cG9ydHM7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7IC8qIGVtcHR5ICovIH1cblxuZnVuY3Rpb24gcGFyc2VVcmwoaW5wdXQpIHtcbiAgdmFyIHBhcnNlZDtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgaWYgKHVzZU5hdGl2ZVVSTCkge1xuICAgIHBhcnNlZCA9IG5ldyBVUkwoaW5wdXQpO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIEVuc3VyZSB0aGUgVVJMIGlzIHZhbGlkIGFuZCBhYnNvbHV0ZVxuICAgIHBhcnNlZCA9IHZhbGlkYXRlVXJsKHVybC5wYXJzZShpbnB1dCkpO1xuICAgIGlmICghaXNTdHJpbmcocGFyc2VkLnByb3RvY29sKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRVcmxFcnJvcih7IGlucHV0IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVXJsKHJlbGF0aXZlLCBiYXNlKSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gIHJldHVybiB1c2VOYXRpdmVVUkwgPyBuZXcgVVJMKHJlbGF0aXZlLCBiYXNlKSA6IHBhcnNlVXJsKHVybC5yZXNvbHZlKGJhc2UsIHJlbGF0aXZlKSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVXJsKGlucHV0KSB7XG4gIGlmICgvXlxcWy8udGVzdChpbnB1dC5ob3N0bmFtZSkgJiYgIS9eXFxbWzowLTlhLWZdK1xcXSQvaS50ZXN0KGlucHV0Lmhvc3RuYW1lKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkVXJsRXJyb3IoeyBpbnB1dDogaW5wdXQuaHJlZiB8fCBpbnB1dCB9KTtcbiAgfVxuICBpZiAoL15cXFsvLnRlc3QoaW5wdXQuaG9zdCkgJiYgIS9eXFxbWzowLTlhLWZdK1xcXSg6XFxkKyk/JC9pLnRlc3QoaW5wdXQuaG9zdCkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFVybEVycm9yKHsgaW5wdXQ6IGlucHV0LmhyZWYgfHwgaW5wdXQgfSk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuXG5mdW5jdGlvbiBzcHJlYWRVcmxPYmplY3QodXJsT2JqZWN0LCB0YXJnZXQpIHtcbiAgdmFyIHNwcmVhZCA9IHRhcmdldCB8fCB7fTtcbiAgZm9yICh2YXIga2V5IG9mIHByZXNlcnZlZFVybEZpZWxkcykge1xuICAgIHNwcmVhZFtrZXldID0gdXJsT2JqZWN0W2tleV07XG4gIH1cblxuICAvLyBGaXggSVB2NiBob3N0bmFtZVxuICBpZiAoc3ByZWFkLmhvc3RuYW1lLnN0YXJ0c1dpdGgoXCJbXCIpKSB7XG4gICAgc3ByZWFkLmhvc3RuYW1lID0gc3ByZWFkLmhvc3RuYW1lLnNsaWNlKDEsIC0xKTtcbiAgfVxuICAvLyBFbnN1cmUgcG9ydCBpcyBhIG51bWJlclxuICBpZiAoc3ByZWFkLnBvcnQgIT09IFwiXCIpIHtcbiAgICBzcHJlYWQucG9ydCA9IE51bWJlcihzcHJlYWQucG9ydCk7XG4gIH1cbiAgLy8gQ29uY2F0ZW5hdGUgcGF0aFxuICBzcHJlYWQucGF0aCA9IHNwcmVhZC5zZWFyY2ggPyBzcHJlYWQucGF0aG5hbWUgKyBzcHJlYWQuc2VhcmNoIDogc3ByZWFkLnBhdGhuYW1lO1xuXG4gIHJldHVybiBzcHJlYWQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU1hdGNoaW5nSGVhZGVycyhyZWdleCwgaGVhZGVycykge1xuICB2YXIgbGFzdFZhbHVlO1xuICBmb3IgKHZhciBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgIGlmIChyZWdleC50ZXN0KGhlYWRlcikpIHtcbiAgICAgIGxhc3RWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXTtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzW2hlYWRlcl07XG4gICAgfVxuICB9XG4gIHJldHVybiAobGFzdFZhbHVlID09PSBudWxsIHx8IHR5cGVvZiBsYXN0VmFsdWUgPT09IFwidW5kZWZpbmVkXCIpID9cbiAgICB1bmRlZmluZWQgOiBTdHJpbmcobGFzdFZhbHVlKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yVHlwZShjb2RlLCBtZXNzYWdlLCBiYXNlQ2xhc3MpIHtcbiAgLy8gQ3JlYXRlIGNvbnN0cnVjdG9yXG4gIGZ1bmN0aW9uIEN1c3RvbUVycm9yKHByb3BlcnRpZXMpIHtcbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgIGlmIChpc0Z1bmN0aW9uKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcGVydGllcyB8fCB7fSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNhdXNlID8gbWVzc2FnZSArIFwiOiBcIiArIHRoaXMuY2F1c2UubWVzc2FnZSA6IG1lc3NhZ2U7XG4gIH1cblxuICAvLyBBdHRhY2ggY29uc3RydWN0b3IgYW5kIHNldCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgQ3VzdG9tRXJyb3IucHJvdG90eXBlID0gbmV3IChiYXNlQ2xhc3MgfHwgRXJyb3IpKCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEN1c3RvbUVycm9yLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogQ3VzdG9tRXJyb3IsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIG5hbWU6IHtcbiAgICAgIHZhbHVlOiBcIkVycm9yIFtcIiArIGNvZGUgKyBcIl1cIixcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gQ3VzdG9tRXJyb3I7XG59XG5cbmZ1bmN0aW9uIGRlc3Ryb3lSZXF1ZXN0KHJlcXVlc3QsIGVycm9yKSB7XG4gIGZvciAodmFyIGV2ZW50IG9mIGV2ZW50cykge1xuICAgIHJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGV2ZW50SGFuZGxlcnNbZXZlbnRdKTtcbiAgfVxuICByZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgbm9vcCk7XG4gIHJlcXVlc3QuZGVzdHJveShlcnJvcik7XG59XG5cbmZ1bmN0aW9uIGlzU3ViZG9tYWluKHN1YmRvbWFpbiwgZG9tYWluKSB7XG4gIGFzc2VydChpc1N0cmluZyhzdWJkb21haW4pICYmIGlzU3RyaW5nKGRvbWFpbikpO1xuICB2YXIgZG90ID0gc3ViZG9tYWluLmxlbmd0aCAtIGRvbWFpbi5sZW5ndGggLSAxO1xuICByZXR1cm4gZG90ID4gMCAmJiBzdWJkb21haW5bZG90XSA9PT0gXCIuXCIgJiYgc3ViZG9tYWluLmVuZHNXaXRoKGRvbWFpbik7XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIChcImxlbmd0aFwiIGluIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNVUkwodmFsdWUpIHtcbiAgcmV0dXJuIFVSTCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFVSTDtcbn1cblxuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSB3cmFwKHsgaHR0cDogaHR0cCwgaHR0cHM6IGh0dHBzIH0pO1xubW9kdWxlLmV4cG9ydHMud3JhcCA9IHdyYXA7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi90eXBlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGVFcnJvcjtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0O1xuIiwgInZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGU7XG52YXIgbWFwU2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc01hcCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTWFwLnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgbWFwU2l6ZSA9IGhhc01hcCAmJiBtYXBTaXplRGVzY3JpcHRvciAmJiB0eXBlb2YgbWFwU2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gbWFwU2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBtYXBGb3JFYWNoID0gaGFzTWFwICYmIE1hcC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGU7XG52YXIgc2V0U2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc1NldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU2V0LnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgc2V0U2l6ZSA9IGhhc1NldCAmJiBzZXRTaXplRGVzY3JpcHRvciAmJiB0eXBlb2Ygc2V0U2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gc2V0U2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBzZXRGb3JFYWNoID0gaGFzU2V0ICYmIFNldC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgV2Vha01hcC5wcm90b3R5cGU7XG52YXIgd2Vha01hcEhhcyA9IGhhc1dlYWtNYXAgPyBXZWFrTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrU2V0LnByb3RvdHlwZTtcbnZhciB3ZWFrU2V0SGFzID0gaGFzV2Vha1NldCA/IFdlYWtTZXQucHJvdG90eXBlLmhhcyA6IG51bGw7XG52YXIgaGFzV2Vha1JlZiA9IHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIFdlYWtSZWYucHJvdG90eXBlO1xudmFyIHdlYWtSZWZEZXJlZiA9IGhhc1dlYWtSZWYgPyBXZWFrUmVmLnByb3RvdHlwZS5kZXJlZiA6IG51bGw7XG52YXIgYm9vbGVhblZhbHVlT2YgPSBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mO1xudmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyICRtYXRjaCA9IFN0cmluZy5wcm90b3R5cGUubWF0Y2g7XG52YXIgJHNsaWNlID0gU3RyaW5nLnByb3RvdHlwZS5zbGljZTtcbnZhciAkcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciAkdG9VcHBlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlO1xudmFyICR0b0xvd2VyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2U7XG52YXIgJHRlc3QgPSBSZWdFeHAucHJvdG90eXBlLnRlc3Q7XG52YXIgJGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgJGpvaW4gPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbnZhciAkYXJyU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgJGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBiaWdJbnRWYWx1ZU9mID0gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyA/IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZiA6IG51bGw7XG52YXIgZ09QUyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgc3ltVG9TdHJpbmcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnID8gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyA6IG51bGw7XG52YXIgaGFzU2hhbW1lZFN5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdvYmplY3QnO1xuLy8gaWUsIGBoYXMtdG9zdHJpbmd0YWcvc2hhbXNcbnZhciB0b1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmICh0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSBoYXNTaGFtbWVkU3ltYm9scyA/ICdvYmplY3QnIDogJ3N5bWJvbCcpXG4gICAgPyBTeW1ib2wudG9TdHJpbmdUYWdcbiAgICA6IG51bGw7XG52YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxudmFyIGdQTyA9ICh0eXBlb2YgUmVmbGVjdCA9PT0gJ2Z1bmN0aW9uJyA/IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YgOiBPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHx8IChcbiAgICBbXS5fX3Byb3RvX18gPT09IEFycmF5LnByb3RvdHlwZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG4gICAgICAgID8gZnVuY3Rpb24gKE8pIHtcbiAgICAgICAgICAgIHJldHVybiBPLl9fcHJvdG9fXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICB9XG4gICAgICAgIDogbnVsbFxuKTtcblxuZnVuY3Rpb24gYWRkTnVtZXJpY1NlcGFyYXRvcihudW0sIHN0cikge1xuICAgIGlmIChcbiAgICAgICAgbnVtID09PSBJbmZpbml0eVxuICAgICAgICB8fCBudW0gPT09IC1JbmZpbml0eVxuICAgICAgICB8fCBudW0gIT09IG51bVxuICAgICAgICB8fCAobnVtICYmIG51bSA+IC0xMDAwICYmIG51bSA8IDEwMDApXG4gICAgICAgIHx8ICR0ZXN0LmNhbGwoL2UvLCBzdHIpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHZhciBzZXBSZWdleCA9IC9bMC05XSg/PSg/OlswLTldezN9KSsoPyFbMC05XSkpL2c7XG4gICAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBpbnQgPSBudW0gPCAwID8gLSRmbG9vcigtbnVtKSA6ICRmbG9vcihudW0pOyAvLyB0cnVuYyhudW0pXG4gICAgICAgIGlmIChpbnQgIT09IG51bSkge1xuICAgICAgICAgICAgdmFyIGludFN0ciA9IFN0cmluZyhpbnQpO1xuICAgICAgICAgICAgdmFyIGRlYyA9ICRzbGljZS5jYWxsKHN0ciwgaW50U3RyLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoaW50U3RyLCBzZXBSZWdleCwgJyQmXycpICsgJy4nICsgJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKGRlYywgLyhbMC05XXszfSkvZywgJyQmXycpLCAvXyQvLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoc3RyLCBzZXBSZWdleCwgJyQmXycpO1xufVxuXG52YXIgdXRpbEluc3BlY3QgPSByZXF1aXJlKCcuL3V0aWwuaW5zcGVjdCcpO1xudmFyIGluc3BlY3RDdXN0b20gPSB1dGlsSW5zcGVjdC5jdXN0b207XG52YXIgaW5zcGVjdFN5bWJvbCA9IGlzU3ltYm9sKGluc3BlY3RDdXN0b20pID8gaW5zcGVjdEN1c3RvbSA6IG51bGw7XG5cbnZhciBxdW90ZXMgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgICdkb3VibGUnOiAnXCInLFxuICAgIHNpbmdsZTogXCInXCJcbn07XG52YXIgcXVvdGVSRXMgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgICdkb3VibGUnOiAvKFtcIlxcXFxdKS9nLFxuICAgIHNpbmdsZTogLyhbJ1xcXFxdKS9nXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgIWhhcyhxdW90ZXMsIG9wdHMucXVvdGVTdHlsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIGlmIChtYXBGb3JFYWNoKSB7XG4gICAgICAgICAgICBtYXBGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksIG9iaiwgdHJ1ZSkgKyAnID0+ICcgKyBpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ01hcCcsIG1hcFNpemUuY2FsbChvYmopLCBtYXBQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHNldFBhcnRzID0gW107XG4gICAgICAgIGlmIChzZXRGb3JFYWNoKSB7XG4gICAgICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0cy5wdXNoKGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignU2V0Jywgc2V0U2l6ZS5jYWxsKG9iaiksIHNldFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrTWFwKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtNYXAnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1NldChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrU2V0Jyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1JlZicpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoTnVtYmVyKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQmlnSW50KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0Jvb2xlYW4ob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGJvb2xlYW5WYWx1ZU9mLmNhbGwob2JqKSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO1xuICAgIH1cbiAgICAvLyBub3RlOiBpbiBJRSA4LCBzb21ldGltZXMgYGdsb2JhbCAhPT0gd2luZG93YCBidXQgYm90aCBhcmUgdGhlIHByb3RvdHlwZXMgb2YgZWFjaCBvdGhlclxuICAgIC8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IHdpbmRvdykge1xuICAgICAgICByZXR1cm4gJ3sgW29iamVjdCBXaW5kb3ddIH0nO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWxUaGlzKVxuICAgICAgICB8fCAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWwpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiAneyBbb2JqZWN0IGdsb2JhbFRoaXNdIH0nO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgdmFyIGlzUGxhaW5PYmplY3QgPSBnUE8gPyBnUE8ob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZSA6IG9iaiBpbnN0YW5jZW9mIE9iamVjdCB8fCBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvVGFnID0gb2JqIGluc3RhbmNlb2YgT2JqZWN0ID8gJycgOiAnbnVsbCBwcm90b3R5cGUnO1xuICAgICAgICB2YXIgc3RyaW5nVGFnID0gIWlzUGxhaW5PYmplY3QgJiYgdG9TdHJpbmdUYWcgJiYgT2JqZWN0KG9iaikgPT09IG9iaiAmJiB0b1N0cmluZ1RhZyBpbiBvYmogPyAkc2xpY2UuY2FsbCh0b1N0cihvYmopLCA4LCAtMSkgOiBwcm90b1RhZyA/ICdPYmplY3QnIDogJyc7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvclRhZyA9IGlzUGxhaW5PYmplY3QgfHwgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyA/ICcnIDogb2JqLmNvbnN0cnVjdG9yLm5hbWUgPyBvYmouY29uc3RydWN0b3IubmFtZSArICcgJyA6ICcnO1xuICAgICAgICB2YXIgdGFnID0gY29uc3RydWN0b3JUYWcgKyAoc3RyaW5nVGFnIHx8IHByb3RvVGFnID8gJ1snICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoW10sIHN0cmluZ1RhZyB8fCBbXSwgcHJvdG9UYWcgfHwgW10pLCAnOiAnKSArICddICcgOiAnJyk7XG4gICAgICAgIGlmICh5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRhZyArICd7fSc7IH1cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZyArICd7JyArIGluZGVudGVkSm9pbih5cywgaW5kZW50KSArICd9JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnICsgJ3sgJyArICRqb2luLmNhbGwoeXMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyhzLCBkZWZhdWx0U3R5bGUsIG9wdHMpIHtcbiAgICB2YXIgc3R5bGUgPSBvcHRzLnF1b3RlU3R5bGUgfHwgZGVmYXVsdFN0eWxlO1xuICAgIHZhciBxdW90ZUNoYXIgPSBxdW90ZXNbc3R5bGVdO1xuICAgIHJldHVybiBxdW90ZUNoYXIgKyBzICsgcXVvdGVDaGFyO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzKSB7XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoU3RyaW5nKHMpLCAvXCIvZywgJyZxdW90OycpO1xufVxuXG5mdW5jdGlvbiBjYW5UcnVzdFRvU3RyaW5nKG9iaikge1xuICAgIHJldHVybiAhdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAodG9TdHJpbmdUYWcgaW4gb2JqIHx8IHR5cGVvZiBvYmpbdG9TdHJpbmdUYWddICE9PSAndW5kZWZpbmVkJykpO1xufVxuZnVuY3Rpb24gaXNBcnJheShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc0RhdGUob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc1JlZ0V4cChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNFcnJvcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBjYW5UcnVzdFRvU3RyaW5nKG9iaik7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJyAmJiBjYW5UcnVzdFRvU3RyaW5nKG9iaik7IH1cblxuLy8gU3ltYm9sIGFuZCBCaWdJbnQgZG8gaGF2ZSBTeW1ib2wudG9TdHJpbmdUYWcgYnkgc3BlYywgc28gdGhhdCBjYW4ndCBiZSB1c2VkIHRvIGVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXNcbmZ1bmN0aW9uIGlzU3ltYm9sKG9iaikge1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiBpbnN0YW5jZW9mIFN5bWJvbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhc3ltVG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhYmlnSW50VmFsdWVPZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludFZhbHVlT2YuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpO1xufVxuXG5mdW5jdGlvbiB0b1N0cihvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YoZikge1xuICAgIGlmIChmLm5hbWUpIHsgcmV0dXJuIGYubmFtZTsgfVxuICAgIHZhciBtID0gJG1hdGNoLmNhbGwoZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGYpLCAvXmZ1bmN0aW9uXFxzKihbXFx3JF0rKS8pO1xuICAgIGlmIChtKSB7IHJldHVybiBtWzFdOyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgeyByZXR1cm4geHMuaW5kZXhPZih4KTsgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgeyByZXR1cm4gaTsgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwKHgpIHtcbiAgICBpZiAoIW1hcFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha01hcCh4KSB7XG4gICAgaWYgKCF3ZWFrTWFwSGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrUmVmKHgpIHtcbiAgICBpZiAoIXdlYWtSZWZEZXJlZiB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrUmVmRGVyZWYuY2FsbCh4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0KHgpIHtcbiAgICBpZiAoIXNldFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG4gICAgaWYgKCF3ZWFrU2V0SGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBvcHRzLm1heFN0cmluZ0xlbmd0aCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gc3RyLmxlbmd0aCAtIG9wdHMubWF4U3RyaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhaWxlciA9ICcuLi4gJyArIHJlbWFpbmluZyArICcgbW9yZSBjaGFyYWN0ZXInICsgKHJlbWFpbmluZyA+IDEgPyAncycgOiAnJyk7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKCRzbGljZS5jYWxsKHN0ciwgMCwgb3B0cy5tYXhTdHJpbmdMZW5ndGgpLCBvcHRzKSArIHRyYWlsZXI7XG4gICAgfVxuICAgIHZhciBxdW90ZVJFID0gcXVvdGVSRXNbb3B0cy5xdW90ZVN0eWxlIHx8ICdzaW5nbGUnXTtcbiAgICBxdW90ZVJFLmxhc3RJbmRleCA9IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICB2YXIgcyA9ICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChzdHIsIHF1b3RlUkUsICdcXFxcJDEnKSwgL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHtcbiAgICAgICAgODogJ2InLFxuICAgICAgICA5OiAndCcsXG4gICAgICAgIDEwOiAnbicsXG4gICAgICAgIDEyOiAnZicsXG4gICAgICAgIDEzOiAncidcbiAgICB9W25dO1xuICAgIGlmICh4KSB7IHJldHVybiAnXFxcXCcgKyB4OyB9XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyAkdG9VcHBlckNhc2UuY2FsbChuLnRvU3RyaW5nKDE2KSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiB3ZWFrQ29sbGVjdGlvbk9mKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSArICcgeyA/IH0nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YodHlwZSwgc2l6ZSwgZW50cmllcywgaW5kZW50KSB7XG4gICAgdmFyIGpvaW5lZEVudHJpZXMgPSBpbmRlbnQgPyBpbmRlbnRlZEpvaW4oZW50cmllcywgaW5kZW50KSA6ICRqb2luLmNhbGwoZW50cmllcywgJywgJyk7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgam9pbmVkRW50cmllcyArICd9Jztcbn1cblxuZnVuY3Rpb24gc2luZ2xlTGluZVZhbHVlcyh4cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGluZGV4T2YoeHNbaV0sICdcXG4nKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEluZGVudChvcHRzLCBkZXB0aCkge1xuICAgIHZhciBiYXNlSW5kZW50O1xuICAgIGlmIChvcHRzLmluZGVudCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICdcXHQnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMuaW5kZW50ID09PSAnbnVtYmVyJyAmJiBvcHRzLmluZGVudCA+IDApIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQgKyAxKSwgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogYmFzZUluZGVudCxcbiAgICAgICAgcHJldjogJGpvaW4uY2FsbChBcnJheShkZXB0aCArIDEpLCBiYXNlSW5kZW50KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGluZGVudGVkSm9pbih4cywgaW5kZW50KSB7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cbiAgICB2YXIgbGluZUpvaW5lciA9ICdcXG4nICsgaW5kZW50LnByZXYgKyBpbmRlbnQuYmFzZTtcbiAgICByZXR1cm4gbGluZUpvaW5lciArICRqb2luLmNhbGwoeHMsICcsJyArIGxpbmVKb2luZXIpICsgJ1xcbicgKyBpbmRlbnQucHJldjtcbn1cblxuZnVuY3Rpb24gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3ltcyA9IHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nID8gZ09QUyhvYmopIDogW107XG4gICAgdmFyIHN5bU1hcDtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgc3ltTWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc3ltcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgc3ltTWFwWyckJyArIHN5bXNba11dID0gc3ltc1trXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBpZiAoIWhhcyhvYmosIGtleSkpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scyAmJiBzeW1NYXBbJyQnICsga2V5XSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHNoYW1tZWQgU3ltYm9scywgd2hpY2ggYXJlIHN0b3JlZCBhcyBzdHJpbmdzLCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcga2V5IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKCR0ZXN0LmNhbGwoL1teXFx3JF0vLCBrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltc1tqXSkpIHtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKCdbJyArIGluc3BlY3Qoc3ltc1tqXSkgKyAnXTogJyArIGluc3BlY3Qob2JqW3N5bXNbal1dLCBvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW5zcGVjdCA9IHJlcXVpcmUoJ29iamVjdC1pbnNwZWN0Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcblxuLypcbiogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGxpc3QgcmV0dXJuaW5nIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleS5cbipcbiogVGhhdCBub2RlIGlzIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXQgaWYgaXQncyBhY2Nlc3NlZCBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIHRyYXZlcnNlIHRoZSB3aG9sZSBsaXN0LlxuKiBCeSBkb2luZyBzbywgYWxsIHRoZSByZWNlbnRseSB1c2VkIG5vZGVzIGNhbiBiZSBhY2Nlc3NlZCByZWxhdGl2ZWx5IHF1aWNrbHkuXG4qL1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykubGlzdEdldE5vZGV9ICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBsaXN0R2V0Tm9kZSA9IGZ1bmN0aW9uIChsaXN0LCBrZXksIGlzRGVsZXRlKSB7XG5cdC8qKiBAdHlwZSB7dHlwZW9mIGxpc3QgfCBOb25OdWxsYWJsZTwodHlwZW9mIGxpc3QpWyduZXh0J10+fSAqL1xuXHR2YXIgcHJldiA9IGxpc3Q7XG5cdC8qKiBAdHlwZSB7KHR5cGVvZiBsaXN0KVsnbmV4dCddfSAqL1xuXHR2YXIgY3Vycjtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRmb3IgKDsgKGN1cnIgPSBwcmV2Lm5leHQpICE9IG51bGw7IHByZXYgPSBjdXJyKSB7XG5cdFx0aWYgKGN1cnIua2V5ID09PSBrZXkpIHtcblx0XHRcdHByZXYubmV4dCA9IGN1cnIubmV4dDtcblx0XHRcdGlmICghaXNEZWxldGUpIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdFx0XHRjdXJyLm5leHQgPSAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiBsaXN0Lm5leHQ+fSAqLyAobGlzdC5uZXh0KTtcblx0XHRcdFx0bGlzdC5uZXh0ID0gY3VycjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGN1cnI7XG5cdFx0fVxuXHR9XG59O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9saXN0LmQudHMnKS5saXN0R2V0fSAqL1xudmFyIGxpc3RHZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdGlmICghb2JqZWN0cykge1xuXHRcdHJldHVybiB2b2lkIHVuZGVmaW5lZDtcblx0fVxuXHR2YXIgbm9kZSA9IGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG5cdHJldHVybiBub2RlICYmIG5vZGUudmFsdWU7XG59O1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykubGlzdFNldH0gKi9cbnZhciBsaXN0U2V0ID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSwgdmFsdWUpIHtcblx0dmFyIG5vZGUgPSBsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xuXHRpZiAobm9kZSkge1xuXHRcdG5vZGUudmFsdWUgPSB2YWx1ZTtcblx0fSBlbHNlIHtcblx0XHQvLyBQcmVwZW5kIHRoZSBuZXcgbm9kZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cdFx0b2JqZWN0cy5uZXh0ID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykuTGlzdE5vZGU8dHlwZW9mIHZhbHVlLCB0eXBlb2Yga2V5Pn0gKi8gKHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnbiwgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHRrZXk6IGtleSxcblx0XHRcdG5leHQ6IG9iamVjdHMubmV4dCxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH0pO1xuXHR9XG59O1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykubGlzdEhhc30gKi9cbnZhciBsaXN0SGFzID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHRpZiAoIW9iamVjdHMpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuICEhbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcbn07XG4vKiogQHR5cGUge2ltcG9ydCgnLi9saXN0LmQudHMnKS5saXN0RGVsZXRlfSAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG52YXIgbGlzdERlbGV0ZSA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXkpIHtcblx0aWYgKG9iamVjdHMpIHtcblx0XHRyZXR1cm4gbGlzdEdldE5vZGUob2JqZWN0cywga2V5LCB0cnVlKTtcblx0fVxufTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0U2lkZUNoYW5uZWxMaXN0KCkge1xuXHQvKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIGdldFNpZGVDaGFubmVsTGlzdD59IENoYW5uZWwgKi9cblx0LyoqIEB0eXBlZGVmIHtQYXJhbWV0ZXJzPENoYW5uZWxbJ2dldCddPlswXX0gSyAqL1xuXHQvKiogQHR5cGVkZWYge1BhcmFtZXRlcnM8Q2hhbm5lbFsnc2V0J10+WzFdfSBWICovXG5cblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykuUm9vdE5vZGU8ViwgSz4gfCB1bmRlZmluZWR9ICovIHZhciAkbztcblxuXHQvKiogQHR5cGUge0NoYW5uZWx9ICovXG5cdHZhciBjaGFubmVsID0ge1xuXHRcdGFzc2VydDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0aWYgKCFjaGFubmVsLmhhcyhrZXkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAnICsgaW5zcGVjdChrZXkpKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHR2YXIgcm9vdCA9ICRvICYmICRvLm5leHQ7XG5cdFx0XHR2YXIgZGVsZXRlZE5vZGUgPSBsaXN0RGVsZXRlKCRvLCBrZXkpO1xuXHRcdFx0aWYgKGRlbGV0ZWROb2RlICYmIHJvb3QgJiYgcm9vdCA9PT0gZGVsZXRlZE5vZGUpIHtcblx0XHRcdFx0JG8gPSB2b2lkIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiAhIWRlbGV0ZWROb2RlO1xuXHRcdH0sXG5cdFx0Z2V0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gbGlzdEdldCgkbywga2V5KTtcblx0XHR9LFxuXHRcdGhhczogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGxpc3RIYXMoJG8sIGtleSk7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRpZiAoISRvKSB7XG5cdFx0XHRcdC8vIEluaXRpYWxpemUgdGhlIGxpbmtlZCBsaXN0IGFzIGFuIGVtcHR5IG5vZGUsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2YgdGhlIGZpcnN0IG5vZGU6IHdlIGNhbiBhbHdheXMgcmVmZXIgdG8gaXQgYXMgKHByZXZpb3VzIG5vZGUpLm5leHQsIGluc3RlYWQgb2Ygc29tZXRoaW5nIGxpa2UgKGxpc3QpLmhlYWRcblx0XHRcdFx0JG8gPSB7XG5cdFx0XHRcdFx0bmV4dDogdm9pZCB1bmRlZmluZWRcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHRcdGxpc3RTZXQoLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgJG8+fSAqLyAoJG8pLCBrZXksIHZhbHVlKTtcblx0XHR9XG5cdH07XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpcyBlcnJvcmluZ1xuXHRyZXR1cm4gY2hhbm5lbDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Q7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBFcnJvcjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2V2YWwnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXZhbEVycm9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vcmFuZ2UnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gUmFuZ2VFcnJvcjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JlZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZWZlcmVuY2VFcnJvcjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3N5bnRheCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBTeW50YXhFcnJvcjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3VyaScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBVUklFcnJvcjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2FicycpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmFicztcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2Zsb29yJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZmxvb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9tYXgnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5tYXg7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9taW4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5taW47XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9wb3cnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5wb3c7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yb3VuZCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnJvdW5kO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vaXNOYU4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIGlzTmFOKGEpIHtcblx0cmV0dXJuIGEgIT09IGE7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyICRpc05hTiA9IHJlcXVpcmUoJy4vaXNOYU4nKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc2lnbicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaWduKG51bWJlcikge1xuXHRpZiAoJGlzTmFOKG51bWJlcikgfHwgbnVtYmVyID09PSAwKSB7XG5cdFx0cmV0dXJuIG51bWJlcjtcblx0fVxuXHRyZXR1cm4gbnVtYmVyIDwgMCA/IC0xIDogKzE7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZ09QRCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZ09QRCA9IHJlcXVpcmUoJy4vZ09QRCcpO1xuXG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRChbXSwgJ2xlbmd0aCcpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZ09QRFxuXHRcdCRnT1BEID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRnT1BEO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgfHwgZmFsc2U7XG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGRlZmluZVByb3BlcnR5O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc2hhbXMnKX0gKi9cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0LyoqIEB0eXBlIHt7IFtrIGluIHN5bWJvbF0/OiB1bmtub3duIH19ICovXG5cdHZhciBvYmogPSB7fTtcblx0dmFyIHN5bSA9IFN5bWJvbCgndGVzdCcpO1xuXHR2YXIgc3ltT2JqID0gT2JqZWN0KHN5bSk7XG5cdGlmICh0eXBlb2Ygc3ltID09PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bU9iaikgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvb2JqZWN0LmFzc2lnbi9pc3N1ZXMvMTdcblx0Ly8gaWYgKHN5bSBpbnN0YW5jZW9mIFN5bWJvbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzL2lzc3Vlcy80XG5cdC8vIGlmICghKHN5bU9iaiBpbnN0YW5jZW9mIFN5bWJvbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gaWYgKHR5cGVvZiBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyBpZiAoU3RyaW5nKHN5bSkgIT09IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1WYWwgPSA0Mjtcblx0b2JqW3N5bV0gPSBzeW1WYWw7XG5cdGZvciAodmFyIF8gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdHZhciBkZXNjcmlwdG9yID0gLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKSk7XG5cdFx0aWYgKGRlc2NyaXB0b3IudmFsdWUgIT09IHN5bVZhbCB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUgIT09IHRydWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2woJ2ZvbycpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2woJ2JhcicpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRyZXR1cm4gaGFzU3ltYm9sU2hhbSgpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gKHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKSB8fCBudWxsO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyICRPYmplY3QgPSByZXF1aXJlKCdlcy1vYmplY3QtYXRvbXMnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vT2JqZWN0LmdldFByb3RvdHlwZU9mJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgbnVsbDtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBuby1pbnZhbGlkLXRoaXM6IDEgKi9cblxudmFyIEVSUk9SX01FU1NBR0UgPSAnRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAnO1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBmdW5jVHlwZSA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cbnZhciBjb25jYXR0eSA9IGZ1bmN0aW9uIGNvbmNhdHR5KGEsIGIpIHtcbiAgICB2YXIgYXJyID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyW2ldID0gYVtpXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBiLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGFycltqICsgYS5sZW5ndGhdID0gYltqXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIHNsaWN5ID0gZnVuY3Rpb24gc2xpY3koYXJyTGlrZSwgb2Zmc2V0KSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBvZmZzZXQgfHwgMCwgaiA9IDA7IGkgPCBhcnJMaWtlLmxlbmd0aDsgaSArPSAxLCBqICs9IDEpIHtcbiAgICAgICAgYXJyW2pdID0gYXJyTGlrZVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbn07XG5cbnZhciBqb2lueSA9IGZ1bmN0aW9uIChhcnIsIGpvaW5lcikge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gYXJyW2ldO1xuICAgICAgICBpZiAoaSArIDEgPCBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICBzdHIgKz0gam9pbmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmFwcGx5KHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY3koYXJndW1lbnRzLCAxKTtcblxuICAgIHZhciBib3VuZDtcbiAgICB2YXIgYmluZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgY29uY2F0dHkoYXJncywgYXJndW1lbnRzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgY29uY2F0dHkoYXJncywgYXJndW1lbnRzKVxuICAgICAgICApO1xuXG4gICAgfTtcblxuICAgIHZhciBib3VuZExlbmd0aCA9IG1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzW2ldID0gJyQnICsgaTtcbiAgICB9XG5cbiAgICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgam9pbnkoYm91bmRBcmdzLCAnLCcpICsgJyl7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9JykoYmluZGVyKTtcblxuICAgIGlmICh0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBFbXB0eSgpO1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9mdW5jdGlvbkNhbGwnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9mdW5jdGlvbkFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JlZmxlY3RBcHBseScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgUmVmbGVjdCAmJiBSZWZsZWN0LmFwcGx5O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbnZhciAkYXBwbHkgPSByZXF1aXJlKCcuL2Z1bmN0aW9uQXBwbHknKTtcbnZhciAkY2FsbCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25DYWxsJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IHJlcXVpcmUoJy4vcmVmbGVjdEFwcGx5Jyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2FjdHVhbEFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRyZWZsZWN0QXBwbHkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbnZhciAkY2FsbCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25DYWxsJyk7XG52YXIgJGFjdHVhbEFwcGx5ID0gcmVxdWlyZSgnLi9hY3R1YWxBcHBseScpO1xuXG4vKiogQHR5cGUgeyhhcmdzOiBbRnVuY3Rpb24sIHRoaXNBcmc/OiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW11dKSA9PiBGdW5jdGlvbn0gVE9ETyBGSVhNRSwgZmluZCBhIHdheSB0byB1c2UgaW1wb3J0KCcuJykgKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJpbmRCYXNpYyhhcmdzKSB7XG5cdGlmIChhcmdzLmxlbmd0aCA8IDEgfHwgdHlwZW9mIGFyZ3NbMF0gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYSBmdW5jdGlvbiBpcyByZXF1aXJlZCcpO1xuXHR9XG5cdHJldHVybiAkYWN0dWFsQXBwbHkoYmluZCwgJGNhbGwsIGFyZ3MpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsQmluZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzJyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxudmFyIGhhc1Byb3RvQWNjZXNzb3I7XG50cnkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zLCBuby1wcm90b1xuXHRoYXNQcm90b0FjY2Vzc29yID0gLyoqIEB0eXBlIHt7IF9fcHJvdG9fXz86IHR5cGVvZiBBcnJheS5wcm90b3R5cGUgfX0gKi8gKFtdKS5fX3Byb3RvX18gPT09IEFycmF5LnByb3RvdHlwZTtcbn0gY2F0Y2ggKGUpIHtcblx0aWYgKCFlIHx8IHR5cGVvZiBlICE9PSAnb2JqZWN0JyB8fCAhKCdjb2RlJyBpbiBlKSB8fCBlLmNvZGUgIT09ICdFUlJfUFJPVE9fQUNDRVNTJykge1xuXHRcdHRocm93IGU7XG5cdH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xudmFyIGRlc2MgPSAhIWhhc1Byb3RvQWNjZXNzb3IgJiYgZ09QRCAmJiBnT1BEKE9iamVjdC5wcm90b3R5cGUsIC8qKiBAdHlwZSB7a2V5b2YgdHlwZW9mIE9iamVjdC5wcm90b3R5cGV9ICovICgnX19wcm90b19fJykpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSAkT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9nZXQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZGVzYyAmJiB0eXBlb2YgZGVzYy5nZXQgPT09ICdmdW5jdGlvbidcblx0PyBjYWxsQmluZChbZGVzYy5nZXRdKVxuXHQ6IHR5cGVvZiAkZ2V0UHJvdG90eXBlT2YgPT09ICdmdW5jdGlvbidcblx0XHQ/IC8qKiBAdHlwZSB7aW1wb3J0KCcuL2dldCcpfSAqLyBmdW5jdGlvbiBnZXREdW5kZXIodmFsdWUpIHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdHJldHVybiAkZ2V0UHJvdG90eXBlT2YodmFsdWUgPT0gbnVsbCA/IHZhbHVlIDogJE9iamVjdCh2YWx1ZSkpO1xuXHRcdH1cblx0XHQ6IGZhbHNlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZmxlY3RHZXRQcm90byA9IHJlcXVpcmUoJy4vUmVmbGVjdC5nZXRQcm90b3R5cGVPZicpO1xudmFyIG9yaWdpbmFsR2V0UHJvdG8gPSByZXF1aXJlKCcuL09iamVjdC5nZXRQcm90b3R5cGVPZicpO1xuXG52YXIgZ2V0RHVuZGVyUHJvdG8gPSByZXF1aXJlKCdkdW5kZXItcHJvdG8vZ2V0Jyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IHJlZmxlY3RHZXRQcm90b1xuXHQ/IGZ1bmN0aW9uIGdldFByb3RvKE8pIHtcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGNhbid0IG5hcnJvdyBpbnNpZGUgYSBjbG9zdXJlLCBmb3Igc29tZSByZWFzb25cblx0XHRyZXR1cm4gcmVmbGVjdEdldFByb3RvKE8pO1xuXHR9XG5cdDogb3JpZ2luYWxHZXRQcm90b1xuXHRcdD8gZnVuY3Rpb24gZ2V0UHJvdG8oTykge1xuXHRcdFx0aWYgKCFPIHx8ICh0eXBlb2YgTyAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIE8gIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2dldFByb3RvOiBub3QgYW4gb2JqZWN0Jyk7XG5cdFx0XHR9XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGNhbid0IG5hcnJvdyBpbnNpZGUgYSBjbG9zdXJlLCBmb3Igc29tZSByZWFzb25cblx0XHRcdHJldHVybiBvcmlnaW5hbEdldFByb3RvKE8pO1xuXHRcdH1cblx0XHQ6IGdldER1bmRlclByb3RvXG5cdFx0XHQ/IGZ1bmN0aW9uIGdldFByb3RvKE8pIHtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZSwgZm9yIHNvbWUgcmVhc29uXG5cdFx0XHRcdHJldHVybiBnZXREdW5kZXJQcm90byhPKTtcblx0XHRcdH1cblx0XHRcdDogbnVsbDtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG52YXIgJGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKGNhbGwsICRoYXNPd24pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHVuZGVmaW5lZDtcblxudmFyICRPYmplY3QgPSByZXF1aXJlKCdlcy1vYmplY3QtYXRvbXMnKTtcblxudmFyICRFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycycpO1xudmFyICRFdmFsRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvZXZhbCcpO1xudmFyICRSYW5nZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3JhbmdlJyk7XG52YXIgJFJlZmVyZW5jZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3JlZicpO1xudmFyICRTeW50YXhFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9zeW50YXgnKTtcbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkVVJJRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdXJpJyk7XG5cbnZhciBhYnMgPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3MvYWJzJyk7XG52YXIgZmxvb3IgPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3MvZmxvb3InKTtcbnZhciBtYXggPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3MvbWF4Jyk7XG52YXIgbWluID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL21pbicpO1xudmFyIHBvdyA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9wb3cnKTtcbnZhciByb3VuZCA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9yb3VuZCcpO1xudmFyIHNpZ24gPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3Mvc2lnbicpO1xuXG52YXIgJEZ1bmN0aW9uID0gRnVuY3Rpb247XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxudmFyIGdldEV2YWxsZWRDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChleHByZXNzaW9uU3ludGF4KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuICRGdW5jdGlvbignXCJ1c2Ugc3RyaWN0XCI7IHJldHVybiAoJyArIGV4cHJlc3Npb25TeW50YXggKyAnKS5jb25zdHJ1Y3RvcjsnKSgpO1xuXHR9IGNhdGNoIChlKSB7fVxufTtcblxudmFyICRnT1BEID0gcmVxdWlyZSgnZ29wZCcpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgdGhyb3dUeXBlRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdHRocm93IG5ldyAkVHlwZUVycm9yKCk7XG59O1xudmFyIFRocm93VHlwZUVycm9yID0gJGdPUERcblx0PyAoZnVuY3Rpb24gKCkge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zLCBuby1jYWxsZXIsIG5vLXJlc3RyaWN0ZWQtcHJvcGVydGllc1xuXHRcdFx0YXJndW1lbnRzLmNhbGxlZTsgLy8gSUUgOCBkb2VzIG5vdCB0aHJvdyBoZXJlXG5cdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0fSBjYXRjaCAoY2FsbGVlVGhyb3dzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBJRSA4IHRocm93cyBvbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFyZ3VtZW50cywgJycpXG5cdFx0XHRcdHJldHVybiAkZ09QRChhcmd1bWVudHMsICdjYWxsZWUnKS5nZXQ7XG5cdFx0XHR9IGNhdGNoIChnT1BEdGhyb3dzKSB7XG5cdFx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHRcdH1cblx0XHR9XG5cdH0oKSlcblx0OiB0aHJvd1R5cGVFcnJvcjtcblxudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scycpKCk7XG5cbnZhciBnZXRQcm90byA9IHJlcXVpcmUoJ2dldC1wcm90bycpO1xudmFyICRPYmplY3RHUE8gPSByZXF1aXJlKCdnZXQtcHJvdG8vT2JqZWN0LmdldFByb3RvdHlwZU9mJyk7XG52YXIgJFJlZmxlY3RHUE8gPSByZXF1aXJlKCdnZXQtcHJvdG8vUmVmbGVjdC5nZXRQcm90b3R5cGVPZicpO1xuXG52YXIgJGFwcGx5ID0gcmVxdWlyZSgnY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25BcHBseScpO1xudmFyICRjYWxsID0gcmVxdWlyZSgnY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25DYWxsJyk7XG5cbnZhciBuZWVkc0V2YWwgPSB7fTtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8oVWludDhBcnJheSk7XG5cbnZhciBJTlRSSU5TSUNTID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCclQWdncmVnYXRlRXJyb3IlJzogdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFnZ3JlZ2F0ZUVycm9yLFxuXHQnJUFycmF5JSc6IEFycmF5LFxuXHQnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogbmVlZHNFdmFsLFxuXHQnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyVCaWdJbnQlJzogdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQsXG5cdCclQmlnSW50NjRBcnJheSUnOiB0eXBlb2YgQmlnSW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQ2NEFycmF5LFxuXHQnJUJpZ1VpbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdVaW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdVaW50NjRBcnJheSxcblx0JyVCb29sZWFuJSc6IEJvb2xlYW4sXG5cdCclRGF0YVZpZXclJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LFxuXHQnJURhdGUlJzogRGF0ZSxcblx0JyVkZWNvZGVVUkklJzogZGVjb2RlVVJJLFxuXHQnJWRlY29kZVVSSUNvbXBvbmVudCUnOiBkZWNvZGVVUklDb21wb25lbnQsXG5cdCclZW5jb2RlVVJJJSc6IGVuY29kZVVSSSxcblx0JyVlbmNvZGVVUklDb21wb25lbnQlJzogZW5jb2RlVVJJQ29tcG9uZW50LFxuXHQnJUVycm9yJSc6ICRFcnJvcixcblx0JyVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJUV2YWxFcnJvciUnOiAkRXZhbEVycm9yLFxuXHQnJUZsb2F0MTZBcnJheSUnOiB0eXBlb2YgRmxvYXQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MTZBcnJheSxcblx0JyVGbG9hdDMyQXJyYXklJzogdHlwZW9mIEZsb2F0MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDMyQXJyYXksXG5cdCclRmxvYXQ2NEFycmF5JSc6IHR5cGVvZiBGbG9hdDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQ2NEFycmF5LFxuXHQnJUZpbmFsaXphdGlvblJlZ2lzdHJ5JSc6IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGaW5hbGl6YXRpb25SZWdpc3RyeSxcblx0JyVGdW5jdGlvbiUnOiAkRnVuY3Rpb24sXG5cdCclR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUludDhBcnJheSUnOiB0eXBlb2YgSW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDhBcnJheSxcblx0JyVJbnQxNkFycmF5JSc6IHR5cGVvZiBJbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDE2QXJyYXksXG5cdCclSW50MzJBcnJheSUnOiB0eXBlb2YgSW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQzMkFycmF5LFxuXHQnJWlzRmluaXRlJSc6IGlzRmluaXRlLFxuXHQnJWlzTmFOJSc6IGlzTmFOLFxuXHQnJUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90byhnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKSA6IHVuZGVmaW5lZCxcblx0JyVKU09OJSc6IHR5cGVvZiBKU09OID09PSAnb2JqZWN0JyA/IEpTT04gOiB1bmRlZmluZWQsXG5cdCclTWFwJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTWFwLFxuXHQnJU1hcEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBNYXAoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJU1hdGglJzogTWF0aCxcblx0JyVOdW1iZXIlJzogTnVtYmVyLFxuXHQnJU9iamVjdCUnOiAkT2JqZWN0LFxuXHQnJU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IlJzogJGdPUEQsXG5cdCclcGFyc2VGbG9hdCUnOiBwYXJzZUZsb2F0LFxuXHQnJXBhcnNlSW50JSc6IHBhcnNlSW50LFxuXHQnJVByb21pc2UlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZSxcblx0JyVQcm94eSUnOiB0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJveHksXG5cdCclUmFuZ2VFcnJvciUnOiAkUmFuZ2VFcnJvcixcblx0JyVSZWZlcmVuY2VFcnJvciUnOiAkUmVmZXJlbmNlRXJyb3IsXG5cdCclUmVmbGVjdCUnOiB0eXBlb2YgUmVmbGVjdCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBSZWZsZWN0LFxuXHQnJVJlZ0V4cCUnOiBSZWdFeHAsXG5cdCclU2V0JSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2V0LFxuXHQnJVNldEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyVTdHJpbmclJzogU3RyaW5nLFxuXHQnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJVN5bnRheEVycm9yJSc6ICRTeW50YXhFcnJvcixcblx0JyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG5cdCclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJVVSSUVycm9yJSc6ICRVUklFcnJvcixcblx0JyVXZWFrTWFwJSc6IHR5cGVvZiBXZWFrTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtNYXAsXG5cdCclV2Vha1JlZiUnOiB0eXBlb2YgV2Vha1JlZiA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrUmVmLFxuXHQnJVdlYWtTZXQlJzogdHlwZW9mIFdlYWtTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1NldCxcblxuXHQnJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJSc6ICRjYWxsLFxuXHQnJUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSUnOiAkYXBwbHksXG5cdCclT2JqZWN0LmRlZmluZVByb3BlcnR5JSc6ICRkZWZpbmVQcm9wZXJ0eSxcblx0JyVPYmplY3QuZ2V0UHJvdG90eXBlT2YlJzogJE9iamVjdEdQTyxcblx0JyVNYXRoLmFicyUnOiBhYnMsXG5cdCclTWF0aC5mbG9vciUnOiBmbG9vcixcblx0JyVNYXRoLm1heCUnOiBtYXgsXG5cdCclTWF0aC5taW4lJzogbWluLFxuXHQnJU1hdGgucG93JSc6IHBvdyxcblx0JyVNYXRoLnJvdW5kJSc6IHJvdW5kLFxuXHQnJU1hdGguc2lnbiUnOiBzaWduLFxuXHQnJVJlZmxlY3QuZ2V0UHJvdG90eXBlT2YlJzogJFJlZmxlY3RHUE9cbn07XG5cbmlmIChnZXRQcm90bykge1xuXHR0cnkge1xuXHRcdG51bGwuZXJyb3I7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zaGFkb3dyZWFsbS9wdWxsLzM4NCNpc3N1ZWNvbW1lbnQtMTM2NDI2NDIyOVxuXHRcdHZhciBlcnJvclByb3RvID0gZ2V0UHJvdG8oZ2V0UHJvdG8oZSkpO1xuXHRcdElOVFJJTlNJQ1NbJyVFcnJvci5wcm90b3R5cGUlJ10gPSBlcnJvclByb3RvO1xuXHR9XG59XG5cbnZhciBkb0V2YWwgPSBmdW5jdGlvbiBkb0V2YWwobmFtZSkge1xuXHR2YXIgdmFsdWU7XG5cdGlmIChuYW1lID09PSAnJUFzeW5jRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdhc3luYyBmdW5jdGlvbiAoKSB7fScpO1xuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclR2VuZXJhdG9yRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdmdW5jdGlvbiogKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJykge1xuXHRcdHZhbHVlID0gZ2V0RXZhbGxlZENvbnN0cnVjdG9yKCdhc3luYyBmdW5jdGlvbiogKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jR2VuZXJhdG9yJScpIHtcblx0XHR2YXIgZm4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpO1xuXHRcdGlmIChmbikge1xuXHRcdFx0dmFsdWUgPSBmbi5wcm90b3R5cGU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG5hbWUgPT09ICclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnKSB7XG5cdFx0dmFyIGdlbiA9IGRvRXZhbCgnJUFzeW5jR2VuZXJhdG9yJScpO1xuXHRcdGlmIChnZW4gJiYgZ2V0UHJvdG8pIHtcblx0XHRcdHZhbHVlID0gZ2V0UHJvdG8oZ2VuLnByb3RvdHlwZSk7XG5cdFx0fVxuXHR9XG5cblx0SU5UUklOU0lDU1tuYW1lXSA9IHZhbHVlO1xuXG5cdHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBMRUdBQ1lfQUxJQVNFUyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnJUFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b3R5cGUlJzogWydBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvX2VudHJpZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZW50cmllcyddLFxuXHQnJUFycmF5UHJvdG9fZm9yRWFjaCUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdmb3JFYWNoJ10sXG5cdCclQXJyYXlQcm90b19rZXlzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2tleXMnXSxcblx0JyVBcnJheVByb3RvX3ZhbHVlcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICd2YWx1ZXMnXSxcblx0JyVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSc6IFsnQXN5bmNGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVCb29sZWFuUHJvdG90eXBlJSc6IFsnQm9vbGVhbicsICdwcm90b3R5cGUnXSxcblx0JyVEYXRhVmlld1Byb3RvdHlwZSUnOiBbJ0RhdGFWaWV3JywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGVQcm90b3R5cGUlJzogWydEYXRlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUVycm9yUHJvdG90eXBlJSc6IFsnRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRXZhbEVycm9yUHJvdG90eXBlJSc6IFsnRXZhbEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0MzJBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDY0QXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDY0QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRnVuY3Rpb25Qcm90b3R5cGUlJzogWydGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVHZW5lcmF0b3IlJzogWydHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVHZW5lcmF0b3JQcm90b3R5cGUlJzogWydHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclSW50OEFycmF5UHJvdG90eXBlJSc6IFsnSW50OEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDE2QXJyYXlQcm90b3R5cGUlJzogWydJbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDMyQXJyYXlQcm90b3R5cGUlJzogWydJbnQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUpTT05QYXJzZSUnOiBbJ0pTT04nLCAncGFyc2UnXSxcblx0JyVKU09OU3RyaW5naWZ5JSc6IFsnSlNPTicsICdzdHJpbmdpZnknXSxcblx0JyVNYXBQcm90b3R5cGUlJzogWydNYXAnLCAncHJvdG90eXBlJ10sXG5cdCclTnVtYmVyUHJvdG90eXBlJSc6IFsnTnVtYmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJU9iamVjdFByb3RvdHlwZSUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnXSxcblx0JyVPYmpQcm90b190b1N0cmluZyUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndG9TdHJpbmcnXSxcblx0JyVPYmpQcm90b192YWx1ZU9mJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd2YWx1ZU9mJ10sXG5cdCclUHJvbWlzZVByb3RvdHlwZSUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJ10sXG5cdCclUHJvbWlzZVByb3RvX3RoZW4lJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZScsICd0aGVuJ10sXG5cdCclUHJvbWlzZV9hbGwlJzogWydQcm9taXNlJywgJ2FsbCddLFxuXHQnJVByb21pc2VfcmVqZWN0JSc6IFsnUHJvbWlzZScsICdyZWplY3QnXSxcblx0JyVQcm9taXNlX3Jlc29sdmUlJzogWydQcm9taXNlJywgJ3Jlc29sdmUnXSxcblx0JyVSYW5nZUVycm9yUHJvdG90eXBlJSc6IFsnUmFuZ2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnOiBbJ1JlZmVyZW5jZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZ0V4cFByb3RvdHlwZSUnOiBbJ1JlZ0V4cCcsICdwcm90b3R5cGUnXSxcblx0JyVTZXRQcm90b3R5cGUlJzogWydTZXQnLCAncHJvdG90eXBlJ10sXG5cdCclU2hhcmVkQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydTaGFyZWRBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVTdHJpbmdQcm90b3R5cGUlJzogWydTdHJpbmcnLCAncHJvdG90eXBlJ10sXG5cdCclU3ltYm9sUHJvdG90eXBlJSc6IFsnU3ltYm9sJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bnRheEVycm9yUHJvdG90eXBlJSc6IFsnU3ludGF4RXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVHlwZWRBcnJheVByb3RvdHlwZSUnOiBbJ1R5cGVkQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVHlwZUVycm9yUHJvdG90eXBlJSc6IFsnVHlwZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQ4QXJyYXlQcm90b3R5cGUlJzogWydVaW50OEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhDbGFtcGVkQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDE2QXJyYXlQcm90b3R5cGUlJzogWydVaW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVSSUVycm9yUHJvdG90eXBlJSc6IFsnVVJJRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclV2Vha01hcFByb3RvdHlwZSUnOiBbJ1dlYWtNYXAnLCAncHJvdG90eXBlJ10sXG5cdCclV2Vha1NldFByb3RvdHlwZSUnOiBbJ1dlYWtTZXQnLCAncHJvdG90eXBlJ11cbn07XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJ2hhc293bicpO1xudmFyICRjb25jYXQgPSBiaW5kLmNhbGwoJGNhbGwsIEFycmF5LnByb3RvdHlwZS5jb25jYXQpO1xudmFyICRzcGxpY2VBcHBseSA9IGJpbmQuY2FsbCgkYXBwbHksIEFycmF5LnByb3RvdHlwZS5zcGxpY2UpO1xudmFyICRyZXBsYWNlID0gYmluZC5jYWxsKCRjYWxsLCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xudmFyICRzdHJTbGljZSA9IGJpbmQuY2FsbCgkY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5zbGljZSk7XG52YXIgJGV4ZWMgPSBiaW5kLmNhbGwoJGNhbGwsIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyk7XG5cbi8qIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iLzQuMTcuMTUvZGlzdC9sb2Rhc2guanMjTDY3MzUtTDY3NDQgKi9cbnZhciByZVByb3BOYW1lID0gL1teJS5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwlJCkpL2c7XG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7IC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IGZ1bmN0aW9uIHN0cmluZ1RvUGF0aChzdHJpbmcpIHtcblx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHN0cmluZywgMCwgMSk7XG5cdHZhciBsYXN0ID0gJHN0clNsaWNlKHN0cmluZywgLTEpO1xuXHRpZiAoZmlyc3QgPT09ICclJyAmJiBsYXN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIGNsb3NpbmcgYCVgJyk7XG5cdH0gZWxzZSBpZiAobGFzdCA9PT0gJyUnICYmIGZpcnN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIG9wZW5pbmcgYCVgJyk7XG5cdH1cblx0dmFyIHJlc3VsdCA9IFtdO1xuXHQkcmVwbGFjZShzdHJpbmcsIHJlUHJvcE5hbWUsIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG5cdFx0cmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gcXVvdGUgPyAkcmVwbGFjZShzdWJTdHJpbmcsIHJlRXNjYXBlQ2hhciwgJyQxJykgOiBudW1iZXIgfHwgbWF0Y2g7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbi8qIGVuZCBhZGFwdGF0aW9uICovXG5cbnZhciBnZXRCYXNlSW50cmluc2ljID0gZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0dmFyIGludHJpbnNpY05hbWUgPSBuYW1lO1xuXHR2YXIgYWxpYXM7XG5cdGlmIChoYXNPd24oTEVHQUNZX0FMSUFTRVMsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0YWxpYXMgPSBMRUdBQ1lfQUxJQVNFU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpbnRyaW5zaWNOYW1lID0gJyUnICsgYWxpYXNbMF0gKyAnJSc7XG5cdH1cblxuXHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0dmFyIHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpZiAodmFsdWUgPT09IG5lZWRzRXZhbCkge1xuXHRcdFx0dmFsdWUgPSBkb0V2YWwoaW50cmluc2ljTmFtZSk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnICYmICFhbGxvd01pc3NpbmcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRhbGlhczogYWxpYXMsXG5cdFx0XHRuYW1lOiBpbnRyaW5zaWNOYW1lLFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fTtcblx0fVxuXG5cdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEdldEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0aWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYWxsb3dNaXNzaW5nICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cblx0aWYgKCRleGVjKC9eJT9bXiVdKiU/JC8sIG5hbWUpID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignYCVgIG1heSBub3QgYmUgcHJlc2VudCBhbnl3aGVyZSBidXQgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBpbnRyaW5zaWMgbmFtZScpO1xuXHR9XG5cdHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcblx0dmFyIGludHJpbnNpY0Jhc2VOYW1lID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJyc7XG5cblx0dmFyIGludHJpbnNpYyA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cdHZhciBpbnRyaW5zaWNSZWFsTmFtZSA9IGludHJpbnNpYy5uYW1lO1xuXHR2YXIgdmFsdWUgPSBpbnRyaW5zaWMudmFsdWU7XG5cdHZhciBza2lwRnVydGhlckNhY2hpbmcgPSBmYWxzZTtcblxuXHR2YXIgYWxpYXMgPSBpbnRyaW5zaWMuYWxpYXM7XG5cdGlmIChhbGlhcykge1xuXHRcdGludHJpbnNpY0Jhc2VOYW1lID0gYWxpYXNbMF07XG5cdFx0JHNwbGljZUFwcGx5KHBhcnRzLCAkY29uY2F0KFswLCAxXSwgYWxpYXMpKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAxLCBpc093biA9IHRydWU7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBwYXJ0ID0gcGFydHNbaV07XG5cdFx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHBhcnQsIDAsIDEpO1xuXHRcdHZhciBsYXN0ID0gJHN0clNsaWNlKHBhcnQsIC0xKTtcblx0XHRpZiAoXG5cdFx0XHQoXG5cdFx0XHRcdChmaXJzdCA9PT0gJ1wiJyB8fCBmaXJzdCA9PT0gXCInXCIgfHwgZmlyc3QgPT09ICdgJylcblx0XHRcdFx0fHwgKGxhc3QgPT09ICdcIicgfHwgbGFzdCA9PT0gXCInXCIgfHwgbGFzdCA9PT0gJ2AnKVxuXHRcdFx0KVxuXHRcdFx0JiYgZmlyc3QgIT09IGxhc3Rcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Byb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMnKTtcblx0XHR9XG5cdFx0aWYgKHBhcnQgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWlzT3duKSB7XG5cdFx0XHRza2lwRnVydGhlckNhY2hpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGludHJpbnNpY0Jhc2VOYW1lICs9ICcuJyArIHBhcnQ7XG5cdFx0aW50cmluc2ljUmVhbE5hbWUgPSAnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJztcblxuXHRcdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljUmVhbE5hbWUpKSB7XG5cdFx0XHR2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0aWYgKCEocGFydCBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0aWYgKCFhbGxvd01pc3NpbmcpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGdPUEQgJiYgKGkgKyAxKSA+PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdGlzT3duID0gISFkZXNjO1xuXG5cdFx0XHRcdC8vIEJ5IGNvbnZlbnRpb24sIHdoZW4gYSBkYXRhIHByb3BlcnR5IGlzIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvclxuXHRcdFx0XHQvLyBwcm9wZXJ0eSB0byBlbXVsYXRlIGEgZGF0YSBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IHN1ZmZlciBmcm9tXG5cdFx0XHRcdC8vIHRoZSBvdmVycmlkZSBtaXN0YWtlLCB0aGF0IGFjY2Vzc29yJ3MgZ2V0dGVyIGlzIG1hcmtlZCB3aXRoXG5cdFx0XHRcdC8vIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eS4gSGVyZSwgd2hlbiB3ZSBkZXRlY3QgdGhpcywgd2Vcblx0XHRcdFx0Ly8gdXBob2xkIHRoZSBpbGx1c2lvbiBieSBwcmV0ZW5kaW5nIHRvIHNlZSB0aGF0IG9yaWdpbmFsIGRhdGFcblx0XHRcdFx0Ly8gcHJvcGVydHksIGkuZS4sIHJldHVybmluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdldHRlclxuXHRcdFx0XHQvLyBpdHNlbGYuXG5cdFx0XHRcdGlmIChpc093biAmJiAnZ2V0JyBpbiBkZXNjICYmICEoJ29yaWdpbmFsVmFsdWUnIGluIGRlc2MuZ2V0KSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVzYy5nZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXNPd24gPSBoYXNPd24odmFsdWUsIHBhcnQpO1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPd24gJiYgIXNraXBGdXJ0aGVyQ2FjaGluZykge1xuXHRcdFx0XHRJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyIGNhbGxCaW5kQmFzaWMgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycycpO1xuXG4vKiogQHR5cGUgeyh0aGlzQXJnOiBzdHJpbmcsIHNlYXJjaFN0cmluZzogc3RyaW5nLCBwb3NpdGlvbj86IG51bWJlcikgPT4gbnVtYmVyfSAqL1xudmFyICRpbmRleE9mID0gY2FsbEJpbmRCYXNpYyhbR2V0SW50cmluc2ljKCclU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mJScpXSk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCb3VuZEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0LyogZXNsaW50IG5vLWV4dHJhLXBhcmVuczogMCAqL1xuXG5cdHZhciBpbnRyaW5zaWMgPSAvKiogQHR5cGUgeyh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd259ICovIChHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpKTtcblx0aWYgKHR5cGVvZiBpbnRyaW5zaWMgPT09ICdmdW5jdGlvbicgJiYgJGluZGV4T2YobmFtZSwgJy5wcm90b3R5cGUuJykgPiAtMSkge1xuXHRcdHJldHVybiBjYWxsQmluZEJhc2ljKC8qKiBAdHlwZSB7Y29uc3R9ICovIChbaW50cmluc2ljXSkpO1xuXHR9XG5cdHJldHVybiBpbnRyaW5zaWM7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJvdW5kJyk7XG52YXIgaW5zcGVjdCA9IHJlcXVpcmUoJ29iamVjdC1pbnNwZWN0Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkTWFwID0gR2V0SW50cmluc2ljKCclTWFwJScsIHRydWUpO1xuXG4vKiogQHR5cGUgezxLLCBWPih0aGlzQXJnOiBNYXA8SywgVj4sIGtleTogSykgPT4gVn0gKi9cbnZhciAkbWFwR2V0ID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmdldCcsIHRydWUpO1xuLyoqIEB0eXBlIHs8SywgVj4odGhpc0FyZzogTWFwPEssIFY+LCBrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSAqL1xudmFyICRtYXBTZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLLCBWPih0aGlzQXJnOiBNYXA8SywgVj4sIGtleTogSykgPT4gYm9vbGVhbn0gKi9cbnZhciAkbWFwSGFzID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmhhcycsIHRydWUpO1xuLyoqIEB0eXBlIHs8SywgVj4odGhpc0FyZzogTWFwPEssIFY+LCBrZXk6IEspID0+IGJvb2xlYW59ICovXG52YXIgJG1hcERlbGV0ZSA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5kZWxldGUnLCB0cnVlKTtcbi8qKiBAdHlwZSB7PEssIFY+KHRoaXNBcmc6IE1hcDxLLCBWPikgPT4gbnVtYmVyfSAqL1xudmFyICRtYXBTaXplID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLnNpemUnLCB0cnVlKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gISEkTWFwICYmIC8qKiBAdHlwZSB7RXhjbHVkZTxpbXBvcnQoJy4nKSwgZmFsc2U+fSAqLyBmdW5jdGlvbiBnZXRTaWRlQ2hhbm5lbE1hcCgpIHtcblx0LyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBnZXRTaWRlQ2hhbm5lbE1hcD59IENoYW5uZWwgKi9cblx0LyoqIEB0eXBlZGVmIHtQYXJhbWV0ZXJzPENoYW5uZWxbJ2dldCddPlswXX0gSyAqL1xuXHQvKiogQHR5cGVkZWYge1BhcmFtZXRlcnM8Q2hhbm5lbFsnc2V0J10+WzFdfSBWICovXG5cblx0LyoqIEB0eXBlIHtNYXA8SywgVj4gfCB1bmRlZmluZWR9ICovIHZhciAkbTtcblxuXHQvKiogQHR5cGUge0NoYW5uZWx9ICovXG5cdHZhciBjaGFubmVsID0ge1xuXHRcdGFzc2VydDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0aWYgKCFjaGFubmVsLmhhcyhrZXkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAnICsgaW5zcGVjdChrZXkpKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9ICRtYXBEZWxldGUoJG0sIGtleSk7XG5cdFx0XHRcdGlmICgkbWFwU2l6ZSgkbSkgPT09IDApIHtcblx0XHRcdFx0XHQkbSA9IHZvaWQgdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRnZXQ6IGZ1bmN0aW9uIChrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdHJldHVybiAkbWFwR2V0KCRtLCBrZXkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0cmV0dXJuICRtYXBIYXMoJG0sIGtleSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRpZiAoISRtKSB7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgaGFuZGxlIG5hcnJvd2luZyBhIHZhcmlhYmxlIGluc2lkZSBhIGNsb3N1cmVcblx0XHRcdFx0JG0gPSBuZXcgJE1hcCgpO1xuXHRcdFx0fVxuXHRcdFx0JG1hcFNldCgkbSwga2V5LCB2YWx1ZSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZmlndXJlIG91dCB3aHkgVFMgaXMgZXJyb3JpbmcgaGVyZVxuXHRyZXR1cm4gY2hhbm5lbDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYm91bmQnKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcbnZhciBnZXRTaWRlQ2hhbm5lbE1hcCA9IHJlcXVpcmUoJ3NpZGUtY2hhbm5lbC1tYXAnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRXZWFrTWFwID0gR2V0SW50cmluc2ljKCclV2Vha01hcCUnLCB0cnVlKTtcblxuLyoqIEB0eXBlIHs8SyBleHRlbmRzIG9iamVjdCwgVj4odGhpc0FyZzogV2Vha01hcDxLLCBWPiwga2V5OiBLKSA9PiBWfSAqL1xudmFyICR3ZWFrTWFwR2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbi8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBvYmplY3QsIFY+KHRoaXNBcmc6IFdlYWtNYXA8SywgVj4sIGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9ICovXG52YXIgJHdlYWtNYXBTZXQgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLnNldCcsIHRydWUpO1xuLyoqIEB0eXBlIHs8SyBleHRlbmRzIG9iamVjdCwgVj4odGhpc0FyZzogV2Vha01hcDxLLCBWPiwga2V5OiBLKSA9PiBib29sZWFufSAqL1xudmFyICR3ZWFrTWFwSGFzID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcbi8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBvYmplY3QsIFY+KHRoaXNBcmc6IFdlYWtNYXA8SywgVj4sIGtleTogSykgPT4gYm9vbGVhbn0gKi9cbnZhciAkd2Vha01hcERlbGV0ZSA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlJywgdHJ1ZSk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRXZWFrTWFwXG5cdD8gLyoqIEB0eXBlIHtFeGNsdWRlPGltcG9ydCgnLicpLCBmYWxzZT59ICovIGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsV2Vha01hcCgpIHtcblx0XHQvKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIGdldFNpZGVDaGFubmVsV2Vha01hcD59IENoYW5uZWwgKi9cblx0XHQvKiogQHR5cGVkZWYge1BhcmFtZXRlcnM8Q2hhbm5lbFsnZ2V0J10+WzBdfSBLICovXG5cdFx0LyoqIEB0eXBlZGVmIHtQYXJhbWV0ZXJzPENoYW5uZWxbJ3NldCddPlsxXX0gViAqL1xuXG5cdFx0LyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+IHwgdW5kZWZpbmVkfSAqLyB2YXIgJHdtO1xuXHRcdC8qKiBAdHlwZSB7Q2hhbm5lbCB8IHVuZGVmaW5lZH0gKi8gdmFyICRtO1xuXG5cdFx0LyoqIEB0eXBlIHtDaGFubmVsfSAqL1xuXHRcdHZhciBjaGFubmVsID0ge1xuXHRcdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdGlmICghY2hhbm5lbC5oYXMoa2V5KSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAnICsgaW5zcGVjdChrZXkpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdFx0aWYgKCR3bSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwRGVsZXRlKCR3bSwga2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoZ2V0U2lkZUNoYW5uZWxNYXApIHtcblx0XHRcdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0XHRcdHJldHVybiAkbVsnZGVsZXRlJ10oa2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdGdldDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRcdHJldHVybiAkd2Vha01hcEdldCgkd20sIGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAkbSAmJiAkbS5nZXQoa2V5KTtcblx0XHRcdH0sXG5cdFx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBIYXMoJHdtLCBrZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gISEkbSAmJiAkbS5oYXMoa2V5KTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdFx0aWYgKCEkd20pIHtcblx0XHRcdFx0XHRcdCR3bSA9IG5ldyAkV2Vha01hcCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQkd2Vha01hcFNldCgkd20sIGtleSwgdmFsdWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGdldFNpZGVDaGFubmVsTWFwKSB7XG5cdFx0XHRcdFx0aWYgKCEkbSkge1xuXHRcdFx0XHRcdFx0JG0gPSBnZXRTaWRlQ2hhbm5lbE1hcCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHRcdFx0LyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgJG0+fSAqLyAoJG0pLnNldChrZXksIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE86IGZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgZXJyb3Jpbmdcblx0XHRyZXR1cm4gY2hhbm5lbDtcblx0fVxuXHQ6IGdldFNpZGVDaGFubmVsTWFwO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xudmFyIGdldFNpZGVDaGFubmVsTGlzdCA9IHJlcXVpcmUoJ3NpZGUtY2hhbm5lbC1saXN0Jyk7XG52YXIgZ2V0U2lkZUNoYW5uZWxNYXAgPSByZXF1aXJlKCdzaWRlLWNoYW5uZWwtbWFwJyk7XG52YXIgZ2V0U2lkZUNoYW5uZWxXZWFrTWFwID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsLXdlYWttYXAnKTtcblxudmFyIG1ha2VDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWxXZWFrTWFwIHx8IGdldFNpZGVDaGFubmVsTWFwIHx8IGdldFNpZGVDaGFubmVsTGlzdDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0U2lkZUNoYW5uZWwoKSB7XG5cdC8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2lkZUNoYW5uZWw+fSBDaGFubmVsICovXG5cblx0LyoqIEB0eXBlIHtDaGFubmVsIHwgdW5kZWZpbmVkfSAqLyB2YXIgJGNoYW5uZWxEYXRhO1xuXG5cdC8qKiBAdHlwZSB7Q2hhbm5lbH0gKi9cblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiAhISRjaGFubmVsRGF0YSAmJiAkY2hhbm5lbERhdGFbJ2RlbGV0ZSddKGtleSk7XG5cdFx0fSxcblx0XHRnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiAkY2hhbm5lbERhdGEgJiYgJGNoYW5uZWxEYXRhLmdldChrZXkpO1xuXHRcdH0sXG5cdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gISEkY2hhbm5lbERhdGEgJiYgJGNoYW5uZWxEYXRhLmhhcyhrZXkpO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCEkY2hhbm5lbERhdGEpIHtcblx0XHRcdFx0JGNoYW5uZWxEYXRhID0gbWFrZUNoYW5uZWwoKTtcblx0XHRcdH1cblxuXHRcdFx0JGNoYW5uZWxEYXRhLnNldChrZXksIHZhbHVlKTtcblx0XHR9XG5cdH07XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpcyBlcnJvcmluZ1xuXHRyZXR1cm4gY2hhbm5lbDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbnZhciBGb3JtYXQgPSB7XG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2RlZmF1bHQnOiBGb3JtYXQuUkZDMzk4NixcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiBGb3JtYXQuUkZDMTczOCxcbiAgICBSRkMzOTg2OiBGb3JtYXQuUkZDMzk4NlxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgdmFyIGNvbXBhY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iai5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2pdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWQucHVzaChvYmpbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5vYmpbaXRlbS5wcm9wXSA9IGNvbXBhY3RlZDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBhcnJheVRvT2JqZWN0ID0gZnVuY3Rpb24gYXJyYXlUb09iamVjdChzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0gb3B0aW9ucyAmJiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IHsgX19wcm90b19fOiBudWxsIH0gOiB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtpXSA9IHNvdXJjZVtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgbWVyZ2UgPSBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIC8qIGVzbGludCBuby1wYXJhbS1yZWFzc2lnbjogMCAqL1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnICYmIHR5cGVvZiBzb3VyY2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAob3B0aW9ucyAmJiAob3B0aW9ucy5wbGFpbk9iamVjdHMgfHwgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpKVxuICAgICAgICAgICAgICAgIHx8ICFoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzb3VyY2UpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFt0YXJnZXRdLmNvbmNhdChzb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZVRhcmdldCA9IHRhcmdldDtcbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmICFpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgbWVyZ2VUYXJnZXQgPSBhcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiBpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgIGlmIChoYXMuY2FsbCh0YXJnZXQsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEl0ZW0gPSB0YXJnZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0gJiYgdHlwZW9mIHRhcmdldEl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldEl0ZW0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxudmFyIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxudmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzdHIsIGRlZmF1bHREZWNvZGVyLCBjaGFyc2V0KSB7XG4gICAgdmFyIHN0cldpdGhvdXRQbHVzID0gc3RyLnJlcGxhY2UoL1xcKy9nLCAnICcpO1xuICAgIGlmIChjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgLy8gdW5lc2NhcGUgbmV2ZXIgdGhyb3dzLCBubyB0cnkuLi5jYXRjaCBuZWVkZWQ6XG4gICAgICAgIHJldHVybiBzdHJXaXRob3V0UGx1cy5yZXBsYWNlKC8lWzAtOWEtZl17Mn0vZ2ksIHVuZXNjYXBlKTtcbiAgICB9XG4gICAgLy8gdXRmLThcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cldpdGhvdXRQbHVzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHJXaXRob3V0UGx1cztcbiAgICB9XG59O1xuXG52YXIgbGltaXQgPSAxMDI0O1xuXG4vKiBlc2xpbnQgb3BlcmF0b3ItbGluZWJyZWFrOiBbMiwgXCJiZWZvcmVcIl0gKi9cblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGRlZmF1bHRFbmNvZGVyLCBjaGFyc2V0LCBraW5kLCBmb3JtYXQpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHN0cjtcbiAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgc3RyaW5nID0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN0cik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJpbmcgPSBTdHJpbmcoc3RyKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGUoc3RyaW5nKS5yZXBsYWNlKC8ldVswLTlhLWZdezR9L2dpLCBmdW5jdGlvbiAoJDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJTI2JTIzJyArIHBhcnNlSW50KCQwLnNsaWNlKDIpLCAxNikgKyAnJTNCJztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG91dCA9ICcnO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RyaW5nLmxlbmd0aDsgaiArPSBsaW1pdCkge1xuICAgICAgICB2YXIgc2VnbWVudCA9IHN0cmluZy5sZW5ndGggPj0gbGltaXQgPyBzdHJpbmcuc2xpY2UoaiwgaiArIGxpbWl0KSA6IHN0cmluZztcbiAgICAgICAgdmFyIGFyciA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGMgPSBzZWdtZW50LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgYyA9PT0gMHgyRCAvLyAtXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHg1RiAvLyBfXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHg3RSAvLyB+XG4gICAgICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgICAgIHx8IChjID49IDB4NDEgJiYgYyA8PSAweDVBKSAvLyBhLXpcbiAgICAgICAgICAgICAgICB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg3QSkgLy8gQS1aXG4gICAgICAgICAgICAgICAgfHwgKGZvcm1hdCA9PT0gZm9ybWF0cy5SRkMxNzM4ICYmIChjID09PSAweDI4IHx8IGMgPT09IDB4MjkpKSAvLyAoIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IHNlZ21lbnQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPj0gMHhFMDAwKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhFMCB8IChjID4+IDEyKV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgJiAweDNGRikgPDwgMTApIHwgKHNlZ21lbnQuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG5cbiAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlWzB4RjAgfCAoYyA+PiAxOCldXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXVxuICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ICs9IGFyci5qb2luKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxudmFyIGNvbXBhY3QgPSBmdW5jdGlvbiBjb21wYWN0KHZhbHVlKSB7XG4gICAgdmFyIHF1ZXVlID0gW3sgb2JqOiB7IG86IHZhbHVlIH0sIHByb3A6ICdvJyB9XTtcbiAgICB2YXIgcmVmcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlW2ldO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHJlZnMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goeyBvYmo6IG9iaiwgcHJvcDoga2V5IH0pO1xuICAgICAgICAgICAgICAgIHJlZnMucHVzaCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcGFjdFF1ZXVlKHF1ZXVlKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBpc1JlZ0V4cCA9IGZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG52YXIgaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcblxudmFyIGNvbWJpbmUgPSBmdW5jdGlvbiBjb21iaW5lKGEsIGIpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGEsIGIpO1xufTtcblxudmFyIG1heWJlTWFwID0gZnVuY3Rpb24gbWF5YmVNYXAodmFsLCBmbikge1xuICAgIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgbWFwcGVkLnB1c2goZm4odmFsW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gICAgcmV0dXJuIGZuKHZhbCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbWJpbmU6IGNvbWJpbmUsXG4gICAgY29tcGFjdDogY29tcGFjdCxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gICAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICAgIG1heWJlTWFwOiBtYXliZU1hcCxcbiAgICBtZXJnZTogbWVyZ2Vcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0U2lkZUNoYW5uZWwgPSByZXF1aXJlKCdzaWRlLWNoYW5uZWwnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGFycmF5UHJlZml4R2VuZXJhdG9ycyA9IHtcbiAgICBicmFja2V0czogZnVuY3Rpb24gYnJhY2tldHMocHJlZml4KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnW10nO1xuICAgIH0sXG4gICAgY29tbWE6ICdjb21tYScsXG4gICAgaW5kaWNlczogZnVuY3Rpb24gaW5kaWNlcyhwcmVmaXgsIGtleSkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1snICsga2V5ICsgJ10nO1xuICAgIH0sXG4gICAgcmVwZWF0OiBmdW5jdGlvbiByZXBlYXQocHJlZml4KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaDtcbnZhciBwdXNoVG9BcnJheSA9IGZ1bmN0aW9uIChhcnIsIHZhbHVlT3JBcnJheSkge1xuICAgIHB1c2guYXBwbHkoYXJyLCBpc0FycmF5KHZhbHVlT3JBcnJheSkgPyB2YWx1ZU9yQXJyYXkgOiBbdmFsdWVPckFycmF5XSk7XG59O1xuXG52YXIgdG9JU08gPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcblxudmFyIGRlZmF1bHRGb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWRkUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgYWxsb3dFbXB0eUFycmF5czogZmFsc2UsXG4gICAgYXJyYXlGb3JtYXQ6ICdpbmRpY2VzJyxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgY29tbWFSb3VuZFRyaXA6IGZhbHNlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGVuY29kZTogdHJ1ZSxcbiAgICBlbmNvZGVEb3RJbktleXM6IGZhbHNlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmaWx0ZXI6IHZvaWQgdW5kZWZpbmVkLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBmb3JtYXR0ZXI6IGZvcm1hdHMuZm9ybWF0dGVyc1tkZWZhdWx0Rm9ybWF0XSxcbiAgICAvLyBkZXByZWNhdGVkXG4gICAgaW5kaWNlczogZmFsc2UsXG4gICAgc2VyaWFsaXplRGF0ZTogZnVuY3Rpb24gc2VyaWFsaXplRGF0ZShkYXRlKSB7XG4gICAgICAgIHJldHVybiB0b0lTTy5jYWxsKGRhdGUpO1xuICAgIH0sXG4gICAgc2tpcE51bGxzOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlXG59O1xuXG52YXIgaXNOb25OdWxsaXNoUHJpbWl0aXZlID0gZnVuY3Rpb24gaXNOb25OdWxsaXNoUHJpbWl0aXZlKHYpIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnbnVtYmVyJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnc3ltYm9sJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ2JpZ2ludCc7XG59O1xuXG52YXIgc2VudGluZWwgPSB7fTtcblxudmFyIHN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShcbiAgICBvYmplY3QsXG4gICAgcHJlZml4LFxuICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgY29tbWFSb3VuZFRyaXAsXG4gICAgYWxsb3dFbXB0eUFycmF5cyxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgc2tpcE51bGxzLFxuICAgIGVuY29kZURvdEluS2V5cyxcbiAgICBlbmNvZGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0LFxuICAgIGFsbG93RG90cyxcbiAgICBzZXJpYWxpemVEYXRlLFxuICAgIGZvcm1hdCxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICBjaGFyc2V0LFxuICAgIHNpZGVDaGFubmVsXG4pIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuXG4gICAgdmFyIHRtcFNjID0gc2lkZUNoYW5uZWw7XG4gICAgdmFyIHN0ZXAgPSAwO1xuICAgIHZhciBmaW5kRmxhZyA9IGZhbHNlO1xuICAgIHdoaWxlICgodG1wU2MgPSB0bXBTYy5nZXQoc2VudGluZWwpKSAhPT0gdm9pZCB1bmRlZmluZWQgJiYgIWZpbmRGbGFnKSB7XG4gICAgICAgIC8vIFdoZXJlIG9iamVjdCBsYXN0IGFwcGVhcmVkIGluIHRoZSByZWYgdHJlZVxuICAgICAgICB2YXIgcG9zID0gdG1wU2MuZ2V0KG9iamVjdCk7XG4gICAgICAgIHN0ZXAgKz0gMTtcbiAgICAgICAgaWYgKHR5cGVvZiBwb3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAocG9zID09PSBzdGVwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0N5Y2xpYyBvYmplY3QgdmFsdWUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmluZEZsYWcgPSB0cnVlOyAvLyBCcmVhayB3aGlsZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdG1wU2MuZ2V0KHNlbnRpbmVsKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN0ZXAgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqID0gZmlsdGVyKHByZWZpeCwgb2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb2JqID0gc2VyaWFsaXplRGF0ZShvYmopO1xuICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBpc0FycmF5KG9iaikpIHtcbiAgICAgICAgb2JqID0gdXRpbHMubWF5YmVNYXAob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHN0cmljdE51bGxIYW5kbGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIgJiYgIWVuY29kZVZhbHVlc09ubHkgPyBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCkgOiBwcmVmaXg7XG4gICAgICAgIH1cblxuICAgICAgICBvYmogPSAnJztcbiAgICB9XG5cbiAgICBpZiAoaXNOb25OdWxsaXNoUHJpbWl0aXZlKG9iaikgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0LCAna2V5JywgZm9ybWF0KTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ3ZhbHVlJywgZm9ybWF0KSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbZm9ybWF0dGVyKHByZWZpeCkgKyAnPScgKyBmb3JtYXR0ZXIoU3RyaW5nKG9iaikpXTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBpc0FycmF5KG9iaikpIHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBqb2luIGVsZW1lbnRzIGluXG4gICAgICAgIGlmIChlbmNvZGVWYWx1ZXNPbmx5ICYmIGVuY29kZXIpIHtcbiAgICAgICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZW5jb2Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgb2JqS2V5cyA9IFt7IHZhbHVlOiBvYmoubGVuZ3RoID4gMCA/IG9iai5qb2luKCcsJykgfHwgbnVsbCA6IHZvaWQgdW5kZWZpbmVkIH1dO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBvYmpLZXlzID0gc29ydCA/IGtleXMuc29ydChzb3J0KSA6IGtleXM7XG4gICAgfVxuXG4gICAgdmFyIGVuY29kZWRQcmVmaXggPSBlbmNvZGVEb3RJbktleXMgPyBTdHJpbmcocHJlZml4KS5yZXBsYWNlKC9cXC4vZywgJyUyRScpIDogU3RyaW5nKHByZWZpeCk7XG5cbiAgICB2YXIgYWRqdXN0ZWRQcmVmaXggPSBjb21tYVJvdW5kVHJpcCAmJiBpc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA9PT0gMSA/IGVuY29kZWRQcmVmaXggKyAnW10nIDogZW5jb2RlZFByZWZpeDtcblxuICAgIGlmIChhbGxvd0VtcHR5QXJyYXlzICYmIGlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBhZGp1c3RlZFByZWZpeCArICdbXSc7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBvYmpLZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2pdO1xuICAgICAgICB2YXIgdmFsdWUgPSB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJiBrZXkgJiYgdHlwZW9mIGtleS52YWx1ZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8ga2V5LnZhbHVlXG4gICAgICAgICAgICA6IG9ialtrZXldO1xuXG4gICAgICAgIGlmIChza2lwTnVsbHMgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGVuY29kZWRLZXkgPSBhbGxvd0RvdHMgJiYgZW5jb2RlRG90SW5LZXlzID8gU3RyaW5nKGtleSkucmVwbGFjZSgvXFwuL2csICclMkUnKSA6IFN0cmluZyhrZXkpO1xuICAgICAgICB2YXIga2V5UHJlZml4ID0gaXNBcnJheShvYmopXG4gICAgICAgICAgICA/IHR5cGVvZiBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnZnVuY3Rpb24nID8gZ2VuZXJhdGVBcnJheVByZWZpeChhZGp1c3RlZFByZWZpeCwgZW5jb2RlZEtleSkgOiBhZGp1c3RlZFByZWZpeFxuICAgICAgICAgICAgOiBhZGp1c3RlZFByZWZpeCArIChhbGxvd0RvdHMgPyAnLicgKyBlbmNvZGVkS2V5IDogJ1snICsgZW5jb2RlZEtleSArICddJyk7XG5cbiAgICAgICAgc2lkZUNoYW5uZWwuc2V0KG9iamVjdCwgc3RlcCk7XG4gICAgICAgIHZhciB2YWx1ZVNpZGVDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWwoKTtcbiAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbC5zZXQoc2VudGluZWwsIHNpZGVDaGFubmVsKTtcbiAgICAgICAgcHVzaFRvQXJyYXkodmFsdWVzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleVByZWZpeCxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBjb21tYVJvdW5kVHJpcCxcbiAgICAgICAgICAgIGFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICBlbmNvZGVEb3RJbktleXMsXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGVuY29kZVZhbHVlc09ubHkgJiYgaXNBcnJheShvYmopID8gbnVsbCA6IGVuY29kZXIsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBjaGFyc2V0LFxuICAgICAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxudmFyIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGFsbG93RW1wdHlBcnJheXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmVuY29kZURvdEluS2V5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BlbmNvZGVEb3RJbktleXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gb3B0cy5jaGFyc2V0IHx8IGRlZmF1bHRzLmNoYXJzZXQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKCFoYXMuY2FsbChmb3JtYXRzLmZvcm1hdHRlcnMsIG9wdHMuZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1hdCA9IG9wdHMuZm9ybWF0O1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cbiAgICB2YXIgZmlsdGVyID0gZGVmYXVsdHMuZmlsdGVyO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgaXNBcnJheShvcHRzLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5Rm9ybWF0O1xuICAgIGlmIChvcHRzLmFycmF5Rm9ybWF0IGluIGFycmF5UHJlZml4R2VuZXJhdG9ycykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuYXJyYXlGb3JtYXQ7XG4gICAgfSBlbHNlIGlmICgnaW5kaWNlcycgaW4gb3B0cykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuaW5kaWNlcyA/ICdpbmRpY2VzJyA6ICdyZXBlYXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gZGVmYXVsdHMuYXJyYXlGb3JtYXQ7XG4gICAgfVxuXG4gICAgaWYgKCdjb21tYVJvdW5kVHJpcCcgaW4gb3B0cyAmJiB0eXBlb2Ygb3B0cy5jb21tYVJvdW5kVHJpcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bjb21tYVJvdW5kVHJpcGAgbXVzdCBiZSBhIGJvb2xlYW4sIG9yIGFic2VudCcpO1xuICAgIH1cblxuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gb3B0cy5lbmNvZGVEb3RJbktleXMgPT09IHRydWUgPyB0cnVlIDogZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cztcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFkZFF1ZXJ5UHJlZml4OiB0eXBlb2Ygb3B0cy5hZGRRdWVyeVByZWZpeCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hZGRRdWVyeVByZWZpeCA6IGRlZmF1bHRzLmFkZFF1ZXJ5UHJlZml4LFxuICAgICAgICBhbGxvd0RvdHM6IGFsbG93RG90cyxcbiAgICAgICAgYWxsb3dFbXB0eUFycmF5czogdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLmFsbG93RW1wdHlBcnJheXMgOiBkZWZhdWx0cy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICBhcnJheUZvcm1hdDogYXJyYXlGb3JtYXQsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgY29tbWFSb3VuZFRyaXA6ICEhb3B0cy5jb21tYVJvdW5kVHJpcCxcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0cy5kZWxpbWl0ZXIsXG4gICAgICAgIGVuY29kZTogdHlwZW9mIG9wdHMuZW5jb2RlID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZSA6IGRlZmF1bHRzLmVuY29kZSxcbiAgICAgICAgZW5jb2RlRG90SW5LZXlzOiB0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlRG90SW5LZXlzIDogZGVmYXVsdHMuZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICBlbmNvZGVyOiB0eXBlb2Ygb3B0cy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcixcbiAgICAgICAgZW5jb2RlVmFsdWVzT25seTogdHlwZW9mIG9wdHMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgIGZvcm1hdDogZm9ybWF0LFxuICAgICAgICBmb3JtYXR0ZXI6IGZvcm1hdHRlcixcbiAgICAgICAgc2VyaWFsaXplRGF0ZTogdHlwZW9mIG9wdHMuc2VyaWFsaXplRGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuc2VyaWFsaXplRGF0ZSA6IGRlZmF1bHRzLnNlcmlhbGl6ZURhdGUsXG4gICAgICAgIHNraXBOdWxsczogdHlwZW9mIG9wdHMuc2tpcE51bGxzID09PSAnYm9vbGVhbicgPyBvcHRzLnNraXBOdWxscyA6IGRlZmF1bHRzLnNraXBOdWxscyxcbiAgICAgICAgc29ydDogdHlwZW9mIG9wdHMuc29ydCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuc29ydCA6IG51bGwsXG4gICAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZ1xuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdHMpIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKTtcblxuICAgIHZhciBvYmpLZXlzO1xuICAgIHZhciBmaWx0ZXI7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmogPSBmaWx0ZXIoJycsIG9iaik7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KG9wdGlvbnMuZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlQXJyYXlQcmVmaXggPSBhcnJheVByZWZpeEdlbmVyYXRvcnNbb3B0aW9ucy5hcnJheUZvcm1hdF07XG4gICAgdmFyIGNvbW1hUm91bmRUcmlwID0gZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBvcHRpb25zLmNvbW1hUm91bmRUcmlwO1xuXG4gICAgaWYgKCFvYmpLZXlzKSB7XG4gICAgICAgIG9iaktleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gICAgfVxuXG4gICAgdmFyIHNpZGVDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWwoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iaktleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbaV07XG4gICAgICAgIHZhciB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNraXBOdWxscyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaFRvQXJyYXkoa2V5cywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgICAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2tpcE51bGxzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGVEb3RJbktleXMsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZSA/IG9wdGlvbnMuZW5jb2RlciA6IG51bGwsXG4gICAgICAgICAgICBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuc29ydCxcbiAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dEb3RzLFxuICAgICAgICAgICAgb3B0aW9ucy5zZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXQsXG4gICAgICAgICAgICBvcHRpb25zLmZvcm1hdHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgIG9wdGlvbnMuY2hhcnNldCxcbiAgICAgICAgICAgIHNpZGVDaGFubmVsXG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIHZhciBqb2luZWQgPSBrZXlzLmpvaW4ob3B0aW9ucy5kZWxpbWl0ZXIpO1xuICAgIHZhciBwcmVmaXggPSBvcHRpb25zLmFkZFF1ZXJ5UHJlZml4ID09PSB0cnVlID8gJz8nIDogJyc7XG5cbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJyYjMTAwMDM7JyksIHRoZSBcIm51bWVyaWMgZW50aXR5XCIgcmVwcmVzZW50YXRpb24gb2YgYSBjaGVja21hcmtcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lMjYlMjMxMDAwMyUzQiYnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCdcdTI3MTMnKVxuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSVFMiU5QyU5MyYnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW5lZC5sZW5ndGggPiAwID8gcHJlZml4ICsgam9pbmVkIDogJyc7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxudmFyIGRlZmF1bHRzID0ge1xuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgYWxsb3dFbXB0eUFycmF5czogZmFsc2UsXG4gICAgYWxsb3dQcm90b3R5cGVzOiBmYWxzZSxcbiAgICBhbGxvd1NwYXJzZTogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGNvbW1hOiBmYWxzZSxcbiAgICBkZWNvZGVEb3RJbktleXM6IGZhbHNlLFxuICAgIGRlY29kZXI6IHV0aWxzLmRlY29kZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBkZXB0aDogNSxcbiAgICBkdXBsaWNhdGVzOiAnY29tYmluZScsXG4gICAgaWdub3JlUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogZmFsc2UsXG4gICAgcGFyYW1ldGVyTGltaXQ6IDEwMDAsXG4gICAgcGFyc2VBcnJheXM6IHRydWUsXG4gICAgcGxhaW5PYmplY3RzOiBmYWxzZSxcbiAgICBzdHJpY3REZXB0aDogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZSxcbiAgICB0aHJvd09uTGltaXRFeGNlZWRlZDogZmFsc2Vcbn07XG5cbnZhciBpbnRlcnByZXROdW1lcmljRW50aXRpZXMgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mIyhcXGQrKTsvZywgZnVuY3Rpb24gKCQwLCBudW1iZXJTdHIpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobnVtYmVyU3RyLCAxMCkpO1xuICAgIH0pO1xufTtcblxudmFyIHBhcnNlQXJyYXlWYWx1ZSA9IGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMsIGN1cnJlbnRBcnJheUxlbmd0aCkge1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5jb21tYSAmJiB2YWwuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnRocm93T25MaW1pdEV4Y2VlZGVkICYmIGN1cnJlbnRBcnJheUxlbmd0aCA+PSBvcHRpb25zLmFycmF5TGltaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0FycmF5IGxpbWl0IGV4Y2VlZGVkLiBPbmx5ICcgKyBvcHRpb25zLmFycmF5TGltaXQgKyAnIGVsZW1lbnQnICsgKG9wdGlvbnMuYXJyYXlMaW1pdCA9PT0gMSA/ICcnIDogJ3MnKSArICcgYWxsb3dlZCBpbiBhbiBhcnJheS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gVGhpcyBpcyB3aGF0IGJyb3dzZXJzIHdpbGwgc3VibWl0IHdoZW4gdGhlIFx1MjcxMyBjaGFyYWN0ZXIgb2NjdXJzIGluIGFuXG4vLyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSBhbmQgdGhlIGVuY29kaW5nIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmdcbi8vIHRoZSBmb3JtIGlzIGlzby04ODU5LTEsIG9yIHdoZW4gdGhlIHN1Ym1pdHRlZCBmb3JtIGhhcyBhbiBhY2NlcHQtY2hhcnNldFxuLy8gYXR0cmlidXRlIG9mIGlzby04ODU5LTEuIFByZXN1bWFibHkgYWxzbyB3aXRoIG90aGVyIGNoYXJzZXRzIHRoYXQgZG8gbm90IGNvbnRhaW5cbi8vIHRoZSBcdTI3MTMgY2hhcmFjdGVyLCBzdWNoIGFzIHVzLWFzY2lpLlxudmFyIGlzb1NlbnRpbmVsID0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0InOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJyYjMTAwMDM7JylcblxuLy8gVGhlc2UgYXJlIHRoZSBwZXJjZW50LWVuY29kZWQgdXRmLTggb2N0ZXRzIHJlcHJlc2VudGluZyBhIGNoZWNrbWFyaywgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGlzIHV0Zi04IGVuY29kZWQuXG52YXIgY2hhcnNldFNlbnRpbmVsID0gJ3V0Zjg9JUUyJTlDJTkzJzsgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCdcdTI3MTMnKVxuXG52YXIgcGFyc2VWYWx1ZXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nVmFsdWVzKHN0ciwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgdmFyIGNsZWFuU3RyID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA/IHN0ci5yZXBsYWNlKC9eXFw/LywgJycpIDogc3RyO1xuICAgIGNsZWFuU3RyID0gY2xlYW5TdHIucmVwbGFjZSgvJTVCL2dpLCAnWycpLnJlcGxhY2UoLyU1RC9naSwgJ10nKTtcblxuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChcbiAgICAgICAgb3B0aW9ucy5kZWxpbWl0ZXIsXG4gICAgICAgIG9wdGlvbnMudGhyb3dPbkxpbWl0RXhjZWVkZWQgPyBsaW1pdCArIDEgOiBsaW1pdFxuICAgICk7XG5cbiAgICBpZiAob3B0aW9ucy50aHJvd09uTGltaXRFeGNlZWRlZCAmJiBwYXJ0cy5sZW5ndGggPiBsaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignUGFyYW1ldGVyIGxpbWl0IGV4Y2VlZGVkLiBPbmx5ICcgKyBsaW1pdCArICcgcGFyYW1ldGVyJyArIChsaW1pdCA9PT0gMSA/ICcnIDogJ3MnKSArICcgYWxsb3dlZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgc2tpcEluZGV4ID0gLTE7IC8vIEtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhlIHV0Zjggc2VudGluZWwgd2FzIGZvdW5kXG4gICAgdmFyIGk7XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdGlvbnMuY2hhcnNldDtcbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocGFydHNbaV0uaW5kZXhPZigndXRmOD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1tpXSA9PT0gY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAndXRmLTgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydHNbaV0gPT09IGlzb1NlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnaXNvLTg4NTktMSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXBJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgaSA9IHBhcnRzLmxlbmd0aDsgLy8gVGhlIGVzbGludCBzZXR0aW5ncyBkbyBub3QgYWxsb3cgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGkgPT09IHNraXBJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5O1xuICAgICAgICB2YXIgdmFsO1xuICAgICAgICBpZiAocG9zID09PSAtMSkge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICdrZXknKTtcbiAgICAgICAgICAgIHZhbCA9IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID8gbnVsbCA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UoMCwgcG9zKSwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ2tleScpO1xuXG4gICAgICAgICAgICB2YWwgPSB1dGlscy5tYXliZU1hcChcbiAgICAgICAgICAgICAgICBwYXJzZUFycmF5VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHBhcnQuc2xpY2UocG9zICsgMSksXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGlzQXJyYXkob2JqW2tleV0pID8gb2JqW2tleV0ubGVuZ3RoIDogMFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVuY29kZWRWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZGVjb2RlcihlbmNvZGVkVmFsLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAndmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmludGVycHJldE51bWVyaWNFbnRpdGllcyAmJiBjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIHZhbCA9IGludGVycHJldE51bWVyaWNFbnRpdGllcyhTdHJpbmcodmFsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydC5pbmRleE9mKCdbXT0nKSA+IC0xKSB7XG4gICAgICAgICAgICB2YWwgPSBpc0FycmF5KHZhbCkgPyBbdmFsXSA6IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleGlzdGluZyA9IGhhcy5jYWxsKG9iaiwga2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICYmIG9wdGlvbnMuZHVwbGljYXRlcyA9PT0gJ2NvbWJpbmUnKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nIHx8IG9wdGlvbnMuZHVwbGljYXRlcyA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgdmFyIGN1cnJlbnRBcnJheUxlbmd0aCA9IDA7XG4gICAgaWYgKGNoYWluLmxlbmd0aCA+IDAgJiYgY2hhaW5bY2hhaW4ubGVuZ3RoIC0gMV0gPT09ICdbXScpIHtcbiAgICAgICAgdmFyIHBhcmVudEtleSA9IGNoYWluLnNsaWNlKDAsIC0xKS5qb2luKCcnKTtcbiAgICAgICAgY3VycmVudEFycmF5TGVuZ3RoID0gQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbFtwYXJlbnRLZXldID8gdmFsW3BhcmVudEtleV0ubGVuZ3RoIDogMDtcbiAgICB9XG5cbiAgICB2YXIgbGVhZiA9IHZhbHVlc1BhcnNlZCA/IHZhbCA6IHBhcnNlQXJyYXlWYWx1ZSh2YWwsIG9wdGlvbnMsIGN1cnJlbnRBcnJheUxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIG9iajtcbiAgICAgICAgdmFyIHJvb3QgPSBjaGFpbltpXTtcblxuICAgICAgICBpZiAocm9vdCA9PT0gJ1tdJyAmJiBvcHRpb25zLnBhcnNlQXJyYXlzKSB7XG4gICAgICAgICAgICBvYmogPSBvcHRpb25zLmFsbG93RW1wdHlBcnJheXMgJiYgKGxlYWYgPT09ICcnIHx8IChvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyAmJiBsZWFmID09PSBudWxsKSlcbiAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgOiB1dGlscy5jb21iaW5lKFtdLCBsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8geyBfX3Byb3RvX186IG51bGwgfSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGRlY29kZWRSb290ID0gb3B0aW9ucy5kZWNvZGVEb3RJbktleXMgPyBjbGVhblJvb3QucmVwbGFjZSgvJTJFL2csICcuJykgOiBjbGVhblJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChkZWNvZGVkUm9vdCwgMTApO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBhcnNlQXJyYXlzICYmIGRlY29kZWRSb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gZGVjb2RlZFJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBkZWNvZGVkUm9vdFxuICAgICAgICAgICAgICAgICYmIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICAmJiAob3B0aW9ucy5wYXJzZUFycmF5cyAmJiBpbmRleCA8PSBvcHRpb25zLmFycmF5TGltaXQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvYmogPSBbXTtcbiAgICAgICAgICAgICAgICBvYmpbaW5kZXhdID0gbGVhZjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlZFJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2RlY29kZWRSb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCkge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBvcHRpb25zLmRlcHRoID4gMCAmJiBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAob3B0aW9ucy5kZXB0aCA+IDAgJiYgKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGNoZWNrIHN0cmljdERlcHRoIG9wdGlvbiBmb3IgdGhyb3csIGVsc2UganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0RGVwdGggPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnB1dCBkZXB0aCBleGNlZWRlZCBkZXB0aCBvcHRpb24gb2YgJyArIG9wdGlvbnMuZGVwdGggKyAnIGFuZCBzdHJpY3REZXB0aCBpcyB0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKTtcbn07XG5cbnZhciBub3JtYWxpemVQYXJzZU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVQYXJzZU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgYWxsb3dFbXB0eUFycmF5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGRlY29kZURvdEluS2V5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVjb2RlciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0RlY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMudGhyb3dPbkxpbWl0RXhjZWVkZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgdGhyb3dPbkxpbWl0RXhjZWVkZWRgIG9wdGlvbiBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gdHlwZW9mIG9wdHMuY2hhcnNldCA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5jaGFyc2V0IDogb3B0cy5jaGFyc2V0O1xuXG4gICAgdmFyIGR1cGxpY2F0ZXMgPSB0eXBlb2Ygb3B0cy5kdXBsaWNhdGVzID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmR1cGxpY2F0ZXMgOiBvcHRzLmR1cGxpY2F0ZXM7XG5cbiAgICBpZiAoZHVwbGljYXRlcyAhPT0gJ2NvbWJpbmUnICYmIGR1cGxpY2F0ZXMgIT09ICdmaXJzdCcgJiYgZHVwbGljYXRlcyAhPT0gJ2xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBkdXBsaWNhdGVzIG9wdGlvbiBtdXN0IGJlIGVpdGhlciBjb21iaW5lLCBmaXJzdCwgb3IgbGFzdCcpO1xuICAgIH1cblxuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gb3B0cy5kZWNvZGVEb3RJbktleXMgPT09IHRydWUgPyB0cnVlIDogZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cztcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93RG90czogYWxsb3dEb3RzLFxuICAgICAgICBhbGxvd0VtcHR5QXJyYXlzOiB0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzID09PSAnYm9vbGVhbicgPyAhIW9wdHMuYWxsb3dFbXB0eUFycmF5cyA6IGRlZmF1bHRzLmFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgIGFsbG93UHJvdG90eXBlczogdHlwZW9mIG9wdHMuYWxsb3dQcm90b3R5cGVzID09PSAnYm9vbGVhbicgPyBvcHRzLmFsbG93UHJvdG90eXBlcyA6IGRlZmF1bHRzLmFsbG93UHJvdG90eXBlcyxcbiAgICAgICAgYWxsb3dTcGFyc2U6IHR5cGVvZiBvcHRzLmFsbG93U3BhcnNlID09PSAnYm9vbGVhbicgPyBvcHRzLmFsbG93U3BhcnNlIDogZGVmYXVsdHMuYWxsb3dTcGFyc2UsXG4gICAgICAgIGFycmF5TGltaXQ6IHR5cGVvZiBvcHRzLmFycmF5TGltaXQgPT09ICdudW1iZXInID8gb3B0cy5hcnJheUxpbWl0IDogZGVmYXVsdHMuYXJyYXlMaW1pdCxcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgY2hhcnNldFNlbnRpbmVsOiB0eXBlb2Ygb3B0cy5jaGFyc2V0U2VudGluZWwgPT09ICdib29sZWFuJyA/IG9wdHMuY2hhcnNldFNlbnRpbmVsIDogZGVmYXVsdHMuY2hhcnNldFNlbnRpbmVsLFxuICAgICAgICBjb21tYTogdHlwZW9mIG9wdHMuY29tbWEgPT09ICdib29sZWFuJyA/IG9wdHMuY29tbWEgOiBkZWZhdWx0cy5jb21tYSxcbiAgICAgICAgZGVjb2RlRG90SW5LZXlzOiB0eXBlb2Ygb3B0cy5kZWNvZGVEb3RJbktleXMgPT09ICdib29sZWFuJyA/IG9wdHMuZGVjb2RlRG90SW5LZXlzIDogZGVmYXVsdHMuZGVjb2RlRG90SW5LZXlzLFxuICAgICAgICBkZWNvZGVyOiB0eXBlb2Ygb3B0cy5kZWNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5kZWNvZGVyIDogZGVmYXVsdHMuZGVjb2RlcixcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICdzdHJpbmcnIHx8IHV0aWxzLmlzUmVnRXhwKG9wdHMuZGVsaW1pdGVyKSA/IG9wdHMuZGVsaW1pdGVyIDogZGVmYXVsdHMuZGVsaW1pdGVyLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb24sIG5vLWV4dHJhLXBhcmVuc1xuICAgICAgICBkZXB0aDogKHR5cGVvZiBvcHRzLmRlcHRoID09PSAnbnVtYmVyJyB8fCBvcHRzLmRlcHRoID09PSBmYWxzZSkgPyArb3B0cy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoLFxuICAgICAgICBkdXBsaWNhdGVzOiBkdXBsaWNhdGVzLFxuICAgICAgICBpZ25vcmVRdWVyeVByZWZpeDogb3B0cy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZSxcbiAgICAgICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiB0eXBlb2Ygb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgPT09ICdib29sZWFuJyA/IG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzIDogZGVmYXVsdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzLFxuICAgICAgICBwYXJhbWV0ZXJMaW1pdDogdHlwZW9mIG9wdHMucGFyYW1ldGVyTGltaXQgPT09ICdudW1iZXInID8gb3B0cy5wYXJhbWV0ZXJMaW1pdCA6IGRlZmF1bHRzLnBhcmFtZXRlckxpbWl0LFxuICAgICAgICBwYXJzZUFycmF5czogb3B0cy5wYXJzZUFycmF5cyAhPT0gZmFsc2UsXG4gICAgICAgIHBsYWluT2JqZWN0czogdHlwZW9mIG9wdHMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRzLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cyxcbiAgICAgICAgc3RyaWN0RGVwdGg6IHR5cGVvZiBvcHRzLnN0cmljdERlcHRoID09PSAnYm9vbGVhbicgPyAhIW9wdHMuc3RyaWN0RGVwdGggOiBkZWZhdWx0cy5zdHJpY3REZXB0aCxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICB0aHJvd09uTGltaXRFeGNlZWRlZDogdHlwZW9mIG9wdHMudGhyb3dPbkxpbWl0RXhjZWVkZWQgPT09ICdib29sZWFuJyA/IG9wdHMudGhyb3dPbkxpbWl0RXhjZWVkZWQgOiBmYWxzZVxuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKTtcblxuICAgIGlmIChzdHIgPT09ICcnIHx8IHN0ciA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyB7IF9fcHJvdG9fXzogbnVsbCB9IDoge307XG4gICAgfVxuXG4gICAgdmFyIHRlbXBPYmogPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHBhcnNlVmFsdWVzKHN0ciwgb3B0aW9ucykgOiBzdHI7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8geyBfX3Byb3RvX186IG51bGwgfSA6IHt9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBrZXlzIGFuZCBzZXR1cCB0aGUgbmV3IG9iamVjdFxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0ZW1wT2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBuZXdPYmogPSBwYXJzZUtleXMoa2V5LCB0ZW1wT2JqW2tleV0sIG9wdGlvbnMsIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKTtcbiAgICAgICAgb2JqID0gdXRpbHMubWVyZ2Uob2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFsbG93U3BhcnNlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLmNvbXBhY3Qob2JqKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZvcm1hdHM6IGZvcm1hdHMsXG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4yLjAnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogbnVsbFxufTtcblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0ge1xuICBjdXJyZW50OiBudWxsLFxuICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLlxuICBpc0JhdGNoaW5nTGVnYWN5OiBmYWxzZSxcbiAgZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGU6IGZhbHNlXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0ge307XG52YXIgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IG51bGw7XG5mdW5jdGlvbiBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spIHtcbiAge1xuICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgfVxufVxuXG57XG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lID0gZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAge1xuICAgICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICAgIH1cbiAgfTsgLy8gU3RhY2sgaW1wbGVtZW50YXRpb24gaW5qZWN0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIuXG5cblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9ICcnOyAvLyBBZGQgYW4gZXh0cmEgdG9wIGZyYW1lIHdoaWxlIGFuIGVsZW1lbnQgaXMgYmVpbmcgdmFsaWRhdGVkXG5cbiAgICBpZiAoY3VycmVudEV4dHJhU3RhY2tGcmFtZSkge1xuICAgICAgc3RhY2sgKz0gY3VycmVudEV4dHJhU3RhY2tGcmFtZTtcbiAgICB9IC8vIERlbGVnYXRlIHRvIHRoZSBpbmplY3RlZCByZW5kZXJlci1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuXG5cbiAgICB2YXIgaW1wbCA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrO1xuXG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHN0YWNrICs9IGltcGwoKSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArIFwiLlwiICsgY2FsbGVyTmFtZTtcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlcnJvcihcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFwiICsgJ1RoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uICcgKyAnSW5zdGVhZCwgYXNzaWduIHRvIGB0aGlzLnN0YXRlYCBkaXJlY3RseSBvciBkZWZpbmUgYSBgc3RhdGUgPSB7fTtgICcgKyAnY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xuXG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnZnVuY3Rpb24nICYmIHBhcnRpYWxTdGF0ZSAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhICcgKyAnZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpO1xuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbmFzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG5cbiAgICAgIHtcbiAgICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIik7XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICB7XG4gICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKGlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgYGlmYCBzdGF0ZW1lbnQgaGVyZSBwcmV2ZW50cyBhdXRvLWRpc2FibGluZyBvZiB0aGUgc2FmZVxuICAgICAgICAgIC8vIGNvZXJjaW9uIEVTTGludCBydWxlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGRpc2FibGUgaXQgYmVsb3cuXG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgICAgaWYgKG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1hcHBlZENoaWxkLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBlc2NhcGVkUHJlZml4ICsgKCAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgbWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIGV4aXN0aW5nIGVsZW1lbnQncyBrZXkgY2FuIGJlIGEgbnVtYmVyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFRPRE86IFNlY29uZCBhcmd1bWVudCB1c2VkIHRvIGJlIGFuIG9wdGlvbmFsIGBjYWxjdWxhdGVDaGFuZ2VkQml0c2BcbiAgLy8gZnVuY3Rpb24uIFdhcm4gdG8gcmVzZXJ2ZSBmb3IgZnV0dXJlIHVzZT9cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsLFxuICAgIC8vIEFkZCB0aGVzZSB0byB1c2Ugc2FtZSBoaWRkZW4gY2xhc3MgaW4gVk0gYXMgU2VydmVyQ29udGV4dFxuICAgIF9kZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgX2dsb2JhbE5hbWU6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0XG4gICAgfTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbm90IHNldHRpbmcgYSB2YWx1ZSwgd2hpY2ggaXMgaW50ZW50aW9uYWwgaGVyZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Qcm92aWRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7XG4gICAgICAgICAgY29udGV4dC5Qcm92aWRlciA9IF9Qcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlMjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlMjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZTIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdGhyZWFkQ291bnQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3RocmVhZENvdW50O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll90aHJlYWRDb3VudCA9IF90aHJlYWRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENvbnN1bWVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Db25zdW1lcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Db25zdW1lcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlOYW1lOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpc3BsYXlOYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIpIHtcbiAgICAgICAgICAgIHdhcm4oJ1NldHRpbmcgYGRpc3BsYXlOYW1lYCBvbiBDb250ZXh0LkNvbnN1bWVyIGhhcyBubyBlZmZlY3QuICcgKyBcIllvdSBzaG91bGQgc2V0IGl0IGRpcmVjdGx5IG9uIHRoZSBjb250ZXh0IHdpdGggQ29udGV4dC5kaXNwbGF5TmFtZSA9ICclcycuXCIsIGRpc3BsYXlOYW1lKTtcblxuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgZGVmaW5lUHJvcGVydHlcblxuICAgIGNvbnRleHQuQ29uc3VtZXIgPSBDb25zdW1lcjtcbiAgfVxuXG4gIHtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbnZhciBVbmluaXRpYWxpemVkID0gLTE7XG52YXIgUGVuZGluZyA9IDA7XG52YXIgUmVzb2x2ZWQgPSAxO1xudmFyIFJlamVjdGVkID0gMjtcblxuZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAvLyBUaGlzIG1pZ2h0IHRocm93IGVpdGhlciBiZWNhdXNlIGl0J3MgbWlzc2luZyBvciB0aHJvd3MuIElmIHNvLCB3ZSB0cmVhdCBpdFxuICAgIC8vIGFzIHN0aWxsIHVuaW5pdGlhbGl6ZWQgYW5kIHRyeSBhZ2FpbiBuZXh0IHRpbWUuIFdoaWNoIGlzIHRoZSBzYW1lIGFzIHdoYXRcbiAgICAvLyBoYXBwZW5zIGlmIHRoZSBjdG9yIG9yIGFueSB3cmFwcGVycyBwcm9jZXNzaW5nIHRoZSBjdG9yIHRocm93cy4gVGhpcyBtaWdodFxuICAgIC8vIGVuZCB1cCBmaXhpbmcgaXQgaWYgdGhlIHJlc29sdXRpb24gd2FzIGEgY29uY3VycmVuY3kgYnVnLlxuXG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIEluIGNhc2UsIHdlJ3JlIHN0aWxsIHVuaW5pdGlhbGl6ZWQsIHRoZW4gd2UncmUgd2FpdGluZyBmb3IgdGhlIHRoZW5hYmxlXG4gICAgICAvLyB0byByZXNvbHZlLiBTZXQgaXQgYXMgcGVuZGluZyBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgICBwZW5kaW5nLl9zdGF0dXMgPSBQZW5kaW5nO1xuICAgICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQpIHtcbiAgICB2YXIgbW9kdWxlT2JqZWN0ID0gcGF5bG9hZC5fcmVzdWx0O1xuXG4gICAge1xuICAgICAgaWYgKG1vZHVsZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5cIiArICdEaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0PycsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKCEoJ2RlZmF1bHQnIGluIG1vZHVsZU9iamVjdCkpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVPYmplY3QuZGVmYXVsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiBVbmluaXRpYWxpemVkLFxuICAgIF9yZXN1bHQ6IGN0b3JcbiAgfTtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX3BheWxvYWQ6IHBheWxvYWQsXG4gICAgX2luaXQ6IGxhenlJbml0aWFsaXplclxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICB2YXIgcHJvcFR5cGVzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5VHlwZSwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3RGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCAnICsgJ2NvbXBvbmVudC4gSW5zdGVhZCBvZiBmb3J3YXJkUmVmKG1lbW8oLi4uKSksIHVzZSAnICsgJ21lbW8oZm9yd2FyZFJlZiguLi4pKS4nKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuJywgcmVuZGVyID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBhY2NlcHQgZXhhY3RseSB0d28gcGFyYW1ldGVyczogcHJvcHMgYW5kIHJlZi4gJXMnLCByZW5kZXIubGVuZ3RoID09PSAxID8gJ0RpZCB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgcmVmIHBhcmFtZXRlcj8nIDogJ0FueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZW5kZXIuZGVmYXVsdFByb3BzICE9IG51bGwgfHwgcmVuZGVyLnByb3BUeXBlcyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgcHJvcFR5cGVzIG9yIGRlZmF1bHRQcm9wcy4gJyArICdEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIGEgUmVhY3QgY29tcG9uZW50PycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXJlbmRlci5uYW1lICYmICFyZW5kZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0Lm1lbW8oKHByb3BzKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCF0eXBlLm5hbWUgJiYgIXR5cGUuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG5cbiAge1xuICAgIGlmIChkaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xuICAgIH1cbiAgfSAvLyBXaWxsIHJlc3VsdCBpbiBhIG51bGwgYWNjZXNzIGVycm9yIGlmIGFjY2Vzc2VkIG91dHNpZGUgcmVuZGVyIHBoYXNlLiBXZVxuICAvLyBpbnRlbnRpb25hbGx5IGRvbid0IHRocm93IG91ciBvd24gZXJyb3IgYmVjYXVzZSB0aGlzIGlzIGluIGEgaG90IHBhdGguXG4gIC8vIEFsc28gaGVscHMgZW5zdXJlIHRoaXMgaXMgaW5saW5lZC5cblxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7IC8vIERvbid0IGRlZHVwbGljYXRlIGJlY2F1c2UgdGhpcyBsZWdpdGltYXRlbHkgY2F1c2VzIGJ1Z3NcbiAgICAgIC8vIGFuZCBub2JvZHkgc2hvdWxkIGJlIHVzaW5nIHRoaXMgaW4gZXhpc3RpbmcgY29kZS5cblxuICAgICAgaWYgKHJlYWxDb250ZXh0LkNvbnN1bWVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlYWxDb250ZXh0LlByb3ZpZGVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVRyYW5zaXRpb24oKTtcbn1cbmZ1bmN0aW9uIHVzZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUlkKCk7XG59XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbn1cblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzLl9fc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTtcblxuICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNjb3BlLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2NvcGUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gZmFsc2U7XG52YXIgZW5xdWV1ZVRhc2tJbXBsID0gbnVsbDtcbmZ1bmN0aW9uIGVucXVldWVUYXNrKHRhc2spIHtcbiAgaWYgKGVucXVldWVUYXNrSW1wbCA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAvLyByZWFkIHJlcXVpcmUgb2ZmIHRoZSBtb2R1bGUgb2JqZWN0IHRvIGdldCBhcm91bmQgdGhlIGJ1bmRsZXJzLlxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGRldGVjdCBhIHJlcXVpcmUgYW5kIGJ1bmRsZSBhIE5vZGUgcG9seWZpbGwuXG4gICAgICB2YXIgcmVxdWlyZVN0cmluZyA9ICgncmVxdWlyZScgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgwLCA3KTtcbiAgICAgIHZhciBub2RlUmVxdWlyZSA9IG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ107IC8vIGFzc3VtaW5nIHdlJ3JlIGluIG5vZGUsIGxldCdzIHRyeSB0byBnZXQgbm9kZSdzXG4gICAgICAvLyB2ZXJzaW9uIG9mIHNldEltbWVkaWF0ZSwgYnlwYXNzaW5nIGZha2UgdGltZXJzIGlmIGFueS5cblxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gbm9kZVJlcXVpcmUuY2FsbChtb2R1bGUsICd0aW1lcnMnKS5zZXRJbW1lZGlhdGU7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gd2UncmUgaW4gYSBicm93c2VyXG4gICAgICAvLyB3ZSBjYW4ndCB1c2UgcmVndWxhciB0aW1lcnMgYmVjYXVzZSB0aGV5IG1heSBzdGlsbCBiZSBmYWtlZFxuICAgICAgLy8gc28gd2UgdHJ5IE1lc3NhZ2VDaGFubmVsK3Bvc3RNZXNzYWdlIGluc3RlYWRcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBlcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgJyArICdzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzICcgKyAnaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5xdWV1ZVRhc2tJbXBsKHRhc2spO1xufVxuXG52YXIgYWN0U2NvcGVEZXB0aCA9IDA7XG52YXIgZGlkV2Fybk5vQXdhaXRBY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGFjdChjYWxsYmFjaykge1xuICB7XG4gICAgLy8gYGFjdGAgY2FsbHMgY2FuIGJlIG5lc3RlZCwgc28gd2UgdHJhY2sgdGhlIGRlcHRoLiBUaGlzIHJlcHJlc2VudHMgdGhlXG4gICAgLy8gbnVtYmVyIG9mIGBhY3RgIHNjb3BlcyBvbiB0aGUgc3RhY2suXG4gICAgdmFyIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDtcbiAgICBhY3RTY29wZURlcHRoKys7XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb3V0ZXJtb3N0IGBhY3RgIHNjb3BlLiBJbml0aWFsaXplIHRoZSBxdWV1ZS4gVGhlIHJlY29uY2lsZXJcbiAgICAgIC8vIHdpbGwgZGV0ZWN0IHRoZSBxdWV1ZSBhbmQgdXNlIGl0IGluc3RlYWQgb2YgU2NoZWR1bGVyLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIHZhciBwcmV2SXNCYXRjaGluZ0xlZ2FjeSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3k7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLiBPbmx5XG4gICAgICAvLyBzZXQgdG8gYHRydWVgIHdoaWxlIHRoZSBnaXZlbiBjYWxsYmFjayBpcyBleGVjdXRlZCwgbm90IGZvciB1cGRhdGVzXG4gICAgICAvLyB0cmlnZ2VyZWQgZHVyaW5nIGFuIGFzeW5jIGV2ZW50LCBiZWNhdXNlIHRoaXMgaXMgaG93IHRoZSBsZWdhY3lcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIGBhY3RgIGJlaGF2ZWQuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJlcGxpY2F0ZSBiZWhhdmlvciBvZiBvcmlnaW5hbCBgYWN0YCBpbXBsZW1lbnRhdGlvbiBpbiBsZWdhY3kgbW9kZSxcbiAgICAgIC8vIHdoaWNoIGZsdXNoZWQgdXBkYXRlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2NvcGUgZnVuY3Rpb24gZXhpdHMsIGV2ZW5cbiAgICAgIC8vIGlmIGl0J3MgYW4gYXN5bmMgZnVuY3Rpb24uXG5cbiAgICAgIGlmICghcHJldklzQmF0Y2hpbmdMZWdhY3kgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gcHJldklzQmF0Y2hpbmdMZWdhY3k7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0aGVuYWJsZVJlc3VsdCA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIChpLmUuIHJldHVybmVkIGEgcHJvbWlzZSkuIFdhaXRcbiAgICAgIC8vIGZvciBpdCB0byByZXNvbHZlIGJlZm9yZSBleGl0aW5nIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICAgICB2YXIgd2FzQXdhaXRlZCA9IGZhbHNlO1xuICAgICAgdmFyIHRoZW5hYmxlID0ge1xuICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgd2FzQXdhaXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhlbmFibGVSZXN1bHQudGhlbihmdW5jdGlvbiAocmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBSZWN1cnNpdmVseSBmbHVzaCB0aGVcbiAgICAgICAgICAgICAgLy8gcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLlxuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAge1xuICAgICAgICBpZiAoIWRpZFdhcm5Ob0F3YWl0QWN0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF3YXNBd2FpdGVkKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBlcnJvcignWW91IGNhbGxlZCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aXRob3V0IGF3YWl0LiAnICsgJ1RoaXMgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIHRlc3RpbmcgYmVoYXZpb3VyLCAnICsgJ2ludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciAnICsgJ3Njb3Blcy4gJyArICdZb3Ugc2hvdWxkIC0gYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLik7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBub3QgYW4gYXN5bmMgZnVuY3Rpb24uIEV4aXQgdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5LCB3aXRob3V0IGF3YWl0aW5nLlxuXG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgIC8vIEV4aXRpbmcgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIEZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKF9xdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUoX3F1ZXVlKTtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSAvLyBSZXR1cm4gYSB0aGVuYWJsZS4gSWYgdGhlIHVzZXIgYXdhaXRzIGl0LCB3ZSdsbCBmbHVzaCBhZ2FpbiBpblxuICAgICAgICAvLyBjYXNlIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkIGJ5IGEgbWljcm90YXNrLlxuXG5cbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHdlIGhhdmVuJ3QgcmUtZW50ZXJlZCBhbm90aGVyIGBhY3RgIHNjb3BlLCBpbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkb2VzIHNvbWV0aGluZyB3ZWlyZCBsaWtlIGF3YWl0IHRoZSB0aGVuYWJsZVxuICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbHVzaCB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luY2Ugd2UncmUgaW5zaWRlIGEgbmVzdGVkIGBhY3RgIHNjb3BlLCB0aGUgcmV0dXJuZWQgdGhlbmFibGVcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZXMuIFRoZSBvdXRlciBzY29wZSB3aWxsIGZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF90aGVuYWJsZTIgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpIHtcbiAge1xuICAgIGlmIChwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEpIHtcbiAgICAgIGVycm9yKCdZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnQmUgc3VyZSB0byBhd2FpdCBwcmV2aW91cyBhY3QoKSBjYWxscyBiZWZvcmUgbWFraW5nIGEgbmV3IG9uZS4gJyk7XG4gICAgfVxuXG4gICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICB7XG4gICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZC4gRmluaXNoLlxuICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gS2VlcCBmbHVzaGluZyB3b3JrIHVudGlsIHRoZXJlJ3Mgbm9uZSBsZWZ0LlxuICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0ZsdXNoaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQWN0UXVldWUocXVldWUpIHtcbiAge1xuICAgIGlmICghaXNGbHVzaGluZykge1xuICAgICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICAgIHF1ZXVlID0gcXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5leHBvcnRzLlN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuY3JlYXRlUmVmID0gY3JlYXRlUmVmO1xuZXhwb3J0cy5mb3J3YXJkUmVmID0gZm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDtcbmV4cG9ydHMubGF6eSA9IGxhenk7XG5leHBvcnRzLm1lbW8gPSBtZW1vO1xuZXhwb3J0cy5zdGFydFRyYW5zaXRpb24gPSBzdGFydFRyYW5zaXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2FjdCA9IGFjdDtcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlID0gdXNlRGVmZXJyZWRWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJZCA9IHVzZUlkO1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0O1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuZXhwb3J0cy51c2VUcmFuc2l0aW9uID0gdXNlVHJhbnNpdGlvbjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcbnZhciBmcmFtZVlpZWxkTXMgPSA1O1xuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICByZXR1cm4gaGVhcC5sZW5ndGggPT09IDAgPyBudWxsIDogaGVhcFswXTtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIGlmIChoZWFwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcbiAgdmFyIGxhc3QgPSBoZWFwLnBvcCgpO1xuXG4gIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgIHNpZnREb3duKGhlYXAsIGxhc3QsIDApO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5mdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuXG4gIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcbiAgdmFyIGhhbGZMZW5ndGggPSBsZW5ndGggPj4+IDE7XG5cbiAgd2hpbGUgKGluZGV4IDwgaGFsZkxlbmd0aCkge1xuICAgIHZhciBsZWZ0SW5kZXggPSAoaW5kZXggKyAxKSAqIDIgLSAxO1xuICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdO1xuICAgIHZhciByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICB2YXIgcmlnaHQgPSBoZWFwW3JpZ2h0SW5kZXhdOyAvLyBJZiB0aGUgbGVmdCBvciByaWdodCBub2RlIGlzIHNtYWxsZXIsIHN3YXAgd2l0aCB0aGUgc21hbGxlciBvZiB0aG9zZS5cblxuICAgIGlmIChjb21wYXJlKGxlZnQsIG5vZGUpIDwgMCkge1xuICAgICAgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFwW2luZGV4XSA9IGxlZnQ7XG4gICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gbGVmdEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHtcbiAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBjaGlsZCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgLy8gQ29tcGFyZSBzb3J0IGluZGV4IGZpcnN0LCB0aGVuIHRhc2sgaWQuXG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG5mdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn0gLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxuXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jZS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uXG5cbnZhciBsb2NhbFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsQ2xlYXJUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxTZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyA/IHNldEltbWVkaWF0ZSA6IG51bGw7IC8vIElFIGFuZCBOb2RlLmpzICsganNkb21cblxudmFyIGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcgIT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZykgOiBudWxsO1xuXG5mdW5jdGlvbiBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKSB7XG4gIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLlxuICB2YXIgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gIHdoaWxlICh0aW1lciAhPT0gbnVsbCkge1xuICAgIGlmICh0aW1lci5jYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgICAgdGltZXIuc29ydEluZGV4ID0gdGltZXIuZXhwaXJhdGlvblRpbWU7XG4gICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1haW5pbmcgdGltZXJzIGFyZSBwZW5kaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7XG4gIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCkge1xuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuXG5cbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LlxuICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIGlmIChlbmFibGVQcm9maWxpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICAgIG1hcmtUYXNrRXJyb3JlZChjdXJyZW50VGFzaywgY3VycmVudFRpbWUpO1xuICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2F0Y2ggaW4gcHJvZCBjb2RlIHBhdGguXG4gICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VGFzayA9IG51bGw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGluaXRpYWxUaW1lO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG5cbiAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHtcbiAgICBpZiAoY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSAmJiAoIWhhc1RpbWVSZW1haW5pbmcgfHwgc2hvdWxkWWllbGRUb0hvc3QoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbnZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xudmFyIHRhc2tUaW1lb3V0SUQgPSAtMTsgLy8gU2NoZWR1bGVyIHBlcmlvZGljYWxseSB5aWVsZHMgaW4gY2FzZSB0aGVyZSBpcyBvdGhlciB3b3JrIG9uIHRoZSBtYWluXG4vLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4vLyBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGFsaWduIHdpdGggZnJhbWUgYm91bmRhcmllcywgc2luY2UgbW9zdCB0YXNrcyBkb24ndFxuLy8gbmVlZCB0byBiZSBmcmFtZSBhbGlnbmVkOyBmb3IgdGhvc2UgdGhhdCBkbywgdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cblxudmFyIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG52YXIgc3RhcnRUaW1lID0gLTE7XG5cbmZ1bmN0aW9uIHNob3VsZFlpZWxkVG9Ib3N0KCkge1xuICB2YXIgdGltZUVsYXBzZWQgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lO1xuXG4gIGlmICh0aW1lRWxhcHNlZCA8IGZyYW1lSW50ZXJ2YWwpIHtcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIG9ubHkgYmVlbiBibG9ja2VkIGZvciBhIHJlYWxseSBzaG9ydCBhbW91bnQgb2YgdGltZTtcbiAgICAvLyBzbWFsbGVyIHRoYW4gYSBzaW5nbGUgZnJhbWUuIERvbid0IHlpZWxkIHlldC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBiZWVuIGJsb2NrZWQgZm9yIGEgbm9uLW5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUuIFdlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFBhaW50KCkge1xuXG59XG5cbmZ1bmN0aW9uIGZvcmNlRnJhbWVSYXRlKGZwcykge1xuICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHtcbiAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICBjb25zb2xlWydlcnJvciddKCdmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgJyArICdmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmcHMgPiAwKSB7XG4gICAgZnJhbWVJbnRlcnZhbCA9IE1hdGguZmxvb3IoMTAwMCAvIGZwcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXQgdGhlIGZyYW1lcmF0ZVxuICAgIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG4gIH1cbn1cblxudmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHNjaGVkdWxlZEhvc3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIG1lYXN1cmUgaG93IGxvbmcgdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gaGFzIGJlZW4gYmxvY2tlZC5cblxuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHZhciBoYXNUaW1lUmVtYWluaW5nID0gdHJ1ZTsgLy8gSWYgYSBzY2hlZHVsZXIgdGFzayB0aHJvd3MsIGV4aXQgdGhlIGN1cnJlbnQgYnJvd3NlciB0YXNrIHNvIHRoZVxuICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC5cbiAgICAvL1xuICAgIC8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGEgdHJ5LWNhdGNoLCBzaW5jZSB0aGF0IG1ha2VzIHNvbWUgZGVidWdnaW5nXG4gICAgLy8gdGVjaG5pcXVlcyBoYXJkZXIuIEluc3RlYWQsIGlmIGBzY2hlZHVsZWRIb3N0Q2FsbGJhY2tgIGVycm9ycywgdGhlblxuICAgIC8vIGBoYXNNb3JlV29ya2Agd2lsbCByZW1haW4gdHJ1ZSwgYW5kIHdlJ2xsIGNvbnRpbnVlIHRoZSB3b3JrIGxvb3AuXG5cbiAgICB2YXIgaGFzTW9yZVdvcmsgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhc01vcmVXb3JrID0gc2NoZWR1bGVkSG9zdENhbGxiYWNrKGhhc1RpbWVSZW1haW5pbmcsIGN1cnJlbnRUaW1lKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGhhc01vcmVXb3JrKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB3b3JrLCBzY2hlZHVsZSB0aGUgbmV4dCBtZXNzYWdlIGV2ZW50IGF0IHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuXG4gICAgICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG59O1xuXG52YXIgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbmlmICh0eXBlb2YgbG9jYWxTZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gTm9kZS5qcyBhbmQgb2xkIElFLlxuICAvLyBUaGVyZSdzIGEgZmV3IHJlYXNvbnMgZm9yIHdoeSB3ZSBwcmVmZXIgc2V0SW1tZWRpYXRlLlxuICAvL1xuICAvLyBVbmxpa2UgTWVzc2FnZUNoYW5uZWwsIGl0IGRvZXNuJ3QgcHJldmVudCBhIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gIC8vIChFdmVuIHRob3VnaCB0aGlzIGlzIGEgRE9NIGZvcmsgb2YgdGhlIFNjaGVkdWxlciwgeW91IGNvdWxkIGdldCBoZXJlXG4gIC8vIHdpdGggYSBtaXggb2YgTm9kZS5qcyAxNSssIHdoaWNoIGhhcyBhIE1lc3NhZ2VDaGFubmVsLCBhbmQganNkb20uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwNzU2XG4gIC8vXG4gIC8vIEJ1dCBhbHNvLCBpdCBydW5zIGVhcmxpZXIgd2hpY2ggaXMgdGhlIHNlbWFudGljIHdlIHdhbnQuXG4gIC8vIElmIG90aGVyIGJyb3dzZXJzIGV2ZXIgaW1wbGVtZW50IGl0LCBpdCdzIGJldHRlciB0byB1c2UgaXQuXG4gIC8vIEFsdGhvdWdoIGJvdGggb2YgdGhlc2Ugd291bGQgYmUgaW5mZXJpb3IgdG8gbmF0aXZlIHNjaGVkdWxpbmcuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0SW1tZWRpYXRlKHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSk7XG4gIH07XG59IGVsc2UgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gRE9NIGFuZCBXb3JrZXIgZW52aXJvbm1lbnRzLlxuICAvLyBXZSBwcmVmZXIgTWVzc2FnZUNoYW5uZWwgYmVjYXVzZSBvZiB0aGUgNG1zIHNldFRpbWVvdXQgY2xhbXBpbmcuXG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIFdlIHNob3VsZCBvbmx5IGZhbGxiYWNrIGhlcmUgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldFRpbWVvdXQocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lLCAwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RDYWxsYmFjayhjYWxsYmFjaykge1xuICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSB0cnVlO1xuICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RUaW1lb3V0KGNhbGxiYWNrLCBtcykge1xuICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgfSwgbXMpO1xufVxuXG5mdW5jdGlvbiBjYW5jZWxIb3N0VGltZW91dCgpIHtcbiAgbG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7XG4gIHRhc2tUaW1lb3V0SUQgPSAtMTtcbn1cblxudmFyIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHJlcXVlc3RQYWludDtcbnZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDtcblxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gTG93UHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IHVuc3RhYmxlX1Byb2ZpbGluZztcbmV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmb3JjZUZyYW1lUmF0ZTtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dCA9IHVuc3RhYmxlX25leHQ7XG5leHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uID0gdW5zdGFibGVfcGF1c2VFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHVuc3RhYmxlX3JlcXVlc3RQYWludDtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBzaG91bGRZaWVsZFRvSG9zdDtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrID0gdW5zdGFibGVfd3JhcENhbGxiYWNrO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoJ3NjaGVkdWxlcicpO1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxudmFyIHN1cHByZXNzV2FybmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0U3VwcHJlc3NXYXJuaW5nKG5ld1N1cHByZXNzV2FybmluZykge1xuICB7XG4gICAgc3VwcHJlc3NXYXJuaW5nID0gbmV3U3VwcHJlc3NXYXJuaW5nO1xuICB9XG59IC8vIEluIERFViwgY2FsbHMgdG8gY29uc29sZS53YXJuIGFuZCBjb25zb2xlLmVycm9yIGdldCByZXBsYWNlZFxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgRnVuY3Rpb25Db21wb25lbnQgPSAwO1xudmFyIENsYXNzQ29tcG9uZW50ID0gMTtcbnZhciBJbmRldGVybWluYXRlQ29tcG9uZW50ID0gMjsgLy8gQmVmb3JlIHdlIGtub3cgd2hldGhlciBpdCBpcyBmdW5jdGlvbiBvciBjbGFzc1xuXG52YXIgSG9zdFJvb3QgPSAzOyAvLyBSb290IG9mIGEgaG9zdCB0cmVlLiBDb3VsZCBiZSBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgbm9kZS5cblxudmFyIEhvc3RQb3J0YWwgPSA0OyAvLyBBIHN1YnRyZWUuIENvdWxkIGJlIGFuIGVudHJ5IHBvaW50IHRvIGEgZGlmZmVyZW50IHJlbmRlcmVyLlxuXG52YXIgSG9zdENvbXBvbmVudCA9IDU7XG52YXIgSG9zdFRleHQgPSA2O1xudmFyIEZyYWdtZW50ID0gNztcbnZhciBNb2RlID0gODtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSA5O1xudmFyIENvbnRleHRQcm92aWRlciA9IDEwO1xudmFyIEZvcndhcmRSZWYgPSAxMTtcbnZhciBQcm9maWxlciA9IDEyO1xudmFyIFN1c3BlbnNlQ29tcG9uZW50ID0gMTM7XG52YXIgTWVtb0NvbXBvbmVudCA9IDE0O1xudmFyIFNpbXBsZU1lbW9Db21wb25lbnQgPSAxNTtcbnZhciBMYXp5Q29tcG9uZW50ID0gMTY7XG52YXIgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50ID0gMTc7XG52YXIgRGVoeWRyYXRlZEZyYWdtZW50ID0gMTg7XG52YXIgU3VzcGVuc2VMaXN0Q29tcG9uZW50ID0gMTk7XG52YXIgU2NvcGVDb21wb25lbnQgPSAyMTtcbnZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMjtcbnZhciBMZWdhY3lIaWRkZW5Db21wb25lbnQgPSAyMztcbnZhciBDYWNoZUNvbXBvbmVudCA9IDI0O1xudmFyIFRyYWNpbmdNYXJrZXJDb21wb25lbnQgPSAyNTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2ggPSB0cnVlOyAvLyBUT0RPOiBOZWVkIHRvIHJldmlldyB0aGlzIGNvZGUgb25lIG1vcmUgdGltZSBiZWZvcmUgbGFuZGluZ1xuLy8gdGhlIHJlYWN0LXJlY29uY2lsZXIgcGFja2FnZS5cblxudmFyIGVuYWJsZU5ld1JlY29uY2lsZXIgPSBmYWxzZTsgLy8gU3VwcG9ydCBsZWdhY3kgUHJpbWVyIHN1cHBvcnQgb24gaW50ZXJuYWwgRkIgd3d3XG5cbnZhciBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uID0gZmFsc2U7IC8vIEZCLW9ubHkgdXNhZ2UuIFRoZSBuZXcgQVBJIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzLlxuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuXG52YXIgZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRml6elxuLy8gUmVhY3QgRE9NIENob3BwaW5nIEJsb2NrXG4vL1xuLy8gU2ltaWxhciB0byBtYWluIENob3BwaW5nIEJsb2NrIGJ1dCBvbmx5IGZsYWdzIHJlbGF0ZWQgdG8gUmVhY3QgRE9NLiBUaGVzZSBhcmVcbi8vIGdyb3VwZWQgYmVjYXVzZSB3ZSB3aWxsIGxpa2VseSBiYXRjaCBhbGwgb2YgdGhlbSBpbnRvIGEgc2luZ2xlIG1ham9yIHJlbGVhc2UuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGlzYWJsZSBzdXBwb3J0IGZvciBjb21tZW50IG5vZGVzIGFzIFJlYWN0IERPTSBjb250YWluZXJzLiBBbHJlYWR5IGRpc2FibGVkXG4vLyBpbiBvcGVuIHNvdXJjZSwgYnV0IHd3dyBjb2RlYmFzZSBzdGlsbCByZWxpZXMgb24gaXQuIE5lZWQgdG8gcmVtb3ZlLlxuXG52YXIgZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzID0gdHJ1ZTsgLy8gRGlzYWJsZSBqYXZhc2NyaXB0OiBVUkwgc3RyaW5ncyBpbiBocmVmIGZvciBYU1MgcHJvdGVjdGlvbi5cbi8vIGFuZCBjbGllbnQgcmVuZGVyaW5nLCBtb3N0bHkgdG8gYWxsb3cgSlNYIGF0dHJpYnV0ZXMgdG8gYXBwbHkgdG8gdGhlIGN1c3RvbVxuLy8gZWxlbWVudCdzIG9iamVjdCBwcm9wZXJ0aWVzIGluc3RlYWQgb2Ygb25seSBIVE1MIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExMzQ3XG5cbnZhciBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID0gZmFsc2U7IC8vIERpc2FibGVzIGNoaWxkcmVuIGZvciA8dGV4dGFyZWE+IGVsZW1lbnRzXG52YXIgd2FybkFib3V0U3RyaW5nUmVmcyA9IGZhbHNlOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVidWdnaW5nIGFuZCBEZXZUb29sc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFkZHMgdXNlciB0aW1pbmcgbWFya3MgZm9yIGUuZy4gc3RhdGUgdXBkYXRlcywgc3VzcGVuc2UsIGFuZCB3b3JrIGxvb3Agc3R1ZmYsXG4vLyBmb3IgYW4gZXhwZXJpbWVudGFsIHRpbWVsaW5lIHRvb2wuXG5cbnZhciBlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIgPSB0cnVlOyAvLyBIZWxwcyBpZGVudGlmeSBzaWRlIGVmZmVjdHMgaW4gcmVuZGVyLXBoYXNlIGxpZmVjeWNsZSBob29rcyBhbmQgc2V0U3RhdGVcblxudmFyIGVuYWJsZVByb2ZpbGVyVGltZXIgPSB0cnVlOyAvLyBSZWNvcmQgZHVyYXRpb25zIGZvciBjb21taXQgYW5kIHBhc3NpdmUgZWZmZWN0cyBwaGFzZXMuXG5cbnZhciBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzID0gdHJ1ZTsgLy8gUGhhc2UgcGFyYW0gcGFzc2VkIHRvIG9uUmVuZGVyIGNhbGxiYWNrIGRpZmZlcmVudGlhdGVzIGJldHdlZW4gYW4gXCJ1cGRhdGVcIiBhbmQgYSBcImNhc2NhZGluZy11cGRhdGVcIi5cblxudmFyIGFsbE5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoKTtcbi8qKlxuICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIGV2ZW50IG5hbWVcbiAqL1xuXG5cbnZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0ge307XG4vKipcbiAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICogb25seSBpbiB0cnVlLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG52YXIgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9ICB7fSA7IC8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiB0cnVlXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUgKyAnQ2FwdHVyZScsIGRlcGVuZGVuY2llcyk7XG59XG5mdW5jdGlvbiByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0pIHtcbiAgICAgIGVycm9yKCdFdmVudFJlZ2lzdHJ5OiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSAnICsgJ3JlZ2lzdHJhdGlvbiBuYW1lLCBgJXNgLicsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBkZXBlbmRlbmNpZXM7XG5cbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7XG5cbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7XG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmFkZChkZXBlbmRlbmNpZXNbaV0pO1xuICB9XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIGF0dHJpYnV0ZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBhdHRyaWJ1dGVOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgcHJvcCBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgQ1NTIHByb3BlcnR5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIEhUTUwgbWFya3VwIHVzZXMgYSB2YWx1ZSBvZiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ0Zvcm0gZmllbGQgdmFsdWVzICh2YWx1ZSwgY2hlY2tlZCwgZGVmYXVsdFZhbHVlLCBvciBkZWZhdWx0Q2hlY2tlZCBwcm9wcyknICsgJyBtdXN0IGJlIHN0cmluZ3MsIG5vdCAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkge1xuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWC50ZXN0KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXG4gIHtcbiAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYCcsIGF0dHJpYnV0ZU5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobmFtZS5sZW5ndGggPiAyICYmIChuYW1lWzBdID09PSAnbycgfHwgbmFtZVswXSA9PT0gJ08nKSAmJiAobmFtZVsxXSA9PT0gJ24nIHx8IG5hbWVbMV0gPT09ICdOJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdmdW5jdGlvbic6IC8vICRGbG93SXNzdWUgc3ltYm9sIGlzIHBlcmZlY3RseSB2YWxpZCBoZXJlXG5cbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAhcHJvcGVydHlJbmZvLmFjY2VwdHNCb29sZWFucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJlZml4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsIDUpO1xuICAgICAgICAgIHJldHVybiBwcmVmaXggIT09ICdkYXRhLScgJiYgcHJlZml4ICE9PSAnYXJpYS0nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuXG4gICAgc3dpdGNoIChwcm9wZXJ0eUluZm8udHlwZSkge1xuICAgICAgY2FzZSBCT09MRUFOOlxuICAgICAgICByZXR1cm4gIXZhbHVlO1xuXG4gICAgICBjYXNlIE9WRVJMT0FERURfQk9PTEVBTjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcblxuICAgICAgY2FzZSBOVU1FUklDOlxuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpO1xuXG4gICAgICBjYXNlIFBPU0lUSVZFX05VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFByb3BlcnR5SW5mbyhuYW1lKSB7XG4gIHJldHVybiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gcHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCB0eXBlLCBtdXN0VXNlUHJvcGVydHksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVzcGFjZSwgc2FuaXRpemVVUkwsIHJlbW92ZUVtcHR5U3RyaW5nKSB7XG4gIHRoaXMuYWNjZXB0c0Jvb2xlYW5zID0gdHlwZSA9PT0gQk9PTEVBTklTSF9TVFJJTkcgfHwgdHlwZSA9PT0gQk9PTEVBTiB8fCB0eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU47XG4gIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gYXR0cmlidXRlTmFtZXNwYWNlO1xuICB0aGlzLm11c3RVc2VQcm9wZXJ0eSA9IG11c3RVc2VQcm9wZXJ0eTtcbiAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBuYW1lO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnNhbml0aXplVVJMID0gc2FuaXRpemVVUkw7XG4gIHRoaXMucmVtb3ZlRW1wdHlTdHJpbmcgPSByZW1vdmVFbXB0eVN0cmluZztcbn0gLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGlzIGxpc3QsIGJlIHN1cmUgdG8gYWxzbyBhZGQgdGhlbSB0b1xuLy8gdGhlIGBwb3NzaWJsZVN0YW5kYXJkTmFtZXNgIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3Rcbi8vIG5hbWUgd2FybmluZ3MuXG5cblxudmFyIHByb3BlcnRpZXMgPSB7fTsgLy8gVGhlc2UgcHJvcHMgYXJlIHJlc2VydmVkIGJ5IFJlYWN0LiBUaGV5IHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG5cbnZhciByZXNlcnZlZFByb3BzID0gWydjaGlsZHJlbicsICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsIC8vIFRPRE86IFRoaXMgcHJldmVudHMgdGhlIGFzc2lnbm1lbnQgb2YgZGVmYXVsdFZhbHVlIHRvIHJlZ3VsYXJcbi8vIGVsZW1lbnRzIChub3QganVzdCBpbnB1dHMpLiBOb3cgdGhhdCBSZWFjdERPTUlucHV0IGFzc2lnbnMgdG8gdGhlXG4vLyBkZWZhdWx0VmFsdWUgcHJvcGVydHkgLS0gZG8gd2UgbmVlZCB0aGlzP1xuJ2RlZmF1bHRWYWx1ZScsICdkZWZhdWx0Q2hlY2tlZCcsICdpbm5lckhUTUwnLCAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJywgJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsICdzdHlsZSddO1xuXG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBjaGVjayBwcm90ZWN0cyBtdWx0aXBsZSB1c2VzIG9mIGBleHBlY3RlZGAsIHdoaWNoIGlzIHdoeSB0aGVcbiAgICAgIC8vIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uIHJ1bGUgaXMgZGlzYWJsZWQgaW4gc2V2ZXJhbCBzcG90c1xuICAgICAgLy8gYmVsb3cuXG4gICAgICB7XG4gICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZ1bGx5IGRpc2FibGVkIGphdmFzY3JpcHQ6IFVSTHMsIGFuZCBpZlxuICAgICAgICAvLyB0aGUgaHlkcmF0aW9uIGlzIHN1Y2Nlc3NmdWwgb2YgYSBqYXZhc2NyaXB0OiBVUkwsIHdlXG4gICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gd2FybiBvbiB0aGUgY2xpZW50LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIGF0dHJpYnV0ZSBvbiBhIG5vZGUuIE9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICogVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLiBTb21lXG4gKiBhdHRyaWJ1dGVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIHZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuXG4gIGlmIChzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHZhbHVlID0gbnVsbDtcbiAgfVxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKTtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbnZhciBSRUFDVF9DQUNIRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY2FjaGUnKTtcbnZhciBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7XG4gIHZhciBvd25lciA9ICBmaWJlci5fZGVidWdPd25lciA/IGZpYmVyLl9kZWJ1Z093bmVyLnR5cGUgOiBudWxsIDtcbiAgdmFyIHNvdXJjZSA9ICBmaWJlci5fZGVidWdTb3VyY2UgO1xuXG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdMYXp5Jyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZS5yZW5kZXIpO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIGRvIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVGaWJlcihub2RlKTtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlKTtcblxuICAgIHJldHVybiBpbmZvO1xuICB9IGNhdGNoICh4KSB7XG4gICAgcmV0dXJuICdcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiAnICsgeC5tZXNzYWdlICsgJ1xcbicgKyB4LnN0YWNrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lJDEob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSQxKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHZhciB0YWcgPSBmaWJlci50YWcsXG4gICAgICB0eXBlID0gZmliZXIudHlwZTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ0NhY2hlJztcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0RlaHlkcmF0ZWRGcmFnbWVudCc7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUkMSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIC8vIEhvc3QgY29tcG9uZW50IHR5cGUgaXMgdGhlIGRpc3BsYXkgbmFtZSAoZS5nLiBcImRpdlwiLCBcIlZpZXdcIilcbiAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiAnUm9vdCc7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuICdUZXh0JztcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIC8vIE5hbWUgY29tZXMgZnJvbSB0aGUgdHlwZSBpbiB0aGlzIGNhc2U7IHdlIGRvbid0IGhhdmUgYSB0YWcuXG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgY2FzZSBNb2RlOlxuICAgICAgaWYgKHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUpIHtcbiAgICAgICAgLy8gRG9uJ3QgYmUgbGVzcyBzcGVjaWZpYyB0aGFuIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcbiAgICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNb2RlJztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU2NvcGUnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1RyYWNpbmdNYXJrZXInO1xuICAgIC8vIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgdGFncyBjb21lIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgdHlwZTpcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IC8vIFNhZmUgYmVjYXVzZSBpZiBjdXJyZW50IGZpYmVyIGV4aXN0cywgd2UgYXJlIHJlY29uY2lsaW5nLFxuICAgIC8vIGFuZCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSB3b3JrLWluLXByb2dyZXNzIHZlcnNpb24uXG5cblxuICAgIHJldHVybiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoY3VycmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0Q3VycmVudEZpYmVyKGZpYmVyKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IGZpYmVyID09PSBudWxsID8gbnVsbCA6IGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXY7XG4gICAgY3VycmVudCA9IGZpYmVyO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiBzZXRJc1JlbmRlcmluZyhyZW5kZXJpbmcpIHtcbiAge1xuICAgIGlzUmVuZGVyaW5nID0gcmVuZGVyaW5nO1xuICB9XG59XG5cbi8vIEZsb3cgZG9lcyBub3QgYWxsb3cgc3RyaW5nIGNvbmNhdGVuYXRpb24gb2YgbW9zdCBub24tc3RyaW5nIHR5cGVzLiBUbyB3b3JrXG4vLyBhcm91bmQgdGhpcyBsaW1pdGF0aW9uLCB3ZSB1c2UgYW4gb3BhcXVlIHR5cGUgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCBieVxuLy8gcGFzc2luZyB0aGUgdmFsdWUgdGhyb3VnaCBnZXRUb1N0cmluZ1ZhbHVlIGZpcnN0LlxuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gVGhlIGNvZXJjaW9uIHNhZmV0eSBjaGVjayBpcyBwZXJmb3JtZWQgaW4gZ2V0VG9TdHJpbmdWYWx1ZSgpLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZnVuY3Rpb24sIHN5bWJvbCBhcmUgYXNzaWduZWQgYXMgZW1wdHkgc3RyaW5nc1xuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbnZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICBidXR0b246IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICByYWRpbzogdHJ1ZSxcbiAgcmVzZXQ6IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZVxufTtcbmZ1bmN0aW9uIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHModGFnTmFtZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICghKGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwgcHJvcHMub25JbnB1dCB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy52YWx1ZSA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuXG4gICAgaWYgKCEocHJvcHMub25DaGFuZ2UgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMuY2hlY2tlZCA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NoZWNrYWJsZShlbGVtKSB7XG4gIHZhciB0eXBlID0gZWxlbS50eXBlO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhY2tlcihub2RlKSB7XG4gIHJldHVybiBub2RlLl92YWx1ZVRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIGRldGFjaFRyYWNrZXIobm9kZSkge1xuICBub2RlLl92YWx1ZVRyYWNrZXIgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlID0gJyc7XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKGlzQ2hlY2thYmxlKG5vZGUpKSB7XG4gICAgdmFsdWUgPSBub2RlLmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJhY2tWYWx1ZU9uTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZUZpZWxkID0gaXNDaGVja2FibGUobm9kZSkgPyAnY2hlY2tlZCcgOiAndmFsdWUnO1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHZhbHVlRmllbGQpO1xuXG4gIHtcbiAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24obm9kZVt2YWx1ZUZpZWxkXSk7XG4gIH1cblxuICB2YXIgY3VycmVudFZhbHVlID0gJycgKyBub2RlW3ZhbHVlRmllbGRdOyAvLyBpZiBzb21lb25lIGhhcyBhbHJlYWR5IGRlZmluZWQgYSB2YWx1ZSBvciBTYWZhcmksIHRoZW4gYmFpbFxuICAvLyBhbmQgZG9uJ3QgdHJhY2sgdmFsdWUgd2lsbCBjYXVzZSBvdmVyIHJlcG9ydGluZyBvZiBjaGFuZ2VzLFxuICAvLyBidXQgaXQncyBiZXR0ZXIgdGhlbiBhIGhhcmQgZmFpbHVyZVxuICAvLyAobmVlZGVkIGZvciBjZXJ0YWluIHRlc3RzIHRoYXQgc3B5T24gaW5wdXQgdmFsdWVzIGFuZCBTYWZhcmkpXG5cbiAgaWYgKG5vZGUuaGFzT3duUHJvcGVydHkodmFsdWVGaWVsZCkgfHwgdHlwZW9mIGRlc2NyaXB0b3IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkZXNjcmlwdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5zZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICBzZXQgPSBkZXNjcmlwdG9yLnNldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0LmNhbGwodGhpcyk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7IC8vIFdlIGNvdWxkJ3ZlIHBhc3NlZCB0aGlzIHRoZSBmaXJzdCB0aW1lXG4gIC8vIGJ1dCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBJRTExIGFuZCBFZGdlIDE0LzE1LlxuICAvLyBDYWxsaW5nIGRlZmluZVByb3BlcnR5KCkgYWdhaW4gc2hvdWxkIGJlIGVxdWl2YWxlbnQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE3NjhcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZVxuICB9KTtcbiAgdmFyIHRyYWNrZXIgPSB7XG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfSxcbiAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdpbnB1dCcsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5jaGVja2VkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3AsIG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCA/ICcnIDogcHJvcHMuZGVmYXVsdFZhbHVlO1xuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUgIT0gbnVsbCA/IHByb3BzLnZhbHVlIDogZGVmYXVsdFZhbHVlKSxcbiAgICBjb250cm9sbGVkOiBpc0NvbnRyb2xsZWQocHJvcHMpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuXG4gIGlmIChjaGVja2VkICE9IG51bGwpIHtcbiAgICBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsICdjaGVja2VkJywgY2hlY2tlZCwgZmFsc2UpO1xuICB9XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgdmFyIGNvbnRyb2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpO1xuXG4gICAgaWYgKCFub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYW4gdW5jb250cm9sbGVkIGlucHV0IHRvIGJlIGNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIHVuZGVmaW5lZCB0byAnICsgJ2EgZGVmaW5lZCB2YWx1ZSwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmICFjb250cm9sbGVkICYmICFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYSBjb250cm9sbGVkIGlucHV0IHRvIGJlIHVuY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gYSBkZWZpbmVkIHRvICcgKyAndW5kZWZpbmVkLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKTtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciB0eXBlID0gcHJvcHMudHlwZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHZhbHVlID09PSAwICYmIG5vZGUudmFsdWUgPT09ICcnIHx8IC8vIFdlIGV4cGxpY2l0bHkgd2FudCB0byBjb2VyY2UgdG8gbnVtYmVyIGhlcmUgaWYgcG9zc2libGUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIG5vZGUudmFsdWUgIT0gdmFsdWUpIHtcbiAgICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0Jykge1xuICAgIC8vIFN1Ym1pdC9yZXNldCBpbnB1dHMgbmVlZCB0aGUgYXR0cmlidXRlIHJlbW92ZWQgY29tcGxldGVseSB0byBhdm9pZFxuICAgIC8vIGJsYW5rLXRleHQgYnV0dG9ucy5cbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBjb21lcyBmcm9tIGEgY2FzY2FkZSBvZlxuICAgIC8vIHByb3BlcnRpZXM6XG4gICAgLy8gIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDMuIE90aGVyd2lzZSB0aGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlXG4gICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgaXQgb25seSBjaGFuZ2VzIHdoZW4gaXQgbmVlZHNcbiAgICAvLyB0byBiZSByZW1vdmVkLCBzdWNoIGFzIHRyYW5zaXRpb25pbmcgZnJvbSBhIGNoZWNrYm94IGludG8gYSB0ZXh0IGlucHV0XG4gICAgaWYgKHByb3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIoZWxlbWVudCwgcHJvcHMsIGlzSHlkcmF0aW5nKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSB8fCBwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdmFyIGlzQnV0dG9uID0gdHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JzsgLy8gQXZvaWQgc2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUgb24gc3VibWl0L3Jlc2V0IGlucHV0cyBhcyBpdCBvdmVycmlkZXMgdGhlXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYnJvd3Nlci4gU2VlOiAjMTI4NzJcblxuICAgIGlmIChpc0J1dHRvbiAmJiAocHJvcHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy52YWx1ZSA9PT0gbnVsbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gICAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAge1xuICAgICAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIHByb3BlcnR5IHNob3VsZCB1c2VcbiAgICAgICAgLy8gdGhlIHdyYXBwZXJTdGF0ZS5faW5pdGlhbFZhbHVlIHByb3BlcnR5LiBUaGlzIHVzZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMy4gQW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgICAgICBub2RlLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHN5bmNocm9uaXplZCB0byB0aGUgcHJvcGVydHksXG4gICAgICAvLyBzbyB3ZSBhc3NpZ24gZGVmYXVsdFZhbHVlIHRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXNzaWdubWVudCBzdGVwIGFib3ZlLlxuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgfVxuICB9IC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tlZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkXG4gIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02MDg0MTZcbiAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy5cblxuXG4gIHZhciBuYW1lID0gbm9kZS5uYW1lO1xuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9ICcnO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGJvdGggdGhlIGNoZWNrZWQgcHJvcGVydHkgYW5kXG4gICAgLy8gYXR0cmlidXRlIGFyZSBhc3NpZ25lZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIGRlZmF1bHRDaGVja2VkLiBUaGlzIHVzZXM6XG4gICAgLy9cbiAgICAvLyAgIDEuIFRoZSBjaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMi4gVGhlIGRlZmF1bHRDaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMy4gT3RoZXJ3aXNlLCBmYWxzZVxuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XG4gIH1cblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSBuYW1lO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdXBkYXRlV3JhcHBlcihub2RlLCBwcm9wcyk7XG4gIHVwZGF0ZU5hbWVkQ291c2lucyhub2RlLCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU5hbWVkQ291c2lucyhyb290Tm9kZSwgcHJvcHMpIHtcbiAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuXG4gIGlmIChwcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5hbWUgIT0gbnVsbCkge1xuICAgIHZhciBxdWVyeVJvb3QgPSByb290Tm9kZTtcblxuICAgIHdoaWxlIChxdWVyeVJvb3QucGFyZW50Tm9kZSkge1xuICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7XG4gICAgfSAvLyBJZiBgcm9vdE5vZGUuZm9ybWAgd2FzIG5vbi1udWxsLCB0aGVuIHdlIGNvdWxkIHRyeSBgZm9ybS5lbGVtZW50c2AsXG4gICAgLy8gYnV0IHRoYXQgc29tZXRpbWVzIGJlaGF2ZXMgc3RyYW5nZWx5IGluIElFOC4gV2UgY291bGQgYWxzbyB0cnkgdXNpbmdcbiAgICAvLyBgZm9ybS5nZXRFbGVtZW50c0J5TmFtZWAsIGJ1dCB0aGF0IHdpbGwgb25seSByZXR1cm4gZGlyZWN0IGNoaWxkcmVuXG4gICAgLy8gYW5kIHdvbid0IGluY2x1ZGUgaW5wdXRzIHRoYXQgdXNlIHRoZSBIVE1MNSBgZm9ybT1gIGF0dHJpYnV0ZS4gU2luY2VcbiAgICAvLyB0aGUgaW5wdXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gYSBmb3JtLiBJdCBtaWdodCBub3QgZXZlbiBiZSBpbiB0aGVcbiAgICAvLyBkb2N1bWVudC4gTGV0J3MganVzdCB1c2UgdGhlIGxvY2FsIGBxdWVyeVNlbGVjdG9yQWxsYCB0byBlbnN1cmUgd2UgZG9uJ3RcbiAgICAvLyBtaXNzIGFueXRoaW5nLlxuXG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKG5hbWUsICduYW1lJyk7XG4gICAgfVxuXG4gICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvdGhlck5vZGUgPSBncm91cFtpXTtcblxuICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUgfHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0b25zIHJlbmRlcmVkIGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3RcbiAgICAgIC8vIGFuZCB0aGUgc2FtZSBuYW1lIGFyZSByZW5kZXJlZCBpbnRvIHRoZSBzYW1lIGZvcm0gKHNhbWUgYXMgIzE5MzkpLlxuICAgICAgLy8gVGhhdCdzIHByb2JhYmx5IG9rYXk7IHdlIGRvbid0IHN1cHBvcnQgaXQganVzdCBhcyB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0dG9ucyB3aXRoIG5vbi1SZWFjdCBvbmVzLlxuXG5cbiAgICAgIHZhciBvdGhlclByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShvdGhlck5vZGUpO1xuXG4gICAgICBpZiAoIW90aGVyUHJvcHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgJyArICdzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSAvLyBXZSBuZWVkIHVwZGF0ZSB0aGUgdHJhY2tlZCB2YWx1ZSBvbiB0aGUgbmFtZWQgY291c2luIHNpbmNlIHRoZSB2YWx1ZVxuICAgICAgLy8gd2FzIGNoYW5nZWQgYnV0IHRoZSBpbnB1dCBzYXcgbm8gZXZlbnQgb3IgdmFsdWUgc2V0XG5cblxuICAgICAgdXBkYXRlVmFsdWVJZkNoYW5nZWQob3RoZXJOb2RlKTsgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgcmFkaW8gYnV0dG9uIGdyb3VwLCBmb3JjaW5nIHRoZSBpbnB1dCB0aGF0XG4gICAgICAvLyB3YXMgcHJldmlvdXNseSBjaGVja2VkIHRvIHVwZGF0ZSB3aWxsIGNhdXNlIGl0IHRvIGJlIGNvbWUgcmUtY2hlY2tlZFxuICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuXG5cbiAgICAgIHVwZGF0ZVdyYXBwZXIob3RoZXJOb2RlLCBvdGhlclByb3BzKTtcbiAgICB9XG4gIH1cbn0gLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi5cbi8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbi8vIENocm9tZSByYWlzZXMgXCJUaGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIuXG4vL1xuLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbi8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHRcbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcblxuXG5mdW5jdGlvbiBzZXREZWZhdWx0VmFsdWUobm9kZSwgdHlwZSwgdmFsdWUpIHtcbiAgaWYgKCAvLyBGb2N1c2VkIG51bWJlciBpbnB1dHMgc3luY2hyb25pemUgb24gYmx1ci4gU2VlIENoYW5nZUV2ZW50UGx1Z2luLmpzXG4gIHR5cGUgIT09ICdudW1iZXInIHx8IGdldEFjdGl2ZUVsZW1lbnQobm9kZS5vd25lckRvY3VtZW50KSAhPT0gbm9kZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IGZhbHNlO1xuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxvcHRpb24+IGhvc3QgY29tcG9uZW50IHRoYXQgd2FybnMgd2hlbiBgc2VsZWN0ZWRgIGlzIHNldC5cbiAqL1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICAvLyBJZiBhIHZhbHVlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgY2hpbGRyZW4gbXVzdCBiZSBzaW1wbGUuXG4gICAgaWYgKHByb3BzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdvYmplY3QnICYmIHByb3BzLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZGlkV2FybkludmFsaWRDaGlsZCkge1xuICAgICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgaW5mZXIgdGhlIG9wdGlvbiB2YWx1ZSBvZiBjb21wbGV4IGNoaWxkcmVuLiAnICsgJ1Bhc3MgYSBgdmFsdWVgIHByb3Agb3IgdXNlIGEgcGxhaW4gc3RyaW5nIGFzIGNoaWxkcmVuIHRvIDxvcHRpb24+LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZElubmVySFRNTCkge1xuICAgICAgICAgIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdQYXNzIGEgYHZhbHVlYCBwcm9wIGlmIHlvdSBzZXQgZGFuZ2Vyb3VzbHlJbm5lckhUTUwgc28gUmVhY3Qga25vd3MgJyArICd3aGljaCB2YWx1ZSBzaG91bGQgYmUgc2VsZWN0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFRPRE86IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuXG5cbiAgICBpZiAocHJvcHMuc2VsZWN0ZWQgIT0gbnVsbCAmJiAhZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24pIHtcbiAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiAnICsgJ3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKTtcblxuICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIHZhbHVlPVwiXCIgc2hvdWxkIG1ha2UgYSB2YWx1ZSBhdHRyaWJ1dGUgKCM2MjE5KVxuICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpKSk7XG4gIH1cbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcE5hbWVJc0FycmF5ID0gaXNBcnJheShwcm9wc1twcm9wTmFtZV0pO1xuXG4gICAgICBpZiAocHJvcHMubXVsdGlwbGUgJiYgIXByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGFuIGFycmF5IGlmICcgKyAnYG11bHRpcGxlYCBpcyB0cnVlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIHByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMShlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgfSk7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcyk7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgd2FzTXVsdGlwbGU6ICEhcHJvcHMubXVsdGlwbGVcbiAgfTtcblxuICB7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxKSB7XG4gICAgICBlcnJvcignU2VsZWN0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBzZWxlY3QgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICBub2RlLm11bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RVcGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHdhc011bHRpcGxlID0gbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gISFwcm9wcy5tdWx0aXBsZSkge1xuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlO1xuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kXG4gKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpc1xuICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGVcbiAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsXG4gKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXByZWNhdGVkKS5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4nKTtcbiAgfSAvLyBBbHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJRTksIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugd2lsbFxuICAvLyBnZXQgcmVzZXQgaWYgYHRleHRDb250ZW50YCBpcyBtdXRhdGVkLiAgV2UgY291bGQgYWRkIGEgY2hlY2sgaW4gc2V0VGV4dENvbnRlbnRcbiAgLy8gdG8gb25seSBzZXQgdGhlIHZhbHVlIGlmL3doZW4gdGhlIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgbm9kZSB2YWx1ZSAod2hpY2ggd291bGRcbiAgLy8gY29tcGxldGVseSBzb2x2ZSB0aGlzIElFOSBidWcpLCBidXQgU2ViYXN0aWFuK1NvcGhpZSBzZWVtZWQgdG8gbGlrZSB0aGlzXG4gIC8vIHNvbHV0aW9uLiBUaGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbiBvciBvYmplY3Qgc28gdGhhdCdzIHdoeSBpdCdzIGZvcmNlZFxuICAvLyB0byBiZSBhIHN0cmluZy5cblxuXG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlblswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNoaWxkcmVuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaW5pdGlhbFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShpbml0aWFsVmFsdWUpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgIHZhciBuZXdWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTsgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWRcblxuICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCAmJiBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhkZWZhdWx0VmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuXG4gIHZhciB0ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7IC8vIE9ubHkgc2V0IG5vZGUudmFsdWUgaWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkXG4gIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTAxNTI1L1xuXG4gIGlmICh0ZXh0Q29udGVudCA9PT0gbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0ZXh0Q29udGVudCAhPT0gJycgJiYgdGV4dENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0ZXh0Q29udGVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpO1xufVxuXG52YXIgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG52YXIgTUFUSF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCc7XG52YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG5cbiAgICBpZiAoISgnaW5uZXJIVE1MJyBpbiBub2RlKSkge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9yIFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlXG4gICAgICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvXG4gICAgICAvLyB0aGUgdGFyZ2V0IG5vZGVcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyID0gcmV1c2FibGVTVkdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbC52YWx1ZU9mKCkudG9TdHJpbmcoKSArICc8L3N2Zz4nO1xuICAgICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKHN2Z05vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLmlubmVySFRNTCA9IGh0bWw7XG59KTtcblxuLyoqXG4gKiBIVE1MIG5vZGVUeXBlIHZhbHVlcyB0aGF0IHJlcHJlc2VudCB0aGUgdHlwZSBvZiB0aGUgbm9kZVxuICovXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG52YXIgRE9DVU1FTlRfTk9ERSA9IDk7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG4vKipcbiAqIFNldCB0aGUgdGV4dENvbnRlbnQgcHJvcGVydHkgb2YgYSBub2RlLiBGb3IgdGV4dCB1cGRhdGVzLCBpdCdzIGZhc3RlclxuICogdG8gc2V0IHRoZSBgbm9kZVZhbHVlYCBvZiB0aGUgVGV4dCBub2RlIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmdcbiAqIGAudGV4dENvbnRlbnRgIHdoaWNoIHdpbGwgcmVtb3ZlIHRoZSBleGlzdGluZyBub2RlIGFuZCBjcmVhdGUgYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0KSB7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn07XG5cbi8vIExpc3QgZGVyaXZlZCBmcm9tIEdlY2tvIHNvdXJjZSBjb2RlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvNGU2MzhlZmM3MS9sYXlvdXQvc3R5bGUvdGVzdC9wcm9wZXJ0eV9kYXRhYmFzZS5qc1xudmFyIHNob3J0aGFuZFRvTG9uZ2hhbmQgPSB7XG4gIGFuaW1hdGlvbjogWydhbmltYXRpb25EZWxheScsICdhbmltYXRpb25EaXJlY3Rpb24nLCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnYW5pbWF0aW9uRmlsbE1vZGUnLCAnYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQnLCAnYW5pbWF0aW9uTmFtZScsICdhbmltYXRpb25QbGF5U3RhdGUnLCAnYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgYmFja2dyb3VuZDogWydiYWNrZ3JvdW5kQXR0YWNobWVudCcsICdiYWNrZ3JvdW5kQ2xpcCcsICdiYWNrZ3JvdW5kQ29sb3InLCAnYmFja2dyb3VuZEltYWdlJywgJ2JhY2tncm91bmRPcmlnaW4nLCAnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJywgJ2JhY2tncm91bmRSZXBlYXQnLCAnYmFja2dyb3VuZFNpemUnXSxcbiAgYmFja2dyb3VuZFBvc2l0aW9uOiBbJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWSddLFxuICBib3JkZXI6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kOiBbJ2JvcmRlckJsb2NrRW5kQ29sb3InLCAnYm9yZGVyQmxvY2tFbmRTdHlsZScsICdib3JkZXJCbG9ja0VuZFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrU3RhcnQ6IFsnYm9yZGVyQmxvY2tTdGFydENvbG9yJywgJ2JvcmRlckJsb2NrU3RhcnRTdHlsZScsICdib3JkZXJCbG9ja1N0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyQm90dG9tOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJ10sXG4gIGJvcmRlckNvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclRvcENvbG9yJ10sXG4gIGJvcmRlckltYWdlOiBbJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCddLFxuICBib3JkZXJJbmxpbmVFbmQ6IFsnYm9yZGVySW5saW5lRW5kQ29sb3InLCAnYm9yZGVySW5saW5lRW5kU3R5bGUnLCAnYm9yZGVySW5saW5lRW5kV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IFsnYm9yZGVySW5saW5lU3RhcnRDb2xvcicsICdib3JkZXJJbmxpbmVTdGFydFN0eWxlJywgJ2JvcmRlcklubGluZVN0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyTGVmdDogWydib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCddLFxuICBib3JkZXJSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cycsICdib3JkZXJCb3R0b21SaWdodFJhZGl1cycsICdib3JkZXJUb3BMZWZ0UmFkaXVzJywgJ2JvcmRlclRvcFJpZ2h0UmFkaXVzJ10sXG4gIGJvcmRlclJpZ2h0OiBbJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJ10sXG4gIGJvcmRlclN0eWxlOiBbJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclRvcFN0eWxlJ10sXG4gIGJvcmRlclRvcDogWydib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJXaWR0aDogWydib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BXaWR0aCddLFxuICBjb2x1bW5SdWxlOiBbJ2NvbHVtblJ1bGVDb2xvcicsICdjb2x1bW5SdWxlU3R5bGUnLCAnY29sdW1uUnVsZVdpZHRoJ10sXG4gIGNvbHVtbnM6IFsnY29sdW1uQ291bnQnLCAnY29sdW1uV2lkdGgnXSxcbiAgZmxleDogWydmbGV4QmFzaXMnLCAnZmxleEdyb3cnLCAnZmxleFNocmluayddLFxuICBmbGV4RmxvdzogWydmbGV4RGlyZWN0aW9uJywgJ2ZsZXhXcmFwJ10sXG4gIGZvbnQ6IFsnZm9udEZhbWlseScsICdmb250RmVhdHVyZVNldHRpbmdzJywgJ2ZvbnRLZXJuaW5nJywgJ2ZvbnRMYW5ndWFnZU92ZXJyaWRlJywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJywgJ2ZvbnRXZWlnaHQnLCAnbGluZUhlaWdodCddLFxuICBmb250VmFyaWFudDogWydmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJ10sXG4gIGdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWQ6IFsnZ3JpZEF1dG9Db2x1bW5zJywgJ2dyaWRBdXRvRmxvdycsICdncmlkQXV0b1Jvd3MnLCAnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGdyaWRBcmVhOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0JywgJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRDb2x1bW46IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnXSxcbiAgZ3JpZENvbHVtbkdhcDogWydjb2x1bW5HYXAnXSxcbiAgZ3JpZEdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWRSb3c6IFsnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZFJvd0dhcDogWydyb3dHYXAnXSxcbiAgZ3JpZFRlbXBsYXRlOiBbJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBsaXN0U3R5bGU6IFsnbGlzdFN0eWxlSW1hZ2UnLCAnbGlzdFN0eWxlUG9zaXRpb24nLCAnbGlzdFN0eWxlVHlwZSddLFxuICBtYXJnaW46IFsnbWFyZ2luQm90dG9tJywgJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnLCAnbWFyZ2luVG9wJ10sXG4gIG1hcmtlcjogWydtYXJrZXJFbmQnLCAnbWFya2VyTWlkJywgJ21hcmtlclN0YXJ0J10sXG4gIG1hc2s6IFsnbWFza0NsaXAnLCAnbWFza0NvbXBvc2l0ZScsICdtYXNrSW1hZ2UnLCAnbWFza01vZGUnLCAnbWFza09yaWdpbicsICdtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknLCAnbWFza1JlcGVhdCcsICdtYXNrU2l6ZSddLFxuICBtYXNrUG9zaXRpb246IFsnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJ10sXG4gIG91dGxpbmU6IFsnb3V0bGluZUNvbG9yJywgJ291dGxpbmVTdHlsZScsICdvdXRsaW5lV2lkdGgnXSxcbiAgb3ZlcmZsb3c6IFsnb3ZlcmZsb3dYJywgJ292ZXJmbG93WSddLFxuICBwYWRkaW5nOiBbJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnXSxcbiAgcGxhY2VDb250ZW50OiBbJ2FsaWduQ29udGVudCcsICdqdXN0aWZ5Q29udGVudCddLFxuICBwbGFjZUl0ZW1zOiBbJ2FsaWduSXRlbXMnLCAnanVzdGlmeUl0ZW1zJ10sXG4gIHBsYWNlU2VsZjogWydhbGlnblNlbGYnLCAnanVzdGlmeVNlbGYnXSxcbiAgdGV4dERlY29yYXRpb246IFsndGV4dERlY29yYXRpb25Db2xvcicsICd0ZXh0RGVjb3JhdGlvbkxpbmUnLCAndGV4dERlY29yYXRpb25TdHlsZSddLFxuICB0ZXh0RW1waGFzaXM6IFsndGV4dEVtcGhhc2lzQ29sb3InLCAndGV4dEVtcGhhc2lzU3R5bGUnXSxcbiAgdHJhbnNpdGlvbjogWyd0cmFuc2l0aW9uRGVsYXknLCAndHJhbnNpdGlvbkR1cmF0aW9uJywgJ3RyYW5zaXRpb25Qcm9wZXJ0eScsICd0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgd29yZFdyYXA6IFsnb3ZlcmZsb3dXcmFwJ11cbn07XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgaXNVbml0bGVzc051bWJlciA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGFzcGVjdFJhdGlvOiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAge1xuICAgIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gIH1cblxuICByZXR1cm4gKCcnICsgdmFsdWUpLnRyaW0oKTtcbn1cblxudmFyIHVwcGVyY2FzZVBhdHRlcm4gPSAvKFtBLVpdKS9nO1xudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ01velRyYW5zaXRpb24nKVxuICogICA8IFwiLW1vei10cmFuc2l0aW9uXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ21zVHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbXMtdHJhbnNpdGlvblwiXG4gKlxuICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVmaXhlZCksIGFuIGBtc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLlxuICovXG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgJy0kMScpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vICdtc1RyYW5zZm9ybScgaXMgY29ycmVjdCwgYnV0IHRoZSBvdGhlciBwcmVmaXhlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcbiAgdmFyIGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybiA9IC9eKD86d2Via2l0fG1venxvKVtBLVpdLztcbiAgdmFyIG1zUGF0dGVybiQxID0gL14tbXMtLztcbiAgdmFyIGh5cGhlblBhdHRlcm4gPSAvLSguKS9nOyAvLyBzdHlsZSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb25cblxuICB2YXIgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC87XG4gIHZhciB3YXJuZWRTdHlsZU5hbWVzID0ge307XG4gIHZhciB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9O1xuICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTtcbiAgdmFyIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSBmYWxzZTtcblxuICB2YXIgY2FtZWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGh5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICAgIHJldHVybiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIC8vIEFzIEFuZGkgU21pdGggc3VnZ2VzdHNcbiAgICAvLyAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gICAgLy8gaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICAgIGNhbWVsaXplKG5hbWUucmVwbGFjZShtc1BhdHRlcm4kMSwgJ21zLScpKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoXCJTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb24uIFwiICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9ySW5maW5pdHlWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlJDEgPSB3YXJuVmFsaWRTdHlsZTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdHlsZVxuICogYXR0cmlidXRlIGdlbmVyYXRlZCBieSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuIEl0IGJ5LXBhc3NlcyB3YXJuaW5ncyBhbmRcbiAqIHNlY3VyaXR5IGNoZWNrcyBzbyBpdCdzIG5vdCBzYWZlIHRvIHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuXG4gKiBjb21wYXJpc29uLiBJdCBpcyBvbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMoc3R5bGVzKSB7XG4gIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9ICcnO1xuICAgIHZhciBkZWxpbWl0ZXIgPSAnJztcblxuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cbiAgICAgIGlmIChzdHlsZVZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcbiAgICAgICAgc2VyaWFsaXplZCArPSBkZWxpbWl0ZXIgKyAoaXNDdXN0b21Qcm9wZXJ0eSA/IHN0eWxlTmFtZSA6IGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpKSArICc6JztcbiAgICAgICAgc2VyaWFsaXplZCArPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgICAgIGRlbGltaXRlciA9ICc7JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBzdHlsZXMgb24gYSBub2RlLiAgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXNcbiAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yU3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuXG4gIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuXG4gICAge1xuICAgICAgaWYgKCFpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICAgIHdhcm5WYWxpZFN0eWxlJDEoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGlzQ3VzdG9tUHJvcGVydHkpO1xuXG4gICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgc3R5bGVOYW1lID0gJ2Nzc0Zsb2F0JztcbiAgICB9XG5cbiAgICBpZiAoaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBzdHlsZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVFbXB0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG59XG4vKipcbiAqIEdpdmVuIHtjb2xvcjogJ3JlZCcsIG92ZXJmbG93OiAnaGlkZGVuJ30gcmV0dXJucyB7XG4gKiAgIGNvbG9yOiAnY29sb3InLFxuICogICBvdmVyZmxvd1g6ICdvdmVyZmxvdycsXG4gKiAgIG92ZXJmbG93WTogJ292ZXJmbG93JyxcbiAqIH0uIFRoaXMgY2FuIGJlIHJlYWQgYXMgXCJ0aGUgb3ZlcmZsb3dZIHByb3BlcnR5IHdhcyBzZXQgYnkgdGhlIG92ZXJmbG93XG4gKiBzaG9ydGhhbmRcIi4gVGhhdCBpcywgdGhlIHZhbHVlcyBhcmUgdGhlIHByb3BlcnR5IHRoYXQgZWFjaCB3YXMgZGVyaXZlZCBmcm9tLlxuICovXG5cblxuZnVuY3Rpb24gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlcykge1xuICB2YXIgZXhwYW5kZWQgPSB7fTtcblxuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIGxvbmdoYW5kcyA9IHNob3J0aGFuZFRvTG9uZ2hhbmRba2V5XSB8fCBba2V5XTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9uZ2hhbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHBhbmRlZFtsb25naGFuZHNbaV1dID0ga2V5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZDtcbn1cbi8qKlxuICogV2hlbiBtaXhpbmcgc2hvcnRoYW5kIGFuZCBsb25naGFuZCBwcm9wZXJ0eSBuYW1lcywgd2Ugd2FybiBkdXJpbmcgdXBkYXRlcyBpZlxuICogd2UgZXhwZWN0IGFuIGluY29ycmVjdCByZXN1bHQgdG8gb2NjdXIuIEluIHBhcnRpY3VsYXIsIHdlIHdhcm4gZm9yOlxuICpcbiAqIFVwZGF0aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIG92ZXJ3cml0dGVuKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnYmF6JywgZm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJ2JheidcbiAqIFJlbW92aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIGxvc3QgdG9vKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnJ1xuICogUmVtb3ZpbmcgYSBsb25naGFuZCBwcm9wZXJ0eSAoc2hvdWxkIHJldmVydCB0byBzaG9ydGhhbmQ7IGRvZXNuJ3QpOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdmb28nfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250VmFyaWFudCA9ICcnXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0U3R5bGVzKSB7XG4gIHtcbiAgICBpZiAoIW5leHRTdHlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXhwYW5kZWRVcGRhdGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlVXBkYXRlcyk7XG4gICAgdmFyIGV4cGFuZGVkU3R5bGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKG5leHRTdHlsZXMpO1xuICAgIHZhciB3YXJuZWRBYm91dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGV4cGFuZGVkVXBkYXRlcykge1xuICAgICAgdmFyIG9yaWdpbmFsS2V5ID0gZXhwYW5kZWRVcGRhdGVzW2tleV07XG4gICAgICB2YXIgY29ycmVjdE9yaWdpbmFsS2V5ID0gZXhwYW5kZWRTdHlsZXNba2V5XTtcblxuICAgICAgaWYgKGNvcnJlY3RPcmlnaW5hbEtleSAmJiBvcmlnaW5hbEtleSAhPT0gY29ycmVjdE9yaWdpbmFsS2V5KSB7XG4gICAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3JpZ2luYWxLZXkgKyAnLCcgKyBjb3JyZWN0T3JpZ2luYWxLZXk7XG5cbiAgICAgICAgaWYgKHdhcm5lZEFib3V0W3dhcm5pbmdLZXldKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzIGEgc3R5bGUgcHJvcGVydHkgZHVyaW5nIHJlcmVuZGVyICglcykgd2hlbiBhICcgKyAnY29uZmxpY3RpbmcgcHJvcGVydHkgaXMgc2V0ICglcykgY2FuIGxlYWQgdG8gc3R5bGluZyBidWdzLiBUbyAnICsgXCJhdm9pZCB0aGlzLCBkb24ndCBtaXggc2hvcnRoYW5kIGFuZCBub24tc2hvcnRoYW5kIHByb3BlcnRpZXMgXCIgKyAnZm9yIHRoZSBzYW1lIHZhbHVlOyBpbnN0ZWFkLCByZXBsYWNlIHRoZSBzaG9ydGhhbmQgd2l0aCAnICsgJ3NlcGFyYXRlIHZhbHVlcy4nLCBpc1ZhbHVlRW1wdHkoc3R5bGVVcGRhdGVzW29yaWdpbmFsS2V5XSkgPyAnUmVtb3ZpbmcnIDogJ1VwZGF0aW5nJywgb3JpZ2luYWxLZXksIGNvcnJlY3RPcmlnaW5hbEtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3Mgc2hvdWxkIG9taXQgdGhlaXIgY2xvc2UgdGFnLiBXZSBrZWVwIGEgbGlzdCBmb3Jcbi8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLlxudmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7XG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJyOiB0cnVlLFxuICBjb2w6IHRydWUsXG4gIGVtYmVkOiB0cnVlLFxuICBocjogdHJ1ZSxcbiAgaW1nOiB0cnVlLFxuICBpbnB1dDogdHJ1ZSxcbiAga2V5Z2VuOiB0cnVlLFxuICBsaW5rOiB0cnVlLFxuICBtZXRhOiB0cnVlLFxuICBwYXJhbTogdHJ1ZSxcbiAgc291cmNlOiB0cnVlLFxuICB0cmFjazogdHJ1ZSxcbiAgd2JyOiB0cnVlIC8vIE5PVEU6IG1lbnVpdGVtJ3MgY2xvc2UgdGFnIHNob3VsZCBiZSBvbWl0dGVkLCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMuXG5cbn07XG5cbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IGFzc2lnbih7XG4gIG1lbnVpdGVtOiB0cnVlXG59LCBvbWl0dGVkQ2xvc2VUYWdzKTtcblxudmFyIEhUTUwgPSAnX19odG1sJztcblxuZnVuY3Rpb24gYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gTm90ZSB0aGUgdXNlIG9mIGA9PWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC5cblxuXG4gIGlmICh2b2lkRWxlbWVudFRhZ3NbdGFnXSkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsIHx8IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0YWcgKyBcIiBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIFwiICsgJ3VzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gJ29iamVjdCcgfHwgIShIVE1MIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIG11c3QgYmUgaW4gdGhlIGZvcm0gYHtfX2h0bWw6IC4uLn1gLiAnICsgJ1BsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgJyArICdmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLnN0eWxlICE9IG51bGwgJiYgdHlwZW9mIHByb3BzLnN0eWxlICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCAnICsgXCJub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgJ2VtJ319IHdoZW4gXCIgKyAndXNpbmcgSlNYLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7XG4gIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHN3aXRjaCAodGFnTmFtZSkge1xuICAgIC8vIFRoZXNlIGFyZSByZXNlcnZlZCBTVkcgYW5kIE1hdGhNTCBlbGVtZW50cy5cbiAgICAvLyBXZSBkb24ndCBtaW5kIHRoaXMgbGlzdCB0b28gbXVjaCBiZWNhdXNlIHdlIGV4cGVjdCBpdCB0byBuZXZlciBncm93LlxuICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byB0cmFjayB0aGUgbmFtZXNwYWNlIGluIGEgZmV3IHBsYWNlcyB3aGljaCBpcyBjb252b2x1dGVkLlxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjdXN0b20tZWxlbWVudHMtY29yZS1jb25jZXB0c1xuICAgIGNhc2UgJ2Fubm90YXRpb24teG1sJzpcbiAgICBjYXNlICdjb2xvci1wcm9maWxlJzpcbiAgICBjYXNlICdmb250LWZhY2UnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1zcmMnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS11cmknOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1mb3JtYXQnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1uYW1lJzpcbiAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoZSBIVE1MIG9yIFNWRyBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0LCBiZSBzdXJlIHRvXG4vLyBhbHNvIGFkZCB0aGVtIHRvIHRoaXMgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdCBuYW1lXG4vLyB3YXJuaW5ncy5cbnZhciBwb3NzaWJsZVN0YW5kYXJkTmFtZXMgPSB7XG4gIC8vIEhUTUxcbiAgYWNjZXB0OiAnYWNjZXB0JyxcbiAgYWNjZXB0Y2hhcnNldDogJ2FjY2VwdENoYXJzZXQnLFxuICAnYWNjZXB0LWNoYXJzZXQnOiAnYWNjZXB0Q2hhcnNldCcsXG4gIGFjY2Vzc2tleTogJ2FjY2Vzc0tleScsXG4gIGFjdGlvbjogJ2FjdGlvbicsXG4gIGFsbG93ZnVsbHNjcmVlbjogJ2FsbG93RnVsbFNjcmVlbicsXG4gIGFsdDogJ2FsdCcsXG4gIGFzOiAnYXMnLFxuICBhc3luYzogJ2FzeW5jJyxcbiAgYXV0b2NhcGl0YWxpemU6ICdhdXRvQ2FwaXRhbGl6ZScsXG4gIGF1dG9jb21wbGV0ZTogJ2F1dG9Db21wbGV0ZScsXG4gIGF1dG9jb3JyZWN0OiAnYXV0b0NvcnJlY3QnLFxuICBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnLFxuICBhdXRvcGxheTogJ2F1dG9QbGF5JyxcbiAgYXV0b3NhdmU6ICdhdXRvU2F2ZScsXG4gIGNhcHR1cmU6ICdjYXB0dXJlJyxcbiAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsXG4gIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnLFxuICBjaGFsbGVuZ2U6ICdjaGFsbGVuZ2UnLFxuICBjaGFyc2V0OiAnY2hhclNldCcsXG4gIGNoZWNrZWQ6ICdjaGVja2VkJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGNpdGU6ICdjaXRlJyxcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxuICBjbGFzc2lkOiAnY2xhc3NJRCcsXG4gIGNsYXNzbmFtZTogJ2NsYXNzTmFtZScsXG4gIGNvbHM6ICdjb2xzJyxcbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICBjb250ZW50OiAnY29udGVudCcsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG4gIGNvbnRleHRtZW51OiAnY29udGV4dE1lbnUnLFxuICBjb250cm9sczogJ2NvbnRyb2xzJyxcbiAgY29udHJvbHNsaXN0OiAnY29udHJvbHNMaXN0JyxcbiAgY29vcmRzOiAnY29vcmRzJyxcbiAgY3Jvc3NvcmlnaW46ICdjcm9zc09yaWdpbicsXG4gIGRhbmdlcm91c2x5c2V0aW5uZXJodG1sOiAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuICBkYXRhOiAnZGF0YScsXG4gIGRhdGV0aW1lOiAnZGF0ZVRpbWUnLFxuICBkZWZhdWx0OiAnZGVmYXVsdCcsXG4gIGRlZmF1bHRjaGVja2VkOiAnZGVmYXVsdENoZWNrZWQnLFxuICBkZWZhdWx0dmFsdWU6ICdkZWZhdWx0VmFsdWUnLFxuICBkZWZlcjogJ2RlZmVyJyxcbiAgZGlyOiAnZGlyJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGRpc2FibGVwaWN0dXJlaW5waWN0dXJlOiAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLFxuICBkaXNhYmxlcmVtb3RlcGxheWJhY2s6ICdkaXNhYmxlUmVtb3RlUGxheWJhY2snLFxuICBkb3dubG9hZDogJ2Rvd25sb2FkJyxcbiAgZHJhZ2dhYmxlOiAnZHJhZ2dhYmxlJyxcbiAgZW5jdHlwZTogJ2VuY1R5cGUnLFxuICBlbnRlcmtleWhpbnQ6ICdlbnRlcktleUhpbnQnLFxuICBmb3I6ICdodG1sRm9yJyxcbiAgZm9ybTogJ2Zvcm0nLFxuICBmb3JtbWV0aG9kOiAnZm9ybU1ldGhvZCcsXG4gIGZvcm1hY3Rpb246ICdmb3JtQWN0aW9uJyxcbiAgZm9ybWVuY3R5cGU6ICdmb3JtRW5jVHlwZScsXG4gIGZvcm1ub3ZhbGlkYXRlOiAnZm9ybU5vVmFsaWRhdGUnLFxuICBmb3JtdGFyZ2V0OiAnZm9ybVRhcmdldCcsXG4gIGZyYW1lYm9yZGVyOiAnZnJhbWVCb3JkZXInLFxuICBoZWFkZXJzOiAnaGVhZGVycycsXG4gIGhlaWdodDogJ2hlaWdodCcsXG4gIGhpZGRlbjogJ2hpZGRlbicsXG4gIGhpZ2g6ICdoaWdoJyxcbiAgaHJlZjogJ2hyZWYnLFxuICBocmVmbGFuZzogJ2hyZWZMYW5nJyxcbiAgaHRtbGZvcjogJ2h0bWxGb3InLFxuICBodHRwZXF1aXY6ICdodHRwRXF1aXYnLFxuICAnaHR0cC1lcXVpdic6ICdodHRwRXF1aXYnLFxuICBpY29uOiAnaWNvbicsXG4gIGlkOiAnaWQnLFxuICBpbWFnZXNpemVzOiAnaW1hZ2VTaXplcycsXG4gIGltYWdlc3Jjc2V0OiAnaW1hZ2VTcmNTZXQnLFxuICBpbm5lcmh0bWw6ICdpbm5lckhUTUwnLFxuICBpbnB1dG1vZGU6ICdpbnB1dE1vZGUnLFxuICBpbnRlZ3JpdHk6ICdpbnRlZ3JpdHknLFxuICBpczogJ2lzJyxcbiAgaXRlbWlkOiAnaXRlbUlEJyxcbiAgaXRlbXByb3A6ICdpdGVtUHJvcCcsXG4gIGl0ZW1yZWY6ICdpdGVtUmVmJyxcbiAgaXRlbXNjb3BlOiAnaXRlbVNjb3BlJyxcbiAgaXRlbXR5cGU6ICdpdGVtVHlwZScsXG4gIGtleXBhcmFtczogJ2tleVBhcmFtcycsXG4gIGtleXR5cGU6ICdrZXlUeXBlJyxcbiAga2luZDogJ2tpbmQnLFxuICBsYWJlbDogJ2xhYmVsJyxcbiAgbGFuZzogJ2xhbmcnLFxuICBsaXN0OiAnbGlzdCcsXG4gIGxvb3A6ICdsb29wJyxcbiAgbG93OiAnbG93JyxcbiAgbWFuaWZlc3Q6ICdtYW5pZmVzdCcsXG4gIG1hcmdpbndpZHRoOiAnbWFyZ2luV2lkdGgnLFxuICBtYXJnaW5oZWlnaHQ6ICdtYXJnaW5IZWlnaHQnLFxuICBtYXg6ICdtYXgnLFxuICBtYXhsZW5ndGg6ICdtYXhMZW5ndGgnLFxuICBtZWRpYTogJ21lZGlhJyxcbiAgbWVkaWFncm91cDogJ21lZGlhR3JvdXAnLFxuICBtZXRob2Q6ICdtZXRob2QnLFxuICBtaW46ICdtaW4nLFxuICBtaW5sZW5ndGg6ICdtaW5MZW5ndGgnLFxuICBtdWx0aXBsZTogJ211bHRpcGxlJyxcbiAgbXV0ZWQ6ICdtdXRlZCcsXG4gIG5hbWU6ICduYW1lJyxcbiAgbm9tb2R1bGU6ICdub01vZHVsZScsXG4gIG5vbmNlOiAnbm9uY2UnLFxuICBub3ZhbGlkYXRlOiAnbm9WYWxpZGF0ZScsXG4gIG9wZW46ICdvcGVuJyxcbiAgb3B0aW11bTogJ29wdGltdW0nLFxuICBwYXR0ZXJuOiAncGF0dGVybicsXG4gIHBsYWNlaG9sZGVyOiAncGxhY2Vob2xkZXInLFxuICBwbGF5c2lubGluZTogJ3BsYXlzSW5saW5lJyxcbiAgcG9zdGVyOiAncG9zdGVyJyxcbiAgcHJlbG9hZDogJ3ByZWxvYWQnLFxuICBwcm9maWxlOiAncHJvZmlsZScsXG4gIHJhZGlvZ3JvdXA6ICdyYWRpb0dyb3VwJyxcbiAgcmVhZG9ubHk6ICdyZWFkT25seScsXG4gIHJlZmVycmVycG9saWN5OiAncmVmZXJyZXJQb2xpY3knLFxuICByZWw6ICdyZWwnLFxuICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgcmV2ZXJzZWQ6ICdyZXZlcnNlZCcsXG4gIHJvbGU6ICdyb2xlJyxcbiAgcm93czogJ3Jvd3MnLFxuICByb3dzcGFuOiAncm93U3BhbicsXG4gIHNhbmRib3g6ICdzYW5kYm94JyxcbiAgc2NvcGU6ICdzY29wZScsXG4gIHNjb3BlZDogJ3Njb3BlZCcsXG4gIHNjcm9sbGluZzogJ3Njcm9sbGluZycsXG4gIHNlYW1sZXNzOiAnc2VhbWxlc3MnLFxuICBzZWxlY3RlZDogJ3NlbGVjdGVkJyxcbiAgc2hhcGU6ICdzaGFwZScsXG4gIHNpemU6ICdzaXplJyxcbiAgc2l6ZXM6ICdzaXplcycsXG4gIHNwYW46ICdzcGFuJyxcbiAgc3BlbGxjaGVjazogJ3NwZWxsQ2hlY2snLFxuICBzcmM6ICdzcmMnLFxuICBzcmNkb2M6ICdzcmNEb2MnLFxuICBzcmNsYW5nOiAnc3JjTGFuZycsXG4gIHNyY3NldDogJ3NyY1NldCcsXG4gIHN0YXJ0OiAnc3RhcnQnLFxuICBzdGVwOiAnc3RlcCcsXG4gIHN0eWxlOiAnc3R5bGUnLFxuICBzdW1tYXJ5OiAnc3VtbWFyeScsXG4gIHRhYmluZGV4OiAndGFiSW5kZXgnLFxuICB0YXJnZXQ6ICd0YXJnZXQnLFxuICB0aXRsZTogJ3RpdGxlJyxcbiAgdHlwZTogJ3R5cGUnLFxuICB1c2VtYXA6ICd1c2VNYXAnLFxuICB2YWx1ZTogJ3ZhbHVlJyxcbiAgd2lkdGg6ICd3aWR0aCcsXG4gIHdtb2RlOiAnd21vZGUnLFxuICB3cmFwOiAnd3JhcCcsXG4gIC8vIFNWR1xuICBhYm91dDogJ2Fib3V0JyxcbiAgYWNjZW50aGVpZ2h0OiAnYWNjZW50SGVpZ2h0JyxcbiAgJ2FjY2VudC1oZWlnaHQnOiAnYWNjZW50SGVpZ2h0JyxcbiAgYWNjdW11bGF0ZTogJ2FjY3VtdWxhdGUnLFxuICBhZGRpdGl2ZTogJ2FkZGl0aXZlJyxcbiAgYWxpZ25tZW50YmFzZWxpbmU6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gICdhbGlnbm1lbnQtYmFzZWxpbmUnOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICBhbGxvd3Jlb3JkZXI6ICdhbGxvd1Jlb3JkZXInLFxuICBhbHBoYWJldGljOiAnYWxwaGFiZXRpYycsXG4gIGFtcGxpdHVkZTogJ2FtcGxpdHVkZScsXG4gIGFyYWJpY2Zvcm06ICdhcmFiaWNGb3JtJyxcbiAgJ2FyYWJpYy1mb3JtJzogJ2FyYWJpY0Zvcm0nLFxuICBhc2NlbnQ6ICdhc2NlbnQnLFxuICBhdHRyaWJ1dGVuYW1lOiAnYXR0cmlidXRlTmFtZScsXG4gIGF0dHJpYnV0ZXR5cGU6ICdhdHRyaWJ1dGVUeXBlJyxcbiAgYXV0b3JldmVyc2U6ICdhdXRvUmV2ZXJzZScsXG4gIGF6aW11dGg6ICdhemltdXRoJyxcbiAgYmFzZWZyZXF1ZW5jeTogJ2Jhc2VGcmVxdWVuY3knLFxuICBiYXNlbGluZXNoaWZ0OiAnYmFzZWxpbmVTaGlmdCcsXG4gICdiYXNlbGluZS1zaGlmdCc6ICdiYXNlbGluZVNoaWZ0JyxcbiAgYmFzZXByb2ZpbGU6ICdiYXNlUHJvZmlsZScsXG4gIGJib3g6ICdiYm94JyxcbiAgYmVnaW46ICdiZWdpbicsXG4gIGJpYXM6ICdiaWFzJyxcbiAgYnk6ICdieScsXG4gIGNhbGNtb2RlOiAnY2FsY01vZGUnLFxuICBjYXBoZWlnaHQ6ICdjYXBIZWlnaHQnLFxuICAnY2FwLWhlaWdodCc6ICdjYXBIZWlnaHQnLFxuICBjbGlwOiAnY2xpcCcsXG4gIGNsaXBwYXRoOiAnY2xpcFBhdGgnLFxuICAnY2xpcC1wYXRoJzogJ2NsaXBQYXRoJyxcbiAgY2xpcHBhdGh1bml0czogJ2NsaXBQYXRoVW5pdHMnLFxuICBjbGlwcnVsZTogJ2NsaXBSdWxlJyxcbiAgJ2NsaXAtcnVsZSc6ICdjbGlwUnVsZScsXG4gIGNvbG9yOiAnY29sb3InLFxuICBjb2xvcmludGVycG9sYXRpb246ICdjb2xvckludGVycG9sYXRpb24nLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbic6ICdjb2xvckludGVycG9sYXRpb24nLFxuICBjb2xvcmludGVycG9sYXRpb25maWx0ZXJzOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gIGNvbG9ycHJvZmlsZTogJ2NvbG9yUHJvZmlsZScsXG4gICdjb2xvci1wcm9maWxlJzogJ2NvbG9yUHJvZmlsZScsXG4gIGNvbG9ycmVuZGVyaW5nOiAnY29sb3JSZW5kZXJpbmcnLFxuICAnY29sb3ItcmVuZGVyaW5nJzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgY29udGVudHNjcmlwdHR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScsXG4gIGNvbnRlbnRzdHlsZXR5cGU6ICdjb250ZW50U3R5bGVUeXBlJyxcbiAgY3Vyc29yOiAnY3Vyc29yJyxcbiAgY3g6ICdjeCcsXG4gIGN5OiAnY3knLFxuICBkOiAnZCcsXG4gIGRhdGF0eXBlOiAnZGF0YXR5cGUnLFxuICBkZWNlbGVyYXRlOiAnZGVjZWxlcmF0ZScsXG4gIGRlc2NlbnQ6ICdkZXNjZW50JyxcbiAgZGlmZnVzZWNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JyxcbiAgZGlyZWN0aW9uOiAnZGlyZWN0aW9uJyxcbiAgZGlzcGxheTogJ2Rpc3BsYXknLFxuICBkaXZpc29yOiAnZGl2aXNvcicsXG4gIGRvbWluYW50YmFzZWxpbmU6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgJ2RvbWluYW50LWJhc2VsaW5lJzogJ2RvbWluYW50QmFzZWxpbmUnLFxuICBkdXI6ICdkdXInLFxuICBkeDogJ2R4JyxcbiAgZHk6ICdkeScsXG4gIGVkZ2Vtb2RlOiAnZWRnZU1vZGUnLFxuICBlbGV2YXRpb246ICdlbGV2YXRpb24nLFxuICBlbmFibGViYWNrZ3JvdW5kOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gICdlbmFibGUtYmFja2dyb3VuZCc6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgZW5kOiAnZW5kJyxcbiAgZXhwb25lbnQ6ICdleHBvbmVudCcsXG4gIGV4dGVybmFscmVzb3VyY2VzcmVxdWlyZWQ6ICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgZmlsbDogJ2ZpbGwnLFxuICBmaWxsb3BhY2l0eTogJ2ZpbGxPcGFjaXR5JyxcbiAgJ2ZpbGwtb3BhY2l0eSc6ICdmaWxsT3BhY2l0eScsXG4gIGZpbGxydWxlOiAnZmlsbFJ1bGUnLFxuICAnZmlsbC1ydWxlJzogJ2ZpbGxSdWxlJyxcbiAgZmlsdGVyOiAnZmlsdGVyJyxcbiAgZmlsdGVycmVzOiAnZmlsdGVyUmVzJyxcbiAgZmlsdGVydW5pdHM6ICdmaWx0ZXJVbml0cycsXG4gIGZsb29kb3BhY2l0eTogJ2Zsb29kT3BhY2l0eScsXG4gICdmbG9vZC1vcGFjaXR5JzogJ2Zsb29kT3BhY2l0eScsXG4gIGZsb29kY29sb3I6ICdmbG9vZENvbG9yJyxcbiAgJ2Zsb29kLWNvbG9yJzogJ2Zsb29kQ29sb3InLFxuICBmb2N1c2FibGU6ICdmb2N1c2FibGUnLFxuICBmb250ZmFtaWx5OiAnZm9udEZhbWlseScsXG4gICdmb250LWZhbWlseSc6ICdmb250RmFtaWx5JyxcbiAgZm9udHNpemU6ICdmb250U2l6ZScsXG4gICdmb250LXNpemUnOiAnZm9udFNpemUnLFxuICBmb250c2l6ZWFkanVzdDogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgJ2ZvbnQtc2l6ZS1hZGp1c3QnOiAnZm9udFNpemVBZGp1c3QnLFxuICBmb250c3RyZXRjaDogJ2ZvbnRTdHJldGNoJyxcbiAgJ2ZvbnQtc3RyZXRjaCc6ICdmb250U3RyZXRjaCcsXG4gIGZvbnRzdHlsZTogJ2ZvbnRTdHlsZScsXG4gICdmb250LXN0eWxlJzogJ2ZvbnRTdHlsZScsXG4gIGZvbnR2YXJpYW50OiAnZm9udFZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50JzogJ2ZvbnRWYXJpYW50JyxcbiAgZm9udHdlaWdodDogJ2ZvbnRXZWlnaHQnLFxuICAnZm9udC13ZWlnaHQnOiAnZm9udFdlaWdodCcsXG4gIGZvcm1hdDogJ2Zvcm1hdCcsXG4gIGZyb206ICdmcm9tJyxcbiAgZng6ICdmeCcsXG4gIGZ5OiAnZnknLFxuICBnMTogJ2cxJyxcbiAgZzI6ICdnMicsXG4gIGdseXBobmFtZTogJ2dseXBoTmFtZScsXG4gICdnbHlwaC1uYW1lJzogJ2dseXBoTmFtZScsXG4gIGdseXBob3JpZW50YXRpb25ob3Jpem9udGFsOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCc6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gIGdseXBob3JpZW50YXRpb252ZXJ0aWNhbDogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCc6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICBnbHlwaHJlZjogJ2dseXBoUmVmJyxcbiAgZ3JhZGllbnR0cmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsXG4gIGdyYWRpZW50dW5pdHM6ICdncmFkaWVudFVuaXRzJyxcbiAgaGFuZ2luZzogJ2hhbmdpbmcnLFxuICBob3JpemFkdng6ICdob3JpekFkdlgnLFxuICAnaG9yaXotYWR2LXgnOiAnaG9yaXpBZHZYJyxcbiAgaG9yaXpvcmlnaW54OiAnaG9yaXpPcmlnaW5YJyxcbiAgJ2hvcml6LW9yaWdpbi14JzogJ2hvcml6T3JpZ2luWCcsXG4gIGlkZW9ncmFwaGljOiAnaWRlb2dyYXBoaWMnLFxuICBpbWFnZXJlbmRlcmluZzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgJ2ltYWdlLXJlbmRlcmluZyc6ICdpbWFnZVJlbmRlcmluZycsXG4gIGluMjogJ2luMicsXG4gIGluOiAnaW4nLFxuICBpbmxpc3Q6ICdpbmxpc3QnLFxuICBpbnRlcmNlcHQ6ICdpbnRlcmNlcHQnLFxuICBrMTogJ2sxJyxcbiAgazI6ICdrMicsXG4gIGszOiAnazMnLFxuICBrNDogJ2s0JyxcbiAgazogJ2snLFxuICBrZXJuZWxtYXRyaXg6ICdrZXJuZWxNYXRyaXgnLFxuICBrZXJuZWx1bml0bGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsXG4gIGtlcm5pbmc6ICdrZXJuaW5nJyxcbiAga2V5cG9pbnRzOiAna2V5UG9pbnRzJyxcbiAga2V5c3BsaW5lczogJ2tleVNwbGluZXMnLFxuICBrZXl0aW1lczogJ2tleVRpbWVzJyxcbiAgbGVuZ3RoYWRqdXN0OiAnbGVuZ3RoQWRqdXN0JyxcbiAgbGV0dGVyc3BhY2luZzogJ2xldHRlclNwYWNpbmcnLFxuICAnbGV0dGVyLXNwYWNpbmcnOiAnbGV0dGVyU3BhY2luZycsXG4gIGxpZ2h0aW5nY29sb3I6ICdsaWdodGluZ0NvbG9yJyxcbiAgJ2xpZ2h0aW5nLWNvbG9yJzogJ2xpZ2h0aW5nQ29sb3InLFxuICBsaW1pdGluZ2NvbmVhbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgbG9jYWw6ICdsb2NhbCcsXG4gIG1hcmtlcmVuZDogJ21hcmtlckVuZCcsXG4gICdtYXJrZXItZW5kJzogJ21hcmtlckVuZCcsXG4gIG1hcmtlcmhlaWdodDogJ21hcmtlckhlaWdodCcsXG4gIG1hcmtlcm1pZDogJ21hcmtlck1pZCcsXG4gICdtYXJrZXItbWlkJzogJ21hcmtlck1pZCcsXG4gIG1hcmtlcnN0YXJ0OiAnbWFya2VyU3RhcnQnLFxuICAnbWFya2VyLXN0YXJ0JzogJ21hcmtlclN0YXJ0JyxcbiAgbWFya2VydW5pdHM6ICdtYXJrZXJVbml0cycsXG4gIG1hcmtlcndpZHRoOiAnbWFya2VyV2lkdGgnLFxuICBtYXNrOiAnbWFzaycsXG4gIG1hc2tjb250ZW50dW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJyxcbiAgbWFza3VuaXRzOiAnbWFza1VuaXRzJyxcbiAgbWF0aGVtYXRpY2FsOiAnbWF0aGVtYXRpY2FsJyxcbiAgbW9kZTogJ21vZGUnLFxuICBudW1vY3RhdmVzOiAnbnVtT2N0YXZlcycsXG4gIG9mZnNldDogJ29mZnNldCcsXG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgb3BlcmF0b3I6ICdvcGVyYXRvcicsXG4gIG9yZGVyOiAnb3JkZXInLFxuICBvcmllbnQ6ICdvcmllbnQnLFxuICBvcmllbnRhdGlvbjogJ29yaWVudGF0aW9uJyxcbiAgb3JpZ2luOiAnb3JpZ2luJyxcbiAgb3ZlcmZsb3c6ICdvdmVyZmxvdycsXG4gIG92ZXJsaW5lcG9zaXRpb246ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgJ292ZXJsaW5lLXBvc2l0aW9uJzogJ292ZXJsaW5lUG9zaXRpb24nLFxuICBvdmVybGluZXRoaWNrbmVzczogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ292ZXJsaW5lLXRoaWNrbmVzcyc6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gIHBhaW50b3JkZXI6ICdwYWludE9yZGVyJyxcbiAgJ3BhaW50LW9yZGVyJzogJ3BhaW50T3JkZXInLFxuICBwYW5vc2UxOiAncGFub3NlMScsXG4gICdwYW5vc2UtMSc6ICdwYW5vc2UxJyxcbiAgcGF0aGxlbmd0aDogJ3BhdGhMZW5ndGgnLFxuICBwYXR0ZXJuY29udGVudHVuaXRzOiAncGF0dGVybkNvbnRlbnRVbml0cycsXG4gIHBhdHRlcm50cmFuc2Zvcm06ICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgcGF0dGVybnVuaXRzOiAncGF0dGVyblVuaXRzJyxcbiAgcG9pbnRlcmV2ZW50czogJ3BvaW50ZXJFdmVudHMnLFxuICAncG9pbnRlci1ldmVudHMnOiAncG9pbnRlckV2ZW50cycsXG4gIHBvaW50czogJ3BvaW50cycsXG4gIHBvaW50c2F0eDogJ3BvaW50c0F0WCcsXG4gIHBvaW50c2F0eTogJ3BvaW50c0F0WScsXG4gIHBvaW50c2F0ejogJ3BvaW50c0F0WicsXG4gIHByZWZpeDogJ3ByZWZpeCcsXG4gIHByZXNlcnZlYWxwaGE6ICdwcmVzZXJ2ZUFscGhhJyxcbiAgcHJlc2VydmVhc3BlY3RyYXRpbzogJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICBwcmltaXRpdmV1bml0czogJ3ByaW1pdGl2ZVVuaXRzJyxcbiAgcHJvcGVydHk6ICdwcm9wZXJ0eScsXG4gIHI6ICdyJyxcbiAgcmFkaXVzOiAncmFkaXVzJyxcbiAgcmVmeDogJ3JlZlgnLFxuICByZWZ5OiAncmVmWScsXG4gIHJlbmRlcmluZ2ludGVudDogJ3JlbmRlcmluZ0ludGVudCcsXG4gICdyZW5kZXJpbmctaW50ZW50JzogJ3JlbmRlcmluZ0ludGVudCcsXG4gIHJlcGVhdGNvdW50OiAncmVwZWF0Q291bnQnLFxuICByZXBlYXRkdXI6ICdyZXBlYXREdXInLFxuICByZXF1aXJlZGV4dGVuc2lvbnM6ICdyZXF1aXJlZEV4dGVuc2lvbnMnLFxuICByZXF1aXJlZGZlYXR1cmVzOiAncmVxdWlyZWRGZWF0dXJlcycsXG4gIHJlc291cmNlOiAncmVzb3VyY2UnLFxuICByZXN0YXJ0OiAncmVzdGFydCcsXG4gIHJlc3VsdDogJ3Jlc3VsdCcsXG4gIHJlc3VsdHM6ICdyZXN1bHRzJyxcbiAgcm90YXRlOiAncm90YXRlJyxcbiAgcng6ICdyeCcsXG4gIHJ5OiAncnknLFxuICBzY2FsZTogJ3NjYWxlJyxcbiAgc2VjdXJpdHk6ICdzZWN1cml0eScsXG4gIHNlZWQ6ICdzZWVkJyxcbiAgc2hhcGVyZW5kZXJpbmc6ICdzaGFwZVJlbmRlcmluZycsXG4gICdzaGFwZS1yZW5kZXJpbmcnOiAnc2hhcGVSZW5kZXJpbmcnLFxuICBzbG9wZTogJ3Nsb3BlJyxcbiAgc3BhY2luZzogJ3NwYWNpbmcnLFxuICBzcGVjdWxhcmNvbnN0YW50OiAnc3BlY3VsYXJDb25zdGFudCcsXG4gIHNwZWN1bGFyZXhwb25lbnQ6ICdzcGVjdWxhckV4cG9uZW50JyxcbiAgc3BlZWQ6ICdzcGVlZCcsXG4gIHNwcmVhZG1ldGhvZDogJ3NwcmVhZE1ldGhvZCcsXG4gIHN0YXJ0b2Zmc2V0OiAnc3RhcnRPZmZzZXQnLFxuICBzdGRkZXZpYXRpb246ICdzdGREZXZpYXRpb24nLFxuICBzdGVtaDogJ3N0ZW1oJyxcbiAgc3RlbXY6ICdzdGVtdicsXG4gIHN0aXRjaHRpbGVzOiAnc3RpdGNoVGlsZXMnLFxuICBzdG9wY29sb3I6ICdzdG9wQ29sb3InLFxuICAnc3RvcC1jb2xvcic6ICdzdG9wQ29sb3InLFxuICBzdG9wb3BhY2l0eTogJ3N0b3BPcGFjaXR5JyxcbiAgJ3N0b3Atb3BhY2l0eSc6ICdzdG9wT3BhY2l0eScsXG4gIHN0cmlrZXRocm91Z2hwb3NpdGlvbjogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJzogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gIHN0cmlrZXRocm91Z2h0aGlja25lc3M6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJzogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICBzdHJpbmc6ICdzdHJpbmcnLFxuICBzdHJva2U6ICdzdHJva2UnLFxuICBzdHJva2VkYXNoYXJyYXk6ICdzdHJva2VEYXNoYXJyYXknLFxuICAnc3Ryb2tlLWRhc2hhcnJheSc6ICdzdHJva2VEYXNoYXJyYXknLFxuICBzdHJva2VkYXNob2Zmc2V0OiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gICdzdHJva2UtZGFzaG9mZnNldCc6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgc3Ryb2tlbGluZWNhcDogJ3N0cm9rZUxpbmVjYXAnLFxuICAnc3Ryb2tlLWxpbmVjYXAnOiAnc3Ryb2tlTGluZWNhcCcsXG4gIHN0cm9rZWxpbmVqb2luOiAnc3Ryb2tlTGluZWpvaW4nLFxuICAnc3Ryb2tlLWxpbmVqb2luJzogJ3N0cm9rZUxpbmVqb2luJyxcbiAgc3Ryb2tlbWl0ZXJsaW1pdDogJ3N0cm9rZU1pdGVybGltaXQnLFxuICAnc3Ryb2tlLW1pdGVybGltaXQnOiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gIHN0cm9rZXdpZHRoOiAnc3Ryb2tlV2lkdGgnLFxuICAnc3Ryb2tlLXdpZHRoJzogJ3N0cm9rZVdpZHRoJyxcbiAgc3Ryb2tlb3BhY2l0eTogJ3N0cm9rZU9wYWNpdHknLFxuICAnc3Ryb2tlLW9wYWNpdHknOiAnc3Ryb2tlT3BhY2l0eScsXG4gIHN1cHByZXNzY29udGVudGVkaXRhYmxld2FybmluZzogJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsXG4gIHN1cHByZXNzaHlkcmF0aW9ud2FybmluZzogJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsXG4gIHN1cmZhY2VzY2FsZTogJ3N1cmZhY2VTY2FsZScsXG4gIHN5c3RlbWxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLFxuICB0YWJsZXZhbHVlczogJ3RhYmxlVmFsdWVzJyxcbiAgdGFyZ2V0eDogJ3RhcmdldFgnLFxuICB0YXJnZXR5OiAndGFyZ2V0WScsXG4gIHRleHRhbmNob3I6ICd0ZXh0QW5jaG9yJyxcbiAgJ3RleHQtYW5jaG9yJzogJ3RleHRBbmNob3InLFxuICB0ZXh0ZGVjb3JhdGlvbjogJ3RleHREZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbic6ICd0ZXh0RGVjb3JhdGlvbicsXG4gIHRleHRsZW5ndGg6ICd0ZXh0TGVuZ3RoJyxcbiAgdGV4dHJlbmRlcmluZzogJ3RleHRSZW5kZXJpbmcnLFxuICAndGV4dC1yZW5kZXJpbmcnOiAndGV4dFJlbmRlcmluZycsXG4gIHRvOiAndG8nLFxuICB0cmFuc2Zvcm06ICd0cmFuc2Zvcm0nLFxuICB0eXBlb2Y6ICd0eXBlb2YnLFxuICB1MTogJ3UxJyxcbiAgdTI6ICd1MicsXG4gIHVuZGVybGluZXBvc2l0aW9uOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICAndW5kZXJsaW5lLXBvc2l0aW9uJzogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgdW5kZXJsaW5ldGhpY2tuZXNzOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ3VuZGVybGluZS10aGlja25lc3MnOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgdW5pY29kZTogJ3VuaWNvZGUnLFxuICB1bmljb2RlYmlkaTogJ3VuaWNvZGVCaWRpJyxcbiAgJ3VuaWNvZGUtYmlkaSc6ICd1bmljb2RlQmlkaScsXG4gIHVuaWNvZGVyYW5nZTogJ3VuaWNvZGVSYW5nZScsXG4gICd1bmljb2RlLXJhbmdlJzogJ3VuaWNvZGVSYW5nZScsXG4gIHVuaXRzcGVyZW06ICd1bml0c1BlckVtJyxcbiAgJ3VuaXRzLXBlci1lbSc6ICd1bml0c1BlckVtJyxcbiAgdW5zZWxlY3RhYmxlOiAndW5zZWxlY3RhYmxlJyxcbiAgdmFscGhhYmV0aWM6ICd2QWxwaGFiZXRpYycsXG4gICd2LWFscGhhYmV0aWMnOiAndkFscGhhYmV0aWMnLFxuICB2YWx1ZXM6ICd2YWx1ZXMnLFxuICB2ZWN0b3JlZmZlY3Q6ICd2ZWN0b3JFZmZlY3QnLFxuICAndmVjdG9yLWVmZmVjdCc6ICd2ZWN0b3JFZmZlY3QnLFxuICB2ZXJzaW9uOiAndmVyc2lvbicsXG4gIHZlcnRhZHZ5OiAndmVydEFkdlknLFxuICAndmVydC1hZHYteSc6ICd2ZXJ0QWR2WScsXG4gIHZlcnRvcmlnaW54OiAndmVydE9yaWdpblgnLFxuICAndmVydC1vcmlnaW4teCc6ICd2ZXJ0T3JpZ2luWCcsXG4gIHZlcnRvcmlnaW55OiAndmVydE9yaWdpblknLFxuICAndmVydC1vcmlnaW4teSc6ICd2ZXJ0T3JpZ2luWScsXG4gIHZoYW5naW5nOiAndkhhbmdpbmcnLFxuICAndi1oYW5naW5nJzogJ3ZIYW5naW5nJyxcbiAgdmlkZW9ncmFwaGljOiAndklkZW9ncmFwaGljJyxcbiAgJ3YtaWRlb2dyYXBoaWMnOiAndklkZW9ncmFwaGljJyxcbiAgdmlld2JveDogJ3ZpZXdCb3gnLFxuICB2aWV3dGFyZ2V0OiAndmlld1RhcmdldCcsXG4gIHZpc2liaWxpdHk6ICd2aXNpYmlsaXR5JyxcbiAgdm1hdGhlbWF0aWNhbDogJ3ZNYXRoZW1hdGljYWwnLFxuICAndi1tYXRoZW1hdGljYWwnOiAndk1hdGhlbWF0aWNhbCcsXG4gIHZvY2FiOiAndm9jYWInLFxuICB3aWR0aHM6ICd3aWR0aHMnLFxuICB3b3Jkc3BhY2luZzogJ3dvcmRTcGFjaW5nJyxcbiAgJ3dvcmQtc3BhY2luZyc6ICd3b3JkU3BhY2luZycsXG4gIHdyaXRpbmdtb2RlOiAnd3JpdGluZ01vZGUnLFxuICAnd3JpdGluZy1tb2RlJzogJ3dyaXRpbmdNb2RlJyxcbiAgeDE6ICd4MScsXG4gIHgyOiAneDInLFxuICB4OiAneCcsXG4gIHhjaGFubmVsc2VsZWN0b3I6ICd4Q2hhbm5lbFNlbGVjdG9yJyxcbiAgeGhlaWdodDogJ3hIZWlnaHQnLFxuICAneC1oZWlnaHQnOiAneEhlaWdodCcsXG4gIHhsaW5rYWN0dWF0ZTogJ3hsaW5rQWN0dWF0ZScsXG4gICd4bGluazphY3R1YXRlJzogJ3hsaW5rQWN0dWF0ZScsXG4gIHhsaW5rYXJjcm9sZTogJ3hsaW5rQXJjcm9sZScsXG4gICd4bGluazphcmNyb2xlJzogJ3hsaW5rQXJjcm9sZScsXG4gIHhsaW5raHJlZjogJ3hsaW5rSHJlZicsXG4gICd4bGluazpocmVmJzogJ3hsaW5rSHJlZicsXG4gIHhsaW5rcm9sZTogJ3hsaW5rUm9sZScsXG4gICd4bGluazpyb2xlJzogJ3hsaW5rUm9sZScsXG4gIHhsaW5rc2hvdzogJ3hsaW5rU2hvdycsXG4gICd4bGluazpzaG93JzogJ3hsaW5rU2hvdycsXG4gIHhsaW5rdGl0bGU6ICd4bGlua1RpdGxlJyxcbiAgJ3hsaW5rOnRpdGxlJzogJ3hsaW5rVGl0bGUnLFxuICB4bGlua3R5cGU6ICd4bGlua1R5cGUnLFxuICAneGxpbms6dHlwZSc6ICd4bGlua1R5cGUnLFxuICB4bWxiYXNlOiAneG1sQmFzZScsXG4gICd4bWw6YmFzZSc6ICd4bWxCYXNlJyxcbiAgeG1sbGFuZzogJ3htbExhbmcnLFxuICAneG1sOmxhbmcnOiAneG1sTGFuZycsXG4gIHhtbG5zOiAneG1sbnMnLFxuICAneG1sOnNwYWNlJzogJ3htbFNwYWNlJyxcbiAgeG1sbnN4bGluazogJ3htbG5zWGxpbmsnLFxuICAneG1sbnM6eGxpbmsnOiAneG1sbnNYbGluaycsXG4gIHhtbHNwYWNlOiAneG1sU3BhY2UnLFxuICB5MTogJ3kxJyxcbiAgeTI6ICd5MicsXG4gIHk6ICd5JyxcbiAgeWNoYW5uZWxzZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLFxuICB6OiAneicsXG4gIHpvb21hbmRwYW46ICd6b29tQW5kUGFuJ1xufTtcblxudmFyIGFyaWFQcm9wZXJ0aWVzID0ge1xuICAnYXJpYS1jdXJyZW50JzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtZGVzY3JpcHRpb24nOiAwLFxuICAnYXJpYS1kZXRhaWxzJzogMCxcbiAgJ2FyaWEtZGlzYWJsZWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1oaWRkZW4nOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1pbnZhbGlkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEta2V5c2hvcnRjdXRzJzogMCxcbiAgJ2FyaWEtbGFiZWwnOiAwLFxuICAnYXJpYS1yb2xlZGVzY3JpcHRpb24nOiAwLFxuICAvLyBXaWRnZXQgQXR0cmlidXRlc1xuICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLFxuICAnYXJpYS1jaGVja2VkJzogMCxcbiAgJ2FyaWEtZXhwYW5kZWQnOiAwLFxuICAnYXJpYS1oYXNwb3B1cCc6IDAsXG4gICdhcmlhLWxldmVsJzogMCxcbiAgJ2FyaWEtbW9kYWwnOiAwLFxuICAnYXJpYS1tdWx0aWxpbmUnOiAwLFxuICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiAwLFxuICAnYXJpYS1vcmllbnRhdGlvbic6IDAsXG4gICdhcmlhLXBsYWNlaG9sZGVyJzogMCxcbiAgJ2FyaWEtcHJlc3NlZCc6IDAsXG4gICdhcmlhLXJlYWRvbmx5JzogMCxcbiAgJ2FyaWEtcmVxdWlyZWQnOiAwLFxuICAnYXJpYS1zZWxlY3RlZCc6IDAsXG4gICdhcmlhLXNvcnQnOiAwLFxuICAnYXJpYS12YWx1ZW1heCc6IDAsXG4gICdhcmlhLXZhbHVlbWluJzogMCxcbiAgJ2FyaWEtdmFsdWVub3cnOiAwLFxuICAnYXJpYS12YWx1ZXRleHQnOiAwLFxuICAvLyBMaXZlIFJlZ2lvbiBBdHRyaWJ1dGVzXG4gICdhcmlhLWF0b21pYyc6IDAsXG4gICdhcmlhLWJ1c3knOiAwLFxuICAnYXJpYS1saXZlJzogMCxcbiAgJ2FyaWEtcmVsZXZhbnQnOiAwLFxuICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtZHJvcGVmZmVjdCc6IDAsXG4gICdhcmlhLWdyYWJiZWQnOiAwLFxuICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlc1xuICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogMCxcbiAgJ2FyaWEtY29sY291bnQnOiAwLFxuICAnYXJpYS1jb2xpbmRleCc6IDAsXG4gICdhcmlhLWNvbHNwYW4nOiAwLFxuICAnYXJpYS1jb250cm9scyc6IDAsXG4gICdhcmlhLWRlc2NyaWJlZGJ5JzogMCxcbiAgJ2FyaWEtZXJyb3JtZXNzYWdlJzogMCxcbiAgJ2FyaWEtZmxvd3RvJzogMCxcbiAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsXG4gICdhcmlhLW93bnMnOiAwLFxuICAnYXJpYS1wb3NpbnNldCc6IDAsXG4gICdhcmlhLXJvd2NvdW50JzogMCxcbiAgJ2FyaWEtcm93aW5kZXgnOiAwLFxuICAnYXJpYS1yb3dzcGFuJzogMCxcbiAgJ2FyaWEtc2V0c2l6ZSc6IDBcbn07XG5cbnZhciB3YXJuZWRQcm9wZXJ0aWVzID0ge307XG52YXIgckFSSUEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciByQVJJQUNhbWVsID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyQVJJQUNhbWVsLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBhcmlhTmFtZSA9ICdhcmlhLScgKyBuYW1lLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgY29ycmVjdE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShhcmlhTmFtZSkgPyBhcmlhTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoY29ycmVjdE5hbWUgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBBUklBIGF0dHJpYnV0ZXMgZm9sbG93IHRoZSBwYXR0ZXJuIGFyaWEtKiBhbmQgbXVzdCBiZSBsb3dlcmNhc2UuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gY29ycmVjdE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgY29ycmVjdE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAockFSSUEudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IGxvd2VyQ2FzZWROYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gc3RhbmRhcmROYW1lKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgdmFyIGludmFsaWRQcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkodHlwZSwga2V5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIGludmFsaWRQcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gaW52YWxpZFByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3AgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTtcbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAodHlwZSAhPT0gJ2lucHV0JyAmJiB0eXBlICE9PSAndGV4dGFyZWEnICYmIHR5cGUgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BzICE9IG51bGwgJiYgcHJvcHMudmFsdWUgPT09IG51bGwgJiYgIWRpZFdhcm5WYWx1ZU51bGwpIHtcbiAgICAgIGRpZFdhcm5WYWx1ZU51bGwgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcgJiYgcHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBhcnJheSB3aGVuIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGB0cnVlYCAnICsgJ3RvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIHZhciB3YXJuZWRQcm9wZXJ0aWVzJDEgPSB7fTtcbiAgdmFyIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi87XG4gIHZhciBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLztcbiAgdmFyIHJBUklBJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbiAgdmFyIHJBUklBQ2FtZWwkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgdmFsdWUsIGV2ZW50UmVnaXN0cnkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLy8gVGhpcyBleGlzdHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIFJlYWN0RE9NRXZlbnRSZXBsYXlpbmdcbi8vIGFuZCBET01QbHVnaW5FdmVudFN5c3RlbS5cbnZhciBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xuZnVuY3Rpb24gc2V0UmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBldmVudDtcbn1cbmZ1bmN0aW9uIHJlc2V0UmVwbGF5aW5nRXZlbnQoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBub3QgYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG59XG5mdW5jdGlvbiBpc1JlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudCA9PT0gY3VycmVudFJlcGxheWluZ0V2ZW50O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gIC8vIEZhbGxiYWNrIHRvIG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgZm9yIElFOVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTA2XG4gIHZhciB0YXJnZXQgPSBuYXRpdmVFdmVudC50YXJnZXQgfHwgbmF0aXZlRXZlbnQuc3JjRWxlbWVudCB8fCB3aW5kb3c7IC8vIE5vcm1hbGl6ZSBTVkcgPHVzZT4gZWxlbWVudCBldmVudHMgIzQ5NjNcblxuICBpZiAodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSB7XG4gICAgdGFyZ2V0ID0gdGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50O1xuICB9IC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuXG4gIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfcHJvcGVydGllcy5odG1sXG5cblxuICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSBURVhUX05PREUgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldDtcbn1cblxudmFyIHJlc3RvcmVJbXBsID0gbnVsbDtcbnZhciByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbnZhciByZXN0b3JlUXVldWUgPSBudWxsO1xuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpIHtcbiAgLy8gV2UgcGVyZm9ybSB0aGlzIHRyYW5zbGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZVxuICAvLyBhbHdheXMgcmVjZWl2ZSB0aGUgY29ycmVjdCBmaWJlciBoZXJlXG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpO1xuXG4gIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIC8vIFVubW91bnRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVzdG9yZUltcGwgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJlc3RvcmVJbXBsZW1lbnRhdGlvbigpIG5lZWRzIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgYSB0YXJnZXQgZm9yIGNvbnRyb2xsZWQgJyArICdldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZmx1c2hTeW5jSW1wbCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICAvLyBUT0RPOiBSZXN0b3JlIHN0YXRlIGluIHRoZSBtaWNyb3Rhc2ssIGFmdGVyIHRoZSBkaXNjcmV0ZSB1cGRhdGVzIGZsdXNoLFxuICAgIC8vIGluc3RlYWQgb2YgZWFybHkgZmx1c2hpbmcgdGhlbSBoZXJlLlxuICAgIGZsdXNoU3luY0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBhLCBiKSB7XG4gIGlmIChpc0luc2lkZUV2ZW50SGFuZGxlcikge1xuICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlIGFub3RoZXIgYmF0Y2gsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdFxuICAgIC8vIGZ1bGx5IGNvbXBsZXRlcyBiZWZvcmUgcmVzdG9yaW5nIHN0YXRlLlxuICAgIHJldHVybiBmbihhLCBiKTtcbiAgfVxuXG4gIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkVXBkYXRlc0ltcGwoZm4sIGEsIGIpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn0gLy8gVE9ETzogUmVwbGFjZSB3aXRoIGZsdXNoU3luY1xuZnVuY3Rpb24gc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihfYmF0Y2hlZFVwZGF0ZXNJbXBsLCBfZGlzY3JldGVVcGRhdGVzSW1wbCwgX2ZsdXNoU3luY0ltcGwpIHtcbiAgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRVcGRhdGVzSW1wbDtcbiAgZmx1c2hTeW5jSW1wbCA9IF9mbHVzaFN5bmNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lciAmJiB0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBgXCIgKyByZWdpc3RyYXRpb25OYW1lICsgXCJgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYFwiICsgdHlwZW9mIGxpc3RlbmVyICsgXCJgIHR5cGUuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGRvY3VtZW50ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBkb2N1bWVudGAgZ2xvYmFsIHdhcyBkZWZpbmVkIHdoZW4gUmVhY3Qgd2FzIGluaXRpYWxpemVkLCBidXQgaXMgbm90ICcgKyAnZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50ICcgKyAnc2NoZWR1bGVzIGFuIHVwZGF0ZSBmcm9tIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgYnV0IHRoZSB0ZXN0IGhhcyBhbHJlYWR5ICcgKyAnZmluaXNoZWQgcnVubmluZy4gVG8gc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgdW5tb3VudCB0aGUgY29tcG9uZW50IGF0ICcgKyAndGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0ICcgKyAnY2FuY2VsZWQgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YCksIG9yIHlvdSBjYW4gY2hhbmdlIHRoZSB0ZXN0IGl0c2VsZiAnICsgJ3RvIGJlIGFzeW5jaHJvbm91cy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignQW4gZXJyb3Igd2FzIHRocm93biBpbnNpZGUgb25lIG9mIHlvdXIgY29tcG9uZW50cywgYnV0IFJlYWN0ICcgKyBcImRvZXNuJ3Qga25vdyB3aGF0IGl0IHdhcy4gVGhpcyBpcyBsaWtlbHkgZHVlIHRvIGJyb3dzZXIgXCIgKyAnZmxha2luZXNzLiBSZWFjdCBkb2VzIGl0cyBiZXN0IHRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uICcgKyAnZXhjZXB0aW9uc1wiIGJlaGF2aW9yIG9mIHRoZSBEZXZUb29scywgd2hpY2ggcmVxdWlyZXMgc29tZSAnICsgXCJERVYtbW9kZSBvbmx5IHRyaWNrcy4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXNlIGRvbid0IHdvcmsgaW4gXCIgKyAneW91ciBicm93c2VyLiBUcnkgdHJpZ2dlcmluZyB0aGUgZXJyb3IgaW4gcHJvZHVjdGlvbiBtb2RlLCAnICsgJ29yIHN3aXRjaGluZyB0byBhIG1vZGVybiBicm93c2VyLiBJZiB5b3Ugc3VzcGVjdCB0aGF0IHRoaXMgaXMgJyArICdhY3R1YWxseSBhbiBpc3N1ZSB3aXRoIFJlYWN0LCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Nyb3NzT3JpZ2luRXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQSBjcm9zcy1vcmlnaW4gZXJyb3Igd2FzIHRocm93bi4gUmVhY3QgZG9lc24ndCBoYXZlIGFjY2VzcyB0byBcIiArICd0aGUgYWN0dWFsIGVycm9yIG9iamVjdCBpbiBkZXZlbG9wbWVudC4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Nyb3Nzb3JpZ2luLWVycm9yIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgIH0gLy8gUmVtb3ZlIG91ciBldmVudCBsaXN0ZW5lcnNcblxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG5cbiAgICAgIGlmICghZGlkQ2FsbCkge1xuICAgICAgICAvLyBTb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcsIGFuZCBvdXIgZXZlbnQgd2FzIG5vdCBkaXNwYXRjaGVkLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NzM0XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY1ODVcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBwcm9kdWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm4gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMSA9IGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGw7XG5cbnZhciBoYXNFcnJvciA9IGZhbHNlO1xudmFyIGNhdWdodEVycm9yID0gbnVsbDsgLy8gVXNlZCBieSBldmVudCBzeXN0ZW0gdG8gY2FwdHVyZS9yZXRocm93IHRoZSBmaXJzdCBlcnJvci5cblxudmFyIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xudmFyIHJldGhyb3dFcnJvciA9IG51bGw7XG52YXIgcmVwb3J0ZXIgPSB7XG4gIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59O1xuLyoqXG4gKiBDYWxsIGEgZnVuY3Rpb24gd2hpbGUgZ3VhcmRpbmcgYWdhaW5zdCBlcnJvcnMgdGhhdCBoYXBwZW5zIHdpdGhpbiBpdC5cbiAqIFJldHVybnMgYW4gZXJyb3IgaWYgaXQgdGhyb3dzLCBvdGhlcndpc2UgbnVsbC5cbiAqXG4gKiBJbiBwcm9kdWN0aW9uLCB0aGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgdHJ5LWNhdGNoLiBUaGUgcmVhc29uIHdlIGRvbid0XG4gKiB1c2UgYSB0cnktY2F0Y2ggZGlyZWN0bHkgaXMgc28gdGhhdCB3ZSBjYW4gc3dhcCBvdXQgYSBkaWZmZXJlbnRcbiAqIGltcGxlbWVudGF0aW9uIGluIERFViBtb2RlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBoYXNFcnJvciA9IGZhbHNlO1xuICBjYXVnaHRFcnJvciA9IG51bGw7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMS5hcHBseShyZXBvcnRlciwgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogU2FtZSBhcyBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGJ1dCBpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvciwgaXQgc3RvcmVzXG4gKiBpdCBpbiBhIGdsb2JhbCBzbyBpdCBjYW4gYmUgcmV0aHJvd24gYnkgYHJldGhyb3dDYXVnaHRFcnJvcmAgbGF0ZXIuXG4gKiBUT0RPOiBTZWUgaWYgY2F1Z2h0RXJyb3IgYW5kIHJldGhyb3dFcnJvciBjYW4gYmUgdW5pZmllZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgaWYgKCFoYXNSZXRocm93RXJyb3IpIHtcbiAgICAgIGhhc1JldGhyb3dFcnJvciA9IHRydWU7XG4gICAgICByZXRocm93RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gKiB3ZSB3aWxsIHJldGhyb3cgdG8gYmUgaGFuZGxlZCBieSB0aGUgdG9wIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gKi9cblxuZnVuY3Rpb24gcmV0aHJvd0NhdWdodEVycm9yKCkge1xuICBpZiAoaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gcmV0aHJvd0Vycm9yO1xuICAgIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xuICAgIHJldGhyb3dFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NhdWdodEVycm9yKCkge1xuICByZXR1cm4gaGFzRXJyb3I7XG59XG5mdW5jdGlvbiBjbGVhckNhdWdodEVycm9yKCkge1xuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjYXVnaHRFcnJvcjtcbiAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgIGNhdWdodEVycm9yID0gbnVsbDtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhckNhdWdodEVycm9yIHdhcyBjYWxsZWQgYnV0IG5vIGVycm9yIHdhcyBjYXB0dXJlZC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBDaGlsZERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBDb250ZW50UmVzZXQgPVxuLyogICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBDYWxsYmFjayA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBEaWRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgRm9yY2VDbGllbnRSZW5kZXIgPVxuLyogICAgICAgICAgICAqL1xuMjU2O1xudmFyIFJlZiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBTbmFwc2hvdCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFBhc3NpdmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBWaXNpYmlsaXR5ID1cbi8qICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFN0b3JlQ29uc2lzdGVuY3kgPVxuLyogICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIExpZmVjeWNsZUVmZmVjdE1hc2sgPSBQYXNzaXZlIHwgVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBTbmFwc2hvdCB8IFN0b3JlQ29uc2lzdGVuY3k7IC8vIFVuaW9uIG9mIGFsbCBjb21taXQgZmxhZ3MgKGZsYWdzIHdpdGggdGhlIGxpZmV0aW1lIG9mIGEgcGFydGljdWxhciBjb21taXQpXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4zMjc2NzsgLy8gVGhlc2UgYXJlIG5vdCByZWFsbHkgc2lkZSBlZmZlY3RzLCBidXQgd2Ugc3RpbGwgcmV1c2UgdGhpcyBmaWVsZC5cblxudmFyIEluY29tcGxldGUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFNob3VsZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjEzMTA3MjtcbnZhciBGb3JrZWQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuLy8gZS5nLiBhIGZpYmVyIHVzZXMgYSBwYXNzaXZlIGVmZmVjdCAoZXZlbiBpZiB0aGVyZSBhcmUgbm8gdXBkYXRlcyBvbiB0aGlzIHBhcnRpY3VsYXIgcmVuZGVyKS5cbi8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZWZlciBtb3JlIHdvcmsgaW4gdGhlIHVubW91bnQgY2FzZSxcbi8vIHNpbmNlIHdlIGNhbiBkZWZlciB0cmF2ZXJzaW5nIHRoZSB0cmVlIGR1cmluZyBsYXlvdXQgdG8gbG9vayBmb3IgUGFzc2l2ZSBlZmZlY3RzLFxuLy8gYW5kIGluc3RlYWQgcmVseSBvbiB0aGUgc3RhdGljIGZsYWcgYXMgYSBzaWduYWwgdGhhdCB0aGVyZSBtYXkgYmUgY2xlYW51cCB3b3JrLlxuXG52YXIgUmVmU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBMYXlvdXRTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFBhc3NpdmVTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7IC8vIFRoZXNlIGZsYWdzIGFsbG93IHVzIHRvIHRyYXZlcnNlIHRvIGZpYmVycyB0aGF0IGhhdmUgZWZmZWN0cyBvbiBtb3VudFxuLy8gd2l0aG91dCB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgdHJlZSBhZnRlciBldmVyeSBjb21taXQgZm9yXG4vLyBkb3VibGUgaW52b2tpbmdcblxudmFyIE1vdW50TGF5b3V0RGV2ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIE1vdW50UGFzc2l2ZURldiA9XG4vKiAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyOyAvLyBHcm91cHMgb2YgZmxhZ3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgY29tbWl0IHBoYXNlIHRvIHNraXAgb3ZlciB0cmVlcyB0aGF0XG4vLyBkb24ndCBjb250YWluIGVmZmVjdHMsIGJ5IGNoZWNraW5nIHN1YnRyZWVGbGFncy5cblxudmFyIEJlZm9yZU11dGF0aW9uTWFzayA9IC8vIFRPRE86IFJlbW92ZSBVcGRhdGUgZmxhZyBmcm9tIGJlZm9yZSBtdXRhdGlvbiBwaGFzZSBieSByZS1sYW5kaW5nIFZpc2liaWxpdHlcbi8vIGZsYWcgbG9naWMgKHNlZSAjMjAwNDMpXG5VcGRhdGUgfCBTbmFwc2hvdCB8ICggMCk7XG52YXIgTXV0YXRpb25NYXNrID0gUGxhY2VtZW50IHwgVXBkYXRlIHwgQ2hpbGREZWxldGlvbiB8IENvbnRlbnRSZXNldCB8IFJlZiB8IEh5ZHJhdGluZyB8IFZpc2liaWxpdHk7XG52YXIgTGF5b3V0TWFzayA9IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgVmlzaWJpbGl0eTsgLy8gVE9ETzogU3BsaXQgaW50byBQYXNzaXZlTW91bnRNYXNrIGFuZCBQYXNzaXZlVW5tb3VudE1hc2tcblxudmFyIFBhc3NpdmVNYXNrID0gUGFzc2l2ZSB8IENoaWxkRGVsZXRpb247IC8vIFVuaW9uIG9mIHRhZ3MgdGhhdCBkb24ndCBnZXQgcmVzZXQgb24gY2xvbmVzLlxuLy8gVGhpcyBhbGxvd3MgY2VydGFpbiBjb25jZXB0cyB0byBwZXJzaXN0IHdpdGhvdXQgcmVjYWxjdWxhdGluZyB0aGVtLFxuLy8gZS5nLiB3aGV0aGVyIGEgc3VidHJlZSBjb250YWlucyBwYXNzaXZlIGVmZmVjdHMgb3IgcG9ydGFscy5cblxudmFyIFN0YXRpY01hc2sgPSBMYXlvdXRTdGF0aWMgfCBQYXNzaXZlU3RhdGljIHwgUmVmU3RhdGljO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXJGaWJlcikgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgaWYgKCFmaWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzTW91bnRlZChmaWJlcikge1xuICBpZiAoZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgIT09IGZpYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBmaWJlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIElmIHdlIGhhdmUgdHdvIHBvc3NpYmxlIGJyYW5jaGVzLCB3ZSdsbCB3YWxrIGJhY2t3YXJkcyB1cCB0byB0aGUgcm9vdFxuICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlcyBhbmQgd2UnbGwgZGVhbCB3aXRoIHRoZW0uXG5cblxuICB2YXIgYSA9IGZpYmVyO1xuICB2YXIgYiA9IGFsdGVybmF0ZTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG5cbiAgICBpZiAocGFyZW50QSA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50QiA9IHBhcmVudEEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKHBhcmVudEIgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZXJlIGlzIG5vIGFsdGVybmF0ZS4gVGhpcyBpcyBhbiB1bnVzdWFsIGNhc2UuIEN1cnJlbnRseSwgaXQgb25seVxuICAgICAgLy8gaGFwcGVucyB3aGVuIGEgU3VzcGVuc2UgY29tcG9uZW50IGlzIGhpZGRlbi4gQW4gZXh0cmEgZnJhZ21lbnQgZmliZXJcbiAgICAgIC8vIGlzIGluc2VydGVkIGluIGJldHdlZW4gdGhlIFN1c3BlbnNlIGZpYmVyIGFuZCBpdHMgY2hpbGRyZW4uIFNraXBcbiAgICAgIC8vIG92ZXIgdGhpcyBleHRyYSBmcmFnbWVudCBmaWJlciBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBwYXJlbnQuXG4gICAgICB2YXIgbmV4dFBhcmVudCA9IHBhcmVudEEucmV0dXJuO1xuXG4gICAgICBpZiAobmV4dFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBhID0gYiA9IG5leHRQYXJlbnQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UncmUgYXQgdGhlIHJvb3QuXG5cblxuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiBib3RoIGNvcGllcyBvZiB0aGUgcGFyZW50IGZpYmVyIHBvaW50IHRvIHRoZSBzYW1lIGNoaWxkLCB3ZSBjYW5cbiAgICAvLyBhc3N1bWUgdGhhdCB0aGUgY2hpbGQgaXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgYmFpbG91dCBvbiBsb3dcbiAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuXG5cblxuICAgIGlmIChwYXJlbnRBLmNoaWxkID09PSBwYXJlbnRCLmNoaWxkKSB7XG4gICAgICB2YXIgY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBhKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQiBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBhbHRlcm5hdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9IC8vIFdlIHNob3VsZCBuZXZlciBoYXZlIGFuIGFsdGVybmF0ZSBmb3IgYW55IG1vdW50aW5nIG5vZGUuIFNvIHRoZSBvbmx5XG4gICAgICAvLyB3YXkgdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gaXMgaWYgdGhpcyB3YXMgdW5tb3VudGVkLCBpZiBhdCBhbGwuXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGEucmV0dXJuICE9PSBiLnJldHVybikge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudFxuICAgICAgLy8gZmliZXJzLiBXZSBhc3N1bWUgdGhhdCByZXR1cm4gcG9pbnRlcnMgbmV2ZXIgY3Jpc3MtY3Jvc3MsIHNvIEEgbXVzdFxuICAgICAgLy8gYmVsb25nIHRvIHRoZSBjaGlsZCBzZXQgb2YgQS5yZXR1cm4sIGFuZCBCIG11c3QgYmVsb25nIHRvIHRoZSBjaGlsZFxuICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLlxuICAgICAgYSA9IHBhcmVudEE7XG4gICAgICBiID0gcGFyZW50QjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBmaWJlci4gV2UnbGwgaGF2ZSB0byB1c2UgdGhlXG4gICAgICAvLyBkZWZhdWx0LCBzbG93IHBhdGg6IHNjYW4gdGhlIGNoaWxkIHNldHMgb2YgZWFjaCBwYXJlbnQgYWx0ZXJuYXRlIHRvIHNlZVxuICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuXG4gICAgICAvL1xuICAgICAgLy8gU2VhcmNoIHBhcmVudCBBJ3MgY2hpbGQgc2V0XG4gICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7XG4gICAgICB2YXIgX2NoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQidzIGNoaWxkIHNldFxuICAgICAgICBfY2hpbGQgPSBwYXJlbnRCLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2hpbGQgd2FzIG5vdCBmb3VuZCBpbiBlaXRoZXIgcGFyZW50IHNldC4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgJyArICdpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYS5hbHRlcm5hdGUgIT09IGIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJldHVybiBmaWJlcnMgc2hvdWxkIGFsd2F5cyBiZSBlYWNoIG90aGVycycgYWx0ZXJuYXRlcy4gXCIgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH0gLy8gSWYgdGhlIHJvb3QgaXMgbm90IGEgaG9zdCBjb250YWluZXIsIHdlJ3JlIGluIGEgZGlzY29ubmVjdGVkIHRyZWUuIEkuZS5cbiAgLy8gdW5tb3VudGVkLlxuXG5cbiAgaWYgKGEudGFnICE9PSBIb3N0Um9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG5cbiAgaWYgKGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEpIHtcbiAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIE90aGVyd2lzZSBCIGhhcyB0byBiZSBjdXJyZW50IGJyYW5jaC5cblxuXG4gIHJldHVybiBhbHRlcm5hdGU7XG59XG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcihwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGNoaWxkKTtcblxuICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgaWYgKGNoaWxkLnRhZyAhPT0gSG9zdFBvcnRhbCkge1xuICAgICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjaGlsZCk7XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRoaXMgbW9kdWxlIG9ubHkgZXhpc3RzIGFzIGFuIEVTTSB3cmFwcGVyIGFyb3VuZCB0aGUgZXh0ZXJuYWwgQ29tbW9uSlNcbnZhciBzY2hlZHVsZUNhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG52YXIgY2FuY2VsQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG52YXIgc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQ7XG52YXIgcmVxdWVzdFBhaW50ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3JlcXVlc3RQYWludDtcbnZhciBub3cgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGdldEN1cnJlbnRQcmlvcml0eUxldmVsID0gU2NoZWR1bGVyLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5O1xudmFyIE5vcm1hbFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5O1xudmFyIExvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5O1xudmFyIElkbGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JZGxlUHJpb3JpdHk7XG4vLyB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3Qgb24gdGhlIHNjaGVkdWxlciwgYnV0IGl0ICpkb2VzKlxuLy8gb24gc2NoZWR1bGVyL3Vuc3RhYmxlX21vY2ssIHdoaWNoIHdlJ2xsIG5lZWQgZm9yIGludGVybmFsIHRlc3RpbmdcbnZhciB1bnN0YWJsZV95aWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWU7XG52YXIgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWU7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAvLyBDb25kaXRpb25hbGx5IGluamVjdCB0aGVzZSBob29rcyBvbmx5IGlmIFRpbWVsaW5lIHByb2ZpbGVyIGlzIHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkLlxuICAgICAgLy8gVGhpcyBnaXZlcyBEZXZUb29scyBhIHdheSB0byBmZWF0dXJlIGRldGVjdCB0aGF0IGlzbid0IHRpZWQgdG8gdmVyc2lvbiBudW1iZXJcbiAgICAgIC8vIChzaW5jZSBwcm9maWxpbmcgYW5kIHRpbWVsaW5lIGFyZSBjb250cm9sbGVkIGJ5IGRpZmZlcmVudCBmZWF0dXJlIGZsYWdzKS5cbiAgICAgIGludGVybmFscyA9IGFzc2lnbih7fSwgaW50ZXJuYWxzLCB7XG4gICAgICAgIGdldExhbmVMYWJlbE1hcDogZ2V0TGFuZUxhYmVsTWFwLFxuICAgICAgICBpbmplY3RQcm9maWxpbmdIb29rczogaW5qZWN0UHJvZmlsaW5nSG9va3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcmVySUQgPSBob29rLmluamVjdChpbnRlcm5hbHMpOyAvLyBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBpbmplY3RlZCwgc28gbm93IGl0IGlzIHNhZmUgdG8gc2V0IHVwIGhvb2tzLlxuXG4gICAgaW5qZWN0ZWRIb29rID0gaG9vaztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBiZWNhdXNlIGl0IGlzIHVuc2FmZSB0byB0aHJvdyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMuJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaG9vay5jaGVja0RDRSkge1xuICAgIC8vIFRoaXMgaXMgdGhlIHJlYWwgRGV2VG9vbHMuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBob29rIGluc3RhbGxlZCBieSBGYXN0IFJlZnJlc2ggcnVudGltZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG9uU2NoZWR1bGVSb290KHJvb3QsIGNoaWxkcmVuKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgY2hpbGRyZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICggIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3Qocm9vdCwgZXZlbnRQcmlvcml0eSkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGRpZEVycm9yID0gKHJvb3QuY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBEaWRDYXB0dXJlO1xuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHk7XG5cbiAgICAgICAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBzY2hlZHVsZXJQcmlvcml0eSwgZGlkRXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHVuZGVmaW5lZCwgZGlkRXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblBvc3RDb21taXRSb290KHJvb3QpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFVubW91bnQoZmliZXIpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudChyZW5kZXJlcklELCBmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKG5ld0lzU3RyaWN0TW9kZSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiB1bnN0YWJsZV95aWVsZFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBXZSdyZSBpbiBhIHRlc3QgYmVjYXVzZSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZSBvbmx5IGV4aXN0c1xuICAgICAgLy8gaW4gU2NoZWR1bGVyTW9jay4gVG8gcmVkdWNlIHRoZSBub2lzZSBpbiBzdHJpY3QgbW9kZSB0ZXN0cyxcbiAgICAgIC8vIHN1cHByZXNzIHdhcm5pbmdzIGFuZCBkaXNhYmxlIHNjaGVkdWxlciB5aWVsZGluZyBkdXJpbmcgdGhlIGRvdWJsZSByZW5kZXJcbiAgICAgIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICBzZXRTdXBwcmVzc1dhcm5pbmcobmV3SXNTdHJpY3RNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUocmVuZGVyZXJJRCwgbmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFByb2ZpbGVyIEFQSSBob29rc1xuXG5mdW5jdGlvbiBpbmplY3RQcm9maWxpbmdIb29rcyhwcm9maWxpbmdIb29rcykge1xuICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gcHJvZmlsaW5nSG9va3M7XG59XG5cbmZ1bmN0aW9uIGdldExhbmVMYWJlbE1hcCgpIHtcbiAge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGxhbmUgPSAxO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IFRvdGFsTGFuZXM7IGluZGV4KyspIHtcbiAgICAgIHZhciBsYWJlbCA9IGdldExhYmVsRm9yTGFuZShsYW5lKTtcbiAgICAgIG1hcC5zZXQobGFuZSwgbGFiZWwpO1xuICAgICAgbGFuZSAqPSAyO1xuICAgIH1cblxuICAgIHJldHVybiBtYXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21taXRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJZaWVsZGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBOb01vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7IC8vIFRPRE86IFJlbW92ZSBDb25jdXJyZW50TW9kZSBieSByZWFkaW5nIGZyb20gdGhlIHJvb3QgdGFnIGluc3RlYWRcblxudmFyIENvbmN1cnJlbnRNb2RlID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBQcm9maWxlTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgU3RyaWN0TGVnYWN5TW9kZSA9XG4vKiAgICAgICAgICAgICAgICovXG44O1xudmFyIFN0cmljdEVmZmVjdHNNb2RlID1cbi8qICAgICAgICAgICAgICAqL1xuMTY7XG5cbi8vIFRPRE86IFRoaXMgaXMgcHJldHR5IHdlbGwgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzLiBNYXliZSB3ZSBjYW4gZHJvcCBpdC5cbnZhciBjbHozMiA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogY2x6MzJGYWxsYmFjazsgLy8gQ291bnQgbGVhZGluZyB6ZXJvcy5cbi8vIEJhc2VkIG9uOlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9jbHozMlxuXG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE4yID0gTWF0aC5MTjI7XG5cbmZ1bmN0aW9uIGNsejMyRmFsbGJhY2soeCkge1xuICB2YXIgYXNVaW50ID0geCA+Pj4gMDtcblxuICBpZiAoYXNVaW50ID09PSAwKSB7XG4gICAgcmV0dXJuIDMyO1xuICB9XG5cbiAgcmV0dXJuIDMxIC0gKGxvZyhhc1VpbnQpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJZiB0aG9zZSB2YWx1ZXMgYXJlIGNoYW5nZWQgdGhhdCBwYWNrYWdlIHNob3VsZCBiZSByZWJ1aWx0IGFuZCByZWRlcGxveWVkLlxuXG52YXIgVG90YWxMYW5lcyA9IDMxO1xudmFyIE5vTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBOb0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFN5bmNMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAqL1xuMjtcbnZhciBJbnB1dENvbnRpbnVvdXNMYW5lID1cbi8qICAgICAgICAgICAgICovXG40O1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjg7XG52YXIgRGVmYXVsdExhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIFRyYW5zaXRpb25MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQyNDA7XG52YXIgVHJhbnNpdGlvbkxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIFRyYW5zaXRpb25MYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgVHJhbnNpdGlvbkxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBUcmFuc2l0aW9uTGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFRyYW5zaXRpb25MYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFRyYW5zaXRpb25MYW5lNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIFRyYW5zaXRpb25MYW5lNyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFRyYW5zaXRpb25MYW5lOCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFRyYW5zaXRpb25MYW5lOSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBUcmFuc2l0aW9uTGFuZTEwID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgVHJhbnNpdGlvbkxhbmUxMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIFRyYW5zaXRpb25MYW5lMTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMzEwNzI7XG52YXIgVHJhbnNpdGlvbkxhbmUxMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2MjE0NDtcbnZhciBUcmFuc2l0aW9uTGFuZTE0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTI0Mjg4O1xudmFyIFRyYW5zaXRpb25MYW5lMTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2O1xudmFyIFRyYW5zaXRpb25MYW5lMTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIFJldHJ5TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMDAyMzQyNDtcbnZhciBSZXRyeUxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBSZXRyeUxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuODM4ODYwODtcbnZhciBSZXRyeUxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgUmV0cnlMYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFJldHJ5TGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42NzEwODg2NDtcbnZhciBTb21lUmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICovXG4xMzQyMTc3Mjg7XG52YXIgTm9uSWRsZUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU1O1xudmFyIElkbGVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NjtcbnZhciBJZGxlTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MzY4NzA5MTI7XG52YXIgT2Zmc2NyZWVuTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTA3Mzc0MTgyNDsgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZXhwZXJpbWVudGFsIHRpbWVsaW5lIChyZWFjdC1kZXZ0b29scy10aW1lbGluZSlcbi8vIEl0IHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgTGFuZXMgdmFsdWVzIGFib3ZlLlxuXG5mdW5jdGlvbiBnZXRMYWJlbEZvckxhbmUobGFuZSkge1xuICB7XG4gICAgaWYgKGxhbmUgJiBTeW5jTGFuZSkge1xuICAgICAgcmV0dXJuICdTeW5jJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0xhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHRIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdExhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdCc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFJldHJ5TGFuZXMpIHtcbiAgICAgIHJldHVybiAnUmV0cnknO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdTZWxlY3RpdmVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcbiAgICB9XG4gIH1cbn1cbnZhciBOb1RpbWVzdGFtcCA9IC0xO1xudmFyIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbnZhciBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgc3dpdGNoIChnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgICByZXR1cm4gU3luY0xhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNMYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdExhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIHJldHVybiBsYW5lcyAmIFJldHJ5TGFuZXM7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgcmV0dXJuIElkbGVMYW5lO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICAgICAgcmV0dXJuIGxhbmVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH1cblxuICB2YXIgbmV4dExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lczsgLy8gRG8gbm90IHdvcmsgb24gYW55IGlkbGUgd29yayB1bnRpbCBhbGwgdGhlIG5vbi1pZGxlIHdvcmsgaGFzIGZpbmlzaGVkLFxuICAvLyBldmVuIGlmIHRoZSB3b3JrIGlzIHN1c3BlbmRlZC5cblxuICB2YXIgbm9uSWRsZVBlbmRpbmdMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIE5vbklkbGVMYW5lcztcblxuICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBub25JZGxlVW5ibG9ja2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKG5vbklkbGVVbmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgaWYgKG5vbklkbGVQaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgb25seSByZW1haW5pbmcgd29yayBpcyBJZGxlLlxuICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmICh1bmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXModW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuXG4gIGlmICh3aXBMYW5lcyAhPT0gTm9MYW5lcyAmJiB3aXBMYW5lcyAhPT0gbmV4dExhbmVzICYmIC8vIElmIHdlIGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgdGhlbiBpbnRlcnJ1cHRpbmcgaXMgZmluZS4gRG9uJ3RcbiAgLy8gYm90aGVyIHdhaXRpbmcgdW50aWwgdGhlIHJvb3QgaXMgY29tcGxldGUuXG4gICh3aXBMYW5lcyAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIHZhciBuZXh0TGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTtcbiAgICB2YXIgd2lwTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUod2lwTGFuZXMpO1xuXG4gICAgaWYgKCAvLyBUZXN0cyB3aGV0aGVyIHRoZSBuZXh0IGxhbmUgaXMgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgd2lwXG4gICAgLy8gb25lLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdHMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gICAgbmV4dExhbmUgPj0gd2lwTGFuZSB8fCAvLyBEZWZhdWx0IHByaW9yaXR5IHVwZGF0ZXMgc2hvdWxkIG5vdCBpbnRlcnJ1cHQgdHJhbnNpdGlvbiB1cGRhdGVzLiBUaGVcbiAgICAvLyBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBkZWZhdWx0IHVwZGF0ZXMgYW5kIHRyYW5zaXRpb24gdXBkYXRlcyBpcyB0aGF0XG4gICAgLy8gZGVmYXVsdCB1cGRhdGVzIGRvIG5vdCBzdXBwb3J0IHJlZnJlc2ggdHJhbnNpdGlvbnMuXG4gICAgbmV4dExhbmUgPT09IERlZmF1bHRMYW5lICYmICh3aXBMYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgLy8gS2VlcCB3b3JraW5nIG9uIHRoZSBleGlzdGluZyBpbi1wcm9ncmVzcyB0cmVlLiBEbyBub3QgaW50ZXJydXB0LlxuICAgICAgcmV0dXJuIHdpcExhbmVzO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobmV4dExhbmVzICYgSW5wdXRDb250aW51b3VzTGFuZSkgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBXaGVuIHVwZGF0ZXMgYXJlIHN5bmMgYnkgZGVmYXVsdCwgd2UgZW50YW5nbGUgY29udGludW91cyBwcmlvcml0eSB1cGRhdGVzXG4gICAgLy8gYW5kIGRlZmF1bHQgdXBkYXRlcywgc28gdGhleSByZW5kZXIgaW4gdGhlIHNhbWUgYmF0Y2guIFRoZSBvbmx5IHJlYXNvblxuICAgIC8vIHRoZXkgdXNlIHNlcGFyYXRlIGxhbmVzIGlzIGJlY2F1c2UgY29udGludW91cyB1cGRhdGVzIHNob3VsZCBpbnRlcnJ1cHRcbiAgICAvLyB0cmFuc2l0aW9ucywgYnV0IGRlZmF1bHQgdXBkYXRlcyBzaG91bGQgbm90LlxuICAgIG5leHRMYW5lcyB8PSBwZW5kaW5nTGFuZXMgJiBEZWZhdWx0TGFuZTtcbiAgfSAvLyBDaGVjayBmb3IgZW50YW5nbGVkIGxhbmVzIGFuZCBhZGQgdGhlbSB0byB0aGUgYmF0Y2guXG4gIC8vXG4gIC8vIEEgbGFuZSBpcyBzYWlkIHRvIGJlIGVudGFuZ2xlZCB3aXRoIGFub3RoZXIgd2hlbiBpdCdzIG5vdCBhbGxvd2VkIHRvIHJlbmRlclxuICAvLyBpbiBhIGJhdGNoIHRoYXQgZG9lcyBub3QgYWxzbyBpbmNsdWRlIHRoZSBvdGhlciBsYW5lLiBUeXBpY2FsbHkgd2UgZG8gdGhpc1xuICAvLyB3aGVuIG11bHRpcGxlIHVwZGF0ZXMgaGF2ZSB0aGUgc2FtZSBzb3VyY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gcmVzcG9uZCB0b1xuICAvLyB0aGUgbW9zdCByZWNlbnQgZXZlbnQgZnJvbSB0aGF0IHNvdXJjZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGFwcGx5IGVudGFuZ2xlbWVudHMgKmFmdGVyKiBjaGVja2luZyBmb3IgcGFydGlhbCB3b3JrIGFib3ZlLlxuICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgYSBsYW5lIGlzIGVudGFuZ2xlZCBkdXJpbmcgYW4gaW50ZXJsZWF2ZWQgZXZlbnQgd2hpbGVcbiAgLy8gaXQncyBhbHJlYWR5IHJlbmRlcmluZywgd2Ugd29uJ3QgaW50ZXJydXB0IGl0LiBUaGlzIGlzIGludGVudGlvbmFsLCBzaW5jZVxuICAvLyBlbnRhbmdsZW1lbnQgaXMgdXN1YWxseSBcImJlc3QgZWZmb3J0XCI6IHdlJ2xsIHRyeSBvdXIgYmVzdCB0byByZW5kZXIgdGhlXG4gIC8vIGxhbmVzIGluIHRoZSBzYW1lIGJhdGNoLCBidXQgaXQncyBub3Qgd29ydGggdGhyb3dpbmcgb3V0IHBhcnRpYWxseVxuICAvLyBjb21wbGV0ZWQgd29yayBpbiBvcmRlciB0byBkbyBpdC5cbiAgLy8gVE9ETzogUmVjb25zaWRlciB0aGlzLiBUaGUgY291bnRlci1hcmd1bWVudCBpcyB0aGF0IHRoZSBwYXJ0aWFsIHdvcmtcbiAgLy8gcmVwcmVzZW50cyBhbiBpbnRlcm1lZGlhdGUgc3RhdGUsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gc2hvdyB0byB0aGUgdXNlci5cbiAgLy8gQW5kIGJ5IHNwZW5kaW5nIGV4dHJhIHRpbWUgZmluaXNoaW5nIGl0LCB3ZSdyZSBpbmNyZWFzaW5nIHRoZSBhbW91bnQgb2ZcbiAgLy8gdGltZSBpdCB0YWtlcyB0byBzaG93IHRoZSBmaW5hbCBzdGF0ZSwgd2hpY2ggaXMgd2hhdCB0aGV5IGFyZSBhY3R1YWxseVxuICAvLyB3YWl0aW5nIGZvci5cbiAgLy9cbiAgLy8gRm9yIHRob3NlIGV4Y2VwdGlvbnMgd2hlcmUgZW50YW5nbGVtZW50IGlzIHNlbWFudGljYWxseSBpbXBvcnRhbnQsIGxpa2VcbiAgLy8gdXNlTXV0YWJsZVNvdXJjZSwgd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHBhcnRpYWwgd29yayBhdCB0aGVcbiAgLy8gdGltZSB3ZSBhcHBseSB0aGUgZW50YW5nbGVtZW50LlxuXG5cbiAgdmFyIGVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcztcblxuICBpZiAoZW50YW5nbGVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgICB2YXIgbGFuZXMgPSBuZXh0TGFuZXMgJiBlbnRhbmdsZWRMYW5lcztcblxuICAgIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgbmV4dExhbmVzIHw9IGVudGFuZ2xlbWVudHNbaW5kZXhdO1xuICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRMYW5lcztcbn1cbmZ1bmN0aW9uIGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpIHtcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXZlbnRUaW1lID0gZXZlbnRUaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXZlbnRUaW1lID4gbW9zdFJlY2VudEV2ZW50VGltZSkge1xuICAgICAgbW9zdFJlY2VudEV2ZW50VGltZSA9IGV2ZW50VGltZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxuXG4gIHJldHVybiBtb3N0UmVjZW50RXZlbnRUaW1lO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpIHtcbiAgc3dpdGNoIChsYW5lKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgICAvL1xuICAgICAgLy8gTk9URTogVGhpcyBpcyBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQgYXMgaW4gU2NoZWR1bGVyLmpzLlxuICAgICAgLy8gV2hlbiB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nXG4gICAgICAvLyB0aGVyZSdzIGEgdXNlciBpbnRlcmFjdGlvbiB0aGF0J3MgYmVpbmcgc3RhcnZlZCBieSBhIHNlcmllcyBvZlxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlcy4gSWYgdGhhdCB0aGVvcnkgaXMgY29ycmVjdCwgdGhlIHByb3BlciBzb2x1dGlvbiBpc1xuICAgICAgLy8gdG8gZml4IHRoZSBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXRcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZXMgYXJlIGFuIGltcG9ydGFudCBzYWZlZ3VhcmQgd2hlbiBzdGFydmF0aW9uXG4gICAgICAvLyBkb2VzIGhhcHBlbi5cbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDI1MDtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgLy8gVE9ETzogUmV0cmllcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleHBpcmUgaWYgdGhleSBhcmUgQ1BVIGJvdW5kIGZvclxuICAgICAgLy8gdG9vIGxvbmcsIGJ1dCB3aGVuIEkgbWFkZSB0aGlzIGNoYW5nZSBpdCBjYXVzZWQgYSBzcGlrZSBpbiBicm93c2VyXG4gICAgICAvLyBjcmFzaGVzLiBUaGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgdW5kZXJseWluZyBidWc7IG5vdCBzdXBlciB1cmdlbnQgYnV0XG4gICAgICAvLyBpZGVhbGx5IHNob3VsZCBmaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmVcbiAgICAgIC8vIGEgcmVwcm8gZm9yIHRoZSBjcmFzaGVzLCBvbmx5IGRldGVjdGVkIHZpYSBwcm9kdWN0aW9uIG1ldHJpY3MuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVMYW5lOlxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIC8vIEFueXRoaW5nIGlkbGUgcHJpb3JpdHkgb3IgbG93ZXIgc2hvdWxkIG5ldmVyIGV4cGlyZS5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgLy8gVE9ETzogVGhpcyBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHdlIHlpZWxkLiBXZSBjYW4gb3B0aW1pemUgYnkgc3RvcmluZ1xuICAvLyB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lIG9uIHRoZSByb290LiBUaGVuIHVzZSB0aGF0IHRvIHF1aWNrbHkgYmFpbCBvdXRcbiAgLy8gb2YgdGhpcyBmdW5jdGlvbi5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcGVuZGluZyBsYW5lcyBhbmQgY2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGVpclxuICAvLyBleHBpcmF0aW9uIHRpbWUuIElmIHNvLCB3ZSdsbCBhc3N1bWUgdGhlIHVwZGF0ZSBpcyBiZWluZyBzdGFydmVkIGFuZCBtYXJrXG4gIC8vIGl0IGFzIGV4cGlyZWQgdG8gZm9yY2UgaXQgdG8gZmluaXNoLlxuXG4gIHZhciBsYW5lcyA9IHBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBleHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXhwaXJhdGlvblRpbWUgPT09IE5vVGltZXN0YW1wKSB7XG4gICAgICAvLyBGb3VuZCBhIHBlbmRpbmcgbGFuZSB3aXRoIG5vIGV4cGlyYXRpb24gdGltZS4gSWYgaXQncyBub3Qgc3VzcGVuZGVkLCBvclxuICAgICAgLy8gaWYgaXQncyBwaW5nZWQsIGFzc3VtZSBpdCdzIENQVS1ib3VuZC4gQ29tcHV0ZSBhIG5ldyBleHBpcmF0aW9uIHRpbWVcbiAgICAgIC8vIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICBpZiAoKGxhbmUgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMgfHwgKGxhbmUgJiBwaW5nZWRMYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgLy8gQXNzdW1lcyB0aW1lc3RhbXBzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG4gICAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRoaXMgbGFuZSBleHBpcmVkXG4gICAgICByb290LmV4cGlyZWRMYW5lcyB8PSBsYW5lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59IC8vIFRoaXMgcmV0dXJucyB0aGUgaGlnaGVzdCBwcmlvcml0eSBwZW5kaW5nIGxhbmVzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5XG4vLyBhcmUgc3VzcGVuZGVkLlxuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCkge1xuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocm9vdC5wZW5kaW5nTGFuZXMpO1xufVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc1N5bmNMYW5lKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jTGFuZSkgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc05vbklkbGVXb3JrKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBOb25JZGxlTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgUmV0cnlMYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMobGFuZXMpIHtcbiAgdmFyIFVyZ2VudExhbmVzID0gU3luY0xhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBVcmdlbnRMYW5lcykgPT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykge1xuXG4gIHZhciBTeW5jRGVmYXVsdExhbmVzID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0SHlkcmF0aW9uTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgU3luY0RlZmF1bHRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBzZXBhcmF0ZSBjaGVjayBmcm9tIGluY2x1ZGVzQmxvY2tpbmdMYW5lIGJlY2F1c2UgYSBsYW5lIGNhblxuICAvLyBleHBpcmUgYWZ0ZXIgYSByZW5kZXIgaGFzIGFscmVhZHkgc3RhcnRlZC5cbiAgcmV0dXJuIChsYW5lcyAmIHJvb3QuZXhwaXJlZExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzVHJhbnNpdGlvbkxhbmUobGFuZSkge1xuICByZXR1cm4gKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKSB7XG4gIC8vIEN5Y2xlIHRocm91Z2ggdGhlIGxhbmVzLCBhc3NpZ25pbmcgZWFjaCBuZXcgdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBsYW5lLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIG1lYW5zIGV2ZXJ5IHRyYW5zaXRpb24gZ2V0cyBpdHMgb3duIGxhbmUsIHVudGlsIHdlXG4gIC8vIHJ1biBvdXQgb2YgbGFuZXMgYW5kIGN5Y2xlIGJhY2sgdG8gdGhlIGJlZ2lubmluZy5cbiAgdmFyIGxhbmUgPSBuZXh0VHJhbnNpdGlvbkxhbmU7XG4gIG5leHRUcmFuc2l0aW9uTGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRUcmFuc2l0aW9uTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFJldHJ5TGFuZSgpIHtcbiAgdmFyIGxhbmUgPSBuZXh0UmV0cnlMYW5lO1xuICBuZXh0UmV0cnlMYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFJldHJ5TGFuZSAmIFJldHJ5TGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGdldHMgaW5saW5lZC4gT25seSBleGlzdHMgc28gdG8gY29tbXVuaWNhdGUgdGhhdCBpdFxuICAvLyBkb2Vzbid0IG1hdHRlciB3aGljaCBiaXQgaXMgc2VsZWN0ZWQ7IHlvdSBjYW4gcGljayBhbnkgYml0IHdpdGhvdXRcbiAgLy8gYWZmZWN0aW5nIHRoZSBhbGdvcml0aG1zIHdoZXJlIGl0cyB1c2VkLiBIZXJlIEknbSB1c2luZ1xuICAvLyBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lIGJlY2F1c2UgaXQgcmVxdWlyZXMgdGhlIGZld2VzdCBvcGVyYXRpb25zLlxuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpIHtcbiAgcmV0dXJuIDMxIC0gY2x6MzIobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBsYW5lVG9JbmRleChsYW5lKSB7XG4gIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmUpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlc1NvbWVMYW5lKGEsIGIpIHtcbiAgcmV0dXJuIChhICYgYikgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1N1YnNldE9mTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIChzZXQgJiBzdWJzZXQpID09PSBzdWJzZXQ7XG59XG5mdW5jdGlvbiBtZXJnZUxhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgfCBiO1xufVxuZnVuY3Rpb24gcmVtb3ZlTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIHNldCAmIH5zdWJzZXQ7XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhICYgYjtcbn0gLy8gU2VlbXMgcmVkdW5kYW50LCBidXQgaXQgY2hhbmdlcyB0aGUgdHlwZSBmcm9tIGEgc2luZ2xlIGxhbmUgKHVzZWQgZm9yXG4vLyB1cGRhdGVzKSB0byBhIGdyb3VwIG9mIGxhbmVzICh1c2VkIGZvciBmbHVzaGluZyB3b3JrKS5cblxuZnVuY3Rpb24gbGFuZVRvTGFuZXMobGFuZSkge1xuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGhpZ2hlclByaW9yaXR5TGFuZShhLCBiKSB7XG4gIC8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0IHJhbmdlcyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgcmV0dXJuIGEgIT09IE5vTGFuZSAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gY3JlYXRlTGFuZU1hcChpbml0aWFsKSB7XG4gIC8vIEludGVudGlvbmFsbHkgcHVzaGluZyBvbmUgYnkgb25lLlxuICAvLyBodHRwczovL3Y4LmRldi9ibG9nL2VsZW1lbnRzLWtpbmRzI2F2b2lkLWNyZWF0aW5nLWhvbGVzXG4gIHZhciBsYW5lTWFwID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBUb3RhbExhbmVzOyBpKyspIHtcbiAgICBsYW5lTWFwLnB1c2goaW5pdGlhbCk7XG4gIH1cblxuICByZXR1cm4gbGFuZU1hcDtcbn1cbmZ1bmN0aW9uIG1hcmtSb290VXBkYXRlZChyb290LCB1cGRhdGVMYW5lLCBldmVudFRpbWUpIHtcbiAgcm9vdC5wZW5kaW5nTGFuZXMgfD0gdXBkYXRlTGFuZTsgLy8gSWYgdGhlcmUgYXJlIGFueSBzdXNwZW5kZWQgdHJhbnNpdGlvbnMsIGl0J3MgcG9zc2libGUgdGhpcyBuZXcgdXBkYXRlXG4gIC8vIGNvdWxkIHVuYmxvY2sgdGhlbS4gQ2xlYXIgdGhlIHN1c3BlbmRlZCBsYW5lcyBzbyB0aGF0IHdlIGNhbiB0cnkgcmVuZGVyaW5nXG4gIC8vIHRoZW0gYWdhaW4uXG4gIC8vXG4gIC8vIFRPRE86IFdlIHJlYWxseSBvbmx5IG5lZWQgdG8gdW5zdXNwZW5kIG9ubHkgbGFuZXMgdGhhdCBhcmUgaW4gdGhlXG4gIC8vIGBzdWJ0cmVlTGFuZXNgIG9mIHRoZSB1cGRhdGVkIGZpYmVyLCBvciB0aGUgdXBkYXRlIGxhbmVzIG9mIHRoZSByZXR1cm5cbiAgLy8gcGF0aC4gVGhpcyB3b3VsZCBleGNsdWRlIHN1c3BlbmRlZCB1cGRhdGVzIGluIGFuIHVucmVsYXRlZCBzaWJsaW5nIHRyZWUsXG4gIC8vIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IGZvciB0aGlzIHVwZGF0ZSB0byB1bmJsb2NrIGl0LlxuICAvL1xuICAvLyBXZSBkb24ndCBkbyB0aGlzIGlmIHRoZSBpbmNvbWluZyB1cGRhdGUgaXMgaWRsZSwgYmVjYXVzZSB3ZSBuZXZlciBwcm9jZXNzXG4gIC8vIGlkbGUgdXBkYXRlcyB1bnRpbCBhZnRlciBhbGwgdGhlIHJlZ3VsYXIgdXBkYXRlcyBoYXZlIGZpbmlzaGVkOyB0aGVyZSdzIG5vXG4gIC8vIHdheSBpdCBjb3VsZCB1bmJsb2NrIGEgdHJhbnNpdGlvbi5cblxuICBpZiAodXBkYXRlTGFuZSAhPT0gSWRsZUxhbmUpIHtcbiAgICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleCh1cGRhdGVMYW5lKTsgLy8gV2UgY2FuIGFsd2F5cyBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdGltZXN0YW1wIGJlY2F1c2Ugd2UgcHJlZmVyIHRoZSBtb3N0XG4gIC8vIHJlY2VudCBldmVudCwgYW5kIHdlIGFzc3VtZSB0aW1lIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cblxuICBldmVudFRpbWVzW2luZGV4XSA9IGV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgfD0gc3VzcGVuZGVkTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgJj0gfnN1c3BlbmRlZExhbmVzOyAvLyBUaGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBubyBsb25nZXIgQ1BVLWJvdW5kLiBDbGVhciB0aGVpciBleHBpcmF0aW9uIHRpbWVzLlxuXG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lcztcbiAgdmFyIGxhbmVzID0gc3VzcGVuZGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzLCBldmVudFRpbWUpIHtcbiAgcm9vdC5waW5nZWRMYW5lcyB8PSByb290LnN1c3BlbmRlZExhbmVzICYgcGluZ2VkTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKSB7XG4gIHZhciBub0xvbmdlclBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzICYgfnJlbWFpbmluZ0xhbmVzO1xuICByb290LnBlbmRpbmdMYW5lcyA9IHJlbWFpbmluZ0xhbmVzOyAvLyBMZXQncyB0cnkgZXZlcnl0aGluZyBhZ2FpblxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QubXV0YWJsZVJlYWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5lbnRhbmdsZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIENsZWFyIHRoZSBsYW5lcyB0aGF0IG5vIGxvbmdlciBoYXZlIHBlbmRpbmcgd29ya1xuXG4gIHZhciBsYW5lcyA9IG5vTG9uZ2VyUGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gPSBOb0xhbmVzO1xuICAgIGV2ZW50VGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBlbnRhbmdsZWRMYW5lcykge1xuICAvLyBJbiBhZGRpdGlvbiB0byBlbnRhbmdsaW5nIGVhY2ggb2YgdGhlIGdpdmVuIGxhbmVzIHdpdGggZWFjaCBvdGhlciwgd2UgYWxzb1xuICAvLyBoYXZlIHRvIGNvbnNpZGVyIF90cmFuc2l0aXZlXyBlbnRhbmdsZW1lbnRzLiBGb3IgZWFjaCBsYW5lIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYW55KiBvZiB0aGUgZ2l2ZW4gbGFuZXMsIHRoYXQgbGFuZSBpcyBub3cgdHJhbnNpdGl2ZWx5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbGwqIHRoZSBnaXZlbiBsYW5lcy5cbiAgLy9cbiAgLy8gVHJhbnNsYXRlZDogSWYgQyBpcyBlbnRhbmdsZWQgd2l0aCBBLCB0aGVuIGVudGFuZ2xpbmcgQSB3aXRoIEIgYWxzb1xuICAvLyBlbnRhbmdsZXMgQyB3aXRoIEIuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgaGFyZCB0byBncmFzcCwgaXQgbWlnaHQgaGVscCB0byBpbnRlbnRpb25hbGx5IGJyZWFrIHRoaXNcbiAgLy8gZnVuY3Rpb24gYW5kIGxvb2sgYXQgdGhlIHRlc3RzIHRoYXQgZmFpbCBpbiBSZWFjdFRyYW5zaXRpb24tdGVzdC5qcy4gVHJ5XG4gIC8vIGNvbW1lbnRpbmcgb3V0IG9uZSBvZiB0aGUgY29uZGl0aW9ucyBiZWxvdy5cbiAgdmFyIHJvb3RFbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSByb290RW50YW5nbGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuXG4gICAgaWYgKCAvLyBJcyB0aGlzIG9uZSBvZiB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGxhbmUgJiBlbnRhbmdsZWRMYW5lcyB8IC8vIElzIHRoaXMgbGFuZSB0cmFuc2l0aXZlbHkgZW50YW5nbGVkIHdpdGggdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSAmIGVudGFuZ2xlZExhbmVzKSB7XG4gICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSB8PSBlbnRhbmdsZWRMYW5lcztcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcykge1xuICB2YXIgcmVuZGVyTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUocmVuZGVyTGFuZXMpO1xuICB2YXIgbGFuZTtcblxuICBzd2l0Y2ggKHJlbmRlckxhbmUpIHtcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICBsYW5lID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIGxhbmUgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICBsYW5lID0gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICBsYW5lID0gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaXMgYWxyZWFkeSBlaXRoZXIgYSBoeWRyYXRpb24gbGFuZSwgb3Igc2hvdWxkbid0XG4gICAgICAvLyBiZSByZXRyaWVkIGF0IGEgaHlkcmF0aW9uIGxhbmUuXG4gICAgICBsYW5lID0gTm9MYW5lO1xuICAgICAgYnJlYWs7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlIGxhbmUgd2UgY2hvc2UgaXMgc3VzcGVuZGVkLiBJZiBzbywgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZVxuICAvLyBhbHJlYWR5IGF0dGVtcHRlZCBhbmQgZmFpbGVkIHRvIGh5ZHJhdGUgYXQgdGhhdCBsZXZlbC4gQWxzbyBjaGVjayBpZiB3ZSdyZVxuICAvLyBhbHJlYWR5IHJlbmRlcmluZyB0aGF0IGxhbmUsIHdoaWNoIGlzIHJhcmUgYnV0IGNvdWxkIGhhcHBlbi5cblxuXG4gIGlmICgobGFuZSAmIChyb290LnN1c3BlbmRlZExhbmVzIHwgcmVuZGVyTGFuZXMpKSAhPT0gTm9MYW5lKSB7XG4gICAgLy8gR2l2ZSB1cCB0cnlpbmcgdG8gaHlkcmF0ZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCByZW5kZXIuXG4gICAgcmV0dXJuIE5vTGFuZTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIGZpYmVyLCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcbiAgICB1cGRhdGVycy5hZGQoZmliZXIpO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG4gIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuXG4gICAgaWYgKHVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICB1cGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgIW1lbW9pemVkVXBkYXRlcnMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcyhyb290LCBsYW5lcykge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnRQcmlvcml0eSA9IFN5bmNMYW5lO1xudmFyIENvbnRpbnVvdXNFdmVudFByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzTGFuZTtcbnZhciBEZWZhdWx0RXZlbnRQcmlvcml0eSA9IERlZmF1bHRMYW5lO1xudmFyIElkbGVFdmVudFByaW9yaXR5ID0gSWRsZUxhbmU7XG52YXIgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gTm9MYW5lO1xuZnVuY3Rpb24gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCkge1xuICByZXR1cm4gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KG5ld1ByaW9yaXR5KSB7XG4gIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IG5ld1ByaW9yaXR5O1xufVxuZnVuY3Rpb24gcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5LCBmbikge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcblxuICB0cnkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByaW9yaXR5O1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByZXZpb3VzUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gbG93ZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IDAgfHwgYSA+IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGlzSGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiO1xufVxuZnVuY3Rpb24gbGFuZXNUb0V2ZW50UHJpb3JpdHkobGFuZXMpIHtcbiAgdmFyIGxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmIChpbmNsdWRlc05vbklkbGVXb3JrKGxhbmUpKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xufVxuXG4vLyBUaGlzIGlzIGltcG9ydGVkIGJ5IHRoZSBldmVudCByZXBsYXlpbmcgaW1wbGVtZW50YXRpb24gaW4gUmVhY3QgRE9NLiBJdCdzXG4vLyBpbiBhIHNlcGFyYXRlIGZpbGUgdG8gYnJlYWsgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHJlbmRlcmVyIGFuZFxuLy8gdGhlIHJlY29uY2lsZXIuXG5mdW5jdGlvbiBpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpIHtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHJvb3QuY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gY3VycmVudFN0YXRlLmlzRGVoeWRyYXRlZDtcbn1cblxudmFyIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb247XG5cbmZ1bmN0aW9uIHNldEF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmbikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uID0gZm47XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG59XG52YXIgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb247XG5mdW5jdGlvbiBzZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihmbikge1xuICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkgPSBmbjtcbn1cbnZhciBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMTtcbmZ1bmN0aW9uIHNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShmbikge1xuICBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkgPSBmbjtcbn0gLy8gVE9ETzogVXBncmFkZSB0aGlzIGRlZmluaXRpb24gb25jZSB3ZSdyZSBvbiBhIG5ld2VyIHZlcnNpb24gb2YgRmxvdyB0aGF0XG4vLyBoYXMgdGhpcyBkZWZpbml0aW9uIGJ1aWx0LWluLlxuXG52YXIgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlOyAvLyBUaGUgcXVldWUgb2YgZGlzY3JldGUgZXZlbnRzIHRvIGJlIHJlcGxheWVkLlxuXG52YXIgcXVldWVkRGlzY3JldGVFdmVudHMgPSBbXTsgLy8gSW5kaWNhdGVzIGlmIGFueSBjb250aW51b3VzIGV2ZW50IHRhcmdldHMgYXJlIG5vbi1udWxsIGZvciBlYXJseSBiYWlsb3V0LlxuLy8gaWYgdGhlIGxhc3QgdGFyZ2V0IHdhcyBkZWh5ZHJhdGVkLlxuXG52YXIgcXVldWVkRm9jdXMgPSBudWxsO1xudmFyIHF1ZXVlZERyYWcgPSBudWxsO1xudmFyIHF1ZXVlZE1vdXNlID0gbnVsbDsgLy8gRm9yIHBvaW50ZXIgZXZlbnRzIHRoZXJlIGNhbiBiZSBvbmUgbGF0ZXN0IGV2ZW50IHBlciBwb2ludGVySWQuXG5cbnZhciBxdWV1ZWRQb2ludGVycyA9IG5ldyBNYXAoKTtcbnZhciBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMgPSBuZXcgTWFwKCk7IC8vIFdlIGNvdWxkIGNvbnNpZGVyIHJlcGxheWluZyBzZWxlY3Rpb25jaGFuZ2UgYW5kIHRvdWNobW92ZXMgdG9vLlxuXG52YXIgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzID0gW107XG52YXIgZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzID0gWydtb3VzZWRvd24nLCAnbW91c2V1cCcsICd0b3VjaGNhbmNlbCcsICd0b3VjaGVuZCcsICd0b3VjaHN0YXJ0JywgJ2F1eGNsaWNrJywgJ2RibGNsaWNrJywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcnVwJywgJ2RyYWdlbmQnLCAnZHJhZ3N0YXJ0JywgJ2Ryb3AnLCAnY29tcG9zaXRpb25lbmQnLCAnY29tcG9zaXRpb25zdGFydCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ2lucHV0JywgJ3RleHRJbnB1dCcsIC8vIEludGVudGlvbmFsbHkgY2FtZWxDYXNlXG4nY29weScsICdjdXQnLCAncGFzdGUnLCAnY2xpY2snLCAnY2hhbmdlJywgJ2NvbnRleHRtZW51JywgJ3Jlc2V0JywgJ3N1Ym1pdCddO1xuZnVuY3Rpb24gaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzLFxuICAgIG5hdGl2ZUV2ZW50OiBuYXRpdmVFdmVudCxcbiAgICB0YXJnZXRDb250YWluZXJzOiBbdGFyZ2V0Q29udGFpbmVyXVxuICB9O1xufVxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LnByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7IC8vIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgd2F5IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZlxuICAgICAgICAgIC8vIGEgcm9vdCBvdGhlciB0aGFuIHN5bmMuXG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyB3aWxsIHJlYWQgdGhlIHByaW9yaXR5IGlmIGl0J3MgZGlzcGF0Y2hlZCBieSB0aGUgUmVhY3RcbiAgLy8gZXZlbnQgc3lzdGVtIGJ1dCBub3QgbmF0aXZlIGV2ZW50cy4gU2hvdWxkIHJlYWQgd2luZG93LmV2ZW50LnR5cGUsIGxpa2VcbiAgLy8gd2UgZG8gZm9yIHVwZGF0ZXMgKGdldEN1cnJlbnRFdmVudFByaW9yaXR5KS5cbiAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEoKTtcbiAgdmFyIHF1ZXVlZFRhcmdldCA9IHtcbiAgICBibG9ja2VkT246IG51bGwsXG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgcHJpb3JpdHk6IHVwZGF0ZVByaW9yaXR5XG4gIH07XG4gIHZhciBpID0gMDtcblxuICBmb3IgKDsgaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIFN0b3Agb25jZSB3ZSBoaXQgdGhlIGZpcnN0IHRhcmdldCB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW5cbiAgICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eSh1cGRhdGVQcmlvcml0eSwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldLnByaW9yaXR5KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNwbGljZShpLCAwLCBxdWV1ZWRUYXJnZXQpO1xuXG4gIGlmIChpID09PSAwKSB7XG4gICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBxdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyc1swXTtcbiAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQocXVldWVkRXZlbnQuZG9tRXZlbnROYW1lLCBxdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudCA9IHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnRDbG9uZSA9IG5ldyBuYXRpdmVFdmVudC5jb25zdHJ1Y3RvcihuYXRpdmVFdmVudC50eXBlLCBuYXRpdmVFdmVudCk7XG4gICAgICAgIHNldFJlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICBuYXRpdmVFdmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgcmVzZXRSZXBsYXlpbmdFdmVudCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLiBUcnkgYWdhaW4gbGF0ZXIuXG4gICAgICB2YXIgX2ZpYmVyMyA9IGdldEluc3RhbmNlRnJvbU5vZGUobmV4dEJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIzICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjMpO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gVGhpcyB0YXJnZXQgY29udGFpbmVyIHdhcyBzdWNjZXNzZnVsbHkgZGlzcGF0Y2hlZC4gVHJ5IHRoZSBuZXh0LlxuXG5cbiAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKHF1ZXVlZEV2ZW50LCBrZXksIG1hcCkge1xuICBpZiAoYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkpIHtcbiAgICBtYXAuZGVsZXRlKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGF5VW5ibG9ja2VkRXZlbnRzKCkge1xuICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7XG5cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRGb2N1cykpIHtcbiAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZERyYWcpKSB7XG4gICAgcXVldWVkRHJhZyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRNb3VzZSkpIHtcbiAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gIH1cblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG5cbiAgICBpZiAoIWhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQpIHtcbiAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSB0cnVlOyAvLyBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGF0dGVtcHQgcmVwbGF5aW5nIGFzIG1hbnkgZXZlbnRzIGFzIGFyZVxuICAgICAgLy8gbm93IHVuYmxvY2tlZC4gVGhpcyBmaXJzdCBtaWdodCBub3QgYWN0dWFsbHkgYmUgdW5ibG9ja2VkIHlldC5cbiAgICAgIC8vIFdlIGNvdWxkIGNoZWNrIGl0IGVhcmx5IHRvIGF2b2lkIHNjaGVkdWxpbmcgYW4gdW5uZWNlc3NhcnkgY2FsbGJhY2suXG5cbiAgICAgIFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSwgcmVwbGF5VW5ibG9ja2VkRXZlbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlJZkJsb2NrZWRPbih1bmJsb2NrZWQpIHtcbiAgLy8gTWFyayBhbnl0aGluZyB0aGF0IHdhcyBibG9ja2VkIG9uIHRoaXMgYXMgbm8gbG9uZ2VyIGJsb2NrZWRcbiAgLy8gYW5kIGVsaWdpYmxlIGZvciBhIHJlcGxheS5cbiAgaWYgKHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRGlzY3JldGVFdmVudHNbMF0sIHVuYmxvY2tlZCk7IC8vIFRoaXMgaXMgYSBleHBvbmVudGlhbCBzZWFyY2ggZm9yIGVhY2ggYm91bmRhcnkgdGhhdCBjb21taXRzLiBJIHRoaW5rIGl0J3NcbiAgICAvLyB3b3J0aCBpdCBiZWNhdXNlIHdlIGV4cGVjdCB2ZXJ5IGZldyBkaXNjcmV0ZSBldmVudHMgdG8gcXVldWUgdXAgYW5kIG9uY2VcbiAgICAvLyB3ZSBhcmUgYWN0dWFsbHkgZnVsbHkgdW5ibG9ja2VkIGl0IHdpbGwgYmUgZmFzdCB0byByZXBsYXkgdGhlbS5cblxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZWRFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzW2ldO1xuXG4gICAgICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRm9jdXMsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREcmFnLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZE1vdXNlLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAocXVldWVkRXZlbnQpIHtcbiAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpO1xuICB9O1xuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2godW5ibG9jayk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKHVuYmxvY2spO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHF1ZXVlZFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tfaV07XG5cbiAgICBpZiAocXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgbmV4dEV4cGxpY2l0VGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzWzBdO1xuXG4gICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuXG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KG5leHRFeHBsaWNpdFRhcmdldCk7XG5cbiAgICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHVuYmxvY2tlZC5cbiAgICAgICAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOyAvLyBUT0RPOiBjYW4gd2Ugc3RvcCBleHBvcnRpbmcgdGhlc2U/XG5cbnZhciBfZW5hYmxlZCA9IHRydWU7IC8vIFRoaXMgaXMgZXhwb3J0ZWQgaW4gRkIgYnVpbGRzIGZvciB1c2UgYnkgbGVnYWN5IEZCIGxheWVyIGluZnJhLlxuLy8gV2UnZCBsaWtlIHRvIHJlbW92ZSB0aGlzIGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGlzIGlzIHNhZmUuXG5cbmZ1bmN0aW9uIHNldEVuYWJsZWQoZW5hYmxlZCkge1xuICBfZW5hYmxlZCA9ICEhZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGlzRW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9lbmFibGVkO1xufVxuZnVuY3Rpb24gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGV2ZW50UHJpb3JpdHkgPSBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSk7XG4gIHZhciBsaXN0ZW5lcldyYXBwZXI7XG5cbiAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaERpc2NyZXRlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaENvbnRpbnVvdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKCFfZW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpKSB7XG4gICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIG5lZWQgdG8gY2xlYXIgb25seSBpZiB3ZSBkaWRuJ3QgcXVldWUgYmVjYXVzZVxuICAvLyBxdWV1ZWluZyBpcyBhY2N1bXVsYXRpdmUuXG5cblxuICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSAmJiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZG9tRXZlbnROYW1lKSkge1xuICAgIHdoaWxlIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBmaWJlciA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBibG9ja2VkT24pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgfVxuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoaXMgaXMgbm90IHJlcGxheWFibGUgc28gd2UnbGwgaW52b2tlIGl0IGJ1dCB3aXRob3V0IGEgdGFyZ2V0LFxuICAvLyBpbiBjYXNlIHRoZSBldmVudCBzeXN0ZW0gbmVlZHMgdG8gdHJhY2UgaXQuXG5cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgbnVsbCwgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxudmFyIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDsgLy8gUmV0dXJucyBhIFN1c3BlbnNlSW5zdGFuY2Ugb3IgQ29udGFpbmVyIGlmIGl0J3MgYmxvY2tlZC5cbi8vIFRoZSByZXR1cm5fdGFyZ2V0SW5zdCBmaWVsZCBhYm92ZSBpcyBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlLlxuXG5mdW5jdGlvbiBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUT0RPOiBXYXJuIGlmIF9lbmFibGVkIGlzIGZhbHNlLlxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zIGR1cmluZyBhIHJlcGxheSBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgaXQgbWlnaHQgYmxvY2tcbiAgICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLlxuICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKG5lYXJlc3RNb3VudGVkICE9PSB0YXJnZXRJbnN0KSB7XG4gICAgICAgIC8vIElmIHdlIGdldCBhbiBldmVudCAoZXg6IGltZyBvbmxvYWQpIGJlZm9yZSBjb21taXR0aW5nIHRoYXRcbiAgICAgICAgLy8gY29tcG9uZW50J3MgbW91bnQsIGlnbm9yZSBpdCBmb3Igbm93ICh0aGF0IGlzLCB0cmVhdCBpdCBhcyBpZiBpdCB3YXMgYW5cbiAgICAgICAgLy8gZXZlbnQgb24gYSBub24tUmVhY3QgdHJlZSkuIFdlIG1pZ2h0IGFsc28gY29uc2lkZXIgcXVldWVpbmcgZXZlbnRzIGFuZFxuICAgICAgICAvLyBkaXNwYXRjaGluZyB0aGVtIGFmdGVyIHRoZSBtb3VudC5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0OyAvLyBXZSdyZSBub3QgYmxvY2tlZCBvbiBhbnl0aGluZy5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVXNlZCBieSBTaW1wbGVFdmVudFBsdWdpbjpcbiAgICBjYXNlICdjYW5jZWwnOlxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICBjYXNlICdjbG9zZSc6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnaW52YWxpZCc6XG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICBjYXNlICdwYXVzZSc6XG4gICAgY2FzZSAncGxheSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgY2FzZSAncmF0ZWNoYW5nZSc6XG4gICAgY2FzZSAncmVzZXQnOlxuICAgIGNhc2UgJ3Jlc2l6ZSc6XG4gICAgY2FzZSAnc2Vla2VkJzpcbiAgICBjYXNlICdzdWJtaXQnOlxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgY2FzZSAndm9sdW1lY2hhbmdlJzogLy8gVXNlZCBieSBwb2x5ZmlsbHM6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdjaGFuZ2UnOlxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOiAvLyBPbmx5IGVuYWJsZUNyZWF0ZUV2ZW50SGFuZGxlQVBJOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWlucHV0JzpcbiAgICBjYXNlICdibHVyJzpcbiAgICBjYXNlICdmdWxsc2NyZWVuY2hhbmdlJzpcbiAgICBjYXNlICdmb2N1cyc6XG4gICAgY2FzZSAnaGFzaGNoYW5nZSc6XG4gICAgY2FzZSAncG9wc3RhdGUnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnc2VsZWN0c3RhcnQnOlxuICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdzY3JvbGwnOlxuICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd3aGVlbCc6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdtb3VzZWVudGVyJzpcbiAgICBjYXNlICdtb3VzZWxlYXZlJzpcbiAgICBjYXNlICdwb2ludGVyZW50ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG4gICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgbWlnaHQgYmUgaW4gdGhlIFNjaGVkdWxlciBjYWxsYmFjay5cbiAgICAgICAgLy8gRXZlbnR1YWxseSB0aGlzIG1lY2hhbmlzbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgY2hlY2tcbiAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgcHJpb3JpdHkgb24gdGhlIG5hdGl2ZSBzY2hlZHVsZXIuXG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eSA9IGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCk7XG5cbiAgICAgICAgc3dpdGNoIChzY2hlZHVsZXJQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAgICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMb3dTY2hlZHVsZXJQcmlvcml0eSwgc29tZWhvdy4gTWF5YmUgdGhlIHNhbWUgbGFuZSBhcyBoeWRyYXRpb24uXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG4vKipcbiAqIFRoZXNlIHZhcmlhYmxlcyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0ZXh0IGNvbnRlbnQgb2YgYSB0YXJnZXQgbm9kZSxcbiAqIGFsbG93aW5nIGNvbXBhcmlzb24gb2YgY29udGVudCBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogSWRlbnRpZnkgdGhlIG5vZGUgd2hlcmUgc2VsZWN0aW9uIGN1cnJlbnRseSBiZWdpbnMsIHRoZW4gb2JzZXJ2ZVxuICogYm90aCBpdHMgdGV4dCBjb250ZW50IGFuZCBpdHMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgRE9NLiBTaW5jZSB0aGVcbiAqIGJyb3dzZXIgbWF5IG5hdGl2ZWx5IHJlcGxhY2UgdGhlIHRhcmdldCBub2RlIGR1cmluZyBjb21wb3NpdGlvbiwgd2UgY2FuXG4gKiB1c2UgaXRzIHBvc2l0aW9uIHRvIGZpbmQgaXRzIHJlcGxhY2VtZW50LlxuICpcbiAqXG4gKi9cbnZhciByb290ID0gbnVsbDtcbnZhciBzdGFydFRleHQgPSBudWxsO1xudmFyIGZhbGxiYWNrVGV4dCA9IG51bGw7XG5mdW5jdGlvbiBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJvb3QgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgc3RhcnRUZXh0ID0gZ2V0VGV4dCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0KCkge1xuICByb290ID0gbnVsbDtcbiAgc3RhcnRUZXh0ID0gbnVsbDtcbiAgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldERhdGEoKSB7XG4gIGlmIChmYWxsYmFja1RleHQpIHtcbiAgICByZXR1cm4gZmFsbGJhY2tUZXh0O1xuICB9XG5cbiAgdmFyIHN0YXJ0O1xuICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0VGV4dDtcbiAgdmFyIHN0YXJ0TGVuZ3RoID0gc3RhcnRWYWx1ZS5sZW5ndGg7XG4gIHZhciBlbmQ7XG4gIHZhciBlbmRWYWx1ZSA9IGdldFRleHQoKTtcbiAgdmFyIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcblxuICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBzdGFydExlbmd0aDsgc3RhcnQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0XSAhPT0gZW5kVmFsdWVbc3RhcnRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgbWluRW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDtcblxuICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5FbmQ7IGVuZCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRMZW5ndGggLSBlbmRdICE9PSBlbmRWYWx1ZVtlbmRMZW5ndGggLSBlbmRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgc2xpY2VUYWlsID0gZW5kID4gMSA/IDEgLSBlbmQgOiB1bmRlZmluZWQ7XG4gIGZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRhaWwpO1xuICByZXR1cm4gZmFsbGJhY2tUZXh0O1xufVxuZnVuY3Rpb24gZ2V0VGV4dCgpIHtcbiAgaWYgKCd2YWx1ZScgaW4gcm9vdCkge1xuICAgIHJldHVybiByb290LnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QudGV4dENvbnRlbnQ7XG59XG5cbi8qKlxuICogYGNoYXJDb2RlYCByZXByZXNlbnRzIHRoZSBhY3R1YWwgXCJjaGFyYWN0ZXIgY29kZVwiIGFuZCBpcyBzYWZlIHRvIHVzZSB3aXRoXG4gKiBgU3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9ubHkga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJpbnRhYmxlXG4gKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci5cbiAqIFRoZSBUYWIta2V5IGlzIGNvbnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBhIGBjaGFyQ29kZWAsXG4gKiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIgaW4gYnJvd3NlcnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGBjaGFyQ29kZWAgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNoYXJDb2RlO1xuICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG5cbiAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHtcbiAgICBjaGFyQ29kZSA9IG5hdGl2ZUV2ZW50LmNoYXJDb2RlOyAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG5cbiAgICBpZiAoY2hhckNvZGUgPT09IDAgJiYga2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgIGNoYXJDb2RlID0gMTM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgYGNoYXJDb2RlYCwgYnV0IGBrZXlDb2RlYCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAgY2hhckNvZGUgPSBrZXlDb2RlO1xuICB9IC8vIElFIGFuZCBFZGdlIChvbiBXaW5kb3dzKSBhbmQgQ2hyb21lIC8gU2FmYXJpIChvbiBXaW5kb3dzIGFuZCBMaW51eClcbiAgLy8gcmVwb3J0IEVudGVyIGFzIGNoYXJDb2RlIDEwIHdoZW4gY3RybCBpcyBwcmVzc2VkLlxuXG5cbiAgaWYgKGNoYXJDb2RlID09PSAxMCkge1xuICAgIGNoYXJDb2RlID0gMTM7XG4gIH0gLy8gU29tZSBub24tcHJpbnRhYmxlIGtleXMgYXJlIHJlcG9ydGVkIGluIGBjaGFyQ29kZWAvYGtleUNvZGVgLCBkaXNjYXJkIHRoZW0uXG4gIC8vIE11c3Qgbm90IGRpc2NhcmQgdGhlIChub24tKXByaW50YWJsZSBFbnRlci1rZXkuXG5cblxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhIGZhY3Rvcnkgc28gdGhhdCB3ZSBoYXZlIGRpZmZlcmVudCByZXR1cm5lZCBjb25zdHJ1Y3RvcnMuXG4vLyBJZiB3ZSBoYWQgYSBzaW5nbGUgY29uc3RydWN0b3IsIGl0IHdvdWxkIGJlIG1lZ2Ftb3JwaGljIGFuZCBlbmdpbmVzIHdvdWxkIGRlb3B0LlxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEludGVyZmFjZSkge1xuICAvKipcbiAgICogU3ludGhldGljIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCBieSBldmVudCBwbHVnaW5zLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYVxuICAgKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGVzZSBzeXN0ZW1zIHNob3VsZCBnZW5lcmFsbHkgdXNlIHBvb2xpbmcgdG8gcmVkdWNlIHRoZSBmcmVxdWVuY3kgb2YgZ2FyYmFnZVxuICAgKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAgICogZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGludG8gdGhlIHBvb2wgYWZ0ZXIgYmVpbmcgZGlzcGF0Y2hlZC4gVXNlcnMgdGhhdFxuICAgKiBuZWVkIGEgcGVyc2lzdGVkIGV2ZW50IHNob3VsZCBpbnZva2UgYHBlcnNpc3RgLlxuICAgKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIChhbmQgc3ViY2xhc3NlcykgaW1wbGVtZW50IHRoZSBET00gTGV2ZWwgMyBFdmVudHMgQVBJIGJ5XG4gICAqIG5vcm1hbGl6aW5nIGJyb3dzZXIgcXVpcmtzLiBTdWJjbGFzc2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIGltcGxlbWVudCBhXG4gICAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAgICovXG4gIGZ1bmN0aW9uIFN5bnRoZXRpY0Jhc2VFdmVudChyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB0aGlzLl9yZWFjdE5hbWUgPSByZWFjdE5hbWU7XG4gICAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gICAgdGhpcy50eXBlID0gcmVhY3RFdmVudFR5cGU7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9wcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KF9wcm9wTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWxpemUgPSBJbnRlcmZhY2VbX3Byb3BOYW1lXTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBub3JtYWxpemUobmF0aXZlRXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbX3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7XG5cbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFzc2lnbihTeW50aGV0aWNCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSBcInByb3BlcnR5Y2hhbmdlXCIgZXZlbnQgZm9yXG4gICAgICAgIC8vIElFLiBUaGlzIGV2ZW50IGRvZXMgbm90IHN1cHBvcnQgYnViYmxpbmcgb3IgY2FuY2VsbGluZywgYW5kXG4gICAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRvIGNhbmNlbEJ1YmJsZSB0aHJvdyBcIk1lbWJlciBub3QgZm91bmRcIi4gIEFcbiAgICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mIFwidW5rbm93blwiIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNvXG4gICAgICAgIC8vIElFIHNwZWNpZmljKS5cbiAgICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXZSByZWxlYXNlIGFsbCBkaXNwYXRjaGVkIGBTeW50aGV0aWNFdmVudGBzIGFmdGVyIGVhY2ggZXZlbnQgbG9vcCwgYWRkaW5nXG4gICAgICogdGhlbSBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVyZW5jZSB0aGF0XG4gICAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqL1xuICAgIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHsvLyBNb2Rlcm4gZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzUGVyc2lzdGVudDogZnVuY3Rpb25UaGF0UmV0dXJuc1RydWVcbiAgfSk7XG4gIHJldHVybiBTeW50aGV0aWNCYXNlRXZlbnQ7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEV2ZW50SW50ZXJmYWNlID0ge1xuICBldmVudFBoYXNlOiAwLFxuICBidWJibGVzOiAwLFxuICBjYW5jZWxhYmxlOiAwLFxuICB0aW1lU3RhbXA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcbiAgfSxcbiAgZGVmYXVsdFByZXZlbnRlZDogMCxcbiAgaXNUcnVzdGVkOiAwXG59O1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgVUlFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgdmlldzogMCxcbiAgZGV0YWlsOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChVSUV2ZW50SW50ZXJmYWNlKTtcbnZhciBsYXN0TW92ZW1lbnRYO1xudmFyIGxhc3RNb3ZlbWVudFk7XG52YXIgbGFzdE1vdXNlRXZlbnQ7XG5cbmZ1bmN0aW9uIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KSB7XG4gIGlmIChldmVudCAhPT0gbGFzdE1vdXNlRXZlbnQpIHtcbiAgICBpZiAobGFzdE1vdXNlRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSBldmVudC5zY3JlZW5YIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSBldmVudC5zY3JlZW5ZIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IDA7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gMDtcbiAgICB9XG5cbiAgICBsYXN0TW91c2VFdmVudCA9IGV2ZW50O1xuICB9XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgTW91c2VFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgTW91c2VFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkYXRhVHJhbnNmZXI6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRHJhZ0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBGb2N1c0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRm9jdXNFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICByZWxhdGVkVGFyZ2V0OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0ZvY3VzRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChGb2N1c0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnRcbiAqL1xuXG52YXIgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgY2xpcGJvYXJkRGF0YTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdjbGlwYm9hcmREYXRhJyBpbiBldmVudCA/IGV2ZW50LmNsaXBib2FyZERhdGEgOiB3aW5kb3cuY2xpcGJvYXJkRGF0YTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNDbGlwYm9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENsaXBib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50c1xuICovXG5cbnZhciBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBkYXRhOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNVxuICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50c1xuICovXG4vLyBIYXBwZW5zIHRvIHNoYXJlIHRoZSBzYW1lIGxpc3QgZm9yIG5vdy5cblxudmFyIFN5bnRoZXRpY0lucHV0RXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50O1xuLyoqXG4gKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFsdWVzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciBub3JtYWxpemVLZXkgPSB7XG4gIEVzYzogJ0VzY2FwZScsXG4gIFNwYWNlYmFyOiAnICcsXG4gIExlZnQ6ICdBcnJvd0xlZnQnLFxuICBVcDogJ0Fycm93VXAnLFxuICBSaWdodDogJ0Fycm93UmlnaHQnLFxuICBEb3duOiAnQXJyb3dEb3duJyxcbiAgRGVsOiAnRGVsZXRlJyxcbiAgV2luOiAnT1MnLFxuICBNZW51OiAnQ29udGV4dE1lbnUnLFxuICBBcHBzOiAnQ29udGV4dE1lbnUnLFxuICBTY3JvbGw6ICdTY3JvbGxMb2NrJyxcbiAgTW96UHJpbnRhYmxlS2V5OiAnVW5pZGVudGlmaWVkJ1xufTtcbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgXG4gKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciB0cmFuc2xhdGVUb0tleSA9IHtcbiAgJzgnOiAnQmFja3NwYWNlJyxcbiAgJzknOiAnVGFiJyxcbiAgJzEyJzogJ0NsZWFyJyxcbiAgJzEzJzogJ0VudGVyJyxcbiAgJzE2JzogJ1NoaWZ0JyxcbiAgJzE3JzogJ0NvbnRyb2wnLFxuICAnMTgnOiAnQWx0JyxcbiAgJzE5JzogJ1BhdXNlJyxcbiAgJzIwJzogJ0NhcHNMb2NrJyxcbiAgJzI3JzogJ0VzY2FwZScsXG4gICczMic6ICcgJyxcbiAgJzMzJzogJ1BhZ2VVcCcsXG4gICczNCc6ICdQYWdlRG93bicsXG4gICczNSc6ICdFbmQnLFxuICAnMzYnOiAnSG9tZScsXG4gICczNyc6ICdBcnJvd0xlZnQnLFxuICAnMzgnOiAnQXJyb3dVcCcsXG4gICczOSc6ICdBcnJvd1JpZ2h0JyxcbiAgJzQwJzogJ0Fycm93RG93bicsXG4gICc0NSc6ICdJbnNlcnQnLFxuICAnNDYnOiAnRGVsZXRlJyxcbiAgJzExMic6ICdGMScsXG4gICcxMTMnOiAnRjInLFxuICAnMTE0JzogJ0YzJyxcbiAgJzExNSc6ICdGNCcsXG4gICcxMTYnOiAnRjUnLFxuICAnMTE3JzogJ0Y2JyxcbiAgJzExOCc6ICdGNycsXG4gICcxMTknOiAnRjgnLFxuICAnMTIwJzogJ0Y5JyxcbiAgJzEyMSc6ICdGMTAnLFxuICAnMTIyJzogJ0YxMScsXG4gICcxMjMnOiAnRjEyJyxcbiAgJzE0NCc6ICdOdW1Mb2NrJyxcbiAgJzE0NSc6ICdTY3JvbGxMb2NrJyxcbiAgJzIyNCc6ICdNZXRhJ1xufTtcbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHByb3BlcnR5LlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50S2V5KG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5rZXkpIHtcbiAgICAvLyBOb3JtYWxpemUgaW5jb25zaXN0ZW50IHZhbHVlcyByZXBvcnRlZCBieSBicm93c2VycyBkdWUgdG9cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYSB3b3JraW5nIGRyYWZ0IHNwZWNpZmljYXRpb24uXG4gICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGxcbiAgICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBpdC5cbiAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuXG4gICAgaWYgKGtleSAhPT0gJ1VuaWRlbnRpZmllZCcpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9IC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi5cblxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7IC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhblxuICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLlxuXG4gICAgcmV0dXJuIGNoYXJDb2RlID09PSAxMyA/ICdFbnRlcicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgfVxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxuXG52YXIgbW9kaWZpZXJLZXlUb1Byb3AgPSB7XG4gIEFsdDogJ2FsdEtleScsXG4gIENvbnRyb2w6ICdjdHJsS2V5JyxcbiAgTWV0YTogJ21ldGFLZXknLFxuICBTaGlmdDogJ3NoaWZ0S2V5J1xufTsgLy8gT2xkZXIgYnJvd3NlcnMgKFNhZmFyaSA8PSAxMCwgaU9TIFNhZmFyaSA8PSAxMC4yKSBkbyBub3Qgc3VwcG9ydFxuLy8gZ2V0TW9kaWZpZXJTdGF0ZS4gSWYgZ2V0TW9kaWZpZXJTdGF0ZSBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBtYXAgaXQgdG8gYSBzZXQgb2Zcbi8vIG1vZGlmaWVyIGtleXMgZXhwb3NlZCBieSB0aGUgZXZlbnQuIEluIHRoaXMgY2FzZSwgTG9jay1rZXlzIGFyZSBub3Qgc3VwcG9ydGVkLlxuXG5mdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZykge1xuICB2YXIgc3ludGhldGljRXZlbnQgPSB0aGlzO1xuICB2YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDtcblxuICBpZiAobmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZSkge1xuICAgIHJldHVybiBuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKGtleUFyZyk7XG4gIH1cblxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgS2V5Ym9hcmRFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIHBvaW50ZXJJZDogMCxcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgcHJlc3N1cmU6IDAsXG4gIHRhbmdlbnRpYWxQcmVzc3VyZTogMCxcbiAgdGlsdFg6IDAsXG4gIHRpbHRZOiAwLFxuICB0d2lzdDogMCxcbiAgcG9pbnRlclR5cGU6IDAsXG4gIGlzUHJpbWFyeTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNQb2ludGVyRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChQb2ludGVyRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFRvdWNoRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvdG91Y2gtZXZlbnRzL1xuICovXG5cbnZhciBUb3VjaEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHRvdWNoZXM6IDAsXG4gIHRhcmdldFRvdWNoZXM6IDAsXG4gIGNoYW5nZWRUb3VjaGVzOiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbn0pO1xuXG52YXIgU3ludGhldGljVG91Y2hFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRvdWNoRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2l0aW9uRXZlbnRcbiAqL1xuXG52YXIgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVggOiAwO1xuICB9LFxuICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiAwLFxuICAvLyBCcm93c2VycyB3aXRob3V0IFwiZGVsdGFNb2RlXCIgaXMgcmVwb3J0aW5nIGluIHJhdyB3aGVlbCBkZWx0YSB3aGVyZSBvbmVcbiAgLy8gbm90Y2ggb24gdGhlIHNjcm9sbCBpcyBhbHdheXMgKy8tIDEyMCwgcm91Z2hseSBlcXVpdmFsZW50IHRvIHBpeGVscy5cbiAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3JcbiAgLy8gfjQwIHBpeGVscywgZm9yIERPTV9ERUxUQV9TQ1JFRU4gKDIpIGl0IGlzIDg3LjUlIG9mIHZpZXdwb3J0IHNpemUuXG4gIGRlbHRhTW9kZTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoV2hlZWxFdmVudEludGVyZmFjZSk7XG5cbnZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJuLCBFc2MsIFNwYWNlXG5cbnZhciBTVEFSVF9LRVlDT0RFID0gMjI5O1xudmFyIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQgPSBjYW5Vc2VET00gJiYgJ0NvbXBvc2l0aW9uRXZlbnQnIGluIHdpbmRvdztcbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuXG5pZiAoY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50KSB7XG4gIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTtcbn0gLy8gV2Via2l0IG9mZmVycyBhIHZlcnkgdXNlZnVsIGB0ZXh0SW5wdXRgIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgdG9cbi8vIGRpcmVjdGx5IHJlcHJlc2VudCBgYmVmb3JlSW5wdXRgLiBUaGUgSUUgYHRleHRpbnB1dGAgZXZlbnQgaXMgbm90IGFzXG4vLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC5cblxuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBjYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGU7IC8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG5cbnZhciB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IGNhblVzZURPTSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTtcbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQmVmb3JlSW5wdXQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2tleXByZXNzJywgJ3RleHRJbnB1dCcsICdwYXN0ZSddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uRW5kJywgWydjb21wb3NpdGlvbmVuZCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uU3RhcnQnLCBbJ2NvbXBvc2l0aW9uc3RhcnQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblVwZGF0ZScsIFsnY29tcG9zaXRpb251cGRhdGUnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG59IC8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEga2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS5cblxuXG52YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlO1xuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIG5hdGl2ZSBrZXlwcmVzcyBldmVudCBpcyBhc3N1bWVkIHRvIGJlIGEgY29tbWFuZC5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZpcmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHNcbiAqIChjdXQsIGNvcHksIHNlbGVjdC1hbGwsIGV0Yy4pIGV2ZW4gdGhvdWdoIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZC5cbiAqL1xuXG5mdW5jdGlvbiBpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkge1xuICByZXR1cm4gKG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpICYmIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBpcyBub3QgYSBjb21tYW5kLlxuICAhKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQuYWx0S2V5KTtcbn1cbi8qKlxuICogVHJhbnNsYXRlIG5hdGl2ZSB0b3AgbGV2ZWwgZXZlbnRzIGludG8gZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblN0YXJ0JztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvbkVuZCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25VcGRhdGUnO1xuICB9XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIGJlc3QtZ3Vlc3MgbW9kZWwgdGhpbmsgdGhpcyBldmVudCBzaWduaWZpZXMgdGhhdFxuICogY29tcG9zaXRpb24gaGFzIGJlZ3VuP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicgJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTtcbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRoaXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJTUUgaW5wdXQuXG4gICAgICByZXR1cm4gRU5EX0tFWUNPREVTLmluZGV4T2YobmF0aXZlRXZlbnQua2V5Q29kZSkgIT09IC0xO1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAvLyBFeHBlY3QgSU1FIGtleUNvZGUgb24gZWFjaCBrZXlkb3duLiBJZiB3ZSBnZXQgYW55IG90aGVyXG4gICAgICAvLyBjb2RlIHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci5cbiAgICAgIHJldHVybiBuYXRpdmVFdmVudC5rZXlDb2RlICE9PSBTVEFSVF9LRVlDT0RFO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgLy8gRXZlbnRzIGFyZSBub3QgcG9zc2libGUgd2l0aG91dCBjYW5jZWxsaW5nIElNRS5cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBHb29nbGUgSW5wdXQgVG9vbHMgcHJvdmlkZXMgY29tcG9zaXRpb24gZGF0YSB2aWEgYSBDdXN0b21FdmVudCxcbiAqIHdpdGggdGhlIGBkYXRhYCBwcm9wZXJ0eSBwb3B1bGF0ZWQgaW4gdGhlIGBkZXRhaWxgIG9iamVjdC4gSWYgdGhpc1xuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBldmVudCBvYmplY3QsIHVzZSBpdC4gSWYgbm90LCB0aGlzIGlzIGEgcGxhaW5cbiAqIGNvbXBvc2l0aW9uIGV2ZW50IGFuZCB3ZSBoYXZlIG5vdGhpbmcgc3BlY2lhbCB0byBleHRyYWN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7P3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRldGFpbCA9IG5hdGl2ZUV2ZW50LmRldGFpbDtcblxuICBpZiAodHlwZW9mIGRldGFpbCA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIGRldGFpbCkge1xuICAgIHJldHVybiBkZXRhaWwuZGF0YTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDaGVjayBpZiBhIGNvbXBvc2l0aW9uIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgS29yZWFuIElNRS5cbiAqIE91ciBmYWxsYmFjayBtb2RlIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIElFJ3MgS29yZWFuIElNRSxcbiAqIHNvIGp1c3QgdXNlIG5hdGl2ZSBjb21wb3NpdGlvbiBldmVudHMgd2hlbiBLb3JlYW4gSU1FIGlzIHVzZWQuXG4gKiBBbHRob3VnaCBDb21wb3NpdGlvbkV2ZW50LmxvY2FsZSBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLFxuICogaXQgaXMgYXZhaWxhYmxlIGluIElFLCB3aGVyZSBvdXIgZmFsbGJhY2sgbW9kZSBpcyBlbmFibGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG5hdGl2ZUV2ZW50LmxvY2FsZSA9PT0gJ2tvJztcbn0gLy8gVHJhY2sgdGhlIGN1cnJlbnQgSU1FIGNvbXBvc2l0aW9uIHN0YXR1cywgaWYgYW55LlxuXG5cbnZhciBpc0NvbXBvc2luZyA9IGZhbHNlO1xuLyoqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuXG4gKi9cblxuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZTtcbiAgdmFyIGZhbGxiYWNrRGF0YTtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSk7XG4gIH0gZWxzZSBpZiAoIWlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvblN0YXJ0JztcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25FbmQnO1xuICB9XG5cbiAgaWYgKCFldmVudFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBpcyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmVcbiAgICAvLyBvdmVyd3JpdHRlbiB3aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuXG4gICAgaWYgKCFpc0NvbXBvc2luZyAmJiBldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uU3RhcnQnKSB7XG4gICAgICBpc0NvbXBvc2luZyA9IGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvbkVuZCcpIHtcbiAgICAgIGlmIChpc0NvbXBvc2luZykge1xuICAgICAgICBmYWxsYmFja0RhdGEgPSBnZXREYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCBldmVudFR5cGUpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50KGV2ZW50VHlwZSwgZG9tRXZlbnROYW1lLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuXG4gICAgaWYgKGZhbGxiYWNrRGF0YSkge1xuICAgICAgLy8gSW5qZWN0IGRhdGEgZ2VuZXJhdGVkIGZyb20gZmFsbGJhY2sgcGF0aCBpbnRvIHRoZSBzeW50aGV0aWMgZXZlbnQuXG4gICAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlLlxuICAgICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKGN1c3RvbURhdGEgIT09IG51bGwpIHtcbiAgICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBpcyB0byBtYWtlXG4gICAgICAgKiB1c2Ugb2YgdGhlbS4gSG93ZXZlciwgdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2U6IHRoZSBzcGFjZWJhciBrZXkuXG4gICAgICAgKiBJbiBXZWJraXQsIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBhIHNwYWNlYmFyIGB0ZXh0SW5wdXRgIGV2ZW50XG4gICAgICAgKiBjYW5jZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2VyXG4gICAgICAgKiB0byBmYWxsIGJhY2sgdG8gaXRzIGRlZmF1bHQgc3BhY2ViYXIgYmVoYXZpb3Igb2Ygc2Nyb2xsaW5nIHRoZVxuICAgICAgICogcGFnZS5cbiAgICAgICAqXG4gICAgICAgKiBUcmFja2luZyBhdDpcbiAgICAgICAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNTUxMDNcbiAgICAgICAqXG4gICAgICAgKiBUbyBhdm9pZCB0aGlzIGlzc3VlLCB1c2UgdGhlIGtleXByZXNzIGV2ZW50IGFzIGlmIG5vIGB0ZXh0SW5wdXRgXG4gICAgICAgKiBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgKi9cbiAgICAgIHZhciB3aGljaCA9IG5hdGl2ZUV2ZW50LndoaWNoO1xuXG4gICAgICBpZiAod2hpY2ggIT09IFNQQUNFQkFSX0NPREUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSB0cnVlO1xuICAgICAgcmV0dXJuIFNQQUNFQkFSX0NIQVI7XG5cbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgICAgLy8gUmVjb3JkIHRoZSBjaGFyYWN0ZXJzIHRvIGJlIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICB2YXIgY2hhcnMgPSBuYXRpdmVFdmVudC5kYXRhOyAvLyBJZiBpdCdzIGEgc3BhY2ViYXIgY2hhcmFjdGVyLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZFxuICAgICAgLy8gaXQgYXQgdGhlIGtleXByZXNzIGxldmVsIGFuZCBiYWlsIGltbWVkaWF0ZWx5LiBBbmRyb2lkIENocm9tZVxuICAgICAgLy8gZG9lc24ndCBnaXZlIHVzIGtleWNvZGVzLCBzbyB3ZSBuZWVkIHRvIGlnbm9yZSBpdC5cblxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlIGB0ZXh0SW5wdXRgIGV2ZW50LCBleHRyYWN0IHRoZVxuICogYXBwcm9wcmlhdGUgc3RyaW5nIHRvIHVzZSBmb3IgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxiYWNrIHRvIGRvIHNvLFxuICAvLyB0cnkgdG8gZXh0cmFjdCB0aGUgY29tcG9zZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBmYWxsYmFjayBvYmplY3QuXG4gIC8vIElmIGNvbXBvc2l0aW9uIGV2ZW50IGlzIGF2YWlsYWJsZSwgd2UgZXh0cmFjdCBhIHN0cmluZyBvbmx5IGF0XG4gIC8vIGNvbXBvc2l0aW9uZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy5cbiAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NvbXBvc2l0aW9uZW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGdldERhdGEoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICAvLyBJZiBhIHBhc3RlIGV2ZW50IG9jY3VycyBhZnRlciBhIGtleXByZXNzLCB0aHJvdyBvdXQgdGhlIGlucHV0XG4gICAgICAvLyBjaGFycy4gUGFzdGUgZXZlbnRzIHNob3VsZCBub3QgbGVhZCB0byBCZWZvcmVJbnB1dCBldmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogQXMgb2YgdjI3LCBGaXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyXG4gICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBubyBjaGFyIGlzIGF2YWlsYWJsZS5cbiAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlzaC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvclxuICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUgYDEwMGAgYW55d2F5LlxuICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgYSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzXG4gICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21kK0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBub1xuICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKi9cbiAgICAgIGlmICghaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIC8vIElFIGZpcmVzIHRoZSBga2V5cHJlc3NgIGV2ZW50IHdoZW4gYSB1c2VyIHR5cGVzIGFuIGVtb2ppIHZpYVxuICAgICAgICAvLyBUb3VjaCBrZXlib2FyZCBvZiBXaW5kb3dzLiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBgY2hhcmAgcHJvcGVydHlcbiAgICAgICAgLy8gaG9sZHMgYW4gZW1vamkgY2hhcmFjdGVyIGxpa2UgYFxcdUQ4M0RcXHVERTBBYC4gIEJlY2F1c2UgaXRzIGxlbmd0aFxuICAgICAgICAvLyBpcyAyLCB0aGUgcHJvcGVydHkgYHdoaWNoYCBkb2VzIG5vdCByZXByZXNlbnQgYW4gZW1vamkgY29ycmVjdGx5LlxuICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSwgd2UgZGlyZWN0bHkgcmV0dXJuIHRoZSBgY2hhcmAgcHJvcGVydHkgaW5zdGVhZCBvZlxuICAgICAgICAvLyB1c2luZyBgd2hpY2hgLlxuICAgICAgICBpZiAobmF0aXZlRXZlbnQuY2hhciAmJiBuYXRpdmVFdmVudC5jaGFyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQuY2hhcjtcbiAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVFdmVudC53aGljaCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkgPyBudWxsIDogbmF0aXZlRXZlbnQuZGF0YTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBFeHRyYWN0IGEgU3ludGhldGljSW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZVxuICogYHRleHRJbnB1dGAgb3IgZmFsbGJhY2sgYmVoYXZpb3IuXG4gKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGNoYXJzO1xuXG4gIGlmIChjYW5Vc2VUZXh0SW5wdXRFdmVudCkge1xuICAgIGNoYXJzID0gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjaGFycyA9IGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZlbnQgc2hvdWxkXG4gIC8vIGJlIGZpcmVkLlxuXG5cbiAgaWYgKCFjaGFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCAnb25CZWZvcmVJbnB1dCcpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNJbnB1dEV2ZW50KCdvbkJlZm9yZUlucHV0JywgJ2JlZm9yZWlucHV0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgICBldmVudC5kYXRhID0gY2hhcnM7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RoZS1pbnB1dC1lbGVtZW50Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAqL1xudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gIGNvbG9yOiB0cnVlLFxuICBkYXRlOiB0cnVlLFxuICBkYXRldGltZTogdHJ1ZSxcbiAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSxcbiAgZW1haWw6IHRydWUsXG4gIG1vbnRoOiB0cnVlLFxuICBudW1iZXI6IHRydWUsXG4gIHBhc3N3b3JkOiB0cnVlLFxuICByYW5nZTogdHJ1ZSxcbiAgc2VhcmNoOiB0cnVlLFxuICB0ZWw6IHRydWUsXG4gIHRleHQ6IHRydWUsXG4gIHRpbWU6IHRydWUsXG4gIHVybDogdHJ1ZSxcbiAgd2VlazogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcpIHtcbiAgICByZXR1cm4gISFzdXBwb3J0ZWRJbnB1dFR5cGVzW2VsZW0udHlwZV07XG4gIH1cblxuICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBOT1RFOiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciBub24tZ2VuZXJpYyBldmVudHMgc3VjaCBhcyBgY2hhbmdlYCxcbiAqIGByZXNldGAsIGBsb2FkYCwgYGVycm9yYCwgYW5kIGBzZWxlY3RgLlxuICpcbiAqIEJvcnJvd3MgZnJvbSBNb2Rlcm5penIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVN1ZmZpeCBFdmVudCBuYW1lLCBlLmcuIFwiY2xpY2tcIi5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IGlzIHN1cHBvcnRlZC5cbiAqIEBpbnRlcm5hbFxuICogQGxpY2Vuc2UgTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4gKi9cblxuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgaWYgKCFjYW5Vc2VET00pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gKGV2ZW50TmFtZSBpbiBkb2N1bWVudCk7XG5cbiAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpO1xuICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHJldHVybiBpc1N1cHBvcnRlZDtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMSgpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNoYW5nZScsIFsnY2hhbmdlJywgJ2NsaWNrJywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnaW5wdXQnLCAna2V5ZG93bicsICdrZXl1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KSB7XG4gIC8vIEZsYWcgdGhpcyBldmVudCBsb29wIGFzIG5lZWRpbmcgc3RhdGUgcmVzdG9yZS5cbiAgZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpO1xuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGluc3QsICdvbkNoYW5nZScpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25DaGFuZ2UnLCAnY2hhbmdlJywgbnVsbCwgbmF0aXZlRXZlbnQsIHRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cblxuXG52YXIgYWN0aXZlRWxlbWVudCA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnRcbiAqL1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDaGFuZ2VFdmVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ2ZpbGUnO1xufVxuXG5mdW5jdGlvbiBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSk7IC8vIElmIGNoYW5nZSBhbmQgcHJvcGVydHljaGFuZ2UgYnViYmxlZCwgd2UnZCBqdXN0IGJpbmQgdG8gaXQgbGlrZSBhbGwgdGhlXG4gIC8vIG90aGVyIGV2ZW50cyBhbmQgaGF2ZSBpdCBnbyB0aHJvdWdoIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci4gU2luY2UgaXRcbiAgLy8gZG9lc24ndCwgd2UgbWFudWFsbHkgbGlzdGVuIGZvciB0aGUgZXZlbnRzIGFuZCBzbyB3ZSBoYXZlIHRvIGVucXVldWUgYW5kXG4gIC8vIHByb2Nlc3MgdGhlIGFic3RyYWN0IGV2ZW50IG1hbnVhbGx5LlxuICAvL1xuICAvLyBCYXRjaGluZyBpcyBuZWNlc3NhcnkgaGVyZSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhbGwgZXZlbnQgaGFuZGxlcnMgcnVuXG4gIC8vIGJlZm9yZSB0aGUgbmV4dCByZXJlbmRlciAoaW5jbHVkaW5nIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuY2VzdG9yXG4gIC8vIGVsZW1lbnRzIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIGlucHV0KS4gV2l0aG91dCB0aGlzLCBjb250cm9sbGVkXG4gIC8vIGNvbXBvbmVudHMgZG9uJ3Qgd29yayBwcm9wZXJseSBpbiBjb25qdW5jdGlvbiB3aXRoIGV2ZW50IGJ1YmJsaW5nIGJlY2F1c2VcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyByZXJlbmRlcmVkIGFuZCB0aGUgdmFsdWUgcmV2ZXJ0ZWQgYmVmb3JlIGFsbCB0aGUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgY2FuIHJ1bi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzA4LlxuXG4gIGJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZGlzcGF0Y2hRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChkaXNwYXRjaFF1ZXVlKSB7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIDApO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCkge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCk7XG5cbiAgaWYgKHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRhcmdldE5vZGUpKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50XG4gKi9cblxuXG52YXIgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gZmFsc2U7XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuXG4gIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLlxuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdpbnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDkpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgU3RhcnRzIHRyYWNraW5nIHByb3BlcnR5Y2hhbmdlIGV2ZW50cyBvbiB0aGUgcGFzc2VkLWluIGVsZW1lbnRcbiAqIGFuZCBvdmVycmlkZSB0aGUgdmFsdWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggdXNlciBldmVudHMgZnJvbVxuICogdmFsdWUgY2hhbmdlcyBpbiBKUy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsXG4gKiBpZiBhbnkgZXhpc3RzLlxuICovXG5cblxuZnVuY3Rpb24gc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKSB7XG4gIGlmICghYWN0aXZlRWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBIYW5kbGVzIGEgcHJvcGVydHljaGFuZ2UgZXZlbnQsIHNlbmRpbmcgYSBgY2hhbmdlYCBldmVudCBpZlxuICogdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBoYXMgY2hhbmdlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KSkge1xuICAgIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNpbicpIHtcbiAgICAvLyBJbiBJRTksIHByb3BlcnR5Y2hhbmdlIGZpcmVzIGZvciBtb3N0IGlucHV0IGV2ZW50cyBidXQgaXMgYnVnZ3kgYW5kXG4gICAgLy8gZG9lc24ndCBmaXJlIHdoZW4gdGV4dCBpcyBkZWxldGVkLCBidXQgY29udmVuaWVudGx5LCBzZWxlY3Rpb25jaGFuZ2VcbiAgICAvLyBhcHBlYXJzIHRvIGZpcmUgaW4gYWxsIG9mIHRoZSByZW1haW5pbmcgY2FzZXMgc28gd2UgY2F0Y2ggdGhvc2UgYW5kXG4gICAgLy8gZm9yd2FyZCB0aGUgZXZlbnQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkXG4gICAgLy8gSW4gZWl0aGVyIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gY2FsbCB0aGUgZXZlbnQgaGFuZGxlciBpZiB0aGUgdmFsdWVcbiAgICAvLyBpcyBjaGFuZ2VkIGZyb20gSlMgc28gd2UgcmVkZWZpbmUgYSBzZXR0ZXIgZm9yIGAudmFsdWVgIHRoYXQgdXBkYXRlc1xuICAgIC8vIG91ciBhY3RpdmVFbGVtZW50VmFsdWUgdmFyaWFibGUsIGFsbG93aW5nIHVzIHRvIGlnbm9yZSB0aG9zZSBjaGFuZ2VzXG4gICAgLy9cbiAgICAvLyBzdG9wV2F0Y2hpbmcoKSBzaG91bGQgYmUgYSBub29wIGhlcmUgYnV0IHdlIGNhbGwgaXQganVzdCBpbiBjYXNlIHdlXG4gICAgLy8gbWlzc2VkIGEgYmx1ciBldmVudCBzb21laG93LlxuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gICAgc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCk7XG4gIH0gZWxzZSBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgfVxufSAvLyBGb3IgSUU4IGFuZCBJRTkuXG5cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3NlbGVjdGlvbmNoYW5nZScgfHwgZG9tRXZlbnROYW1lID09PSAna2V5dXAnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0XG4gICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlXG4gICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGFcbiAgICAvLyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1cCB1c3VhbGx5XG4gICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdFxuICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodFxuICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBhc3RlKSBzZWVtIHRvXG4gICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuXG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCk7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkge1xuICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy5cbiAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmVcbiAgLy8gdW50aWwgYGJsdXJgIGluIElFOC5cbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NsaWNrJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2lucHV0JyB8fCBkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKG5vZGUpIHtcbiAgdmFyIHN0YXRlID0gbm9kZS5fd3JhcHBlclN0YXRlO1xuXG4gIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbnRyb2xsZWQgfHwgbm9kZS50eXBlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBJZiBjb250cm9sbGVkLCBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBvbiBibHVyXG4gICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsICdudW1iZXInLCBub2RlLnZhbHVlKTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG4gIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jO1xuXG4gIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50O1xuICB9IGVsc2UgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSkge1xuICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgaGFuZGxlRXZlbnRGdW5jID0gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudDtcbiAgfVxuXG4gIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgIHZhciBpbnN0ID0gZ2V0VGFyZ2V0SW5zdEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KTtcblxuICAgIGlmIChpbnN0KSB7XG4gICAgICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgaGFuZGxlRXZlbnRGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0Tm9kZSwgdGFyZ2V0SW5zdCk7XG4gIH0gLy8gV2hlbiBibHVycmluZywgc2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIG51bWJlciBpbnB1dHNcblxuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldE5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDIoKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VFbnRlcicsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlTGVhdmUnLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyRW50ZXInLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckxlYXZlJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xufVxuLyoqXG4gKiBGb3IgYWxtb3N0IGV2ZXJ5IGludGVyYWN0aW9uIHdlIGNhcmUgYWJvdXQsIHRoZXJlIHdpbGwgYmUgYm90aCBhIHRvcC1sZXZlbFxuICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRoZSBtb3VzZSBpbnRvIHRoZVxuICogYnJvd3NlciBmcm9tIG91dHNpZGUgd2lsbCBub3QgZmlyZSBhIGBtb3VzZW91dGAgZXZlbnQuIEluIHRoaXMgY2FzZSwgd2UgdXNlXG4gKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGlzT3ZlckV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdmVyJyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3Zlcic7XG4gIHZhciBpc091dEV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnO1xuXG4gIGlmIChpc092ZXJFdmVudCAmJiAhaXNSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c0FbaV07XG5cbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwgY3VycmVudEtleSkgfHwgIW9iamVjdElzKG9iakFbY3VycmVudEtleV0sIG9iakJbY3VycmVudEtleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogR2l2ZW4gYW55IG5vZGUgcmV0dXJuIHRoZSBmaXJzdCBsZWFmIG5vZGUgd2l0aG91dCBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuZnVuY3Rpb24gZ2V0TGVhZk5vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlID0gbm9kZS5maXJzdENoaWxkO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyB3aWxsIHdhbGsgdXAgdGhlXG4gKiBET00gaWYgYSBub2RlJ3Mgc2libGluZ3MgaGF2ZSBiZWVuIGV4aGF1c3RlZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0U2libGluZ05vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG59XG4vKipcbiAqIEdldCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbm9kZXMgd2hpY2ggY29udGFpbiBjaGFyYWN0ZXJzIGF0IG9mZnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IHJvb3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpO1xuICB2YXIgbm9kZVN0YXJ0ID0gMDtcbiAgdmFyIG5vZGVFbmQgPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgbm9kZUVuZCA9IG5vZGVTdGFydCArIG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICBpZiAobm9kZVN0YXJ0IDw9IG9mZnNldCAmJiBub2RlRW5kID49IG9mZnNldCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQgLSBub2RlU3RhcnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0ID0gbm9kZUVuZDtcbiAgICB9XG5cbiAgICBub2RlID0gZ2V0TGVhZk5vZGUoZ2V0U2libGluZ05vZGUobm9kZSkpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBvdXRlck5vZGVcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0cyhvdXRlck5vZGUpIHtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBvdXRlck5vZGUub3duZXJEb2N1bWVudDtcbiAgdmFyIHdpbiA9IG93bmVyRG9jdW1lbnQgJiYgb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uICYmIHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGFuY2hvck5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7IC8vIEluIEZpcmVmb3gsIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBjYW4gYmUgXCJhbm9ueW1vdXMgZGl2c1wiLCBlLmcuIHRoZVxuICAvLyB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91cyBkaXZzIGRvIG5vdCBzZWVtIHRvXG4gIC8vIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZCBlcnJvclwiIGlmIGFueSBvZiBpdHNcbiAgLy8gcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZSB3YXkgdG8gYXZvaWQgZXJyb3JpbmdcbiAgLy8gaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmRcbiAgLy8gY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgYW5jaG9yTm9kZS5ub2RlVHlwZTtcbiAgICBmb2N1c05vZGUubm9kZVR5cGU7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbn1cbi8qKlxuICogUmV0dXJucyB7c3RhcnQsIGVuZH0gd2hlcmUgYHN0YXJ0YCBpcyB0aGUgY2hhcmFjdGVyL2NvZGVwb2ludCBpbmRleCBvZlxuICogKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkgd2l0aGluIHRoZSB0ZXh0Q29udGVudCBvZiBgb3V0ZXJOb2RlYCwgYW5kXG4gKiBgZW5kYCBpcyB0aGUgaW5kZXggb2YgKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpLlxuICpcbiAqIFJldHVybnMgbnVsbCBpZiB5b3UgcGFzcyBpbiBnYXJiYWdlIGlucHV0IGJ1dCB3ZSBzaG91bGQgcHJvYmFibHkganVzdCBjcmFzaC5cbiAqXG4gKiBFeHBvcnRlZCBvbmx5IGZvciB0ZXN0aW5nLlxuICovXG5cbmZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gIHZhciBsZW5ndGggPSAwO1xuICB2YXIgc3RhcnQgPSAtMTtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgaW5kZXhXaXRoaW5BbmNob3IgPSAwO1xuICB2YXIgaW5kZXhXaXRoaW5Gb2N1cyA9IDA7XG4gIHZhciBub2RlID0gb3V0ZXJOb2RlO1xuICB2YXIgcGFyZW50Tm9kZSA9IG51bGw7XG5cbiAgb3V0ZXI6IHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHQgPSBudWxsO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBhbmNob3JOb2RlICYmIChhbmNob3JPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aCArIGFuY2hvck9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZvY3VzTm9kZSAmJiAoZm9jdXNPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBlbmQgPSBsZW5ndGggKyBmb2N1c09mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgICBsZW5ndGggKz0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLmZpcnN0Q2hpbGQpID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIGZpcnN0IGNoaWxkIGBuZXh0YC5cblxuXG4gICAgICBwYXJlbnROb2RlID0gbm9kZTtcbiAgICAgIG5vZGUgPSBuZXh0O1xuICAgIH1cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gb3V0ZXJOb2RlKSB7XG4gICAgICAgIC8vIElmIGBvdXRlck5vZGVgIGhhcyBjaGlsZHJlbiwgdGhpcyBpcyBhbHdheXMgdGhlIHNlY29uZCB0aW1lIHZpc2l0aW5nXG4gICAgICAgIC8vIGl0LiBJZiBpdCBoYXMgbm8gY2hpbGRyZW4sIHRoaXMgaXMgc3RpbGwgdGhlIGZpcnN0IGxvb3AsIGFuZCB0aGUgb25seVxuICAgICAgICAvLyB2YWxpZCBzZWxlY3Rpb24gaXMgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGJvdGggZXF1YWwgdG8gdGhpcyBub2RlXG4gICAgICAgIC8vIGFuZCBib3RoIG9mZnNldHMgMCwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGhhdmUgaGFuZGxlZCBhYm92ZS5cbiAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBhbmNob3JOb2RlICYmICsraW5kZXhXaXRoaW5BbmNob3IgPT09IGFuY2hvck9mZnNldCkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGZvY3VzTm9kZSAmJiArK2luZGV4V2l0aGluRm9jdXMgPT09IGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5uZXh0U2libGluZykgIT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgbmV4dCBzaWJsaW5nIGBuZXh0YC5cblxuXG4gICAgbm9kZSA9IG5leHQ7XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCA9PT0gLTEpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIChXb3VsZCBoYXBwZW4gaWYgdGhlIGFuY2hvci9mb2N1cyBub2RlcyBhcmVuJ3RcbiAgICAvLyBhY3R1YWxseSBpbnNpZGUgdGhlIHBhc3NlZC1pbiBub2RlLilcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kXG4gIH07XG59XG4vKipcbiAqIEluIG1vZGVybiBub24tSUUgYnJvd3NlcnMsIHdlIGNhbiBzdXBwb3J0IGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmRcbiAqIHNlbGVjdGlvbnMuXG4gKlxuICogTm90ZTogSUUxMCsgc3VwcG9ydHMgdGhlIFNlbGVjdGlvbiBvYmplY3QsIGJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0XG4gKiB0aGUgYGV4dGVuZGAgbWV0aG9kLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gaW4gbW9kZXJuIElFLCBpdCdzIG5vdCBwb3NzaWJsZVxuICogdG8gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGUgYSBiYWNrd2FyZCBzZWxlY3Rpb24uIFRodXMsIGZvciBhbGwgSUVcbiAqIHZlcnNpb25zLCB3ZSB1c2UgdGhlIG9sZCBJRSBBUEkgdG8gY3JlYXRlIG91ciBzZWxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAqL1xuXG5mdW5jdGlvbiBzZXRPZmZzZXRzKG5vZGUsIG9mZnNldHMpIHtcbiAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgdmFyIHdpbiA9IGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OyAvLyBFZGdlIGZhaWxzIHdpdGggXCJPYmplY3QgZXhwZWN0ZWRcIiBpbiBzb21lIHNjZW5hcmlvcy5cbiAgLy8gKEZvciBpbnN0YW5jZTogVGlueU1DRSBlZGl0b3IgdXNlZCBpbiBhIGxpc3QgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgcGFzdGluZyB0byBhZGQgbW9yZSxcbiAgLy8gZmFpbHMgd2hlbiBwYXN0aW5nIDEwMCsgaXRlbXMpXG5cbiAgaWYgKCF3aW4uZ2V0U2VsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgdmFyIGxlbmd0aCA9IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBNYXRoLm1pbihvZmZzZXRzLnN0YXJ0LCBsZW5ndGgpO1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogTWF0aC5taW4ob2Zmc2V0cy5lbmQsIGxlbmd0aCk7IC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC5cbiAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuXG5cbiAgaWYgKCFzZWxlY3Rpb24uZXh0ZW5kICYmIHN0YXJ0ID4gZW5kKSB7XG4gICAgdmFyIHRlbXAgPSBlbmQ7XG4gICAgZW5kID0gc3RhcnQ7XG4gICAgc3RhcnQgPSB0ZW1wO1xuICB9XG5cbiAgdmFyIHN0YXJ0TWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBzdGFydCk7XG4gIHZhciBlbmRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIGVuZCk7XG5cbiAgaWYgKHN0YXJ0TWFya2VyICYmIGVuZE1hcmtlcikge1xuICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMSAmJiBzZWxlY3Rpb24uYW5jaG9yTm9kZSA9PT0gc3RhcnRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ID09PSBzdGFydE1hcmtlci5vZmZzZXQgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZSA9PT0gZW5kTWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ID09PSBlbmRNYXJrZXIub2Zmc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnRNYXJrZXIubm9kZSwgc3RhcnRNYXJrZXIub2Zmc2V0KTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZSkge1xuICBpZiAoIW91dGVyTm9kZSB8fCAhaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShvdXRlck5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUoaW5uZXJOb2RlKSkge1xuICAgIHJldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSk7XG4gIH0gZWxzZSBpZiAoJ2NvbnRhaW5zJyBpbiBvdXRlck5vZGUpIHtcbiAgICByZXR1cm4gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSk7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuICEhKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpbm5lck5vZGUpICYgMTYpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgY29udGFpbnNOb2RlKG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW5GcmFtZShpZnJhbWUpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2Nlc3NpbmcgdGhlIGNvbnRlbnREb2N1bWVudCBvZiBhIEhUTUxJZnJhbWVFbGVtZW50IGNhbiBjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIHRvIHRocm93LCBlLmcuIGlmIGl0IGhhcyBhIGNyb3NzLW9yaWdpbiBzcmMgYXR0cmlidXRlLlxuICAgIC8vIFNhZmFyaSB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgYWNjZXNzIHJlc3VsdHMgaW4gXCJCbG9ja2VkIGEgZnJhbWUgd2l0aCBvcmlnaW5cIi4gZS5nOlxuICAgIC8vIGlmcmFtZS5jb250ZW50RG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgLy8gQSBzYWZldHkgd2F5IGlzIHRvIGFjY2VzcyBvbmUgb2YgdGhlIGNyb3NzIG9yaWdpbiBwcm9wZXJ0aWVzOiBXaW5kb3cgb3IgTG9jYXRpb25cbiAgICAvLyBXaGljaCBtaWdodCByZXN1bHQgaW4gXCJTZWN1cml0eUVycm9yXCIgRE9NIEV4Y2VwdGlvbiBhbmQgaXQgaXMgY29tcGF0aWJsZSB0byBTYWZhcmkuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNpbnRlZ3JhdGlvbi13aXRoLWlkbFxuICAgIHJldHVybiB0eXBlb2YgaWZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiA9PT0gJ3N0cmluZyc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50RGVlcCgpIHtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KCk7XG5cbiAgd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW4uSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICBpZiAoaXNTYW1lT3JpZ2luRnJhbWUoZWxlbWVudCkpIHtcbiAgICAgIHdpbiA9IGVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQod2luLmRvY3VtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuLyoqXG4gKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLFxuICogYnV0IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1ZyBmaXhlcyAoZG9lc24ndFxuICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25zIGFsbG93ZWQpLlxuICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuXG4gKi9cblxuLyoqXG4gKiBAaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzOiB3ZSBnZXQgdGhlIGVsZW1lbnQgdHlwZXMgdGhhdCBzdXBwb3J0IHNlbGVjdGlvblxuICogZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNkby1ub3QtYXBwbHksIGxvb2tpbmcgYXQgYHNlbGVjdGlvblN0YXJ0YFxuICogYW5kIGBzZWxlY3Rpb25FbmRgIHJvd3MuXG4gKi9cblxuXG5mdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtLnR5cGUgPT09ICdzZWFyY2gnIHx8IGVsZW0udHlwZSA9PT0gJ3RlbCcgfHwgZWxlbS50eXBlID09PSAndXJsJyB8fCBlbGVtLnR5cGUgPT09ICdwYXNzd29yZCcpIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xufVxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKSB7XG4gIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHJldHVybiB7XG4gICAgZm9jdXNlZEVsZW06IGZvY3VzZWRFbGVtLFxuICAgIHNlbGVjdGlvblJhbmdlOiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6IG51bGxcbiAgfTtcbn1cbi8qKlxuICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsXG4gKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LlxuICovXG5cbmZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24ocHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbikge1xuICB2YXIgY3VyRm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07XG4gIHZhciBwcmlvclNlbGVjdGlvblJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTtcblxuICBpZiAoY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiYgaXNJbkRvY3VtZW50KHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgaWYgKHByaW9yU2VsZWN0aW9uUmFuZ2UgIT09IG51bGwgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgICBzZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25SYW5nZSk7XG4gICAgfSAvLyBGb2N1c2luZyBhIG5vZGUgY2FuIGNoYW5nZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB3aGljaCBpcyB1bmRlc2lyYWJsZVxuXG5cbiAgICB2YXIgYW5jZXN0b3JzID0gW107XG4gICAgdmFyIGFuY2VzdG9yID0gcHJpb3JGb2N1c2VkRWxlbTtcblxuICAgIHdoaWxlIChhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChhbmNlc3Rvci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBhbmNlc3RvcixcbiAgICAgICAgICBsZWZ0OiBhbmNlc3Rvci5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHRvcDogYW5jZXN0b3Iuc2Nyb2xsVG9wXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IGFuY2VzdG9yc1tpXTtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxMZWZ0ID0gaW5mby5sZWZ0O1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbFRvcCA9IGluZm8udG9wO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBAZ2V0U2VsZWN0aW9uOiBHZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgZm9jdXNlZCB0ZXh0YXJlYSwgaW5wdXQgb3JcbiAqIGNvbnRlbnRFZGl0YWJsZSBub2RlLlxuICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXRcbiAqIC1AcmV0dXJuIHtzdGFydDogc2VsZWN0aW9uU3RhcnQsIGVuZDogc2VsZWN0aW9uRW5kfVxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihpbnB1dCkge1xuICB2YXIgc2VsZWN0aW9uO1xuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXIgd2l0aCBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSB7XG4gICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29udGVudCBlZGl0YWJsZSBvciBvbGQgSUUgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0gZ2V0T2Zmc2V0cyhpbnB1dCk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0aW9uIHx8IHtcbiAgICBzdGFydDogMCxcbiAgICBlbmQ6IDBcbiAgfTtcbn1cbi8qKlxuICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzXG4gKiB0aGUgaW5wdXQuXG4gKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqXG4gKi9cblxuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGlucHV0LCBvZmZzZXRzKSB7XG4gIHZhciBzdGFydCA9IG9mZnNldHMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZDtcblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSBzdGFydDtcbiAgfVxuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICBpbnB1dC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihlbmQsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7XG4gIH1cbn1cblxudmFyIHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCA9IGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPD0gMTE7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25TZWxlY3QnLCBbJ2ZvY3Vzb3V0JywgJ2NvbnRleHRtZW51JywgJ2RyYWdlbmQnLCAnZm9jdXNpbicsICdrZXlkb3duJywgJ2tleXVwJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxudmFyIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG52YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG52YXIgbW91c2VEb3duID0gZmFsc2U7XG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2hpY2ggaXMgYSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYmUgY29uc2lzdGVudCBhY3Jvc3Mgbm9kZXMgb3IgYnJvd3NlcnMsIGJ1dFxuICogdHdvIGlkZW50aWNhbCBzZWxlY3Rpb25zIG9uIHRoZSBzYW1lIG5vZGUgd2lsbCByZXR1cm4gaWRlbnRpY2FsIG9iamVjdHMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uJDEobm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhub2RlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbm9kZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogbm9kZS5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmNob3JOb2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEdldCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRhcmdldC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQoZXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIGV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC5kb2N1bWVudCA6IGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gZXZlbnRUYXJnZXQgOiBldmVudFRhcmdldC5vd25lckRvY3VtZW50O1xufVxuLyoqXG4gKiBQb2xsIHNlbGVjdGlvbiB0byBzZWUgd2hldGhlciBpdCdzIGNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRUYXJnZXRcbiAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgZWxlbWVudCwgYW5kIHRoYXQgdGhlIHVzZXIgaXMgbm90IGRyYWdnaW5nIGFcbiAgLy8gc2VsZWN0aW9uICh0aGlzIG1hdGNoZXMgbmF0aXZlIGBzZWxlY3RgIGV2ZW50IGJlaGF2aW9yKS4gSW4gSFRNTDUsIHNlbGVjdFxuICAvLyBmaXJlcyBvbmx5IG9uIGlucHV0IGFuZCB0ZXh0YXJlYSB0aHVzIGlmIHRoZXJlJ3Mgbm8gZm9jdXNlZCBlbGVtZW50IHdlXG4gIC8vIHdvbid0IGRpc3BhdGNoLlxuICB2YXIgZG9jID0gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG1vdXNlRG93biB8fCBhY3RpdmVFbGVtZW50JDEgPT0gbnVsbCB8fCBhY3RpdmVFbGVtZW50JDEgIT09IGdldEFjdGl2ZUVsZW1lbnQoZG9jKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBPbmx5IGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG5cblxuICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbiQxKGFjdGl2ZUVsZW1lbnQkMSk7XG5cbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGFjdGl2ZUVsZW1lbnRJbnN0JDEsICdvblNlbGVjdCcpO1xuXG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uU2VsZWN0JywgJ3NlbGVjdCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICAgIGV2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQkMTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25TZWxlY3RgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBzZWxlY3QgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBjb250ZW50RWRpdGFibGVcbiAqXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICogLSBGaXJlcyBvbiBjb250ZW50RWRpdGFibGUgZmllbGRzIGFzIHdlbGwgYXMgaW5wdXRzLlxuICogLSBGaXJlcyBmb3IgY29sbGFwc2VkIHNlbGVjdGlvbi5cbiAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTsgLy8gTk9URTogQ2FwaXRhbGl6YXRpb24gaXMgaW1wb3J0YW50IGluIHRoaXMgbGlzdCFcbi8vXG4vLyBFLmcuIGl0IG5lZWRzIFwicG9pbnRlckRvd25cIiwgbm90IFwicG9pbnRlcmRvd25cIi5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBkZXJpdmUgYm90aCBSZWFjdCBuYW1lIChcIm9uUG9pbnRlckRvd25cIilcbi8vIGFuZCBET00gbmFtZSAoXCJwb2ludGVyZG93blwiKSBmcm9tIHRoZSBzYW1lIGxpc3QuXG4vL1xuLy8gRXhjZXB0aW9ucyB0aGF0IGRvbid0IG1hdGNoIHRoaXMgY29udmVudGlvbiBhcmUgbGlzdGVkIHNlcGFyYXRlbHkuXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cyA9IFsnYWJvcnQnLCAnYXV4Q2xpY2snLCAnY2FuY2VsJywgJ2NhblBsYXknLCAnY2FuUGxheVRocm91Z2gnLCAnY2xpY2snLCAnY2xvc2UnLCAnY29udGV4dE1lbnUnLCAnY29weScsICdjdXQnLCAnZHJhZycsICdkcmFnRW5kJywgJ2RyYWdFbnRlcicsICdkcmFnRXhpdCcsICdkcmFnTGVhdmUnLCAnZHJhZ092ZXInLCAnZHJhZ1N0YXJ0JywgJ2Ryb3AnLCAnZHVyYXRpb25DaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnZ290UG9pbnRlckNhcHR1cmUnLCAnaW5wdXQnLCAnaW52YWxpZCcsICdrZXlEb3duJywgJ2tleVByZXNzJywgJ2tleVVwJywgJ2xvYWQnLCAnbG9hZGVkRGF0YScsICdsb2FkZWRNZXRhZGF0YScsICdsb2FkU3RhcnQnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3BvaW50ZXJDYW5jZWwnLCAncG9pbnRlckRvd24nLCAncG9pbnRlck1vdmUnLCAncG9pbnRlck91dCcsICdwb2ludGVyT3ZlcicsICdwb2ludGVyVXAnLCAncHJvZ3Jlc3MnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdWJtaXQnLCAnc3VzcGVuZCcsICd0aW1lVXBkYXRlJywgJ3RvdWNoQ2FuY2VsJywgJ3RvdWNoRW5kJywgJ3RvdWNoU3RhcnQnLCAndm9sdW1lQ2hhbmdlJywgJ3Njcm9sbCcsICd0b2dnbGUnLCAndG91Y2hNb3ZlJywgJ3dhaXRpbmcnLCAnd2hlZWwnXTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSkge1xuICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVhY3ROYW1lLCBbZG9tRXZlbnROYW1lXSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnRzKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGV2ZW50TmFtZSA9IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzW2ldO1xuICAgIHZhciBkb21FdmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50TmFtZVswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnROYW1lLnNsaWNlKDEpO1xuICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCAnb24nICsgY2FwaXRhbGl6ZWRFdmVudCk7XG4gIH0gLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBldmVudCBuYW1lcyBkb24ndCBtYXRjaC5cblxuXG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0VORCwgJ29uQW5pbWF0aW9uRW5kJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0lURVJBVElPTiwgJ29uQW5pbWF0aW9uSXRlcmF0aW9uJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX1NUQVJULCAnb25BbmltYXRpb25TdGFydCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdkYmxjbGljaycsICdvbkRvdWJsZUNsaWNrJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3VzaW4nLCAnb25Gb2N1cycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c291dCcsICdvbkJsdXInKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChUUkFOU0lUSU9OX0VORCwgJ29uVHJhbnNpdGlvbkVuZCcpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yZXNlZSByaWdodCBub3cuXG5cbiAgaWYgKHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMpIHtcbiAgICBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufSAvLyBMaXN0IG9mIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgaW5kaXZpZHVhbGx5IGF0dGFjaGVkIHRvIG1lZGlhIGVsZW1lbnRzLlxuXG5cbnZhciBtZWRpYUV2ZW50VHlwZXMgPSBbJ2Fib3J0JywgJ2NhbnBsYXknLCAnY2FucGxheXRocm91Z2gnLCAnZHVyYXRpb25jaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnbG9hZGVkZGF0YScsICdsb2FkZWRtZXRhZGF0YScsICdsb2Fkc3RhcnQnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVjaGFuZ2UnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3ZvbHVtZWNoYW5nZScsICd3YWl0aW5nJ107IC8vIFdlIHNob3VsZCBub3QgZGVsZWdhdGUgdGhlc2UgZXZlbnRzIHRvIHRoZSBjb250YWluZXIsIGJ1dCByYXRoZXJcbi8vIHNldCB0aGVtIG9uIHRoZSBhY3R1YWwgdGFyZ2V0IGVsZW1lbnQgaXRzZWxmLiBUaGlzIGlzIHByaW1hcmlseVxuLy8gYmVjYXVzZSB0aGVzZSBldmVudHMgZG8gbm90IGNvbnNpc3RlbnRseSBidWJibGUgaW4gdGhlIERPTS5cblxudmFyIG5vbkRlbGVnYXRlZEV2ZW50cyA9IG5ldyBTZXQoWydjYW5jZWwnLCAnY2xvc2UnLCAnaW52YWxpZCcsICdsb2FkJywgJ3Njcm9sbCcsICd0b2dnbGUnXS5jb25jYXQobWVkaWFFdmVudFR5cGVzKSk7XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JztcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcih0eXBlLCBsaXN0ZW5lciwgdW5kZWZpbmVkLCBldmVudCk7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgZGlzcGF0Y2hMaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciBwcmV2aW91c0luc3RhbmNlO1xuXG4gIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgIGZvciAodmFyIGkgPSBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRpID0gZGlzcGF0Y2hMaXN0ZW5lcnNbaV0sXG4gICAgICAgICAgaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5pbnN0YW5jZSxcbiAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBsaXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJF9pID0gZGlzcGF0Y2hMaXN0ZW5lcnNbX2ldLFxuICAgICAgICAgIF9pbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5pbnN0YW5jZSxcbiAgICAgICAgICBfY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIF9saXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKF9pbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBfbGlzdGVuZXIsIF9jdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBfaW5zdGFuY2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2Rpc3BhdGNoUXVldWUkaSA9IGRpc3BhdGNoUXVldWVbaV0sXG4gICAgICAgIGV2ZW50ID0gX2Rpc3BhdGNoUXVldWUkaS5ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzID0gX2Rpc3BhdGNoUXVldWUkaS5saXN0ZW5lcnM7XG4gICAgcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGxpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpOyAvLyAgZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gIH0gLy8gVGhpcyB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byByZXRocm93IGlmIGFueSBvZiB0aGUgZXZlbnQgaGFuZGxlcnMgdGhyZXcuXG5cblxuICByZXRocm93Q2F1Z2h0RXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0RWxlbWVudCkge1xuICB7XG4gICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciA9IGZhbHNlO1xuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldEVsZW1lbnQpO1xuICB2YXIgbGlzdGVuZXJTZXRLZXkgPSBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIGRvbUV2ZW50TmFtZSwgSVNfTk9OX0RFTEVHQVRFRCwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG4gICAgbGlzdGVuZXJTZXQuYWRkKGxpc3RlbmVyU2V0S2V5KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHRhcmdldCkge1xuICB7XG4gICAgaWYgKG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSAmJiAhaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9OYXRpdmVFdmVudCgpIGNhbGwgZm9yIFwiJXNcIiBpbiB0aGUgYnViYmxlIHBoYXNlLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50U3lzdGVtRmxhZ3MgPSAwO1xuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19DQVBUVVJFX1BIQVNFO1xuICB9XG5cbiAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xufSAvLyBUaGlzIGlzIG9ubHkgdXNlZCBieSBjcmVhdGVFdmVudEhhbmRsZSB3aGVuIHRoZVxudmFyIGxpc3RlbmluZ01hcmtlciA9ICdfcmVhY3RMaXN0ZW5pbmcnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5mdW5jdGlvbiBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCkge1xuICBpZiAoIXJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICAvLyBXZSBoYW5kbGUgc2VsZWN0aW9uY2hhbmdlIHNlcGFyYXRlbHkgYmVjYXVzZSBpdFxuICAgICAgLy8gZG9lc24ndCBidWJibGUgYW5kIG5lZWRzIHRvIGJlIG9uIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XG4gICAgICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGZhbHNlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgdHJ1ZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAob3duZXJEb2N1bWVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCBhbHNvIG5lZWRzIGRlZHVwbGljYXRpb25cbiAgICAgIC8vIGJ1dCBpdCBpcyBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoIW93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgICAgICBvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCdzZWxlY3Rpb25jaGFuZ2UnLCBmYWxzZSwgb3duZXJEb2N1bWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCBpc0RlZmVycmVkTGlzdGVuZXJGb3JMZWdhY3lGQlN1cHBvcnQpIHtcbiAgdmFyIGxpc3RlbmVyID0gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpOyAvLyBJZiBwYXNzaXZlIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSBldmVudCB3aWxsIGJlXG4gIC8vIGFjdGl2ZSBhbmQgbm90IHBhc3NpdmUuXG5cbiAgdmFyIGlzUGFzc2l2ZUxpc3RlbmVyID0gdW5kZWZpbmVkO1xuXG4gIGlmIChwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCkge1xuICAgIC8vIEJyb3dzZXJzIGludHJvZHVjZWQgYW4gaW50ZXJ2ZW50aW9uLCBtYWtpbmcgdGhlc2UgZXZlbnRzXG4gICAgLy8gcGFzc2l2ZSBieSBkZWZhdWx0IG9uIGRvY3VtZW50LiBSZWFjdCBkb2Vzbid0IGJpbmQgdGhlbVxuICAgIC8vIHRvIGRvY3VtZW50IGFueW1vcmUsIGJ1dCBjaGFuZ2luZyB0aGlzIG5vdyB3b3VsZCB1bmRvXG4gICAgLy8gdGhlIHBlcmZvcm1hbmNlIHdpbnMgZnJvbSB0aGUgY2hhbmdlLiBTbyB3ZSBlbXVsYXRlXG4gICAgLy8gdGhlIGV4aXN0aW5nIGJlaGF2aW9yIG1hbnVhbGx5IG9uIHRoZSByb290cyBub3cuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTY1MVxuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICd0b3VjaHN0YXJ0JyB8fCBkb21FdmVudE5hbWUgPT09ICd0b3VjaG1vdmUnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3doZWVsJykge1xuICAgICAgaXNQYXNzaXZlTGlzdGVuZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldENvbnRhaW5lciA9ICB0YXJnZXRDb250YWluZXI7XG4gIHZhciB1bnN1YnNjcmliZUxpc3RlbmVyOyAvLyBXaGVuIGxlZ2FjeUZCU3VwcG9ydCBpcyBlbmFibGVkLCBpdCdzIGZvciB3aGVuIHdlXG5cblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdyYW5kQ29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIgfHwgZ3JhbmRDb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBncmFuZENvbnRhaW5lci5wYXJlbnROb2RlID09PSB0YXJnZXRDb250YWluZXI7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGFuY2VzdG9ySW5zdCA9IHRhcmdldEluc3Q7XG5cbiAgaWYgKChldmVudFN5c3RlbUZsYWdzICYgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUpID09PSAwICYmIChldmVudFN5c3RlbUZsYWdzICYgSVNfTk9OX0RFTEVHQVRFRCkgPT09IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyTm9kZSA9IHRhcmdldENvbnRhaW5lcjsgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBsZWdhY3kgRkIgc3VwcG9ydCBmbGFnLCB3ZVxuXG4gICAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBiZWxvdyBsb2dpYyBhdHRlbXB0cyB0byB3b3JrIG91dCBpZiB3ZSBuZWVkIHRvIGNoYW5nZVxuICAgICAgLy8gdGhlIHRhcmdldCBmaWJlciB0byBhIGRpZmZlcmVudCBhbmNlc3Rvci4gV2UgaGFkIHNpbWlsYXIgbG9naWNcbiAgICAgIC8vIGluIHRoZSBsZWdhY3kgZXZlbnQgc3lzdGVtLCBleGNlcHQgdGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW5cbiAgICAgIC8vIHN5c3RlbXMgaXMgdGhhdCB0aGUgbW9kZXJuIGV2ZW50IHN5c3RlbSBub3cgaGFzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAvLyBhdHRhY2hlZCB0byBlYWNoIFJlYWN0IFJvb3QgYW5kIFJlYWN0IFBvcnRhbCBSb290LiBUb2dldGhlcixcbiAgICAgIC8vIHRoZSBET00gbm9kZXMgcmVwcmVzZW50aW5nIHRoZXNlIHJvb3RzIGFyZSB0aGUgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBUbyBmaWd1cmUgb3V0IHdoaWNoIGFuY2VzdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UsIHdlIHRyYXZlcnNlXG4gICAgICAvLyB1cCB0aGUgZmliZXIgdHJlZSBmcm9tIHRoZSB0YXJnZXQgaW5zdGFuY2UgYW5kIGF0dGVtcHQgdG8gZmluZFxuICAgICAgLy8gcm9vdCBib3VuZGFyaWVzIHRoYXQgbWF0Y2ggdGhhdCBvZiBvdXIgY3VycmVudCBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIElmIHdlIGZpbmQgdGhhdCBcInJvb3RDb250YWluZXJcIiwgd2UgZmluZCB0aGUgcGFyZW50IGZpYmVyXG4gICAgICAvLyBzdWItdHJlZSBmb3IgdGhhdCByb290IGFuZCBtYWtlIHRoYXQgb3VyIGFuY2VzdG9yIGluc3RhbmNlLlxuICAgICAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0O1xuXG4gICAgICBtYWluTG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZVRhZyA9IG5vZGUudGFnO1xuXG4gICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0Um9vdCB8fCBub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoY29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgaXMgYSBwb3J0YWwsIGJ1dCBpdCdzIG5vdCB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvci5cbiAgICAgICAgICAgIC8vIE5vcm1hbGx5IHBvcnRhbHMgaGFuZGxlIHRoZWlyIG93biBldmVudHMgYWxsIHRoZSB3YXkgZG93biB0byB0aGUgcm9vdC5cbiAgICAgICAgICAgIC8vIFNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0b3Agbm93LiBIb3dldmVyLCB3ZSBkb24ndCBrbm93IGlmIHRoaXMgcG9ydGFsXG4gICAgICAgICAgICAvLyB3YXMgcGFydCBvZiAqb3VyKiByb290LlxuICAgICAgICAgICAgdmFyIGdyYW5kTm9kZSA9IG5vZGUucmV0dXJuO1xuXG4gICAgICAgICAgICB3aGlsZSAoZ3JhbmROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBncmFuZFRhZyA9IGdyYW5kTm9kZS50YWc7XG5cbiAgICAgICAgICAgICAgaWYgKGdyYW5kVGFnID09PSBIb3N0Um9vdCB8fCBncmFuZFRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgICAgIHZhciBncmFuZENvbnRhaW5lciA9IGdyYW5kTm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IgYW5kIHdlIGZvdW5kIGl0IGFzXG4gICAgICAgICAgICAgICAgICAvLyBhIHBhcmVudCBvZiB0aGUgUG9ydGFsLiBUaGF0IG1lYW5zIHdlIGNhbiBpZ25vcmUgaXQgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFBvcnRhbCB3aWxsIGJ1YmJsZSB0aHJvdWdoIHRvIHVzLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGdyYW5kTm9kZSA9IGdyYW5kTm9kZS5yZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIGl0J3MgY29ycmVzcG9uZGluZyBob3N0IGZpYmVyIGluIHRoZSBvdGhlclxuICAgICAgICAgIC8vIHRyZWUuIFRvIGRvIHRoaXMgd2UgY2FuIHVzZSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSwgYnV0IHdlXG4gICAgICAgICAgLy8gbmVlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSBmaWJlciBpcyBhIGhvc3QgaW5zdGFuY2UsIG90aGVyd2lzZVxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdHJhdmVyc2UgdXAgdGhyb3VnaCB0aGUgRE9NIHRpbGwgd2UgZmluZCB0aGUgY29ycmVjdFxuICAgICAgICAgIC8vIG5vZGUgdGhhdCBpcyBmcm9tIHRoZSBvdGhlciB0cmVlLlxuXG5cbiAgICAgICAgICB3aGlsZSAoY29udGFpbmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudE5vZGUudGFnO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50VGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHBhcmVudFRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgICAgICAgbm9kZSA9IGFuY2VzdG9ySW5zdCA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG1haW5Mb29wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgYW5jZXN0b3JJbnN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHJldHVybiB7XG4gICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudFR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgb25CZWZvcmVCbHVyIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gdGFrZVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIHdhcm5lZFVua25vd25UYWdzO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclByb3BEaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXM7XG52YXIgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyO1xudmFyIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmc7XG52YXIgbm9ybWFsaXplSFRNTDtcblxue1xuICB3YXJuZWRVbmtub3duVGFncyA9IHtcbiAgICAvLyBUaGVyZSBhcmUgd29ya2luZyBwb2x5ZmlsbHMgZm9yIDxkaWFsb2c+LiBMZXQgcGVvcGxlIHVzZSBpdC5cbiAgICBkaWFsb2c6IHRydWUsXG4gICAgLy8gRWxlY3Ryb24gc2hpcHMgYSBjdXN0b20gPHdlYnZpZXc+IHRhZyB0byBkaXNwbGF5IGV4dGVybmFsIHdlYiBjb250ZW50IGluXG4gICAgLy8gYW4gaXNvbGF0ZWQgZnJhbWUgYW5kIHByb2Nlc3MuXG4gICAgLy8gVGhpcyB0YWcgaXMgbm90IHByZXNlbnQgaW4gbm9uIEVsZWN0cm9uIGVudmlyb25tZW50cyBzdWNoIGFzIEpTRG9tIHdoaWNoXG4gICAgLy8gaXMgb2Z0ZW4gdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvd2Vidmlldy10YWdcbiAgICB3ZWJ2aWV3OiB0cnVlXG4gIH07XG5cbiAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcykge1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCB7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOiByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lczogcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1xuICAgIH0pO1xuICB9OyAvLyBJRSAxMSBwYXJzZXMgJiBub3JtYWxpemVzIHRoZSBzdHlsZSBhdHRyaWJ1dGUgYXMgb3Bwb3NlZCB0byBvdGhlclxuICAvLyBicm93c2Vycy4gSXQgYWRkcyBzcGFjZXMgYW5kIHNvcnRzIHRoZSBwcm9wZXJ0aWVzIGluIHNvbWVcbiAgLy8gbm9uLWFscGhhYmV0aWNhbCBvcmRlci4gSGFuZGxpbmcgdGhhdCB3b3VsZCByZXF1aXJlIHNvcnRpbmcgQ1NTXG4gIC8vIHByb3BlcnRpZXMgaW4gdGhlIGNsaWVudCAmIHNlcnZlciB2ZXJzaW9ucyBvciBhcHBseWluZ1xuICAvLyBgZXhwZWN0ZWRTdHlsZWAgdG8gYSB0ZW1wb3JhcnkgRE9NIG5vZGUgdG8gcmVhZCBpdHMgYHN0eWxlYCBhdHRyaWJ1dGVcbiAgLy8gbm9ybWFsaXplZC4gU2luY2UgaXQgb25seSBhZmZlY3RzIElFLCB3ZSdyZSBza2lwcGluZyBzdHlsZSB3YXJuaW5nc1xuICAvLyBpbiB0aGF0IGJyb3dzZXIgY29tcGxldGVseSBpbiBmYXZvciBvZiBkb2luZyBhbGwgdGhhdCB3b3JrLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTgwN1xuXG5cbiAgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZyA9IGNhblVzZURPTSAmJiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuXG4gIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSwgc2VydmVyVmFsdWUsIGNsaWVudFZhbHVlKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRWYWx1ZSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJWYWx1ZSk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclZhbHVlID09PSBub3JtYWxpemVkQ2xpZW50VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignUHJvcCBgJXNgIGRpZCBub3QgbWF0Y2guIFNlcnZlcjogJXMgQ2xpZW50OiAlcycsIHByb3BOYW1lLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkU2VydmVyVmFsdWUpLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkQ2xpZW50VmFsdWUpKTtcbiAgfTtcblxuICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuICAgIHZhciBuYW1lcyA9IFtdO1xuICAgIGF0dHJpYnV0ZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgfSk7XG5cbiAgICBlcnJvcignRXh0cmEgYXR0cmlidXRlcyBmcm9tIHRoZSBzZXJ2ZXI6ICVzJywgbmFtZXMpO1xuICB9O1xuXG4gIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIGlmIChsaXN0ZW5lciA9PT0gZmFsc2UpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGBmYWxzZWAuXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgJXNgIHR5cGUuJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07IC8vIFBhcnNlIHRoZSBIVE1MIGFuZCByZWFkIGl0IGJhY2sgdG8gbm9ybWFsaXplIHRoZSBIVE1MIHN0cmluZyBzbyB0aGF0IGl0XG4gIC8vIGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29uLlxuXG5cbiAgbm9ybWFsaXplSFRNTCA9IGZ1bmN0aW9uIChwYXJlbnQsIGh0bWwpIHtcbiAgICAvLyBXZSBjb3VsZCBoYXZlIGNyZWF0ZWQgYSBzZXBhcmF0ZSBkb2N1bWVudCBoZXJlIHRvIGF2b2lkXG4gICAgLy8gcmUtaW5pdGlhbGl6aW5nIGN1c3RvbSBlbGVtZW50cyBpZiB0aGV5IGV4aXN0LiBCdXQgdGhpcyBicmVha3NcbiAgICAvLyBob3cgPG5vc2NyaXB0PiBpcyBiZWluZyBoYW5kbGVkLiBTbyB3ZSB1c2UgdGhlIHNhbWUgZG9jdW1lbnQuXG4gICAgLy8gU2VlIHRoZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzExMTU3LlxuICAgIHZhciB0ZXN0RWxlbWVudCA9IHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQudGFnTmFtZSkgOiBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMocGFyZW50Lm5hbWVzcGFjZVVSSSwgcGFyZW50LnRhZ05hbWUpO1xuICAgIHRlc3RFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlc3RFbGVtZW50LmlubmVySFRNTDtcbiAgfTtcbn0gLy8gSFRNTCBwYXJzaW5nIG5vcm1hbGl6ZXMgQ1IgYW5kIENSTEYgdG8gTEYuXG4vLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NpbmdsZS1wYWdlLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4vLyBJZiB3ZSBoYXZlIGEgbWlzbWF0Y2gsIGl0IG1pZ2h0IGJlIGNhdXNlZCBieSB0aGF0LlxuLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG5cbnZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xudmFyIE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCA9IC9cXHUwMDAwfFxcdUZGRkQvZztcblxuZnVuY3Rpb24gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKG1hcmt1cCkge1xuICB7XG4gICAgY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24obWFya3VwKTtcbiAgfVxuXG4gIHZhciBtYXJrdXBTdHJpbmcgPSB0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJyA/IG1hcmt1cCA6ICcnICsgbWFya3VwO1xuICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHNlcnZlclRleHQsIGNsaWVudFRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIG5vcm1hbGl6ZWRDbGllbnRUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFRleHQpO1xuICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID09PSBub3JtYWxpemVkQ2xpZW50VGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ29uY3VycmVudE1vZGUgJiYgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCkge1xuICAgIC8vIEluIGNvbmN1cnJlbnQgcm9vdHMsIHdlIHRocm93IHdoZW4gdGhlcmUncyBhIHRleHQgbWlzbWF0Y2ggYW5kIHJldmVydCB0b1xuICAgIC8vIGNsaWVudCByZW5kZXJpbmcsIHVwIHRvIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgIHRocm93IG5ldyBFcnJvcignVGV4dCBjb250ZW50IGRvZXMgbm90IG1hdGNoIHNlcnZlci1yZW5kZXJlZCBIVE1MLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIG5hbWVzcGFjZVVSSSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAge1xuICAgICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcyk7IC8vIFNob3VsZCB0aGlzIGNoZWNrIGJlIGdhdGVkIGJ5IHBhcmVudCBuYW1lc3BhY2U/IE5vdCBzdXJlIHdlIHdhbnQgdG9cbiAgICAgIC8vIGFsbG93IDxTVkc+IG9yIDxtQVRIPi5cblxuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiB0eXBlICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgZXJyb3IoJzwlcyAvPiBpcyB1c2luZyBpbmNvcnJlY3QgY2FzaW5nLiAnICsgJ1VzZSBQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzLCAnICsgJ29yIGxvd2VyY2FzZSBmb3IgSFRNTCBlbGVtZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc2NyaXB0IHZpYSAuaW5uZXJIVE1MIHNvIGl0cyBcInBhcnNlci1pbnNlcnRlZFwiIGZsYWcgaXNcbiAgICAgIC8vIHNldCB0byB0cnVlIGFuZCBpdCBkb2VzIG5vdCBleGVjdXRlXG4gICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZGl2LmlubmVySFRNTCA9ICc8c2NyaXB0PjwnICsgJy9zY3JpcHQ+JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHlpZWxkIGEgc2NyaXB0IGVsZW1lbnQuXG5cbiAgICAgIHZhciBmaXJzdENoaWxkID0gZGl2LmZpcnN0Q2hpbGQ7XG4gICAgICBkb21FbGVtZW50ID0gZGl2LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gJEZsb3dJc3N1ZSBgY3JlYXRlRWxlbWVudGAgc2hvdWxkIGJlIHVwZGF0ZWQgZm9yIFdlYiBDb21wb25lbnRzXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUsIHtcbiAgICAgICAgaXM6IHByb3BzLmlzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWNhdXNlIG9mIGEgRmlyZWZveCBidWcuXG4gICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2XG4gICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOyAvLyBOb3JtYWxseSBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCBpbiBgc2V0SW5pdGlhbERPTVByb3BlcnRpZXNgLCBob3dldmVyIHRoZSBgbXVsdGlwbGVgIGFuZCBgc2l6ZWBcbiAgICAgIC8vIGF0dHJpYnV0ZXMgb24gYHNlbGVjdGBzIG5lZWRzIHRvIGJlIGFkZGVkIGJlZm9yZSBgb3B0aW9uYHMgYXJlIGluc2VydGVkLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50czpcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIGRvZXMgbm90IHNjcm9sbCB0byB0aGUgY29ycmVjdCBvcHRpb24gYmVjYXVzZSBzaW5ndWxhclxuICAgICAgLy8gIGBzZWxlY3RgIGVsZW1lbnRzIGF1dG9tYXRpY2FsbHkgcGljayB0aGUgZmlyc3QgaXRlbSAjMTMyMjJcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIHNldCB0aGUgZmlyc3QgaXRlbSBhcyBzZWxlY3RlZCBkZXNwaXRlIHRoZSBgc2l6ZWAgYXR0cmlidXRlICMxNDIzOVxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMyMjJcbiAgICAgIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MjM5XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICB2YXIgbm9kZSA9IGRvbUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgICAgbm9kZS5tdWx0aXBsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMuc2l6ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgYSBzaXplIGdyZWF0ZXIgdGhhbiAxIGNhdXNlcyBhIHNlbGVjdCB0byBiZWhhdmUgbGlrZSBgbXVsdGlwbGU9dHJ1ZWAsIHdoZXJlXG4gICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBubyBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYSBzZWxlY3QgaW4gXCJzaW5nbGUgc2VsZWN0aW9uIG1vZGVcIi5cbiAgICAgICAgICBub2RlLnNpemUgPSBwcm9wcy5zaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHR5cGUpO1xuICB9XG5cbiAge1xuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIWhhc093blByb3BlcnR5LmNhbGwod2FybmVkVW5rbm93blRhZ3MsIHR5cGUpKSB7XG4gICAgICAgIHdhcm5lZFVua25vd25UYWdzW3R5cGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIHRhZyA8JXM+IGlzIHVucmVjb2duaXplZCBpbiB0aGlzIGJyb3dzZXIuICcgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIFJlYWN0IGNvbXBvbmVudCwgc3RhcnQgaXRzIG5hbWUgd2l0aCAnICsgJ2FuIHVwcGVyY2FzZSBsZXR0ZXIuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KS5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbn1cbmZ1bmN0aW9uIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICB2YXIgcHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGxhc3RQcm9wcyA9IGxhc3RSYXdQcm9wcztcbiAgICAgIG5leHRQcm9wcyA9IG5leHRSYXdQcm9wcztcblxuICAgICAgaWYgKHR5cGVvZiBsYXN0UHJvcHMub25DbGljayAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbmV4dFByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIG5leHRQcm9wcyk7XG4gIHZhciBwcm9wS2V5O1xuICB2YXIgc3R5bGVOYW1lO1xuICB2YXIgc3R5bGVVcGRhdGVzID0gbnVsbDtcblxuICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHZhciBsYXN0U3R5bGUgPSBsYXN0UHJvcHNbcHJvcEtleV07XG5cbiAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RTdHlsZSkge1xuICAgICAgICBpZiAobGFzdFN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgfHwgcHJvcEtleSA9PT0gQ0hJTERSRU4pIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgZmliZXIgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgb3RoZXIgZGVsZXRlZCBwcm9wZXJ0aWVzIHdlIGFkZCBpdCB0byB0aGUgcXVldWUuIFdlIHVzZVxuICAgICAgLy8gdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBpbiB0aGUgY29tbWl0IHBoYXNlIGluc3RlYWQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcbiAgICB2YXIgbGFzdFByb3AgPSBsYXN0UHJvcHMgIT0gbnVsbCA/IGxhc3RQcm9wc1twcm9wS2V5XSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IG5leHRQcm9wID09PSBsYXN0UHJvcCB8fCBuZXh0UHJvcCA9PSBudWxsICYmIGxhc3RQcm9wID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFByb3ApIHtcbiAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBsYXN0UHJvcGAuXG5cblxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkLnB1c2gocHJvcEtleSwgc3R5bGVVcGRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciBsYXN0SHRtbCA9IGxhc3RQcm9wID8gbGFzdFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkge1xuICAgICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0SHRtbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAvLyBXZSBlYWdlcmx5IGxpc3RlbiB0byB0aGlzIGV2ZW4gdGhvdWdoIHdlIGhhdmVuJ3QgY29tbWl0dGVkIHlldC5cbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQgJiYgbGFzdFByb3AgIT09IG5leHRQcm9wKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIHByb3BzIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYW55IG90aGVyIHByb3BlcnR5IHdlIGFsd2F5cyBhZGQgaXQgdG8gdGhlIHF1ZXVlIGFuZCB0aGVuIHdlXG4gICAgICAvLyBmaWx0ZXIgaXQgb3V0IHVzaW5nIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgZHVyaW5nIHRoZSBjb21taXQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dFByb3ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICB7XG4gICAgICB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0UHJvcHNbU1RZTEVdKTtcbiAgICB9XG5cbiAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2goU1RZTEUsIHN0eWxlVXBkYXRlcyk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn0gLy8gQXBwbHkgdGhlIGRpZmYuXG5cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcykge1xuICAvLyBVcGRhdGUgY2hlY2tlZCAqYmVmb3JlKiBuYW1lLlxuICAvLyBJbiB0aGUgbWlkZGxlIG9mIGFuIHVwZGF0ZSwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBjaGVja2VkLlxuICAvLyBXaGVuIGEgY2hlY2tlZCByYWRpbyB0cmllcyB0byBjaGFuZ2UgbmFtZSwgYnJvd3NlciBtYWtlcyBhbm90aGVyIHJhZGlvJ3MgY2hlY2tlZCBmYWxzZS5cbiAgaWYgKHRhZyA9PT0gJ2lucHV0JyAmJiBuZXh0UmF3UHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuZXh0UmF3UHJvcHMubmFtZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlQ2hlY2tlZChkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHdhc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbGFzdFJhd1Byb3BzKTtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBuZXh0UmF3UHJvcHMpOyAvLyBBcHBseSB0aGUgZGlmZi5cblxuICB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpOyAvLyBUT0RPOiBFbnN1cmUgdGhhdCBhbiB1cGRhdGUgZ2V0cyBzY2hlZHVsZWQgaWYgYW55IG9mIHRoZSBzcGVjaWFsIHByb3BzXG4gIC8vIGNoYW5nZWQuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0b1xuICAgICAgLy8gaGFwcGVuIGFmdGVyIGB1cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zXG4gICAgICAvLyByYWlzZSB3YXJuaW5ncyBhbmQgcHJldmVudCB0aGUgbmV3IHZhbHVlIGZyb20gYmVpbmcgYXNzaWduZWQuXG4gICAgICB1cGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHVwZGF0ZVdyYXBwZXIkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgLy8gPHNlbGVjdD4gdmFsdWUgdXBkYXRlIG5lZWRzIHRvIG9jY3VyIGFmdGVyIDxvcHRpb24+IGNoaWxkcmVuXG4gICAgICAvLyByZWNvbmNpbGlhdGlvblxuICAgICAgcG9zdFVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BOYW1lKSB7XG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBwcm9wTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXSB8fCBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVyRWxlbWVudCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7XG4gIHZhciBleHRyYUF0dHJpYnV0ZU5hbWVzO1xuXG4gIHtcbiAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgZXh0cmFBdHRyaWJ1dGVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVzW19pXS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjaGVja2VkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzZWxlY3RlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHVzZSB0aGUgb3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMDY3Ni5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVzW19pXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG5cbiAgZm9yICh2YXIgcHJvcEtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghcmF3UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IHJhd1Byb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICAvLyBGb3IgdGV4dCBjb250ZW50IGNoaWxkcmVuIHdlIGNvbXBhcmUgYWdhaW5zdCB0ZXh0Q29udGVudC4gVGhpc1xuICAgICAgLy8gbWlnaHQgbWF0Y2ggYWRkaXRpb25hbCBIVE1MIHRoYXQgaXMgaGlkZGVuIHdoZW4gd2UgcmVhZCBpdCB1c2luZ1xuICAgICAgLy8gdGV4dENvbnRlbnQuIEUuZy4gXCJmb29cIiB3aWxsIG1hdGNoIFwiZjxzcGFuPm9vPC9zcGFuPlwiIGJ1dCB0aGF0IHN0aWxsXG4gICAgICAvLyBzYXRpc2ZpZXMgb3VyIHJlcXVpcmVtZW50LiBPdXIgcmVxdWlyZW1lbnQgaXMgbm90IHRvIHByb2R1Y2UgcGVyZmVjdFxuICAgICAgLy8gSFRNTCBhbmQgYXR0cmlidXRlcy4gSWRlYWxseSB3ZSBzaG91bGQgcHJlc2VydmUgc3RydWN0dXJlIGJ1dCBpdCdzXG4gICAgICAvLyBvayBub3QgdG8gaWYgdGhlIHZpc2libGUgY29udGVudCBpcyBzdGlsbCBlbm91Z2ggdG8gaW5kaWNhdGUgd2hhdFxuICAgICAgLy8gZXZlbiBsaXN0ZW5lcnMgdGhlc2Ugbm9kZXMgbWlnaHQgYmUgd2lyZWQgdXAgdG8uXG4gICAgICAvLyBUT0RPOiBXYXJuIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBhIHNpbmdsZSB0ZXh0Tm9kZSBhcyBhIGNoaWxkLlxuICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIHVzZSBkb21FbGVtZW50LmZpcnN0Q2hpbGQubm9kZVZhbHVlIHRvIGNvbXBhcmU/XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCAnJyArIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2hvdWxkV2FybkRldiAmJiB0cnVlICYmIC8vIENvbnZpbmNlIEZsb3cgd2UndmUgY2FsY3VsYXRlZCBpdCAoaXQncyBERVYtb25seSBpbiB0aGlzIG1ldGhvZC4pXG4gICAgdHlwZW9mIGlzQ3VzdG9tQ29tcG9uZW50VGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHByb3BlcnRpZXMgY29ycmVzcG9uZCB0byB0aGVpciBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICB2YXIgc2VydmVyVmFsdWUgPSB2b2lkIDA7XG4gICAgICB2YXIgcHJvcGVydHlJbmZvID0gaXNDdXN0b21Db21wb25lbnRUYWcgJiYgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA/IG51bGwgOiBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gPT09IHRydWUpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmICFlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0KSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIG93bk5hbWVzcGFjZSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0YWcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgc3RhbmRhcmROYW1lID0gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcEtleSk7XG5cbiAgICAgICAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG51bGwgJiYgc3RhbmRhcmROYW1lICE9PSBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgIC8vIElmIGFuIFNWRyBwcm9wIGlzIHN1cHBsaWVkIHdpdGggYmFkIGNhc2luZywgaXQgd2lsbFxuICAgICAgICAgICAgICAvLyBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkIGZyb20gSFRNTCwgYnV0IHdpbGwgcHJvZHVjZSBhIG1pc21hdGNoXG4gICAgICAgICAgICAgIC8vIChhbmQgd291bGQgYmUgaW5jb3JyZWN0bHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCkuXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGFscmVhZHkgd2FybiBhYm91dCBiYWQgY2FzaW5nIGVsc2V3aGVyZS5cbiAgICAgICAgICAgICAgLy8gU28gd2UnbGwgc2tpcCB0aGUgbWlzbGVhZGluZyBleHRyYSBtaXNtYXRjaCB3YXJuaW5nIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgICAgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gdHJ1ZTsgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG4gICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHN0YW5kYXJkTmFtZSk7XG4gICAgICAgICAgICB9IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkb250V2FybkN1c3RvbUVsZW1lbnQgPSBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ICA7XG5cbiAgICAgICAgaWYgKCFkb250V2FybkN1c3RvbUVsZW1lbnQgJiYgbmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgICAgaWYgKCAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLnNpemUgPiAwICYmIHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoZXh0cmFBdHRyaWJ1dGVOYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAvLyBGb3IgaW5wdXQgYW5kIHRleHRhcmVhIHdlIGN1cnJlbnQgYWx3YXlzIHNldCB0aGUgdmFsdWUgcHJvcGVydHkgYXRcbiAgICAgIC8vIHBvc3QgbW91bnQgdG8gZm9yY2UgaXQgdG8gZGl2ZXJnZSBmcm9tIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIGZvclxuICAgICAgLy8gb3B0aW9uIGFuZCBzZWxlY3Qgd2UgZG9uJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYW5kIHNlbGVjdFxuICAgICAgLy8gaXMgbm90IHJlc2lsaWVudCB0byB0aGUgRE9NIHN0YXRlIGNoYW5naW5nIHNvIHdlIGRvbid0IGRvIHRoYXQgaGVyZS5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIG5vdCBkb2luZyB0aGlzIGZvciBpbnB1dCBhbmQgdGV4dGFyZWEuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59XG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRUZXh0KHRleHROb2RlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHZhciBpc0RpZmZlcmVudCA9IHRleHROb2RlLm5vZGVWYWx1ZSAhPT0gdGV4dDtcbiAgcmV0dXJuIGlzRGlmZmVyZW50O1xufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSA8JXM+IGluIDwlcz4uJywgY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gdGhlIHRleHQgbm9kZSBcIiVzXCIgaW4gPCVzPi4nLCBjaGlsZC5ub2RlVmFsdWUsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0YWcsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIDwlcz4gaW4gPCVzPi4nLCB0YWcsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KSB7XG4gIHtcbiAgICBpZiAodGV4dCA9PT0gJycpIHtcbiAgICAgIC8vIFdlIGV4cGVjdCB0byBpbnNlcnQgZW1wdHkgdGV4dCBub2RlcyBzaW5jZSB0aGV5J3JlIG5vdCByZXByZXNlbnRlZCBpblxuICAgICAgLy8gdGhlIEhUTUwuXG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2UgaWYgd2UgY2FuIGp1c3QgYXZvaWQgaW5zZXJ0aW5nIGVtcHR5XG4gICAgICAvLyB0ZXh0IG5vZGVzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgdGV4dCBub2RlIGZvciBcIiVzXCIgaW4gPCVzPi4nLCB0ZXh0LCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMoZG9tRWxlbWVudCwgdGFnLCBwcm9wcykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuICB9XG59XG5cbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyBUaGlzIHZhbGlkYXRpb24gY29kZSB3YXMgd3JpdHRlbiBiYXNlZCBvbiB0aGUgSFRNTDUgcGFyc2luZyBzcGVjOlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuICAvL1xuICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGNhdGNoIGFsbCBpbnZhbGlkIG5lc3RpbmcsIG5vciBkb2VzIGl0IHRyeSB0byAoYXMgaXQnc1xuICAvLyBub3QgY2xlYXIgd2hhdCBwcmFjdGljYWwgYmVuZWZpdCBkb2luZyBzbyBwcm92aWRlcyk7IGluc3RlYWQsIHdlIHdhcm4gb25seVxuICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciB3aWxsIGdpdmUgYSBwYXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3RcbiAgLy8gaW50ZW5kZWQuIEZvciBleGFtcGxlLCA8Yj48ZGl2PjwvZGl2PjwvYj4gaXMgaW52YWxpZCBidXQgd2UgZG9uJ3Qgd2FyblxuICAvLyBiZWNhdXNlIGl0IHN0aWxsIHBhcnNlcyBjb3JyZWN0bHk7IHdlIGRvIHdhcm4gZm9yIG90aGVyIGNhc2VzIGxpa2UgbmVzdGVkXG4gIC8vIDxwPiB0YWdzIHdoZXJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xvc2VzIHRoZVxuICAvLyBmaXJzdCwgY2F1c2luZyBhIGNvbmZ1c2luZyBtZXNzLlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNzcGVjaWFsXG4gIHZhciBzcGVjaWFsVGFncyA9IFsnYWRkcmVzcycsICdhcHBsZXQnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYmdzb3VuZCcsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NvbCcsICdjb2xncm91cCcsICdkZCcsICdkZXRhaWxzJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZW1iZWQnLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpJywgJ2xpbmsnLCAnbGlzdGluZycsICdtYWluJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ25hdicsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdwJywgJ3BhcmFtJywgJ3BsYWludGV4dCcsICdwcmUnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NvdXJjZScsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmxlJywgJ3Rib2R5JywgJ3RkJywgJ3RlbXBsYXRlJywgJ3RleHRhcmVhJywgJ3Rmb290JywgJ3RoJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3VsJywgJ3dicicsICd4bXAnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcblxuICB2YXIgaW5TY29wZVRhZ3MgPSBbJ2FwcGxldCcsICdjYXB0aW9uJywgJ2h0bWwnLCAndGFibGUnLCAndGQnLCAndGgnLCAnbWFycXVlZScsICdvYmplY3QnLCAndGVtcGxhdGUnLCAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tYnV0dG9uLXNjb3BlXG5cbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFnc1xuXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcbiAgdmFyIGVtcHR5QW5jZXN0b3JJbmZvID0ge1xuICAgIGN1cnJlbnQ6IG51bGwsXG4gICAgZm9ybVRhZzogbnVsbCxcbiAgICBhVGFnSW5TY29wZTogbnVsbCxcbiAgICBidXR0b25UYWdJblNjb3BlOiBudWxsLFxuICAgIG5vYnJUYWdJblNjb3BlOiBudWxsLFxuICAgIHBUYWdJbkJ1dHRvblNjb3BlOiBudWxsLFxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKG9sZEluZm8sIHRhZykge1xuICAgIHZhciBhbmNlc3RvckluZm8gPSBhc3NpZ24oe30sIG9sZEluZm8gfHwgZW1wdHlBbmNlc3RvckluZm8pO1xuXG4gICAgdmFyIGluZm8gPSB7XG4gICAgICB0YWc6IHRhZ1xuICAgIH07XG5cbiAgICBpZiAoaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsO1xuICAgIH0gLy8gU2VlIHJ1bGVzIGZvciAnbGknLCAnZGQnLCAnZHQnIHN0YXJ0IHRhZ3MgaW5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIGlmIChzcGVjaWFsVGFncy5pbmRleE9mKHRhZykgIT09IC0xICYmIHRhZyAhPT0gJ2FkZHJlc3MnICYmIHRhZyAhPT0gJ2RpdicgJiYgdGFnICE9PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgfVxuXG4gICAgYW5jZXN0b3JJbmZvLmN1cnJlbnQgPSBpbmZvO1xuXG4gICAgaWYgKHRhZyA9PT0gJ2Zvcm0nKSB7XG4gICAgICBhbmNlc3RvckluZm8uZm9ybVRhZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2EnKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdidXR0b24nKSB7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ25vYnInKSB7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbGknKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2RkJyB8fCB0YWcgPT09ICdkdCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudCA9IGZ1bmN0aW9uICh0YWcsIHBhcmVudFRhZykge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiB3ZSdyZSBpbiBhbiB1bnVzdWFsIHBhcnNpbmcgbW9kZS4uLlxuICAgIHN3aXRjaCAocGFyZW50VGFnKSB7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5zZWxlY3RcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJ29wdGdyb3VwJyB8fCB0YWcgPT09ICcjdGV4dCc7XG5cbiAgICAgIGNhc2UgJ29wdGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHNlZWluZyBhbiA8b3B0aW9uPiBkb2Vzbid0IG1lYW4gd2UncmUgaW4gYSA8c2VsZWN0PlxuICAgICAgLy8gYnV0XG5cbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZFxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY2FwdGlvblxuICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gXCJpbiBib2R5XCIgbW9kZSBmb3JcbiAgICAgIC8vIGFsbCBleGNlcHQgc3BlY2lhbCB0YWJsZSBub2RlcyB3aGljaCBjYXVzZSBiYWQgcGFyc2luZyBiZWhhdmlvciBhbnl3YXkuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50clxuXG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0aCcgfHwgdGFnID09PSAndGQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRib2R5XG5cbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RyJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jb2xncm91cFxuXG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjb2wnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRhYmxlXG5cbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5oZWFkXG5cbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnYmFzZScgfHwgdGFnID09PSAnYmFzZWZvbnQnIHx8IHRhZyA9PT0gJ2Jnc291bmQnIHx8IHRhZyA9PT0gJ2xpbmsnIHx8IHRhZyA9PT0gJ21ldGEnIHx8IHRhZyA9PT0gJ3RpdGxlJyB8fCB0YWcgPT09ICdub3NjcmlwdCcgfHwgdGFnID09PSAnbm9mcmFtZXMnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy5odG1sI3RoZS1odG1sLWVsZW1lbnRcblxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdoZWFkJyB8fCB0YWcgPT09ICdib2R5JyB8fCB0YWcgPT09ICdmcmFtZXNldCc7XG5cbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2ZyYW1lJztcblxuICAgICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnO1xuICAgIH0gLy8gUHJvYmFibHkgaW4gdGhlIFwiaW4gYm9keVwiIHBhcnNpbmcgbW9kZSwgc28gd2Ugb3V0bGF3IG9ubHkgdGFnIGNvbWJvc1xuICAgIC8vIHdoZXJlIHRoZSBwYXJzaW5nIHJ1bGVzIGNhdXNlIGltcGxpY2l0IG9wZW5zIG9yIGNsb3NlcyB0byBiZSBhZGRlZC5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBhcmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAnaDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JztcblxuICAgICAgY2FzZSAncnAnOlxuICAgICAgY2FzZSAncnQnOlxuICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTtcblxuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2NvbCc6XG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgY2FzZSAndGgnOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndHInOlxuICAgICAgICAvLyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUgc3BlY2lhbCBjaGlsZFxuICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kXG4gICAgICAgIC8vIHNvIHdlIGFsbG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBvdGhlclxuICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnYWRkcmVzcyc6XG4gICAgICBjYXNlICdhcnRpY2xlJzpcbiAgICAgIGNhc2UgJ2FzaWRlJzpcbiAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOlxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGNhc2UgJ2Rpcic6XG4gICAgICBjYXNlICdkaXYnOlxuICAgICAgY2FzZSAnZGwnOlxuICAgICAgY2FzZSAnZmllbGRzZXQnOlxuICAgICAgY2FzZSAnZmlnY2FwdGlvbic6XG4gICAgICBjYXNlICdmaWd1cmUnOlxuICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICBjYXNlICdoZ3JvdXAnOlxuICAgICAgY2FzZSAnbWFpbic6XG4gICAgICBjYXNlICdtZW51JzpcbiAgICAgIGNhc2UgJ25hdic6XG4gICAgICBjYXNlICdvbCc6XG4gICAgICBjYXNlICdwJzpcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxuICAgICAgY2FzZSAnc3VtbWFyeSc6XG4gICAgICBjYXNlICd1bCc6XG4gICAgICBjYXNlICdwcmUnOlxuICAgICAgY2FzZSAnbGlzdGluZyc6XG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICBjYXNlICdocic6XG4gICAgICBjYXNlICd4bXAnOlxuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnbGknOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgIGNhc2UgJ2R0JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gU3BlYyBzYXlzIHNvbWV0aGluZyBhYm91dCBzdG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291bmRzXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnbm9icic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgdmFyIGRpZFdhcm4kMSA9IHt9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hpbGRUZXh0LCBhbmNlc3RvckluZm8pIHtcbiAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87XG4gICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDtcbiAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZztcblxuICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkge1xuICAgICAgaWYgKGNoaWxkVGFnICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZzogd2hlbiBjaGlsZFRleHQgaXMgcGFzc2VkLCBjaGlsZFRhZyBzaG91bGQgYmUgbnVsbCcpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIGludmFsaWRQYXJlbnRPckFuY2VzdG9yID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG5cbiAgICBpZiAoIWludmFsaWRQYXJlbnRPckFuY2VzdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGFuY2VzdG9yVGFnID0gaW52YWxpZFBhcmVudE9yQW5jZXN0b3IudGFnO1xuICAgIHZhciB3YXJuS2V5ID0gISFpbnZhbGlkUGFyZW50ICsgJ3wnICsgY2hpbGRUYWcgKyAnfCcgKyBhbmNlc3RvclRhZztcblxuICAgIGlmIChkaWRXYXJuJDFbd2FybktleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuJDFbd2FybktleV0gPSB0cnVlO1xuICAgIHZhciB0YWdEaXNwbGF5TmFtZSA9IGNoaWxkVGFnO1xuICAgIHZhciB3aGl0ZXNwYWNlSW5mbyA9ICcnO1xuXG4gICAgaWYgKGNoaWxkVGFnID09PSAnI3RleHQnKSB7XG4gICAgICBpZiAoL1xcUy8udGVzdChjaGlsZFRleHQpKSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1RleHQgbm9kZXMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnV2hpdGVzcGFjZSB0ZXh0IG5vZGVzJztcbiAgICAgICAgd2hpdGVzcGFjZUluZm8gPSBcIiBNYWtlIHN1cmUgeW91IGRvbid0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uIFwiICsgJ2VhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJzwnICsgY2hpbGRUYWcgKyAnPic7XG4gICAgfVxuXG4gICAgaWYgKGludmFsaWRQYXJlbnQpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgIGlmIChhbmNlc3RvclRhZyA9PT0gJ3RhYmxlJyAmJiBjaGlsZFRhZyA9PT0gJ3RyJykge1xuICAgICAgICBpbmZvICs9ICcgQWRkIGEgPHRib2R5PiwgPHRoZWFkPiBvciA8dGZvb3Q+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIuJztcbiAgICAgIH1cblxuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyVzJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnLCB3aGl0ZXNwYWNlSW5mbywgaW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGRlc2NlbmRhbnQgb2YgJyArICc8JXM+LicsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZyk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVVwZGF0ZShkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuXG4gICAgaWYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiAhPT0gdHlwZW9mIG9sZFByb3BzLmNoaWxkcmVuICYmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0YXJlYScgfHwgdHlwZSA9PT0gJ25vc2NyaXB0JyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHRJbnN0YW5jZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGV4dCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcbiAgfVxuXG4gIHZhciB0ZXh0Tm9kZSA9IGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHRleHROb2RlKTtcbiAgcmV0dXJuIHRleHROb2RlO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKSB7XG4gIHZhciBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG5cbiAgaWYgKGN1cnJlbnRFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIGdldEV2ZW50UHJpb3JpdHkoY3VycmVudEV2ZW50LnR5cGUpO1xufVxuLy8gaWYgYSBjb21wb25lbnQganVzdCBpbXBvcnRzIFJlYWN0RE9NIChlLmcuIGZvciBmaW5kRE9NTm9kZSkuXG4vLyBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBzZXRUaW1lb3V0IG9yIGNsZWFyVGltZW91dC5cblxudmFyIHNjaGVkdWxlVGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBjYW5jZWxUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBub1RpbWVvdXQgPSAtMTtcbnZhciBsb2NhbFByb21pc2UgPSB0eXBlb2YgUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJyA/IFByb21pc2UgOiB1bmRlZmluZWQ7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBzY2hlZHVsZU1pY3JvdGFzayA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyA/IHF1ZXVlTWljcm90YXNrIDogdHlwZW9mIGxvY2FsUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGxvY2FsUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGhhbmRsZUVycm9ySW5OZXh0VGljayk7XG59IDogc2NoZWR1bGVUaW1lb3V0OyAvLyBUT0RPOiBEZXRlcm1pbmUgdGhlIGJlc3QgZmFsbGJhY2sgaGVyZS5cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY29tbWl0TW91bnQoZG9tRWxlbWVudCwgdHlwZSwgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gRGVzcGl0ZSB0aGUgbmFtaW5nIHRoYXQgbWlnaHQgaW1wbHkgb3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCBvbmx5XG4gIC8vIGZpcmVzIGlmIHRoZXJlIGlzIGFuIGBVcGRhdGVgIGVmZmVjdCBzY2hlZHVsZWQgZHVyaW5nIG1vdW50aW5nLlxuICAvLyBUaGlzIGhhcHBlbnMgaWYgYGZpbmFsaXplSW5pdGlhbENoaWxkcmVuYCByZXR1cm5zIGB0cnVlYCAod2hpY2ggaXRcbiAgLy8gZG9lcyB0byBpbXBsZW1lbnQgdGhlIGBhdXRvRm9jdXNgIGF0dHJpYnV0ZSBvbiB0aGUgY2xpZW50KS4gQnV0XG4gIC8vIHRoZXJlIGFyZSBhbHNvIG90aGVyIGNhc2VzIHdoZW4gdGhpcyBtaWdodCBoYXBwZW4gKHN1Y2ggYXMgcGF0Y2hpbmdcbiAgLy8gdXAgdGV4dCBjb250ZW50IGR1cmluZyBoeWRyYXRpb24gbWlzbWF0Y2gpLiBTbyB3ZSdsbCBjaGVjayB0aGlzIGFnYWluLlxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGlmIChuZXdQcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgZG9tRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAge1xuICAgICAgICBpZiAobmV3UHJvcHMuc3JjKSB7XG4gICAgICAgICAgZG9tRWxlbWVudC5zcmMgPSBuZXdQcm9wcy5zcmM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZShkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuICB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7IC8vIFVwZGF0ZSB0aGUgcHJvcHMgaGFuZGxlIHNvIHRoYXQgd2Uga25vdyB3aGljaCBwcm9wcyBhcmUgdGhlIG9uZXMgd2l0aFxuICAvLyB3aXRoIGN1cnJlbnQgZXZlbnQgaGFuZGxlcnMuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiByZXNldFRleHRDb250ZW50KGRvbUVsZW1lbnQpIHtcbiAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycpO1xufVxuZnVuY3Rpb24gY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgY29udGFpbmVyKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyO1xuICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9IC8vIFRoaXMgY29udGFpbmVyIG1pZ2h0IGJlIHVzZWQgZm9yIGEgcG9ydGFsLlxuICAvLyBJZiBzb21ldGhpbmcgaW5zaWRlIGEgcG9ydGFsIGlzIGNsaWNrZWQsIHRoYXQgY2xpY2sgc2hvdWxkIGJ1YmJsZVxuICAvLyB0aHJvdWdoIHRoZSBSZWFjdCB0cmVlLiBIb3dldmVyLCBvbiBNb2JpbGUgU2FmYXJpIHRoZSBjbGljayB3b3VsZFxuICAvLyBuZXZlciBidWJibGUgdGhyb3VnaCB0aGUgKkRPTSogdHJlZSB1bmxlc3MgYW4gYW5jZXN0b3Igd2l0aCBvbmNsaWNrXG4gIC8vIGV2ZW50IGV4aXN0cy4gU28gd2Ugd291bGRuJ3Qgc2VlIGl0IGFuZCBkaXNwYXRjaCBpdC5cbiAgLy8gVGhpcyBpcyB3aHkgd2UgZW5zdXJlIHRoYXQgbm9uIFJlYWN0IHJvb3QgY29udGFpbmVycyBoYXZlIGlubGluZSBvbmNsaWNrXG4gIC8vIGRlZmluZWQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE5MThcblxuXG4gIHZhciByZWFjdFJvb3RDb250YWluZXIgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcblxuICBpZiAoKHJlYWN0Um9vdENvbnRhaW5lciA9PT0gbnVsbCB8fCByZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZCkgJiYgcGFyZW50Tm9kZS5vbmNsaWNrID09PSBudWxsKSB7XG4gICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChwYXJlbnROb2RlKTtcbiAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHBhcmVudEluc3RhbmNlLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShjb250YWluZXIsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlOyAvLyBEZWxldGUgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIGRvIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXG4gICAgaWYgKG5leHROb2RlICYmIG5leHROb2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbmV4dE5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5leHROb2RlKTsgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG4gICAgICAgICAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9IHdoaWxlIChub2RlKTsgLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lci5wYXJlbnROb2RlLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oY29udGFpbmVyKTtcbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICBpZiAoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHN1c3BlbnNlIG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhpbnN0YW5jZSkge1xuICB2YXIgZGF0YXNldCA9IGluc3RhbmNlLm5leHRTaWJsaW5nICYmIGluc3RhbmNlLm5leHRTaWJsaW5nLmRhdGFzZXQ7XG4gIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gIGlmIChkYXRhc2V0KSB7XG4gICAgZGlnZXN0ID0gZGF0YXNldC5kZ3N0O1xuXG4gICAge1xuICAgICAgbWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAgICAgc3RhY2sgPSBkYXRhc2V0LnN0Y2s7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgZGlnZXN0OiBkaWdlc3QsXG4gICAgICBzdGFjazogc3RhY2tcbiAgICB9O1xuICB9IC8vIGxldCB2YWx1ZSA9IHttZXNzYWdlOiB1bmRlZmluZWQsIGhhc2g6IHVuZGVmaW5lZH07XG4gIC8vIGNvbnN0IG5leHRTaWJsaW5nID0gaW5zdGFuY2UubmV4dFNpYmxpbmc7XG4gIC8vIGlmIChuZXh0U2libGluZykge1xuICAvLyAgIGNvbnN0IGRhdGFzZXQgPSAoKG5leHRTaWJsaW5nOiBhbnkpOiBIVE1MVGVtcGxhdGVFbGVtZW50KS5kYXRhc2V0O1xuICAvLyAgIHZhbHVlLm1lc3NhZ2UgPSBkYXRhc2V0Lm1zZztcbiAgLy8gICB2YWx1ZS5oYXNoID0gZGF0YXNldC5oYXNoO1xuICAvLyAgIGlmICh0cnVlKSB7XG4gIC8vICAgICB2YWx1ZS5zdGFjayA9IGRhdGFzZXQuc3RhY2s7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIHJldHVybiB2YWx1ZTtcblxufVxuZnVuY3Rpb24gcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoaW5zdGFuY2UsIGNhbGxiYWNrKSB7XG4gIGluc3RhbmNlLl9yZWFjdFJldHJ5ID0gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBub2RlRGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlRGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLm5leHRTaWJsaW5nKTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgaW5zdGFuY2UpOyAvLyBUT0RPOiBQb3NzaWJseSBkZWZlciB0aGlzIHVudGlsIHRoZSBjb21taXQgcGhhc2Ugd2hlcmUgYWxsIHRoZSBldmVudHNcbiAgLy8gZ2V0IGF0dGFjaGVkLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoaW5zdGFuY2UsIHByb3BzKTtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9IC8vIFRPRE86IFRlbXBvcmFyeSBoYWNrIHRvIGNoZWNrIGlmIHdlJ3JlIGluIGEgY29uY3VycmVudCByb290LiBXZSBjYW4gZGVsZXRlXG4gIC8vIHdoZW4gdGhlIGxlZ2FjeSByb290IEFQSSBpcyByZW1vdmVkLlxuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVySW5zdGFuY2UsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dEluc3RhbmNlKTsgLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRUZXh0KHRleHRJbnN0YW5jZSwgdGV4dCk7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMocGFyZW50VHlwZSkge1xuICByZXR1cm4gcGFyZW50VHlwZSAhPT0gJ2hlYWQnICYmIHBhcmVudFR5cGUgIT09ICdib2R5Jztcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIGlmIChwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTtcbiAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcblxuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Q29udGFpbmVyLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCB0ZXh0KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudEluc3RhbmNlLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRJbnN0YW5jZSwgdGV4dCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFRoaXMgZ2V0cyBsb2dnZWQgYnkgb25SZWNvdmVyYWJsZUVycm9yLCB0b28sIHNvIHdlIHNob3VsZCBiZVxuICAgIC8vIGFibGUgdG8gcmVtb3ZlIGl0LlxuICAgIGVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLiBUaGUgc2VydmVyIEhUTUwgd2FzIHJlcGxhY2VkIHdpdGggY2xpZW50IGNvbnRlbnQgaW4gPCVzPi4nLCBwYXJlbnRDb250YWluZXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVQb3J0YWxNb3VudChwb3J0YWxJbnN0YW5jZSkge1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhwb3J0YWxJbnN0YW5jZSk7XG59XG5cbnZhciByYW5kb21LZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbnZhciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RGaWJlciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsUHJvcHNLZXkgPSAnX19yZWFjdFByb3BzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleSA9ICdfX3JlYWN0Q29udGFpbmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5ID0gJ19fcmVhY3RFdmVudHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlckxpc3RlbmVyc0tleSA9ICdfX3JlYWN0TGlzdGVuZXJzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXkgPSAnX19yZWFjdEhhbmRsZXMkJyArIHJhbmRvbUtleTtcbmZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb24gaG9zdCBjb21wb25lbnRzLiBJIGRvbid0IHRoaW5rIGFsbCBvZlxuICAvLyB0aGVzZSBmaWVsZHMgYXJlIHJlbGV2YW50LlxuICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxQcm9wc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXldO1xufVxuZnVuY3Rpb24gcHJlY2FjaGVGaWJlck5vZGUoaG9zdEluc3QsIG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0O1xufVxuZnVuY3Rpb24gbWFya0NvbnRhaW5lckFzUm9vdChob3N0Um9vdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gaG9zdFJvb3Q7XG59XG5mdW5jdGlvbiB1bm1hcmtDb250YWluZXJBc1Jvb3Qobm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmVyTWFya2VkQXNSb290KG5vZGUpIHtcbiAgcmV0dXJuICEhbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XTtcbn0gLy8gR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IEhvc3RDb21wb25lbnQgb3IgSG9zdFRleHQgZmliZXIgYW5jZXN0b3IuXG4vLyBJZiB0aGUgdGFyZ2V0IG5vZGUgaXMgcGFydCBvZiBhIGh5ZHJhdGVkIG9yIG5vdCB5ZXQgcmVuZGVyZWQgc3VidHJlZSwgdGhlblxuLy8gdGhpcyBtYXkgYWxzbyByZXR1cm4gYSBTdXNwZW5zZUNvbXBvbmVudCBvciBIb3N0Um9vdCB0byBpbmRpY2F0ZSB0aGF0LlxuLy8gQ29uY2VwdHVhbGx5IHRoZSBIb3N0Um9vdCBmaWJlciBpcyBhIGNoaWxkIG9mIHRoZSBDb250YWluZXIgbm9kZS4gU28gaWYgeW91XG4vLyBwYXNzIHRoZSBDb250YWluZXIgbm9kZSBhcyB0aGUgdGFyZ2V0Tm9kZSwgeW91IHdpbGwgbm90IGFjdHVhbGx5IGdldCB0aGVcbi8vIEhvc3RSb290IGJhY2suIFRvIGdldCB0byB0aGUgSG9zdFJvb3QsIHlvdSBuZWVkIHRvIHBhc3MgYSBjaGlsZCBvZiBpdC5cbi8vIFRoZSBzYW1lIHRoaW5nIGFwcGxpZXMgdG8gU3VzcGVuc2UgYm91bmRhcmllcy5cblxuZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0Tm9kZSkge1xuICB2YXIgdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAvLyBEb24ndCByZXR1cm4gSG9zdFJvb3Qgb3IgU3VzcGVuc2VDb21wb25lbnQgaGVyZS5cbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfSAvLyBJZiB0aGUgZGlyZWN0IGV2ZW50IHRhcmdldCBpc24ndCBhIFJlYWN0IG93bmVkIERPTSBub2RlLCB3ZSBuZWVkIHRvIGxvb2tcbiAgLy8gdG8gc2VlIGlmIG9uZSBvZiBpdHMgcGFyZW50cyBpcyBhIFJlYWN0IG93bmVkIERPTSBub2RlLlxuXG5cbiAgdmFyIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG5cbiAgd2hpbGUgKHBhcmVudE5vZGUpIHtcbiAgICAvLyBXZSdsbCBjaGVjayBpZiB0aGlzIGlzIGEgY29udGFpbmVyIHJvb3QgdGhhdCBjb3VsZCBpbmNsdWRlXG4gICAgLy8gUmVhY3Qgbm9kZXMgaW4gdGhlIGZ1dHVyZS4gV2UgbmVlZCB0byBjaGVjayB0aGlzIGZpcnN0IGJlY2F1c2VcbiAgICAvLyBpZiB3ZSdyZSBhIGNoaWxkIG9mIGEgZGVoeWRyYXRlZCBjb250YWluZXIsIHdlIG5lZWQgdG8gZmlyc3RcbiAgICAvLyBmaW5kIHRoYXQgaW5uZXIgY29udGFpbmVyIGJlZm9yZSBtb3Zpbmcgb24gdG8gZmluZGluZyB0aGUgcGFyZW50XG4gICAgLy8gaW5zdGFuY2UuIE5vdGUgdGhhdCB3ZSBkb24ndCBjaGVjayB0aGlzIGZpZWxkIG9uICB0aGUgdGFyZ2V0Tm9kZVxuICAgIC8vIGl0c2VsZiBiZWNhdXNlIHRoZSBmaWJlcnMgYXJlIGNvbmNlcHR1YWxseSBiZXR3ZWVuIHRoZSBjb250YWluZXJcbiAgICAvLyBub2RlIGFuZCB0aGUgZmlyc3QgY2hpbGQuIEl0IGlzbid0IHN1cnJvdW5kaW5nIHRoZSBjb250YWluZXIgbm9kZS5cbiAgICAvLyBJZiBpdCdzIG5vdCBhIGNvbnRhaW5lciwgd2UgY2hlY2sgaWYgaXQncyBhbiBpbnN0YW5jZS5cbiAgICB0YXJnZXRJbnN0ID0gcGFyZW50Tm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSB8fCBwYXJlbnROb2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgd2Fzbid0IHRoZSBkaXJlY3QgdGFyZ2V0IG9mIHRoZSBldmVudCwgd2UgbWlnaHQgaGF2ZVxuICAgICAgLy8gc3RlcHBlZCBwYXN0IGRlaHlkcmF0ZWQgRE9NIG5vZGVzIHRvIGdldCBoZXJlLiBIb3dldmVyIHRoZXkgY291bGRcbiAgICAgIC8vIGFsc28gaGF2ZSBiZWVuIG5vbi1SZWFjdCBub2Rlcy4gV2UgbmVlZCB0byBhbnN3ZXIgd2hpY2ggb25lLlxuICAgICAgLy8gSWYgd2UgdGhlIGluc3RhbmNlIGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGRyZW4sIHRoZW4gdGhlcmUgY2FuJ3QgYmVcbiAgICAgIC8vIGEgbmVzdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IHdpdGhpbiBpdC4gU28gd2UgY2FuIHVzZSB0aGlzIGFzIGEgZmFzdFxuICAgICAgLy8gYmFpbG91dC4gTW9zdCBvZiB0aGUgdGltZSwgd2hlbiBwZW9wbGUgYWRkIG5vbi1SZWFjdCBjaGlsZHJlbiB0b1xuICAgICAgLy8gdGhlIHRyZWUsIGl0IGlzIHVzaW5nIGEgcmVmIHRvIGEgY2hpbGQtbGVzcyBET00gbm9kZS5cbiAgICAgIC8vIE5vcm1hbGx5IHdlJ2Qgb25seSBuZWVkIHRvIGNoZWNrIG9uZSBvZiB0aGUgZmliZXJzIGJlY2F1c2UgaWYgaXRcbiAgICAgIC8vIGhhcyBldmVyIGdvbmUgZnJvbSBoYXZpbmcgY2hpbGRyZW4gdG8gZGVsZXRpbmcgdGhlbSBvciB2aWNlIHZlcnNhXG4gICAgICAvLyBpdCB3b3VsZCBoYXZlIGRlbGV0ZWQgdGhlIGRlaHlkcmF0ZWQgYm91bmRhcnkgbmVzdGVkIGluc2lkZSBhbHJlYWR5LlxuICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhlIEhvc3RSb290IHN0YXJ0cyBvdXQgd2l0aCBhbiBhbHRlcm5hdGUgaXQgbWlnaHRcbiAgICAgIC8vIGhhdmUgb25lIG9uIHRoZSBhbHRlcm5hdGUgc28gd2UgbmVlZCB0byBjaGVjayBpbiBjYXNlIHRoaXMgd2FzIGFcbiAgICAgIC8vIHJvb3QuXG4gICAgICB2YXIgYWx0ZXJuYXRlID0gdGFyZ2V0SW5zdC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmICh0YXJnZXRJbnN0LmNoaWxkICE9PSBudWxsIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG5vZGUgdGhhdCBza2lwcGVkIHBhc3QgaXNcbiAgICAgICAgLy8gbmVzdGVkIHdpdGhpbiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgYW5kIGlmIHNvLCB3aGljaCBvbmUuXG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXROb2RlKTtcblxuICAgICAgICB3aGlsZSAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3VzcGVuc2UgaW5zdGFuY2UuIFRoYXQgbWVhbnMgdGhhdCB3ZSBoYXZlbid0XG4gICAgICAgICAgLy8gaHlkcmF0ZWQgaXQgeWV0LiBFdmVuIHRob3VnaCB3ZSBsZWF2ZSB0aGUgY29tbWVudHMgaW4gdGhlXG4gICAgICAgICAgLy8gRE9NIGFmdGVyIGh5ZHJhdGluZywgYW5kIHRoZXJlIGFyZSBib3VuZGFyaWVzIGluIHRoZSBET01cbiAgICAgICAgICAvLyB0aGF0IGNvdWxkIGFscmVhZHkgYmUgaHlkcmF0ZWQsIHdlIHdvdWxkbid0IGhhdmUgZm91bmQgdGhlbVxuICAgICAgICAgIC8vIHRocm91Z2ggdGhpcyBwYXNzIHNpbmNlIGlmIHRoZSB0YXJnZXQgaXMgaHlkcmF0ZWQgaXQgd291bGRcbiAgICAgICAgICAvLyBoYXZlIGhhZCBhbiBpbnRlcm5hbEluc3RhbmNlS2V5IG9uIGl0LlxuICAgICAgICAgIC8vIExldCdzIGdldCB0aGUgZmliZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTdXNwZW5zZUNvbXBvbmVudFxuICAgICAgICAgIC8vIGFzIHRoZSBkZWVwZXN0IGluc3RhbmNlLlxuICAgICAgICAgIHZhciB0YXJnZXRTdXNwZW5zZUluc3QgPSBzdXNwZW5zZUluc3RhbmNlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFN1c3BlbnNlSW5zdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFN1c3BlbnNlSW5zdDtcbiAgICAgICAgICB9IC8vIElmIHdlIGRvbid0IGZpbmQgYSBGaWJlciBvbiB0aGUgY29tbWVudCwgaXQgbWlnaHQgYmUgYmVjYXVzZVxuICAgICAgICAgIC8vIHdlIGhhdmVuJ3QgZ290dGVuIHRvIGh5ZHJhdGUgaXQgeWV0LiBUaGVyZSBtaWdodCBzdGlsbCBiZSBhXG4gICAgICAgICAgLy8gcGFyZW50IGJvdW5kYXJ5IHRoYXQgaGFzbid0IGFib3ZlIHRoaXMgb25lIHNvIHdlIG5lZWQgdG8gZmluZFxuICAgICAgICAgIC8vIHRoZSBvdXRlciBtb3N0IHRoYXQgaXMga25vd24uXG5cblxuICAgICAgICAgIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpOyAvLyBJZiB3ZSBkb24ndCBmaW5kIG9uZSwgdGhlbiB0aGF0IHNob3VsZCBtZWFuIHRoYXQgdGhlIHBhcmVudFxuICAgICAgICAgIC8vIGhvc3QgY29tcG9uZW50IGFsc28gaGFzbid0IGh5ZHJhdGVkIHlldC4gV2UgY2FuIHJldHVybiBpdFxuICAgICAgICAgIC8vIGJlbG93IHNpbmNlIGl0IHdpbGwgYmFpbCBvdXQgb24gdGhlIGlzTW91bnRlZCBjaGVjayBsYXRlci5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICB9XG5cbiAgICB0YXJnZXROb2RlID0gcGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50XG4gKiBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSB3YXMgbm90IHJlbmRlcmVkIGJ5IHRoaXMgUmVhY3QuXG4gKi9cblxuZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gIHZhciBpbnN0ID0gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fCBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgaWYgKGluc3QudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0VGV4dCB8fCBpbnN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICByZXR1cm4gaW5zdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIERPTSBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgLy8gSW4gRmliZXIgdGhpcywgaXMganVzdCB0aGUgc3RhdGUgbm9kZSByaWdodCBub3cuIFdlIGFzc3VtZSBpdCB3aWxsIGJlXG4gICAgLy8gYSBob3N0IGNvbXBvbmVudCBvciBob3N0IHRleHQuXG4gICAgcmV0dXJuIGluc3Quc3RhdGVOb2RlO1xuICB9IC8vIFdpdGhvdXQgdGhpcyBmaXJzdCBpbnZhcmlhbnQsIHBhc3NpbmcgYSBub24tRE9NLWNvbXBvbmVudCB0cmlnZ2VycyB0aGUgbmV4dFxuICAvLyBpbnZhcmlhbnQgZm9yIGEgbWlzc2luZyBwYXJlbnQsIHdoaWNoIGlzIHN1cGVyIGNvbmZ1c2luZy5cblxuXG4gIHRocm93IG5ldyBFcnJvcignZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKTtcbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWx1ZVN0YWNrID0gW107XG52YXIgZmliZXJTdGFjaztcblxue1xuICBmaWJlclN0YWNrID0gW107XG59XG5cbnZhciBpbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IoZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgY3VycmVudDogZGVmYXVsdFZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvcChjdXJzb3IsIGZpYmVyKSB7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBwb3AuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleF0pIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIEZpYmVyIHBvcHBlZC4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlU3RhY2tbaW5kZXhdO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIGluZGV4LS07XG59XG5cbmZ1bmN0aW9uIHB1c2goY3Vyc29yLCB2YWx1ZSwgZmliZXIpIHtcbiAgaW5kZXgrKztcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBjdXJzb3IuY3VycmVudDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBmaWJlcjtcbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWU7XG59XG5cbnZhciB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQ7XG5cbntcbiAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0ID0ge307XG59XG5cbnZhciBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5Q29udGV4dE9iamVjdCk7XG59IC8vIEEgY3Vyc29yIHRvIHRoZSBjdXJyZW50IG1lcmdlZCBjb250ZXh0IG9iamVjdCBvbiB0aGUgc3RhY2suXG5cblxudmFyIGNvbnRleHRTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihlbXB0eUNvbnRleHRPYmplY3QpOyAvLyBBIGN1cnNvciB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG52YXIgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihmYWxzZSk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgb2JqZWN0IHRoYXQgd2FzIG9uIHRoZSBzdGFjay5cbi8vIFdlIHVzZSB0aGlzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHBhcmVudCBjb250ZXh0IGFmdGVyIHdlIGhhdmUgYWxyZWFkeVxuLy8gcHVzaGVkIHRoZSBuZXh0IGNvbnRleHQgcHJvdmlkZXIsIGFuZCBub3cgbmVlZCB0byBtZXJnZSB0aGVpciBjb250ZXh0cy5cblxudmFyIHByZXZpb3VzQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuZnVuY3Rpb24gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlcikge1xuICB7XG4gICAgaWYgKGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlciAmJiBpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAvLyBJZiB0aGUgZmliZXIgaXMgYSBjb250ZXh0IHByb3ZpZGVyIGl0c2VsZiwgd2hlbiB3ZSByZWFkIGl0cyBjb250ZXh0XG4gICAgICAvLyB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHB1c2hlZCBpdHMgb3duIGNoaWxkIGNvbnRleHQgb24gdGhlIHN0YWNrLiBBIGNvbnRleHRcbiAgICAgIC8vIHByb3ZpZGVyIHNob3VsZCBub3QgXCJzZWVcIiBpdHMgb3duIGNoaWxkIGNvbnRleHQuIFRoZXJlZm9yZSB3ZSByZWFkIHRoZVxuICAgICAgLy8gcHJldmlvdXMgKHBhcmVudCkgY29udGV4dCBpbnN0ZWFkIGZvciBhIGNvbnRleHQgcHJvdmlkZXIuXG4gICAgICByZXR1cm4gcHJldmlvdXNDb250ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgbWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPSB1bm1hc2tlZENvbnRleHQ7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQgPSBtYXNrZWRDb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSB0eXBlLmNvbnRleHRUeXBlcztcblxuICAgIGlmICghY29udGV4dFR5cGVzKSB7XG4gICAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgIH0gLy8gQXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgdW5tYXNrZWQgY29udGV4dCBoYXMgY2hhbmdlZC5cbiAgICAvLyBGYWlsaW5nIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgY2FsbHMgdG8gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5cbiAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGluZmluaXRlIGxvb3BzIGlmIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgY2FsbHMgc2V0U3RhdGUuXG5cblxuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID09PSB1bm1hc2tlZENvbnRleHQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY29udGV4dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGNvbnRleHRUeXBlcykge1xuICAgICAgY29udGV4dFtrZXldID0gdW5tYXNrZWRDb250ZXh0W2tleV07XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgaWYgKCF3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJyVzLmNoaWxkQ29udGV4dFR5cGVzIGlzIHNwZWNpZmllZCBidXQgdGhlcmUgaXMgbm8gZ2V0Q2hpbGRDb250ZXh0KCkgbWV0aG9kICcgKyAnb24gdGhlIGluc3RhbmNlLiBZb3UgY2FuIGVpdGhlciBkZWZpbmUgZ2V0Q2hpbGRDb250ZXh0KCkgb24gJXMgb3IgcmVtb3ZlICcgKyAnY2hpbGRDb250ZXh0VHlwZXMgZnJvbSBpdC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50Q29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRDb250ZXh0ID0gaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0KCk7XG5cbiAgICBmb3IgKHZhciBjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dCkge1xuICAgICAgaWYgKCEoY29udGV4dEtleSBpbiBjaGlsZENvbnRleHRUeXBlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpICsgXCIuZ2V0Q2hpbGRDb250ZXh0KCk6IGtleSBcXFwiXCIgKyBjb250ZXh0S2V5ICsgXCJcXFwiIGlzIG5vdCBkZWZpbmVkIGluIGNoaWxkQ29udGV4dFR5cGVzLlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHQsICdjaGlsZCBjb250ZXh0JywgbmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2lnbih7fSwgcGFyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFdlIHB1c2ggdGhlIGNvbnRleHQgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gZW5zdXJlIHN0YWNrIGludGVncml0eS5cbiAgICAvLyBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgeWV0LCB3ZSB3aWxsIHB1c2ggbnVsbCBhdCBmaXJzdCxcbiAgICAvLyBhbmQgcmVwbGFjZSBpdCBvbiB0aGUgc3RhY2sgbGF0ZXIgd2hlbiBpbnZhbGlkYXRpbmcgdGhlIGNvbnRleHQuXG5cbiAgICB2YXIgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCB8fCBlbXB0eUNvbnRleHRPYmplY3Q7IC8vIFJlbWVtYmVyIHRoZSBwYXJlbnQgY29udGV4dCBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCBsYXRlci5cbiAgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBkaWQtcGVyZm9ybS13b3JrIHZhbHVlIHRvIGF2b2lkIGluYWR2ZXJ0ZW50bHkgYmxvY2tpbmcgdXBkYXRlcy5cblxuICAgIHByZXZpb3VzQ29udGV4dCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgdHlwZSwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYW4gaW5zdGFuY2UgYnkgdGhpcyBwb2ludC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAgIC8vIE1lcmdlIHBhcmVudCBhbmQgb3duIGNvbnRleHQuXG4gICAgICAvLyBTa2lwIHRoaXMgaWYgd2UncmUgbm90IHVwZGF0aW5nIGR1ZSB0byBzQ1UuXG4gICAgICAvLyBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyaWx5IHJlY29tcHV0aW5nIG1lbW9pemVkIHZhbHVlcy5cbiAgICAgIHZhciBtZXJnZWRDb250ZXh0ID0gcHJvY2Vzc0NoaWxkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdHlwZSwgcHJldmlvdXNDb250ZXh0KTtcbiAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gbWVyZ2VkQ29udGV4dDsgLy8gUmVwbGFjZSB0aGUgb2xkIChvciBlbXB0eSkgY29udGV4dCB3aXRoIHRoZSBuZXcgb25lLlxuICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRvIHVud2luZCB0aGUgY29udGV4dCBpbiB0aGUgcmV2ZXJzZSBvcmRlci5cblxuICAgICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTsgLy8gTm93IHB1c2ggdGhlIG5ldyBjb250ZXh0IGFuZCBtYXJrIHRoYXQgaXQgaGFzIGNoYW5nZWQuXG5cbiAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZXJnZWRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIC8vIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgdXNlZCB3aXRoIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOyBub3Qgc3VyZSBpZiBpdFxuICAgIC8vIG1ha2VzIHNlbnNlIGVsc2V3aGVyZVxuICAgIGlmICghaXNGaWJlck1vdW50ZWQoZmliZXIpIHx8IGZpYmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc3VidHJlZSBwYXJlbnQgdG8gYmUgYSBtb3VudGVkIGNsYXNzIGNvbXBvbmVudC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICBkbyB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLmNvbnRleHQ7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gbm9kZS50eXBlO1xuXG4gICAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1bmV4cGVjdGVkIGRldGFjaGVkIHN1YnRyZWUgcGFyZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxudmFyIExlZ2FjeVJvb3QgPSAwO1xudmFyIENvbmN1cnJlbnRSb290ID0gMTtcblxudmFyIHN5bmNRdWV1ZSA9IG51bGw7XG52YXIgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdO1xuICB9IGVsc2Uge1xuICAgIC8vIFB1c2ggb250byBleGlzdGluZyBxdWV1ZS4gRG9uJ3QgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrIGJlY2F1c2VcbiAgICAvLyB3ZSBhbHJlYWR5IHNjaGVkdWxlZCBvbmUgd2hlbiB3ZSBjcmVhdGVkIHRoZSBxdWV1ZS5cbiAgICBzeW5jUXVldWUucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IHRydWU7XG4gIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKSB7XG4gIC8vIE9ubHkgZmx1c2hlcyB0aGUgcXVldWUgaWYgdGhlcmUncyBhIGxlZ2FjeSBzeW5jIGNhbGxiYWNrIHNjaGVkdWxlZC5cbiAgLy8gVE9ETzogVGhlcmUncyBvbmx5IGEgc2luZ2xlIHR5cGUgb2YgY2FsbGJhY2s6IHBlcmZvcm1TeW5jT25Xb3JrT25Sb290LiBTb1xuICAvLyBpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgZm9yIHRoZSBxdWV1ZSB0byBiZSBhIGxpc3Qgb2Ygcm9vdHMgaW5zdGVhZCBvZiBhXG4gIC8vIGxpc3Qgb2YgZ2VuZXJpYyBjYWxsYmFja3MuIFRoZW4gd2UgY2FuIGhhdmUgdHdvOiBvbmUgZm9yIGxlZ2FjeSByb290cywgb25lXG4gIC8vIGZvciBjb25jdXJyZW50IHJvb3RzLiBBbmQgdGhpcyBtZXRob2Qgd291bGQgb25seSBmbHVzaCB0aGUgbGVnYWN5IG9uZXMuXG4gIGlmIChpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MpIHtcbiAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgfVxufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzKCkge1xuICBpZiAoIWlzRmx1c2hpbmdTeW5jUXVldWUgJiYgc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gdHJ1ZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZXZpb3VzVXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaXNTeW5jID0gdHJ1ZTtcbiAgICAgIHZhciBxdWV1ZSA9IHN5bmNRdWV1ZTsgLy8gVE9ETzogSXMgdGhpcyBuZWNlc3NhcnkgYW55bW9yZT8gVGhlIG9ubHkgdXNlciBjb2RlIHRoYXQgcnVucyBpbiB0aGlzXG4gICAgICAvLyBxdWV1ZSBpcyBpbiB0aGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZXMuXG5cbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGlzU3luYyk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgIH1cblxuICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICBpZiAoc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICB9IC8vIFJlc3VtZSBmbHVzaGluZyBpbiB0aGUgbmV4dCB0aWNrXG5cblxuICAgICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVQcmlvcml0eSk7XG4gICAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRPRE86IFVzZSB0aGUgdW5pZmllZCBmaWJlciBzdGFjayBtb2R1bGUgaW5zdGVhZCBvZiB0aGlzIGxvY2FsIG9uZT9cbi8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGl0IHlldCB0byBkZXJpc2sgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIGJlY2F1c2Vcbi8vIHRoZSB3YXkgd2UgcHVzaC9wb3AgdGhlc2UgdmFsdWVzIGlzIGEgYml0IHVudXN1YWwuIElmIHRoZXJlJ3MgYSBtaXN0YWtlLCBJJ2Rcbi8vIHJhdGhlciB0aGUgaWRzIGJlIHdyb25nIHRoYW4gY3Jhc2ggdGhlIHdob2xlIHJlY29uY2lsZXIuXG52YXIgZm9ya1N0YWNrID0gW107XG52YXIgZm9ya1N0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVGb3JrQ291bnQgPSAwO1xudmFyIGlkU3RhY2sgPSBbXTtcbnZhciBpZFN0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVDb250ZXh0SWQgPSAxO1xudmFyIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSAnJztcbmZ1bmN0aW9uIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JrZWQpICE9PSBOb0ZsYWdzO1xufVxuZnVuY3Rpb24gZ2V0Rm9ya3NBdExldmVsKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gdHJlZUZvcmtDb3VudDtcbn1cbmZ1bmN0aW9uIGdldFRyZWVJZCgpIHtcbiAgdmFyIG92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgaWQgPSBpZFdpdGhMZWFkaW5nQml0ICYgfmdldExlYWRpbmdCaXQoaWRXaXRoTGVhZGluZ0JpdCk7XG4gIHJldHVybiBpZC50b1N0cmluZygzMikgKyBvdmVyZmxvdztcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbikge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBhZnRlciB3ZSByZWNvbmNpbGUgYW4gYXJyYXkgKG9yIGl0ZXJhdG9yKSBvZiBjaGlsZFxuICAvLyBmaWJlcnMsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGtub3cgaG93IG1hbnkgY2hpbGRyZW4gaW5cbiAgLy8gdGhlIHdob2xlIHNldCB3aXRob3V0IGRvaW5nIGV4dHJhIHdvcmsgbGF0ZXIsIG9yIHN0b3JpbmcgYWRkdGlvbmFsXG4gIC8vIGluZm9ybWF0aW9uIG9uIHRoZSBmaWJlci5cbiAgLy9cbiAgLy8gVGhhdCdzIHdoeSB0aGlzIGZ1bmN0aW9uIGlzIHNlcGFyYXRlIGZyb20gcHVzaFRyZWVJZCBcdTIwMTQgaXQncyBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoZSByZW5kZXIgcGhhc2Ugb2YgdGhlIGZvcmsgcGFyZW50LCBub3QgdGhlIGNoaWxkLCB3aGljaCBpcyB3aGVyZSB3ZSBwdXNoXG4gIC8vIHRoZSBvdGhlciBjb250ZXh0IHZhbHVlcy5cbiAgLy9cbiAgLy8gSW4gdGhlIEZpenogaW1wbGVtZW50YXRpb24gdGhpcyBpcyBtdWNoIHNpbXBsZXIgYmVjYXVzZSB0aGUgY2hpbGQgaXNcbiAgLy8gcmVuZGVyZWQgaW4gdGhlIHNhbWUgY2FsbHN0YWNrIGFzIHRoZSBwYXJlbnQuXG4gIC8vXG4gIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0byBqdXN0IGFkZCBhIGBmb3Jrc2AgZmllbGQgdG8gdGhlIEZpYmVyIHR5cGUuIEl0IHdvdWxkXG4gIC8vIG1ha2UgdGhpcyBtb2R1bGUgc2ltcGxlci5cbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrQ291bnQ7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gIHRyZWVGb3JrUHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdHJlZUZvcmtDb3VudCA9IHRvdGFsQ2hpbGRyZW47XG59XG5mdW5jdGlvbiBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuLCBpbmRleCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgYmFzZUlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgYmFzZU92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsgLy8gVGhlIGxlZnRtb3N0IDEgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG5vbi1pbmNsdXNpdmUuIEl0J3Mgbm90IHBhcnRcbiAgLy8gb2YgdGhlIGlkOyB3ZSB1c2UgaXQgdG8gYWNjb3VudCBmb3IgbGVhZGluZyAwcy5cblxuICB2YXIgYmFzZUxlbmd0aCA9IGdldEJpdExlbmd0aChiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICB2YXIgYmFzZUlkID0gYmFzZUlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgYmFzZUxlbmd0aCk7XG4gIHZhciBzbG90ID0gaW5kZXggKyAxO1xuICB2YXIgbGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDsgLy8gMzAgaXMgdGhlIG1heCBsZW5ndGggd2UgY2FuIHN0b3JlIHdpdGhvdXQgb3ZlcmZsb3dpbmcsIHRha2luZyBpbnRvXG4gIC8vIGNvbnNpZGVyYXRpb24gdGhlIGxlYWRpbmcgMSB3ZSB1c2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblxuICBpZiAobGVuZ3RoID4gMzApIHtcbiAgICAvLyBXZSBvdmVyZmxvd2VkIHRoZSBiaXR3aXNlLXNhZmUgcmFuZ2UuIEZhbGwgYmFjayB0byBzbG93ZXIgYWxnb3JpdGhtLlxuICAgIC8vIFRoaXMgYnJhbmNoIGFzc3VtZXMgdGhlIGxlbmd0aCBvZiB0aGUgYmFzZSBpZCBpcyBncmVhdGVyIHRoYW4gNTsgaXQgd29uJ3RcbiAgICAvLyB3b3JrIGZvciBzbWFsbGVyIGlkcywgYmVjYXVzZSB5b3UgbmVlZCA1IGJpdHMgcGVyIGNoYXJhY3Rlci5cbiAgICAvL1xuICAgIC8vIFdlIGVuY29kZSB0aGUgaWQgaW4gbXVsdGlwbGUgc3RlcHM6IGZpcnN0IHRoZSBiYXNlIGlkLCB0aGVuIHRoZVxuICAgIC8vIHJlbWFpbmluZyBkaWdpdHMuXG4gICAgLy9cbiAgICAvLyBFYWNoIDUgYml0IHNlcXVlbmNlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGJhc2UgMzIgY2hhcmFjdGVyLiBTbyBmb3JcbiAgICAvLyBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBpZCBpcyAyMyBiaXRzIGxvbmcsIHdlIGNhbiBjb252ZXJ0IDIwIG9mIHRob3NlXG4gICAgLy8gYml0cyBpbnRvIGEgc3RyaW5nIG9mIDQgY2hhcmFjdGVycywgd2l0aCAzIGJpdHMgbGVmdCBvdmVyLlxuICAgIC8vXG4gICAgLy8gRmlyc3QgY2FsY3VsYXRlIGhvdyBtYW55IGJpdHMgaW4gdGhlIGJhc2UgaWQgcmVwcmVzZW50IGEgY29tcGxldGVcbiAgICAvLyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLlxuICAgIHZhciBudW1iZXJPZk92ZXJmbG93Qml0cyA9IGJhc2VMZW5ndGggLSBiYXNlTGVuZ3RoICUgNTsgLy8gVGhlbiBjcmVhdGUgYSBiaXRtYXNrIHRoYXQgc2VsZWN0cyBvbmx5IHRob3NlIGJpdHMuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3dCaXRzID0gKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMTsgLy8gU2VsZWN0IHRoZSBiaXRzLCBhbmQgY29udmVydCB0aGVtIHRvIGEgYmFzZSAzMiBzdHJpbmcuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3cgPSAoYmFzZUlkICYgbmV3T3ZlcmZsb3dCaXRzKS50b1N0cmluZygzMik7IC8vIE5vdyB3ZSBjYW4gcmVtb3ZlIHRob3NlIGJpdHMgZnJvbSB0aGUgYmFzZSBpZC5cblxuICAgIHZhciByZXN0T2ZCYXNlSWQgPSBiYXNlSWQgPj4gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7XG4gICAgdmFyIHJlc3RPZkJhc2VMZW5ndGggPSBiYXNlTGVuZ3RoIC0gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7IC8vIEZpbmFsbHksIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1c2luZyB0aGUgbm9ybWFsIGFsZ29yaXRobS4gQmVjYXVzZVxuICAgIC8vIHdlIG1hZGUgbW9yZSByb29tLCB0aGlzIHRpbWUgaXQgd29uJ3Qgb3ZlcmZsb3cuXG5cbiAgICB2YXIgcmVzdE9mTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgcmVzdE9mTmV3Qml0cyA9IHNsb3QgPDwgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgaWQgPSByZXN0T2ZOZXdCaXRzIHwgcmVzdE9mQmFzZUlkO1xuICAgIHZhciBvdmVyZmxvdyA9IG5ld092ZXJmbG93ICsgYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IHJlc3RPZkxlbmd0aCB8IGlkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3JtYWwgcGF0aFxuICAgIHZhciBuZXdCaXRzID0gc2xvdCA8PCBiYXNlTGVuZ3RoO1xuXG4gICAgdmFyIF9pZCA9IG5ld0JpdHMgfCBiYXNlSWQ7XG5cbiAgICB2YXIgX292ZXJmbG93ID0gYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IGxlbmd0aCB8IF9pZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gX292ZXJmbG93O1xuICB9XG59XG5mdW5jdGlvbiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRlcmlhbGl6ZWQgYW4gaWQuIFRoaXMgd2lsbCBhZmZlY3QgYW55IGlkcyB0aGF0IGFwcGVhclxuICAvLyBpbiBpdHMgY2hpbGRyZW4uXG5cbiAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBudW1iZXJPZkZvcmtzID0gMTtcbiAgICB2YXIgc2xvdEluZGV4ID0gMDtcbiAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MpO1xuICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qml0TGVuZ3RoKG51bWJlcikge1xuICByZXR1cm4gMzIgLSBjbHozMihudW1iZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFkaW5nQml0KGlkKSB7XG4gIHJldHVybiAxIDw8IGdldEJpdExlbmd0aChpZCkgLSAxO1xufVxuXG5mdW5jdGlvbiBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZXMuXG4gIC8vIFRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIG90aGVyIGNvbnRleHQtbGlrZSBtb2R1bGVzIGluIEZpYmVyXG4gIC8vIGJlY2F1c2UgdGhlIHNhbWUgRmliZXIgbWF5IGFwcGVhciBvbiB0aGUgc3RhY2sgbXVsdGlwbGUgdGltZXMgYW5kIGZvclxuICAvLyBkaWZmZXJlbnQgcmVhc29ucy4gV2UgaGF2ZSB0byBrZWVwIHBvcHBpbmcgdW50aWwgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaXNcbiAgLy8gbm8gbG9uZ2VyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVGb3JrUHJvdmlkZXIpIHtcbiAgICB0cmVlRm9ya1Byb3ZpZGVyID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVGb3JrQ291bnQgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cblxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVDb250ZXh0UHJvdmlkZXIpIHtcbiAgICB0cmVlQ29udGV4dFByb3ZpZGVyID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuXG4gIGlmICh0cmVlQ29udGV4dFByb3ZpZGVyICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0cmVlQ29udGV4dElkLFxuICAgICAgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3dcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZENvbnRleHQpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0SWQgPSBzdXNwZW5kZWRDb250ZXh0LmlkO1xuICB0cmVlQ29udGV4dE92ZXJmbG93ID0gc3VzcGVuZGVkQ29udGV4dC5vdmVyZmxvdztcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoIWdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBiZSBoeWRyYXRpbmcuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlICcgKyAnYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTsgLy8gVGhpcyBmbGFnIGFsbG93cyBmb3Igd2FybmluZyBzdXByZXNzaW9uIHdoZW4gd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1pc21hdGNoZXNcbi8vIGR1ZSB0byBlYXJsaWVyIG1pc21hdGNoZXMgb3IgYSBzdXNwZW5kZWQgZmliZXIuXG5cbnZhciBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOyAvLyBIeWRyYXRpb24gZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW5zaWRlIHRoaXMgYm91bmRhcnlcblxudmFyIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5JZkh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgZXJyb3IoJ1dlIHNob3VsZCBub3QgYmUgaHlkcmF0aW5nIGhlcmUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGEgYnVnLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIHJldHVybiBkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRlckh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlciwgc3VzcGVuc2VJbnN0YW5jZSwgdHJlZUNvbnRleHQpIHtcblxuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG5cbiAgaWYgKHRyZWVDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KGZpYmVyLCB0cmVlQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKTtcbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAge1xuICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvckRFVikge1xuICAgICAgLy8gSW5zaWRlIGEgYm91bmRhcnkgdGhhdCBhbHJlYWR5IHN1c3BlbmRlZC4gV2UncmUgY3VycmVudGx5IHJlbmRlcmluZyB0aGVcbiAgICAgIC8vIHNpYmxpbmdzIG9mIGEgc3VzcGVuZGVkIG5vZGUuIFRoZSBtaXNtYXRjaCBtYXkgYmUgZHVlIHRvIHRoZSBtaXNzaW5nXG4gICAgICAvLyBkYXRhLCBzbyBpdCdzIHByb2JhYmx5IGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3R5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSwgX3Byb3BzLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcGFyZW50SW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlMiA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90eXBlMik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdGV4dDIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcbiAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKG5leHRJbnN0YW5jZSwgdGV4dCk7XG5cbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBUZXh0IEluc3RhbmNlcyBkb24ndCBoYXZlIGNoaWxkcmVuIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBoeWRyYXRlLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICB0cmVlQ29udGV4dDogZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSxcbiAgICAgICAgICAgIHJldHJ5TGFuZTogT2Zmc2NyZWVuTGFuZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IHN1c3BlbnNlU3RhdGU7IC8vIFN0b3JlIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50IGFzIGEgY2hpbGQgZmliZXIuXG4gICAgICAgICAgLy8gVGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGZvciBnZXRIb3N0U2libGluZyBhbmQgZGVsZXRpbmcgbm9kZXMsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lc24ndCBoYXZlIHRvIGNvbnNpZGVyIGFsbCBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXkncmUgZGVoeWRyYXRlZCBvbmVzIG9yIG5vdC5cblxuICAgICAgICAgIHZhciBkZWh5ZHJhdGVkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgZGVoeWRyYXRlZEZyYWdtZW50LnJldHVybiA9IGZpYmVyO1xuICAgICAgICAgIGZpYmVyLmNoaWxkID0gZGVoeWRyYXRlZEZyYWdtZW50O1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFdoaWxlIGEgU3VzcGVuc2UgSW5zdGFuY2UgZG9lcyBoYXZlIGNoaWxkcmVuLCB3ZSB3b24ndCBzdGVwIGludG9cbiAgICAgICAgICAvLyBpdCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIEluc3RlYWQsIHdlJ2xsIHJlZW50ZXIgaXQgbGF0ZXIuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikge1xuICByZXR1cm4gKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAoZmliZXIuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncztcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKSB7XG4gIHRocm93IG5ldyBFcnJvcignSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBpbml0aWFsIFVJIGRvZXMgbm90IG1hdGNoIHdoYXQgd2FzICcgKyAncmVuZGVyZWQgb24gdGhlIHNlcnZlci4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuXG5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cblxuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICAgIHZhciBwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmICghbmV4dEluc3RhbmNlIHx8ICF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuICAgICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBtYXRjaGVkIHRoZSBuZXh0IG9uZSwgd2UnbGwgbm93IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBvbmUgd2FzXG4gICAgLy8gc3VwZXJmbHVvdXMgYW5kIHdlJ2xsIGRlbGV0ZSBpdC4gU2luY2Ugd2UgY2FuJ3QgZWFnZXJseSBkZWxldGUgaXRcbiAgICAvLyB3ZSdsbCBoYXZlIHRvIHNjaGVkdWxlIGEgZGVsZXRpb24uIFRvIGRvIHRoYXQsIHRoaXMgbm9kZSBuZWVkcyBhIGR1bW15XG4gICAgLy8gZmliZXIgYXNzb2NpYXRlZCB3aXRoIGl0LlxuXG5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocHJldkh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIHZhciB1cGRhdGVQYXlsb2FkID0gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCBmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBmaWJlciwgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICBmaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS5cblxuICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciB0ZXh0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciB0ZXh0Q29udGVudCA9IGZpYmVyLm1lbW9pemVkUHJvcHM7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIGZpYmVyKTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UgaXMgY2FsbGVkIGluIGEgY29udGV4dCB3aGVyZSB0aGVcbiAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlMiA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFueSByZW1haW5pbmcgaHlkcmF0YWJsZSBub2Rlcywgd2UgbmVlZCB0byBkZWxldGUgdGhlbSBub3cuXG4gIC8vIFdlIG9ubHkgZG8gdGhpcyBkZWVwZXIgdGhhbiBoZWFkIGFuZCBib2R5IHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHJhbmRvbVxuICAvLyBvdGhlciBub2RlcyBpbiB0aGVtLiBXZSBhbHNvIGlnbm9yZSBjb21wb25lbnRzIHdpdGggcHVyZSB0ZXh0IGNvbnRlbnQgaW5cbiAgLy8gc2lkZSBvZiB0aGVtLiBXZSBhbHNvIGRvbid0IGRlbGV0ZSBhbnl0aGluZyBpbnNpZGUgdGhlIHJvb3QgY29udGFpbmVyLlxuXG5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdFJvb3QgJiYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhmaWJlci50eXBlKSAmJiAhc2hvdWxkU2V0VGV4dENvbnRlbnQoZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcykpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICBpZiAobmV4dEluc3RhbmNlKSB7XG4gICAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcik7XG4gICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgICAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpO1xuICB9IGVsc2Uge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlciA/IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaWJlci5zdGF0ZU5vZGUpIDogbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmcgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcikge1xuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCkge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLiBUaGUgZXJyb3JzIHRoYXQgb2NjdXJyZWRcbiAgICAvLyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBhdHRlbXB0IGFyZSBub3cgcmVjb3ZlcmVkLiBXZSB3aWxsIGxvZyB0aGVtIGluXG4gICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuXG4gICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhoeWRyYXRpb25FcnJvcnMpO1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNIeWRyYXRpbmcoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZztcbn1cblxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzID09PSBudWxsKSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICBoeWRyYXRpb25FcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBOb1RyYW5zaXRpb24gPSBudWxsO1xuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkge1xuICByZXR1cm4gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cGUgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLlxuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgZG8gYW4gaW5pdGlhbCBwYXNzIHRvIGdhdGhlciBjb21wb25lbnQgbmFtZXNcbiAgICB2YXIgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH0gLy8gRmluYWxseSwgd2UgZmx1c2ggYWxsIHRoZSB3YXJuaW5nc1xuICAgIC8vIFVOU0FGRV8gb25lcyBiZWZvcmUgdGhlIGRlcHJlY2F0ZWQgb25lcywgc2luY2UgdGhleSdsbCBiZSAnbG91ZGVyJ1xuXG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgXCIgKyAncmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMyKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsTW91bnQgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczQgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgXCIgKyAnY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczQpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM1ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFVwZGF0ZSBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsVXBkYXRlIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM1KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcblxuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG5cblxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuXG4gICAgICB3YXJuaW5nc0ZvclJvb3QucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyQXJyYXksIHN0cmljdFJvb3QpIHtcbiAgICAgIGlmIChmaWJlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdEZpYmVyID0gZmliZXJBcnJheVswXTtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGZpYmVyQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKHVuaXF1ZU5hbWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpcnN0RmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS4nICsgJ1xcblxcblRoZSBvbGQgQVBJIHdpbGwgYmUgc3VwcG9ydGVkIGluIGFsbCAxNi54IHJlbGVhc2VzLCBidXQgYXBwbGljYXRpb25zICcgKyAndXNpbmcgaXQgc2hvdWxkIG1pZ3JhdGUgdG8gdGhlIG5ldyB2ZXJzaW9uLicgKyAnXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBzb3J0ZWROYW1lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBiYXNlUHJvcHMpO1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICByZXR1cm4gYmFzZVByb3BzO1xufVxuXG52YXIgdmFsdWVDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCk7XG52YXIgcmVuZGVyZXJTaWdpbDtcblxue1xuICAvLyBVc2UgdGhpcyB0byBkZXRlY3QgbXVsdGlwbGUgcmVuZGVyZXJzIHVzaW5nIHRoZSBzYW1lIGNvbnRleHRcbiAgcmVuZGVyZXJTaWdpbCA9IHt9O1xufVxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xudmFyIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG52YXIgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbnZhciBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG5mdW5jdGlvbiByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBSZWFjdCB5aWVsZHMgZXhlY3V0aW9uLCB0byBlbnN1cmUgYHJlYWRDb250ZXh0YFxuICAvLyBjYW5ub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuXG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkge1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwdXNoUHJvdmlkZXIocHJvdmlkZXJGaWJlciwgY29udGV4dCwgbmV4dFZhbHVlKSB7XG4gIHtcbiAgICBwdXNoKHZhbHVlQ3Vyc29yLCBjb250ZXh0Ll9jdXJyZW50VmFsdWUsIHByb3ZpZGVyRmliZXIpO1xuICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IG5leHRWYWx1ZTtcblxuICAgIHtcbiAgICAgIGlmIChjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IG51bGwgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsKSB7XG4gICAgICAgIGVycm9yKCdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSByZW5kZXJlclNpZ2lsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9wUHJvdmlkZXIoY29udGV4dCwgcHJvdmlkZXJGaWJlcikge1xuICB2YXIgY3VycmVudFZhbHVlID0gdmFsdWVDdXJzb3IuY3VycmVudDtcbiAgcG9wKHZhbHVlQ3Vyc29yLCBwcm92aWRlckZpYmVyKTtcblxuICB7XG4gICAge1xuICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgLy8gVXBkYXRlIHRoZSBjaGlsZCBsYW5lcyBvZiBhbGwgdGhlIGFuY2VzdG9ycywgaW5jbHVkaW5nIHRoZSBhbHRlcm5hdGVzLlxuICB2YXIgbm9kZSA9IHBhcmVudDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBhbHRlcm5hdGUgPSBub2RlLmFsdGVybmF0ZTtcblxuICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBub2RlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmICFpc1N1YnNldE9mTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChub2RlICE9PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiByb290IHdoZW4gc2NoZWR1bGluZyBjb250ZXh0IHdvcmsuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcblxuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuXG4gICAgICAgICAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZm9yY2UgdXBkYXRlIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTsgLy8gVE9ETzogQmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgd29yay1pbi1wcm9ncmVzcywgdGhpcyB3aWxsIGFkZCB0aGVcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0byB0aGUgY3VycmVudCBmaWJlciwgdG9vLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcnNpc3QgZXZlbiBpZlxuICAgICAgICAgICAgLy8gdGhpcyByZW5kZXIgaXMgdGhyb3duIGF3YXkuIFNpbmNlIGl0J3MgYSByYWNlIGNvbmRpdGlvbiwgbm90IHN1cmUgaXQnc1xuICAgICAgICAgICAgLy8gd29ydGggZml4aW5nLlxuICAgICAgICAgICAgLy8gSW5saW5lZCBgZW5xdWV1ZVVwZGF0ZWAgdG8gcmVtb3ZlIGludGVybGVhdmVkIHVwZGF0ZSBjaGVja1xuXG4gICAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSA7IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gICAgICAgICAgICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgICAgICAgICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpOyAvLyBNYXJrIHRoZSB1cGRhdGVkIGxhbmVzIG9uIHRoZSBsaXN0LCB0b28uXG5cbiAgICAgICAgICBsaXN0LmxhbmVzID0gbWVyZ2VMYW5lcyhsaXN0LmxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlIGFscmVhZHkgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgdHJhdmVyc2luZyB0aGVcbiAgICAgICAgICAvLyBkZXBlbmRlbmN5IGxpc3QuXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENvbnRleHRQcm92aWRlcikge1xuICAgICAgLy8gRG9uJ3Qgc2NhbiBkZWVwZXIgaWYgdGhpcyBpcyBhIG1hdGNoaW5nIHByb3ZpZGVyXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy50eXBlID8gbnVsbCA6IGZpYmVyLmNoaWxkO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBpcyBpbiB0aGlzIHN1YnRyZWUsIHdlIGRvbid0IGtub3dcbiAgICAgIC8vIGlmIGl0IHdpbGwgaGF2ZSBhbnkgY29udGV4dCBjb25zdW1lcnMgaW4gaXQuIFRoZSBiZXN0IHdlIGNhbiBkbyBpc1xuICAgICAgLy8gbWFyayBpdCBhcyBoYXZpbmcgdXBkYXRlcy5cbiAgICAgIHZhciBwYXJlbnRTdXNwZW5zZSA9IGZpYmVyLnJldHVybjtcblxuICAgICAgaWYgKHBhcmVudFN1c3BlbnNlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2UganVzdCBjYW1lIGZyb20gYSBwYXJlbnQgc28gd2UgbXVzdCBoYXZlIGhhZCBhIHBhcmVudC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50U3VzcGVuc2UubGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudFN1c3BlbnNlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX2FsdGVybmF0ZSA9IHBhcmVudFN1c3BlbnNlLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKF9hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgX2FsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoX2FsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFzc2luZyB0aGlzIGZpYmVyIGFzIHRoZSBwYXJlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrXG4gICAgICAvLyBvbiBpdHMgY2hpbGRyZW4uIFdlJ2xsIHVzZSB0aGUgY2hpbGRMYW5lcyBvblxuICAgICAgLy8gdGhpcyBmaWJlciB0byBpbmRpY2F0ZSB0aGF0IGEgY29udGV4dCBoYXMgY2hhbmdlZC5cblxuXG4gICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudFN1c3BlbnNlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuc2libGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhdmVyc2UgZG93bi5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgIH1cblxuICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjaGlsZC4gVHJhdmVyc2UgdG8gbmV4dCBzaWJsaW5nLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG5cbiAgICAgIHdoaWxlIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5leHRGaWJlciA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAvLyBXZSdyZSBiYWNrIHRvIHRoZSByb290IG9mIHRoaXMgc3VidHJlZS4gRXhpdC5cbiAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpYmxpbmcgPSBuZXh0RmliZXIuc2libGluZztcblxuICAgICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIHNpYmxpbmcgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IHNpYmxpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuXG5cblxuICAgICAgICBuZXh0RmliZXIgPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcblxuICBpZiAoZGVwZW5kZW5jaWVzICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgdmFyIGZpcnN0Q29udGV4dCA9IGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQ7XG5cbiAgICAgIGlmIChmaXJzdENvbnRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgICAvLyBDb250ZXh0IGxpc3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuIE1hcmsgdGhhdCB0aGlzIGZpYmVyIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgICAgZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZWFkQ29udGV4dChjb250ZXh0KSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdmFsdWUgPSAgY29udGV4dC5fY3VycmVudFZhbHVlIDtcblxuICBpZiAobGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID09PSBjb250ZXh0KSA7IGVsc2Uge1xuICAgIHZhciBjb250ZXh0SXRlbSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgICBtZW1vaXplZFZhbHVlOiB2YWx1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gICAgICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IGRlcGVuZGVuY3kgZm9yIHRoaXMgY29tcG9uZW50LiBDcmVhdGUgYSBuZXcgbGlzdC5cblxuXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjb250ZXh0SXRlbTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGZpcnN0Q29udGV4dDogY29udGV4dEl0ZW1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBhIG5ldyBjb250ZXh0IGl0ZW0uXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBsYXN0Q29udGV4dERlcGVuZGVuY3kubmV4dCA9IGNvbnRleHRJdGVtO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmVuZGVyLiBXaGVuIHRoaXMgcmVuZGVyIGV4aXRzLCBlaXRoZXIgYmVjYXVzZSBpdCBmaW5pc2hlcyBvciBiZWNhdXNlIGl0IGlzXG4vLyBpbnRlcnJ1cHRlZCwgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbCBiZSB0cmFuc2ZlcnJlZCBvbnRvIHRoZSBtYWluIHBhcnRcbi8vIG9mIHRoZSBxdWV1ZS5cblxudmFyIGNvbmN1cnJlbnRRdWV1ZXMgPSBudWxsO1xuZnVuY3Rpb24gcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSkge1xuICBpZiAoY29uY3VycmVudFF1ZXVlcyA9PT0gbnVsbCkge1xuICAgIGNvbmN1cnJlbnRRdWV1ZXMgPSBbcXVldWVdO1xuICB9IGVsc2Uge1xuICAgIGNvbmN1cnJlbnRRdWV1ZXMucHVzaChxdWV1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKSB7XG4gIC8vIFRyYW5zZmVyIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIG9udG8gdGhlIG1haW4gcXVldWUuIEVhY2ggcXVldWUgaGFzIGFcbiAgLy8gYHBlbmRpbmdgIGZpZWxkIGFuZCBhbiBgaW50ZXJsZWF2ZWRgIGZpZWxkLiBXaGVuIHRoZXkgYXJlIG5vdCBudWxsLCB0aGV5XG4gIC8vIHBvaW50IHRvIHRoZSBsYXN0IG5vZGUgaW4gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4gV2UgbmVlZCB0byBhcHBlbmQgdGhlXG4gIC8vIGludGVybGVhdmVkIGxpc3QgdG8gdGhlIGVuZCBvZiB0aGUgcGVuZGluZyBsaXN0IGJ5IGpvaW5pbmcgdGhlbSBpbnRvIGFcbiAgLy8gc2luZ2xlLCBjaXJjdWxhciBsaXN0LlxuICBpZiAoY29uY3VycmVudFF1ZXVlcyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY3VycmVudFF1ZXVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlID0gY29uY3VycmVudFF1ZXVlc1tpXTtcbiAgICAgIHZhciBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICAgICAgaWYgKGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBxdWV1ZS5pbnRlcmxlYXZlZCA9IG51bGw7XG4gICAgICAgIHZhciBmaXJzdEludGVybGVhdmVkVXBkYXRlID0gbGFzdEludGVybGVhdmVkVXBkYXRlLm5leHQ7XG4gICAgICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKGxhc3RQZW5kaW5nVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICAgICAgbGFzdEludGVybGVhdmVkVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbGFzdEludGVybGVhdmVkVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmN1cnJlbnRRdWV1ZXMgPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZUFuZEVhZ2VybHlCYWlsb3V0KGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudENsYXNzVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpIHtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn0gLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIG91dHNpZGUgdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgYmUgZG9uZSBmb3IgYmFja3dhcmRzXG4vLyBjb21wYXRpYmlsaXR5IGFuZCBzaG91bGQgYWx3YXlzIGJlIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZy5cblxudmFyIHVuc2FmZV9tYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290O1xuXG5mdW5jdGlvbiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChzb3VyY2VGaWJlciwgbGFuZSkge1xuICAvLyBVcGRhdGUgdGhlIHNvdXJjZSBmaWJlcidzIGxhbmVzXG4gIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgbGFuZSk7XG4gIHZhciBhbHRlcm5hdGUgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCBsYW5lKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsICYmIChzb3VyY2VGaWJlci5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgfVxuICB9IC8vIFdhbGsgdGhlIHBhcmVudCBwYXRoIHRvIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIGNoaWxkIGxhbmVzLlxuXG5cbiAgdmFyIG5vZGUgPSBzb3VyY2VGaWJlcjtcbiAgdmFyIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgcGFyZW50LmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudC5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICBhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoKHBhcmVudC5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IHBhcmVudDtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHZhciByb290ID0gbm9kZS5zdGF0ZU5vZGU7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIFVwZGF0ZVN0YXRlID0gMDtcbnZhciBSZXBsYWNlU3RhdGUgPSAxO1xudmFyIEZvcmNlVXBkYXRlID0gMjtcbnZhciBDYXB0dXJlVXBkYXRlID0gMzsgLy8gR2xvYmFsIHN0YXRlIHRoYXQgaXMgcmVzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiBjYWxsaW5nIGBwcm9jZXNzVXBkYXRlUXVldWVgLlxuLy8gSXQgc2hvdWxkIG9ubHkgYmUgcmVhZCByaWdodCBhZnRlciBjYWxsaW5nIGBwcm9jZXNzVXBkYXRlUXVldWVgLCB2aWFcbi8vIGBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nYC5cblxudmFyIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZTtcbnZhciBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWU7XG5cbntcbiAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IGZhbHNlO1xuICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBpbml0aWFsaXplVXBkYXRlUXVldWUoZmliZXIpIHtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIGJhc2VTdGF0ZTogZmliZXIubWVtb2l6ZWRTdGF0ZSxcbiAgICBmaXJzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgbGFzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgc2hhcmVkOiB7XG4gICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgICBsYW5lczogTm9MYW5lc1xuICAgIH0sXG4gICAgZWZmZWN0czogbnVsbFxuICB9O1xuICBmaWJlci51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xufVxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBDbG9uZSB0aGUgdXBkYXRlIHF1ZXVlIGZyb20gY3VycmVudC4gVW5sZXNzIGl0J3MgYWxyZWFkeSBhIGNsb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICB2YXIgY2xvbmUgPSB7XG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICBmaXJzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUsXG4gICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICB9O1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBldmVudFRpbWU6IGV2ZW50VGltZSxcbiAgICBsYW5lOiBsYW5lLFxuICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgcGF5bG9hZDogbnVsbCxcbiAgICBjYWxsYmFjazogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcblxuICB7XG4gICAgaWYgKGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9PT0gc2hhcmVkUXVldWUgJiYgIWRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUpIHtcbiAgICAgIGVycm9yKCdBbiB1cGRhdGUgKHNldFN0YXRlLCByZXBsYWNlU3RhdGUsIG9yIGZvcmNlVXBkYXRlKSB3YXMgc2NoZWR1bGVkICcgKyAnZnJvbSBpbnNpZGUgYW4gdXBkYXRlIGZ1bmN0aW9uLiBVcGRhdGUgZnVuY3Rpb25zIHNob3VsZCBiZSBwdXJlLCAnICsgJ3dpdGggemVybyBzaWRlLWVmZmVjdHMuIENvbnNpZGVyIHVzaW5nIGNvbXBvbmVudERpZFVwZGF0ZSBvciBhICcgKyAnY2FsbGJhY2suJyk7XG5cbiAgICAgIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc1Vuc2FmZUNsYXNzUmVuZGVyUGhhc2VVcGRhdGUoKSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdW5zYWZlIHJlbmRlciBwaGFzZSB1cGRhdGUuIEFkZCBkaXJlY3RseSB0byB0aGUgdXBkYXRlXG4gICAgLy8gcXVldWUgc28gd2UgY2FuIHByb2Nlc3MgaXQgaW1tZWRpYXRlbHkgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlci5cbiAgICB2YXIgcGVuZGluZyA9IHNoYXJlZFF1ZXVlLnBlbmRpbmc7XG5cbiAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICAgIH1cblxuICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7IC8vIFVwZGF0ZSB0aGUgY2hpbGRMYW5lcyBldmVuIHRob3VnaCB3ZSdyZSBtb3N0IGxpa2VseSBhbHJlYWR5IHJlbmRlcmluZ1xuICAgIC8vIHRoaXMgZmliZXIuIFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGluIHRoZSBjYXNlIHdoZXJlIHlvdVxuICAgIC8vIHVwZGF0ZSBhIGRpZmZlcmVudCBjb21wb25lbnQgZHVyaW5nIHJlbmRlciBwaGFzZSB0aGFuIHRoZSBvbmUgdGhhdCBpc1xuICAgIC8vIGN1cnJlbnRseSByZW5kZXJpbmdzIChhIHBhdHRlcm4gdGhhdCBpcyBhY2NvbXBhbmllZCBieSBhIHdhcm5pbmcpLlxuXG4gICAgcmV0dXJuIHVuc2FmZV9tYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHNoYXJlZFF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBzaGFyZWRRdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleSBtdXN0XG4gICAgLy8gaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2ggcmVwcmVzZW50c1xuICAgIC8vIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVudGFuZ2xlXG4gICAgLy8gbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZiB3ZSAqZG9uJ3QqXG4gICAgLy8gZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHNoYXJlZFF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNhcHR1cmVkVXBkYXRlKSB7XG4gIC8vIENhcHR1cmVkIHVwZGF0ZXMgYXJlIHVwZGF0ZXMgdGhhdCBhcmUgdGhyb3duIGJ5IGEgY2hpbGQgZHVyaW5nIHRoZSByZW5kZXJcbiAgLy8gcGhhc2UuIFRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUgcmVuZGVyIGlzIGFib3J0ZWQuIFRoZXJlZm9yZSxcbiAgLy8gd2Ugc2hvdWxkIG9ubHkgcHV0IHRoZW0gb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUsIG5vdCB0aGUgY3VycmVudCBvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBDaGVjayBpZiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyBhIGNsb25lLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgICAgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgdGhlIHNhbWUgYXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW5cbiAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIGEgcGFyZW50IGZpYmVyIHRoYXQgdGhlbiBjYXB0dXJlcyBhbiBlcnJvciB0aHJvd24gYnlcbiAgICAgIC8vIGEgY2hpbGQuIFNpbmNlIHdlIHdhbnQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgb25seSB0byB0aGUgd29yay1pblxuICAgICAgLy8gLXByb2dyZXNzIHF1ZXVlLCB3ZSBuZWVkIHRvIGNsb25lIHRoZSB1cGRhdGVzLiBXZSB1c3VhbGx5IGNsb25lIGR1cmluZ1xuICAgICAgLy8gcHJvY2Vzc1VwZGF0ZVF1ZXVlLCBidXQgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdlXG4gICAgICAvLyBza2lwcGVkIG92ZXIgdGhlIHBhcmVudCB3aGVuIHdlIGJhaWxlZCBvdXQuXG4gICAgICB2YXIgbmV3Rmlyc3QgPSBudWxsO1xuICAgICAgdmFyIG5ld0xhc3QgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVwZGF0ZXMgYW5kIGNsb25lIHRoZW0uXG4gICAgICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlLmV2ZW50VGltZSxcbiAgICAgICAgICAgIGxhbmU6IHVwZGF0ZS5sYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICAgICAgbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwpOyAvLyBBcHBlbmQgdGhlIGNhcHR1cmVkIHVwZGF0ZSB0aGUgZW5kIG9mIHRoZSBjbG9uZWQgbGlzdC5cblxuXG4gICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgICAgbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbm8gYmFzZSB1cGRhdGVzLlxuICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgPSB7XG4gICAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBuZXdGaXJzdCxcbiAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuXG5cbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICB9XG5cbiAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV4dFN0YXRlID0gcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgICAgIH0gLy8gU3RhdGUgb2JqZWN0XG5cblxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2FwdHVyZVVwZGF0ZTpcbiAgICAgIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgIH1cbiAgICAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBVcGRhdGVTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG4gICAgICAgIHZhciBwYXJ0aWFsU3RhdGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFVwZGF0ZXIgZnVuY3Rpb25cbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhcnRpYWwgc3RhdGUgb2JqZWN0XG4gICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydGlhbFN0YXRlID09PSBudWxsIHx8IHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTnVsbCBhbmQgdW5kZWZpbmVkIGFyZSB0cmVhdGVkIGFzIG5vLW9wcy5cbiAgICAgICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgICAgICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICAgICAgICByZXR1cm4gYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gcHJldlN0YXRlO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHByb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gcXVldWUuc2hhcmVkO1xuICB9XG5cbiAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMuIElmIHNvLCB0cmFuc2ZlciB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsOyAvLyBUaGUgcGVuZGluZyBxdWV1ZSBpcyBjaXJjdWxhci4gRGlzY29ubmVjdCB0aGUgcG9pbnRlciBiZXR3ZWVuIGZpcnN0XG4gICAgLy8gYW5kIGxhc3Qgc28gdGhhdCBpdCdzIG5vbi1jaXJjdWxhci5cblxuICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDsgLy8gQXBwZW5kIHBlbmRpbmcgdXBkYXRlcyB0byBiYXNlIHF1ZXVlXG5cbiAgICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9XG5cbiAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlOyAvLyBJZiB0aGVyZSdzIGEgY3VycmVudCBxdWV1ZSwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGJhc2UgcXVldWUsIHRoZW5cbiAgICAvLyB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZSB1cGRhdGVzIHRvIHRoYXQgcXVldWUsIHRvby4gQmVjYXVzZSB0aGUgYmFzZVxuICAgIC8vIHF1ZXVlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IHdpdGggbm8gY3ljbGVzLCB3ZSBjYW4gYXBwZW5kIHRvIGJvdGhcbiAgICAvLyBsaXN0cyBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RydWN0dXJhbCBzaGFyaW5nLlxuICAgIC8vIFRPRE86IFBhc3MgYGN1cnJlbnRgIGFzIGFyZ3VtZW50XG5cbiAgICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gICAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHZhciBjdXJyZW50TGFzdEJhc2VVcGRhdGUgPSBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgIT09IGxhc3RCYXNlVXBkYXRlKSB7XG4gICAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGFzIHdlIHByb2Nlc3MgdGhlIHF1ZXVlLlxuXG5cbiAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIGNvbXB1dGUgdGhlIHJlc3VsdC5cbiAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlIHJlbmRlckxhbmVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cbiAgICB2YXIgbmV3TGFuZXMgPSBOb0xhbmVzO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdGaXJzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciBuZXdMYXN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG4gICAgICB2YXIgdXBkYXRlRXZlbnRUaW1lID0gdXBkYXRlLmV2ZW50VGltZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuXG5cbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBuZXdTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgbmV3U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZS5jYWxsYmFjaztcblxuICAgICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgLy8gSWYgdGhlIHVwZGF0ZSB3YXMgYWxyZWFkeSBjb21taXR0ZWQsIHdlIHNob3VsZCBub3QgcXVldWUgaXRzXG4gICAgICAgIC8vIGNhbGxiYWNrIGFnYWluLlxuICAgICAgICB1cGRhdGUubGFuZSAhPT0gTm9MYW5lKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2FsbGJhY2s7XG4gICAgICAgICAgdmFyIGVmZmVjdHMgPSBxdWV1ZS5lZmZlY3RzO1xuXG4gICAgICAgICAgaWYgKGVmZmVjdHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlLmVmZmVjdHMgPSBbdXBkYXRlXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKHVwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuXG4gICAgICBpZiAodXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gICAgICAgIGlmIChwZW5kaW5nUXVldWUgPT09IG51bGwpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBmcm9tIGluc2lkZSBhIHJlZHVjZXIuIEFkZCB0aGUgbmV3XG4gICAgICAgICAgLy8gcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIGtlZXAgcHJvY2Vzc2luZy5cbiAgICAgICAgICB2YXIgX2xhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlOyAvLyBJbnRlbnRpb25hbGx5IHVuc291bmQuIFBlbmRpbmcgdXBkYXRlcyBmb3JtIGEgY2lyY3VsYXIgbGlzdCwgYnV0IHdlXG4gICAgICAgICAgLy8gdW5yYXZlbCB0aGVtIHdoZW4gdHJhbnNmZXJyaW5nIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgICAgICAgICB2YXIgX2ZpcnN0UGVuZGluZ1VwZGF0ZSA9IF9sYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgICAgICAgIF9sYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDtcbiAgICAgICAgICB1cGRhdGUgPSBfZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICAgIHF1ZXVlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBxdWV1ZS5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gbmV3Rmlyc3RCYXNlVXBkYXRlO1xuICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGU7IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgICAvLyBwcm9jZXNzIHRoZW0gZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgd2UgZG8gbmVlZCB0byB0cmFjayB3aGljaCBsYW5lc1xuICAgIC8vIGFyZSByZW1haW5pbmcuXG5cbiAgICB2YXIgbGFzdEludGVybGVhdmVkID0gcXVldWUuc2hhcmVkLmludGVybGVhdmVkO1xuXG4gICAgaWYgKGxhc3RJbnRlcmxlYXZlZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgICBkbyB7XG4gICAgICAgIG5ld0xhbmVzID0gbWVyZ2VMYW5lcyhuZXdMYW5lcywgaW50ZXJsZWF2ZWQubGFuZSk7XG4gICAgICAgIGludGVybGVhdmVkID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAvLyBgcXVldWUubGFuZXNgIGlzIHVzZWQgZm9yIGVudGFuZ2xpbmcgdHJhbnNpdGlvbnMuIFdlIGNhbiBzZXQgaXQgYmFjayB0b1xuICAgICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgIHF1ZXVlLnNoYXJlZC5sYW5lcyA9IE5vTGFuZXM7XG4gICAgfSAvLyBTZXQgdGhlIHJlbWFpbmluZyBleHBpcmF0aW9uIHRpbWUgdG8gYmUgd2hhdGV2ZXIgaXMgcmVtYWluaW5nIGluIHRoZSBxdWV1ZS5cbiAgICAvLyBUaGlzIHNob3VsZCBiZSBmaW5lIGJlY2F1c2UgdGhlIG9ubHkgdHdvIG90aGVyIHRoaW5ncyB0aGF0IGNvbnRyaWJ1dGUgdG9cbiAgICAvLyBleHBpcmF0aW9uIHRpbWUgYXJlIHByb3BzIGFuZCBjb250ZXh0LiBXZSdyZSBhbHJlYWR5IGluIHRoZSBtaWRkbGUgb2YgdGhlXG4gICAgLy8gYmVnaW4gcGhhc2UgYnkgdGhlIHRpbWUgd2Ugc3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWUsIHNvIHdlJ3ZlIGFscmVhZHlcbiAgICAvLyBkZWFsdCB3aXRoIHRoZSBwcm9wcy4gQ29udGV4dCBpbiBjb21wb25lbnRzIHRoYXQgc3BlY2lmeVxuICAgIC8vIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB0cmlja3k7IGJ1dCB3ZSdsbCBoYXZlIHRvIGFjY291bnQgZm9yXG4gICAgLy8gdGhhdCByZWdhcmRsZXNzLlxuXG5cbiAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKG5ld0xhbmVzKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG5ld0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgY29udGV4dCkge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCAnICsgKFwicmVjZWl2ZWQ6IFwiICsgY2FsbGJhY2spKTtcbiAgfVxuXG4gIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHtcbiAgcmV0dXJuIGhhc0ZvcmNlVXBkYXRlO1xufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSkge1xuICAvLyBDb21taXQgdGhlIGVmZmVjdHNcbiAgdmFyIGVmZmVjdHMgPSBmaW5pc2hlZFF1ZXVlLmVmZmVjdHM7XG4gIGZpbmlzaGVkUXVldWUuZWZmZWN0cyA9IG51bGw7XG5cbiAgaWYgKGVmZmVjdHMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZmZlY3QgPSBlZmZlY3RzW2ldO1xuICAgICAgdmFyIGNhbGxiYWNrID0gZWZmZWN0LmNhbGxiYWNrO1xuXG4gICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgZWZmZWN0LmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlSW50ZXJuYWxJbnN0YW5jZSA9IHt9OyAvLyBSZWFjdC5Db21wb25lbnQgdXNlcyBhIHNoYXJlZCBmcm96ZW4gb2JqZWN0IGJ5IGRlZmF1bHQuXG4vLyBXZSdsbCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplIGxlZ2FjeSByZWZzLlxuXG52YXIgZW1wdHlSZWZzT2JqZWN0ID0gbmV3IFJlYWN0LkNvbXBvbmVudCgpLnJlZnM7XG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjaztcbnZhciBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcztcbnZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGU7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IGNhbGxlck5hbWUgKyAnXycgKyBjYWxsYmFjaztcblxuICAgIGlmICghZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpKSB7XG4gICAgICBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suYWRkKGtleSk7XG5cbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUgPSBmdW5jdGlvbiAodHlwZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpOiBBIHZhbGlkIHN0YXRlIG9iamVjdCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gJyArICdZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9OyAvLyBUaGlzIGlzIHNvIGdyb3NzIGJ1dCBpdCdzIGF0IGxlYXN0IG5vbi1jcml0aWNhbCBhbmQgY2FuIGJlIHJlbW92ZWQgaWZcbiAgLy8gaXQgY2F1c2VzIHByb2JsZW1zLiBUaGlzIGlzIG1lYW50IHRvIGdpdmUgYSBuaWNlciBlcnJvciBtZXNzYWdlIGZvclxuICAvLyBSZWFjdERPTTE1LnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHJlYWN0RE9NMTZDb21wb25lbnQsXG4gIC8vIC4uLikpIHdoaWNoIG90aGVyd2lzZSB0aHJvd3MgYSBcIl9wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhIGZ1bmN0aW9uXCJcbiAgLy8gZXhjZXB0aW9uLlxuXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZha2VJbnRlcm5hbEluc3RhbmNlLCAnX3Byb2Nlc3NDaGlsZENvbnRleHQnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBSZWFjdCAxNisuIFRoaXMgbGlrZWx5ICcgKyAnbWVhbnMgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGFuZCBhcmUgYXR0ZW1wdGluZyB0byBuZXN0ICcgKyAnYSBSZWFjdCAxNSB0cmVlIGluc2lkZSBhIFJlYWN0IDE2IHRyZWUgdXNpbmcgJyArIFwidW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIsIHdoaWNoIGlzbid0IHN1cHBvcnRlZC4gVHJ5IFwiICsgJ3RvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBvbmx5IG9uZSBjb3B5IG9mIFJlYWN0IChhbmQgaWRlYWxseSwgc3dpdGNoICcgKyAndG8gUmVhY3RET00uY3JlYXRlUG9ydGFsKS4nKTtcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV4dFByb3BzKSB7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcblxuICB7XG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW4gZXh0cmEgdGltZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG4gICAgICAgIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlKGN0b3IsIHBhcnRpYWxTdGF0ZSk7XG4gIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gIHZhciBtZW1vaXplZFN0YXRlID0gcGFydGlhbFN0YXRlID09PSBudWxsIHx8IHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkID8gcHJldlN0YXRlIDogYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBtZW1vaXplZFN0YXRlOyAvLyBPbmNlIHRoZSB1cGRhdGUgcXVldWUgaXMgZW1wdHksIHBlcnNpc3QgdGhlIGRlcml2ZWQgc3RhdGUgb250byB0aGVcbiAgLy8gYmFzZSBzdGF0ZS5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MubGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBRdWV1ZSBpcyBhbHdheXMgbm9uLW51bGwgZm9yIGNsYXNzZXNcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICB1cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPSBtZW1vaXplZFN0YXRlO1xuICB9XG59XG5cbnZhciBjbGFzc0NvbXBvbmVudFVwZGF0ZXIgPSB7XG4gIGlzTW91bnRlZDogaXNNb3VudGVkLFxuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH0sXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gUmVwbGFjZVN0YXRlO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH0sXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKGluc3QsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgc2hvdWxkVXBkYXRlID0gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gICAge1xuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW4gZXh0cmEgdGltZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbiAgfVxuXG4gIGlmIChjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCkge1xuICAgIHJldHVybiAhc2hhbGxvd0VxdWFsKG9sZFByb3BzLCBuZXdQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcbiAgICB2YXIgcmVuZGVyUHJlc2VudCA9IGluc3RhbmNlLnJlbmRlcjtcblxuICAgIGlmICghcmVuZGVyUHJlc2VudCkge1xuICAgICAgaWYgKGN0b3IucHJvdG90eXBlICYmIHR5cGVvZiBjdG9yLnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IGRpZCB5b3UgYWNjaWRlbnRhbGx5IHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgY29uc3RydWN0b3I/JywgbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogeW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBkZWZpbmUgYHJlbmRlcmAuJywgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmdldEluaXRpYWxTdGF0ZSAmJiAhaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkICYmICFpbnN0YW5jZS5zdGF0ZSkge1xuICAgICAgZXJyb3IoJ2dldEluaXRpYWxTdGF0ZSB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdEaWQgeW91IG1lYW4gdG8gZGVmaW5lIGEgc3RhdGUgcHJvcGVydHkgaW5zdGVhZD8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzICYmICFpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnVXNlIGEgc3RhdGljIHByb3BlcnR5IHRvIGRlZmluZSBkZWZhdWx0UHJvcHMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcFR5cGVzKSB7XG4gICAgICBlcnJvcigncHJvcFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgcHJvcFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlKSB7XG4gICAgICBlcnJvcignY29udGV4dFR5cGUgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZSBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3Rvci5jb250ZXh0VHlwZSAmJiBjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgZGVjbGFyZXMgYm90aCBjb250ZXh0VHlwZXMgYW5kIGNvbnRleHRUeXBlIHN0YXRpYyBwcm9wZXJ0aWVzLiAnICsgJ1RoZSBsZWdhY3kgY29udGV4dFR5cGVzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCAmJiB0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkuICcgKyAnc2hvdWxkQ29tcG9uZW50VXBkYXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGV4dGVuZGluZyBSZWFjdC5QdXJlQ29tcG9uZW50LiAnICsgJ1BsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBpcyBkZWZpbmVkIGFzIGEgc3RhdGljIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBfc3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICAgIGlmIChfc3RhdGUgJiYgKHR5cGVvZiBfc3RhdGUgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkoX3N0YXRlKSkpIHtcbiAgICAgIGVycm9yKCclcy5zdGF0ZTogbXVzdCBiZSBzZXQgdG8gYW4gb2JqZWN0IG9yIG51bGwnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY3Rvci5jaGlsZENvbnRleHRUeXBlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGVycm9yKCclcy5nZXRDaGlsZENvbnRleHQoKTogY2hpbGRDb250ZXh0VHlwZXMgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvICcgKyAndXNlIGdldENoaWxkQ29udGV4dCgpLicsIG5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnVwZGF0ZXIgPSBjbGFzc0NvbXBvbmVudFVwZGF0ZXI7XG4gIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBUaGUgaW5zdGFuY2UgbmVlZHMgYWNjZXNzIHRvIHRoZSBmaWJlciBzbyB0aGF0IGl0IGNhbiBzY2hlZHVsZSB1cGRhdGVzXG5cbiAgc2V0KGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAge1xuICAgIGluc3RhbmNlLl9yZWFjdEludGVybmFsSW5zdGFuY2UgPSBmYWtlSW50ZXJuYWxJbnN0YW5jZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBwcm9wcykge1xuICB2YXIgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBmYWxzZTtcbiAgdmFyIHVubWFza2VkQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAge1xuICAgIGlmICgnY29udGV4dFR5cGUnIGluIGN0b3IpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gLy8gQWxsb3cgbnVsbCBmb3IgY29uZGl0aW9uYWwgZGVjbGFyYXRpb25cbiAgICAgIGNvbnRleHRUeXBlID09PSBudWxsIHx8IGNvbnRleHRUeXBlICE9PSB1bmRlZmluZWQgJiYgY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSAmJiBjb250ZXh0VHlwZS5fY29udGV4dCA9PT0gdW5kZWZpbmVkOyAvLyBOb3QgYSA8Q29udGV4dC5Db25zdW1lcj5cblxuICAgICAgaWYgKCFpc1ZhbGlkICYmICFkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5hZGQoY3Rvcik7XG4gICAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byB1bmRlZmluZWQuICcgKyAnVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgdHlwbyBvciBieSBtaXhpbmcgdXAgbmFtZWQgYW5kIGRlZmF1bHQgaW1wb3J0cy4gJyArICdUaGlzIGNhbiBhbHNvIGhhcHBlbiBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBzbyAnICsgJ3RyeSBtb3ZpbmcgdGhlIGNyZWF0ZUNvbnRleHQoKSBjYWxsIHRvIGEgc2VwYXJhdGUgZmlsZS4nO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGEgJyArIHR5cGVvZiBjb250ZXh0VHlwZSArICcuJztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LlByb3ZpZGVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gPENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuQ29uc3VtZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYW4gb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNvbnRleHRUeXBlKS5qb2luKCcsICcpICsgJ30uJztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCclcyBkZWZpbmVzIGFuIGludmFsaWQgY29udGV4dFR5cGUuICcgKyAnY29udGV4dFR5cGUgc2hvdWxkIHBvaW50IHRvIHRoZSBDb250ZXh0IG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVDb250ZXh0KCkuJXMnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcsIGFkZGVuZHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gY3Rvci5jb250ZXh0VHlwZXM7XG4gICAgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBjb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gICAgY29udGV4dCA9IGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID8gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSA6IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gSW5zdGFudGlhdGUgdHdpY2UgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlICE9PSBudWxsICYmIGluc3RhbmNlLnN0YXRlICE9PSB1bmRlZmluZWQgPyBpbnN0YW5jZS5zdGF0ZSA6IG51bGw7XG4gIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nICYmIHN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJ2Alc2AgdXNlcyBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBidXQgaXRzIGluaXRpYWwgc3RhdGUgaXMgJyArICclcy4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuIEluc3RlYWQsIGRlZmluZSB0aGUgaW5pdGlhbCBzdGF0ZSBieSAnICsgJ2Fzc2lnbmluZyBhbiBvYmplY3QgdG8gYHRoaXMuc3RhdGVgIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBgJXNgLiAnICsgJ1RoaXMgZW5zdXJlcyB0aGF0IGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGFyZ3VtZW50cyBoYXZlIGEgY29uc2lzdGVudCBzaGFwZS4nLCBjb21wb25lbnROYW1lLCBpbnN0YW5jZS5zdGF0ZSA9PT0gbnVsbCA/ICdudWxsJyA6ICd1bmRlZmluZWQnLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9IC8vIElmIG5ldyBjb21wb25lbnQgQVBJcyBhcmUgZGVmaW5lZCwgXCJ1bnNhZmVcIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC5cbiAgICAvLyBXYXJuIGFib3V0IHRoZXNlIGxpZmVjeWNsZXMgaWYgdGhleSBhcmUgcHJlc2VudC5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgbWV0aG9kcyB0aG91Z2guXG5cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxVcGRhdGVOYW1lID0gbnVsbDtcblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdjb21wb25lbnRXaWxsVXBkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gb2xkU3RhdGUpIHtcbiAgICB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gJyArIFwidGhpcy5zdGF0ZSBpcyBkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59IC8vIEludm9rZXMgdGhlIG1vdW50IGxpZmUtY3ljbGVzIG9uIGEgcHJldmlvdXNseSBuZXZlciByZW5kZXJlZCBpbnN0YW5jZS5cblxuXG5mdW5jdGlvbiBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgaW5zdGFuY2UucmVmcyA9IGVtcHR5UmVmc09iamVjdDtcbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB7XG4gICAgaWYgKGluc3RhbmNlLnN0YXRlID09PSBuZXdQcm9wcykge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXM6IEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gcHJvcHMgZGlyZWN0bHkgdG8gc3RhdGUgJyArIFwiYmVjYXVzZSB1cGRhdGVzIHRvIHByb3BzIHdvbid0IGJlIHJlZmxlY3RlZCBpbiBzdGF0ZS4gXCIgKyAnSW4gbW9zdCBjYXNlcywgaXQgaXMgYmV0dGVyIHRvIHVzZSBwcm9wcyBkaXJlY3RseS4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3Mod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH0gLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cblxuICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbE1vdW50KHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7IC8vIElmIHdlIGhhZCBhZGRpdGlvbmFsIHN0YXRlIHVwZGF0ZXMgZHVyaW5nIHRoaXMgbGlmZS1jeWNsZSwgbGV0J3NcbiAgICAvLyBwcm9jZXNzIHRoZW0gbm93LlxuXG4gICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICB7XG4gICAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICB9XG5cbiAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVNb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBvbGRDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCk7XG4gIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBuZXdTdGF0ZSA9IGluc3RhbmNlLnN0YXRlID0gb2xkU3RhdGU7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2ZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFnczIgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF9maWJlckZsYWdzMiB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3MyO1xuICAgIH0gLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBuZXdQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gVXBkYXRlIHRoZSBleGlzdGluZyBpbnN0YW5jZSdzIHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgcG9pbnRlcnMgZXZlblxuICAvLyBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZS5cblxuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn0gLy8gSW52b2tlcyB0aGUgdXBkYXRlIGxpZmUtY3ljbGVzIGFuZCByZXR1cm5zIGZhbHNlIGlmIGl0IHNob3VsZG4ndCByZXJlbmRlci5cblxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHVucmVzb2x2ZWRPbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID8gdW5yZXNvbHZlZE9sZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB1bnJlc29sdmVkT2xkUHJvcHMpO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgdW5yZXNvbHZlZE5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IHVucmVzb2x2ZWROZXdQcm9wcyB8fCBvbGRDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCk7XG4gIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBuZXdTdGF0ZSA9IGluc3RhbmNlLnN0YXRlID0gb2xkU3RhdGU7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAodW5yZXNvbHZlZE9sZFByb3BzID09PSB1bnJlc29sdmVkTmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgJiYgIShlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpIHx8IC8vIFRPRE86IEluIHNvbWUgY2FzZXMsIHdlJ2xsIGVuZCB1cCBjaGVja2luZyBpZiBjb250ZXh0IGhhcyBjaGFuZ2VkIHR3aWNlLFxuICAvLyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAgaGFzIGJlZW4gY2FsbGVkLiBOb3QgaWRlYWwsXG4gIC8vIGJ1dCBJJ20gbG9hdGggdG8gcmVmYWN0b3IgdGhpcyBmdW5jdGlvbi4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIG1lbW9pemVkXG4gIC8vIGNvbXBvbmVudHMgc28gaXQncyBub3QgdGhhdCBjb21tb24uXG4gIGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICA7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgcHJvcHMvc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcztcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nO1xudmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZztcblxudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307XG5cbntcbiAgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcblxuICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkLl9zdG9yZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlICcgKyAnXCJrZXlcIiBwcm9wLiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgJyArICdtb3JlIGluZm9ybWF0aW9uLicpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpIHtcbiAgdmFyIG1peGVkUmVmID0gZWxlbWVudC5yZWY7XG5cbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgLy8gVE9ETzogQ2xlYW4gdGhpcyB1cCBvbmNlIHdlIHR1cm4gb24gdGhlIHN0cmluZyByZWYgd2FybmluZyBmb3JcbiAgICAgIC8vIGV2ZXJ5b25lLCBiZWNhdXNlIHRoZSBzdHJpY3QgbW9kZSBjYXNlIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGV2YW50XG4gICAgICBpZiAoKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlIHx8IHdhcm5BYm91dFN0cmluZ1JlZnMpICYmIC8vIFdlIHdhcm4gaW4gUmVhY3RFbGVtZW50LmpzIGlmIG93bmVyIGFuZCBzZWxmIGFyZSBlcXVhbCBmb3Igc3RyaW5nIHJlZnNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uXG4gICAgICAvLyB1c2luZyBhIGNvZGVtb2QuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byB3YXJuIGFib3V0IHN0cmluZyByZWZzIGFnYWluLlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9zZWxmICYmIGVsZW1lbnQuX293bmVyLnN0YXRlTm9kZSAhPT0gZWxlbWVudC5fc2VsZikpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlcnJvcignQSBzdHJpbmcgcmVmLCBcIiVzXCIsIGhhcyBiZWVuIGZvdW5kIHdpdGhpbiBhIHN0cmljdCBtb2RlIHRyZWUuICcgKyAnU3RyaW5nIHJlZnMgYXJlIGEgc291cmNlIG9mIHBvdGVudGlhbCBidWdzIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4gJyArICdXZSByZWNvbW1lbmQgdXNpbmcgdXNlUmVmKCkgb3IgY3JlYXRlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnLCBtaXhlZFJlZik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5fb3duZXIpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIGluc3Q7XG5cbiAgICAgIGlmIChvd25lcikge1xuICAgICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuXG4gICAgICAgIGlmIChvd25lckZpYmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnMuICcgKyAnV2UgcmVjb21tZW5kIHVzaW5nIHVzZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0ID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5zdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG93bmVyIGZvciBzdHJpbmcgcmVmIFwiICsgbWl4ZWRSZWYgKyBcIi4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgXCIgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgIH0gLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdCBzbyBGbG93IGtub3dzIGl0IHdvbid0IGNoYW5nZSBpbiB0aGUgY2xvc3VyZVxuXG5cbiAgICAgIHZhciByZXNvbHZlZEluc3QgPSBpbnN0O1xuXG4gICAgICB7XG4gICAgICAgIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKG1peGVkUmVmLCAncmVmJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHJpbmdSZWYgPSAnJyArIG1peGVkUmVmOyAvLyBDaGVjayBpZiBwcmV2aW91cyBzdHJpbmcgcmVmIG1hdGNoZXMgbmV3IHN0cmluZyByZWZcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5yZWYgIT09IG51bGwgJiYgdHlwZW9mIGN1cnJlbnQucmVmID09PSAnZnVuY3Rpb24nICYmIGN1cnJlbnQucmVmLl9zdHJpbmdSZWYgPT09IHN0cmluZ1JlZikge1xuICAgICAgICByZXR1cm4gY3VycmVudC5yZWY7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWYgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlZnMgPSByZXNvbHZlZEluc3QucmVmcztcblxuICAgICAgICBpZiAocmVmcyA9PT0gZW1wdHlSZWZzT2JqZWN0KSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGxhenkgcG9vbGVkIGZyb3plbiBvYmplY3QsIHNvIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZS5cbiAgICAgICAgICByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBtaXhlZFJlZiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWYgdG8gYmUgYSBmdW5jdGlvbiwgYSBzdHJpbmcsIGFuIG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVSZWYoKSwgb3IgbnVsbC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHJlZiB3YXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChcIiArIG1peGVkUmVmICsgXCIpIGJ1dCBubyBvd25lciB3YXMgc2V0LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mXCIgKyAnIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgZnVuY3Rpb24gY29tcG9uZW50XFxuJyArIFwiMi4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50J3MgcmVuZGVyIG1ldGhvZFxcblwiICsgJzMuIFlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWRcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1peGVkUmVmO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7XG4gIHZhciBjaGlsZFN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCk7XG4gIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRTdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhuZXdDaGlsZCkuam9pbignLCAnKSArICd9JyA6IGNoaWxkU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcikge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMYXp5KGxhenlUeXBlKSB7XG4gIHZhciBwYXlsb2FkID0gbGF6eVR5cGUuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eVR5cGUuX2luaXQ7XG4gIHJldHVybiBpbml0KHBheWxvYWQpO1xufSAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZXhpc3RzIGJlY2F1c2UgSSBleHBlY3QgdG8gY2xvbmUgdGhlIGNvZGUgaW4gZWFjaCBwYXRoXG4vLyB0byBiZSBhYmxlIHRvIG9wdGltaXplIGVhY2ggcGF0aCBpbmRpdmlkdWFsbHkgYnkgYnJhbmNoaW5nIGVhcmx5LiBUaGlzIG5lZWRzXG4vLyBhIGNvbXBpbGVyIG9yIHdlIGNhbiBkbyBpdCBtYW51YWxseS4gSGVscGVycyB0aGF0IGRvbid0IG5lZWQgdGhpcyBicmFuY2hpbmdcbi8vIGxpdmUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLlxuXG5cbmZ1bmN0aW9uIENoaWxkUmVjb25jaWxlcihzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gIGZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIFRPRE86IEZvciB0aGUgc2hvdWxkQ2xvbmUgY2FzZSwgdGhpcyBjb3VsZCBiZSBtaWNyby1vcHRpbWl6ZWQgYSBiaXQgYnlcbiAgICAvLyBhc3N1bWluZyB0aGF0IGFmdGVyIHRoZSBmaXJzdCBjaGlsZCB3ZSd2ZSBhbHJlYWR5IGFkZGVkIGV2ZXJ5dGhpbmcuXG5cblxuICAgIHZhciBjaGlsZFRvRGVsZXRlID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGRUb0RlbGV0ZSAhPT0gbnVsbCkge1xuICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgY2hpbGRUb0RlbGV0ZSA9IGNoaWxkVG9EZWxldGUuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHRvIGEgdGVtcG9yYXJ5IG1hcCBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZW0gYnlcbiAgICAvLyBrZXlzIHF1aWNrbHkuIEltcGxpY2l0IChudWxsKSBrZXlzIGdldCBhZGRlZCB0byB0aGlzIHNldCB3aXRoIHRoZWlyIGluZGV4XG4gICAgLy8gaW5zdGVhZC5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBNYXAoKTtcbiAgICB2YXIgZXhpc3RpbmdDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGV4aXN0aW5nQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGlmIChleGlzdGluZ0NoaWxkLmtleSAhPT0gbnVsbCkge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmtleSwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmluZGV4LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdDaGlsZCA9IGV4aXN0aW5nQ2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gZXhpc3RpbmdDaGlsZHJlbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUZpYmVyKGZpYmVyLCBwZW5kaW5nUHJvcHMpIHtcbiAgICAvLyBXZSBjdXJyZW50bHkgc2V0IHNpYmxpbmcgdG8gbnVsbCBhbmQgaW5kZXggdG8gMCBoZXJlIGJlY2F1c2UgaXQgaXMgZWFzeVxuICAgIC8vIHRvIGZvcmdldCB0byBkbyBiZWZvcmUgcmV0dXJuaW5nIGl0LiBFLmcuIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuXG4gICAgdmFyIGNsb25lID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7XG4gICAgY2xvbmUuaW5kZXggPSAwO1xuICAgIGNsb25lLnNpYmxpbmcgPSBudWxsO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SW5kZXgpIHtcbiAgICBuZXdGaWJlci5pbmRleCA9IG5ld0luZGV4O1xuXG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgdXNlSWQgYWxnb3JpdGhtIG5lZWRzIHRvIGtub3cgd2hpY2ggZmliZXJzIGFyZVxuICAgICAgLy8gcGFydCBvZiBhIGxpc3Qgb2YgY2hpbGRyZW4gKGFycmF5cywgaXRlcmF0b3JzKS5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IEZvcmtlZDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGl0ZW0gY2FuIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgIHJldHVybiBvbGRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24uXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlU2luZ2xlQ2hpbGQobmV3RmliZXIpIHtcbiAgICAvLyBUaGlzIGlzIHNpbXBsZXIgZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS4gV2Ugb25seSBuZWVkIHRvIGRvIGFcbiAgICAvLyBwbGFjZW1lbnQgZm9yIGluc2VydGluZyBuZXcgY2hpbGRyZW4uXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LnByb3BzLmNoaWxkcmVuLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY3VycmVudCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY3VycmVudC50eXBlKSB7XG4gICAgICAgIC8vIE1vdmUgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZWxlbWVudC5wcm9wcyk7XG4gICAgICAgIGV4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cbiAgICB9IC8vIEluc2VydFxuXG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50LCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RQb3J0YWwgfHwgY3VycmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyAhPT0gcG9ydGFsLmNvbnRhaW5lckluZm8gfHwgY3VycmVudC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGZyYWdtZW50LCBsYW5lcywga2V5KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEZyYWdtZW50KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBrZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGZyYWdtZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KCcnICsgbmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgbnVsbCwgbmV3Q2hpbGQpO1xuICAgICAgICAgICAgX2NyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkMiA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZDIucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQyO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgb2xkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMsIHNvIHdlIG5laXRoZXIgaGF2ZSB0byBjaGVjayB0aGUgb2xkIG5vclxuICAgICAgLy8gbmV3IG5vZGUgZm9yIHRoZSBrZXkuIElmIGJvdGggYXJlIHRleHQgbm9kZXMsIHRoZXkgbWF0Y2guXG4gICAgICB2YXIgbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBtYXRjaGVkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgIHJldHVybiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMyA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIzLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFdhcm5zIGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlIG9yIG1pc3Npbmcga2V5XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcikge1xuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnIHx8IGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBrbm93bktleXM7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoY2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgd2FybkZvck1pc3NpbmdLZXkoY2hpbGQsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoa25vd25LZXlzID09PSBudWxsKSB7XG4gICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWtub3duS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IoJ0VuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgYCVzYC4gJyArICdLZXlzIHNob3VsZCBiZSB1bmlxdWUgc28gdGhhdCBjb21wb25lbnRzIG1haW50YWluIHRoZWlyIGlkZW50aXR5ICcgKyAnYWNyb3NzIHVwZGF0ZXMuIE5vbi11bmlxdWUga2V5cyBtYXkgY2F1c2UgY2hpbGRyZW4gdG8gYmUgJyArICdkdXBsaWNhdGVkIGFuZC9vciBvbWl0dGVkIFx1MjAxNCB0aGUgYmVoYXZpb3IgaXMgdW5zdXBwb3J0ZWQgYW5kICcgKyAnY291bGQgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24uJywga2V5KTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gY2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBjaGlsZC5faW5pdDtcbiAgICAgICAgICB3YXJuT25JbnZhbGlkS2V5KGluaXQocGF5bG9hZCksIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrbm93bktleXM7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW4sIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBhbGdvcml0aG0gY2FuJ3Qgb3B0aW1pemUgYnkgc2VhcmNoaW5nIGZyb20gYm90aCBlbmRzIHNpbmNlIHdlXG4gICAgLy8gZG9uJ3QgaGF2ZSBiYWNrcG9pbnRlcnMgb24gZmliZXJzLiBJJ20gdHJ5aW5nIHRvIHNlZSBob3cgZmFyIHdlIGNhbiBnZXRcbiAgICAvLyB3aXRoIHRoYXQgbW9kZWwuIElmIGl0IGVuZHMgdXAgbm90IGJlaW5nIHdvcnRoIHRoZSB0cmFkZW9mZnMsIHdlIGNhblxuICAgIC8vIGFkZCBpdCBsYXRlci5cbiAgICAvLyBFdmVuIHdpdGggYSB0d28gZW5kZWQgb3B0aW1pemF0aW9uLCB3ZSdkIHdhbnQgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlXG4gICAgLy8gd2hlcmUgdGhlcmUgYXJlIGZldyBjaGFuZ2VzIGFuZCBicnV0ZSBmb3JjZSB0aGUgY29tcGFyaXNvbiBpbnN0ZWFkIG9mXG4gICAgLy8gZ29pbmcgZm9yIHRoZSBNYXAuIEl0J2QgbGlrZSB0byBleHBsb3JlIGhpdHRpbmcgdGhhdCBwYXRoIGZpcnN0IGluXG4gICAgLy8gZm9yd2FyZC1vbmx5IG1vZGUgYW5kIG9ubHkgZ28gZm9yIHRoZSBNYXAgb25jZSB3ZSBub3RpY2UgdGhhdCB3ZSBuZWVkXG4gICAgLy8gbG90cyBvZiBsb29rIGFoZWFkLiBUaGlzIGRvZXNuJ3QgaGFuZGxlIHJldmVyc2FsIGFzIHdlbGwgYXMgdHdvIGVuZGVkXG4gICAgLy8gc2VhcmNoIGJ1dCB0aGF0J3MgdW51c3VhbC4gQmVzaWRlcywgZm9yIHRoZSB0d28gZW5kZWQgb3B0aW1pemF0aW9uIHRvXG4gICAgLy8gd29yayBvbiBJdGVyYWJsZXMsIHdlJ2QgbmVlZCB0byBjb3B5IHRoZSB3aG9sZSBzZXQuXG4gICAgLy8gSW4gdGhpcyBmaXJzdCBpdGVyYXRpb24sIHdlJ2xsIGp1c3QgbGl2ZSB3aXRoIGhpdHRpbmcgdGhlIGJhZCBjYXNlXG4gICAgLy8gKGFkZGluZyBldmVyeXRoaW5nIHRvIGEgTWFwKSBpbiBmb3IgZXZlcnkgaW5zZXJ0L21vdmUuXG4gICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIGFsc28gdXBkYXRlIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoKSB3aGljaFxuICAgIC8vIHVzZXMgdGhlIHNhbWUgYWxnb3JpdGhtLlxuICAgIHtcbiAgICAgIC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyMiA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXIyLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjIua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyMi5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMiwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczIgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW5JdGVyYWJsZSwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoKSxcbiAgICAvLyBidXQgdXNpbmcgdGhlIGl0ZXJhdG9yIGluc3RlYWQuXG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCBpcyBub3QgYW4gaXRlcmFibGUuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJlbmRlcmluZyBHZW5lcmF0b3JzIGJlY2F1c2UgaXQncyBhIG11dGF0aW9uLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI5OTVcbiAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgdG9TdHJpbmdUYWdcbiAgICAgIG5ld0NoaWxkcmVuSXRlcmFibGVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0dlbmVyYXRvcicpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZW5lcmF0b3JzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIEdlbmVyYXRvcnMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gJyArICdZb3UgbWF5IGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBgQXJyYXkuZnJvbSgpYCBvciB0aGUgJyArICdgWy4uLnNwcmVhZF1gIG9wZXJhdG9yIGJlZm9yZSByZW5kZXJpbmcuIEtlZXAgaW4gbWluZCAnICsgJ3lvdSBtaWdodCBuZWVkIHRvIHBvbHlmaWxsIHRoZXNlIGZlYXR1cmVzIGZvciBvbGRlciBicm93c2Vycy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSB0cnVlO1xuICAgICAgfSAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cblxuXG4gICAgICBpZiAobmV3Q2hpbGRyZW5JdGVyYWJsZS5lbnRyaWVzID09PSBpdGVyYXRvckZuKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgfSAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIC8vIFdlJ2xsIGdldCBhIGRpZmZlcmVudCBpdGVyYXRvciBsYXRlciBmb3IgdGhlIG1haW4gcGFzcy5cblxuXG4gICAgICB2YXIgX25ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgICBpZiAoX25ld0NoaWxkcmVuKSB7XG4gICAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICAgIHZhciBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICAgICAgZm9yICg7ICFfc3RlcC5kb25lOyBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmIChuZXdDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGl0ZXJhYmxlIG9iamVjdCBwcm92aWRlZCBubyBpdGVyYXRvci4nKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgIHZhciBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICB2YXIgX25ld0ZpYmVyMyA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlcjMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMywgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMztcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgdmFyIF9uZXdGaWJlcjQgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyNC5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXI0LmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjQsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3M0ID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGtleXMgb24gdGV4dCBub2RlcyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFcbiAgICAvLyB3YXkgdG8gZGVmaW5lIHRoZW0uXG4gICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkICE9PSBudWxsICYmIGN1cnJlbnRGaXJzdENoaWxkLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBub2RlIHNvIGxldCdzIGp1c3QgdXBkYXRlIGl0IGFuZCBkZWxldGVcbiAgICAgIC8vIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH0gLy8gVGhlIGV4aXN0aW5nIGZpcnN0IGNoaWxkIGlzIG5vdCBhIHRleHQgbm9kZSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmVcbiAgICAvLyBhbmQgZGVsZXRlIHRoZSBleGlzdGluZyBvbmVzLlxuXG5cbiAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2hpbGQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjaGlsZCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcblxuICAgICAgICAgICAgdmFyIF9leGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgX2V4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgX2V4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2V4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBEaWRuJ3QgbWF0Y2guXG5cblxuICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY3JlYXRlZDQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgX2NyZWF0ZWQ0LnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQpO1xuICAgICAgX2NyZWF0ZWQ0LnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIF9jcmVhdGVkNDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IHBvcnRhbC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBIb3N0UG9ydGFsICYmIGNoaWxkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSBwb3J0YWwuY29udGFpbmVySW5mbyAmJiBjaGlsZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH0gLy8gVGhpcyBBUEkgd2lsbCB0YWcgdGhlIGNoaWxkcmVuIHdpdGggdGhlIHNpZGUtZWZmZWN0IG9mIHRoZSByZWNvbmNpbGlhdGlvblxuICAvLyBpdHNlbGYuIFRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2lkZS1lZmZlY3QgbGlzdCBhcyB3ZSBwYXNzIHRocm91Z2ggdGhlXG4gIC8vIGNoaWxkcmVuIGFuZCB0aGUgcGFyZW50LlxuXG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWN1cnNpdmUuXG4gICAgLy8gSWYgdGhlIHRvcCBsZXZlbCBpdGVtIGlzIGFuIGFycmF5LCB3ZSB0cmVhdCBpdCBhcyBhIHNldCBvZiBjaGlsZHJlbixcbiAgICAvLyBub3QgYXMgYSBmcmFnbWVudC4gTmVzdGVkIGFycmF5cyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICAvLyBmcmFnbWVudCBub2Rlcy4gUmVjdXJzaW9uIGhhcHBlbnMgYXQgdGhlIG5vcm1hbCBmbG93LlxuICAgIC8vIEhhbmRsZSB0b3AgbGV2ZWwgdW5rZXllZCBmcmFnbWVudHMgYXMgaWYgdGhleSB3ZXJlIGFycmF5cy5cbiAgICAvLyBUaGlzIGxlYWRzIHRvIGFuIGFtYmlndWl0eSBiZXR3ZWVuIDw+e1suLi5dfTwvPiBhbmQgPD4uLi48Lz4uXG4gICAgLy8gV2UgdHJlYXQgdGhlIGFtYmlndW91cyBjYXNlcyBhYm92ZSB0aGUgc2FtZS5cbiAgICB2YXIgaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwgJiYgbmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSAmJiBuZXdDaGlsZC5rZXkgPT09IG51bGw7XG5cbiAgICBpZiAoaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbjtcbiAgICB9IC8vIEhhbmRsZSBvYmplY3QgdHlwZXNcblxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0OyAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIG5vbi1yZWN1cnNpdmUuXG5cbiAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH0gLy8gUmVtYWluaW5nIGNhc2VzIGFyZSBhbGwgdHJlYXRlZCBhcyBlbXB0eS5cblxuXG4gICAgcmV0dXJuIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gIH1cblxuICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnM7XG59XG5cbnZhciByZWNvbmNpbGVDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcih0cnVlKTtcbnZhciBtb3VudENoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKGZhbHNlKTtcbmZ1bmN0aW9uIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnQuY2hpbGQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3VtaW5nIHdvcmsgbm90IHlldCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgd2hpbGUgKGN1cnJlbnRDaGlsZC5zaWJsaW5nICE9PSBudWxsKSB7XG4gICAgY3VycmVudENoaWxkID0gY3VycmVudENoaWxkLnNpYmxpbmc7XG4gICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5zaWJsaW5nID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIG5ld0NoaWxkLnNpYmxpbmcgPSBudWxsO1xufSAvLyBSZXNldCBhIHdvcmtJblByb2dyZXNzIGNoaWxkIHNldCB0byBwcmVwYXJlIGl0IGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB2YXIgY2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICByZXNldFdvcmtJblByb2dyZXNzKGNoaWxkLCBsYW5lcyk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbnZhciBOT19DT05URVhUID0ge307XG52YXIgY29udGV4dFN0YWNrQ3Vyc29yJDEgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG52YXIgY29udGV4dEZpYmVyU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG52YXIgcm9vdEluc3RhbmNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG5cbmZ1bmN0aW9uIHJlcXVpcmVkQ29udGV4dChjKSB7XG4gIGlmIChjID09PSBOT19DT05URVhUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBob3N0IGNvbnRleHQgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBnZXRSb290SG9zdENvbnRhaW5lcigpIHtcbiAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgcmV0dXJuIHJvb3RJbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250YWluZXIoZmliZXIsIG5leHRSb290SW5zdGFuY2UpIHtcbiAgLy8gUHVzaCBjdXJyZW50IHJvb3QgaW5zdGFuY2Ugb250byB0aGUgc3RhY2s7XG4gIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHJlc2V0IHJvb3Qgd2hlbiBwb3J0YWxzIGFyZSBwb3BwZWQuXG4gIHB1c2gocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIG5leHRSb290SW5zdGFuY2UsIGZpYmVyKTsgLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTsgLy8gRmluYWxseSwgd2UgbmVlZCB0byBwdXNoIHRoZSBob3N0IGNvbnRleHQgdG8gdGhlIHN0YWNrLlxuICAvLyBIb3dldmVyLCB3ZSBjYW4ndCBqdXN0IGNhbGwgZ2V0Um9vdEhvc3RDb250ZXh0KCkgYW5kIHB1c2ggaXQgYmVjYXVzZVxuICAvLyB3ZSdkIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGVudHJpZXMgb24gdGhlIHN0YWNrIGRlcGVuZGluZyBvblxuICAvLyB3aGV0aGVyIGdldFJvb3RIb3N0Q29udGV4dCgpIHRocm93cyBzb21ld2hlcmUgaW4gcmVuZGVyZXIgY29kZSBvciBub3QuXG4gIC8vIFNvIHdlIHB1c2ggYW4gZW1wdHkgdmFsdWUgZmlyc3QuIFRoaXMgbGV0cyB1cyBzYWZlbHkgdW53aW5kIG9uIGVycm9ycy5cblxuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBOT19DT05URVhULCBmaWJlcik7XG4gIHZhciBuZXh0Um9vdENvbnRleHQgPSBnZXRSb290SG9zdENvbnRleHQobmV4dFJvb3RJbnN0YW5jZSk7IC8vIE5vdyB0aGF0IHdlIGtub3cgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IHRocm93LCByZXBsYWNlIGl0LlxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Um9vdENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRhaW5lcihmaWJlcikge1xuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIHBvcChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0Q29udGV4dCgpIHtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRleHQoZmliZXIpIHtcbiAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHZhciBuZXh0Q29udGV4dCA9IGdldENoaWxkSG9zdENvbnRleHQoY29udGV4dCwgZmliZXIudHlwZSk7IC8vIERvbid0IHB1c2ggdGhpcyBGaWJlcidzIGNvbnRleHQgdW5sZXNzIGl0J3MgdW5pcXVlLlxuXG4gIGlmIChjb250ZXh0ID09PSBuZXh0Q29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIC8vIERvIG5vdCBwb3AgdW5sZXNzIHRoaXMgRmliZXIgcHJvdmlkZWQgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgLy8gcHVzaEhvc3RDb250ZXh0KCkgb25seSBwdXNoZXMgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG4gIGlmIChjb250ZXh0RmliZXJTdGFja0N1cnNvci5jdXJyZW50ICE9PSBmaWJlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxudmFyIERlZmF1bHRTdXNwZW5zZUNvbnRleHQgPSAwOyAvLyBUaGUgU3VzcGVuc2UgQ29udGV4dCBpcyBzcGxpdCBpbnRvIHR3byBwYXJ0cy4gVGhlIGxvd2VyIGJpdHMgaXNcbi8vIGluaGVyaXRlZCBkZWVwbHkgZG93biB0aGUgc3VidHJlZS4gVGhlIHVwcGVyIGJpdHMgb25seSBhZmZlY3Rcbi8vIHRoaXMgaW1tZWRpYXRlIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBnZXRzIHJlc2V0IGVhY2ggbmV3XG4vLyBib3VuZGFyeSBvciBzdXNwZW5zZSBsaXN0LlxuXG52YXIgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgPSAxOyAvLyBTdWJ0cmVlIEZsYWdzOlxuLy8gSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0IGluZGljYXRlcyB0aGF0IG9uZSBvZiBvdXIgcGFyZW50IFN1c3BlbnNlXG4vLyBib3VuZGFyaWVzIGlzIG5vdCBjdXJyZW50bHkgc2hvd2luZyB2aXNpYmxlIG1haW4gY29udGVudC5cbi8vIEVpdGhlciBiZWNhdXNlIGl0IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIG9yIGlzIG5vdCBtb3VudGVkIGF0IGFsbC5cbi8vIFdlIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgZGVzaXJhYmxlIHRvIHRyaWdnZXIgYSBmYWxsYmFjayBhdFxuLy8gdGhlIHBhcmVudC4gSWYgbm90LCB0aGVuIHdlIG1pZ2h0IG5lZWQgdG8gdHJpZ2dlciB1bmRlc2lyYWJsZSBib3VuZGFyaWVzXG4vLyBhbmQvb3Igc3VzcGVuZCB0aGUgY29tbWl0IHRvIGF2b2lkIGhpZGluZyB0aGUgcGFyZW50IGNvbnRlbnQuXG5cbnZhciBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgPSAxOyAvLyBTaGFsbG93IEZsYWdzOlxuLy8gRm9yY2VTdXNwZW5zZUZhbGxiYWNrIGNhbiBiZSB1c2VkIGJ5IFN1c3BlbnNlTGlzdCB0byBmb3JjZSBuZXdseSBhZGRlZFxuLy8gaXRlbXMgaW50byB0aGVpciBmYWxsYmFjayBzdGF0ZSBkdXJpbmcgb25lIG9mIHRoZSByZW5kZXIgcGFzc2VzLlxuXG52YXIgRm9yY2VTdXNwZW5zZUZhbGxiYWNrID0gMjtcbnZhciBzdXNwZW5zZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKERlZmF1bHRTdXNwZW5zZUNvbnRleHQpO1xuZnVuY3Rpb24gaGFzU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIGZsYWcpIHtcbiAgcmV0dXJuIChwYXJlbnRDb250ZXh0ICYgZmxhZykgIT09IDA7XG59XG5mdW5jdGlvbiBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0ICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2s7XG59XG5mdW5jdGlvbiBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHNoYWxsb3dDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0ICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgfCBzaGFsbG93Q29udGV4dDtcbn1cbmZ1bmN0aW9uIGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc3VidHJlZUNvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgfCBzdWJ0cmVlQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hTdXNwZW5zZUNvbnRleHQoZmliZXIsIG5ld0NvbnRleHQpIHtcbiAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBuZXdDb250ZXh0LCBmaWJlcik7XG59XG5mdW5jdGlvbiBwb3BTdXNwZW5zZUNvbnRleHQoZmliZXIpIHtcbiAgcG9wKHN1c3BlbnNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKHdvcmtJblByb2dyZXNzLCBoYXNJbnZpc2libGVQYXJlbnQpIHtcbiAgLy8gSWYgaXQgd2FzIHRoZSBwcmltYXJ5IGNoaWxkcmVuIHRoYXQganVzdCBzdXNwZW5kZWQsIGNhcHR1cmUgYW5kIHJlbmRlciB0aGVcbiAgLy8gZmFsbGJhY2suIE90aGVyd2lzZSwgZG9uJ3QgY2FwdHVyZSBhbmQgYnViYmxlIHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV4dFN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAvLyBBIGRlaHlkcmF0ZWQgYm91bmRhcnkgYWx3YXlzIGNhcHR1cmVzLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wczsgLy8gUmVndWxhciBib3VuZGFyaWVzIGFsd2F5cyBjYXB0dXJlLlxuXG4gIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBpdCdzIGEgYm91bmRhcnkgd2Ugc2hvdWxkIGF2b2lkLCB0aGVuIHdlIHByZWZlciB0byBidWJibGUgdXAgdG8gdGhlXG59XG5mdW5jdGlvbiBmaW5kRmlyc3RTdXNwZW5kZWQocm93KSB7XG4gIHZhciBub2RlID0gcm93O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChkZWh5ZHJhdGVkID09PSBudWxsIHx8IGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoZGVoeWRyYXRlZCkgfHwgaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soZGVoeWRyYXRlZCkpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlTGlzdENvbXBvbmVudCAmJiAvLyByZXZlYWxPcmRlciB1bmRlZmluZWQgY2FuJ3QgYmUgdHJ1c3RlZCBiZWNhdXNlIGl0IGRvbid0XG4gICAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGl0IHN1c3BlbmRlZCBvciBub3QuXG4gICAgbm9kZS5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBkaWRTdXNwZW5kID0gKG5vZGUuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgICAgaWYgKGRpZFN1c3BlbmQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSByb3cpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm93KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIE5vRmxhZ3MkMSA9XG4vKiAgICovXG4wOyAvLyBSZXByZXNlbnRzIHdoZXRoZXIgZWZmZWN0IHNob3VsZCBmaXJlLlxuXG52YXIgSGFzRWZmZWN0ID1cbi8qICovXG4xOyAvLyBSZXByZXNlbnRzIHRoZSBwaGFzZSBpbiB3aGljaCB0aGUgZWZmZWN0IChub3QgdGhlIGNsZWFuLXVwKSBmaXJlcy5cblxudmFyIEluc2VydGlvbiA9XG4vKiAgKi9cbjI7XG52YXIgTGF5b3V0ID1cbi8qICAgICovXG40O1xudmFyIFBhc3NpdmUkMSA9XG4vKiAgICovXG44O1xuXG4vLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuXG4vLyBUaGlzIHRyYWNrcyB3aGljaCBtdXRhYmxlIHNvdXJjZXMgbmVlZCB0byBiZSByZXNldCBhZnRlciBhIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzU291cmNlcyA9IFtdO1xuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtdXRhYmxlU291cmNlID0gd29ya0luUHJvZ3Jlc3NTb3VyY2VzW2ldO1xuXG4gICAge1xuICAgICAgbXV0YWJsZVNvdXJjZS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aCA9IDA7XG59XG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmVyc2lvbiB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIG1hdGNoZXMgdGhlIG9uZVxuLy8gdGhhdCBpcyBldmVudHVhbGx5IHJlYWQgZHVyaW5nIGh5ZHJhdGlvbi5cbi8vIElmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlcmUncyBhIHBvdGVudGlhbCB0ZWFyIGFuZCBhIGZ1bGwgZGVvcHQgcmVuZGVyIGlzIHJlcXVpcmVkLlxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSkge1xuICB2YXIgZ2V0VmVyc2lvbiA9IG11dGFibGVTb3VyY2UuX2dldFZlcnNpb247XG4gIHZhciB2ZXJzaW9uID0gZ2V0VmVyc2lvbihtdXRhYmxlU291cmNlLl9zb3VyY2UpOyAvLyBUT0RPIENsZWFyIHRoaXMgZGF0YSBvbmNlIGFsbCBwZW5kaW5nIGh5ZHJhdGlvbiB3b3JrIGlzIGZpbmlzaGVkLlxuICAvLyBSZXRhaW5pbmcgaXQgZm9yZXZlciBtYXkgaW50ZXJmZXJlIHdpdGggR0MuXG5cbiAgaWYgKHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9PSBudWxsKSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW211dGFibGVTb3VyY2UsIHZlcnNpb25dO1xuICB9IGVsc2Uge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3Q7XG5cbntcbiAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG4vLyBUaGVzZSBhcmUgc2V0IHJpZ2h0IGJlZm9yZSBjYWxsaW5nIHRoZSBjb21wb25lbnQuXG52YXIgcmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gSSd2ZSBuYW1lZCBpdCBkaWZmZXJlbnRseSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tXG4vLyB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7IC8vIEhvb2tzIGFyZSBzdG9yZWQgYXMgYSBsaW5rZWQgbGlzdCBvbiB0aGUgZmliZXIncyBtZW1vaXplZFN0YXRlIGZpZWxkLiBUaGVcbi8vIGN1cnJlbnQgaG9vayBsaXN0IGlzIHRoZSBsaXN0IHRoYXQgYmVsb25ncyB0byB0aGUgY3VycmVudCBmaWJlci4gVGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGhvb2sgbGlzdCBpcyBhIG5ldyBsaXN0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG5cbnZhciBjdXJyZW50SG9vayA9IG51bGw7XG52YXIgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDsgLy8gV2hldGhlciBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBhdCBhbnkgcG9pbnQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXNcbi8vIGRvZXMgbm90IGdldCByZXNldCBpZiB3ZSBkbyBhbm90aGVyIHJlbmRlciBwYXNzOyBvbmx5IHdoZW4gd2UncmUgY29tcGxldGVseVxuLy8gZmluaXNoZWQgZXZhbHVhdGluZyB0aGlzIGNvbXBvbmVudC4gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gc28gd2Uga25vd1xuLy8gd2hldGhlciB3ZSBuZWVkIHRvIGNsZWFyIHJlbmRlciBwaGFzZSB1cGRhdGVzIGFmdGVyIGEgdGhyb3cuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFdoZXJlIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIG9ubHkgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzLiBUaGlzXG4vLyBnZXRzIHJlc2V0IGFmdGVyIGVhY2ggYXR0ZW1wdC5cbi8vIFRPRE86IE1heWJlIHRoZXJlJ3Mgc29tZSB3YXkgdG8gY29uc29saWRhdGUgdGhpcyB3aXRoXG4vLyBgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZWAuIE9yIHdpdGggYG51bWJlck9mUmVSZW5kZXJzYC5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlOyAvLyBDb3VudHMgdGhlIG51bWJlciBvZiB1c2VJZCBob29rcyBpbiB0aGlzIGNvbXBvbmVudC5cblxudmFyIGxvY2FsSWRDb3VudGVyID0gMDsgLy8gVXNlZCBmb3IgaWRzIHRoYXQgYXJlIGdlbmVyYXRlZCBjb21wbGV0ZWx5IGNsaWVudC1zaWRlIChpLmUuIG5vdCBkdXJpbmdcbi8vIGh5ZHJhdGlvbikuIFRoaXMgY291bnRlciBpcyBnbG9iYWwsIHNvIGNsaWVudCBpZHMgYXJlIG5vdCBzdGFibGUgYWNyb3NzXG4vLyByZW5kZXIgYXR0ZW1wdHMuXG5cbnZhciBnbG9iYWxDbGllbnRJZENvdW50ZXIgPSAwO1xudmFyIFJFX1JFTkRFUl9MSU1JVCA9IDI1OyAvLyBJbiBERVYsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcHJpbWl0aXZlIGhvb2tcblxudmFyIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDsgLy8gSW4gREVWLCB0aGlzIGxpc3QgZW5zdXJlcyB0aGF0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdGhlIHNhbWUgb3JkZXIgYmV0d2VlbiByZW5kZXJzLlxuLy8gVGhlIGxpc3Qgc3RvcmVzIHRoZSBvcmRlciBvZiBob29rcyB1c2VkIGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIgKG1vdW50KS5cbi8vIFN1YnNlcXVlbnQgcmVuZGVycyAodXBkYXRlcykgcmVmZXJlbmNlIHRoaXMgbGlzdC5cblxudmFyIGhvb2tUeXBlc0RldiA9IG51bGw7XG52YXIgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gSW4gREVWLCB0aGlzIHRyYWNrcyB3aGV0aGVyIGN1cnJlbnRseSByZW5kZXJpbmcgY29tcG9uZW50IG5lZWRzIHRvIGlnbm9yZVxuLy8gdGhlIGRlcGVuZGVuY2llcyBmb3IgSG9va3MgdGhhdCBuZWVkIHRoZW0gKGUuZy4gdXNlRWZmZWN0IG9yIHVzZU1lbW8pLlxuLy8gV2hlbiB0cnVlLCBzdWNoIEhvb2tzIHdpbGwgYWx3YXlzIGJlIFwicmVtb3VudGVkXCIuIE9ubHkgdXNlZCBkdXJpbmcgaG90IHJlbG9hZC5cblxudmFyIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG5cbmZ1bmN0aW9uIG1vdW50SG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ID09PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNEZXYgPSBbaG9va05hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rVHlwZXNEZXYucHVzaChob29rTmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYrKztcblxuICAgICAgaWYgKGhvb2tUeXBlc0Rldltob29rVHlwZXNVcGRhdGVJbmRleERldl0gIT09IGhvb2tOYW1lKSB7XG4gICAgICAgIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGhvb2tOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcykge1xuICB7XG4gICAgaWYgKGRlcHMgIT09IHVuZGVmaW5lZCAmJiBkZXBzICE9PSBudWxsICYmICFpc0FycmF5KGRlcHMpKSB7XG4gICAgICAvLyBWZXJpZnkgZGVwcywgYnV0IG9ubHkgb24gbW91bnQgdG8gYXZvaWQgZXh0cmEgY2hlY2tzLlxuICAgICAgLy8gSXQncyB1bmxpa2VseSB0aGVpciB0eXBlIHdvdWxkIGNoYW5nZSBhcyB1c3VhbGx5IHlvdSBkZWZpbmUgdGhlbSBpbmxpbmUuXG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCB0aGF0IGlzIG5vdCBhbiBhcnJheSAoaW5zdGVhZCwgcmVjZWl2ZWQgYCVzYCkuIFdoZW4gJyArICdzcGVjaWZpZWQsIHRoZSBmaW5hbCBhcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5LicsIGN1cnJlbnRIb29rTmFtZUluRGV2LCB0eXBlb2YgZGVwcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGN1cnJlbnRIb29rTmFtZSkge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuICAgICAgICB2YXIgc2Vjb25kQ29sdW1uU3RhcnQgPSAzMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBob29rVHlwZXNVcGRhdGVJbmRleERldjsgaSsrKSB7XG4gICAgICAgICAgdmFyIG9sZEhvb2tOYW1lID0gaG9va1R5cGVzRGV2W2ldO1xuICAgICAgICAgIHZhciBuZXdIb29rTmFtZSA9IGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gY3VycmVudEhvb2tOYW1lIDogb2xkSG9va05hbWU7XG4gICAgICAgICAgdmFyIHJvdyA9IGkgKyAxICsgXCIuIFwiICsgb2xkSG9va05hbWU7IC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG5cbiAgICAgICAgICB3aGlsZSAocm93Lmxlbmd0aCA8IHNlY29uZENvbHVtblN0YXJ0KSB7XG4gICAgICAgICAgICByb3cgKz0gJyAnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdyArPSBuZXdIb29rTmFtZSArICdcXG4nO1xuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCdSZWFjdCBoYXMgZGV0ZWN0ZWQgYSBjaGFuZ2UgaW4gdGhlIG9yZGVyIG9mIEhvb2tzIGNhbGxlZCBieSAlcy4gJyArICdUaGlzIHdpbGwgbGVhZCB0byBidWdzIGFuZCBlcnJvcnMgaWYgbm90IGZpeGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xufVxuXG5mdW5jdGlvbiBhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSB7XG4gIHtcbiAgICBpZiAoaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMpIHtcbiAgICAgIC8vIE9ubHkgdHJ1ZSB3aGVuIHRoaXMgY29tcG9uZW50IGlzIGJlaW5nIGhvdCByZWxvYWRlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCBub3QgZHVyaW5nICcgKyAndGhlIHByZXZpb3VzIHJlbmRlci4gRXZlbiB0aG91Z2ggdGhlIGZpbmFsIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCAnICsgJ2l0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLicsIGN1cnJlbnRIb29rTmFtZUluRGV2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdUaGUgZmluYWwgYXJndW1lbnQgcGFzc2VkIHRvICVzIGNoYW5nZWQgc2l6ZSBiZXR3ZWVuIHJlbmRlcnMuIFRoZSAnICsgJ29yZGVyIGFuZCBzaXplIG9mIHRoaXMgYXJyYXkgbXVzdCByZW1haW4gY29uc3RhbnQuXFxuXFxuJyArICdQcmV2aW91czogJXNcXG4nICsgJ0luY29taW5nOiAlcycsIGN1cnJlbnRIb29rTmFtZUluRGV2LCBcIltcIiArIHByZXZEZXBzLmpvaW4oJywgJykgKyBcIl1cIiwgXCJbXCIgKyBuZXh0RGVwcy5qb2luKCcsICcpICsgXCJdXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcsIG5leHRSZW5kZXJMYW5lcykge1xuICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIFVzZWQgZm9yIGhvdCByZWxvYWRpbmc6XG5cbiAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNldFxuICAvLyBjdXJyZW50SG9vayA9IG51bGw7XG4gIC8vIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuICAvLyBUT0RPIFdhcm4gaWYgbm8gaG9va3MgYXJlIHVzZWQgYXQgYWxsIGR1cmluZyBtb3VudCwgdGhlbiBzb21lIGFyZSB1c2VkIGR1cmluZyB1cGRhdGUuXG4gIC8vIEN1cnJlbnRseSB3ZSB3aWxsIGlkZW50aWZ5IHRoZSB1cGRhdGUgcmVuZGVyIGFzIGEgbW91bnQgYmVjYXVzZSBtZW1vaXplZFN0YXRlID09PSBudWxsLlxuICAvLyBUaGlzIGlzIHRyaWNreSBiZWNhdXNlIGl0J3MgdmFsaWQgZm9yIGNlcnRhaW4gdHlwZXMgb2YgY29tcG9uZW50cyAoZS5nLiBSZWFjdC5sYXp5KVxuICAvLyBVc2luZyBtZW1vaXplZFN0YXRlIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtb3VudC91cGRhdGUgb25seSB3b3JrcyBpZiBhdCBsZWFzdCBvbmUgc3RhdGVmdWwgaG9vayBpcyB1c2VkLlxuICAvLyBOb24tc3RhdGVmdWwgaG9va3MgKGUuZy4gY29udGV4dCkgZG9uJ3QgZ2V0IGFkZGVkIHRvIG1lbW9pemVkU3RhdGUsXG4gIC8vIHNvIG1lbW9pemVkU3RhdGUgd291bGQgYmUgbnVsbCBkdXJpbmcgdXBkYXRlcyBhbmQgbW91bnRzLlxuXG4gIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICB9IGVsc2UgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGhhbmRsZXMgYW4gZWRnZSBjYXNlIHdoZXJlIGEgY29tcG9uZW50IGlzIHVwZGF0aW5nLFxuICAgICAgLy8gYnV0IG5vIHN0YXRlZnVsIGhvb2tzIGhhdmUgYmVlbiB1c2VkLlxuICAgICAgLy8gV2Ugd2FudCB0byBtYXRjaCB0aGUgcHJvZHVjdGlvbiBjb2RlIGJlaGF2aW9yICh3aGljaCB3aWxsIHVzZSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50KSxcbiAgICAgIC8vIGJ1dCB3aXRoIHRoZSBleHRyYSBERVYgdmFsaWRhdGlvbiB0byBlbnN1cmUgaG9va3Mgb3JkZXJpbmcgaGFzbid0IGNoYW5nZWQuXG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgZG9lcyB0aGF0LlxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICB9XG4gIH1cblxuICB2YXIgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7IC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhIHJlbmRlciBwaGFzZSB1cGRhdGVcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKSB7XG4gICAgLy8gS2VlcCByZW5kZXJpbmcgaW4gYSBsb29wIGZvciBhcyBsb25nIGFzIHJlbmRlciBwaGFzZSB1cGRhdGVzIGNvbnRpbnVlIHRvXG4gICAgLy8gYmUgc2NoZWR1bGVkLiBVc2UgYSBjb3VudGVyIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXG4gICAgdmFyIG51bWJlck9mUmVSZW5kZXJzID0gMDtcblxuICAgIGRvIHtcbiAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICAgICAgbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gICAgICBpZiAobnVtYmVyT2ZSZVJlbmRlcnMgPj0gUkVfUkVOREVSX0xJTUlUKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVG9vIG1hbnkgcmUtcmVuZGVycy4gUmVhY3QgbGltaXRzIHRoZSBudW1iZXIgb2YgcmVuZGVycyB0byBwcmV2ZW50ICcgKyAnYW4gaW5maW5pdGUgbG9vcC4nKTtcbiAgICAgIH1cblxuICAgICAgbnVtYmVyT2ZSZVJlbmRlcnMgKz0gMTtcblxuICAgICAge1xuICAgICAgICAvLyBFdmVuIHdoZW4gaG90IHJlbG9hZGluZywgYWxsb3cgZGVwZW5kZW5jaWVzIHRvIHN0YWJpbGl6ZVxuICAgICAgICAvLyBhZnRlciBmaXJzdCByZW5kZXIgdG8gcHJldmVudCBpbmZpbml0ZSByZW5kZXIgcGhhc2UgdXBkYXRlcy5cbiAgICAgICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgIH0gLy8gU3RhcnQgb3ZlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RcblxuXG4gICAgICBjdXJyZW50SG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEFsc28gdmFsaWRhdGUgaG9vayBvcmRlciBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMuXG4gICAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICB9XG5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA7XG4gICAgICBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTtcbiAgICB9IHdoaWxlIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpO1xuICB9IC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmNlLlxuXG5cbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGhvb2tUeXBlc0RldjtcbiAgfSAvLyBUaGlzIGNoZWNrIHVzZXMgY3VycmVudEhvb2sgc28gdGhhdCBpdCB3b3JrcyB0aGUgc2FtZSBpbiBERVYgYW5kIHByb2QgYnVuZGxlcy5cbiAgLy8gaG9va1R5cGVzRGV2IGNvdWxkIGNhdGNoIG1vcmUgY2FzZXMgKGUuZy4gY29udGV4dCkgYnV0IG9ubHkgaW4gREVWIGJ1bmRsZXMuXG5cblxuICB2YXIgZGlkUmVuZGVyVG9vRmV3SG9va3MgPSBjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBjdXJyZW50SG9vay5uZXh0ICE9PSBudWxsO1xuICByZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIENvbmZpcm0gdGhhdCBhIHN0YXRpYyBmbGFnIHdhcyBub3QgYWRkZWQgb3IgcmVtb3ZlZCBzaW5jZSB0aGUgbGFzdFxuICAgIC8vIHJlbmRlci4gSWYgdGhpcyBmaXJlcywgaXQgc3VnZ2VzdHMgdGhhdCB3ZSBpbmNvcnJlY3RseSByZXNldCB0aGUgc3RhdGljXG4gICAgLy8gZmxhZ3MgaW4gc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBjb2RlYmFzZS4gVGhpcyBoYXMgaGFwcGVuZWQgYmVmb3JlLCBmb3JcbiAgICAvLyBleGFtcGxlLCBpbiB0aGUgU3VzcGVuc2VMaXN0IGltcGxlbWVudGF0aW9uLlxuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBTdGF0aWNNYXNrKSAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgU3RhdGljTWFzaykgJiYgLy8gRGlzYWJsZSB0aGlzIHdhcm5pbmcgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgbGVnYWN5IFN1c3BlbnNlIGlzIHdlaXJkXG4gICAgLy8gYW5kIGNyZWF0ZXMgZmFsc2UgcG9zaXRpdmVzLiBUbyBtYWtlIHRoaXMgd29yayBpbiBsZWdhY3kgbW9kZSwgd2UnZFxuICAgIC8vIG5lZWQgdG8gbWFyayBmaWJlcnMgdGhhdCBjb21taXQgaW4gYW4gaW5jb21wbGV0ZSBzdGF0ZSwgc29tZWhvdy4gRm9yXG4gICAgLy8gbm93IEknbGwgZGlzYWJsZSB0aGUgd2FybmluZyB0aGF0IG1vc3Qgb2YgdGhlIGJ1Z3MgdGhhdCB3b3VsZCB0cmlnZ2VyXG4gICAgLy8gaXQgYXJlIGVpdGhlciBleGNsdXNpdmUgdG8gY29uY3VycmVudCBtb2RlIG9yIGV4aXN0IGluIGJvdGguXG4gICAgKGN1cnJlbnQubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICBlcnJvcignSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEV4cGVjdGVkIHN0YXRpYyBmbGFnIHdhcyBtaXNzaW5nLiBQbGVhc2UgJyArICdub3RpZnkgdGhlIFJlYWN0IHRlYW0uJyk7XG4gICAgfVxuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBUaGlzIGlzIHJlc2V0IGJ5IGNoZWNrRGlkUmVuZGVySWRIb29rXG4gIC8vIGxvY2FsSWRDb3VudGVyID0gMDtcblxuICBpZiAoZGlkUmVuZGVyVG9vRmV3SG9va3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIGZld2VyIGhvb2tzIHRoYW4gZXhwZWN0ZWQuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBhbiBhY2NpZGVudGFsICcgKyAnZWFybHkgcmV0dXJuIHN0YXRlbWVudC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGNoZWNrRGlkUmVuZGVySWRIb29rKCkge1xuICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlcnkgcmVuZGVyV2l0aEhvb2tzIGNhbGwuXG4gIC8vIENvbmNlcHR1YWxseSwgaXQncyBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgcmVuZGVyV2l0aEhvb2tzOyBpdCdzIG9ubHkgYVxuICAvLyBzZXBhcmF0ZSBmdW5jdGlvbiB0byBhdm9pZCB1c2luZyBhbiBhcnJheSB0dXBsZS5cbiAgdmFyIGRpZFJlbmRlcklkSG9vayA9IGxvY2FsSWRDb3VudGVyICE9PSAwO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG4gIHJldHVybiBkaWRSZW5kZXJJZEhvb2s7XG59XG5mdW5jdGlvbiBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byByZXNldCB0aGUgZmxhZ3MgaGVyZSwgYmVjYXVzZSB0aGV5J3JlIHJlc2V0IGluIHRoZVxuICAvLyBjb21wbGV0ZSBwaGFzZSAoYnViYmxlUHJvcGVydGllcykuXG5cbiAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihNb3VudFBhc3NpdmVEZXYgfCBNb3VudExheW91dERldiB8IFBhc3NpdmUgfCBVcGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH4oUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH1cblxuICBjdXJyZW50LmxhbmVzID0gcmVtb3ZlTGFuZXMoY3VycmVudC5sYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcmVzZXRIb29rc0FmdGVyVGhyb3coKSB7XG4gIC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmNlLlxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgIC8vIFRoZXJlIHdlcmUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciB0aGlzIHJlbmRlclxuICAgIC8vIHBoYXNlLCB3aGljaCB3ZSBhcmUgbm93IGFib3J0aW5nLiBSZW1vdmUgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWVzIHNvXG4gICAgLy8gdGhleSBkbyBub3QgcGVyc2lzdCB0byB0aGUgbmV4dCByZW5kZXIuIERvIG5vdCByZW1vdmUgdXBkYXRlcyBmcm9tIGhvb2tzXG4gICAgLy8gdGhhdCB3ZXJlbid0IHByb2Nlc3NlZC5cbiAgICAvL1xuICAgIC8vIE9ubHkgcmVzZXQgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWUgaWYgaXQgaGFzIGEgY2xvbmUuIElmIGl0IGRvZXNcbiAgICAvLyBub3QgaGF2ZSBhIGNsb25lLCB0aGF0IG1lYW5zIGl0IHdhc24ndCBwcm9jZXNzZWQsIGFuZCB0aGUgdXBkYXRlcyB3ZXJlXG4gICAgLy8gc2NoZWR1bGVkIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgdmFyIGhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBob29rID0gaG9vay5uZXh0O1xuICAgIH1cblxuICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbiAgbG9jYWxJZENvdW50ZXIgPSAwO1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgdmFyIGhvb2sgPSB7XG4gICAgbWVtb2l6ZWRTdGF0ZTogbnVsbCxcbiAgICBiYXNlU3RhdGU6IG51bGwsXG4gICAgYmFzZVF1ZXVlOiBudWxsLFxuICAgIHF1ZXVlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdFxuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IGhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3RcbiAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IGhvb2s7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBib3RoIGZvciB1cGRhdGVzIGFuZCBmb3IgcmUtcmVuZGVycyB0cmlnZ2VyZWQgYnkgYVxuICAvLyByZW5kZXIgcGhhc2UgdXBkYXRlLiBJdCBhc3N1bWVzIHRoZXJlIGlzIGVpdGhlciBhIGN1cnJlbnQgaG9vayB3ZSBjYW5cbiAgLy8gY2xvbmUsIG9yIGEgd29yay1pbi1wcm9ncmVzcyBob29rIGZyb20gYSBwcmV2aW91cyByZW5kZXIgcGFzcyB0aGF0IHdlIGNhblxuICAvLyB1c2UgYXMgYSBiYXNlLiBXaGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGJhc2UgbGlzdCwgd2UgbXVzdCBzd2l0Y2ggdG9cbiAgLy8gdGhlIGRpc3BhdGNoZXIgdXNlZCBmb3IgbW91bnRzLlxuICB2YXIgbmV4dEN1cnJlbnRIb29rO1xuXG4gIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBudWxsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICB9XG5cbiAgdmFyIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICB9XG5cbiAgaWYgKG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSdzIGFscmVhZHkgYSB3b3JrLWluLXByb2dyZXNzLiBSZXVzZSBpdC5cbiAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBDbG9uZSBmcm9tIHRoZSBjdXJyZW50IGhvb2suXG4gICAgaWYgKG5leHRDdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlZCBtb3JlIGhvb2tzIHRoYW4gZHVyaW5nIHRoZSBwcmV2aW91cyByZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gICAgdmFyIG5ld0hvb2sgPSB7XG4gICAgICBtZW1vaXplZFN0YXRlOiBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlLFxuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50SG9vay5iYXNlU3RhdGUsXG4gICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgIHF1ZXVlOiBjdXJyZW50SG9vay5xdWV1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdC5cbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IG5ld0hvb2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBuZXdIb29rO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gIHJldHVybiB7XG4gICAgbGFzdEVmZmVjdDogbnVsbCxcbiAgICBzdG9yZXM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFzaWNTdGF0ZVJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGFjdGlvbihzdGF0ZSkgOiBhY3Rpb247XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGluaXRpYWxTdGF0ZTtcblxuICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdChpbml0aWFsQXJnKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsQXJnO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICBob29rLnF1ZXVlID0gcXVldWU7XG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgY3VycmVudCA9IGN1cnJlbnRIb29rOyAvLyBUaGUgbGFzdCByZWJhc2UgdXBkYXRlIHRoYXQgaXMgTk9UIHBhcnQgb2YgdGhlIGJhc2Ugc3RhdGUuXG5cbiAgdmFyIGJhc2VRdWV1ZSA9IGN1cnJlbnQuYmFzZVF1ZXVlOyAvLyBUaGUgbGFzdCBwZW5kaW5nIHVwZGF0ZSB0aGF0IGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmdRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgbmV3IHVwZGF0ZXMgdGhhdCBoYXZlbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cbiAgICAvLyBXZSdsbCBhZGQgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cbiAgICBpZiAoYmFzZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAvLyBNZXJnZSB0aGUgcGVuZGluZyBxdWV1ZSBhbmQgdGhlIGJhc2UgcXVldWUuXG4gICAgICB2YXIgYmFzZUZpcnN0ID0gYmFzZVF1ZXVlLm5leHQ7XG4gICAgICB2YXIgcGVuZGluZ0ZpcnN0ID0gcGVuZGluZ1F1ZXVlLm5leHQ7XG4gICAgICBiYXNlUXVldWUubmV4dCA9IHBlbmRpbmdGaXJzdDtcbiAgICAgIHBlbmRpbmdRdWV1ZS5uZXh0ID0gYmFzZUZpcnN0O1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChjdXJyZW50LmJhc2VRdWV1ZSAhPT0gYmFzZVF1ZXVlKSB7XG4gICAgICAgIC8vIEludGVybmFsIGludmFyaWFudCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBmZWFzaWJseSBjb3VsZCBpblxuICAgICAgICAvLyB0aGUgZnV0dXJlIGlmIHdlIGltcGxlbWVudCByZXN1bWluZywgb3Igc29tZSBmb3JtIG9mIHRoYXQuXG4gICAgICAgIGVycm9yKCdJbnRlcm5hbCBlcnJvcjogRXhwZWN0ZWQgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSB0byBiZSBhIGNsb25lLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudC5iYXNlUXVldWUgPSBiYXNlUXVldWUgPSBwZW5kaW5nUXVldWU7XG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoYmFzZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBhIHF1ZXVlIHRvIHByb2Nlc3MuXG4gICAgdmFyIGZpcnN0ID0gYmFzZVF1ZXVlLm5leHQ7XG4gICAgdmFyIG5ld1N0YXRlID0gY3VycmVudC5iYXNlU3RhdGU7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUZpcnN0ID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlTGFzdCA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0O1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLFxuICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUZpcnN0ID0gbmV3QmFzZVF1ZXVlTGFzdCA9IGNsb25lO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG4gICAgICAgIC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlXG4gICAgICAgIC8vIHJlbmRlckxhbmVzIGZyb20gdGhlIG9yaWdpbmFsIGxhbmVzLlxuXG5cbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgdXBkYXRlTGFuZSk7XG4gICAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXModXBkYXRlTGFuZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS5cbiAgICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgLy8gVGhpcyB1cGRhdGUgaXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIHNvIHdlIG5ldmVyIHdhbnQgdW5jb21taXRcbiAgICAgICAgICAgIC8vIGl0LiBVc2luZyBOb0xhbmUgd29ya3MgYmVjYXVzZSAwIGlzIGEgc3Vic2V0IG9mIGFsbCBiaXRtYXNrcywgc29cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBiZSBza2lwcGVkIGJ5IHRoZSBjaGVjayBhYm92ZS5cbiAgICAgICAgICAgIGxhbmU6IE5vTGFuZSxcbiAgICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLFxuICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBpZiAodXBkYXRlLmhhc0VhZ2VyU3RhdGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHVwZGF0ZSBpcyBhIHN0YXRlIHVwZGF0ZSAobm90IGEgcmVkdWNlcikgYW5kIHdhcyBwcm9jZXNzZWQgZWFnZXJseSxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXNlIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlXG4gICAgICAgICAgbmV3U3RhdGUgPSB1cGRhdGUuZWFnZXJTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYWN0aW9uID0gdXBkYXRlLmFjdGlvbjtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBudWxsICYmIHVwZGF0ZSAhPT0gZmlyc3QpO1xuXG4gICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBuZXdCYXNlUXVldWVGaXJzdDtcbiAgICB9IC8vIE1hcmsgdGhhdCB0aGUgZmliZXIgcGVyZm9ybWVkIHdvcmssIGJ1dCBvbmx5IGlmIHRoZSBuZXcgc3RhdGUgaXNcbiAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cblxuXG4gICAgaWYgKCFvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICBob29rLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBob29rLmJhc2VRdWV1ZSA9IG5ld0Jhc2VRdWV1ZUxhc3Q7XG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBJbnRlcmxlYXZlZCB1cGRhdGVzIGFyZSBzdG9yZWQgb24gYSBzZXBhcmF0ZSBxdWV1ZS4gV2UgYXJlbid0IGdvaW5nIHRvXG4gIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gIC8vIGFyZSByZW1haW5pbmcuXG5cblxuICB2YXIgbGFzdEludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGxhc3RJbnRlcmxlYXZlZCAhPT0gbnVsbCkge1xuICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDtcblxuICAgIGRvIHtcbiAgICAgIHZhciBpbnRlcmxlYXZlZExhbmUgPSBpbnRlcmxlYXZlZC5sYW5lO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgaW50ZXJsZWF2ZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoaW50ZXJsZWF2ZWRMYW5lKTtcbiAgICAgIGludGVybGVhdmVkID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICB9IHdoaWxlIChpbnRlcmxlYXZlZCAhPT0gbGFzdEludGVybGVhdmVkKTtcbiAgfSBlbHNlIGlmIChiYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBgcXVldWUubGFuZXNgIGlzIHVzZWQgZm9yIGVudGFuZ2xpbmcgdHJhbnNpdGlvbnMuIFdlIGNhbiBzZXQgaXQgYmFjayB0b1xuICAgIC8vIHplcm8gb25jZSB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgcXVldWUubGFuZXMgPSBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjsgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgLy8gd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gcXVldWUucGVuZGluZztcbiAgdmFyIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgcXVldWUgZG9lc24ndCBwZXJzaXN0IHBhc3QgdGhpcyByZW5kZXIgcGFzcy5cbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0O1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgLy8gUHJvY2VzcyB0aGlzIHJlbmRlciBwaGFzZSB1cGRhdGUuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlXG4gICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAvLyByZW5kZXIncy5cbiAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlKTsgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlOyAvLyBEb24ndCBwZXJzaXN0IHRoZSBzdGF0ZSBhY2N1bXVsYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgIC8vIHRoZSBiYXNlIHN0YXRlIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgLy8gVE9ETzogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgZGVzaXJlZCBzZW1hbnRpY3MsIGJ1dCBpdCdzIHdoYXQgd2VcbiAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuXG4gICAgaWYgKGhvb2suYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICByZXR1cm4gW25ld1N0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIG1vdW50TXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0U25hcHNob3Q7XG4gIHZhciBpc0h5ZHJhdGluZyA9IGdldElzSHlkcmF0aW5nKCk7XG5cbiAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgaWYgKGdldFNlcnZlclNuYXBzaG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBnZXRTZXJ2ZXJTbmFwc2hvdCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yICcgKyAnc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFdpbGwgcmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuJyk7XG4gICAgfVxuXG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgaWYgKG5leHRTbmFwc2hvdCAhPT0gZ2V0U2VydmVyU25hcHNob3QoKSkge1xuICAgICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNlcnZlclNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICAgIHZhciBjYWNoZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBVbmxlc3Mgd2UncmUgcmVuZGVyaW5nIGEgYmxvY2tpbmcgbGFuZSwgc2NoZWR1bGUgYSBjb25zaXN0ZW5jeSBjaGVjay5cbiAgICAvLyBSaWdodCBiZWZvcmUgY29tbWl0dGluZywgd2Ugd2lsbCB3YWxrIHRoZSB0cmVlIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlXG4gICAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZC5cbiAgICAvL1xuICAgIC8vIFdlIHdvbid0IGRvIHRoaXMgaWYgd2UncmUgaHlkcmF0aW5nIHNlcnZlci1yZW5kZXJlZCBjb250ZW50LCBiZWNhdXNlIGlmXG4gICAgLy8gdGhlIGNvbnRlbnQgaXMgc3RhbGUsIGl0J3MgYWxyZWFkeSB2aXNpYmxlIGFueXdheS4gSW5zdGVhZCB3ZSdsbCBwYXRjaFxuICAgIC8vIGl0IHVwIGluIGEgcGFzc2l2ZSBlZmZlY3QuXG5cblxuICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHdvcmstaW4tcHJvZ3Jlc3Mgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCByZW5kZXJMYW5lcykpIHtcbiAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gVGhpcyBicmVha3MgdGhlXG4gIC8vIG5vcm1hbCBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgYmVjYXVzZSBzdG9yZSB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXh0U25hcHNob3Q7XG4gIHZhciBpbnN0ID0ge1xuICAgIHZhbHVlOiBuZXh0U25hcHNob3QsXG4gICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90XG4gIH07XG4gIGhvb2sucXVldWUgPSBpbnN0OyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZS5cblxuICBtb3VudEVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHVwZGF0ZSB0aGUgbXV0YWJsZSBpbnN0YW5jZSBmaWVsZHMuIFdlIHdpbGwgdXBkYXRlXG4gIC8vIHRoaXMgd2hlbmV2ZXIgc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgb3IgdmFsdWUgY2hhbmdlcy4gQmVjYXVzZSB0aGVyZSdzIG5vXG4gIC8vIGNsZWFuLXVwIGZ1bmN0aW9uLCBhbmQgd2UgdHJhY2sgdGhlIGRlcHMgY29ycmVjdGx5LCB3ZSBjYW4gY2FsbCBwdXNoRWZmZWN0XG4gIC8vIGRpcmVjdGx5LCB3aXRob3V0IHN0b3JpbmcgYW55IGFkZGl0aW9uYWwgc3RhdGUuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlXG4gIC8vIGRvbid0IG5lZWQgdG8gc2V0IGEgc3RhdGljIGZsYWcsIGVpdGhlci5cbiAgLy8gVE9ETzogV2UgY2FuIG1vdmUgdGhpcyB0byB0aGUgcGFzc2l2ZSBwaGFzZSBvbmNlIHdlIGFkZCBhIHByZS1jb21taXRcbiAgLy8gY29uc2lzdGVuY3kgY2hlY2suIFNlZSB0aGUgbmV4dCBjb21tZW50LlxuXG4gIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gIHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgUGFzc2l2ZSQxLCB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpLCB1bmRlZmluZWQsIG51bGwpO1xuICByZXR1cm4gbmV4dFNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpOyAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gVGhpcyBicmVha3MgdGhlXG4gIC8vIG5vcm1hbCBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgYmVjYXVzZSBzdG9yZSB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cbiAgdmFyIG5leHRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAge1xuICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgIHZhciBjYWNoZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2U25hcHNob3QgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzbmFwc2hvdENoYW5nZWQgPSAhb2JqZWN0SXMocHJldlNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuXG4gIGlmIChzbmFwc2hvdENoYW5nZWQpIHtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXh0U25hcHNob3Q7XG4gICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gaG9vay5xdWV1ZTtcbiAgdXBkYXRlRWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBXaGVuZXZlciBnZXRTbmFwc2hvdCBvciBzdWJzY3JpYmUgY2hhbmdlcywgd2UgbmVlZCB0byBjaGVjayBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlIGlmIHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCBtdXRhdGlvbi4gSW4gY29uY3VycmVudCBtb2RlXG4gIC8vIHRoaXMgY2FuIGhhcHBlbiBhbGwgdGhlIHRpbWUsIGJ1dCBldmVuIGluIHN5bmNocm9ub3VzIG1vZGUsIGFuIGVhcmxpZXJcbiAgLy8gZWZmZWN0IG1heSBoYXZlIG11dGF0ZWQgdGhlIHN0b3JlLlxuXG4gIGlmIChpbnN0LmdldFNuYXBzaG90ICE9PSBnZXRTbmFwc2hvdCB8fCBzbmFwc2hvdENoYW5nZWQgfHwgLy8gQ2hlY2sgaWYgdGhlIHN1c2JjcmliZSBmdW5jdGlvbiBjaGFuZ2VkLiBXZSBjYW4gc2F2ZSBzb21lIG1lbW9yeSBieVxuICAvLyBjaGVja2luZyB3aGV0aGVyIHdlIHNjaGVkdWxlZCBhIHN1YnNjcmlwdGlvbiBlZmZlY3QgYWJvdmUuXG4gIHdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzc0hvb2subWVtb2l6ZWRTdGF0ZS50YWcgJiBIYXNFZmZlY3QpIHtcbiAgICBmaWJlci5mbGFncyB8PSBQYXNzaXZlO1xuICAgIHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgUGFzc2l2ZSQxLCB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpLCB1bmRlZmluZWQsIG51bGwpOyAvLyBVbmxlc3Mgd2UncmUgcmVuZGVyaW5nIGEgYmxvY2tpbmcgbGFuZSwgc2NoZWR1bGUgYSBjb25zaXN0ZW5jeSBjaGVjay5cbiAgICAvLyBSaWdodCBiZWZvcmUgY29tbWl0dGluZywgd2Ugd2lsbCB3YWxrIHRoZSB0cmVlIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlXG4gICAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZC5cblxuICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHdvcmstaW4tcHJvZ3Jlc3Mgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCByZW5kZXJMYW5lcykpIHtcbiAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCByZW5kZXJlZFNuYXBzaG90KSB7XG4gIGZpYmVyLmZsYWdzIHw9IFN0b3JlQ29uc2lzdGVuY3k7XG4gIHZhciBjaGVjayA9IHtcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsXG4gICAgdmFsdWU6IHJlbmRlcmVkU25hcHNob3RcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzID0gW2NoZWNrXTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3RvcmVzID0gY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgaWYgKHN0b3JlcyA9PT0gbnVsbCkge1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzID0gW2NoZWNrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVzLnB1c2goY2hlY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTdG9yZUluc3RhbmNlKGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSB7XG4gIC8vIFRoZXNlIGFyZSB1cGRhdGVkIGluIHRoZSBwYXNzaXZlIHBoYXNlXG4gIGluc3QudmFsdWUgPSBuZXh0U25hcHNob3Q7XG4gIGluc3QuZ2V0U25hcHNob3QgPSBnZXRTbmFwc2hvdDsgLy8gU29tZXRoaW5nIG1heSBoYXZlIGJlZW4gbXV0YXRlZCBpbiBiZXR3ZWVuIHJlbmRlciBhbmQgY29tbWl0LiBUaGlzIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhbiBldmVudCB0aGF0IGZpcmVkIGJlZm9yZSB0aGUgcGFzc2l2ZSBlZmZlY3RzLCBvciBpdCBjb3VsZFxuICAvLyBoYXZlIGJlZW4gaW4gYSBsYXlvdXQgZWZmZWN0LiBJbiB0aGF0IGNhc2UsIHdlIHdvdWxkIGhhdmUgdXNlZCB0aGUgb2xkXG4gIC8vIHNuYXBzaG8gYW5kIGdldFNuYXBzaG90IHZhbHVlcyB0byBiYWlsIG91dC4gV2UgbmVlZCB0byBjaGVjayBvbmUgbW9yZSB0aW1lLlxuXG4gIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdWJzY3JpYmVUb1N0b3JlKGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpIHtcbiAgdmFyIGhhbmRsZVN0b3JlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoZSBzdG9yZSBjaGFuZ2VkLiBDaGVjayBpZiB0aGUgc25hcHNob3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlXG4gICAgLy8gcmVhZCBmcm9tIHRoZSBzdG9yZS5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICAgIH1cbiAgfTsgLy8gU3Vic2NyaWJlIHRvIHRoZSBzdG9yZSBhbmQgcmV0dXJuIGEgY2xlYW4tdXAgZnVuY3Rpb24uXG5cblxuICByZXR1cm4gc3Vic2NyaWJlKGhhbmRsZVN0b3JlQ2hhbmdlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gIHZhciBwcmV2VmFsdWUgPSBpbnN0LnZhbHVlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgcmV0dXJuICFvYmplY3RJcyhwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKSB7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGUoKTtcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICBsYW5lczogTm9MYW5lcyxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBiYXNpY1N0YXRlUmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFNldFN0YXRlLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBsYXN0RWZmZWN0ID0gY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgIGxhc3RFZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICAgIGVmZmVjdC5uZXh0ID0gZmlyc3RFZmZlY3Q7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAge1xuICAgIHZhciBfcmVmMiA9IHtcbiAgICAgIGN1cnJlbnQ6IGluaXRpYWxWYWx1ZVxuICAgIH07XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gX3JlZjI7XG4gICAgcmV0dXJuIF9yZWYyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgdW5kZWZpbmVkLCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2RWZmZWN0LmRlcHM7XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChNb3VudFBhc3NpdmVEZXYgfCBQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFBhc3NpdmUsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICB7XG4gICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gIH1cblxuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gIH1cblxuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdChjcmVhdGUsIHJlZikge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZWZDYWxsYmFjayA9IHJlZjtcblxuICAgIHZhciBfaW5zdCA9IGNyZWF0ZSgpO1xuXG4gICAgcmVmQ2FsbGJhY2soX2luc3QpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZDYWxsYmFjayhudWxsKTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKHJlZiAhPT0gbnVsbCAmJiByZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciByZWZPYmplY3QgPSByZWY7XG5cbiAgICB7XG4gICAgICBpZiAoIXJlZk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgZmlyc3QgYXJndW1lbnQgdG8gZWl0aGVyIGJlIGEgJyArICdyZWYgY2FsbGJhY2sgb3IgUmVhY3QuY3JlYXRlUmVmKCkgb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCAnYW4gb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKHJlZk9iamVjdCkuam9pbignLCAnKSArICd9Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0MiA9IGNyZWF0ZSgpO1xuXG4gICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBfaW5zdDI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZk9iamVjdC5jdXJyZW50ID0gbnVsbDtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgey8vIFRoaXMgaG9vayBpcyBub3JtYWxseSBhIG5vLW9wLlxuICAvLyBUaGUgcmVhY3QtZGVidWctaG9va3MgcGFja2FnZSBpbmplY3RzIGl0cyBvd24gaW1wbGVtZW50YXRpb25cbiAgLy8gc28gdGhhdCBlLmcuIERldlRvb2xzIGNhbiBkaXNwbGF5IGN1c3RvbSBob29rIHZhbHVlcy5cbn1cblxudmFyIHVwZGF0ZURlYnVnVmFsdWUgPSBtb3VudERlYnVnVmFsdWU7XG5cbmZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBtb3VudE1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgLy8gQXNzdW1lIHRoZXNlIGFyZSBkZWZpbmVkLiBJZiB0aGV5J3JlIG5vdCwgYXJlSG9va0lucHV0c0VxdWFsIHdpbGwgd2Fybi5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZXNvbHZlZEN1cnJlbnRIb29rID0gY3VycmVudEhvb2s7XG4gIHZhciBwcmV2VmFsdWUgPSByZXNvbHZlZEN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlcmVuZGVyIGR1cmluZyBhIG1vdW50LlxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGFuIHVwZGF0ZS5cbiAgICB2YXIgcHJldlZhbHVlID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSkge1xuICB2YXIgc2hvdWxkRGVmZXJWYWx1ZSA9ICFpbmNsdWRlc09ubHlOb25VcmdlbnRMYW5lcyhyZW5kZXJMYW5lcyk7XG5cbiAgaWYgKHNob3VsZERlZmVyVmFsdWUpIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVyZ2VudCB1cGRhdGUuIElmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwga2VlcCB1c2luZyB0aGVcbiAgICAvLyBwcmV2aW91cyB2YWx1ZSBhbmQgc3Bhd24gYSBkZWZlcnJlZCByZW5kZXIgdG8gdXBkYXRlIGl0IGxhdGVyLlxuICAgIGlmICghb2JqZWN0SXModmFsdWUsIHByZXZWYWx1ZSkpIHtcbiAgICAgIC8vIFNjaGVkdWxlIGEgZGVmZXJyZWQgcmVuZGVyXG4gICAgICB2YXIgZGVmZXJyZWRMYW5lID0gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIGRlZmVycmVkTGFuZSk7XG4gICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGRlZmVycmVkTGFuZSk7IC8vIFNldCB0aGlzIHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVuZGVyZWQgdmFsdWUgaXMgaW5jb25zaXN0ZW50XG4gICAgICAvLyBmcm9tIHRoZSBsYXRlc3QgdmFsdWUuIFRoZSBuYW1lIFwiYmFzZVN0YXRlXCIgZG9lc24ndCByZWFsbHkgbWF0Y2ggaG93IHdlXG4gICAgICAvLyB1c2UgaXQgYmVjYXVzZSB3ZSdyZSByZXVzaW5nIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGFcbiAgICAgIC8vIG5ldyBvbmUuXG5cbiAgICAgIGhvb2suYmFzZVN0YXRlID0gdHJ1ZTtcbiAgICB9IC8vIFJldXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuXG5cbiAgICByZXR1cm4gcHJldlZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgbm90IGFuIHVyZ2VudCB1cGRhdGUsIHNvIHdlIGNhbiB1c2UgdGhlIGxhdGVzdCB2YWx1ZSByZWdhcmRsZXNzXG4gICAgLy8gb2Ygd2hhdCBpdCBpcy4gTm8gbmVlZCB0byBkZWZlciBpdC5cbiAgICAvLyBIb3dldmVyLCBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGEgc3Bhd25lZCByZW5kZXIsIHRoZW4gd2UgbmVlZCB0byBtYXJrXG4gICAgLy8gdGhpcyBhcyBhbiB1cGRhdGUgdG8gcHJldmVudCB0aGUgZmliZXIgZnJvbSBiYWlsaW5nIG91dC5cbiAgICAvL1xuICAgIC8vIGBiYXNlU3RhdGVgIGlzIHRydWUgd2hlbiB0aGUgY3VycmVudCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcmVuZGVyZWRcbiAgICAvLyB2YWx1ZS4gVGhlIG5hbWUgZG9lc24ndCByZWFsbHkgbWF0Y2ggaG93IHdlIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmdcbiAgICAvLyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgaWYgKGhvb2suYmFzZVN0YXRlKSB7XG4gICAgICAvLyBGbGlwIHRoaXMgYmFjayB0byBmYWxzZS5cbiAgICAgIGhvb2suYmFzZVN0YXRlID0gZmFsc2U7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2V0UGVuZGluZywgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGhpZ2hlckV2ZW50UHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSwgQ29udGludW91c0V2ZW50UHJpb3JpdHkpKTtcbiAgc2V0UGVuZGluZyh0cnVlKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNldFBlbmRpbmcoZmFsc2UpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAge1xuICAgICAgaWYgKHByZXZUcmFuc2l0aW9uID09PSBudWxsICYmIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHZhciB1cGRhdGVkRmliZXJzQ291bnQgPSBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5zaXplO1xuXG4gICAgICAgIGlmICh1cGRhdGVkRmliZXJzQ291bnQgPiAxMCkge1xuICAgICAgICAgIHdhcm4oJ0RldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gJyArICdJZiB0aGlzIGlzIGR1ZSB0byBhIHN1YnNjcmlwdGlvbiBwbGVhc2UgcmUtd3JpdGUgaXQgdG8gdXNlIFJlYWN0IHByb3ZpZGVkIGhvb2tzLiAnICsgJ090aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50VHJhbnNpdGlvbigpIHtcbiAgdmFyIF9tb3VudFN0YXRlID0gbW91bnRTdGF0ZShmYWxzZSksXG4gICAgICBpc1BlbmRpbmcgPSBfbW91bnRTdGF0ZVswXSxcbiAgICAgIHNldFBlbmRpbmcgPSBfbW91bnRTdGF0ZVsxXTsgLy8gVGhlIGBzdGFydGAgbWV0aG9kIG5ldmVyIGNoYW5nZXMuXG5cblxuICB2YXIgc3RhcnQgPSBzdGFydFRyYW5zaXRpb24uYmluZChudWxsLCBzZXRQZW5kaW5nKTtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBzdGFydDtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVHJhbnNpdGlvbigpIHtcbiAgdmFyIF91cGRhdGVTdGF0ZSA9IHVwZGF0ZVN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfdXBkYXRlU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclRyYW5zaXRpb24oKSB7XG4gIHZhciBfcmVyZW5kZXJTdGF0ZSA9IHJlcmVuZGVyU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF9yZXJlbmRlclN0YXRlWzBdO1xuXG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBzdGFydCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxudmFyIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldElzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2VJbkRFVigpIHtcbiAge1xuICAgIHJldHVybiBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50SWQoKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTsgLy8gVE9ETzogSW4gRml6eiwgaWQgZ2VuZXJhdGlvbiBpcyBzcGVjaWZpYyB0byBlYWNoIHNlcnZlciBjb25maWcuIE1heWJlIHdlXG4gIC8vIHNob3VsZCBkbyB0aGlzIGluIEZpYmVyLCB0b28/IERlZmVycmluZyB0aGlzIGRlY2lzaW9uIGZvciBub3cgYmVjYXVzZVxuICAvLyB0aGVyZSdzIG5vIG90aGVyIHBsYWNlIHRvIHN0b3JlIHRoZSBwcmVmaXggZXhjZXB0IGZvciBhbiBpbnRlcm5hbCBmaWVsZCBvblxuICAvLyB0aGUgcHVibGljIGNyZWF0ZVJvb3Qgb2JqZWN0LCB3aGljaCB0aGUgZmliZXIgdHJlZSBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZVxuICAvLyBhIHJlZmVyZW5jZSB0by5cblxuICB2YXIgaWRlbnRpZmllclByZWZpeCA9IHJvb3QuaWRlbnRpZmllclByZWZpeDtcbiAgdmFyIGlkO1xuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgdmFyIHRyZWVJZCA9IGdldFRyZWVJZCgpOyAvLyBVc2UgYSBjYXB0aWFsIFIgcHJlZml4IGZvciBzZXJ2ZXItZ2VuZXJhdGVkIGlkcy5cblxuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdSJyArIHRyZWVJZDsgLy8gVW5sZXNzIHRoaXMgaXMgdGhlIGZpcnN0IGlkIGF0IHRoaXMgbGV2ZWwsIGFwcGVuZCBhIG51bWJlciBhdCB0aGUgZW5kXG4gICAgLy8gdGhhdCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGlzIHVzZUlkIGhvb2sgYW1vbmcgYWxsIHRoZSB1c2VJZFxuICAgIC8vIGhvb2tzIGZvciB0aGlzIGZpYmVyLlxuXG4gICAgdmFyIGxvY2FsSWQgPSBsb2NhbElkQ291bnRlcisrO1xuXG4gICAgaWYgKGxvY2FsSWQgPiAwKSB7XG4gICAgICBpZCArPSAnSCcgKyBsb2NhbElkLnRvU3RyaW5nKDMyKTtcbiAgICB9XG5cbiAgICBpZCArPSAnOic7XG4gIH0gZWxzZSB7XG4gICAgLy8gVXNlIGEgbG93ZXJjYXNlIHIgcHJlZml4IGZvciBjbGllbnQtZ2VuZXJhdGVkIGlkcy5cbiAgICB2YXIgZ2xvYmFsQ2xpZW50SWQgPSBnbG9iYWxDbGllbnRJZENvdW50ZXIrKztcbiAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAncicgKyBnbG9iYWxDbGllbnRJZC50b1N0cmluZygzMikgKyAnOic7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBpZDtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJZCgpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGlkID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoUmVkdWNlckFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHtcbiAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZShmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHtcbiAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChmaWJlci5sYW5lcyA9PT0gTm9MYW5lcyAmJiAoYWx0ZXJuYXRlID09PSBudWxsIHx8IGFsdGVybmF0ZS5sYW5lcyA9PT0gTm9MYW5lcykpIHtcbiAgICAgIC8vIFRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHksIHdoaWNoIG1lYW5zIHdlIGNhbiBlYWdlcmx5IGNvbXB1dGUgdGhlXG4gICAgICAvLyBuZXh0IHN0YXRlIGJlZm9yZSBlbnRlcmluZyB0aGUgcmVuZGVyIHBoYXNlLiBJZiB0aGUgbmV3IHN0YXRlIGlzIHRoZVxuICAgICAgLy8gc2FtZSBhcyB0aGUgY3VycmVudCBzdGF0ZSwgd2UgbWF5IGJlIGFibGUgdG8gYmFpbCBvdXQgZW50aXJlbHkuXG4gICAgICB2YXIgbGFzdFJlbmRlcmVkUmVkdWNlciA9IHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXI7XG5cbiAgICAgIGlmIChsYXN0UmVuZGVyZWRSZWR1Y2VyICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlcjtcblxuICAgICAgICB7XG4gICAgICAgICAgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gcXVldWUubGFzdFJlbmRlcmVkU3RhdGU7XG4gICAgICAgICAgdmFyIGVhZ2VyU3RhdGUgPSBsYXN0UmVuZGVyZWRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTsgLy8gU3Rhc2ggdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGUsIGFuZCB0aGUgcmVkdWNlciB1c2VkIHRvIGNvbXB1dGVcbiAgICAgICAgICAvLyBpdCwgb24gdGhlIHVwZGF0ZSBvYmplY3QuIElmIHRoZSByZWR1Y2VyIGhhc24ndCBjaGFuZ2VkIGJ5IHRoZVxuICAgICAgICAgIC8vIHRpbWUgd2UgZW50ZXIgdGhlIHJlbmRlciBwaGFzZSwgdGhlbiB0aGUgZWFnZXIgc3RhdGUgY2FuIGJlIHVzZWRcbiAgICAgICAgICAvLyB3aXRob3V0IGNhbGxpbmcgdGhlIHJlZHVjZXIgYWdhaW4uXG5cbiAgICAgICAgICB1cGRhdGUuaGFzRWFnZXJTdGF0ZSA9IHRydWU7XG4gICAgICAgICAgdXBkYXRlLmVhZ2VyU3RhdGUgPSBlYWdlclN0YXRlO1xuXG4gICAgICAgICAgaWYgKG9iamVjdElzKGVhZ2VyU3RhdGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIEZhc3QgcGF0aC4gV2UgY2FuIGJhaWwgb3V0IHdpdGhvdXQgc2NoZWR1bGluZyBSZWFjdCB0byByZS1yZW5kZXIuXG4gICAgICAgICAgICAvLyBJdCdzIHN0aWxsIHBvc3NpYmxlIHRoYXQgd2UnbGwgbmVlZCB0byByZWJhc2UgdGhpcyB1cGRhdGUgbGF0ZXIsXG4gICAgICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50IHJlLXJlbmRlcnMgZm9yIGEgZGlmZmVyZW50IHJlYXNvbiBhbmQgYnkgdGhhdFxuICAgICAgICAgICAgLy8gdGltZSB0aGUgcmVkdWNlciBoYXMgY2hhbmdlZC5cbiAgICAgICAgICAgIC8vIFRPRE86IERvIHdlIHN0aWxsIG5lZWQgdG8gZW50YW5nbGUgdHJhbnNpdGlvbnMgaW4gdGhpcyBjYXNlP1xuICAgICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsvLyBTdXBwcmVzcyB0aGUgZXJyb3IuIEl0IHdpbGwgdGhyb3cgYWdhaW4gaW4gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTtcbiAgICB9XG4gIH1cblxuICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgcmV0dXJuIGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKSB7XG4gIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBTdGFzaCBpdCBpbiBhIGxhemlseS1jcmVhdGVkIG1hcCBvZlxuICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gIC8vIGFuZCBhcHBseSB0aGUgc3Rhc2hlZCB1cGRhdGVzIG9uIHRvcCBvZiB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gdHJ1ZTtcbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG59IC8vIFRPRE86IE1vdmUgdG8gUmVhY3RGaWJlckNvbmN1cnJlbnRVcGRhdGVzP1xuXG5cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSkge1xuICBpZiAoaXNUcmFuc2l0aW9uTGFuZShsYW5lKSkge1xuICAgIHZhciBxdWV1ZUxhbmVzID0gcXVldWUubGFuZXM7IC8vIElmIGFueSBlbnRhbmdsZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBwZW5kaW5nIG9uIHRoZSByb290LCB0aGVuIHRoZXlcbiAgICAvLyBtdXN0IGhhdmUgZmluaXNoZWQuIFdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBzaGFyZWQgcXVldWUsIHdoaWNoXG4gICAgLy8gcmVwcmVzZW50cyBhIHN1cGVyc2V0IG9mIHRoZSBhY3R1YWxseSBwZW5kaW5nIGxhbmVzLiBJbiBzb21lIGNhc2VzIHdlXG4gICAgLy8gbWF5IGVudGFuZ2xlIG1vcmUgdGhhbiB3ZSBuZWVkIHRvLCBidXQgdGhhdCdzIE9LLiBJbiBmYWN0IGl0J3Mgd29yc2UgaWZcbiAgICAvLyB3ZSAqZG9uJ3QqIGVudGFuZ2xlIHdoZW4gd2Ugc2hvdWxkLlxuXG4gICAgcXVldWVMYW5lcyA9IGludGVyc2VjdExhbmVzKHF1ZXVlTGFuZXMsIHJvb3QucGVuZGluZ0xhbmVzKTsgLy8gRW50YW5nbGUgdGhlIG5ldyB0cmFuc2l0aW9uIGxhbmUgd2l0aCB0aGUgb3RoZXIgdHJhbnNpdGlvbiBsYW5lcy5cblxuICAgIHZhciBuZXdRdWV1ZUxhbmVzID0gbWVyZ2VMYW5lcyhxdWV1ZUxhbmVzLCBsYW5lKTtcbiAgICBxdWV1ZS5sYW5lcyA9IG5ld1F1ZXVlTGFuZXM7IC8vIEV2ZW4gaWYgcXVldWUubGFuZXMgYWxyZWFkeSBpbmNsdWRlIGxhbmUsIHdlIGRvbid0IGtub3cgZm9yIGNlcnRhaW4gaWZcbiAgICAvLyB0aGUgbGFuZSBmaW5pc2hlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGVudGFuZ2xlZCBpdC4gU28gd2UgbmVlZCB0b1xuICAgIC8vIGVudGFuZ2xlIGl0IGFnYWluLCBqdXN0IHRvIGJlIHN1cmUuXG5cbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBuZXdRdWV1ZUxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSwgYWN0aW9uKSB7XG5cbiAge1xuICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gIH1cbn1cblxudmFyIENvbnRleHRPbmx5RGlzcGF0Y2hlciA9IHtcbiAgcmVhZENvbnRleHQ6IHJlYWRDb250ZXh0LFxuICB1c2VDYWxsYmFjazogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VDb250ZXh0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUluc2VydGlvbkVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VMYXlvdXRFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTWVtbzogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWR1Y2VyOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VTdGF0ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWJ1Z1ZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlZmVycmVkVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlVHJhbnNpdGlvbjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNdXRhYmxlU291cmNlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUlkOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxufTtcblxudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG5cbntcbiAgdmFyIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gIH07XG5cbiAgdmFyIHdhcm5JbnZhbGlkSG9va0FjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlcnJvcignRG8gbm90IGNhbGwgSG9va3MgaW5zaWRlIHVzZUVmZmVjdCguLi4pLCB1c2VNZW1vKC4uLiksIG9yIG90aGVyIGJ1aWx0LWluIEhvb2tzLiAnICsgJ1lvdSBjYW4gb25seSBjYWxsIEhvb2tzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgeW91ciBSZWFjdCBmdW5jdGlvbi4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzJyk7XG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG59XG5cbnZhciBub3ckMSA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgY29tbWl0VGltZSA9IDA7XG52YXIgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gLTE7XG52YXIgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbnZhciBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7XG4vKipcbiAqIFRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQvY2FzY2FkaW5nIHVwZGF0ZSAoc2NoZWR1bGVkIGZyb20gYSBsYXlvdXQgZWZmZWN0KS5cbiAqXG4gKiBUaGUgb3ZlcmFsbCBzZXF1ZW5jZSBpczpcbiAqICAgMS4gcmVuZGVyXG4gKiAgIDIuIGNvbW1pdCAoYW5kIGNhbGwgYG9uUmVuZGVyYCwgYG9uQ29tbWl0YClcbiAqICAgMy4gY2hlY2sgZm9yIG5lc3RlZCB1cGRhdGVzXG4gKiAgIDQuIGZsdXNoIHBhc3NpdmUgZWZmZWN0cyAoYW5kIGNhbGwgYG9uUG9zdENvbW1pdGApXG4gKlxuICogTmVzdGVkIHVwZGF0ZXMgYXJlIGlkZW50aWZpZWQgaW4gc3RlcCAzIGFib3ZlLFxuICogYnV0IHN0ZXAgNCBzdGlsbCBhcHBsaWVzIHRvIHRoZSB3b3JrIHRoYXQgd2FzIGp1c3QgY29tbWl0dGVkLlxuICogV2UgdXNlIHR3byBmbGFncyB0byB0cmFjayBuZXN0ZWQgdXBkYXRlcyB0aGVuOlxuICogb25lIHRyYWNrcyB3aGV0aGVyIHRoZSB1cGNvbWluZyB1cGRhdGUgaXMgYSBuZXN0ZWQgdXBkYXRlLFxuICogYW5kIHRoZSBvdGhlciB0cmFja3Mgd2hldGhlciB0aGUgY3VycmVudCB1cGRhdGUgd2FzIGEgbmVzdGVkIHVwZGF0ZS5cbiAqIFRoZSBmaXJzdCB2YWx1ZSBnZXRzIHN5bmNlZCB0byB0aGUgc2Vjb25kIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLlxuICovXG5cbnZhciBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBmYWxzZTtcbnZhciBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkge1xuICByZXR1cm4gY3VycmVudFVwZGF0ZUlzTmVzdGVkO1xufVxuXG5mdW5jdGlvbiBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCkge1xuICB7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKSB7XG4gIHtcbiAgICBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBmYWxzZTtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzeW5jTmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IG5lc3RlZFVwZGF0ZVNjaGVkdWxlZDtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDb21taXRUaW1lKCkge1xuICByZXR1cm4gY29tbWl0VGltZTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkQ29tbWl0VGltZSgpIHtcblxuICBjb21taXRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQcm9maWxlclRpbWVyKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3ckMSgpO1xuXG4gIGlmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPCAwKSB7XG4gICAgZmliZXIuYWN0dWFsU3RhcnRUaW1lID0gbm93JDEoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyhmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcblxuICBpZiAocHJvZmlsZXJTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcblxuICAgIGlmIChvdmVycmlkZUJhc2VUaW1lKSB7XG4gICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgfVxuXG4gICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcikge1xuXG4gIGlmIChsYXlvdXRFZmZlY3RTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBsYXlvdXRFZmZlY3RTdGFydFRpbWU7XG4gICAgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3JcbiAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKVxuXG4gICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lO1xuICAgIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcm9vdC5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChwYXJlbnRTdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIERldGFjaGVkIGZpYmVycyBoYXZlIHRoZWlyIHN0YXRlIG5vZGUgY2xlYXJlZCBvdXQuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm4gcG9pbnRlciBpcyBhbHNvIGNsZWFyZWQgb3V0LFxuICAgICAgICAgICAgLy8gc28gd2Ugd29uJ3QgYmUgYWJsZSB0byByZXBvcnQgdGhlIHRpbWUgc3BlbnQgaW4gdGhpcyBQcm9maWxlcidzIHN1YnRyZWUuXG4gICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKSB7XG5cbiAgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKSB7XG5cbiAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24oZmliZXIpIHtcbiAgLy8gVHJhbnNmZXIgdGltZSBzcGVudCByZW5kZXJpbmcgdGhlc2UgY2hpbGRyZW4gc28gd2UgZG9uJ3QgbG9zZSBpdFxuICAvLyBhZnRlciB3ZSByZXJlbmRlci4gVGhpcyBpcyB1c2VkIGFzIGEgaGVscGVyIGluIHNwZWNpYWwgY2FzZXNcbiAgLy8gd2hlcmUgd2Ugc2hvdWxkIGNvdW50IHRoZSB3b3JrIG9mIG11bHRpcGxlIHBhc3Nlcy5cbiAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkKSB7XG4gICAgZmliZXIuYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpLFxuICAgIGRpZ2VzdDogbnVsbFxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgZGlnZXN0LCBzdGFjaykge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IG51bGwsXG4gICAgc3RhY2s6IHN0YWNrICE9IG51bGwgPyBzdGFjayA6IG51bGwsXG4gICAgZGlnZXN0OiBkaWdlc3QgIT0gbnVsbCA/IGRpZ2VzdCA6IG51bGxcbiAgfTtcbn1cblxuLy8gVGhpcyBtb2R1bGUgaXMgZm9ya2VkIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4vLyBCeSBkZWZhdWx0LCByZXR1cm4gYHRydWVgIHRvIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuXG4vLyBGb3JrcyBjYW4gcmV0dXJuIGBmYWxzZWAgaWYgdGhpcyBpc24ndCBkZXNpcmFibGUuXG5mdW5jdGlvbiBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbykge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbG9nQ2FwdHVyZWRFcnJvcihib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHRyeSB7XG4gICAgdmFyIGxvZ0Vycm9yID0gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pOyAvLyBBbGxvdyBpbmplY3RlZCBzaG93RXJyb3JEaWFsb2coKSB0byBwcmV2ZW50IGRlZmF1bHQgY29uc29sZS5lcnJvciBsb2dnaW5nLlxuICAgIC8vIFRoaXMgZW5hYmxlcyByZW5kZXJlcnMgbGlrZSBSZWFjdE5hdGl2ZSB0byBiZXR0ZXIgbWFuYWdlIHJlZGJveCBiZWhhdmlvci5cblxuICAgIGlmIChsb2dFcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICBpZiAodHJ1ZSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVycm9ySW5mby5zb3VyY2U7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJyc7IC8vIEJyb3dzZXJzIHN1cHBvcnQgc2lsZW5jaW5nIHVuY2F1Z2h0IGVycm9ycyBieSBjYWxsaW5nXG4gICAgICAvLyBgcHJldmVudERlZmF1bHQoKWAgaW4gd2luZG93IGBlcnJvcmAgaGFuZGxlci5cbiAgICAgIC8vIFdlIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uIGFzIGFuIGV4cGFuZG8gb24gdGhlIGVycm9yLlxuXG4gICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgLy8gVGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCB3YXMgc2lsZW5jZWQuXG4gICAgICAgICAgLy8gSWdub3JlIGl0IGFuZCBkb24ndCBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG4gICAgICAgICAgLy8gVGhpcyBpcyBoYW5keSBmb3IgdGVzdGluZyBlcnJvciBib3VuZGFyaWVzIHdpdGhvdXQgbm9pc2UuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFRoZSBlcnJvciBpcyBmYXRhbC4gU2luY2UgdGhlIHNpbGVuY2luZyBtaWdodCBoYXZlXG4gICAgICAgIC8vIGJlZW4gYWNjaWRlbnRhbCwgd2UnbGwgc3VyZmFjZSBpdCBhbnl3YXkuXG4gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBicm93c2VyIHdvdWxkIGhhdmUgc2lsZW5jZWQgdGhlIG9yaWdpbmFsIGVycm9yXG4gICAgICAgIC8vIHNvIHdlJ2xsIHByaW50IGl0IGZpcnN0LCBhbmQgdGhlbiBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG5cblxuICAgICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgICAgIC8vIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyBibG9jaywgc2VlOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzM4NFxuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IHNvdXJjZSA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoc291cmNlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG5cbiAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGJvdW5kYXJ5KSB8fCAnQW5vbnltb3VzJztcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbWJpbmVkTWVzc2FnZSA9IGNvbXBvbmVudE5hbWVNZXNzYWdlICsgXCJcXG5cIiArIGNvbXBvbmVudFN0YWNrICsgXCJcXG5cXG5cIiArIChcIlwiICsgZXJyb3JCb3VuZGFyeU1lc3NhZ2UpOyAvLyBJbiBkZXZlbG9wbWVudCwgd2UgcHJvdmlkZSBvdXIgb3duIG1lc3NhZ2Ugd2l0aCBqdXN0IHRoZSBjb21wb25lbnQgc3RhY2suXG4gICAgICAvLyBXZSBkb24ndCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBlcnJvciBtZXNzYWdlIGFuZCBKUyBzdGFjayBiZWNhdXNlIHRoZSBicm93c2VyXG4gICAgICAvLyBoYXMgYWxyZWFkeSBwcmludGVkIGl0LiBFdmVuIGlmIHRoZSBhcHBsaWNhdGlvbiBzd2FsbG93cyB0aGUgZXJyb3IsIGl0IGlzIHN0aWxsXG4gICAgICAvLyBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgdGhhbmtzIHRvIHRoZSBERVYtb25seSBmYWtlIGV2ZW50IHRyaWNrIGluIFJlYWN0RXJyb3JVdGlscy5cblxuICAgICAgY29uc29sZVsnZXJyb3InXShjb21iaW5lZE1lc3NhZ2UpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gcHJvZHVjdGlvbiwgd2UgcHJpbnQgdGhlIGVycm9yIGRpcmVjdGx5LlxuICAgICAgLy8gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIG1lc3NhZ2UsIHRoZSBKUyBzdGFjaywgYW5kIGFueXRoaW5nIHRoZSBicm93c2VyIHdhbnRzIHRvIHNob3cuXG4gICAgICAvLyBXZSBwYXNzIHRoZSBlcnJvciBvYmplY3QgaW5zdGVhZCBvZiBjdXN0b20gbWVzc2FnZSBzbyB0aGF0IHRoZSBicm93c2VyIGRpc3BsYXlzIHRoZSBlcnJvciBuYXRpdmVseS5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdywgb3IgUmVhY3QgaW50ZXJuYWwgc3RhdGUgd2lsbCBnZXQgbWVzc2VkIHVwLlxuICAgIC8vIElmIGNvbnNvbGUuZXJyb3IgaXMgb3ZlcnJpZGRlbiwgb3IgbG9nQ2FwdHVyZWRFcnJvcigpIHNob3dzIGEgZGlhbG9nIHRoYXQgdGhyb3dzLFxuICAgIC8vIHdlIHdhbnQgdG8gcmVwb3J0IHRoaXMgZXJyb3Igb3V0c2lkZSBvZiB0aGUgbm9ybWFsIHN0YWNrIGFzIGEgbGFzdCByZXNvcnQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzE4OFxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUG9zc2libHlXZWFrTWFwJDEgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpOyAvLyBVbm1vdW50IHRoZSByb290IGJ5IHJlbmRlcmluZyBudWxsLlxuXG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBudWxsXG4gIH07XG4gIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgb25VbmNhdWdodEVycm9yKGVycm9yKTtcbiAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICB9O1xuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmaWJlci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtcblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgdXBkYXRlLnBheWxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yJDEpO1xuICAgIH07XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGluc3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgaWYgKGluc3QgIT09IG51bGwgJiYgdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuXG4gICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUbyBwcmVzZXJ2ZSB0aGUgcHJlZXhpc3RpbmcgcmV0cnkgYmVoYXZpb3Igb2YgZXJyb3IgYm91bmRhcmllcyxcbiAgICAgICAgLy8gd2Uga2VlcCB0cmFjayBvZiB3aGljaCBvbmVzIGFscmVhZHkgZmFpbGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgICAgICAvLyBUaGlzIGdldHMgcmVzZXQgYmVmb3JlIHdlIHlpZWxkIGJhY2sgdG8gdGhlIGJyb3dzZXIuXG4gICAgICAgIC8vIFRPRE86IFdhcm4gaW4gc3RyaWN0IG1vZGUgaWYgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzXG4gICAgICAgIC8vIG5vdCBkZWZpbmVkLlxuICAgICAgICBtYXJrTGVnYWN5RXJyb3JCb3VuZGFyeUFzRmFpbGVkKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHRoaXMuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IkMSwge1xuICAgICAgICBjb21wb25lbnRTdGFjazogc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnXG4gICAgICB9KTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIElmIGNvbXBvbmVudERpZENhdGNoIGlzIHRoZSBvbmx5IGVycm9yIGJvdW5kYXJ5IG1ldGhvZCBkZWZpbmVkLFxuICAgICAgICAgIC8vIHRoZW4gaXQgbmVlZHMgdG8gY2FsbCBzZXRTdGF0ZSB0byByZWNvdmVyIGZyb20gZXJyb3JzLlxuICAgICAgICAgIC8vIElmIG5vIHN0YXRlIHVwZGF0ZSBpcyBzY2hlZHVsZWQgdGhlbiB0aGUgYm91bmRhcnkgd2lsbCBzd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUoZmliZXIubGFuZXMsIFN5bmNMYW5lKSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzOiBFcnJvciBib3VuZGFyaWVzIHNob3VsZCBpbXBsZW1lbnQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkuICcgKyAnSW4gdGhhdCBtZXRob2QsIHJldHVybiBhIHN0YXRlIHVwZGF0ZSB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2Ugb3IgZmFsbGJhY2sgVUkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBBdHRhY2ggYSBwaW5nIGxpc3RlbmVyXG4gIC8vXG4gIC8vIFRoZSBkYXRhIG1pZ2h0IHJlc29sdmUgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gY29tbWl0IHRoZSBmYWxsYmFjay4gT3IsXG4gIC8vIGluIHRoZSBjYXNlIG9mIGEgcmVmcmVzaCwgd2UnbGwgbmV2ZXIgY29tbWl0IGEgZmFsbGJhY2suIFNvIHdlIG5lZWQgdG9cbiAgLy8gYXR0YWNoIGEgbGlzdGVuZXIgbm93LiBXaGVuIGl0IHJlc29sdmVzIChcInBpbmdzXCIpLCB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdG9cbiAgLy8gdHJ5IHJlbmRlcmluZyB0aGUgdHJlZSBhZ2Fpbi5cbiAgLy9cbiAgLy8gT25seSBhdHRhY2ggYSBsaXN0ZW5lciBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzXG4gIC8vIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIC8vXG4gIC8vIFdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FrZWFibGUudGhlbihwaW5nLCBwaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBSZXRyeSBsaXN0ZW5lclxuICAvL1xuICAvLyBJZiB0aGUgZmFsbGJhY2sgZG9lcyBjb21taXQsIHdlIG5lZWQgdG8gYXR0YWNoIGEgZGlmZmVyZW50IHR5cGUgb2ZcbiAgLy8gbGlzdGVuZXIuIFRoaXMgb25lIHNjaGVkdWxlcyBhbiB1cGRhdGUgb24gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IHRvIHR1cm5cbiAgLy8gdGhlIGZhbGxiYWNrIHN0YXRlIG9mZi5cbiAgLy9cbiAgLy8gU3Rhc2ggdGhlIHdha2VhYmxlIG9uIHRoZSBib3VuZGFyeSBmaWJlciBzbyB3ZSBjYW4gYWNjZXNzIGl0IGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIHdha2VhYmxlIHJlc29sdmVzLCB3ZSdsbCBhdHRlbXB0IHRvIHJlbmRlciB0aGUgYm91bmRhcnlcbiAgLy8gYWdhaW4gKFwicmV0cnlcIikuXG4gIHZhciB3YWtlYWJsZXMgPSBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgPT09IG51bGwpIHtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSBuZXcgU2V0KCk7XG4gICAgdXBkYXRlUXVldWUuYWRkKHdha2VhYmxlKTtcbiAgICBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWU7XG4gIH0gZWxzZSB7XG4gICAgd2FrZWFibGVzLmFkZCh3YWtlYWJsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBBIGxlZ2FjeSBtb2RlIFN1c3BlbnNlIHF1aXJrLCBvbmx5IHJlbGV2YW50IHRvIGhvb2sgY29tcG9uZW50cy5cblxuXG4gIHZhciB0YWcgPSBzb3VyY2VGaWJlci50YWc7XG5cbiAgaWYgKChzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgKHRhZyA9PT0gRnVuY3Rpb25Db21wb25lbnQgfHwgdGFnID09PSBGb3J3YXJkUmVmIHx8IHRhZyA9PT0gU2ltcGxlTWVtb0NvbXBvbmVudCkpIHtcbiAgICB2YXIgY3VycmVudFNvdXJjZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IGN1cnJlbnRTb3VyY2UudXBkYXRlUXVldWU7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gY3VycmVudFNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpIHtcbiAgdmFyIG5vZGUgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCAmJiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gLy8gVGhpcyBib3VuZGFyeSBhbHJlYWR5IGNhcHR1cmVkIGR1cmluZyB0aGlzIHJlbmRlci4gQ29udGludWUgdG8gdGhlIG5leHRcbiAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgbWFya3MgYSBTdXNwZW5zZSBib3VuZGFyeSBzbyB0aGF0IHdoZW4gd2UncmUgdW53aW5kaW5nIHRoZSBzdGFjayxcbiAgLy8gaXQgY2FwdHVyZXMgdGhlIHN1c3BlbmRlZCBcImV4Y2VwdGlvblwiIGFuZCBkb2VzIGEgc2Vjb25kIChmYWxsYmFjaykgcGFzcy5cbiAgaWYgKChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIExlZ2FjeSBNb2RlIFN1c3BlbnNlXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgYm91bmRhcnkgaXMgaW4gbGVnYWN5IG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgIC8vIHN1c3BlbmQgdGhlIGNvbW1pdC4gUHJldGVuZCBhcyBpZiB0aGUgc3VzcGVuZGVkIGNvbXBvbmVudCByZW5kZXJlZFxuICAgIC8vIG51bGwgYW5kIGtlZXAgcmVuZGVyaW5nLiBXaGVuIHRoZSBTdXNwZW5zZSBib3VuZGFyeSBjb21wbGV0ZXMsXG4gICAgLy8gd2UnbGwgZG8gYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ID09PSByZXR1cm5GaWJlcikge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZXJlIHdlIHN1c3BlbmRlZCB3aGlsZSByZWNvbmNpbGluZyB0aGUgY2hpbGRyZW4gb2ZcbiAgICAgIC8vIGEgU3VzcGVuc2UgYm91bmRhcnkncyBpbm5lciBPZmZzY3JlZW4gd3JhcHBlciBmaWJlci4gVGhpcyBoYXBwZW5zXG4gICAgICAvLyB3aGVuIGEgUmVhY3QubGF6eSBjb21wb25lbnQgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgICAvL1xuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcmllcyBhcmUgaW1wbGVtZW50ZWQgYXMgbXVsdGlwbGUgZmliZXJzLCBidXQgdGhleVxuICAgICAgLy8gYXJlIGEgc2luZ2xlIGNvbmNlcHR1YWwgdW5pdC4gVGhlIGxlZ2FjeSBtb2RlIGJlaGF2aW9yIHdoZXJlIHdlXG4gICAgICAvLyBwcmV0ZW5kIHRoZSBzdXNwZW5kZWQgZmliZXIgY29tbWl0dGVkIGFzIGBudWxsYCB3b24ndCB3b3JrLFxuICAgICAgLy8gYmVjYXVzZSBpbiB0aGlzIGNhc2UgdGhlIFwic3VzcGVuZGVkXCIgZmliZXIgaXMgdGhlIGlubmVyXG4gICAgICAvLyBPZmZzY3JlZW4gd3JhcHBlci5cbiAgICAgIC8vXG4gICAgICAvLyBCZWNhdXNlIHRoZSBjb250ZW50cyBvZiB0aGUgYm91bmRhcnkgaGF2ZW4ndCBzdGFydGVkIHJlbmRlcmluZ1xuICAgICAgLy8geWV0IChpLmUuIG5vdGhpbmcgaW4gdGhlIHRyZWUgaGFzIHBhcnRpYWxseSByZW5kZXJlZCkgd2UgY2FuXG4gICAgICAvLyBzd2l0Y2ggdG8gdGhlIHJlZ3VsYXIsIGNvbmN1cnJlbnQgbW9kZSBiZWhhdmlvcjogbWFyayB0aGVcbiAgICAgIC8vIGJvdW5kYXJ5IHdpdGggU2hvdWxkQ2FwdHVyZSBhbmQgZW50ZXIgdGhlIHVud2luZCBwaGFzZS5cbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgc291cmNlRmliZXIuZmxhZ3MgfD0gRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZTsgLy8gV2UncmUgZ29pbmcgdG8gY29tbWl0IHRoaXMgZmliZXIgZXZlbiB0aG91Z2ggaXQgZGlkbid0IGNvbXBsZXRlLlxuICAgICAgLy8gQnV0IHdlIHNob3VsZG4ndCBjYWxsIGFueSBsaWZlY3ljbGUgbWV0aG9kcyBvciBjYWxsYmFja3MuIFJlbW92ZVxuICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgc291cmNlRmliZXIuZmxhZ3MgJj0gfihMaWZlY3ljbGVFZmZlY3RNYXNrIHwgSW5jb21wbGV0ZSk7XG5cbiAgICAgIGlmIChzb3VyY2VGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQuIENoYW5nZSB0aGUgdGFnIHNvIGl0J3Mgbm90IG1pc3Rha2VuIGZvciBhXG4gICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50IGlmIGl0IGlzIGRlbGV0ZWQuXG4gICAgICAgICAgc291cmNlRmliZXIudGFnID0gSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdoZW4gd2UgdHJ5IHJlbmRlcmluZyBhZ2Fpbiwgd2Ugc2hvdWxkIG5vdCByZXVzZSB0aGUgY3VycmVudCBmaWJlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCdzIGtub3duIHRvIGJlIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gVXNlIGEgZm9yY2UgdXBkYXRlIHRvXG4gICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIFN5bmNMYW5lKTtcbiAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG4gICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLiBNYXJrIGl0IHdpdGggU3luYyBwcmlvcml0eSB0b1xuICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xuICB9IC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuICAvL1xuICAvLyBBZnRlciB0aGlzIHdlJ2xsIHVzZSBhIHNldCBvZiBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXNcbiAgLy8gcmVuZGVyIHBhc3Mgd2lsbCBydW4gdG8gY29tcGxldGlvbiBvciByZXN0YXJ0IG9yIFwic3VzcGVuZFwiIHRoZSBjb21taXQuXG4gIC8vIFRoZSBhY3R1YWwgbG9naWMgZm9yIHRoaXMgaXMgc3ByZWFkIG91dCBpbiBkaWZmZXJlbnQgcGxhY2VzLlxuICAvL1xuICAvLyBUaGlzIGZpcnN0IHByaW5jaXBsZSBpcyB0aGF0IGlmIHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2hlbiB3ZSBjb21wbGV0ZVxuICAvLyBhIHJvb3QsIHRoZW4gd2Ugc2hvdWxkIGFsc28gcmVzdGFydCBpZiB3ZSBnZXQgYW4gdXBkYXRlIG9yIHBpbmcgdGhhdFxuICAvLyBtaWdodCB1bnN1c3BlbmQgaXQsIGFuZCB2aWNlIHZlcnNhLiBUaGUgb25seSByZWFzb24gdG8gc3VzcGVuZCBpc1xuICAvLyBiZWNhdXNlIHlvdSB0aGluayB5b3UgbWlnaHQgd2FudCB0byByZXN0YXJ0IGJlZm9yZSBjb21taXR0aW5nLiBIb3dldmVyLFxuICAvLyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVzdGFydCBvbmx5IHdoaWxlIGluIHRoZSBwZXJpb2Qgd2UncmUgc3VzcGVuZGVkLlxuICAvL1xuICAvLyBSZXN0YXJ0aW5nIHRvbyBhZ2dyZXNzaXZlbHkgaXMgYWxzbyBub3QgZ29vZCBiZWNhdXNlIGl0IHN0YXJ2ZXMgb3V0IGFueVxuICAvLyBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gU28gd2UgdXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZW4uXG4gIC8vIFN1c3BlbnNlIEhldXJpc3RpY3NcbiAgLy9cbiAgLy8gSWYgbm90aGluZyB0aHJldyBhIFByb21pc2Ugb3IgYWxsIHRoZSBzYW1lIGZhbGxiYWNrcyBhcmUgYWxyZWFkeSBzaG93aW5nLFxuICAvLyB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlbmRlciBvZiBhIG5ldyB0cmVlIG9mIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gIC8vIHRob3NlIHRyaWdnZXIgYSBmYWxsYmFjaywgdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgY2FuIHNob3cgdGhlIGluaXRpYWwgbG9hZGluZyBzdGF0ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLlxuICAvL1xuICAvLyBJZiB3ZSBoaXQgYSBcIkRlbGF5ZWRcIiBjYXNlLCBzdWNoIGFzIHdoZW4gd2UnZCBzd2l0Y2ggZnJvbSBjb250ZW50IGJhY2sgaW50b1xuICAvLyBhIGZhbGxiYWNrLCB0aGVuIHdlIHNob3VsZCBhbHdheXMgc3VzcGVuZC9yZXN0YXJ0LiBUcmFuc2l0aW9ucyBhcHBseVxuICAvLyB0byB0aGlzIGNhc2UuIElmIG5vbmUgaXMgZGVmaW5lZCwgSk5EIGlzIHVzZWQgaW5zdGVhZC5cbiAgLy9cbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgYW5kIGl0IGdldHMgXCJyZXRyaWVkXCIsIGFsbG93aW5nIHVzIHRvIHNob3dcbiAgLy8gYW5vdGhlciBsZXZlbCwgYnV0IHRoZXJlJ3Mgc3RpbGwgYW4gaW5uZXIgYm91bmRhcnkgdGhhdCB3b3VsZCBzaG93IGEgZmFsbGJhY2ssXG4gIC8vIHRoZW4gd2Ugc3VzcGVuZC9yZXN0YXJ0IGZvciA1MDBtcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNob3dlZCBhIGZhbGxiYWNrXG4gIC8vIGFueXdoZXJlIGluIHRoZSB0cmVlLiBUaGlzIGVmZmVjdGl2ZWx5IHRocm90dGxlcyBwcm9ncmVzc2l2ZSBsb2FkaW5nIGludG8gYVxuICAvLyBjb25zaXN0ZW50IHRyYWluIG9mIGNvbW1pdHMuIFRoaXMgYWxzbyBnaXZlcyB1cyBhbiBvcHBvcnR1bml0eSB0byByZXN0YXJ0IHRvXG4gIC8vIGdldCB0byB0aGUgY29tcGxldGVkIHN0YXRlIHNsaWdodGx5IGVhcmxpZXIuXG4gIC8vXG4gIC8vIElmIHRoZXJlJ3MgYW1iaWd1aXR5IGR1ZSB0byBiYXRjaGluZyBpdCdzIHJlc29sdmVkIGluIHByZWZlcmVuY2Ugb2Y6XG4gIC8vIDEpIFwiZGVsYXllZFwiLCAyKSBcImluaXRpYWwgcmVuZGVyXCIsIDMpIFwicmV0cnlcIi5cbiAgLy9cbiAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBhIFwiYnVzeVwiIHN0YXRlIGRvZXNuJ3QgZ2V0IGZvcmNlIGNvbW1pdHRlZC4gV2Ugd2FudCB0b1xuICAvLyBlbnN1cmUgdGhhdCBuZXcgaW5pdGlhbCBsb2FkaW5nIHN0YXRlcyBjYW4gY29tbWl0IGFzIHNvb24gYXMgcG9zc2libGUuXG5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIFRPRE86IEkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSBub3cgdXNlIGBEaWRDYXB0dXJlYCBpblxuICAvLyB0aGUgYmVnaW4gcGhhc2UgdG8gcHJldmVudCBhbiBlYXJseSBiYWlsb3V0LlxuXG4gIHN1c3BlbnNlQm91bmRhcnkubGFuZXMgPSByb290UmVuZGVyTGFuZXM7XG4gIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLlxuICBzb3VyY2VGaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCByb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHdha2VhYmxlLiBUaGUgY29tcG9uZW50IHN1c3BlbmRlZC5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcbiAgICByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlcik7XG5cbiAgICB7XG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhciBzdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpO1xuXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gV2Ugb25seSBhdHRhY2ggcGluZyBsaXN0ZW5lcnMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gICAgICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG5cbiAgICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBib3VuZGFyeSB3YXMgZm91bmQuIFVubGVzcyB0aGlzIGlzIGEgc3luYyB1cGRhdGUsIHRoaXMgaXMgT0suXG4gICAgICAvLyBXZSBjYW4gc3VzcGVuZCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cbiAgICAgIGlmICghaW5jbHVkZXNTeW5jTGFuZShyb290UmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3luYyB1cGRhdGUuIFN1c3BlbmQuIFNpbmNlIHdlJ3JlIG5vdCBhY3RpdmF0aW5nIGFcbiAgICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIHRoaXMgd2lsbCB1bndpbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgd2l0aG91dFxuICAgICAgICAvLyBwZXJmb3JtaW5nIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIGEgZmFsbGJhY2suIChUaGlzIGlzIGFyZ3VhYmx5IGhvd1xuICAgICAgICAvLyByZWZyZXNoIHRyYW5zaXRpb25zIHNob3VsZCB3b3JrLCB0b28sIHNpbmNlIHdlJ3JlIG5vdCBnb2luZyB0byBjb21taXRcbiAgICAgICAgLy8gdGhlIGZhbGxiYWNrcyBhbnl3YXkuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGNhc2UgYWxzbyBhcHBsaWVzIHRvIGluaXRpYWwgaHlkcmF0aW9uLlxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBUaGlzIGlzIGEgc3luYy9kaXNjcmV0ZSB1cGRhdGUuIFdlIHRyZWF0IHRoaXMgY2FzZSBsaWtlIGFuIGVycm9yXG4gICAgICAvLyBiZWNhdXNlIGRpc2NyZXRlIHJlbmRlcnMgYXJlIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBjb21wbGV0ZSB0cmVlXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggZXh0ZXJuYWwgc3RhdGUuXG5cblxuICAgICAgdmFyIHVuY2F1Z2h0U3VzcGVuc2VFcnJvciA9IG5ldyBFcnJvcignQSBjb21wb25lbnQgc3VzcGVuZGVkIHdoaWxlIHJlc3BvbmRpbmcgdG8gc3luY2hyb25vdXMgaW5wdXQuIFRoaXMgJyArICd3aWxsIGNhdXNlIHRoZSBVSSB0byBiZSByZXBsYWNlZCB3aXRoIGEgbG9hZGluZyBpbmRpY2F0b3IuIFRvICcgKyAnZml4LCB1cGRhdGVzIHRoYXQgc3VzcGVuZCBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ3dpdGggc3RhcnRUcmFuc2l0aW9uLicpOyAvLyBJZiB3ZSdyZSBvdXRzaWRlIGEgdHJhbnNpdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGVycm9yIHBhdGguXG4gICAgICAvLyBUaGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIG5lYXJlc3Qgc3VzcGVuc2UgYm91bmRhcnkuXG5cbiAgICAgIHZhbHVlID0gdW5jYXVnaHRTdXNwZW5zZUVycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBlcnJvciwgbm90IGEgU3VzcGVuc2Ugd2FrZWFibGUuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuXG4gICAgICB2YXIgX3N1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7IC8vIElmIHRoZSBlcnJvciB3YXMgdGhyb3duIGR1cmluZyBoeWRyYXRpb24sIHdlIG1heSBiZSBhYmxlIHRvIHJlY292ZXIgYnlcbiAgICAgIC8vIGRpc2NhcmRpbmcgdGhlIGRlaHlkcmF0ZWQgY29udGVudCBhbmQgc3dpdGNoaW5nIHRvIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIC8vIEluc3RlYWQgb2Ygc3VyZmFjaW5nIHRoZSBlcnJvciwgZmluZCB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeVxuICAgICAgLy8gYW5kIHJlbmRlciBpdCBhZ2FpbiB3aXRob3V0IGh5ZHJhdGlvbi5cblxuXG4gICAgICBpZiAoX3N1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmIFNob3VsZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCB0cnkgcmVuZGVyaW5nIHRoZSBub3JtYWxcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhZ2Fpbiwgbm90IHRoZSBmYWxsYmFjay5cbiAgICAgICAgICBfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShfc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBFdmVuIHRob3VnaCB0aGUgdXNlciBtYXkgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgZXJyb3IsIHdlIHNob3VsZFxuICAgICAgICAvLyBzdGlsbCBsb2cgaXQgc28gaXQgY2FuIGJlIGZpeGVkLlxuXG4gICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHJlbmRlckRpZEVycm9yKHZhbHVlKTsgLy8gV2UgZGlkbid0IGZpbmQgYSBib3VuZGFyeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIHR5cGUgb2YgZXhjZXB0aW9uLiBTdGFydFxuICAvLyBvdmVyIGFuZCB0cmF2ZXJzZSBwYXJlbnQgcGF0aCBhZ2FpbiwgdGhpcyB0aW1lIHRyZWF0aW5nIHRoZSBleGNlcHRpb25cbiAgLy8gYXMgYW4gZXJyb3IuXG5cbiAgdmFyIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpO1xuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF9lcnJvckluZm8sIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gQ2FwdHVyZSBhbmQgcmV0cnlcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MgJiYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG5cbiAgICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBfbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBlcnJvckluZm8sIF9sYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgc3VzcGVuZHMuIEl0IHJldHVybnMgdGhlXG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5BYm91dEJhZENsYXNzO1xudmFyIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzO1xudmFyIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHM7XG52YXIgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXI7XG52YXIgZGlkV2FybkFib3V0VGFpbE9wdGlvbnM7XG5cbntcbiAgZGlkV2FybkFib3V0QmFkQ2xhc3MgPSB7fTtcbiAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnMgPSB7fTtcbiAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlciA9IHt9O1xuICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucyA9IHt9O1xufVxuXG5mdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIElmIHRoaXMgaXMgYSBmcmVzaCBuZXcgY29tcG9uZW50IHRoYXQgaGFzbid0IGJlZW4gcmVuZGVyZWQgeWV0LCB3ZVxuICAgIC8vIHdvbid0IHVwZGF0ZSBpdHMgY2hpbGQgc2V0IGJ5IGFwcGx5aW5nIG1pbmltYWwgc2lkZS1lZmZlY3RzLiBJbnN0ZWFkLFxuICAgIC8vIHdlIHdpbGwgYWRkIHRoZW0gYWxsIHRvIHRoZSBjaGlsZCBiZWZvcmUgaXQgZ2V0cyByZW5kZXJlZC4gVGhhdCBtZWFuc1xuICAgIC8vIHdlIGNhbiBvcHRpbWl6ZSB0aGlzIHJlY29uY2lsaWF0aW9uIHBhc3MgYnkgbm90IHRyYWNraW5nIHNpZGUtZWZmZWN0cy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZSBjdXJyZW50IGNoaWxkIGlzIHRoZSBzYW1lIGFzIHRoZSB3b3JrIGluIHByb2dyZXNzLCBpdCBtZWFucyB0aGF0XG4gICAgLy8gd2UgaGF2ZW4ndCB5ZXQgc3RhcnRlZCBhbnkgd29yayBvbiB0aGVzZSBjaGlsZHJlbi4gVGhlcmVmb3JlLCB3ZSB1c2VcbiAgICAvLyB0aGUgY2xvbmUgYWxnb3JpdGhtIHRvIGNyZWF0ZSBhIGNvcHkgb2YgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuLlxuICAgIC8vIElmIHdlIGhhZCBhbnkgcHJvZ3Jlc3NlZCB3b3JrIGFscmVhZHksIHRoYXQgaXMgaW52YWxpZCBhdCB0aGlzIHBvaW50IHNvXG4gICAgLy8gbGV0J3MgdGhyb3cgaXQgb3V0LlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyBmb3JrIG9mIHJlY29uY2lsZUNoaWxkcmVuLiBJdCdzIHVzZWQgaW4gY2FzZXMgd2hlcmUgd2VcbiAgLy8gd2FudCB0byByZWNvbmNpbGUgd2l0aG91dCBtYXRjaGluZyBhZ2FpbnN0IHRoZSBleGlzdGluZyBzZXQuIFRoaXMgaGFzIHRoZVxuICAvLyBlZmZlY3Qgb2YgYWxsIGN1cnJlbnQgY2hpbGRyZW4gYmVpbmcgdW5tb3VudGVkOyBldmVuIGlmIHRoZSB0eXBlIGFuZCBrZXlcbiAgLy8gYXJlIHRoZSBzYW1lLCB0aGUgb2xkIGNoaWxkIGlzIHVubW91bnRlZCBhbmQgYSBuZXcgY2hpbGQgaXMgY3JlYXRlZC5cbiAgLy9cbiAgLy8gVG8gZG8gdGhpcywgd2UncmUgZ29pbmcgdG8gZ28gdGhyb3VnaCB0aGUgcmVjb25jaWxlIGFsZ29yaXRobSB0d2ljZS4gSW5cbiAgLy8gdGhlIGZpcnN0IHBhc3MsIHdlIHNjaGVkdWxlIGEgZGVsZXRpb24gZm9yIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbiBieVxuICAvLyBwYXNzaW5nIG51bGwuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTsgLy8gSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBtb3VudCB0aGUgbmV3IGNoaWxkcmVuLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHdlXG4gIC8vIHBhc3MgbnVsbCBpbiBwbGFjZSBvZiB3aGVyZSB3ZSB1c3VhbGx5IHBhc3MgdGhlIGN1cnJlbnQgY2hpbGQgc2V0LiBUaGlzIGhhc1xuICAvLyB0aGUgZWZmZWN0IG9mIHJlbW91bnRpbmcgYWxsIGNoaWxkcmVuIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVpclxuICAvLyBpZGVudGl0aWVzIG1hdGNoLlxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgdGhlIGZpcnN0IHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciByZW5kZXIgPSBDb21wb25lbnQucmVuZGVyO1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmOyAvLyBUaGUgcmVzdCBpcyBhIGZvcmsgb2YgdXBkYXRlRnVuY3Rpb25Db21wb25lbnRcblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7XG4gICAgYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHZhciB0eXBlID0gQ29tcG9uZW50LnR5cGU7XG5cbiAgICBpZiAoaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSAmJiBDb21wb25lbnQuY29tcGFyZSA9PT0gbnVsbCAmJiAvLyBTaW1wbGVNZW1vQ29tcG9uZW50IGNvZGVwYXRoIGRvZXNuJ3QgcmVzb2x2ZSBvdXRlciBwcm9wcyBlaXRoZXIuXG4gICAgQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG4gICAgICB9IC8vIElmIHRoaXMgaXMgYSBwbGFpbiBmdW5jdGlvbiBjb21wb25lbnQgd2l0aG91dCBkZWZhdWx0IHByb3BzLFxuICAgICAgLy8gYW5kIHdpdGggb25seSB0aGUgZGVmYXVsdCBzaGFsbG93IGNvbXBhcmlzb24sIHdlIHVwZ3JhZGUgaXRcbiAgICAgIC8vIHRvIGEgU2ltcGxlTWVtb0NvbXBvbmVudCB0byBhbGxvdyBmYXN0IHBhdGggdXBkYXRlcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBTaW1wbGVNZW1vQ29tcG9uZW50O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVkVHlwZTtcblxuICAgICAge1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIHR5cGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVzb2x2ZWRUeXBlLCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLm1vZGUsIHJlbmRlckxhbmVzKTtcbiAgICBjaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChfaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgY2hlY2tQcm9wVHlwZXMoX2lubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBUaGlzIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBjaGlsZFxuXG4gIHZhciBoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgPSBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcyk7XG5cbiAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQpIHtcbiAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIHByb3BzIHdpdGggcmVzb2x2ZWQgZGVmYXVsdFByb3BzLFxuICAgIC8vIHVubGlrZSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgd2hpY2ggd2lsbCBiZSB0aGUgdW5yZXNvbHZlZCBvbmVzLlxuICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Q2hpbGQubWVtb2l6ZWRQcm9wczsgLy8gRGVmYXVsdCB0byBzaGFsbG93IGNvbXBhcmlzb25cblxuICAgIHZhciBjb21wYXJlID0gQ29tcG9uZW50LmNvbXBhcmU7XG4gICAgY29tcGFyZSA9IGNvbXBhcmUgIT09IG51bGwgPyBjb21wYXJlIDogc2hhbGxvd0VxdWFsO1xuXG4gICAgaWYgKGNvbXBhcmUocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgbmV4dFByb3BzKTtcbiAgbmV3Q2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgcmV0dXJuIG5ld0NoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgaW5uZXIgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgb3V0ZXJNZW1vVHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuXG4gICAgICBpZiAob3V0ZXJNZW1vVHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgIC8vIFdlIHdhcm4gd2hlbiB5b3UgZGVmaW5lIHByb3BUeXBlcyBvbiBsYXp5KClcbiAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci5cbiAgICAgICAgLy8gSW5uZXIgcHJvcHMgZm9yIG1lbW8gYXJlIHZhbGlkYXRlZCBsYXRlci5cbiAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSBvdXRlck1lbW9UeXBlO1xuICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBpbml0KHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IG51bGw7XG4gICAgICAgIH0gLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cblxuXG4gICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IG91dGVyTWVtb1R5cGUgJiYgb3V0ZXJNZW1vVHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgKFNpbXBsZU1lbW9Db21wb25lbnQgaGFzIG5vIGRlZmF1bHRQcm9wcylcbiAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvdXRlck1lbW9UeXBlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG5cbiAgICBpZiAoc2hhbGxvd0VxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmICYmICggLy8gUHJldmVudCBiYWlsb3V0IGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIGR1ZSB0byBob3QgcmVsb2FkLlxuICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSBjdXJyZW50LnR5cGUgKSkge1xuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlOyAvLyBUaGUgcHJvcHMgYXJlIHNoYWxsb3dseSBlcXVhbC4gUmV1c2UgdGhlIHByZXZpb3VzIHByb3BzIG9iamVjdCwgbGlrZSB3ZVxuICAgICAgLy8gd291bGQgZHVyaW5nIGEgbm9ybWFsIGZpYmVyIGJhaWxvdXQuXG4gICAgICAvL1xuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBzdHJvbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBwcm9wcyBvYmplY3QgaXMgcmVmZXJlbnRpYWxseVxuICAgICAgLy8gZXF1YWwgZHVyaW5nIHVwZGF0ZXMgd2hlcmUgd2UgY2FuJ3QgYmFpbCBvdXQgYW55d2F5IFx1MjAxNCBsaWtlIGlmIHRoZSBwcm9wc1xuICAgICAgLy8gYXJlIHNoYWxsb3dseSBlcXVhbCwgYnV0IHRoZXJlJ3MgYSBsb2NhbCBzdGF0ZSBvciBjb250ZXh0IHVwZGF0ZSBpbiB0aGVcbiAgICAgIC8vIHNhbWUgYmF0Y2guXG4gICAgICAvL1xuICAgICAgLy8gSG93ZXZlciwgYXMgYSBwcmluY2lwbGUsIHdlIHNob3VsZCBhaW0gdG8gbWFrZSB0aGUgYmVoYXZpb3IgY29uc2lzdGVudFxuICAgICAgLy8gYWNyb3NzIGRpZmZlcmVudCB3YXlzIG9mIG1lbW9pemluZyBhIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIFJlYWN0Lm1lbW9cbiAgICAgIC8vIGhhcyBhIGRpZmZlcmVudCBpbnRlcm5hbCBGaWJlciBsYXlvdXQgaWYgeW91IHBhc3MgYSBub3JtYWwgZnVuY3Rpb25cbiAgICAgIC8vIGNvbXBvbmVudCAoU2ltcGxlTWVtb0NvbXBvbmVudCkgdmVyc3VzIGlmIHlvdSBwYXNzIGEgZGlmZmVyZW50IHR5cGVcbiAgICAgIC8vIGxpa2UgZm9yd2FyZFJlZiAoTWVtb0NvbXBvbmVudCkuIEJ1dCB0aGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC5cbiAgICAgIC8vIFdyYXBwaW5nIGEgY29tcG9uZW50IGluIGZvcndhcmRSZWYgKG9yIFJlYWN0LmxhenksIGV0Yykgc2hvdWxkbid0XG4gICAgICAvLyBhZmZlY3Qgd2hldGhlciB0aGUgcHJvcHMgb2JqZWN0IGlzIHJldXNlZCBkdXJpbmcgYSBiYWlsb3V0LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBuZXh0UHJvcHMgPSBwcmV2UHJvcHM7XG5cbiAgICAgIGlmICghY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoZSBwZW5kaW5nIGxhbmVzIHdlcmUgY2xlYXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGJlZ2luV29yay4gV2UncmVcbiAgICAgICAgLy8gYWJvdXQgdG8gYmFpbCBvdXQsIGJ1dCB0aGVyZSBtaWdodCBiZSBvdGhlciBsYW5lcyB0aGF0IHdlcmVuJ3RcbiAgICAgICAgLy8gaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyLiBVc3VhbGx5LCB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlXG4gICAgICAgIC8vIHJlbWFpbmluZyB1cGRhdGVzIGlzIGFjY3VtdWxhdGVkIGR1cmluZyB0aGUgZXZhbHVhdGlvbiBvZiB0aGVcbiAgICAgICAgLy8gY29tcG9uZW50IChpLmUuIHdoZW4gcHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlKS4gQnV0IHNpbmNlIHNpbmNlXG4gICAgICAgIC8vIHdlJ3JlIGJhaWxpbmcgb3V0IGVhcmx5ICp3aXRob3V0KiBldmFsdWF0aW5nIHRoZSBjb21wb25lbnQsIHdlIG5lZWRcbiAgICAgICAgLy8gdG8gYWNjb3VudCBmb3IgaXQgaGVyZSwgdG9vLiBSZXNldCB0byB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZmliZXIuXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgb25seSBhcHBsaWVzIHRvIFNpbXBsZU1lbW9Db21wb25lbnQsIG5vdCBNZW1vQ29tcG9uZW50LFxuICAgICAgICAvLyBiZWNhdXNlIGEgTWVtb0NvbXBvbmVudCBmaWJlciBkb2VzIG5vdCBoYXZlIGhvb2tzIG9yIGFuIHVwZGF0ZSBxdWV1ZTtcbiAgICAgICAgLy8gcmF0aGVyLCBpdCB3cmFwcyBhcm91bmQgYW4gaW5uZXIgY29tcG9uZW50LCB3aGljaCBtYXkgb3IgbWF5IG5vdFxuICAgICAgICAvLyBjb250YWlucyBob29rcy5cbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGUgcmVzZXQgYXQgaW4gYmVnaW5Xb3JrIG91dCBvZiB0aGUgY29tbW9uIHBhdGggc28gdGhhdFxuICAgICAgICAvLyB0aGlzIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJldlN0YXRlID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSA6IG51bGw7XG5cbiAgaWYgKG5leHRQcm9wcy5tb2RlID09PSAnaGlkZGVuJyB8fCBlbmFibGVMZWdhY3lIaWRkZW4gKSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgaGlkZGVuIHRyZWUuXG4gICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIGxlZ2FjeSBzeW5jIG1vZGUsIGRvbid0IGRlZmVyIHRoZSBzdWJ0cmVlLiBSZW5kZXIgaXQgbm93LlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaG93IE9mZnNjcmVlbiBzaG91bGQgd29yayB3aXRoIHRyYW5zaXRpb25zIGluIHRoZSBmdXR1cmVcbiAgICAgIHZhciBuZXh0U3RhdGUgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXh0U3RhdGU7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICB2YXIgc3Bhd25lZENhY2hlUG9vbCA9IG51bGw7IC8vIFdlJ3JlIGhpZGRlbiwgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcgYXQgT2Zmc2NyZWVuLiBXZSB3aWxsIGJhaWwgb3V0XG4gICAgICAvLyBhbmQgcmVzdW1lIHRoaXMgdHJlZSBsYXRlci5cblxuICAgICAgdmFyIG5leHRCYXNlTGFuZXM7XG5cbiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZCYXNlTGFuZXMgPSBwcmV2U3RhdGUuYmFzZUxhbmVzO1xuICAgICAgICBuZXh0QmFzZUxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2QmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0QmFzZUxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgICB9IC8vIFNjaGVkdWxlIHRoaXMgZmliZXIgdG8gcmUtcmVuZGVyIGF0IG9mZnNjcmVlbiBwcmlvcml0eS4gVGhlbiBiYWlsb3V0LlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGxhbmVUb0xhbmVzKE9mZnNjcmVlbkxhbmUpO1xuICAgICAgdmFyIF9uZXh0U3RhdGUgPSB7XG4gICAgICAgIGJhc2VMYW5lczogbmV4dEJhc2VMYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBzcGF3bmVkQ2FjaGVQb29sLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG5cblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBuZXh0QmFzZUxhbmVzKTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCByZW5kZXIuIFRoZSBzdXJyb3VuZGluZyB2aXNpYmxlIGNvbnRlbnQgaGFzIGFscmVhZHlcbiAgICAgIC8vIGNvbW1pdHRlZC4gTm93IHdlIHJlc3VtZSByZW5kZXJpbmcgdGhlIGhpZGRlbiB0cmVlLlxuICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLlxuICAgICAgdmFyIF9uZXh0U3RhdGUyID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC5cblxuICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lcztcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZW5kZXJpbmcgYSB2aXNpYmxlIHRyZWUuXG4gICAgdmFyIF9zdWJ0cmVlUmVuZGVyTGFuZXM7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBnb2luZyBmcm9tIGhpZGRlbiAtPiB2aXNpYmxlLlxuICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMocHJldlN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugd2VyZW4ndCBwcmV2aW91c2x5IGhpZGRlbiwgYW5kIHdlIHN0aWxsIGFyZW4ndCwgc28gdGhlcmUncyBub3RoaW5nXG4gICAgICAvLyBzcGVjaWFsIHRvIGRvLiBOZWVkIHRvIHB1c2ggdG8gdGhlIHN0YWNrIHJlZ2FyZGxlc3MsIHRob3VnaCwgdG8gYXZvaWRcbiAgICAgIC8vIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIH1cblxuICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgX3N1YnRyZWVSZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn0gLy8gTm90ZTogVGhlc2UgaGFwcGVuIHRvIGhhdmUgaWRlbnRpY2FsIGJlZ2luIHBoYXNlcywgZm9yIG5vdy4gV2Ugc2hvdWxkbid0IGhvbGRcblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG5cbiAgICB7XG4gICAgICAvLyBSZXNldCBlZmZlY3QgZHVyYXRpb25zIGZvciB0aGUgbmV4dCBldmVudHVhbCBlZmZlY3QgcGhhc2UuXG4gICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsICYmIHJlZiAhPT0gbnVsbCB8fCBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSByZWYpIHtcbiAgICAvLyBTY2hlZHVsZSBhIFJlZiBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAgICB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBlcnJvci5cbiAgICBzd2l0Y2ggKHNob3VsZEVycm9yKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUT0RPIFRoaXMgd2F5IG9mIHJlc2V0dGluZyB0aGUgZXJyb3IgYm91bmRhcnkgc3RhdGUgaXMgYSBoYWNrLlxuICAgICAgICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuXG4gICAgICAgICAgdmFyIHRlbXBJbnN0YW5jZSA9IG5ldyBjdG9yKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsIF9pbnN0YW5jZS5jb250ZXh0KTtcbiAgICAgICAgICB2YXIgc3RhdGUgPSB0ZW1wSW5zdGFuY2Uuc3RhdGU7XG5cbiAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUoX2luc3RhbmNlLCBzdGF0ZSwgbnVsbCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG5cbiAgICAgICAgICB2YXIgZXJyb3IkMSA9IG5ldyBFcnJvcignU2ltdWxhdGVkIGVycm9yIGNvbWluZyBmcm9tIERldlRvb2xzJyk7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgd29ya0luUHJvZ3Jlc3MpLCBsYW5lKTtcbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRVcGRhdGU7XG5cbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuXG4gICAgY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMpO1xuICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICBzaG91bGRVcGRhdGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbiBhIHJlc3VtZSwgd2UnbGwgYWxyZWFkeSBoYXZlIGFuIGluc3RhbmNlIHdlIGNhbiByZXVzZS5cbiAgICBzaG91bGRVcGRhdGUgPSByZXN1bWVNb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgc2hvdWxkVXBkYXRlID0gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBuZXh0VW5pdE9mV29yayA9IGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICB2YXIgaW5zdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChzaG91bGRVcGRhdGUgJiYgaW5zdC5wcm9wcyAhPT0gbmV4dFByb3BzKSB7XG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgZXJyb3IoJ0l0IGxvb2tzIGxpa2UgJXMgaXMgcmVhc3NpZ25pbmcgaXRzIG93biBgdGhpcy5wcm9wc2Agd2hpbGUgcmVuZGVyaW5nLiAnICsgJ1RoaXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgY2FuIGxlYWQgdG8gY29uZnVzaW5nIGJ1Z3MuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ2EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0VW5pdE9mV29yaztcbn1cblxuZnVuY3Rpb24gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcykge1xuICAvLyBSZWZzIHNob3VsZCB1cGRhdGUgZXZlbiBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZVxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGRpZENhcHR1cmVFcnJvciA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBDb250ZXh0IHByb3ZpZGVycyBzaG91bGQgZGVmZXIgdG8gc0NVIGZvciByZW5kZXJpbmdcbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gUmVyZW5kZXJcblxuICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIG5leHRDaGlsZHJlbjtcblxuICBpZiAoZGlkQ2FwdHVyZUVycm9yICYmIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgd2UgY2FwdHVyZWQgYW4gZXJyb3IsIGJ1dCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXMgbm90IGRlZmluZWQsXG4gICAgLy8gdW5tb3VudCBhbGwgdGhlIGNoaWxkcmVuLiBjb21wb25lbnREaWRDYXRjaCB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSB0b1xuICAgIC8vIHJlLXJlbmRlciBhIGZhbGxiYWNrLiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBtaWdyYXRlIGV2ZXJ5b25lIHRvXG4gICAgLy8gdGhlIG5ldyBBUEkuXG4gICAgLy8gVE9ETzogV2FybiBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgIG5leHRDaGlsZHJlbiA9IG51bGw7XG5cbiAgICB7XG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mXG4gICAgLy8gdGhlIGV4aXN0aW5nIGNoaWxkcmVuLiBDb25jZXB0dWFsbHksIHRoZSBub3JtYWwgY2hpbGRyZW4gYW5kIHRoZSBjaGlsZHJlblxuICAgIC8vIHRoYXQgYXJlIHNob3duIG9uIGVycm9yIGFyZSB0d28gZGlmZmVyZW50IHNldHMsIHNvIHdlIHNob3VsZG4ndCByZXVzZVxuICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guXG4gICAgZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IC8vIE1lbW9pemUgc3RhdGUgdXNpbmcgdGhlIHZhbHVlcyB3ZSBqdXN0IHVzZWQgdG8gcmVuZGVyLlxuICAvLyBUT0RPOiBSZXN0cnVjdHVyZSBzbyB3ZSBuZXZlciByZWFkIHZhbHVlcyBmcm9tIHRoZSBpbnN0YW5jZS5cblxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTsgLy8gVGhlIGNvbnRleHQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQuXG5cbiAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5wZW5kaW5nQ29udGV4dCwgcm9vdC5wZW5kaW5nQ29udGV4dCAhPT0gcm9vdC5jb250ZXh0KTtcbiAgfSBlbHNlIGlmIChyb290LmNvbnRleHQpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGJlIHNldFxuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGFpbmVySW5mbyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBjdXJyZW50IGZpYmVyLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwcmV2Q2hpbGRyZW4gPSBwcmV2U3RhdGUuZWxlbWVudDtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50O1xuXG4gIGlmICggcHJldlN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgIC8vIFRoaXMgaXMgYSBoeWRyYXRpb24gcm9vdCB3aG9zZSBzaGVsbCBoYXMgbm90IHlldCBoeWRyYXRlZC4gV2Ugc2hvdWxkXG4gICAgLy8gYXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIEZsaXAgaXNEZWh5ZHJhdGVkIHRvIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgd2hlbiB0aGlzIHJlbmRlclxuICAgIC8vIGZpbmlzaGVzLCB0aGUgcm9vdCB3aWxsIG5vIGxvbmdlciBiZSBkZWh5ZHJhdGVkLlxuICAgIHZhciBvdmVycmlkZVN0YXRlID0ge1xuICAgICAgZWxlbWVudDogbmV4dENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBuZXh0U3RhdGUuY2FjaGUsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBuZXh0U3RhdGUucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyxcbiAgICAgIHRyYW5zaXRpb25zOiBuZXh0U3RhdGUudHJhbnNpdGlvbnNcbiAgICB9O1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBgYmFzZVN0YXRlYCBjYW4gYWx3YXlzIGJlIHRoZSBsYXN0IHN0YXRlIGJlY2F1c2UgdGhlIHJvb3QgZG9lc24ndFxuICAgIC8vIGhhdmUgcmVkdWNlciBmdW5jdGlvbnMgc28gaXQgZG9lc24ndCBuZWVkIHJlYmFzaW5nLlxuXG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgYSBwcmV2aW91cyBhdHRlbXB0IHRvIGh5ZHJhdGUgdGhlIHNoZWxsLCBzbyB3ZVxuICAgICAgLy8gZm9yY2VkIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nLiBCZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5lZCBvdXRzaWRlICcgKyAnb2YgYSBTdXNwZW5zZSBib3VuZGFyeSwgdGhlIGVudGlyZSByb290IHdpbGwgc3dpdGNoIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2UgaWYgKG5leHRDaGlsZHJlbiAhPT0gcHJldkNoaWxkcmVuKSB7XG4gICAgICB2YXIgX3JlY292ZXJhYmxlRXJyb3IgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihuZXcgRXJyb3IoJ1RoaXMgcm9vdCByZWNlaXZlZCBhbiBlYXJseSB1cGRhdGUsIGJlZm9yZSBhbnl0aGluZyB3YXMgYWJsZSAnICsgJ2h5ZHJhdGUuIFN3aXRjaGVkIHRoZSBlbnRpcmUgcm9vdCB0byBjbGllbnQgcmVuZGVyaW5nLicpLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgX3JlY292ZXJhYmxlRXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgb3V0ZXJtb3N0IHNoZWxsIGhhcyBub3QgaHlkcmF0ZWQgeWV0LiBTdGFydCBoeWRyYXRpbmcuXG4gICAgICBlbnRlckh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgdmFyIGNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgICAgdmFyIG5vZGUgPSBjaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgLy8gTWFyayBlYWNoIGNoaWxkIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpc1xuICAgICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXNcbiAgICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgICBub2RlLmZsYWdzID0gbm9kZS5mbGFncyAmIH5QbGFjZW1lbnQgfCBIeWRyYXRpbmc7XG4gICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJvb3QgaXMgbm90IGRlaHlkcmF0ZWQuIEVpdGhlciB0aGlzIGlzIGEgY2xpZW50LW9ubHkgcm9vdCwgb3IgaXRcbiAgICAvLyBhbHJlYWR5IGh5ZHJhdGVkLlxuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgIGlmIChuZXh0Q2hpbGRyZW4gPT09IHByZXZDaGlsZHJlbikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIFJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlxuICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpO1xuXG4gIGlmIChpc0RpcmVjdFRleHRDaGlsZCkge1xuICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBhIGRpcmVjdCB0ZXh0IGNoaWxkIG9mIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgY29tbW9uXG4gICAgLy8gY2FzZS4gV2Ugd29uJ3QgaGFuZGxlIGl0IGFzIGEgcmVpZmllZCBjaGlsZC4gV2Ugd2lsbCBpbnN0ZWFkIGhhbmRsZVxuICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDtcbiAgfVxuXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF6eUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGxhenlDb21wb25lbnQgPSBlbGVtZW50VHlwZTtcbiAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG4gIHZhciBDb21wb25lbnQgPSBpbml0KHBheWxvYWQpOyAvLyBTdG9yZSB0aGUgdW53cmFwcGVkIGNvbXBvbmVudCBpbiB0aGUgdHlwZS5cblxuICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50O1xuICB2YXIgcmVzb2x2ZWRUYWcgPSB3b3JrSW5Qcm9ncmVzcy50YWcgPSByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpO1xuICB2YXIgcmVzb2x2ZWRQcm9wcyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBwcm9wcyk7XG4gIHZhciBjaGlsZDtcblxuICBzd2l0Y2ggKHJlc29sdmVkVGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlRm9yd2FyZFJlZihudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCByZXNvbHZlZFByb3BzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZU1lbW9Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQudHlwZSwgcmVzb2x2ZWRQcm9wcyksIC8vIFRoZSBpbm5lciB0eXBlIGNhbiBoYXZlIGRlZmF1bHRzIHRvb1xuICAgICAgICByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgfVxuXG4gIHZhciBoaW50ID0gJyc7XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgIGhpbnQgPSAnIERpZCB5b3Ugd3JhcCBhIGNvbXBvbmVudCBpbiBSZWFjdC5sYXp5KCkgbW9yZSB0aGFuIG9uY2U/JztcbiAgICB9XG4gIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudFxuICAvLyBiZWNhdXNlIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlcGFyYXRlIHR5cGUgb2Ygd29yayBpcyBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG5cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZC4gUmVjZWl2ZWQgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG86IFwiICsgQ29tcG9uZW50ICsgXCIuIFwiICsgKFwiTGF6eSBlbGVtZW50IHR5cGUgbXVzdCByZXNvbHZlIHRvIGEgY2xhc3Mgb3IgZnVuY3Rpb24uXCIgKyBoaW50KSk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsgLy8gUHJvbW90ZSB0aGUgZmliZXIgdG8gYSBjbGFzcyBhbmQgdHJ5IHJlbmRlcmluZyBhZ2Fpbi5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgdmFsdWU7XG4gIHZhciBoYXNJZDtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQucHJvdG90eXBlICYmIHR5cGVvZiBDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoXCJUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGhhdmUgYSByZW5kZXIgbWV0aG9kLCBidXQgZG9lc24ndCBleHRlbmQgUmVhY3QuQ29tcG9uZW50LiBcIiArICdUaGlzIGlzIGxpa2VseSB0byBjYXVzZSBlcnJvcnMuIENoYW5nZSAlcyB0byBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuJywgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIG51bGwpO1xuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAge1xuICAgIC8vIFN1cHBvcnQgZm9yIG1vZHVsZSBjb21wb25lbnRzIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlbW92ZWQgYmVoaW5kIGEgZmxhZy5cbiAgICAvLyBXaGV0aGVyIG9yIG5vdCBpdCB3b3VsZCBjcmFzaCBsYXRlciwgd2Ugd2FudCB0byBzaG93IGEgZ29vZCBtZXNzYWdlIGluIERFViBmaXJzdC5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCAvLyBSdW4gdGhlc2UgY2hlY2tzIGluIHByb2R1Y3Rpb24gb25seSBpZiB0aGUgZmxhZyBpcyBvZmYuXG4gIC8vIEV2ZW50dWFsbHkgd2UnbGwgZGVsZXRlIHRoaXMgYnJhbmNoIGFsdG9nZXRoZXIuXG4gICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTIgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTJdKSB7XG4gICAgICAgIGVycm9yKCdUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGJlIGEgZnVuY3Rpb24gY29tcG9uZW50IHRoYXQgcmV0dXJucyBhIGNsYXNzIGluc3RhbmNlLiAnICsgJ0NoYW5nZSAlcyB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4gJyArIFwiSWYgeW91IGNhbid0IHVzZSBhIGNsYXNzIHRyeSBhc3NpZ25pbmcgdGhlIHByb3RvdHlwZSBvbiB0aGUgZnVuY3Rpb24gYXMgYSB3b3JrYXJvdW5kLiBcIiArIFwiYCVzLnByb3RvdHlwZSA9IFJlYWN0LkNvbXBvbmVudC5wcm90b3R5cGVgLiBEb24ndCB1c2UgYW4gYXJyb3cgZnVuY3Rpb24gc2luY2UgaXQgXCIgKyAnY2Fubm90IGJlIGNhbGxlZCB3aXRoIGBuZXdgIGJ5IFJlYWN0LicsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyLCBfY29tcG9uZW50TmFtZTIpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhIGNsYXNzIGluc3RhbmNlXG5cblxuICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IENsYXNzQ29tcG9uZW50OyAvLyBUaHJvdyBvdXQgYW55IGhvb2tzIHRoYXQgd2VyZSB1c2VkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsOyAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAgIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgICB2YXIgaGFzQ29udGV4dCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gdmFsdWUuc3RhdGUgIT09IG51bGwgJiYgdmFsdWUuc3RhdGUgIT09IHVuZGVmaW5lZCA/IHZhbHVlLnN0YXRlIDogbnVsbDtcbiAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICAgIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgdmFsdWUpO1xuICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBmaW5pc2hDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBmdW5jdGlvbiBjb21wb25lbnRcbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBGdW5jdGlvbkNvbXBvbmVudDtcblxuICAgIHtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihudWxsLCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUsIHJlbmRlckxhbmVzKTtcblxuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpIHtcbiAge1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIGlmIChDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgIH1cblxuICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvd25lck5hbWUgfHwgJyc7XG4gICAgICB2YXIgZGVidWdTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2U7XG5cbiAgICAgIGlmIChkZWJ1Z1NvdXJjZSkge1xuICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JXMnLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTMgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuJywgX2NvbXBvbmVudE5hbWUzKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50LmNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBDb21wb25lbnQuY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTQgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lNF0pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGNvbnRleHRUeXBlLicsIF9jb21wb25lbnROYW1lNCk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lNF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgU1VTUEVOREVEX01BUktFUiA9IHtcbiAgZGVoeWRyYXRlZDogbnVsbCxcbiAgdHJlZUNvbnRleHQ6IG51bGwsXG4gIHJldHJ5TGFuZTogTm9MYW5lXG59O1xuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IHJlbmRlckxhbmVzLFxuICAgIGNhY2hlUG9vbDogZ2V0U3VzcGVuZGVkQ2FjaGUoKSxcbiAgICB0cmFuc2l0aW9uczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNhY2hlUG9vbCA9IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IG1lcmdlTGFuZXMocHJldk9mZnNjcmVlblN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpLFxuICAgIGNhY2hlUG9vbDogY2FjaGVQb29sLFxuICAgIHRyYW5zaXRpb25zOiBwcmV2T2Zmc2NyZWVuU3RhdGUudHJhbnNpdGlvbnNcbiAgfTtcbn0gLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIGlubGluZSB0aGlzIGJhY2tcblxuXG5mdW5jdGlvbiBzaG91bGRSZW1haW5PbkZhbGxiYWNrKHN1c3BlbnNlQ29udGV4dCwgY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0b1xuICAvLyByZW1haW4gb24gdGhhdCBmYWxsYmFjayByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIHJlc29sdmVkLlxuICAvLyBGb3IgZXhhbXBsZSwgU3VzcGVuc2VMaXN0IGNvb3JkaW5hdGVzIHdoZW4gbmVzdGVkIGNvbnRlbnQgYXBwZWFycy5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBDdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBEb24ndCBoaWRlIGl0LCBldmVuIGlmIEZvcmNlU3VzcGVuc2VGYWxsYmFja1xuICAgICAgLy8gaXMgdHJ1ZS4gTW9yZSBwcmVjaXNlIG5hbWUgbWlnaHQgYmUgXCJGb3JjZVJlbWFpblN1c3BlbnNlRmFsbGJhY2tcIi5cbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBmYWN0b3Jpbmcgc21lbGwuIENhbid0IHJlbWFpbiBvbiBhIGZhbGxiYWNrIGlmIHRoZXJlJ3NcbiAgICAgIC8vIG5vIGZhbGxiYWNrIHRvIHJlbWFpbiBvbi5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gLy8gTm90IGN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIENvbnN1bHQgdGhlIFN1c3BlbnNlIGNvbnRleHQuXG5cblxuICByZXR1cm4gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogU2hvdWxkIG5vdCByZW1vdmUgcmVuZGVyIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgZHVyaW5nIHRoaXMgcmVuZGVyXG4gIHJldHVybiByZW1vdmVMYW5lcyhjdXJyZW50LmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIHN1c3BlbmQuXG5cbiAge1xuICAgIGlmIChzaG91bGRTdXNwZW5kKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvd0ZhbGxiYWNrID0gZmFsc2U7XG4gIHZhciBkaWRTdXNwZW5kID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKGRpZFN1c3BlbmQgfHwgc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQpKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoaXMgYm91bmRhcnkncyBzdWJ0cmVlIGFscmVhZHkgc3VzcGVuZGVkLiBTd2l0Y2ggdG9cbiAgICAvLyByZW5kZXJpbmcgdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgIHNob3dGYWxsYmFjayA9IHRydWU7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkRpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXR0ZW1wdGluZyB0aGUgbWFpbiBjb250ZW50XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50IG9yIHRoaXMgYm91bmRhcnkgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBNYXJrIHRoaXMgc3VidHJlZSBjb250ZXh0IGFzIGhhdmluZyBhdCBsZWFzdCBvbmUgaW52aXNpYmxlIHBhcmVudCB0aGF0IGNvdWxkXG4gICAgICAvLyBoYW5kbGUgdGhlIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gQXZvaWRlZCBib3VuZGFyaWVzIGFyZSBub3QgY29uc2lkZXJlZCBzaW5jZSB0aGV5IGNhbm5vdCBoYW5kbGUgcHJlZmVycmVkIGZhbGxiYWNrIHN0YXRlcy5cbiAgICAgIHtcbiAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gT0ssIHRoZSBuZXh0IHBhcnQgaXMgY29uZnVzaW5nLiBXZSdyZSBhYm91dCB0byByZWNvbmNpbGUgdGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5J3MgY2hpbGRyZW4uIFRoaXMgaW52b2x2ZXMgc29tZSBjdXN0b20gcmVjb25jaWxpYXRpb24gbG9naWMuIFR3b1xuICAvLyBtYWluIHJlYXNvbnMgdGhpcyBpcyBzbyBjb21wbGljYXRlZC5cbiAgLy9cbiAgLy8gRmlyc3QsIExlZ2FjeSBNb2RlIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhlXG4gIC8vIHByaW1hcnkgdHJlZSB3aWxsIGNvbW1pdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUsIHNvIHdoZW4gd2UgZG8gdGhlXG4gIC8vIHNlY29uZCBwYXNzIHRvIHJlbmRlciB0aGUgZmFsbGJhY2ssIHdlIGRvIHNvbWUgZXhjZWVkaW5nbHksIHVoLCBjbGV2ZXJcbiAgLy8gaGFja3MgdG8gbWFrZSB0aGF0IG5vdCB0b3RhbGx5IGJyZWFrLiBMaWtlIHRyYW5zZmVycmluZyBlZmZlY3RzIGFuZFxuICAvLyBkZWxldGlvbnMgZnJvbSBoaWRkZW4gdHJlZS4gSW4gQ29uY3VycmVudCBNb2RlLCBpdCdzIG11Y2ggc2ltcGxlcixcbiAgLy8gYmVjYXVzZSB3ZSBiYWlsb3V0IG9uIHRoZSBwcmltYXJ5IHRyZWUgY29tcGxldGVseSBhbmQgbGVhdmUgaXQgaW4gaXRzIG9sZFxuICAvLyBzdGF0ZSwgbm8gZWZmZWN0cy4gU2FtZSBhcyB3aGF0IHdlIGRvIGZvciBPZmZzY3JlZW4gKGV4Y2VwdCB0aGF0XG4gIC8vIE9mZnNjcmVlbiBkb2Vzbid0IGhhdmUgdGhlIGZpcnN0IHJlbmRlciBwYXNzKS5cbiAgLy9cbiAgLy8gU2Vjb25kIGlzIGh5ZHJhdGlvbi4gRHVyaW5nIGh5ZHJhdGlvbiwgdGhlIFN1c3BlbnNlIGZpYmVyIGhhcyBhIHNsaWdodGx5XG4gIC8vIGRpZmZlcmVudCBsYXlvdXQsIHdoZXJlIHRoZSBjaGlsZCBwb2ludHMgdG8gYSBkZWh5ZHJhdGVkIGZyYWdtZW50LCB3aGljaFxuICAvLyBjb250YWlucyB0aGUgRE9NIHJlbmRlcmVkIGJ5IHRoZSBzZXJ2ZXIuXG4gIC8vXG4gIC8vIFRoaXJkLCBldmVuIGlmIHlvdSBzZXQgYWxsIHRoYXQgYXNpZGUsIFN1c3BlbnNlIGlzIGxpa2UgZXJyb3IgYm91bmRhcmllcyBpblxuICAvLyB0aGF0IHdlIGZpcnN0IHdlIHRyeSB0byByZW5kZXIgb25lIHRyZWUsIGFuZCBpZiB0aGF0IGZhaWxzLCB3ZSByZW5kZXIgYWdhaW5cbiAgLy8gYW5kIHN3aXRjaCB0byBhIGRpZmZlcmVudCB0cmVlLiBMaWtlIGEgdHJ5L2NhdGNoIGJsb2NrLiBTbyB3ZSBoYXZlIHRvIHRyYWNrXG4gIC8vIHdoaWNoIGJyYW5jaCB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nLiBJZGVhbGx5IHdlIHdvdWxkIG1vZGVsIHRoaXMgdXNpbmdcbiAgLy8gYSBzdGFjay5cblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluaXRpYWwgbW91bnRcbiAgICAvLyBTcGVjaWFsIHBhdGggZm9yIGh5ZHJhdGlvblxuICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBoeWRyYXRpbmcsIHRyeSB0byBoeWRyYXRlIHRoaXMgYm91bmRhcnkuXG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpOyAvLyBUaGlzIGNvdWxkJ3ZlIGJlZW4gYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cblxuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICB2YXIgZGVoeWRyYXRlZCA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgaWYgKGRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1vdW50RGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KHdvcmtJblByb2dyZXNzLCBkZWh5ZHJhdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuXG4gICAgICByZXR1cm4gZmFsbGJhY2tGcmFnbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVwZGF0ZS5cbiAgICAvLyBTcGVjaWFsIHBhdGggZm9yIGh5ZHJhdGlvblxuICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2RlaHlkcmF0ZWQgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgaWYgKF9kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgX2RlaHlkcmF0ZWQsIHByZXZTdGF0ZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbiwgX25leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdGF0ZSA9IGN1cnJlbnQuY2hpbGQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIubWVtb2l6ZWRTdGF0ZSA9IHByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLmNoaWxkTGFuZXMgPSBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShjdXJyZW50LCByZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjIgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKG9mZnNjcmVlblByb3BzLCBtb2RlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbmAgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZVxuICAvLyB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKG9mZnNjcmVlblByb3BzLCBtb2RlLCBOb0xhbmVzLCBudWxsKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gbnVsbDtcblxuICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIERlbGV0ZSB0aGUgZmFsbGJhY2sgY2hpbGQgZnJhZ21lbnRcbiAgICB2YXIgZGVsZXRpb25zID0gd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gW2N1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnRdO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuXG4gIGlmICggLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIE1ha2Ugc3VyZSB3ZSdyZSBvbiB0aGUgc2Vjb25kIHBhc3MsIGkuZS4gdGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgd2FzXG4gIC8vIGFscmVhZHkgY2xvbmVkLiBJbiBsZWdhY3kgbW9kZSwgdGhlIG9ubHkgY2FzZSB3aGVyZSB0aGlzIGlzbid0IHRydWUgaXNcbiAgLy8gd2hlbiBEZXZUb29scyBmb3JjZXMgdXMgdG8gZGlzcGxheSBhIGZhbGxiYWNrOyB3ZSBza2lwIHRoZSBmaXJzdCByZW5kZXJcbiAgLy8gcGFzcyBlbnRpcmVseSBhbmQgZ28gc3RyYWlnaHQgdG8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjay4gKEluIENvbmN1cnJlbnRcbiAgLy8gTW9kZSwgU3VzcGVuc2VMaXN0IGNhbiBhbHNvIHRyaWdnZXIgdGhpcyBzY2VuYXJpbywgYnV0IHRoaXMgaXMgYSBsZWdhY3ktXG4gIC8vIG9ubHkgY29kZXBhdGguKVxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50KSB7XG4gICAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfSAvLyBUaGUgZmFsbGJhY2sgZmliZXIgd2FzIGFkZGVkIGFzIGEgZGVsZXRpb24gZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTsgLy8gU2luY2Ugd2UncmUgcmV1c2luZyBhIGN1cnJlbnQgdHJlZSwgd2UgbmVlZCB0byByZXVzZSB0aGUgZmxhZ3MsIHRvby5cbiAgICAvLyAoV2UgZG9uJ3QgZG8gdGhpcyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBpbiBsZWdhY3kgbW9kZSB3ZSBkb24ndCByZS11c2VcbiAgICAvLyB0aGUgY3VycmVudCB0cmVlOyBzZWUgcHJldmlvdXMgYnJhbmNoLilcblxuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICB9XG5cbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQsIGZhbGxiYWNrQ2hpbGRyZW4pO1xuICB9IGVsc2Uge1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlIGJvdW5kYXJ5KSBhbHJlYWR5XG4gICAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIH1cblxuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpIHtcbiAgLy8gRmFsbGluZyBiYWNrIHRvIGNsaWVudCByZW5kZXJpbmcuIEJlY2F1c2UgdGhpcyBoYXMgcGVyZm9ybWFuY2VcbiAgLy8gaW1wbGljYXRpb25zLCBpdCdzIGNvbnNpZGVyZWQgYSByZWNvdmVyYWJsZSBlcnJvciwgZXZlbiB0aG91Z2ggdGhlIHVzZXJcbiAgLy8gbGlrZWx5IHdvbid0IG9ic2VydmUgYW55dGhpbmcgd3Jvbmcgd2l0aCB0aGUgVUkuXG4gIC8vXG4gIC8vIFRoZSBlcnJvciBpcyBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQgdG8gZW5mb3JjZSB0aGF0IGV2ZXJ5IGNhbGxlciBwcm92aWRlXG4gIC8vIGEgY3VzdG9tIG1lc3NhZ2UsIG9yIGV4cGxpY2l0bHkgb3B0IG91dCAoY3VycmVudGx5IHRoZSBvbmx5IHBhdGggdGhhdCBvcHRzXG4gIC8vIG91dCBpcyBsZWdhY3kgbW9kZTsgZXZlcnkgY29uY3VycmVudCBwYXRoIHByb3ZpZGVzIGFuIGVycm9yKS5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3IgIT09IG51bGwpIHtcbiAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB9IC8vIFRoaXMgd2lsbCBhZGQgdGhlIG9sZCBmaWJlciB0byB0aGUgZGVsZXRpb24gbGlzdFxuXG5cbiAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTsgLy8gV2UncmUgbm93IG5vdCBzdXNwZW5kZWQgbm9yIGRlaHlkcmF0ZWQuXG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlIGJvdW5kYXJ5KSBhbHJlYWR5XG4gIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgZmliZXJNb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgZmliZXJNb2RlKTtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIGZpYmVyTW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkpIGFscmVhZHkgbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgLy8gV2Ugd2lsbCBoYXZlIGRyb3BwZWQgdGhlIGVmZmVjdCBsaXN0IHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgIC8vIGRlbGV0aW9uLiBXZSBuZWVkIHRvIHJlY29uY2lsZSB0byBkZWxldGUgdGhlIGN1cnJlbnQgY2hpbGQuXG4gICAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBEdXJpbmcgdGhlIGZpcnN0IHBhc3MsIHdlJ2xsIGJhaWwgb3V0IGFuZCBub3QgZHJpbGwgaW50byB0aGUgY2hpbGRyZW4uXG4gIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHRoZSBjb250ZW50IGluIHBsYWNlIGFuZCB0cnkgdG8gaHlkcmF0ZSBpdCBsYXRlci5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignQ2Fubm90IGh5ZHJhdGUgU3VzcGVuc2UgaW4gbGVnYWN5IG1vZGUuIFN3aXRjaCBmcm9tICcgKyAnUmVhY3RET00uaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIpIHRvICcgKyAnUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KScgKyAnLnJlbmRlcihlbGVtZW50KSBvciByZW1vdmUgdGhlIFN1c3BlbnNlIGNvbXBvbmVudHMgZnJvbSAnICsgJ3RoZSBzZXJ2ZXIgcmVuZGVyZWQgY29tcG9uZW50cy4nKTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKFN5bmNMYW5lKTtcbiAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgIC8vIFRoaXMgaXMgYSBjbGllbnQtb25seSBib3VuZGFyeS4gU2luY2Ugd2Ugd29uJ3QgZ2V0IGFueSBjb250ZW50IGZyb20gdGhlIHNlcnZlclxuICAgIC8vIGZvciB0aGlzLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHRoYXQgYXQgYSBoaWdoZXIgcHJpb3JpdHkgYmFzZWQgb24gd2hlbiBpdCB3b3VsZFxuICAgIC8vIGhhdmUgdGltZWQgb3V0LiBJbiB0aGVvcnkgd2UgY291bGQgcmVuZGVyIGl0IGluIHRoaXMgcGFzcyBidXQgaXQgd291bGQgaGF2ZSB0aGVcbiAgICAvLyB3cm9uZyBwcmlvcml0eSBhc3NvY2lhdGVkIHdpdGggaXQgYW5kIHdpbGwgcHJldmVudCBoeWRyYXRpb24gb2YgcGFyZW50IHBhdGguXG4gICAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgd29yayBsZWZ0IG9uIGl0IHRvIHJlbmRlciBpdCBpbiBhIHNlcGFyYXRlIGNvbW1pdC5cbiAgICAvLyBUT0RPIFRoaXMgdGltZSBzaG91bGQgYmUgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHNlcnZlciByZW5kZXJlZCByZXNwb25zZSB0aGF0IGlzXG4gICAgLy8gYSBwYXJlbnQgdG8gdGhpcyBib3VuZGFyeSB3YXMgZGlzcGxheWVkLiBIb3dldmVyLCBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZVxuICAgIC8vIGEgcHJvdG9jb2wgdG8gdHJhbnNmZXIgdGhhdCB0aW1lLCB3ZSdsbCBqdXN0IGVzdGltYXRlIGl0IGJ5IHVzaW5nIHRoZSBjdXJyZW50XG4gICAgLy8gdGltZS4gVGhpcyB3aWxsIG1lYW4gdGhhdCBTdXNwZW5zZSB0aW1lb3V0cyBhcmUgc2xpZ2h0bHkgc2hpZnRlZCB0byBsYXRlciB0aGFuXG4gICAgLy8gdGhleSBzaG91bGQgYmUuXG4gICAgLy8gU2NoZWR1bGUgYSBub3JtYWwgcHJpIHVwZGF0ZSB0byByZW5kZXIgdGhpcyBjb250ZW50LlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoRGVmYXVsdEh5ZHJhdGlvbkxhbmUpO1xuICB9IGVsc2Uge1xuICAgIC8vIFdlJ2xsIGNvbnRpbnVlIGh5ZHJhdGluZyB0aGUgcmVzdCBhdCBvZmZzY3JlZW4gcHJpb3JpdHkgc2luY2Ugd2UnbGwgYWxyZWFkeVxuICAgIC8vIGJlIHNob3dpbmcgdGhlIHJpZ2h0IGNvbnRlbnQgY29taW5nIGZyb20gdGhlIHNlcnZlciwgaXQgaXMgbm8gcnVzaC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKE9mZnNjcmVlbkxhbmUpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZGlkU3VzcGVuZCwgbmV4dFByb3BzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLCByZW5kZXJMYW5lcykge1xuICBpZiAoIWRpZFN1c3BlbmQpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCByZW5kZXIgcGFzcy4gQXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIFdlIHNob3VsZCBuZXZlciBiZSBoeWRyYXRpbmcgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdCBwYXNzLFxuICAgIC8vIGJ1dCBhZnRlciB3ZSd2ZSBhbHJlYWR5IGNvbW1pdHRlZCBvbmNlLlxuICAgIHdhcm5JZkh5ZHJhdGluZygpO1xuXG4gICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIC8vIFRPRE86IFdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgbWFrZSB0aGlzIGVycm9yIGFyZ3VtZW50XG4gICAgICAvLyByZXF1aXJlZCBcdTIwMTQgZXZlcnkgY29uY3VycmVudCBtb2RlIHBhdGggdGhhdCBjYXVzZXMgaHlkcmF0aW9uIHRvXG4gICAgICAvLyBkZS1vcHQgdG8gY2xpZW50IHJlbmRlcmluZyBzaG91bGQgaGF2ZSBhbiBlcnJvciBtZXNzYWdlLlxuICAgICAgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGJvdW5kYXJ5IGlzIGluIGEgcGVybWFuZW50IGZhbGxiYWNrIHN0YXRlLiBJbiB0aGlzIGNhc2UsIHdlJ2xsIG5ldmVyXG4gICAgICAvLyBnZXQgYW4gdXBkYXRlIGFuZCB3ZSdsbCBuZXZlciBiZSBhYmxlIHRvIGh5ZHJhdGUgdGhlIGZpbmFsIGNvbnRlbnQuIExldCdzIGp1c3QgdHJ5IHRoZVxuICAgICAgLy8gY2xpZW50IHNpZGUgcmVuZGVyIGluc3RlYWQuXG4gICAgICB2YXIgZGlnZXN0LCBtZXNzYWdlLCBzdGFjaztcblxuICAgICAge1xuICAgICAgICB2YXIgX2dldFN1c3BlbnNlSW5zdGFuY2VGID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzKHN1c3BlbnNlSW5zdGFuY2UpO1xuXG4gICAgICAgIGRpZ2VzdCA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5kaWdlc3Q7XG4gICAgICAgIG1lc3NhZ2UgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYubWVzc2FnZTtcbiAgICAgICAgc3RhY2sgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuc3RhY2s7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvcjtcblxuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignVGhlIHNlcnZlciBjb3VsZCBub3QgZmluaXNoIHRoaXMgU3VzcGVuc2UgYm91bmRhcnksIGxpa2VseSAnICsgJ2R1ZSB0byBhbiBlcnJvciBkdXJpbmcgc2VydmVyIHJlbmRlcmluZy4gU3dpdGNoZWQgdG8gJyArICdjbGllbnQgcmVuZGVyaW5nLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2FwdHVyZWRWYWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUoZXJyb3IsIGRpZ2VzdCwgc3RhY2spO1xuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgY2FwdHVyZWRWYWx1ZSk7XG4gICAgfVxuICAgIC8vIGFueSBjb250ZXh0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHRyZWF0IGlzIGFzIGlmIHRoZSBpbnB1dCBtaWdodCBoYXZlIGNoYW5nZWQuXG5cblxuICAgIHZhciBoYXNDb250ZXh0Q2hhbmdlZCA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIGN1cnJlbnQuY2hpbGRMYW5lcyk7XG5cbiAgICBpZiAoZGlkUmVjZWl2ZVVwZGF0ZSB8fCBoYXNDb250ZXh0Q2hhbmdlZCkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgZmlyc3QgcmVuZGVyLiBUaGlzIG1lYW5zIHRoYXQgd2UgYXJlIG5vdyB1bmFibGUgdG9cbiAgICAgIC8vIGh5ZHJhdGUgaXQuIFdlIG1pZ2h0IHN0aWxsIGJlIGFibGUgdG8gaHlkcmF0ZSBpdCB1c2luZyBhIGhpZ2hlciBwcmlvcml0eSBsYW5lLlxuICAgICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGF0dGVtcHRIeWRyYXRpb25BdExhbmUgPSBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICBpZiAoYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gTm9MYW5lICYmIGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lKSB7XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBtdXRhdGluZyBzaW5jZSB0aGlzIHJlbmRlciB3aWxsIGdldCBpbnRlcnJ1cHRlZC4gVGhpc1xuICAgICAgICAgIC8vIGlzIG9uZSBvZiB0aGUgdmVyeSByYXJlIHRpbWVzIHdoZXJlIHdlIG11dGF0ZSB0aGUgY3VycmVudCB0cmVlXG4gICAgICAgICAgLy8gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICAgICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lOyAvLyBUT0RPOiBJZGVhbGx5IHRoaXMgd291bGQgaW5oZXJpdCB0aGUgZXZlbnQgdGltZSBvZiB0aGUgY3VycmVudCByZW5kZXJcblxuICAgICAgICAgIHZhciBldmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbiAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoY3VycmVudCwgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSk7XG4gICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSWYgd2UgaGF2ZSBzY2hlZHVsZWQgaGlnaGVyIHByaSB3b3JrIGFib3ZlLCB0aGlzIHdpbGwgcHJvYmFibHkganVzdCBhYm9ydCB0aGUgcmVuZGVyXG4gICAgICAvLyBzaW5jZSB3ZSBub3cgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgd29yaywgYnV0IGluIGNhc2UgaXQgZG9lc24ndCwgd2UgbmVlZCB0byBwcmVwYXJlIHRvXG4gICAgICAvLyByZW5kZXIgc29tZXRoaW5nLCBpZiB3ZSB0aW1lIG91dC4gRXZlbiBpZiB0aGF0IHJlcXVpcmVzIHVzIHRvIGRlbGV0ZSBldmVyeXRoaW5nIGFuZFxuICAgICAgLy8gc2tpcCBoeWRyYXRpb24uXG4gICAgICAvLyBEZWxheSBoYXZpbmcgdG8gZG8gdGhpcyBhcyBsb25nIGFzIHRoZSBzdXNwZW5zZSB0aW1lb3V0IGFsbG93cyB1cy5cblxuXG4gICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUobmV3IEVycm9yKCdUaGlzIFN1c3BlbnNlIGJvdW5kYXJ5IHJlY2VpdmVkIGFuIHVwZGF0ZSBiZWZvcmUgaXQgZmluaXNoZWQgJyArICdoeWRyYXRpbmcuIFRoaXMgY2F1c2VkIHRoZSBib3VuZGFyeSB0byBzd2l0Y2ggdG8gY2xpZW50IHJlbmRlcmluZy4gJyArICdUaGUgdXN1YWwgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHdyYXAgdGhlIG9yaWdpbmFsIHVwZGF0ZSAnICsgJ2luIHN0YXJ0VHJhbnNpdGlvbi4nKSk7XG5cbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIF9jYXB0dXJlZFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIHN0aWxsIHBlbmRpbmcgbW9yZSBkYXRhIGZyb20gdGhlIHNlcnZlciwgc28gd2UgY2FuJ3QgaHlkcmF0ZSBpdHNcbiAgICAgIC8vIGNvbnRlbnQuIFdlIHRyZWF0IGl0IGFzIGlmIHRoaXMgY29tcG9uZW50IHN1c3BlbmRlZCBpdHNlbGYuIEl0IG1pZ2h0IHNlZW0gYXMgaWZcbiAgICAgIC8vIHdlIGNvdWxkIGp1c3QgdHJ5IHRvIHJlbmRlciBpdCBjbGllbnQtc2lkZSBpbnN0ZWFkLiBIb3dldmVyLCB0aGlzIHdpbGwgcGVyZm9ybSBhXG4gICAgICAvLyBsb3Qgb2YgdW5uZWNlc3Nhcnkgd29yayBhbmQgaXMgdW5saWtlbHkgdG8gY29tcGxldGUgc2luY2UgaXQgb2Z0ZW4gd2lsbCBzdXNwZW5kXG4gICAgICAvLyBvbiBtaXNzaW5nIGRhdGEgYW55d2F5LiBBZGRpdGlvbmFsbHksIHRoZSBzZXJ2ZXIgbWlnaHQgYmUgYWJsZSB0byByZW5kZXIgbW9yZVxuICAgICAgLy8gdGhhbiB3ZSBjYW4gb24gdGhlIGNsaWVudCB5ZXQuIEluIHRoYXQgY2FzZSB3ZSdkIGVuZCB1cCB3aXRoIG1vcmUgZmFsbGJhY2sgc3RhdGVzXG4gICAgICAvLyBvbiB0aGUgY2xpZW50IHRoYW4gaWYgd2UganVzdCBsZWF2ZSBpdCBhbG9uZS4gSWYgdGhlIHNlcnZlciB0aW1lcyBvdXQgb3IgZXJyb3JzXG4gICAgICAvLyB0aGVzZSBzaG91bGQgdXBkYXRlIHRoaXMgYm91bmRhcnkgdG8gdGhlIHBlcm1hbmVudCBGYWxsYmFjayBzdGF0ZSBpbnN0ZWFkLlxuICAgICAgLy8gTWFyayBpdCBhcyBoYXZpbmcgY2FwdHVyZWQgKGkuZS4gc3VzcGVuZGVkKS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7IC8vIExlYXZlIHRoZSBjaGlsZCBpbiBwbGFjZS4gSS5lLiB0aGUgZGVoeWRyYXRlZCBmcmFnbWVudC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIHJldHJ5IHRoaXMgYm91bmRhcnkgb25jZSB0aGUgc2VydmVyIGhhcyBzZW50IHRoZSByZXN1bHQuXG5cbiAgICAgIHZhciByZXRyeSA9IHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkuYmluZChudWxsLCBjdXJyZW50KTtcbiAgICAgIHJlZ2lzdGVyU3VzcGVuc2VJbnN0YW5jZVJldHJ5KHN1c3BlbnNlSW5zdGFuY2UsIHJldHJ5KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBhdHRlbXB0LlxuICAgICAgcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLnRyZWVDb250ZXh0KTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBNYXJrIHRoZSBjaGlsZHJlbiBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBIeWRyYXRpbmc7XG4gICAgICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCByZW5kZXIgcGFzcy4gV2UgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gaHlkcmF0ZWQsIGJ1dFxuICAgIC8vIHNvbWV0aGluZyBlaXRoZXIgc3VzcGVuZGVkIG9yIGVycm9yZWQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBlcnJvcmVkIGR1cmluZyBoeWRyYXRpb24uIFRyeSBhZ2FpbiB3aXRob3V0IGh5ZHJhdGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5Gb3JjZUNsaWVudFJlbmRlcjtcblxuICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlMiA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUobmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nIHRoaXMgU3VzcGVuc2UgYm91bmRhcnkuICcgKyAnU3dpdGNoZWQgdG8gY2xpZW50IHJlbmRlcmluZy4nKSk7XG5cbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIF9jYXB0dXJlZFZhbHVlMik7XG4gICAgfSBlbHNlIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkIGFuZCB3ZSBzaG91bGQgc3RpbGwgYmUgaW4gZGVoeWRyYXRlZCBtb2RlLlxuICAgICAgLy8gTGVhdmUgdGhlIGV4aXN0aW5nIGNoaWxkIGluIHBsYWNlLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBUaGUgZGVoeWRyYXRlZCBjb21wbGV0aW9uIHBhc3MgZXhwZWN0cyB0aGlzIGZsYWcgdG8gYmUgdGhlcmVcbiAgICAgIC8vIGJ1dCB0aGUgbm9ybWFsIHN1c3BlbnNlIHBhc3MgZG9lc24ndC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXNwZW5kZWQgYnV0IHdlIHNob3VsZCBubyBsb25nZXIgYmUgaW4gZGVoeWRyYXRlZCBtb2RlLlxuICAgICAgLy8gVGhlcmVmb3JlIHdlIG5vdyBoYXZlIHRvIHJlbmRlciB0aGUgZmFsbGJhY2suXG4gICAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcbiAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIoZmliZXIsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FuQXJyYXkgPSBpc0FycmF5KGNoaWxkU2xvdCk7XG4gICAgdmFyIGlzSXRlcmFibGUgPSAhaXNBbkFycmF5ICYmIHR5cGVvZiBnZXRJdGVyYXRvckZuKGNoaWxkU2xvdCkgPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZiAoaXNBbkFycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBbkFycmF5ID8gJ2FycmF5JyA6ICdpdGVyYWJsZSc7XG5cbiAgICAgIGVycm9yKCdBIG5lc3RlZCAlcyB3YXMgcGFzc2VkIHRvIHJvdyAjJXMgaW4gPFN1c3BlbnNlTGlzdCAvPi4gV3JhcCBpdCBpbiAnICsgJ2FuIGFkZGl0aW9uYWwgU3VzcGVuc2VMaXN0IHRvIGNvbmZpZ3VyZSBpdHMgcmV2ZWFsT3JkZXI6ICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+IC4uLiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPnslc308L1N1c3BlbnNlTGlzdD4gLi4uICcgKyAnPC9TdXNwZW5zZUxpc3Q+JywgdHlwZSwgaW5kZXgsIHR5cGUpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4oY2hpbGRyZW4sIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAoKHJldmVhbE9yZGVyID09PSAnZm9yd2FyZHMnIHx8IHJldmVhbE9yZGVyID09PSAnYmFja3dhcmRzJykgJiYgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbiAhPT0gbnVsbCAmJiBjaGlsZHJlbiAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkcmVuW2ldLCBpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5JdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG5cbiAgICAgICAgICBpZiAoY2hpbGRyZW5JdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHZhciBfaSA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKHN0ZXAudmFsdWUsIF9pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9pKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yKCdBIHNpbmdsZSByb3cgd2FzIHBhc3NlZCB0byBhIDxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9XCIlc1wiIC8+LiAnICsgJ1RoaXMgaXMgbm90IHVzZWZ1bCBzaW5jZSBpdCBuZWVkcyBtdWx0aXBsZSByb3dzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBwYXNzIG11bHRpcGxlIGNoaWxkcmVuIG9yIGFuIGFycmF5PycsIHJldmVhbE9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGlzQmFja3dhcmRzLCB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpIHtcbiAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0ge1xuICAgICAgaXNCYWNrd2FyZHM6IGlzQmFja3dhcmRzLFxuICAgICAgcmVuZGVyaW5nOiBudWxsLFxuICAgICAgcmVuZGVyaW5nU3RhcnRUaW1lOiAwLFxuICAgICAgbGFzdDogbGFzdENvbnRlbnRSb3csXG4gICAgICB0YWlsOiB0YWlsLFxuICAgICAgdGFpbE1vZGU6IHRhaWxNb2RlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIG9iamVjdCBmcm9tIHByZXZpb3VzIHJlbmRlcnMuXG4gICAgcmVuZGVyU3RhdGUuaXNCYWNrd2FyZHMgPSBpc0JhY2t3YXJkcztcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IDA7XG4gICAgcmVuZGVyU3RhdGUubGFzdCA9IGxhc3RDb250ZW50Um93O1xuICAgIHJlbmRlclN0YXRlLnRhaWwgPSB0YWlsO1xuICAgIHJlbmRlclN0YXRlLnRhaWxNb2RlID0gdGFpbE1vZGU7XG4gIH1cbn0gLy8gVGhpcyBjYW4gZW5kIHVwIHJlbmRlcmluZyB0aGlzIGNvbXBvbmVudCBtdWx0aXBsZSBwYXNzZXMuXG4vLyBUaGUgZmlyc3QgcGFzcyBzcGxpdHMgdGhlIGNoaWxkcmVuIGZpYmVycyBpbnRvIHR3byBzZXRzLiBBIGhlYWQgYW5kIHRhaWwuXG4vLyBXZSBmaXJzdCByZW5kZXIgdGhlIGhlYWQuIElmIGFueXRoaW5nIGlzIGluIGZhbGxiYWNrIHN0YXRlLCB3ZSBkbyBhbm90aGVyXG4vLyBwYXNzIHRocm91Z2ggYmVnaW5Xb3JrIHRvIHJlcmVuZGVyIGFsbCBjaGlsZHJlbiAoaW5jbHVkaW5nIHRoZSB0YWlsKSB3aXRoXG4vLyB0aGUgZm9yY2Ugc3VzcGVuZCBjb250ZXh0LiBJZiB0aGUgZmlyc3QgcmVuZGVyIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluXG4vLyBpbiBmYWxsYmFjayBzdGF0ZS4gVGhlbiB3ZSByZW5kZXIgZWFjaCByb3cgaW4gdGhlIHRhaWwgb25lLWJ5LW9uZS5cbi8vIFRoYXQgaGFwcGVucyBpbiB0aGUgY29tcGxldGVXb3JrIHBoYXNlIHdpdGhvdXQgZ29pbmcgYmFjayB0byBiZWdpbldvcmsuXG5cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmV2ZWFsT3JkZXIgPSBuZXh0UHJvcHMucmV2ZWFsT3JkZXI7XG4gIHZhciB0YWlsTW9kZSA9IG5leHRQcm9wcy50YWlsO1xuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4obmV3Q2hpbGRyZW4sIHJldmVhbE9yZGVyKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG91bGRGb3JjZUZhbGxiYWNrID0gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcblxuICBpZiAoc2hvdWxkRm9yY2VGYWxsYmFjaykge1xuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSBjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgLy8gSWYgd2UgcHJldmlvdXNseSBmb3JjZWQgYSBmYWxsYmFjaywgd2UgbmVlZCB0byBzY2hlZHVsZSB3b3JrXG4gICAgICAvLyBvbiBhbnkgbmVzdGVkIGJvdW5kYXJpZXMgdG8gbGV0IHRoZW0ga25vdyB0byB0cnkgdG8gcmVuZGVyXG4gICAgICAvLyBhZ2Fpbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBjb250ZXh0IHVwZGF0aW5nLlxuICAgICAgcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZCwgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIH1cblxuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuXG4gIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuXG4gICAgICBpZiAob2JqZWN0SXMob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICAvLyBObyBjaGFuZ2UuIEJhaWxvdXQgZWFybHkgaWYgY2hpbGRyZW4gYXJlIHRoZSBzYW1lLlxuICAgICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGNvbnRleHQgdmFsdWUgY2hhbmdlZC4gU2VhcmNoIGZvciBtYXRjaGluZyBjb25zdW1lcnMgYW5kIHNjaGVkdWxlXG4gICAgICAgIC8vIHRoZW0gdG8gdXBkYXRlLlxuICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV3UHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGU7IC8vIFRoZSBsb2dpYyBiZWxvdyBmb3IgQ29udGV4dCBkaWZmZXJzIGRlcGVuZGluZyBvbiBQUk9EIG9yIERFViBtb2RlLiBJblxuICAvLyBERVYgbW9kZSwgd2UgY3JlYXRlIGEgc2VwYXJhdGUgb2JqZWN0IGZvciBDb250ZXh0LkNvbnN1bWVyIHRoYXQgYWN0c1xuICAvLyBsaWtlIGEgcHJveHkgdG8gQ29udGV4dC4gVGhpcyBwcm94eSBvYmplY3QgYWRkcyB1bm5lY2Vzc2FyeSBjb2RlIGluIFBST0RcbiAgLy8gc28gd2UgdXNlIHRoZSBvbGQgYmVoYXZpb3VyIChDb250ZXh0LkNvbnN1bWVyIHJlZmVyZW5jZXMgQ29udGV4dCkgdG9cbiAgLy8gcmVkdWNlIHNpemUgYW5kIG92ZXJoZWFkLiBUaGUgc2VwYXJhdGUgb2JqZWN0IHJlZmVyZW5jZXMgY29udGV4dCB2aWFcbiAgLy8gYSBwcm9wZXJ0eSBjYWxsZWQgXCJfY29udGV4dFwiLCB3aGljaCBhbHNvIGdpdmVzIHVzIHRoZSBhYmlsaXR5IHRvIGNoZWNrXG4gIC8vIGluIERFViBtb2RlIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIG9yIG5vdCBhbmQgd2FybiBpZiBpdCBkb2VzIG5vdC5cblxuICB7XG4gICAgaWYgKGNvbnRleHQuX2NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBtYXkgYmUgYmVjYXVzZSBpdCdzIGEgQ29udGV4dCAocmF0aGVyIHRoYW4gYSBDb25zdW1lcikuXG4gICAgICAvLyBPciBpdCBtYXkgYmUgYmVjYXVzZSBpdCdzIG9sZGVyIFJlYWN0IHdoZXJlIHRoZXkncmUgdGhlIHNhbWUgdGhpbmcuXG4gICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gd2FybiBpZiB3ZSdyZSBzdXJlIGl0J3MgYSBuZXcgUmVhY3QuXG4gICAgICBpZiAoY29udGV4dCAhPT0gY29udGV4dC5Db25zdW1lcikge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lcikge1xuICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0PiBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9jb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJlbmRlciA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0EgY29udGV4dCBjb25zdW1lciB3YXMgcmVuZGVyZWQgd2l0aCBtdWx0aXBsZSBjaGlsZHJlbiwgb3IgYSBjaGlsZCAnICsgXCJ0aGF0IGlzbid0IGEgZnVuY3Rpb24uIEEgY29udGV4dCBjb25zdW1lciBleHBlY3RzIGEgc2luZ2xlIGNoaWxkIFwiICsgJ3RoYXQgaXMgYSBmdW5jdGlvbi4gSWYgeW91IGRpZCBwYXNzIGEgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0aGVyZSAnICsgJ2lzIG5vIHRyYWlsaW5nIG9yIGxlYWRpbmcgd2hpdGVzcGFjZSBhcm91bmQgaXQuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5ld1ZhbHVlID0gcmVhZENvbnRleHQoY29udGV4dCk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCkge1xuICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBBIGxhenkgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIFJldXNlIHByZXZpb3VzIGRlcGVuZGVuY2llc1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAge1xuICAgIC8vIERvbid0IHVwZGF0ZSBcImJhc2VcIiByZW5kZXIgdGltZXMgZm9yIGJhaWxvdXRzLlxuICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKCk7XG4gIH1cblxuICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlIGNoaWxkcmVuIGhhdmUgYW55IHBlbmRpbmcgd29yay5cblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpKSB7XG4gICAgLy8gVGhlIGNoaWxkcmVuIGRvbid0IGhhdmUgYW55IHdvcmsgZWl0aGVyLiBXZSBjYW4gc2tpcCB0aGVtLlxuICAgIC8vIFRPRE86IE9uY2Ugd2UgYWRkIGJhY2sgcmVzdW1pbmcsIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgY2hpbGRyZW4gYXJlXG4gICAgLy8gYSB3b3JrLWluLXByb2dyZXNzIHNldC4gSWYgc28sIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlaXIgZWZmZWN0cy5cbiAgICB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gVGhpcyBmaWJlciBkb2Vzbid0IGhhdmUgd29yaywgYnV0IGl0cyBzdWJ0cmVlIGRvZXMuIENsb25lIHRoZSBjaGlsZFxuICAvLyBmaWJlcnMgYW5kIGNvbnRpbnVlLlxuXG5cbiAgY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcmVtb3VudEZpYmVyKGN1cnJlbnQsIG9sZFdvcmtJblByb2dyZXNzLCBuZXdXb3JrSW5Qcm9ncmVzcykge1xuICB7XG4gICAgdmFyIHJldHVybkZpYmVyID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgaWYgKHJldHVybkZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc3dhcCB0aGUgcm9vdCBmaWJlci4nKTtcbiAgICB9IC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgb2xkIGN1cnJlbnQuXG4gICAgLy8gSXQgd2lsbCBnZXQgZGVsZXRlZC5cblxuXG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIG9sZFdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIENvbm5lY3QgdG8gdGhlIG5ldyB0cmVlLlxuXG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuaW5kZXggPSBvbGRXb3JrSW5Qcm9ncmVzcy5pbmRleDtcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gb2xkV29ya0luUHJvZ3Jlc3Muc2libGluZztcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5yZXR1cm4gPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmVmID0gb2xkV29ya0luUHJvZ3Jlc3MucmVmOyAvLyBSZXBsYWNlIHRoZSBjaGlsZC9zaWJsaW5nIHBvaW50ZXJzIGFib3ZlIGl0LlxuXG4gICAgaWYgKG9sZFdvcmtJblByb2dyZXNzID09PSByZXR1cm5GaWJlci5jaGlsZCkge1xuICAgICAgcmV0dXJuRmliZXIuY2hpbGQgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByZXZTaWJsaW5nID0gcmV0dXJuRmliZXIuY2hpbGQ7XG5cbiAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHBhcmVudCB0byBoYXZlIGEgY2hpbGQuJyk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChwcmV2U2libGluZy5zaWJsaW5nICE9PSBvbGRXb3JrSW5Qcm9ncmVzcykge1xuICAgICAgICBwcmV2U2libGluZyA9IHByZXZTaWJsaW5nLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHByZXZTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByZXZpb3VzIHNpYmxpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJldlNpYmxpbmcuc2libGluZyA9IG5ld1dvcmtJblByb2dyZXNzO1xuICAgIH0gLy8gRGVsZXRlIHRoZSBvbGQgZmliZXIgYW5kIHBsYWNlIHRoZSBuZXcgb25lLlxuICAgIC8vIFNpbmNlIHRoZSBvbGQgZmliZXIgaXMgZGlzY29ubmVjdGVkLCB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG1hbnVhbGx5LlxuXG5cbiAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2N1cnJlbnRdO1xuICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudCk7XG4gICAgfVxuXG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50OyAvLyBSZXN0YXJ0IHdvcmsgZnJvbSB0aGUgbmV3IGZpYmVyLlxuXG4gICAgcmV0dXJuIG5ld1dvcmtJblByb2dyZXNzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIEJlZm9yZSBwZXJmb3JtaW5nIGFuIGVhcmx5IGJhaWxvdXQsIHdlIG11c3QgY2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmdcbiAgLy8gdXBkYXRlcyBvciBjb250ZXh0LlxuICB2YXIgdXBkYXRlTGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHVwZGF0ZUxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBObyBwZW5kaW5nIHVwZGF0ZSwgYnV0IGJlY2F1c2UgY29udGV4dCBpcyBwcm9wYWdhdGVkIGxhemlseSwgd2UgbmVlZFxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdEVhcmx5QmFpbG91dElmTm9TY2hlZHVsZWRVcGRhdGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZmliZXIgZG9lcyBub3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrLiBCYWlsb3V0IHdpdGhvdXQgZW50ZXJpbmdcbiAgLy8gdGhlIGJlZ2luIHBoYXNlLiBUaGVyZSdzIHN0aWxsIHNvbWUgYm9va2tlZXBpbmcgd2UgdGhhdCBuZWVkcyB0byBiZSBkb25lXG4gIC8vIGluIHRoaXMgb3B0aW1pemVkIHBhdGgsIG1vc3RseSBwdXNoaW5nIHN0dWZmIG9udG8gdGhlIHN0YWNrLlxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnZhbHVlO1xuICAgICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICB7XG4gICAgICAgIC8vIFByb2ZpbGVyIHNob3VsZCBvbmx5IGNhbGwgb25SZW5kZXIgd2hlbiBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzIGFjdHVhbGx5IHJlbmRlcmVkLlxuICAgICAgICB2YXIgaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgaWYgKGhhc0NoaWxkV29yaykge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBSZXNldCBlZmZlY3QgZHVyYXRpb25zIGZvciB0aGUgbmV4dCBldmVudHVhbCBlZmZlY3QgcGhhc2UuXG4gICAgICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgICAgICB2YXIgc3RhdGVOb2RlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChzdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gV2Uga25vdyB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgc3VzcGVuZCBhZ2FpbiBiZWNhdXNlIGlmIGl0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiB1bnN1c3BlbmRlZCBpdCBoYXMgY29tbWl0dGVkIGFzIGEgcmVzb2x2ZWQgU3VzcGVuc2UgY29tcG9uZW50LlxuICAgICAgICAgICAgLy8gSWYgaXQgbmVlZHMgdG8gYmUgcmV0cmllZCwgaXQgc2hvdWxkIGhhdmUgd29yayBzY2hlZHVsZWQgb24gaXQuXG5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7IC8vIFdlIHNob3VsZCBuZXZlciByZW5kZXIgdGhlIGNoaWxkcmVuIG9mIGEgZGVoeWRyYXRlZCBib3VuZGFyeSB1bnRpbCB3ZVxuICAgICAgICAgICAgLy8gdXBncmFkZSBpdC4gV2UgcmV0dXJuIG51bGwgaW5zdGVhZCBvZiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrLlxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9IC8vIElmIHRoaXMgYm91bmRhcnkgaXMgY3VycmVudGx5IHRpbWVkIG91dCwgd2UgbmVlZCB0byBkZWNpZGVcbiAgICAgICAgICAvLyB3aGV0aGVyIHRvIHJldHJ5IHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBvciB0byBza2lwIG92ZXIgaXQgYW5kXG4gICAgICAgICAgLy8gZ28gc3RyYWlnaHQgdG8gdGhlIGZhbGxiYWNrLiBDaGVjayB0aGUgcHJpb3JpdHkgb2YgdGhlIHByaW1hcnlcbiAgICAgICAgICAvLyBjaGlsZCBmcmFnbWVudC5cblxuXG4gICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgdmFyIHByaW1hcnlDaGlsZExhbmVzID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcztcblxuICAgICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBwcmltYXJ5Q2hpbGRMYW5lcykpIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBVc2UgdGhlIG5vcm1hbCBwYXRoXG4gICAgICAgICAgICAvLyB0byBhdHRlbXB0IHRvIHJlbmRlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBhZ2Fpbi5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCBkb2VzIG5vdCBoYXZlIHBlbmRpbmcgd29yayBtYXJrZWRcbiAgICAgICAgICAgIC8vIG9uIGl0XG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gZG8gbm90IGhhdmUgcGVuZGluZyB3b3JrIHdpdGggc3VmZmljaWVudFxuICAgICAgICAgICAgLy8gcHJpb3JpdHkuIEJhaWxvdXQuXG5cbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBmYWxsYmFjayBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gU2tpcCBvdmVyIHRoZVxuICAgICAgICAgICAgICAvLyBwcmltYXJ5IGNoaWxkcmVuIGFuZCB3b3JrIG9uIHRoZSBmYWxsYmFjay5cbiAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW4gcmV0dXJuIGBudWxsYCBoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSBjaGVja2VkXG4gICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlcmUgd2VyZSBuZXN0ZWQgY29udGV4dCBjb25zdW1lcnMsIHZpYSB0aGUgY2FsbCB0b1xuICAgICAgICAgICAgICAvLyBgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29ya2AgYWJvdmUuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgICAgICB2YXIgX2hhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWV0aGluZyB3YXMgaW4gZmFsbGJhY2sgc3RhdGUgbGFzdCB0aW1lLCBhbmQgd2UgaGF2ZSBhbGwgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGNoaWxkcmVuIHRoZW4gd2UncmUgc3RpbGwgaW4gcHJvZ3Jlc3NpdmUgbG9hZGluZyBzdGF0ZS5cbiAgICAgICAgICAgIC8vIFNvbWV0aGluZyBtaWdodCBnZXQgdW5ibG9ja2VkIGJ5IHN0YXRlIHVwZGF0ZXMgb3IgcmV0cmllcyBpbiB0aGVcbiAgICAgICAgICAgIC8vIHRyZWUgd2hpY2ggd2lsbCBhZmZlY3QgdGhlIHRhaWwuIFNvIHdlIG5lZWQgdG8gdXNlIHRoZSBub3JtYWxcbiAgICAgICAgICAgIC8vIHBhdGggdG8gY29tcHV0ZSB0aGUgY29ycmVjdCB0YWlsLlxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH0gLy8gSWYgbm9uZSBvZiB0aGUgY2hpbGRyZW4gaGFkIGFueSB3b3JrLCB0aGF0IG1lYW5zIHRoYXQgbm9uZSBvZlxuICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG5cblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQgYmVmb3JlIGFuZCB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgY2hpbGRyZW4sXG4gICAgICAgIC8vIHRoZW4gdGhlIHRhaWwgZG9lc24ndCBtYXR0ZXIuIEFueXRoaW5nIG5ldyB0aGF0IHN1c3BlbmRzIHdpbGwgd29ya1xuICAgICAgICAvLyBpbiB0aGUgXCJ0b2dldGhlclwiIG1vZGUsIHNvIHdlIGNhbiBjb250aW51ZSBmcm9tIHRoZSBzdGF0ZSB3ZSBoYWQuXG5cblxuICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRvIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSBpbiBjYXNlIHdlJ3ZlIHN0YXJ0ZWQgYSBkaWZmZXJlbnRcbiAgICAgICAgICAvLyB1cGRhdGUgaW4gdGhlIHBhc3QgYnV0IGRpZG4ndCBjb21wbGV0ZSBpdC5cbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3RFZmZlY3QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KTtcblxuICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgdHJlZSBzdGlsbCBuZWVkcyB0byBiZSBkZWZlcnJlZC4gVGhpcyBpc1xuICAgICAgICAvLyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBsb2dpYyB1c2VkIGluIHRoZSBub3JtYWwgdXBkYXRlIHBhdGgsXG4gICAgICAgIC8vIHNvIHdlJ2xsIGp1c3QgZW50ZXIgdGhhdC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3ZSdsbCBiYWlsIG91dFxuICAgICAgICAvLyBhdCB0aGUgbmV4dCBsZXZlbCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBiZWNhdXNlIHRoZSBjaGlsZCBwcm9wc1xuICAgICAgICAvLyBoYXZlIG5vdCBjaGFuZ2VkLiBXaGljaCBpcyBmaW5lLlxuICAgICAgICAvLyBUT0RPOiBQcm9iYWJseSBzaG91bGQgcmVmYWN0b3IgYGJlZ2luV29ya2AgdG8gc3BsaXQgdGhlIGJhaWxvdXRcbiAgICAgICAgLy8gcGF0aCBmcm9tIHRoZSBub3JtYWwgcGF0aC4gSSdtIHRlbXB0ZWQgdG8gZG8gYSBsYWJlbGVkIGJyZWFrIGhlcmVcbiAgICAgICAgLy8gYnV0IEkgd29uJ3QgOilcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBiZWdpbldvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ICYmIGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgd2lsbCByZXN0YXJ0IHRoZSBiZWdpbiBwaGFzZSB3aXRoIGEgbmV3IGZpYmVyLlxuICAgICAgcmV0dXJuIHJlbW91bnRGaWJlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLmtleSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciB8fCBudWxsLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCB3b3JrSW5Qcm9ncmVzcy5sYW5lcykpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgaGFzQ29udGV4dENoYW5nZWQoKSB8fCAoIC8vIEZvcmNlIGEgcmUtcmVuZGVyIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIGR1ZSB0byBob3QgcmVsb2FkOlxuICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSBjdXJyZW50LnR5cGUgKSkge1xuICAgICAgLy8gSWYgcHJvcHMgb3IgY29udGV4dCBjaGFuZ2VkLCBtYXJrIHRoZSBmaWJlciBhcyBoYXZpbmcgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAvLyBUaGlzIG1heSBiZSB1bnNldCBpZiB0aGUgcHJvcHMgYXJlIGRldGVybWluZWQgdG8gYmUgZXF1YWwgbGF0ZXIgKG1lbW8pLlxuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5laXRoZXIgcHJvcHMgbm9yIGxlZ2FjeSBjb250ZXh0IGNoYW5nZXMuIENoZWNrIGlmIHRoZXJlJ3MgYSBwZW5kaW5nXG4gICAgICAvLyB1cGRhdGUgb3IgY29udGV4dCBjaGFuZ2UuXG4gICAgICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCAmJiAvLyBJZiB0aGlzIGlzIHRoZSBzZWNvbmQgcGFzcyBvZiBhbiBlcnJvciBvciBzdXNwZW5zZSBib3VuZGFyeSwgdGhlcmVcbiAgICAgIC8vIG1heSBub3QgYmUgd29yayBzY2hlZHVsZWQgb24gYGN1cnJlbnRgLCBzbyB3ZSBjaGVjayBmb3IgdGhpcyBmbGFnLlxuICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gTm8gcGVuZGluZyB1cGRhdGVzIG9yIGNvbnRleHQuIEJhaWwgb3V0IG5vdy5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYXR0ZW1wdEVhcmx5QmFpbG91dElmTm9TY2hlZHVsZWRVcGRhdGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIG9uIHRoaXMgZmliZXIsIGJ1dCB0aGVyZSBhcmUgbm8gbmV3IHByb3BzXG4gICAgICAgIC8vIG5vciBsZWdhY3kgY29udGV4dC4gU2V0IHRoaXMgdG8gZmFsc2UuIElmIGFuIHVwZGF0ZSBxdWV1ZSBvciBjb250ZXh0XG4gICAgICAgIC8vIGNvbnN1bWVyIHByb2R1Y2VzIGEgY2hhbmdlZCB2YWx1ZSwgaXQgd2lsbCBzZXQgdGhpcyB0byB0cnVlLiBPdGhlcndpc2UsXG4gICAgICAgIC8vIHRoZSBjb21wb25lbnQgd2lsbCBhc3N1bWUgdGhlIGNoaWxkcmVuIGhhdmUgbm90IGNoYW5nZWQgYW5kIGJhaWwgb3V0LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNoaWxkIGJlbG9uZ3MgdG8gYSBsaXN0IG9mIG11bGlwbGUgY2hpbGRyZW4gaW5cbiAgICAgIC8vIGl0cyBwYXJlbnQuXG4gICAgICAvL1xuICAgICAgLy8gSW4gYSB0cnVlIG11bHRpLXRocmVhZGVkIGltcGxlbWVudGF0aW9uLCB3ZSB3b3VsZCByZW5kZXIgY2hpbGRyZW4gb25cbiAgICAgIC8vIHBhcmFsbGVsIHRocmVhZHMuIFRoaXMgd291bGQgcmVwcmVzZW50IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgcmVuZGVyXG4gICAgICAvLyB0aHJlYWQgZm9yIHRoaXMgc3VidHJlZS5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBvbmx5IHVzZSB0aGlzIGZvciBpZCBnZW5lcmF0aW9uIGR1cmluZyBoeWRyYXRpb24sIHdoaWNoIGlzIHdoeSB0aGVcbiAgICAgIC8vIGxvZ2ljIGlzIGxvY2F0ZWQgaW4gdGhpcyBzcGVjaWFsIGJyYW5jaC5cbiAgICAgIHZhciBzbG90SW5kZXggPSB3b3JrSW5Qcm9ncmVzcy5pbmRleDtcbiAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gZ2V0Rm9ya3NBdExldmVsKCk7XG4gICAgICBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzLCBzbG90SW5kZXgpO1xuICAgIH1cbiAgfSAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjbGVhciBwZW5kaW5nIHVwZGF0ZSBwcmlvcml0eS5cbiAgLy8gVE9ETzogVGhpcyBhc3N1bWVzIHRoYXQgd2UncmUgYWJvdXQgdG8gZXZhbHVhdGUgdGhlIGNvbXBvbmVudCBhbmQgcHJvY2Vzc1xuICAvLyB0aGUgdXBkYXRlIHF1ZXVlLiBIb3dldmVyLCB0aGVyZSdzIGFuIGV4Y2VwdGlvbjogU2ltcGxlTWVtb0NvbXBvbmVudFxuICAvLyBzb21ldGltZXMgYmFpbHMgb3V0IGxhdGVyIGluIHRoZSBiZWdpbiBwaGFzZS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGRcbiAgLy8gbW92ZSB0aGlzIGFzc2lnbm1lbnQgb3V0IG9mIHRoZSBjb21tb24gcGF0aCBhbmQgaW50byBlYWNoIGJyYW5jaC5cblxuXG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIG1vdW50SW5kZXRlcm1pbmF0ZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcbiAgICAgICAgcmV0dXJuIG1vdW50TGF6eUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBDb21wb25lbnQgPyB1bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgdW5yZXNvbHZlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50LCBfdW5yZXNvbHZlZFByb3BzKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQsIF9yZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0VGV4dChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gdHlwZSA/IF91bnJlc29sdmVkUHJvcHMyIDogcmVzb2x2ZURlZmF1bHRQcm9wcyh0eXBlLCBfdW5yZXNvbHZlZFByb3BzMik7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIF9yZXNvbHZlZFByb3BzMiwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNb2RlOlxuICAgICAgcmV0dXJuIHVwZGF0ZU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICByZXR1cm4gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfdHlwZTIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFJlc29sdmUgb3V0ZXIgcHJvcHMgZmlyc3QsIHRoZW4gcmVzb2x2ZSBpbm5lciBwcm9wcy5cblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIsIF91bnJlc29sdmVkUHJvcHMzKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBfdHlwZTIucHJvcFR5cGVzO1xuXG4gICAgICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIF9yZXNvbHZlZFByb3BzMywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIudHlwZSwgX3Jlc29sdmVkUHJvcHMzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF90eXBlMiwgX3Jlc29sdmVkUHJvcHMzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudDIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50MiA/IF91bnJlc29sdmVkUHJvcHM0IDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wczQpO1xuXG4gICAgICAgIHJldHVybiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudDIsIF9yZXNvbHZlZFByb3BzNCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBUYWcgdGhlIGZpYmVyIHdpdGggYW4gdXBkYXRlIGVmZmVjdC4gVGhpcyB0dXJucyBhIFBsYWNlbWVudCBpbnRvXG4gIC8vIGEgUGxhY2VtZW50QW5kVXBkYXRlLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcykge1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZlN0YXRpYztcbiAgfVxufVxuXG52YXIgYXBwZW5kQWxsQ2hpbGRyZW47XG52YXIgdXBkYXRlSG9zdENvbnRhaW5lcjtcbnZhciB1cGRhdGVIb3N0Q29tcG9uZW50JDE7XG52YXIgdXBkYXRlSG9zdFRleHQkMTtcblxue1xuICAvLyBNdXRhdGlvbiBtb2RlXG4gIGFwcGVuZEFsbENoaWxkcmVuID0gZnVuY3Rpb24gKHBhcmVudCwgd29ya0luUHJvZ3Jlc3MsIG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSwgaXNIaWRkZW4pIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBjcmVhdGVkIGJ1dCB3ZSBuZWVkIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnQsIG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0Q29udGFpbmVyID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7Ly8gTm9vcFxuICB9O1xuXG4gIHVwZGF0ZUhvc3RDb21wb25lbnQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlLCB0aGF0IG1lYW5zIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCB3ZSBuZWVkIHRvXG4gICAgLy8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy5cbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzKSB7XG4gICAgICAvLyBJbiBtdXRhdGlvbiBtb2RlLCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGEgYmFpbG91dCBiZWNhdXNlXG4gICAgICAvLyB3ZSB3b24ndCB0b3VjaCB0aGlzIG5vZGUgZXZlbiBpZiBjaGlsZHJlbiBjaGFuZ2VkLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgd2UgZ2V0IHVwZGF0ZWQgYmVjYXVzZSBvbmUgb2Ygb3VyIGNoaWxkcmVuIHVwZGF0ZWQsIHdlIGRvbid0XG4gICAgLy8gaGF2ZSBuZXdQcm9wcyBzbyB3ZSdsbCBoYXZlIHRvIHJldXNlIHRoZW0uXG4gICAgLy8gVE9ETzogU3BsaXQgdGhlIHVwZGF0ZSBBUEkgYXMgc2VwYXJhdGUgZm9yIHRoZSBwcm9wcyB2cy4gY2hpbGRyZW4uXG4gICAgLy8gRXZlbiBiZXR0ZXIgd291bGQgYmUgaWYgY2hpbGRyZW4gd2VyZW4ndCBzcGVjaWFsIGNhc2VkIGF0IGFsbCB0aG8uXG5cblxuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsgLy8gVE9ETzogRXhwZXJpZW5jaW5nIGFuIGVycm9yIHdoZXJlIG9sZFByb3BzIGlzIG51bGwuIFN1Z2dlc3RzIGEgaG9zdFxuICAgIC8vIGNvbXBvbmVudCBpcyBoaXR0aW5nIHRoZSByZXN1bWUgcGF0aC4gRmlndXJlIG91dCB3aHkuIFBvc3NpYmx5XG4gICAgLy8gcmVsYXRlZCB0byBgaGlkZGVuYC5cblxuICAgIHZhciB1cGRhdGVQYXlsb2FkID0gcHJlcGFyZVVwZGF0ZShpbnN0YW5jZSwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCk7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGlzIGRvbmUgaW4gY29tbWl0V29yay5cblxuICAgIGlmICh1cGRhdGVQYXlsb2FkKSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdFRleHQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIElmIHRoZSB0ZXh0IGRpZmZlcnMsIG1hcmsgaXQgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaW4gZG9uZSBpbiBjb21taXRXb3JrLlxuICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrKSB7XG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgLy8gSWYgd2UncmUgaHlkcmF0aW5nLCB3ZSBzaG91bGQgY29uc3VtZSBhcyBtYW55IGl0ZW1zIGFzIHdlIGNhblxuICAgIC8vIHNvIHdlIGRvbid0IGxlYXZlIGFueSBiZWhpbmQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChyZW5kZXJTdGF0ZS50YWlsTW9kZSkge1xuICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAodGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsYXN0VGFpbE5vZGUgPSB0YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAobGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2NvbGxhcHNlZCc6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgX3RhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIF9sYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChfdGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoX3RhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX2xhc3RUYWlsTm9kZSA9IF90YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGFpbE5vZGUgPSBfdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChfbGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICBpZiAoIWhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayAmJiByZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXZSBzdXNwZW5kZWQgZHVyaW5nIHRoZSBoZWFkLiBXZSB3YW50IHRvIHNob3cgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgICAvLyByb3cgYXQgdGhlIHRhaWwuIFNvIHdlJ2xsIGtlZXAgb24gYW5kIGN1dCBvZmYgdGhlIHJlc3QuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgX2xhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZVByb3BlcnRpZXMoY29tcGxldGVkV29yaykge1xuICB2YXIgZGlkQmFpbG91dCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlICE9PSBudWxsICYmIGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkID09PSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuXG4gIGlmICghZGlkQmFpbG91dCkge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoY2hpbGQubGFuZXMsIGNoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLmZsYWdzOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgICAgIC8vIG9ubHkgYmUgdXBkYXRlZCBpZiB3b3JrIGlzIGRvbmUgb24gdGhlIGZpYmVyIChpLmUuIGl0IGRvZXNuJ3QgYmFpbG91dCkuXG4gICAgICAgIC8vIFdoZW4gd29yayBpcyBkb25lLCBpdCBzaG91bGQgYnViYmxlIHRvIHRoZSBwYXJlbnQncyBhY3R1YWxEdXJhdGlvbi4gSWZcbiAgICAgICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgICAgICAvLyB0aGlzIHZhbHVlIHdpbGwgcmVmbGVjdCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd29ya2luZyBvbiBhIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSW4gdGhhdCBjYXNlIGl0IHNob3VsZCBub3QgYnViYmxlLiBXZSBkZXRlcm1pbmUgd2hldGhlciBpdCB3YXNcbiAgICAgICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5mbGFnczsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfSBlbHNlIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBfdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBfY2hpbGQyID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDIgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQyLmxhbmVzLCBfY2hpbGQyLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLmZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2NoaWxkMi50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBfY2hpbGQyID0gX2NoaWxkMi5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZDMgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMyAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDMubGFuZXMsIF9jaGlsZDMuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuZmxhZ3MgJiBTdGF0aWNNYXNrOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQzLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZDMgPSBfY2hpbGQzLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbiAgcmV0dXJuIGRpZEJhaWxvdXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSkge1xuICBpZiAoaGFzVW5oeWRyYXRlZFRhaWxOb2RlcygpICYmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKHdvcmtJblByb2dyZXNzKTtcbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXIgfCBJbmNvbXBsZXRlIHwgU2hvdWxkQ2FwdHVyZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCAmJiBuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIC8vIFdlIG1pZ2h0IGJlIGluc2lkZSBhIGh5ZHJhdGlvbiBzdGF0ZSB0aGUgZmlyc3QgdGltZSB3ZSdyZSBwaWNraW5nIHVwIHRoaXNcbiAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgYW5kIGFsc28gYWZ0ZXIgd2UndmUgcmVlbnRlcmVkIGl0IGZvciBmdXJ0aGVyIGh5ZHJhdGlvbi5cbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgaWYgKCF3YXNIeWRyYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGEgaHlkcmF0ZWQgbm9kZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBtaWdodCBoYXZlIHJlZW50ZXJlZCB0aGlzIGJvdW5kYXJ5IHRvIGh5ZHJhdGUgaXQuIElmIHNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBoeWRyYXRpb25cbiAgICAgIC8vIHN0YXRlIHNpbmNlIHdlJ3JlIG5vdyBleGl0aW5nIG91dCBvZiBpdC4gcG9wSHlkcmF0aW9uU3RhdGUgZG9lc24ndCBkbyB0aGF0IGZvciB1cy5cbiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgYm91bmRhcnkgZGlkIG5vdCBzdXNwZW5kIHNvIGl0J3Mgbm93IGh5ZHJhdGVkIGFuZCB1bnN1c3BlbmRlZC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBtYXJrIHRoaXMgYm91bmRhcnlcbiAgICAgIC8vIGFzIGhhdmluZyBoeWRyYXRlZCBzbyBldmVudHMga25vdyB0aGF0IHRoZXkncmUgZnJlZSB0byBiZSBpbnZva2VkLlxuICAgICAgLy8gSXQncyBhbHNvIGEgc2lnbmFsIHRvIHJlcGxheSBldmVudHMgYW5kIHRoZSBzdXNwZW5zZSBjYWxsYmFjay5cbiAgICAgIC8vIElmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggcmV0cnkgbGlzdGVuZXJzLlxuICAgICAgLy8gU28gd2UgbWlnaHQgYXMgd2VsbCBhbHdheXMgbWFyayB0aGlzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIF9pc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoX2lzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChfcHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBfcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoaXMgdHJlZS4gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlcixcbiAgICAvLyB0aGVyZSBtYXkgaGF2ZSBiZWVuIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uXG4gICAgLy8gYXR0ZW1wdC4gSWYgc28sIGFkZCB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZS5cbiAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpOyAvLyBGYWxsIHRocm91Z2ggdG8gbm9ybWFsIFN1c3BlbnNlIHBhdGhcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cblxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgTW9kZTpcbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZpYmVyUm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuXG4gICAgICAgIGlmIChmaWJlclJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBmaWJlclJvb3QuY29udGV4dCA9IGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dDtcbiAgICAgICAgICBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5jaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCBwb3Agc28gdGhhdCB3ZSBjYW4gZGVsZXRlIGFueSByZW1haW5pbmcgY2hpbGRyZW5cbiAgICAgICAgICAvLyB0aGF0IHdlcmVuJ3QgaHlkcmF0ZWQuXG4gICAgICAgICAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKHdhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgdGhlbiB3ZSdsbCBuZWVkIHRvIHNjaGVkdWxlIGFuIHVwZGF0ZSBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBjb21taXQgc2lkZS1lZmZlY3RzIG9uIHRoZSByb290LlxuICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKCAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xpZW50IHJvb3RcbiAgICAgICAgICAgICAgIXByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQgfHwgLy8gQ2hlY2sgaWYgd2UgcmV2ZXJ0ZWQgdG8gY2xpZW50IHJlbmRlcmluZyAoZS5nLiBkdWUgdG8gYW4gZXJyb3IpXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBjbGVhciB0aGlzIGNvbnRhaW5lciBhdCB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gbmV4dCBjb21taXQuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBSZWFjdCByZW5kZXJpbmcgaW50byBhXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIHdpdGggcHJldmlvdXMgY2hpbGRyZW4uIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgdG9vLCBiZWNhdXNlIGN1cnJlbnQuY2hpbGQgd291bGQgb25seSBiZSBudWxsIGlmIHRoZVxuICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIGNvbnRhaW5lciB3b3VsZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgLy8gYmUgZW1wdHkpLlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90OyAvLyBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLCB0aGVyZSBtYXkgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb24gYXR0ZW1wdC4gSWYgc28sIGFkZFxuICAgICAgICAgICAgICAgIC8vIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlIGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuXG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBNb3ZlIGNyZWF0ZUluc3RhbmNlIHRvIGJlZ2luV29yayBhbmQga2VlcCBpdCBvbiBhIGNvbnRleHRcbiAgICAgICAgICAvLyBcInN0YWNrXCIgYXMgdGhlIHBhcmVudC4gVGhlbiBhcHBlbmQgY2hpbGRyZW4gYXMgd2UgZ28gaW4gYmVnaW5Xb3JrXG4gICAgICAgICAgLy8gb3IgY29tcGxldGVXb3JrIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHdhbnQgdG8gYWRkIHRoZW0gdG9wLT5kb3duIG9yXG4gICAgICAgICAgLy8gYm90dG9tLT51cC4gVG9wLT5kb3duIGlzIGZhc3RlciBpbiBJRTExLlxuXG4gICAgICAgICAgdmFyIF93YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBhbmQgY3JlYXRlSW5zdGFuY2Ugc3RlcCBpbnRvIHRoZSBiZWdpblBoYXNlXG4gICAgICAgICAgICAvLyB0byBjb25zb2xpZGF0ZS5cbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgY2hhbmdlcyB0byB0aGUgaHlkcmF0ZWQgbm9kZSBuZWVkIHRvIGJlIGFwcGxpZWQgYXQgdGhlXG4gICAgICAgICAgICAgIC8vIGNvbW1pdC1waGFzZSB3ZSBtYXJrIHRoaXMgYXMgc3VjaC5cbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW4oaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIENlcnRhaW4gcmVuZGVyZXJzIHJlcXVpcmUgY29tbWl0LXRpbWUgZWZmZWN0cyBmb3IgaW5pdGlhbCBtb3VudC5cbiAgICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgc3VwcG9ydHMgYXV0by1mb2N1cyBmb3IgY2VydGFpbiBlbGVtZW50cykuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgc3VjaCByZW5kZXJlcnMgZ2V0IHNjaGVkdWxlZCBmb3IgbGF0ZXIgd29yay5cblxuICAgICAgICAgICAgaWYgKGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGluc3RhbmNlLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSkge1xuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MucmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHJlZiBvbiBhIGhvc3Qgbm9kZSB3ZSBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1RleHQgPSBuZXdQcm9wcztcblxuICAgICAgICBpZiAoY3VycmVudCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudC5tZW1vaXplZFByb3BzOyAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG5cbiAgICAgICAgICB1cGRhdGVIb3N0VGV4dCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5ld1RleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9yb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuXG4gICAgICAgICAgdmFyIF9jdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuXG4gICAgICAgICAgdmFyIF93YXNIeWRyYXRlZDIgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAoX3dhc0h5ZHJhdGVkMikge1xuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3JlYXRlVGV4dEluc3RhbmNlKG5ld1RleHQsIF9yb290Q29udGFpbmVySW5zdGFuY2UsIF9jdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsgLy8gU3BlY2lhbCBwYXRoIGZvciBkZWh5ZHJhdGVkIGJvdW5kYXJpZXMuIFdlIG1heSBldmVudHVhbGx5IG1vdmUgdGhpc1xuICAgICAgICAvLyB0byBpdHMgb3duIGZpYmVyIHR5cGUgc28gdGhhdCB3ZSBjYW4gYWRkIG90aGVyIGtpbmRzIG9mIGh5ZHJhdGlvblxuICAgICAgICAvLyBib3VuZGFyaWVzIHRoYXQgYXJlbid0IGFzc29jaWF0ZWQgd2l0aCBhIFN1c3BlbnNlIHRyZWUuIEluIGFudGljaXBhdGlvblxuICAgICAgICAvLyBvZiBzdWNoIGEgcmVmYWN0b3IsIGFsbCB0aGUgaHlkcmF0aW9uIGxvZ2ljIGlzIGNvbnRhaW5lZCBpblxuICAgICAgICAvLyB0aGlzIGJyYW5jaC5cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCA9IGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSk7XG5cbiAgICAgICAgICBpZiAoIWZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGgpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlLiBUaGVyZSB3ZXJlIHJlbWFpbmluZyB1bmh5ZHJhdGVkIG5vZGVzLiBXZSB0cmVhdFxuICAgICAgICAgICAgICAvLyB0aGlzIGFzIGEgbWlzbWF0Y2guIFJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlxuICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBEaWQgbm90IGZpbmlzaCBoeWRyYXRpbmcsIGVpdGhlciBiZWNhdXNlIHRoaXMgaXMgdGhlIGluaXRpYWxcbiAgICAgICAgICAgICAgLy8gcmVuZGVyIG9yIGJlY2F1c2Ugc29tZXRoaW5nIHN1c3BlbmRlZC5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBDb250aW51ZSB3aXRoIHRoZSBub3JtYWwgU3VzcGVuc2UgcGF0aC5cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7IC8vIERvIG5vdCByZXNldCB0aGUgZWZmZWN0IGxpc3QuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV4dERpZFRpbWVvdXQgPSBuZXh0U3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBwcmV2RGlkVGltZW91dCA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAvLyBhIHBhc3NpdmUgZWZmZWN0LCB3aGljaCBpcyB3aGVuIHdlIHByb2Nlc3MgdGhlIHRyYW5zaXRpb25zXG5cblxuICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQgIT09IHByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAgICAgLy8gYW4gZWZmZWN0IHRvIHRvZ2dsZSB0aGUgc3VidHJlZSdzIHZpc2liaWxpdHkuIFdoZW4gd2Ugc3dpdGNoIGZyb21cbiAgICAgICAgICAvLyBmYWxsYmFjayAtPiBwcmltYXJ5LCB0aGUgaW5uZXIgT2Zmc2NyZWVuIGZpYmVyIHNjaGVkdWxlcyB0aGlzIGVmZmVjdFxuICAgICAgICAgIC8vIGFzIHBhcnQgb2YgaXRzIG5vcm1hbCBjb21wbGV0ZSBwaGFzZS4gQnV0IHdoZW4gd2Ugc3dpdGNoIGZyb21cbiAgICAgICAgICAvLyBwcmltYXJ5IC0+IGZhbGxiYWNrLCB0aGUgaW5uZXIgT2Zmc2NyZWVuIGZpYmVyIGRvZXMgbm90IGhhdmUgYSBjb21wbGV0ZVxuICAgICAgICAgIC8vIHBoYXNlLiBTbyB3ZSBuZWVkIHRvIHNjaGVkdWxlIGl0cyBlZmZlY3QgaGVyZS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdlIGFsc28gdXNlIHRoaXMgZmxhZyB0byBjb25uZWN0L2Rpc2Nvbm5lY3QgdGhlIGVmZmVjdHMsIGJ1dCB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxvZ2ljIGFwcGxpZXM6IHdoZW4gcmUtY29ubmVjdGluZywgdGhlIE9mZnNjcmVlbiBmaWJlcidzIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2Ugd2lsbCBoYW5kbGUgc2NoZWR1bGluZyB0aGUgZWZmZWN0LiBJdCdzIG9ubHkgd2hlbiB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAvLyBpcyBhY3RpdmUgdGhhdCB3ZSBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuXG5cblxuICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkge1xuICAgICAgICAgICAgdmFyIF9vZmZzY3JlZW5GaWJlcjIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIF9vZmZzY3JlZW5GaWJlcjIuZmxhZ3MgfD0gVmlzaWJpbGl0eTsgLy8gVE9ETzogVGhpcyB3aWxsIHN0aWxsIHN1c3BlbmQgYSBzeW5jaHJvbm91cyB0cmVlIGlmIGFueXRoaW5nXG4gICAgICAgICAgICAvLyBpbiB0aGUgY29uY3VycmVudCB0cmVlIGFscmVhZHkgc3VzcGVuZGVkIGR1cmluZyB0aGlzIHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBrbm93biBidWcuXG5cbiAgICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBiYWNrIHRvIHRocm93RXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyB0b28gbGF0ZVxuICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbGFyZ2UgdHJlZSB3aGljaCBpcyBjb21tb24gZm9yIGluaXRpYWwgbG9hZHMuIFdlXG4gICAgICAgICAgICAgIC8vIGRvbid0IGtub3cgaWYgd2Ugc2hvdWxkIHJlc3RhcnQgYSByZW5kZXIgb3Igbm90IHVudGlsIHdlIGdldFxuICAgICAgICAgICAgICAvLyB0aGlzIG1hcmtlciwgYW5kIHRoaXMgaXMgdG9vIGxhdGUuXG4gICAgICAgICAgICAgIC8vIElmIHRoaXMgcmVuZGVyIGFscmVhZHkgaGFkIGEgcGluZyBvciBsb3dlciBwcmkgdXBkYXRlcyxcbiAgICAgICAgICAgICAgLy8gYW5kIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2Uga25vdyB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdlXG4gICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGltbWVkaWF0ZWx5IHJlc3RhcnQgZnJvbSB3aXRoaW4gdGhyb3dFeGNlcHRpb24uXG4gICAgICAgICAgICAgIHZhciBoYXNJbnZpc2libGVDaGlsZENvbnRleHQgPSBjdXJyZW50ID09PSBudWxsICYmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrICE9PSB0cnVlIHx8ICFlbmFibGVTdXNwZW5zZUF2b2lkVGhpc0ZhbGxiYWNrKTtcblxuICAgICAgICAgICAgICBpZiAoaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0IHx8IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBpbiBhbiBpbnZpc2libGUgdHJlZSBvciBhIG5ldyByZW5kZXIsIHRoZW4gc2hvd2luZ1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgYm91bmRhcnkgaXMgb2suXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZCgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBoaWRlIGNvbnRlbnQgc28gd2Ugc2hvdWxkXG4gICAgICAgICAgICAgICAgLy8gc3VzcGVuZCBmb3IgbG9uZ2VyIGlmIHBvc3NpYmxlLlxuICAgICAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3YWtlYWJsZXMgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAod2FrZWFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCBhIHJldHJ5IGxpc3RlbmVyIHRvIHRoZSBwcm9taXNlLlxuICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gcGFzc2l2ZSBwaGFzZVxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgcHJlcGFyZVBvcnRhbE1vdW50KHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgIH1cblxuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgLy8gUG9wIHByb3ZpZGVyIGZpYmVyXG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFNhbWUgYXMgY2xhc3MgY29tcG9uZW50IGNhc2UuIEkgcHV0IGl0IGRvd24gaGVyZSBzbyB0aGF0IHRoZSB0YWdzIGFyZVxuICAgICAgICAvLyBzZXF1ZW50aWFsIHRvIGVuc3VyZSB0aGlzIHN3aXRjaCBpcyBjb21waWxlZCB0byBhIGp1bXAgdGFibGUuXG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoX0NvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgaW4gdGhlIGRlZmF1bHQsIFwiaW5kZXBlbmRlbnRcIiBtb2RlLlxuICAgICAgICAgIC8vIFdlIGRvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgbW9kZS5cbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWRTdXNwZW5kQWxyZWFkeSA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuICAgICAgICB2YXIgcmVuZGVyZWRUYWlsID0gcmVuZGVyU3RhdGUucmVuZGVyaW5nO1xuXG4gICAgICAgIGlmIChyZW5kZXJlZFRhaWwgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBqdXN0IHJlbmRlcmVkIHRoZSBoZWFkLlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHBhc3MuIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiBhbnl0aGluZyBpcyBzdGlsbFxuICAgICAgICAgICAgLy8gc3VzcGVuZGVkIGluIHRoZSByZW5kZXJlZCBzZXQuXG4gICAgICAgICAgICAvLyBJZiBuZXcgY29udGVudCB1bnN1c3BlbmRlZCwgYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSBjb250ZW50IHRoYXRcbiAgICAgICAgICAgIC8vIGRpZG4ndC4gVGhlbiB3ZSBuZWVkIHRvIGRvIGEgc2Vjb25kIHBhc3MgdGhhdCBmb3JjZXMgZXZlcnl0aGluZ1xuICAgICAgICAgICAgLy8gdG8ga2VlcCBzaG93aW5nIHRoZWlyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGJlIHN1c3BlbmRlZCBpZiBzb21ldGhpbmcgaW4gdGhpcyByZW5kZXIgcGFzcyBzdXNwZW5kZWQsIG9yXG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgaW4gdGhlIHByZXZpb3VzIGNvbW1pdHRlZCBwYXNzIHN1c3BlbmRlZC4gT3RoZXJ3aXNlLFxuICAgICAgICAgICAgLy8gdGhlcmUncyBubyBjaGFuY2Ugc28gd2UgY2FuIHNraXAgdGhlIGV4cGVuc2l2ZSBjYWxsIHRvXG4gICAgICAgICAgICAvLyBmaW5kRmlyc3RTdXNwZW5kZWQuXG4gICAgICAgICAgICB2YXIgY2Fubm90QmVTdXNwZW5kZWQgPSByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSAmJiAoY3VycmVudCA9PT0gbnVsbCB8fCAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKTtcblxuICAgICAgICAgICAgaWYgKCFjYW5ub3RCZVN1c3BlbmRlZCkge1xuICAgICAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBzdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocm93KTtcblxuICAgICAgICAgICAgICAgIGlmIChzdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gSWYgdGhpcyBpcyBhIG5ld2x5IHN1c3BlbmRlZCB0cmVlLCBpdCBtaWdodCBub3QgZ2V0IGNvbW1pdHRlZCBhc1xuICAgICAgICAgICAgICAgICAgLy8gcGFydCBvZiB0aGUgc2Vjb25kIHBhc3MuIEluIHRoYXQgY2FzZSBub3RoaW5nIHdpbGwgc3Vic2NyaWJlIHRvXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgdGhlbmFibGVzLiBJbnN0ZWFkLCB3ZSdsbCB0cmFuc2ZlciBpdHMgdGhlbmFibGVzIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gU3VzcGVuc2VMaXN0IHNvIHRoYXQgaXQgY2FuIHJldHJ5IGlmIHRoZXkgcmVzb2x2ZS5cbiAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIG9mIHRoZXNlIGluIHRoZSBsaXN0IGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAgICAgICAgICAgLy8gZ29pbmcgdG8gd2FpdCBmb3IgYWxsIG9mIHRoZW0gYW55d2F5LCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIG9uZXMgZ2V0cyB0byBwaW5nLiBJbiB0aGVvcnkgd2UgY291bGQgZ2V0IGNsZXZlciBhbmQga2VlcFxuICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgb2YgaG93IG1hbnkgZGVwZW5kZW5jaWVzIHJlbWFpbiBidXQgaXQgZ2V0cyB0cmlja3kgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1lYW50aW1lLCB3ZSBjYW4gYWRkL3JlbW92ZS9jaGFuZ2UgaXRlbXMgYW5kIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGJhaWwgb3V0IG9mIHRoZSBsb29wIGJlZm9yZSBmaW5kaW5nIGFueSBidXQgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtYXR0ZXIgc2luY2UgdGhhdCBtZWFucyB0aGF0IHRoZSBvdGhlciBib3VuZGFyaWVzIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGRpZCBmaW5kIGFscmVhZHkgaGFzIHRoZWlyIGxpc3RlbmVycyBhdHRhY2hlZC5cblxuICAgICAgICAgICAgICAgICAgdmFyIG5ld1RoZW5hYmxlcyA9IHN1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICAgICAgaWYgKG5ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG5ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgICAgICAgICAgfSAvLyBSZXJlbmRlciB0aGUgd2hvbGUgbGlzdCwgYnV0IHRoaXMgdGltZSwgd2UnbGwgZm9yY2UgZmFsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAvLyB0byBzdGF5IGluIHBsYWNlLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBiZWZvcmUgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHNpbmNlIHRoYXQncyBub3cgaW52YWxpZC5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjaGlsZCBmaWJlcnMgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuXG5cblxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICAgICAgICAgICAgICAgIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsgLy8gU2V0IHVwIHRoZSBTdXNwZW5zZSBDb250ZXh0IHRvIGZvcmNlIHN1c3BlbnNlIGFuZCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgLy8gcmVyZW5kZXIgdGhlIGNoaWxkcmVuLlxuXG4gICAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKSk7IC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsICYmIG5vdygpID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBidXQgd2Ugc3RpbGwgaGF2ZSByb3dzXG4gICAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHRhaWwuIFdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlbmRlclxuICAgICAgICAgICAgICAvLyB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpO1xuICAgICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBnb2luZyB0byByZW5kZXIgdGhlIHRhaWwuXG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBcHBlbmQgdGhlIHJlbmRlcmVkIHJvdyB0byB0aGUgY2hpbGQgbGlzdC5cbiAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICB2YXIgX3N1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyZW5kZXJlZFRhaWwpO1xuXG4gICAgICAgICAgICBpZiAoX3N1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7IC8vIEVuc3VyZSB3ZSB0cmFuc2ZlciB0aGUgdXBkYXRlIHF1ZXVlIHRvIHRoZSBwYXJlbnQgc28gdGhhdCBpdCBkb2Vzbid0XG4gICAgICAgICAgICAgIC8vIGdldCBsb3N0IGlmIHRoaXMgcm93IGVuZHMgdXAgZHJvcHBlZCBkdXJpbmcgYSBzZWNvbmQgcGFzcy5cblxuICAgICAgICAgICAgICB2YXIgX25ld1RoZW5hYmxlcyA9IF9zdXNwZW5kZWQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgICAgaWYgKF9uZXdUaGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IF9uZXdUaGVuYWJsZXM7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCB0cnVlKTsgLy8gVGhpcyBtaWdodCBoYXZlIGJlZW4gbW9kaWZpZWQuXG5cbiAgICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgPT09IG51bGwgJiYgcmVuZGVyU3RhdGUudGFpbE1vZGUgPT09ICdoaWRkZW4nICYmICFyZW5kZXJlZFRhaWwuYWx0ZXJuYXRlICYmICFnZXRJc0h5ZHJhdGluZygpIC8vIFdlIGRvbid0IGN1dCBpdCBpZiB3ZSdyZSBoeWRyYXRpbmcuXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICggLy8gVGhlIHRpbWUgaXQgdG9vayB0byByZW5kZXIgbGFzdCByb3cgaXMgZ3JlYXRlciB0aGFuIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgaGF2ZSB0byByZW5kZXIuIFNvIHJlbmRlcmluZyBvbmUgbW9yZSByb3cgd291bGQgbGlrZWx5XG4gICAgICAgICAgICAvLyBleGNlZWQgaXQuXG4gICAgICAgICAgICBub3coKSAqIDIgLSByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkgJiYgcmVuZGVyTGFuZXMgIT09IE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYW5kIHdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyXG4gICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlbmRlciB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBpcyB1c3VhbGx5IGZhc3Rlci5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuZGVyU3RhdGUuaXNCYWNrd2FyZHMpIHtcbiAgICAgICAgICAgIC8vIFRoZSBlZmZlY3QgbGlzdCBvZiB0aGUgYmFja3dhcmRzIHRhaWwgd2lsbCBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIC8vIHRvIHRoZSBlbmQuIFRoaXMgYnJlYWtzIHRoZSBndWFyYW50ZWUgdGhhdCBsaWZlLWN5Y2xlcyBmaXJlIGluXG4gICAgICAgICAgICAvLyBzaWJsaW5nIG9yZGVyIGJ1dCB0aGF0IGlzbid0IGEgc3Ryb25nIGd1YXJhbnRlZSBwcm9taXNlZCBieSBSZWFjdC5cbiAgICAgICAgICAgIC8vIEVzcGVjaWFsbHkgc2luY2UgdGhlc2UgbWlnaHQgYWxzbyBqdXN0IHBvcCBpbiBkdXJpbmcgZnV0dXJlIGNvbW1pdHMuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAgICAgICAgICAgIHJlbmRlcmVkVGFpbC5zaWJsaW5nID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzU2libGluZyA9IHJlbmRlclN0YXRlLmxhc3Q7XG5cbiAgICAgICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNTaWJsaW5nLnNpYmxpbmcgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVuZGVyU3RhdGUubGFzdCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIHN0aWxsIGhhdmUgdGFpbCByb3dzIHRvIHJlbmRlci5cbiAgICAgICAgICAvLyBQb3AgYSByb3cuXG4gICAgICAgICAgdmFyIG5leHQgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG5leHQ7XG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG5leHQuc2libGluZztcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSBub3coKTtcbiAgICAgICAgICBuZXh0LnNpYmxpbmcgPSBudWxsOyAvLyBSZXN0b3JlIHRoZSBjb250ZXh0LlxuICAgICAgICAgIC8vIFRPRE86IFdlIGNhbiBwcm9iYWJseSBqdXN0IGF2b2lkIHBvcHBpbmcgaXQgaW5zdGVhZCBhbmQgb25seVxuICAgICAgICAgIC8vIHNldHRpbmcgaXQgdGhlIGZpcnN0IHRpbWUgd2UgZ28gZnJvbSBub3Qgc3VzcGVuZGVkIHRvIHN1c3BlbmRlZC5cblxuICAgICAgICAgIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG5cbiAgICAgICAgICBpZiAoZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIERvIGEgcGFzcyBvdmVyIHRoZSBuZXh0IHJvdy5cbiAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIHZhciBuZXh0SXNIaWRkZW4gPSBfbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAocHJldklzSGlkZGVuICE9PSBuZXh0SXNIaWRkZW4gJiYgKCAvLyBMZWdhY3lIaWRkZW4gZG9lc24ndCBkbyBhbnkgaGlkaW5nIFx1MjAxNCBpdCBvbmx5IHByZS1yZW5kZXJzLlxuICAgICAgICAgICFlbmFibGVMZWdhY3lIaWRkZW4gKSkge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVmlzaWJpbGl0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5leHRJc0hpZGRlbiB8fCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgZm9yIGhpZGRlbiBjaGlsZHJlbiB1bmxlc3Mgd2UncmUgcmVuZGVyaW5nXG4gICAgICAgICAgLy8gYXQgb2Zmc2NyZWVuIHByaW9yaXR5LlxuICAgICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKHN1YnRyZWVSZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBpbnNlcnRpb24gb3IgdXBkYXRlIGluIHRoZSBoaWRkZW4gc3VidHJlZS5cbiAgICAgICAgICAgICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gaGlkZSB0aG9zZSBub2RlcyBpbiB0aGUgY29tbWl0IHBoYXNlLCBzb1xuICAgICAgICAgICAgICAvLyBzY2hlZHVsZSBhIHZpc2liaWxpdHkgZWZmZWN0LlxuICAgICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyAmIChQbGFjZW1lbnQgfCBVcGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVmlzaWJpbGl0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiB1bndpbmRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBfZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoKF9mbGFncyAmIFNob3VsZENhcHR1cmUpICE9PSBOb0ZsYWdzICYmIChfZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgcmVuZGVyIHRoYXQgd2Fzbid0IGNhcHR1cmVkIGJ5IGEgc3VzcGVuc2VcbiAgICAgICAgICAvLyBib3VuZGFyeS4gRG8gYSBzZWNvbmQgcGFzcyBvbiB0aGUgcm9vdCB0byB1bm1vdW50IHRoZSBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH0gLy8gV2UgdW53b3VuZCB0byB0aGUgcm9vdCB3aXRob3V0IGNvbXBsZXRpbmcgaXQuIEV4aXQuXG5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RocmV3IGluIG5ld2x5IG1vdW50ZWQgZGVoeWRyYXRlZCBjb21wb25lbnQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZmxhZ3MyID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKF9mbGFnczIgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MyICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlOyAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTsgLy8gU3VzcGVuc2VMaXN0IGRvZXNuJ3QgYWN0dWFsbHkgY2F0Y2ggYW55dGhpbmcuIEl0IHNob3VsZCd2ZSBiZWVuXG4gICAgICAgIC8vIGNhdWdodCBieSBhIG5lc3RlZCBib3VuZGFyeS4gSWYgbm90LCBpdCBzaG91bGQgYnViYmxlIHRocm91Z2guXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcblxuICBzd2l0Y2ggKGludGVycnVwdGVkV29yay50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5jaGlsZENvbnRleHRUeXBlcztcblxuICAgICAgICBpZiAoY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBpbnRlcnJ1cHRlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG51bGw7XG5cbntcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG59IC8vIFVzZWQgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHN0YWNrLlxuLy8gQWxsb3dzIHVzIHRvIGF2b2lkIHRyYXZlcnNpbmcgdGhlIHJldHVybiBwYXRoIHRvIGZpbmQgdGhlIG5lYXJlc3QgT2Zmc2NyZWVuIGFuY2VzdG9yLlxuLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlU3VzcGVuc2VMYXlvdXRFZmZlY3RTZW1hbnRpY3MgaXMgZW5hYmxlZC5cblxuXG52YXIgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gZmFsc2U7XG52YXIgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IGZhbHNlO1xudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcbnZhciBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVXNlZCBmb3IgUHJvZmlsaW5nIGJ1aWxkcyB0byB0cmFjayB1cGRhdGVycy5cblxudmFyIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG52YXIgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuZnVuY3Rpb24gcmVwb3J0VW5jYXVnaHRFcnJvckluREVWKGVycm9yKSB7XG4gIC8vIFdyYXBwaW5nIGVhY2ggc21hbGwgcGFydCBvZiB0aGUgY29tbWl0IHBoYXNlIGludG8gYSBndWFyZGVkXG4gIC8vIGNhbGxiYWNrIGlzIGEgYml0IHRvbyBzbG93IChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMTY2NikuXG4gIC8vIEJ1dCB3ZSByZWx5IG9uIGl0IHRvIHN1cmZhY2UgZXJyb3JzIHRvIERFViB0b29scyBsaWtlIG92ZXJsYXlzXG4gIC8vIChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIxNzEyKS5cbiAgLy8gQXMgYSBjb21wcm9taXNlLCByZXRocm93IG9ubHkgY2F1Z2h0IGVycm9ycyBpbiBhIGd1YXJkLlxuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICAgIGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgfVxufVxuXG52YXIgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyID0gZnVuY3Rpb24gKGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICB9XG59OyAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQsIGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCB1bm1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lcihjdXJyZW50LCBpbnN0YW5jZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUF0dGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0QXR0YWNoUmVmKGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgcmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzICYmIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxEZXN0cm95KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpIHtcbiAgdHJ5IHtcbiAgICBkZXN0cm95KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbnZhciBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xudmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpcnN0Q2hpbGQpIHtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gcHJlcGFyZUZvckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pO1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuICB2YXIgc2hvdWxkRmlyZSA9IHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1cjtcbiAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG4gIHJldHVybiBzaG91bGRGaXJlO1xufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVGhpcyBwaGFzZSBpcyBvbmx5IHVzZWQgZm9yIGJlZm9yZUFjdGl2ZUluc3RhbmNlQmx1ci5cblxuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBCZWZvcmVNdXRhdGlvbk1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKChmbGFncyAmIFNuYXBzaG90KSAhPT0gTm9GbGFncykge1xuICAgIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUgPSBzbmFwc2hvdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIHRoZXNlIGNvbXBvbmVudCB0eXBlc1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChmbGFncywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gTW91bnRcblxuXG4gICAgICAgIHZhciBjcmVhdGUgPSBlZmZlY3QuY3JlYXRlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSBjcmVhdGUoKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuXG4gICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzdHJveSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGhvb2tOYW1lID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoKGVmZmVjdC50YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChlZmZlY3QudGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlRWZmZWN0JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFkZGVuZHVtID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoZGVzdHJveSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkIG51bGwuIElmIHlvdXIgZWZmZWN0IGRvZXMgbm90IHJlcXVpcmUgY2xlYW4gJyArICd1cCwgcmV0dXJuIHVuZGVmaW5lZCAob3Igbm90aGluZykuJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc3Ryb3kudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICdcXG5cXG5JdCBsb29rcyBsaWtlIHlvdSB3cm90ZSAnICsgaG9va05hbWUgKyAnKGFzeW5jICgpID0+IC4uLikgb3IgcmV0dXJuZWQgYSBQcm9taXNlLiAnICsgJ0luc3RlYWQsIHdyaXRlIHRoZSBhc3luYyBmdW5jdGlvbiBpbnNpZGUgeW91ciBlZmZlY3QgJyArICdhbmQgY2FsbCBpdCBpbW1lZGlhdGVseTpcXG5cXG4nICsgaG9va05hbWUgKyAnKCgpID0+IHtcXG4nICsgJyAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKCkge1xcbicgKyAnICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbicgKyAnICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTXlBUEkuZ2V0RGF0YShzb21lSWQpO1xcbicgKyAnICAgIC8vIC4uLlxcbicgKyAnICB9XFxuJyArICcgIGZldGNoRGF0YSgpO1xcbicgKyBcIn0sIFtzb21lSWRdKTsgLy8gT3IgW10gaWYgZWZmZWN0IGRvZXNuJ3QgbmVlZCBwcm9wcyBvciBzdGF0ZVxcblxcblwiICsgJ0xlYXJuIG1vcmUgYWJvdXQgZGF0YSBmZXRjaGluZyB3aXRoIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaG9va3MtZGF0YS1mZXRjaGluZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkOiAnICsgZGVzdHJveTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IoJyVzIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBob29rTmFtZSwgYWRkZW5kdW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG4gIHtcbiAgICAvLyBPbmx5IFByb2ZpbGVycyB3aXRoIHdvcmsgaW4gdGhlaXIgc3VidHJlZSB3aWxsIGhhdmUgYW4gVXBkYXRlIGVmZmVjdCBzY2hlZHVsZWQuXG4gICAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgaWQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUuaWQsXG4gICAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLm9uUG9zdENvbW1pdDsgLy8gVGhpcyB2YWx1ZSB3aWxsIHN0aWxsIHJlZmxlY3QgdGhlIHByZXZpb3VzIGNvbW1pdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIEl0IGRvZXMgbm90IGdldCByZXNldCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblBvc3RDb21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0KGlkLCBwaGFzZSwgcGFzc2l2ZUVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH0gLy8gQnViYmxlIHRpbWVzIHRvIHRoZSBuZXh0IG5lYXJlc3QgYW5jZXN0b3IgUHJvZmlsZXIuXG4gICAgICAgICAgICAvLyBBZnRlciB3ZSBwcm9jZXNzIHRoYXQgUHJvZmlsZXIsIHdlJ2xsIGJ1YmJsZSBmdXJ0aGVyIHVwLlxuXG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIHVwZGF0ZVF1ZXVlLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgICB2YXIgX3VwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKF91cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsuY2hpbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0UHVibGljSW5zdGFuY2UoZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBfdXBkYXRlUXVldWUsIF9pbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIG1heSBzY2hlZHVsZSBhdXRvLWZvY3VzIGZvciBpbnB1dHMgYW5kIGZvcm0gY29udHJvbHMpLlxuICAgICAgICAgIC8vIFRoZXNlIGVmZmVjdHMgc2hvdWxkIG9ubHkgYmUgY29tbWl0dGVkIHdoZW4gY29tcG9uZW50cyBhcmUgZmlyc3QgbW91bnRlZCxcbiAgICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsICYmIGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTtcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgY29tbWl0TW91bnQoX2luc3RhbmNlMiwgdHlwZSwgcHJvcHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCB0ZXh0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHBvcnRhbHMuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgb25Db21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uQ29tbWl0LFxuICAgICAgICAgICAgICAgIG9uUmVuZGVyID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vblJlbmRlcjtcbiAgICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGN1cnJlbnQgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblJlbmRlcihmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGZpbmlzaGVkV29yay5hY3R1YWxEdXJhdGlvbiwgZmluaXNoZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24sIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Db21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBvbkNvbW1pdChmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgICAgfSAvLyBTY2hlZHVsZSBhIHBhc3NpdmUgZWZmZWN0IGZvciB0aGlzIFByb2ZpbGVyIHRvIGNhbGwgb25Qb3N0Q29tbWl0IGhvb2tzLlxuICAgICAgICAgICAgICAvLyBUaGlzIGVmZmVjdCBzaG91bGQgYmUgc2NoZWR1bGVkIGV2ZW4gaWYgdGhlcmUgaXMgbm8gb25Qb3N0Q29tbWl0IGNhbGxiYWNrIGZvciB0aGlzIFByb2ZpbGVyLFxuICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlZmZlY3QgaXMgYWxzbyB3aGVyZSB0aW1lcyBidWJibGUgdG8gcGFyZW50IFByb2ZpbGVycy5cblxuXG4gICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpbmlzaGVkV29yayk7IC8vIFByb3BhZ2F0ZSBsYXlvdXQgZWZmZWN0IGR1cmF0aW9ucyB0byB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yLlxuICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdGhlc2UgdmFsdWVzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBzbyBEZXZUb29scyBoYXMgYSBjaGFuY2UgdG8gcmVhZCB0aGVtIGZpcnN0LlxuXG4gICAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAge1xuICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFJlZikge1xuICAgICAgICBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihub2RlKSB7XG4gIC8vIFR1cm4gb24gbGF5b3V0IGVmZmVjdHMgaW4gYSB0cmVlIHRoYXQgcHJldmlvdXNseSBkaXNhcHBlYXJlZC5cbiAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcbiAgc3dpdGNoIChub2RlLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBub2RlLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQobm9kZSwgbm9kZS5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaW5pc2hlZFdvcmssIGlzSGlkZGVuKSB7XG4gIC8vIE9ubHkgaGlkZSBvciB1bmhpZGUgdGhlIHRvcC1tb3N0IGhvc3Qgbm9kZXMuXG4gIHZhciBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVJbnN0YW5jZShub2RlLnN0YXRlTm9kZSwgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yaykge1xuICB2YXIgcmVmID0gZmluaXNoZWRXb3JrLnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICB2YXIgaW5zdGFuY2VUb1VzZTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGluc3RhbmNlO1xuICAgIH0gLy8gTW92ZWQgb3V0c2lkZSB0byBlbnN1cmUgRENFIHdvcmtzIHdpdGggdGhpcyBmbGFnXG5cbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoIXJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmVmIG9iamVjdCBwcm92aWRlZCBmb3IgJXMuICcgKyAnVXNlIGVpdGhlciBhIHJlZi1zZXR0ZXIgZnVuY3Rpb24gb3IgUmVhY3QuY3JlYXRlUmVmKCkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyTXV0YXRpb24oZmliZXIpIHtcbiAgLy8gQ3V0IG9mZiB0aGUgcmV0dXJuIHBvaW50ZXIgdG8gZGlzY29ubmVjdCBpdCBmcm9tIHRoZSB0cmVlLlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGV0ZWN0IGFuZCB3YXJuIGFnYWluc3Qgc3RhdGUgdXBkYXRlcyBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlxuICAvLyBJdCBhbHNvIHByZXZlbnRzIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIGZyb20gd2l0aGluIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzLlxuICAvL1xuICAvLyBJZGVhbGx5LCB3ZSBzaG91bGQgYWxzbyBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLlxuICAvLyBUaGlzIGNoaWxkIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjbGVhciBjaGlsZCBvciBzaWJsaW5nIHBvaW50ZXJzIHlldC5cbiAgLy8gVGhleSdyZSBuZWVkZWQgZm9yIHBhc3NpdmUgZWZmZWN0cyBhbmQgZm9yIGZpbmRET01Ob2RlLlxuICAvLyBXZSBkZWZlciB0aG9zZSBmaWVsZHMsIGFuZCBhbGwgb3RoZXIgY2xlYW51cCwgdG8gdGhlIHBhc3NpdmUgcGhhc2UgKHNlZSBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cykuXG4gIC8vXG4gIC8vIERvbid0IHJlc2V0IHRoZSBhbHRlcm5hdGUgeWV0LCBlaXRoZXIuIFdlIG5lZWQgdGhhdCBzbyB3ZSBjYW4gZGV0YWNoIHRoZVxuICAvLyBhbHRlcm5hdGUncyBmaWVsZHMgaW4gdGhlIHBhc3NpdmUgcGhhc2UuIENsZWFyaW5nIHRoZSByZXR1cm4gcG9pbnRlciBpc1xuICAvLyBzdWZmaWNpZW50IGZvciBmaW5kRE9NTm9kZSBzZW1hbnRpY3MuXG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5yZXR1cm4gPSBudWxsO1xuICB9XG5cbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZmliZXIuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhhbHRlcm5hdGUpO1xuICB9IC8vIE5vdGU6IERlZmVuc2l2ZWx5IHVzaW5nIG5lZ2F0aW9uIGluc3RlYWQgb2YgPCBpbiBjYXNlXG4gIC8vIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgaXMgdW5kZWZpbmVkLlxuXG5cbiAge1xuICAgIC8vIENsZWFyIGN5Y2xpY2FsIEZpYmVyIGZpZWxkcy4gVGhpcyBsZXZlbCBhbG9uZSBpcyBkZXNpZ25lZCB0byByb3VnaGx5XG4gICAgLy8gYXBwcm94aW1hdGUgdGhlIHBsYW5uZWQgRmliZXIgcmVmYWN0b3IuIEluIHRoYXQgd29ybGQsIGBzZXRTdGF0ZWAgd2lsbCBiZVxuICAgIC8vIGJvdW5kIHRvIGEgc3BlY2lhbCBcImluc3RhbmNlXCIgb2JqZWN0IGluc3RlYWQgb2YgYSBGaWJlci4gVGhlIEluc3RhbmNlXG4gICAgLy8gb2JqZWN0IHdpbGwgbm90IGhhdmUgYW55IG9mIHRoZXNlIGZpZWxkcy4gSXQgd2lsbCBvbmx5IGJlIGNvbm5lY3RlZCB0b1xuICAgIC8vIHRoZSBmaWJlciB0cmVlIHZpYSBhIHNpbmdsZSBsaW5rIGF0IHRoZSByb290LiBTbyBpZiB0aGlzIGxldmVsIGFsb25lIGlzXG4gICAgLy8gc3VmZmljaWVudCB0byBmaXggbWVtb3J5IGlzc3VlcywgdGhhdCBib2RlcyB3ZWxsIGZvciBvdXIgcGxhbnMuXG4gICAgZmliZXIuY2hpbGQgPSBudWxsO1xuICAgIGZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgZmliZXIuc2libGluZyA9IG51bGw7IC8vIFRoZSBgc3RhdGVOb2RlYCBpcyBjeWNsaWNhbCBiZWNhdXNlIG9uIGhvc3Qgbm9kZXMgaXQgcG9pbnRzIHRvIHRoZSBob3N0XG4gICAgLy8gdHJlZSwgd2hpY2ggaGFzIGl0cyBvd24gcG9pbnRlcnMgdG8gY2hpbGRyZW4sIHBhcmVudHMsIGFuZCBzaWJsaW5ncy5cbiAgICAvLyBUaGUgb3RoZXIgaG9zdCBub2RlcyBhbHNvIHBvaW50IGJhY2sgdG8gZmliZXJzLCBzbyB3ZSBzaG91bGQgZGV0YWNoIHRoYXRcbiAgICAvLyBvbmUsIHRvby5cblxuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKGhvc3RJbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gSSdtIGludGVudGlvbmFsbHkgbm90IGNsZWFyaW5nIHRoZSBgcmV0dXJuYCBmaWVsZCBpbiB0aGlzIGxldmVsLiBXZVxuICAgIC8vIGFscmVhZHkgZGlzY29ubmVjdCB0aGUgYHJldHVybmAgcG9pbnRlciBhdCB0aGUgcm9vdCBvZiB0aGUgZGVsZXRlZFxuICAgIC8vIHN1YnRyZWUgKGluIGBkZXRhY2hGaWJlck11dGF0aW9uYCkuIEJlc2lkZXMsIGByZXR1cm5gIGJ5IGl0c2VsZiBpcyBub3RcbiAgICAvLyBjeWNsaWNhbCBcdTIwMTQgaXQncyBvbmx5IGN5Y2xpY2FsIHdoZW4gY29tYmluZWQgd2l0aCBgY2hpbGRgLCBgc2libGluZ2AsIGFuZFxuICAgIC8vIGBhbHRlcm5hdGVgLiBCdXQgd2UnbGwgY2xlYXIgaXQgaW4gdGhlIG5leHQgbGV2ZWwgYW55d2F5LCBqdXN0IGluIGNhc2UuXG5cbiAgICB7XG4gICAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gVGhlb3JldGljYWxseSwgbm90aGluZyBpbiBoZXJlIHNob3VsZCBiZSBuZWNlc3NhcnksIGJlY2F1c2Ugd2UgYWxyZWFkeVxuICAgICAgLy8gZGlzY29ubmVjdGVkIHRoZSBmaWJlciBmcm9tIHRoZSB0cmVlLiBTbyBldmVuIGlmIHNvbWV0aGluZyBsZWFrcyB0aGlzXG4gICAgICAvLyBwYXJ0aWN1bGFyIGZpYmVyLCBpdCB3b24ndCBsZWFrIGFueXRoaW5nIGVsc2VcbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGJyYW5jaCBpcyB0byBiZSBzdXBlciBhZ2dyZXNzaXZlIHNvIHdlIGNhbiBtZWFzdXJlXG4gICAgICAvLyBpZiB0aGVyZSdzIGFueSBkaWZmZXJlbmNlIGluIG1lbW9yeSBpbXBhY3QuIElmIHRoZXJlIGlzLCB0aGF0IGNvdWxkXG4gICAgICAvLyBpbmRpY2F0ZSBhIFJlYWN0IGxlYWsgd2UgZG9uJ3Qga25vdyBhYm91dC5cbiAgICAgIGZpYmVyLnJldHVybiA9IG51bGw7XG4gICAgICBmaWJlci5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBUT0RPOiBNb3ZlIHRvIGBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcmAgaW5zdGVhZC5cblxuICAgICAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRIb3N0UGFyZW50RmliZXIoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGlzSG9zdFBhcmVudChwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHBhcmVudEZpYmVyLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgcGFyZW50IGJlZm9yZSBkb2luZyBhbnkgaW5zZXJ0aW9uc1xuICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQocGFyZW50KTsgLy8gQ2xlYXIgQ29udGVudFJlc2V0IGZyb20gdGhlIGVmZmVjdCB0YWdcblxuICAgICAgICAgIHBhcmVudEZpYmVyLmZsYWdzICY9IH5Db250ZW50UmVzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTsgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgICAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB2YXIgX3BhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgIHZhciBfYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgX2JlZm9yZSwgX3BhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob3N0IHBhcmVudCBmaWJlci4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEluQ29udGFpbmVyQmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0QmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gVGhlc2UgYXJlIHRyYWNrZWQgb24gdGhlIHN0YWNrIGFzIHdlIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFcbi8vIGRlbGV0ZWQgc3VidHJlZS5cbi8vIFRPRE86IFVwZGF0ZSB0aGVzZSBkdXJpbmcgdGhlIHdob2xlIG11dGF0aW9uIHBoYXNlLCBub3QganVzdCBkdXJpbmdcbi8vIGEgZGVsZXRpb24uXG5cblxudmFyIGhvc3RQYXJlbnQgPSBudWxsO1xudmFyIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcikge1xuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQsIGRldGFjaCByZWZzLCBjbGVhblxuICAgIC8vIHVwIG1vdW50ZWQgbGF5b3V0IGVmZmVjdHMsIGFuZCBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50LlxuICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIHRvcG1vc3QgaG9zdCBjaGlsZCBpbiBlYWNoIGJyYW5jaC4gQnV0IHRoZW4gd2VcbiAgICAvLyBzdGlsbCBuZWVkIHRvIGtlZXAgdHJhdmVyc2luZyB0byB1bm1vdW50IGVmZmVjdHMsIHJlZnMsIGFuZCBjV1UuIFRPRE86IFdlXG4gICAgLy8gY291bGQgc3BsaXQgdGhpcyBpbnRvIHR3byBzZXBhcmF0ZSB0cmF2ZXJzYWxzIGZ1bmN0aW9ucywgd2hlcmUgdGhlIHNlY29uZFxuICAgIC8vIG9uZSBkb2Vzbid0IGluY2x1ZGUgYW55IHJlbW92ZUNoaWxkIGxvZ2ljLiBUaGlzIGlzIG1heWJlIHRoZSBzYW1lXG4gICAgLy8gZnVuY3Rpb24gYXMgXCJkaXNhcHBlYXJMYXlvdXRFZmZlY3RzXCIgKG9yIHdoYXRldmVyIHRoYXQgdHVybnMgaW50byBhZnRlclxuICAgIC8vIHRoZSBsYXlvdXQgcGhhc2UgaXMgcmVmYWN0b3JlZCB0byB1c2UgcmVjdXJzaW9uKS5cbiAgICAvLyBCZWZvcmUgc3RhcnRpbmcsIGZpbmQgdGhlIG5lYXJlc3QgaG9zdCBwYXJlbnQgb24gdGhlIHN0YWNrIHNvIHdlIGtub3dcbiAgICAvLyB3aGljaCBpbnN0YW5jZS9jb250YWluZXIgdG8gcmVtb3ZlIHRoZSBjaGlsZHJlbiBmcm9tLlxuICAgIC8vIFRPRE86IEluc3RlYWQgb2Ygc2VhcmNoaW5nIHVwIHRoZSBmaWJlciByZXR1cm4gcGF0aCBvbiBldmVyeSBkZWxldGlvbiwgd2VcbiAgICAvLyBjYW4gdHJhY2sgdGhlIG5lYXJlc3QgaG9zdCBjb21wb25lbnQgb24gdGhlIEpTIHN0YWNrIGFzIHdlIHRyYXZlcnNlIHRoZVxuICAgIC8vIHRyZWUgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgd291bGQgbWFrZSBpbnNlcnRpb25zIGZhc3RlciwgdG9vLlxuICAgIHZhciBwYXJlbnQgPSByZXR1cm5GaWJlcjtcblxuICAgIGZpbmRQYXJlbnQ6IHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9zdFBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSAnICsgJ2EgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpO1xuICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICB9XG5cbiAgZGV0YWNoRmliZXJNdXRhdGlvbihkZWxldGVkRmliZXIpO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgcGFyZW50KSB7XG4gIC8vIFRPRE86IFVzZSBhIHN0YXRpYyBmbGFnIHRvIHNraXAgdHJlZXMgdGhhdCBkb24ndCBoYXZlIHVubW91bnQgZWZmZWN0c1xuICB2YXIgY2hpbGQgPSBwYXJlbnQuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGNoaWxkKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcikge1xuICBvbkNvbW1pdFVubW91bnQoZGVsZXRlZEZpYmVyKTsgLy8gVGhlIGNhc2VzIGluIHRoaXMgb3V0ZXIgc3dpdGNoIG1vZGlmeSB0aGUgc3RhY2sgYmVmb3JlIHRoZXkgdHJhdmVyc2VcbiAgLy8gaW50byB0aGVpciBzdWJ0cmVlLiBUaGVyZSBhcmUgc2ltcGxlciBjYXNlcyBpbiB0aGUgaW5uZXIgc3dpdGNoXG4gIC8vIHRoYXQgZG9uJ3QgbW9kaWZ5IHRoZSBzdGFjay5cblxuICBzd2l0Y2ggKGRlbGV0ZWRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9IC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoIHRvIG5leHQgYnJhbmNoXG5cbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIG5lYXJlc3QgaG9zdCBjaGlsZC4gU2V0IHRoZSBob3N0IHBhcmVudFxuICAgICAgICAvLyB0byBgbnVsbGAgb24gdGhlIHN0YWNrIHRvIGluZGljYXRlIHRoYXQgbmVzdGVkIGNoaWxkcmVuIGRvbid0XG4gICAgICAgIC8vIG5lZWQgdG8gYmUgcmVtb3ZlZC5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IHByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG5cbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTm93IHRoYXQgYWxsIHRoZSBjaGlsZCBlZmZlY3RzIGhhdmUgdW5tb3VudGVkLCB3ZSBjYW4gcmVtb3ZlIHRoZVxuICAgICAgICAgICAgLy8gbm9kZSBmcm9tIHRoZSB0cmVlLlxuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZChob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gRGVsZXRlIHRoZSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnQuXG5cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIGdvIGludG8gYSBwb3J0YWwsIGl0IGJlY29tZXMgdGhlIHBhcmVudCB0byByZW1vdmUgZnJvbS5cbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBfcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBkZWxldGVkRmliZXIudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdC5kZXN0cm95LFxuICAgICAgICAgICAgICAgICAgICB0YWcgPSBfZWZmZWN0LnRhZztcblxuICAgICAgICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWxldGVkRmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGRlbGV0ZWRGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIG9mZnNjcmVlbiBjb21wb25lbnQgaXMgaGlkZGVuLCB3ZSBhbHJlYWR5IHVubW91bnRlZCBpdC4gQmVmb3JlXG4gICAgICAgICAgLy8gZGVsZXRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayB0aGF0IGl0J3MgYWxyZWFkeSB1bm1vdW50ZWQgc28gdGhhdCB3ZVxuICAgICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gdW5tb3VudCB0aGUgZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgdHJlZSBpcyBoaWRkZW4sIGluIG1vc3QgY2FzZXMgd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcFxuICAgICAgICAgIC8vIG92ZXIgdGhlIG5lc3RlZCBjaGlsZHJlbiBlbnRpcmVseS4gQW4gZXhjZXB0aW9uIGlzIHdlIGhhdmVuJ3QgeWV0IGZvdW5kXG4gICAgICAgICAgLy8gdGhlIHRvcG1vc3QgaG9zdCBub2RlIHRvIGRlbGV0ZSwgd2hpY2ggd2UgYWxyZWFkeSB0cmFjayBvbiB0aGUgc3RhY2suXG4gICAgICAgICAgLy8gQnV0IHRoZSBvdGhlciBjYXNlIGlzIHBvcnRhbHMsIHdoaWNoIG5lZWQgdG8gYmUgZGV0YWNoZWQgbm8gbWF0dGVyIGhvd1xuICAgICAgICAgIC8vIGRlZXBseSB0aGV5IGFyZSBuZXN0ZWQuIFdlIHNob3VsZCB1c2UgYSBzdWJ0cmVlIGZsYWcgdG8gdHJhY2sgd2hldGhlciBhXG4gICAgICAgICAgLy8gc3VidHJlZSBpbmNsdWRlcyBhIG5lc3RlZCBwb3J0YWwuXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgZGVsZXRlZEZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKSB7XG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0byBwYXNzaXZlIHBoYXNlXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXdTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgdGhlbiBpdCB3aWxsIGhhdmUgYSBzZXQgb2Ygd2FrZWFibGVzLlxuICAvLyBGb3IgZWFjaCB3YWtlYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdFxuICAvLyBhdHRlbXB0cyB0byByZS1yZW5kZXIgdGhlIGJvdW5kYXJ5IGluIHRoZSBwcmltYXJ5IChwcmUtdGltZW91dCkgc3RhdGUuXG4gIHZhciB3YWtlYWJsZXMgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgdmFyIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgaWYgKHJldHJ5Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpO1xuICAgIH1cblxuICAgIHdha2VhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uICh3YWtlYWJsZSkge1xuICAgICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgYm91bmRhcnkgZmliZXIgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgICAgdmFyIHJldHJ5ID0gcmVzb2x2ZVJldHJ5V2FrZWFibGUuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHdha2VhYmxlKTtcblxuICAgICAgaWYgKCFyZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkpIHtcbiAgICAgICAgcmV0cnlDYWNoZS5hZGQod2FrZWFibGUpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgICAgIGlmIChpblByb2dyZXNzTGFuZXMgIT09IG51bGwgJiYgaW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIGFzc29jaWF0ZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhpblByb2dyZXNzUm9vdCwgaW5Qcm9ncmVzc0xhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2FrZWFibGUudGhlbihyZXRyeSwgcmV0cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIFRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgZ29lcyBmcm9tIHZpc2libGUgdG8gaGlkZGVuLlxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290KTtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgbGFuZXMpIHtcbiAgLy8gRGVsZXRpb25zIGVmZmVjdHMgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXIgdHlwZS4gVGhleSBuZWVkIHRvIGhhcHBlblxuICAvLyBiZWZvcmUgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGFlIGZpcmVkLlxuICB2YXIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjaGlsZFRvRGVsZXRlLCBwYXJlbnRGaWJlciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2RGVidWdGaWJlciA9IGdldEN1cnJlbnRGaWJlcigpO1xuXG4gIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBNdXRhdGlvbk1hc2spIHtcbiAgICB2YXIgY2hpbGQgPSBwYXJlbnRGaWJlci5jaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNoaWxkKTtcbiAgICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoY2hpbGQsIHJvb3QpO1xuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHNldEN1cnJlbnRGaWJlcihwcmV2RGVidWdGaWJlcik7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFnczsgLy8gVGhlIGVmZmVjdCBmbGFnIHNob3VsZCBiZSBjaGVja2VkICphZnRlciogd2UgcmVmaW5lIHRoZSB0eXBlIG9mIGZpYmVyLFxuICAvLyBiZWNhdXNlIHRoZSBmaWJlciB0YWcgaXMgbW9yZSBzcGVjaWZpYy4gQW4gZXhjZXB0aW9uIGlzIGFueSBmbGFnIHJlbGF0ZWRcbiAgLy8gdG8gcmVjb25jaWxhdGlvbiwgYmVjYXVzZSB0aG9zZSBjYW4gYmUgc2V0IG9uIGFsbCBmaWJlciB0eXBlcy5cblxuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH0gLy8gTGF5b3V0IGVmZmVjdHMgYXJlIGRlc3Ryb3llZCBkdXJpbmcgdGhlIG11dGF0aW9uIHBoYXNlIHNvIHRoYXQgYWxsXG4gICAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG5cblxuICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogQ29udGVudFJlc2V0IGdldHMgY2xlYXJlZCBieSB0aGUgY2hpbGRyZW4gZHVyaW5nIHRoZSBjb21taXRcbiAgICAgICAgICAvLyBwaGFzZS4gVGhpcyBpcyBhIHJlZmFjdG9yIGhhemFyZCBiZWNhdXNlIGl0IG1lYW5zIHdlIG11c3QgcmVhZFxuICAgICAgICAgIC8vIGZsYWdzIHRoZSBmbGFncyBhZnRlciBgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzYCBoYXMgYWxyZWFkeSBydW47XG4gICAgICAgICAgLy8gdGhlIG9yZGVyIG1hdHRlcnMuIFdlIHNob3VsZCByZWZhY3RvciBzbyB0aGF0IENvbnRlbnRSZXNldCBkb2VzIG5vdFxuICAgICAgICAgIC8vIHJlbHkgb24gbXV0YXRpbmcgdGhlIGZsYWcgZHVyaW5nIGNvbW1pdC4gTGlrZSBieSBzZXR0aW5nIGEgZmxhZ1xuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlIGluc3RlYWQuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzZXRUZXh0Q29udGVudChpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2U0ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKF9pbnN0YW5jZTQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGllci5cbiAgICAgICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7IC8vIFRPRE86IFR5cGUgdGhlIHVwZGF0ZVF1ZXVlIHRvIGJlIHNwZWNpZmljIHRvIGhvc3QgY29tcG9uZW50cy5cblxuICAgICAgICAgICAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgICAgICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRVcGRhdGUoX2luc3RhbmNlNCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgaGF2ZSBhIHRleHQgbm9kZSBpbml0aWFsaXplZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2Um9vdFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmIChwcmV2Um9vdFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRIeWRyYXRlZENvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgdmFyIG9mZnNjcmVlbkZpYmVyID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5GaWJlci5mbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgb2Zmc2NyZWVuSW5zdGFuY2UgPSBvZmZzY3JlZW5GaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIG5ld1N0YXRlID0gb2Zmc2NyZWVuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBuZXdTdGF0ZSAhPT0gbnVsbDsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgb24gdGhlIE9mZnNjcmVlbiBpbnN0YW5jZSBzbyB3ZSBjYW5cbiAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudFxuXG4gICAgICAgICAgb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBpc0hpZGRlbjtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgdmFyIHdhc0hpZGRlbiA9IG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKCF3YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgICAgIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3dhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBmaW5pc2hlZFdvcmsubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gQmVmb3JlIGNvbW1pdHRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayBvbiB0aGUgc3RhY2sgd2hldGhlciB0aGlzXG4gICAgICAgICAgLy8gb2Zmc2NyZWVuIHN1YnRyZWUgd2FzIGFscmVhZHkgaGlkZGVuLCBzbyB0aGF0IHdlIGRvbid0IHVubW91bnQgdGhlXG4gICAgICAgICAgLy8gZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBfd2FzSGlkZGVuO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVmlzaWJpbGl0eSkge1xuICAgICAgICAgIHZhciBfb2Zmc2NyZWVuSW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBfbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgIHZhciBfaXNIaWRkZW4gPSBfbmV3U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICB2YXIgb2Zmc2NyZWVuQm91bmRhcnkgPSBmaW5pc2hlZFdvcms7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIF9vZmZzY3JlZW5JbnN0YW5jZS5pc0hpZGRlbiA9IF9pc0hpZGRlbjtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChfaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKCFfd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKChvZmZzY3JlZW5Cb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5Cb3VuZGFyeTtcbiAgICAgICAgICAgICAgICAgIHZhciBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkJvdW5kYXJ5LmNoaWxkO1xuXG4gICAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2NyZWVuQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKG9mZnNjcmVlbkNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5DaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gcnVuIHdoZW5ldmVyIHRoZXJlJ3MgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZVxuICAgICAgICAgICAgLy8gaW5zaWRlIGEgaGlkZGVuIE9mZnNjcmVlbiB0cmVlLlxuICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ob2Zmc2NyZWVuQm91bmRhcnksIF9pc0hpZGRlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yaykge1xuICAvLyBQbGFjZW1lbnQgZWZmZWN0cyAoaW5zZXJ0aW9ucywgcmVvcmRlcnMpIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyXG4gIC8vIHR5cGUuIFRoZXkgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhdmUgZmlyZWQsIGJ1dFxuICAvLyBiZWZvcmUgdGhlIGVmZmVjdHMgb24gdGhpcyBmaWJlciBoYXZlIGZpcmVkLlxuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKGZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICB9IC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzXG4gICAgLy8gaW5zZXJ0ZWQsIGJlZm9yZSBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAvLyBUT0RPOiBmaW5kRE9NTm9kZSBkb2Vzbid0IHJlbHkgb24gdGhpcyBhbnkgbW9yZSBidXQgaXNNb3VudGVkIGRvZXNcbiAgICAvLyBhbmQgaXNNb3VudGVkIGlzIGRlcHJlY2F0ZWQgYW55d2F5IHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIGtpbGwgdGhpcy5cblxuXG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5QbGFjZW1lbnQ7XG4gIH1cblxuICBpZiAoZmxhZ3MgJiBIeWRyYXRpbmcpIHtcbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gfkh5ZHJhdGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICAvLyBTdXNwZW5zZSBsYXlvdXQgZWZmZWN0cyBzZW1hbnRpY3MgZG9uJ3QgY2hhbmdlIGZvciBsZWdhY3kgcm9vdHMuXG4gIHZhciBpc01vZGVyblJvb3QgPSAoc3VidHJlZVJvb3QubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKCBmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCAmJiBpc01vZGVyblJvb3QpIHtcbiAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIHN0YWNrJ3Mgc3RhdGUuXG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGlzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcblxuICAgICAgaWYgKG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbikge1xuICAgICAgICAvLyBUaGUgT2Zmc2NyZWVuIHRyZWUgaXMgaGlkZGVuLiBTa2lwIG92ZXIgaXRzIGxheW91dCBlZmZlY3RzLlxuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIEFsc28gY2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dE1hc2tcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIHZhciB3YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSB3YXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47IC8vIFRyYXZlcnNlIHRoZSBPZmZzY3JlZW4gc3VidHJlZSB3aXRoIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBhcyB0aGUgcm9vdC5cblxuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuICYmICFwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYSByZWFwcGVhcmluZyBib3VuZGFyeS4gVHVybiBpdHMgbGF5b3V0IGVmZmVjdHNcbiAgICAgICAgICAvLyBiYWNrIG9uLlxuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkID0gZmlyc3RDaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihjaGlsZCwgLy8gTmV3IHJvb3Q7IGJ1YmJsZSBiYWNrIHVwIHRvIGhlcmUgYW5kIHN0b3AuXG4gICAgICAgICAgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfSAvLyBSZXN0b3JlIE9mZnNjcmVlbiBzdGF0ZSBhbmQgcmVzdW1lIGluIG91ci1wcm9ncmVzcyB0cmF2ZXJzYWwuXG5cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihyb290LCBjdXJyZW50LCBmaWJlciwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiAoUmVmU3RhdGljIHwgTGF5b3V0U3RhdGljKVxuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIGZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgUmVmU3RhdGljXG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhXG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIGFscmVhZHkgaGlkZGVuLiBEb24ndCBkaXNhcHBlYXJcbiAgICAgICAgICAgIC8vIGl0cyBlZmZlY3RzLlxuICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50KSB7XG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIHN0aWxsIGhpZGRlbi4gRG9uJ3QgcmUtYXBwZWFyIGl0cyBlZmZlY3RzLlxuICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIocm9vdCwgZmliZXIsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmlyc3RDaGlsZCkge1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChuZXh0RWZmZWN0LmZsYWdzICYgQ2hpbGREZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBkZWxldGlvbnMgPSBmaWJlci5kZWxldGlvbnM7XG5cbiAgICAgIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmliZXJUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXJUb0RlbGV0ZTtcbiAgICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGZpYmVyVG9EZWxldGUsIGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBBIGZpYmVyIHdhcyBkZWxldGVkIGZyb20gdGhpcyBwYXJlbnQgZmliZXIsIGJ1dCBpdCdzIHN0aWxsIHBhcnQgb2ZcbiAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKGFsdGVybmF0ZSkgcGFyZW50IGZpYmVyJ3MgbGlzdCBvZiBjaGlsZHJlbi4gQmVjYXVzZVxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFyZSBhIGxpbmtlZCBsaXN0LCBhbiBlYXJsaWVyIHNpYmxpbmcgdGhhdCdzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgLy8gd2lsbCBiZSBjb25uZWN0ZWQgdG8gdGhlIGRlbGV0ZWQgZmliZXIgdmlhIGl0cyBgYWx0ZXJuYXRlYDpcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1hbHRlcm5hdGUtLT4gcHJldmlvdXMgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1zaWJsaW5nLS0+IGRlbGV0ZWQgZmliZXJcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdlIGNhbid0IGRpc2Nvbm5lY3QgYGFsdGVybmF0ZWAgb24gbm9kZXMgdGhhdCBoYXZlbid0IGJlZW4gZGVsZXRlZFxuICAgICAgICAgIC8vIHlldCwgYnV0IHdlIGNhbiBkaXNjb25uZWN0IHRoZSBgc2libGluZ2AgYW5kIGBjaGlsZGAgcG9pbnRlcnMuXG4gICAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGRldGFjaGVkQ2hpbGQgPSBwcmV2aW91c0ZpYmVyLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c0ZpYmVyLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIGRldGFjaGVkU2libGluZyA9IGRldGFjaGVkQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQgPSBkZXRhY2hlZFNpYmxpbmc7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaWJlcik7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihkZWxldGVkU3VidHJlZVJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBEZWxldGlvbiBlZmZlY3RzIGZpcmUgaW4gcGFyZW50IC0+IGNoaWxkIG9yZGVyXG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgZmliZXIgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPOiBPbmx5IHRyYXZlcnNlIHN1YnRyZWUgaWYgaXQgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnLiAoQnV0LCBpZiB3ZVxuICAgIC8vIGRvIHRoaXMsIHN0aWxsIG5lZWQgdG8gaGFuZGxlIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgY29ycmVjdGx5LilcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB7XG4gICAgICAvLyBSZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgZW50aXJlIGRlbGV0ZWQgdHJlZSBhbmQgY2xlYW4gdXAgZmliZXIgZmllbGRzLlxuICAgICAgLy8gVGhpcyBpcyBtb3JlIGFnZ3Jlc3NpdmUgdGhhbiBpZGVhbCwgYW5kIHRoZSBsb25nIHRlcm0gZ29hbCBpcyB0byBvbmx5XG4gICAgICAvLyBoYXZlIHRvIGRldGFjaCB0aGUgZGVsZXRlZCB0cmVlIGF0IHRoZSByb290LlxuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpO1xuXG4gICAgICBpZiAoZmliZXIgPT09IGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IHJldHVybkZpYmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgc3dpdGNoIChjdXJyZW50LnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn0gLy8gVE9ETzogUmV1c2UgcmVhcHBlYXJMYXlvdXRFZmZlY3RzIHRyYXZlcnNhbCBoZXJlP1xuXG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgQ09NUE9ORU5UX1RZUEUgPSAwO1xudmFyIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IDE7XG52YXIgUk9MRV9UWVBFID0gMjtcbnZhciBURVNUX05BTUVfVFlQRSA9IDM7XG52YXIgVEVYVF9UWVBFID0gNDtcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmNvbXBvbmVudCcpO1xuICBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmhhc19wc2V1ZG9fY2xhc3MnKTtcbiAgUk9MRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXN0X2lkJyk7XG4gIFRFWFRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGV4dCcpO1xufVxudmFyIGNvbW1pdEhvb2tzID0gW107XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3QkMSgpIHtcbiAge1xuICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHtcbiAgICAgIHJldHVybiBjb21taXRIb29rKCk7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG5mdW5jdGlvbiBpc0xlZ2FjeUFjdEVudmlyb25tZW50KGZpYmVyKSB7XG4gIHtcbiAgICAvLyBMZWdhY3kgbW9kZS4gV2UgcHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mIFJlYWN0IDE3J3MgYWN0LiBJdCBhc3N1bWVzIGFuXG4gICAgLy8gYWN0IGVudmlyb25tZW50IHdoZW5ldmVyIGBqZXN0YCBpcyBkZWZpbmVkLCBidXQgeW91IGNhbiBzdGlsbCB0dXJuIG9mZlxuICAgIC8vIHNwdXJpb3VzIHdhcm5pbmdzIGJ5IHNldHRpbmcgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGV4cGxpY2l0bHlcbiAgICAvLyB0byBmYWxzZS5cbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIFx1MjAxMyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7IC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IGplc3RcblxuICAgIHZhciBqZXN0SXNEZWZpbmVkID0gdHlwZW9mIGplc3QgIT09ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiAgamVzdElzRGVmaW5lZCAmJiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgIT09IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpIHtcbiAge1xuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgXHUyMDEzIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IEluY2x1ZGUgbGluayB0byByZWxldmFudCBkb2N1bWVudGF0aW9uIHBhZ2UuXG4gICAgICBlcnJvcignVGhlIGN1cnJlbnQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCB0byBzdXBwb3J0ICcgKyAnYWN0KC4uLiknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBDb21taXRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG40O1xudmFyIFJvb3RJblByb2dyZXNzID0gMDtcbnZhciBSb290RmF0YWxFcnJvcmVkID0gMTtcbnZhciBSb290RXJyb3JlZCA9IDI7XG52YXIgUm9vdFN1c3BlbmRlZCA9IDM7XG52YXIgUm9vdFN1c3BlbmRlZFdpdGhEZWxheSA9IDQ7XG52YXIgUm9vdENvbXBsZXRlZCA9IDU7XG52YXIgUm9vdERpZE5vdENvbXBsZXRlID0gNjsgLy8gRGVzY3JpYmVzIHdoZXJlIHdlIGFyZSBpbiB0aGUgUmVhY3QgZXhlY3V0aW9uIHN0YWNrXG5cbnZhciBleGVjdXRpb25Db250ZXh0ID0gTm9Db250ZXh0OyAvLyBUaGUgcm9vdCB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsOyAvLyBUaGUgZmliZXIgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3MgPSBudWxsOyAvLyBUaGUgbGFuZXMgd2UncmUgcmVuZGVyaW5nXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFN0YWNrIHRoYXQgYWxsb3dzIGNvbXBvbmVudHMgdG8gY2hhbmdlIHRoZSByZW5kZXIgbGFuZXMgZm9yIGl0cyBzdWJ0cmVlXG4vLyBUaGlzIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGxhbmVzIHdlIHN0YXJ0ZWQgd29ya2luZyBvbiBhdCB0aGUgcm9vdC4gVGhlIG9ubHlcbi8vIGNhc2Ugd2hlcmUgaXQncyBkaWZmZXJlbnQgZnJvbSBgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXNgIGlzIHdoZW4gd2Vcbi8vIGVudGVyIGEgc3VidHJlZSB0aGF0IGlzIGhpZGRlbiBhbmQgbmVlZHMgdG8gYmUgdW5oaWRkZW46IFN1c3BlbnNlIGFuZFxuLy8gT2Zmc2NyZWVuIGNvbXBvbmVudC5cbi8vXG4vLyBNb3N0IHRoaW5ncyBpbiB0aGUgd29yayBsb29wIHNob3VsZCBkZWFsIHdpdGggd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMuXG4vLyBNb3N0IHRoaW5ncyBpbiBiZWdpbi9jb21wbGV0ZSBwaGFzZXMgc2hvdWxkIGRlYWwgd2l0aCBzdWJ0cmVlUmVuZGVyTGFuZXMuXG5cbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xudmFyIHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOb0xhbmVzKTsgLy8gV2hldGhlciB0byByb290IGNvbXBsZXRlZCwgZXJyb3JlZCwgc3VzcGVuZGVkLCBldGMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7IC8vIEEgZmF0YWwgZXJyb3IsIGlmIG9uZSBpcyB0aHJvd25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsOyAvLyBcIkluY2x1ZGVkXCIgbGFuZXMgcmVmZXIgdG8gbGFuZXMgdGhhdCB3ZXJlIHdvcmtlZCBvbiBkdXJpbmcgdGhpcyByZW5kZXIuIEl0J3Ncbi8vIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIGByZW5kZXJMYW5lc2AgYmVjYXVzZSBgcmVuZGVyTGFuZXNgIGNhbiBjaGFuZ2UgYXMgeW91XG4vLyBlbnRlciBhbmQgZXhpdCBhbiBPZmZzY3JlZW4gdHJlZS4gVGhpcyB2YWx1ZSBpcyB0aGUgY29tYmluYXRpb24gb2YgYWxsIHJlbmRlclxuLy8gbGFuZXMgZm9yIHRoZSBlbnRpcmUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrIGxlZnQgb3ZlciBieSBjb21wb25lbnRzIHRoYXQgd2VyZSB2aXNpdGVkIGR1cmluZyB0aGlzIHJlbmRlci4gT25seVxuLy8gaW5jbHVkZXMgdW5wcm9jZXNzZWQgdXBkYXRlcywgbm90IHdvcmsgaW4gYmFpbGVkIG91dCBjaGlsZHJlbi5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSAoKm5vdCogYW4gaW50ZXJsZWF2ZWQgZXZlbnQpLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7IC8vIFRoZXNlIGFyZSBlcnJvcnMgdGhhdCB3ZSByZWNvdmVyZWQgZnJvbSB3aXRob3V0IHN1cmZhY2luZyB0aGVtIHRvIHRoZSBVSS5cbi8vIFdlIHdpbGwgbG9nIHRoZW0gb25jZSB0aGUgdHJlZSBjb21taXRzLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsOyAvLyBUaGUgbW9zdCByZWNlbnQgdGltZSB3ZSBjb21taXR0ZWQgYSBmYWxsYmFjay4gVGhpcyBsZXRzIHVzIGVuc3VyZSBhIHRyYWluXG4vLyBtb2RlbCB3aGVyZSB3ZSBkb24ndCBjb21taXQgbmV3IGxvYWRpbmcgc3RhdGVzIGluIHRvbyBxdWljayBzdWNjZXNzaW9uLlxuXG52YXIgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IDA7XG52YXIgRkFMTEJBQ0tfVEhST1RUTEVfTVMgPSA1MDA7IC8vIFRoZSBhYnNvbHV0ZSB0aW1lIGZvciB3aGVuIHdlIHNob3VsZCBzdGFydCBnaXZpbmcgdXAgb24gcmVuZGVyaW5nXG4vLyBtb3JlIGFuZCBwcmVmZXIgQ1BVIHN1c3BlbnNlIGhldXJpc3RpY3MgaW5zdGVhZC5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBJbmZpbml0eTsgLy8gSG93IGxvbmcgYSByZW5kZXIgaXMgc3VwcG9zZWQgdG8gdGFrZSBiZWZvcmUgd2Ugc3RhcnQgZm9sbG93aW5nIENQVVxuLy8gc3VzcGVuc2UgaGV1cmlzdGljcyBhbmQgb3B0IG91dCBvZiByZW5kZXJpbmcgbW9yZSBjb250ZW50LlxuXG52YXIgUkVOREVSX1RJTUVPVVRfTVMgPSA1MDA7XG52YXIgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc2V0UmVuZGVyVGltZXIoKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBub3coKSArIFJFTkRFUl9USU1FT1VUX01TO1xufVxuXG5mdW5jdGlvbiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZTtcbn1cbnZhciBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG52YXIgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbnZhciBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7IC8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVByb2ZpbGVyTmVzdGVkVXBkYXRlU2NoZWR1bGVkSG9vayBpcyB0cnVlO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xudmFyIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7IC8vIElmIHR3byB1cGRhdGVzIGFyZSBzY2hlZHVsZWQgd2l0aGluIHRoZSBzYW1lIGV2ZW50LCB3ZSBzaG91bGQgdHJlYXQgdGhlaXJcbi8vIGV2ZW50IHRpbWVzIGFzIHNpbXVsdGFuZW91cywgZXZlbiBpZiB0aGUgYWN0dWFsIGNsb2NrIHRpbWUgaGFzIGFkdmFuY2VkXG4vLyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNhbGwuXG5cbnZhciBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG52YXIgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xudmFyIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290O1xufVxuZnVuY3Rpb24gcmVxdWVzdEV2ZW50VGltZSgpIHtcbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIFdlJ3JlIGluc2lkZSBSZWFjdCwgc28gaXQncyBmaW5lIHRvIHJlYWQgdGhlIGFjdHVhbCB0aW1lLlxuICAgIHJldHVybiBub3coKTtcbiAgfSAvLyBXZSdyZSBub3QgaW5zaWRlIFJlYWN0LCBzbyB3ZSBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGJyb3dzZXIgZXZlbnQuXG5cblxuICBpZiAoY3VycmVudEV2ZW50VGltZSAhPT0gTm9UaW1lc3RhbXApIHtcbiAgICAvLyBVc2UgdGhlIHNhbWUgc3RhcnQgdGltZSBmb3IgYWxsIHVwZGF0ZXMgdW50aWwgd2UgZW50ZXIgUmVhY3QgYWdhaW4uXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG4gIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIHNpbmNlIFJlYWN0IHlpZWxkZWQuIENvbXB1dGUgYSBuZXcgc3RhcnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBub3coKTtcbiAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG59XG5mdW5jdGlvbiByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcikge1xuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFRoZXNlIGFyZSBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuIFRoZVxuICAgIC8vIG9sZCBiZWhhdmlvciBpcyB0byBnaXZlIHRoaXMgdGhlIHNhbWUgXCJ0aHJlYWRcIiAobGFuZXMpIGFzXG4gICAgLy8gd2hhdGV2ZXIgaXMgY3VycmVudGx5IHJlbmRlcmluZy4gU28gaWYgeW91IGNhbGwgYHNldFN0YXRlYCBvbiBhIGNvbXBvbmVudFxuICAgIC8vIHRoYXQgaGFwcGVucyBsYXRlciBpbiB0aGUgc2FtZSByZW5kZXIsIGl0IHdpbGwgZmx1c2guIElkZWFsbHksIHdlIHdhbnQgdG9cbiAgICAvLyByZW1vdmUgdGhlIHNwZWNpYWwgY2FzZSBhbmQgdHJlYXQgdGhlbSBhcyBpZiB0aGV5IGNhbWUgZnJvbSBhblxuICAgIC8vIGludGVybGVhdmVkIGV2ZW50LiBSZWdhcmRsZXNzLCB0aGlzIHBhdHRlcm4gaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IgaXMgb25seSBhIGZhbGxiYWNrLiBUaGUgZmxhZyBvbmx5IGV4aXN0cyB1bnRpbCB3ZSBjYW4gcm9sbFxuICAgIC8vIG91dCB0aGUgc2V0U3RhdGUgd2FybmluZywgc2luY2UgZXhpc3RpbmcgY29kZSBtaWdodCBhY2NpZGVudGFsbHkgcmVseSBvblxuICAgIC8vIHRoZSBjdXJyZW50IGJlaGF2aW9yLlxuICAgIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaXNUcmFuc2l0aW9uID0gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkgIT09IE5vVHJhbnNpdGlvbjtcblxuICBpZiAoaXNUcmFuc2l0aW9uKSB7XG4gICAgaWYgKCBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gICAgICBpZiAoIXRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5hZGQoZmliZXIpO1xuICAgIH0gLy8gVGhlIGFsZ29yaXRobSBmb3IgYXNzaWduaW5nIGFuIHVwZGF0ZSB0byBhIGxhbmUgc2hvdWxkIGJlIHN0YWJsZSBmb3IgYWxsXG4gICAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZVxuICAgIC8vIGlucHV0cyB0byB0aGUgYWxnb3JpdGhtIG11c3QgYmUgdGhlIHNhbWUuXG4gICAgLy9cbiAgICAvLyBUaGUgdHJpY2sgd2UgdXNlIGlzIHRvIGNhY2hlIHRoZSBmaXJzdCBvZiBlYWNoIG9mIHRoZXNlIGlucHV0cyB3aXRoaW4gYW5cbiAgICAvLyBldmVudC4gVGhlbiByZXNldCB0aGUgY2FjaGVkIHZhbHVlcyBvbmNlIHdlIGNhbiBiZSBzdXJlIHRoZSBldmVudCBpc1xuICAgIC8vIG92ZXIuIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cblxuXG4gICAgaWYgKGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID09PSBOb0xhbmUpIHtcbiAgICAgIC8vIEFsbCB0cmFuc2l0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZXZlbnQgYXJlIGFzc2lnbmVkIHRoZSBzYW1lIGxhbmUuXG4gICAgICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lO1xuICB9IC8vIFVwZGF0ZXMgb3JpZ2luYXRpbmcgaW5zaWRlIGNlcnRhaW4gUmVhY3QgbWV0aG9kcywgbGlrZSBmbHVzaFN5bmMsIGhhdmVcbiAgLy8gdGhlaXIgcHJpb3JpdHkgc2V0IGJ5IHRyYWNraW5nIGl0IHdpdGggYSBjb250ZXh0IHZhcmlhYmxlLlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciB1cGRhdGVMYW5lID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IE5vTGFuZSkge1xuICAgIHJldHVybiB1cGRhdGVMYW5lO1xuICB9IC8vIFRoaXMgdXBkYXRlIG9yaWdpbmF0ZWQgb3V0c2lkZSBSZWFjdC4gQXNrIHRoZSBob3N0IGVudmlyb25tZW50IGZvciBhblxuICAvLyBhcHByb3ByaWF0ZSBwcmlvcml0eSwgYmFzZWQgb24gdGhlIHR5cGUgb2YgZXZlbnQuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIGV2ZW50TGFuZSA9IGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCk7XG4gIHJldHVybiBldmVudExhbmU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RSZXRyeUxhbmUoZmliZXIpIHtcbiAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgYHJlcXVlc3RVcGRhdGVMYW5lYCBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIFN1c3BlbnNlXG4gIC8vIFwicmV0cmllc1wiIFx1MjAxNCBhIHNwZWNpYWwgdXBkYXRlIHRoYXQgYXR0ZW1wdHMgdG8gZmxpcCBhIFN1c3BlbnNlIGJvdW5kYXJ5XG4gIC8vIGZyb20gaXRzIHBsYWNlaG9sZGVyIHN0YXRlIHRvIGl0cyBwcmltYXJ5L3Jlc29sdmVkIHN0YXRlLlxuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfVxuXG4gIHJldHVybiBjbGFpbU5leHRSZXRyeUxhbmUoKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpIHtcbiAgY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCk7XG5cbiAge1xuICAgIGlmIChpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QpIHtcbiAgICAgIGVycm9yKCd1c2VJbnNlcnRpb25FZmZlY3QgbXVzdCBub3Qgc2NoZWR1bGUgdXBkYXRlcy4nKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cykge1xuICAgICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgfVxuICB9IC8vIE1hcmsgdGhhdCB0aGUgcm9vdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS5cblxuXG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0xhbmVzICYmIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFRoaXMgdXBkYXRlIHdhcyBkaXNwYXRjaGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzIGlzIGEgbWlzdGFrZVxuICAgIC8vIGlmIHRoZSB1cGRhdGUgb3JpZ2luYXRlcyBmcm9tIHVzZXIgc3BhY2UgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBsb2NhbFxuICAgIC8vIGhvb2sgdXBkYXRlcywgd2hpY2ggYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgYW5kIGRvbid0IHJlYWNoIHRoaXNcbiAgICAvLyBmdW5jdGlvbiksIGJ1dCB0aGVyZSBhcmUgc29tZSBpbnRlcm5hbCBSZWFjdCBmZWF0dXJlcyB0aGF0IHVzZSB0aGlzIGFzXG4gICAgLy8gYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBsaWtlIHNlbGVjdGl2ZSBoeWRyYXRpb24uXG4gICAgd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpOyAvLyBUcmFjayBsYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSBub3JtYWwgdXBkYXRlLCBzY2hlZHVsZWQgZnJvbSBvdXRzaWRlIHRoZSByZW5kZXIgcGhhc2UuIEZvclxuICAgIC8vIGV4YW1wbGUsIGR1cmluZyBhbiBpbnB1dCBldmVudC5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpO1xuXG4gICAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgICAgLy8gUmVjZWl2ZWQgYW4gdXBkYXRlIHRvIGEgdHJlZSB0aGF0J3MgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcuIE1hcmtcbiAgICAgIC8vIHRoYXQgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIHVwZGF0ZSB3b3JrIG9uIHRoaXMgcm9vdC4gVW5sZXNzIHRoZVxuICAgICAgLy8gYGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaGAgZmxhZyBpcyBvZmYgYW5kIHRoaXMgaXMgYSByZW5kZXJcbiAgICAgIC8vIHBoYXNlIHVwZGF0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB0cmVhdCByZW5kZXIgcGhhc2UgdXBkYXRlcyBhcyBpZlxuICAgICAgLy8gdGhleSB3ZXJlIGludGVybGVhdmVkLCBmb3IgYmFja3dhcmRzIGNvbXBhdCByZWFzb25zLlxuICAgICAgaWYgKCAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzLCBsYW5lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICAgICAgLy8gVGhlIHJvb3QgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB3aGljaCBtZWFucyB0aGlzIHJlbmRlclxuICAgICAgICAvLyBkZWZpbml0ZWx5IHdvbid0IGZpbmlzaC4gU2luY2Ugd2UgaGF2ZSBhIG5ldyB1cGRhdGUsIGxldCdzIG1hcmsgaXQgYXNcbiAgICAgICAgLy8gc3VzcGVuZGVkIG5vdywgcmlnaHQgYmVmb3JlIG1hcmtpbmcgdGhlIGluY29taW5nIHVwZGF0ZS4gVGhpcyBoYXMgdGhlXG4gICAgICAgIC8vIGVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIGFuZCBzd2l0Y2hpbmcgdG8gdGhlIHVwZGF0ZS5cbiAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBvdmVycmlkZSBwaW5ncyB0aGF0IGhhcHBlbiB3aGlsZSB3ZSd2ZVxuICAgICAgICAvLyBhbHJlYWR5IHN0YXJ0ZWQgcmVuZGVyaW5nLlxuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcblxuICAgIGlmIChsYW5lID09PSBTeW5jTGFuZSAmJiBleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBUcmVhdCBgYWN0YCBhcyBpZiBpdCdzIGluc2lkZSBgYmF0Y2hlZFVwZGF0ZXNgLCBldmVuIGluIGxlZ2FjeSBtb2RlLlxuICAgICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSkpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBzeW5jaHJvbm91cyB3b3JrIG5vdywgdW5sZXNzIHdlJ3JlIGFscmVhZHkgd29ya2luZyBvciBpbnNpZGVcbiAgICAgIC8vIGEgYmF0Y2guIFRoaXMgaXMgaW50ZW50aW9uYWxseSBpbnNpZGUgc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGluc3RlYWQgb2ZcbiAgICAgIC8vIHNjaGVkdWxlQ2FsbGJhY2tGb3JGaWJlciB0byBwcmVzZXJ2ZSB0aGUgYWJpbGl0eSB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAvLyB3aXRob3V0IGltbWVkaWF0ZWx5IGZsdXNoaW5nIGl0LiBXZSBvbmx5IGRvIHRoaXMgZm9yIHVzZXItaW5pdGlhdGVkXG4gICAgICAvLyB1cGRhdGVzLCB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIG9mIGxlZ2FjeSBtb2RlLlxuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSkge1xuICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBmb3JrIG9mIHNjaGVkdWxlVXBkYXRlT25GaWJlciB0aGF0IGlzIG9ubHkgdXNlZCB0b1xuICAvLyBzY2hlZHVsZSB0aGUgaW5pdGlhbCBoeWRyYXRpb24gb2YgYSByb290IHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkLiBNb3N0XG4gIC8vIG9mIHRoZSBzdHVmZiBpbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgY2FuIGJlIHNraXBwZWQuXG4gIC8vXG4gIC8vIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBzZXBhcmF0ZSBwYXRoLCB0aG91Z2gsIGlzIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICAvLyBpbml0aWFsIGNoaWxkcmVuIGZyb20gc3Vic2VxdWVudCB1cGRhdGVzLiBJbiBmdWxseSBjbGllbnQtcmVuZGVyZWQgcm9vdHNcbiAgLy8gKGNyZWF0ZVJvb3QgaW5zdGVhZCBvZiBoeWRyYXRlUm9vdCksIGFsbCB0b3AtbGV2ZWwgcmVuZGVycyBhcmUgbW9kZWxlZCBhc1xuICAvLyB1cGRhdGVzLCBidXQgaHlkcmF0aW9uIHJvb3RzIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhlIGluaXRpYWwgcmVuZGVyIG11c3RcbiAgLy8gbWF0Y2ggd2hhdCB3YXMgcmVuZGVyZWQgb24gdGhlIHNlcnZlci5cbiAgdmFyIGN1cnJlbnQgPSByb290LmN1cnJlbnQ7XG4gIGN1cnJlbnQubGFuZXMgPSBsYW5lO1xuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG59XG5mdW5jdGlvbiBpc1Vuc2FmZUNsYXNzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIE9ubHkgY2FsbGVkIGJ5IGNsYXNzIGNvbXBvbmVudHMsXG4gIC8vIHdoaWNoIHNwZWNpYWwgKGRlcHJlY2F0ZWQpIGJlaGF2aW9yIGZvciBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmUgcHJvcHMuXG4gIHJldHVybiAoLy8gVE9ETzogUmVtb3ZlIG91dGRhdGVkIGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaCBleHBlcmltZW50LiBXZVxuICAgIC8vIGRlY2lkZWQgbm90IHRvIGVuYWJsZSBpdC5cbiAgICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0XG4gICk7XG59IC8vIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNjaGVkdWxlIGEgdGFzayBmb3IgYSByb290LiBUaGVyZSdzIG9ubHkgb25lIHRhc2sgcGVyXG4vLyByb290OyBpZiBhIHRhc2sgd2FzIGFscmVhZHkgc2NoZWR1bGVkLCB3ZSdsbCBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHByaW9yaXR5XG4vLyBvZiB0aGUgZXhpc3RpbmcgdGFzayBpcyB0aGUgc2FtZSBhcyB0aGUgcHJpb3JpdHkgb2YgdGhlIG5leHQgbGV2ZWwgdGhhdCB0aGVcbi8vIHJvb3QgaGFzIHdvcmsgb24uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGV2ZXJ5IHVwZGF0ZSwgYW5kIHJpZ2h0IGJlZm9yZVxuLy8gZXhpdGluZyBhIHRhc2suXG5cbmZ1bmN0aW9uIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBjdXJyZW50VGltZSkge1xuICB2YXIgZXhpc3RpbmdDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTsgLy8gQ2hlY2sgaWYgYW55IGxhbmVzIGFyZSBiZWluZyBzdGFydmVkIGJ5IG90aGVyIHdvcmsuIElmIHNvLCBtYXJrIHRoZW0gYXNcbiAgLy8gZXhwaXJlZCBzbyB3ZSBrbm93IHRvIHdvcmsgb24gdGhvc2UgbmV4dC5cblxuICBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKTsgLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIGFuZCB0aGVpciBwcmlvcml0eS5cblxuICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogVGhlcmUncyBub3RoaW5nIHRvIHdvcmsgb24uXG4gICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxDYWxsYmFjayQxKGV4aXN0aW5nQ2FsbGJhY2tOb2RlKTtcbiAgICB9XG5cbiAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICAgIHJldHVybjtcbiAgfSAvLyBXZSB1c2UgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbGFuZSB0byByZXByZXNlbnQgdGhlIHByaW9yaXR5IG9mIHRoZSBjYWxsYmFjay5cblxuXG4gIHZhciBuZXdDYWxsYmFja1ByaW9yaXR5ID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpOyAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHRhc2suIFdlIG1heSBiZSBhYmxlIHRvIHJldXNlIGl0LlxuXG4gIHZhciBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPSByb290LmNhbGxiYWNrUHJpb3JpdHk7XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSA9PT0gbmV3Q2FsbGJhY2tQcmlvcml0eSAmJiAvLyBTcGVjaWFsIGNhc2UgcmVsYXRlZCB0byBgYWN0YC4gSWYgdGhlIGN1cnJlbnRseSBzY2hlZHVsZWQgdGFzayBpcyBhXG4gIC8vIFNjaGVkdWxlciB0YXNrLCByYXRoZXIgdGhhbiBhbiBgYWN0YCB0YXNrLCBjYW5jZWwgaXQgYW5kIHJlLXNjaGVkdWxlZFxuICAvLyBvbiB0aGUgYGFjdGAgcXVldWUuXG4gICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gZmFrZUFjdENhbGxiYWNrTm9kZSkpIHtcbiAgICB7XG4gICAgICAvLyBJZiB3ZSdyZSBnb2luZyB0byByZS11c2UgYW4gZXhpc3RpbmcgdGFzaywgaXQgbmVlZHMgdG8gZXhpc3QuXG4gICAgICAvLyBBc3N1bWUgdGhhdCBkaXNjcmV0ZSB1cGRhdGUgbWljcm90YXNrcyBhcmUgbm9uLWNhbmNlbGxhYmxlIGFuZCBudWxsLlxuICAgICAgLy8gVE9ETzogVGVtcG9yYXJ5IHVudGlsIHdlIGNvbmZpcm0gdGhpcyB3YXJuaW5nIGlzIG5vdCBmaXJlZC5cbiAgICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSA9PSBudWxsICYmIGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSAhPT0gU3luY0xhbmUpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHNjaGVkdWxlZCBjYWxsYmFjayB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFRoZSBwcmlvcml0eSBoYXNuJ3QgY2hhbmdlZC4gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyB0YXNrLiBFeGl0LlxuXG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgIT0gbnVsbCkge1xuICAgIC8vIENhbmNlbCB0aGUgZXhpc3RpbmcgY2FsbGJhY2suIFdlJ2xsIHNjaGVkdWxlIGEgbmV3IG9uZSBiZWxvdy5cbiAgICBjYW5jZWxDYWxsYmFjayQxKGV4aXN0aW5nQ2FsbGJhY2tOb2RlKTtcbiAgfSAvLyBTY2hlZHVsZSBhIG5ldyBjYWxsYmFjay5cblxuXG4gIHZhciBuZXdDYWxsYmFja05vZGU7XG5cbiAgaWYgKG5ld0NhbGxiYWNrUHJpb3JpdHkgPT09IFN5bmNMYW5lKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBTeW5jIFJlYWN0IGNhbGxiYWNrcyBhcmUgc2NoZWR1bGVkIG9uIGEgc3BlY2lhbFxuICAgIC8vIGludGVybmFsIHF1ZXVlXG4gICAgaWYgKHJvb3QudGFnID09PSBMZWdhY3lSb290KSB7XG4gICAgICBpZiAoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSAhPT0gbnVsbCkge1xuICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZVN5bmNDYWxsYmFjayhwZXJmb3JtU3luY1dvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gRmx1c2ggdGhlIHF1ZXVlIGluIGEgbWljcm90YXNrLlxuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSW5zaWRlIGBhY3RgLCB1c2Ugb3VyIGludGVybmFsIGBhY3RgIHF1ZXVlIHNvIHRoYXQgdGhlc2UgZ2V0IGZsdXNoZWRcbiAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzY29wZSBldmVuIHdoZW4gdXNpbmcgdGhlIHN5bmMgdmVyc2lvblxuICAgICAgICAvLyBvZiBgYWN0YC5cbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50LnB1c2goZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVkdWxlTWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBJbiBTYWZhcmksIGFwcGVuZGluZyBhbiBpZnJhbWUgZm9yY2VzIG1pY3JvdGFza3MgdG8gcnVuLlxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjI0NTlcbiAgICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJ1bm5pbmcgY2FsbGJhY2tzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyXG4gICAgICAgICAgLy8gb3IgY29tbWl0IHNvIHdlIG5lZWQgdG8gY2hlY2sgYWdhaW5zdCB0aGF0LlxuICAgICAgICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdvdWxkIHN0aWxsIHByZW1hdHVyZWx5IGZsdXNoIHRoZSBjYWxsYmFja3NcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaGFwcGVucyBvdXRzaWRlIHJlbmRlciBvciBjb21taXQgcGhhc2UgKGUuZy4gaW4gYW4gZXZlbnQpLlxuICAgICAgICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eUxldmVsO1xuXG4gICAgc3dpdGNoIChsYW5lc1RvRXZlbnRQcmlvcml0eShuZXh0TGFuZXMpKSB7XG4gICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gc2NoZWR1bGVDYWxsYmFjayQxKHNjaGVkdWxlclByaW9yaXR5TGV2ZWwsIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfVxuXG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7XG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbmV3Q2FsbGJhY2tOb2RlO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgZXZlcnkgY29uY3VycmVudCB0YXNrLCBpLmUuIGFueXRoaW5nIHRoYXRcbi8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuXG5cblxuZnVuY3Rpb24gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KHJvb3QsIGRpZFRpbWVvdXQpIHtcbiAge1xuICAgIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpO1xuICB9IC8vIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gYSBSZWFjdCBldmVudCwgd2UgY2FuIGNsZWFyIHRoZSBjdXJyZW50XG4gIC8vIGV2ZW50IHRpbWUuIFRoZSBuZXh0IHVwZGF0ZSB3aWxsIGNvbXB1dGUgYSBuZXcgZXZlbnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbiAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9IC8vIEZsdXNoIGFueSBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBiZWZvcmUgZGVjaWRpbmcgd2hpY2ggbGFuZXMgdG8gd29yayBvbixcbiAgLy8gaW4gY2FzZSB0aGV5IHNjaGVkdWxlIGFkZGl0aW9uYWwgd29yay5cblxuXG4gIHZhciBvcmlnaW5hbENhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlO1xuICB2YXIgZGlkRmx1c2hQYXNzaXZlRWZmZWN0cyA9IGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcblxuICBpZiAoZGlkRmx1c2hQYXNzaXZlRWZmZWN0cykge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGUgcGFzc2l2ZSBlZmZlY3QgcGhhc2UgbWF5IGhhdmUgY2FuY2VsZWQgdGhlIGN1cnJlbnQgdGFzay5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFzayBub2RlIGZvciB0aGlzIHJvb3Qgd2FzIGNoYW5nZWQuXG4gICAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlICE9PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdGFzayB3YXMgY2FuY2VsZWQuIEV4aXQuIFdlIGRvbid0IG5lZWQgdG8gY2FsbFxuICAgICAgLy8gYGVuc3VyZVJvb3RJc1NjaGVkdWxlZGAgYmVjYXVzZSB0aGUgY2hlY2sgYWJvdmUgaW1wbGllcyBlaXRoZXIgdGhhdFxuICAgICAgLy8gdGhlcmUncyBhIG5ldyB0YXNrLCBvciB0aGF0IHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290LlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZFxuICAvLyBvbiB0aGUgcm9vdC5cblxuXG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFRoaXMgaXMgbmV2ZXIgZXhwZWN0ZWQgdG8gaGFwcGVuLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFdlIGRpc2FibGUgdGltZS1zbGljaW5nIGluIHNvbWUgY2FzZXM6IGlmIHRoZSB3b3JrIGhhcyBiZWVuIENQVS1ib3VuZFxuICAvLyBmb3IgdG9vIGxvbmcgKFwiZXhwaXJlZFwiIHdvcmssIHRvIHByZXZlbnQgc3RhcnZhdGlvbiksIG9yIHdlJ3JlIGluXG4gIC8vIHN5bmMtdXBkYXRlcy1ieS1kZWZhdWx0IG1vZGUuXG4gIC8vIFRPRE86IFdlIG9ubHkgY2hlY2sgYGRpZFRpbWVvdXRgIGRlZmVuc2l2ZWx5LCB0byBhY2NvdW50IGZvciBhIFNjaGVkdWxlclxuICAvLyBidWcgd2UncmUgc3RpbGwgaW52ZXN0aWdhdGluZy4gT25jZSB0aGUgYnVnIGluIFNjaGVkdWxlciBpcyBmaXhlZCxcbiAgLy8gd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSB0cmFjayBleHBpcmF0aW9uIG91cnNlbHZlcy5cblxuXG4gIHZhciBzaG91bGRUaW1lU2xpY2UgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpICYmICFpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSAmJiAoICFkaWRUaW1lb3V0KTtcbiAgdmFyIGV4aXRTdGF0dXMgPSBzaG91bGRUaW1lU2xpY2UgPyByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykgOiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGxcbiAgICAgIC8vIHJlbmRlciBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbFxuICAgICAgLy8gaW5jbHVkZXMgYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyXG4gICAgICAvLyB0aGUgc2Vjb25kIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbGFuZXMgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgIHRocm93IGZhdGFsRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgICAgLy8gVGhlIHJlbmRlciB1bndvdW5kIHdpdGhvdXQgY29tcGxldGluZyB0aGUgdHJlZS4gVGhpcyBoYXBwZW5zIGluIHNwZWNpYWxcbiAgICAgIC8vIGNhc2VzIHdoZXJlIG5lZWQgdG8gZXhpdCB0aGUgY3VycmVudCByZW5kZXIgd2l0aG91dCBwcm9kdWNpbmcgYVxuICAgICAgLy8gY29uc2lzdGVudCB0cmVlIG9yIGNvbW1pdHRpbmcuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gZHVyaW5nIGEgY29uY3VycmVudCByZW5kZXIsIG5vdCBhIGRpc2NyZXRlIG9yXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGUuIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCBmb3IgdGhpcyB3aGVuIHdlXG4gICAgICAvLyB1bndvdW5kIHRoZSBzdGFjay5cbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIGNvbXBsZXRlZC5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVuZGVyIG1heSBoYXZlIHlpZWxkZWQgdG8gYSBjb25jdXJyZW50IGV2ZW50LCBhbmQgaWYgc28sXG4gICAgICAvLyBjb25maXJtIHRoYXQgYW55IG5ld2x5IHJlbmRlcmVkIHN0b3JlcyBhcmUgY29uc2lzdGVudC5cbiAgICAgIC8vIFRPRE86IEl0J3MgcG9zc2libGUgdGhhdCBldmVuIGEgY29uY3VycmVudCByZW5kZXIgbWF5IG5ldmVyIGhhdmUgeWllbGRlZFxuICAgICAgLy8gdG8gdGhlIG1haW4gdGhyZWFkLCBpZiBpdCB3YXMgZmFzdCBlbm91Z2gsIG9yIGlmIGl0IGV4cGlyZWQuIFdlIGNvdWxkXG4gICAgICAvLyBza2lwIHRoZSBjb25zaXN0ZW5jeSBjaGVjayBpbiB0aGF0IGNhc2UsIHRvby5cbiAgICAgIHZhciByZW5kZXJXYXNDb25jdXJyZW50ID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKTtcbiAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAocmVuZGVyV2FzQ29uY3VycmVudCAmJiAhaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykpIHtcbiAgICAgICAgLy8gQSBzdG9yZSB3YXMgbXV0YXRlZCBpbiBhbiBpbnRlcmxlYXZlZCBldmVudC4gUmVuZGVyIGFnYWluLFxuICAgICAgICAvLyBzeW5jaHJvbm91c2x5LCB0byBibG9jayBmdXJ0aGVyIG11dGF0aW9ucy5cbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTsgLy8gV2UgbmVlZCB0byBjaGVjayBhZ2FpbiBpZiBzb21ldGhpbmcgdGhyZXdcblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgICAgICB2YXIgX2Vycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICAgICAgaWYgKF9lcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgICAgIGxhbmVzID0gX2Vycm9yUmV0cnlMYW5lcztcbiAgICAgICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBfZXJyb3JSZXRyeUxhbmVzKTsgLy8gV2UgYXNzdW1lIHRoZSB0cmVlIGlzIG5vdyBjb25zaXN0ZW50IGJlY2F1c2Ugd2UgZGlkbid0IHlpZWxkIHRvIGFueVxuICAgICAgICAgICAgLy8gY29uY3VycmVudCBldmVudHMuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgICAgICB2YXIgX2ZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICAgICAgdGhyb3cgX2ZhdGFsRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIFRoZSBuZXh0IHN0ZXAgaXMgZWl0aGVyIHRvIGNvbW1pdCBpdCxcbiAgICAgIC8vIG9yLCBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLCB3YWl0IHRvIGNvbW1pdCBpdCBhZnRlciBhIHRpbWVvdXQuXG5cblxuICAgICAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgICAgIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlID09PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkge1xuICAgIC8vIFRoZSB0YXNrIG5vZGUgc2NoZWR1bGVkIGZvciB0aGlzIHJvb3QgaXMgdGhlIHNhbWUgb25lIHRoYXQnc1xuICAgIC8vIGN1cnJlbnRseSBleGVjdXRlZC4gTmVlZCB0byByZXR1cm4gYSBjb250aW51YXRpb24uXG4gICAgcmV0dXJuIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcykge1xuICAvLyBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLCBkaXNjYXJkIHNlcnZlciByZXNwb25zZSBhbmQgZmFsbFxuICAvLyBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci5cbiAgLy8gQmVmb3JlIHJlbmRlcmluZyBhZ2Fpbiwgc2F2ZSB0aGUgZXJyb3JzIGZyb20gdGhlIHByZXZpb3VzIGF0dGVtcHQuXG4gIHZhciBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycztcblxuICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgIC8vIFRoZSBzaGVsbCBmYWlsZWQgdG8gaHlkcmF0ZS4gU2V0IGEgZmxhZyB0byBmb3JjZSBhIGNsaWVudCByZW5kZXJpbmdcbiAgICAvLyBkdXJpbmcgdGhlIG5leHQgYXR0ZW1wdC4gVG8gZG8gdGhpcywgd2UgY2FsbCBwcmVwYXJlRnJlc2hTdGFjayBub3dcbiAgICAvLyB0byBjcmVhdGUgdGhlIHJvb3Qgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gVGhpcyBpcyBhIGJpdCB3ZWlyZCBpbiB0ZXJtc1xuICAgIC8vIG9mIGZhY3RvcmluZywgYmVjYXVzZSBpdCByZWxpZXMgb24gcmVuZGVyUm9vdFN5bmMgbm90IGNhbGxpbmdcbiAgICAvLyBwcmVwYXJlRnJlc2hTdGFjayBhZ2FpbiBpbiB0aGUgY2FsbCBiZWxvdywgd2hpY2ggaGFwcGVucyBiZWNhdXNlIHRoZVxuICAgIC8vIHJvb3QgYW5kIGxhbmVzIGhhdmVuJ3QgY2hhbmdlZC5cbiAgICAvL1xuICAgIC8vIFRPRE86IEkgdGhpbmsgd2hhdCB3ZSBzaG91bGQgZG8gaXMgc2V0IEZvcmNlQ2xpZW50UmVuZGVyIGluc2lkZVxuICAgIC8vIHRocm93RXhjZXB0aW9uLCBsaWtlIHdlIGRvIGZvciBuZXN0ZWQgU3VzcGVuc2UgYm91bmRhcmllcy4gVGhlIHJlYXNvblxuICAgIC8vIGl0J3MgaGVyZSBpbnN0ZWFkIGlzIHNvIHdlIGNhbiBzd2l0Y2ggdG8gdGhlIHN5bmNocm9ub3VzIHdvcmsgbG9vcCwgdG9vLlxuICAgIC8vIFNvbWV0aGluZyB0byBjb25zaWRlciBmb3IgYSBmdXR1cmUgcmVmYWN0b3IuXG4gICAgdmFyIHJvb3RXb3JrSW5Qcm9ncmVzcyA9IHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgcm9vdFdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuXG4gICAge1xuICAgICAgZXJyb3JIeWRyYXRpbmdDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG5cbiAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIHJlbmRlcmluZyBvbiByZXRyeVxuICAgIC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgZmFpbGVkIGZpcnN0IGF0dGVtcHQgaGF2ZSBiZWVuIHJlY292ZXJlZC4gQWRkXG4gICAgLy8gdGhlbSB0byB0aGUgY29sbGVjdGlvbiBvZiByZWNvdmVyYWJsZSBlcnJvcnMuIFdlJ2xsIGxvZyB0aGVtIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZS5cbiAgICB2YXIgZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycztcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9yc0Zyb21GaXJzdEF0dGVtcHQ7IC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgc2Vjb25kIGF0dGVtcHQgc2hvdWxkIGJlIHF1ZXVlZCBhZnRlciB0aGUgZXJyb3JzXG4gICAgLy8gZnJvbSB0aGUgZmlyc3QgYXR0ZW1wdCwgdG8gcHJlc2VydmUgdGhlIGNhdXNhbCBzZXF1ZW5jZS5cblxuICAgIGlmIChlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCAhPT0gbnVsbCkge1xuICAgICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXRTdGF0dXM7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLnB1c2guYXBwbHkod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIGVycm9ycyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcykge1xuICBzd2l0Y2ggKGV4aXRTdGF0dXMpIHtcbiAgICBjYXNlIFJvb3RJblByb2dyZXNzOlxuICAgIGNhc2UgUm9vdEZhdGFsRXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrXG4gICAgLy8gc3RhdGVtZW50LCBidXQgZXNsaW50IGRvZXNuJ3Qga25vdyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWluc1xuICAgIC8vIGlmIEkgZG8uIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gcmV0cnkgdGhpcyB0cmVlLiBJZiB3ZSByZWFjaGVkXG4gICAgICAgIC8vIHRoaXMgcG9pbnQsIGl0IGVycm9yZWQgYWdhaW4uIENvbW1pdCBpdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkOlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTsgLy8gV2UgaGF2ZSBhbiBhY2NlcHRhYmxlIGxvYWRpbmcgc3RhdGUuIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB3ZVxuICAgICAgICAvLyBzaG91bGQgaW1tZWRpYXRlbHkgY29tbWl0IGl0IG9yIHdhaXQgYSBiaXQuXG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpICYmIC8vIGRvIG5vdCBkZWxheSBpZiB3ZSdyZSBpbnNpZGUgYW4gYWN0KCkgc2NvcGVcbiAgICAgICAgIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyByZW5kZXIgb25seSBpbmNsdWRlZCByZXRyaWVzLCBubyB1cGRhdGVzLiBUaHJvdHRsZSBjb21taXR0aW5nXG4gICAgICAgICAgLy8gcmV0cmllcyBzbyB0aGF0IHdlIGRvbid0IHNob3cgdG9vIG1hbnkgbG9hZGluZyBzdGF0ZXMgdG9vIHF1aWNrbHkuXG4gICAgICAgICAgdmFyIG1zVW50aWxUaW1lb3V0ID0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSArIEZBTExCQUNLX1RIUk9UVExFX01TIC0gbm93KCk7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG4gICAgICAgICAgaWYgKG1zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIHZhciBuZXh0TGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgICAgICAgLy8gVGhlcmUncyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290LlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcblxuICAgICAgICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMoc3VzcGVuZGVkTGFuZXMsIGxhbmVzKSkge1xuICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgcHJlZmVyIHRvIHJlbmRlciB0aGUgZmFsbGJhY2sgb2YgYXQgdGhlIGxhc3RcbiAgICAgICAgICAgICAgLy8gc3VzcGVuZGVkIGxldmVsLiBQaW5nIHRoZSBsYXN0IHN1c3BlbmRlZCBsZXZlbCB0byB0cnlcbiAgICAgICAgICAgICAgLy8gcmVuZGVyaW5nIGl0IGFnYWluLlxuICAgICAgICAgICAgICAvLyBGSVhNRTogV2hhdCBpZiB0aGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBJZGxlPyBTaG91bGQgbm90IHJlc3RhcnQuXG4gICAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICAgICAgICAgIG1hcmtSb290UGluZ2VkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IC8vIFRoZSByZW5kZXIgaXMgc3VzcGVuZGVkLCBpdCBoYXNuJ3QgdGltZWQgb3V0LCBhbmQgdGhlcmUncyBub1xuICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgd29yayB0byBkby4gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFja1xuICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuXG5cblxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIG1zVW50aWxUaW1lb3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUaGUgd29yayBleHBpcmVkLiBDb21taXQgaW1tZWRpYXRlbHkuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgdHJhbnNpdGlvbiwgc28gd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCBjb21taXR0aW5nIGFcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgLy8gdW50aWwgd2UgcmVjZWl2ZSBtb3JlIGRhdGEuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB0cmFuc2l0aW9uLCBidXQgd2UgZGlkIHRyaWdnZXIgYW4gYXZvaWRlZCBzdGF0ZS5cbiAgICAgICAgICAvLyBTY2hlZHVsZSBhIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgdXNpbmcgdGhlIEp1c3RcbiAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgLy8gVE9ETzogSXMgdGhlIEpORCBvcHRpbWl6YXRpb24gd29ydGggdGhlIGFkZGVkIGNvbXBsZXhpdHk/IElmIHRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgb25seSByZWFzb24gd2UgdHJhY2sgdGhlIGV2ZW50IHRpbWUsIHRoZW4gcHJvYmFibHkgbm90LlxuICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLlxuICAgICAgICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcyk7XG4gICAgICAgICAgdmFyIGV2ZW50VGltZU1zID0gbW9zdFJlY2VudEV2ZW50VGltZTtcbiAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7XG5cbiAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cblxuICAgICAgICAgIGlmIChfbXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICAgICAgICAvLyB0byBhcnJpdmUuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgX21zVW50aWxUaW1lb3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBDb21taXQgdGhlIHBsYWNlaG9sZGVyLlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290Q29tcGxldGVkOlxuICAgICAge1xuICAgICAgICAvLyBUaGUgd29yayBjb21wbGV0ZWQuIFJlYWR5IHRvIGNvbW1pdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHJvb3QgZXhpdCBzdGF0dXMuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykge1xuICAvLyBTZWFyY2ggdGhlIHJlbmRlcmVkIHRyZWUgZm9yIGV4dGVybmFsIHN0b3JlIHJlYWRzLCBhbmQgY2hlY2sgd2hldGhlciB0aGVcbiAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZCBpbiBhIGNvbmN1cnJlbnQgZXZlbnQuIEludGVudGlvbmFsbHkgdXNpbmcgYW4gaXRlcmF0aXZlXG4gIC8vIGxvb3AgaW5zdGVhZCBvZiByZWN1cnNpb24gc28gd2UgY2FuIGV4aXQgZWFybHkuXG4gIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5vZGUuZmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5KSB7XG4gICAgICB2YXIgdXBkYXRlUXVldWUgPSBub2RlLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNoZWNrcyA9IHVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgICAgICBpZiAoY2hlY2tzICE9PSBudWxsKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGVjayA9IGNoZWNrc1tpXTtcbiAgICAgICAgICAgIHZhciBnZXRTbmFwc2hvdCA9IGNoZWNrLmdldFNuYXBzaG90O1xuICAgICAgICAgICAgdmFyIHJlbmRlcmVkVmFsdWUgPSBjaGVjay52YWx1ZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFvYmplY3RJcyhnZXRTbmFwc2hvdCgpLCByZW5kZXJlZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGFuIGluY29uc2lzdGVudCBzdG9yZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIElmIGBnZXRTbmFwc2hvdGAgdGhyb3dzLCByZXR1cm4gYGZhbHNlYC4gVGhpcyB3aWxsIHNjaGVkdWxlXG4gICAgICAgICAgICAgIC8vIGEgcmUtcmVuZGVyLCBhbmQgdGhlIGVycm9yIHdpbGwgYmUgcmV0aHJvd24gZHVyaW5nIHJlbmRlci5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAobm9kZS5zdWJ0cmVlRmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5ICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IGNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfSAvLyBGbG93IGRvZXNuJ3Qga25vdyB0aGlzIGlzIHVucmVhY2hhYmxlLCBidXQgZXNsaW50IGRvZXNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICAvLyBXaGVuIHN1c3BlbmRpbmcsIHdlIHNob3VsZCBhbHdheXMgZXhjbHVkZSBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIG9yIChtb3JlXG4gIC8vIHJhcmVseSwgc2luY2Ugd2UgdHJ5IHRvIGF2b2lkIGl0KSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAvLyBUT0RPOiBMb2wgbWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gZmFjdG9yIHRoaXMgYmVzaWRlcyB0aGlzXG4gIC8vIG9ibm94aW91c2x5IG5hbWVkIGZ1bmN0aW9uIDopXG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzKTtcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMpO1xuICBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IGdvXG4vLyB0aHJvdWdoIFNjaGVkdWxlclxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1TeW5jV29ya09uUm9vdChyb290KSB7XG4gIHtcbiAgICBzeW5jTmVzdGVkVXBkYXRlRmxhZygpO1xuICB9XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH1cblxuICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUobGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIC8vIFRoZXJlJ3Mgbm8gcmVtYWluaW5nIHN5bmMgd29yayBsZWZ0LlxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyXG4gICAgLy8gc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGwgaW5jbHVkZXNcbiAgICAvLyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXIgdGhlIHNlY29uZFxuICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbGFuZXMgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHRocm93IGZhdGFsRXJyb3I7XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIEJlY2F1c2UgdGhpcyBpcyBhIHN5bmMgcmVuZGVyLCB3ZVxuICAvLyB3aWxsIGNvbW1pdCBpdCBldmVuIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQuXG5cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTsgLy8gQmVmb3JlIGV4aXRpbmcsIG1ha2Ugc3VyZSB0aGVyZSdzIGEgY2FsbGJhY2sgc2NoZWR1bGVkIGZvciB0aGUgbmV4dFxuICAvLyBwZW5kaW5nIGxldmVsLlxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmbHVzaFJvb3Qocm9vdCwgbGFuZXMpIHtcbiAgaWYgKGxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbWVyZ2VMYW5lcyhsYW5lcywgU3luY0xhbmUpKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYSk7XG4gIH0gZmluYWxseSB7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBJZiB0aGVyZSB3ZXJlIGxlZ2FjeSBzeW5jIHVwZGF0ZXMsIGZsdXNoIHRoZW0gYXQgdGhlIGVuZCBvZiB0aGUgb3V0ZXJcbiAgICAvLyBtb3N0IGJhdGNoZWRVcGRhdGVzLWxpa2UgbWV0aG9kLlxuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAvLyBUcmVhdCBgYWN0YCBhcyBpZiBpdCdzIGluc2lkZSBgYmF0Y2hlZFVwZGF0ZXNgLCBldmVuIGluIGxlZ2FjeSBtb2RlLlxuICAgICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSkpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc2NyZXRlVXBkYXRlcyhmbiwgYSwgYiwgYywgZCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIHJldHVybiBmbihhLCBiLCBjLCBkKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgfVxuICB9XG59IC8vIE92ZXJsb2FkIHRoZSBkZWZpbml0aW9uIHRvIHRoZSB0d28gdmFsaWQgc2lnbmF0dXJlcy5cbi8vIFdhcm5pbmcsIHRoaXMgb3B0cy1vdXQgb2YgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGJvZHkuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyhmbikge1xuICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgZmx1c2ggcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgLy8gbmV4dCBldmVudCwgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIG9uZS5cbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsICYmIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzLnRhZyA9PT0gTGVnYWN5Um9vdCAmJiAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgaWYgKGZuKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAvLyBOb3RlIHRoYXQgdGhpcyB3aWxsIGhhcHBlbiBldmVuIGlmIGJhdGNoZWRVcGRhdGVzIGlzIGhpZ2hlciB1cFxuICAgIC8vIHRoZSBzdGFjay5cblxuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaXNBbHJlYWR5UmVuZGVyaW5nKCkge1xuICAvLyBVc2VkIGJ5IHRoZSByZW5kZXJlciB0byBwcmludCBhIHdhcm5pbmcgaWYgY2VydGFpbiBBUElzIGFyZSBjYWxsZWQgZnJvbVxuICAvLyB0aGUgd3JvbmcgY29udGV4dC5cbiAgcmV0dXJuICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoUmVuZGVyTGFuZXMoZmliZXIsIGxhbmVzKSB7XG4gIHB1c2goc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBzdWJ0cmVlUmVuZGVyTGFuZXMsIGZpYmVyKTtcbiAgc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhzdWJ0cmVlUmVuZGVyTGFuZXMsIGxhbmVzKTtcbiAgd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcG9wUmVuZGVyTGFuZXMoZmliZXIpIHtcbiAgc3VidHJlZVJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLmN1cnJlbnQ7XG4gIHBvcChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpIHtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgdGltZW91dEhhbmRsZSA9IHJvb3QudGltZW91dEhhbmRsZTtcblxuICBpZiAodGltZW91dEhhbmRsZSAhPT0gbm9UaW1lb3V0KSB7XG4gICAgLy8gVGhlIHJvb3QgcHJldmlvdXMgc3VzcGVuZGVkIGFuZCBzY2hlZHVsZWQgYSB0aW1lb3V0IHRvIGNvbW1pdCBhIGZhbGxiYWNrXG4gICAgLy8gc3RhdGUuIE5vdyB0aGF0IHdlIGhhdmUgYWRkaXRpb25hbCB3b3JrLCBjYW5jZWwgdGhlIHRpbWVvdXQuXG4gICAgcm9vdC50aW1lb3V0SGFuZGxlID0gbm9UaW1lb3V0OyAvLyAkRmxvd0ZpeE1lIENvbXBsYWlucyBub1RpbWVvdXQgaXMgbm90IGEgVGltZW91dElELCBkZXNwaXRlIHRoZSBjaGVjayBhYm92ZVxuXG4gICAgY2FuY2VsVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHZhciBpbnRlcnJ1cHRlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICB3aGlsZSAoaW50ZXJydXB0ZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGludGVycnVwdGVkV29yay5hbHRlcm5hdGU7XG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGludGVycnVwdGVkV29yayA9IGludGVycnVwdGVkV29yay5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgdmFyIHJvb3RXb3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJvb3QuY3VycmVudCwgbnVsbCk7XG4gIHdvcmtJblByb2dyZXNzID0gcm9vdFdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBsYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7XG4gIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKTtcblxuICB7XG4gICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncygpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3RXb3JrSW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgZG8ge1xuICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IG1vZHVsZS1sZXZlbCBzdGF0ZSB0aGF0IHdhcyBzZXQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpOyAvLyBUT0RPOiBJIGZvdW5kIGFuZCBhZGRlZCB0aGlzIG1pc3NpbmcgbGluZSB3aGlsZSBpbnZlc3RpZ2F0aW5nIGFcbiAgICAgIC8vIHNlcGFyYXRlIGlzc3VlLiBXcml0ZSBhIHJlZ3Jlc3Npb24gdGVzdCB1c2luZyBzdHJpbmcgcmVmcy5cblxuICAgICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKGVycm9yZWRXb3JrID09PSBudWxsIHx8IGVycm9yZWRXb3JrLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFeHBlY3RlZCB0byBiZSB3b3JraW5nIG9uIGEgbm9uLXJvb3QgZmliZXIuIFRoaXMgaXMgYSBmYXRhbCBlcnJvclxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlJ3Mgbm8gYW5jZXN0b3IgdGhhdCBjYW4gaGFuZGxlIGl0OyB0aGUgcm9vdCBpc1xuICAgICAgICAvLyBzdXBwb3NlZCB0byBjYXB0dXJlIGFsbCBlcnJvcnMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBhbiBlcnJvclxuICAgICAgICAvLyBib3VuZGFyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSB0aHJvd25WYWx1ZTsgLy8gU2V0IGB3b3JrSW5Qcm9ncmVzc2AgdG8gbnVsbC4gVGhpcyByZXByZXNlbnRzIGFkdmFuY2luZyB0byB0aGUgbmV4dFxuICAgICAgICAvLyBzaWJsaW5nLCBvciB0aGUgcGFyZW50IGlmIHRoZXJlIGFyZSBubyBzaWJsaW5ncy4gQnV0IHNpbmNlIHRoZSByb290XG4gICAgICAgIC8vIGhhcyBubyBzaWJsaW5ncyBub3IgYSBwYXJlbnQsIHdlIHNldCBpdCB0byBudWxsLiBVc3VhbGx5IHRoaXMgaXNcbiAgICAgICAgLy8gaGFuZGxlZCBieSBgY29tcGxldGVVbml0T2ZXb3JrYCBvciBgdW53aW5kV29ya2AsIGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IG5vdCBjYWxsaW5nIHRob3NlLCB3ZSBuZWVkIHNldCBpdCBoZXJlLlxuICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjYWxsaW5nIGB1bndpbmRXb3JrYCB0byBwb3AgdGhlIGNvbnRleHRzLlxuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lIHNwZW50IHJlbmRlcmluZyBiZWZvcmUgYW4gZXJyb3Igd2FzIHRocm93bi4gVGhpc1xuICAgICAgICAvLyBhdm9pZHMgaW5hY2N1cmF0ZSBQcm9maWxlciBkdXJhdGlvbnMgaW4gdGhlIGNhc2Ugb2YgYVxuICAgICAgICAvLyBzdXNwZW5kZWQgcmVuZGVyLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGVycm9yZWRXb3JrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlcikge1xuICAgICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuXG4gICAgICAgIGlmICh0aHJvd25WYWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhyb3duVmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0aHJvd25WYWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIHdha2VhYmxlID0gdGhyb3duVmFsdWU7XG4gICAgICAgICAgbWFya0NvbXBvbmVudFN1c3BlbmRlZChlcnJvcmVkV29yaywgd2FrZWFibGUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50RXJyb3JlZChlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvd0V4Y2VwdGlvbihyb290LCBlcnJvcmVkV29yay5yZXR1cm4sIGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgY29tcGxldGVVbml0T2ZXb3JrKGVycm9yZWRXb3JrKTtcbiAgICB9IGNhdGNoICh5ZXRBbm90aGVyVGhyb3duVmFsdWUpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBpbiB0aGUgcmV0dXJuIHBhdGggYWxzbyB0aHJldy5cbiAgICAgIHRocm93blZhbHVlID0geWV0QW5vdGhlclRocm93blZhbHVlO1xuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IGVycm9yZWRXb3JrICYmIGVycm9yZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHRoaXMgYm91bmRhcnkgaGFzIGFscmVhZHkgZXJyb3JlZCwgdGhlbiB3ZSBoYWQgdHJvdWJsZSBwcm9jZXNzaW5nXG4gICAgICAgIC8vIHRoZSBlcnJvci4gQnViYmxlIGl0IHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICAgICAgICBlcnJvcmVkV29yayA9IGVycm9yZWRXb3JrLnJldHVybjtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBlcnJvcmVkV29yaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gUmV0dXJuIHRvIHRoZSBub3JtYWwgd29yayBsb29wLlxuXG5cbiAgICByZXR1cm47XG4gIH0gd2hpbGUgKHRydWUpO1xufVxuXG5mdW5jdGlvbiBwdXNoRGlzcGF0Y2hlcigpIHtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQ7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChwcmV2RGlzcGF0Y2hlciA9PT0gbnVsbCkge1xuICAgIC8vIFRoZSBSZWFjdCBpc29tb3JwaGljIHBhY2thZ2UgZG9lcyBub3QgaW5jbHVkZSBhIGRlZmF1bHQgZGlzcGF0Y2hlci5cbiAgICAvLyBJbnN0ZWFkIHRoZSBmaXJzdCByZW5kZXJlciB3aWxsIGxhemlseSBhdHRhY2ggb25lLCBpbiBvcmRlciB0byBnaXZlXG4gICAgLy8gbmljZXIgZXJyb3IgbWVzc2FnZXMuXG4gICAgcmV0dXJuIENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcHJldkRpc3BhdGNoZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcikge1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKSB7XG4gIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSBub3coKTtcbn1cbmZ1bmN0aW9uIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobGFuZSkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBtZXJnZUxhbmVzKGxhbmUsIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyk7XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdFN1c3BlbmRlZDtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWQgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheTtcbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgdXBkYXRlcyB0aGF0IHdlIHNraXBwZWQgdHJlZSB0aGF0IG1pZ2h0IGhhdmUgdW5ibG9ja2VkXG4gIC8vIHRoaXMgcmVuZGVyLlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gbnVsbCAmJiAoaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpIHx8IGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMpKSkge1xuICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgcmVuZGVyIGFzIHN1c3BlbmRlZCBzbyB0aGF0IHdlIHN3aXRjaCB0byB3b3JraW5nIG9uXG4gICAgLy8gdGhlIHVwZGF0ZXMgdGhhdCB3ZXJlIHNraXBwZWQuIFVzdWFsbHkgd2Ugb25seSBzdXNwZW5kIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgbWFyayB0aGUgcm9vdCBhcyBzdXNwZW5kZWQgaW1tZWRpYXRlbHlcbiAgICAvLyAoaW5zaWRlIHRoaXMgZnVuY3Rpb24pLCBzaW5jZSBieSBzdXNwZW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHJlbmRlclxuICAgIC8vIHBoYXNlIGludHJvZHVjZXMgYSBwb3RlbnRpYWwgbWlzdGFrZSB3aGVyZSB3ZSBzdXNwZW5kIGxhbmVzIHRoYXQgd2VyZVxuICAgIC8vIHBpbmdlZCBvciB1cGRhdGVkIHdoaWxlIHdlIHdlcmUgcmVuZGVyaW5nLlxuICAgIG1hcmtSb290U3VzcGVuZGVkJDEod29ya0luUHJvZ3Jlc3NSb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKGVycm9yKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzICE9PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RFcnJvcmVkO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG59IC8vIENhbGxlZCBkdXJpbmcgcmVuZGVyIHRvIGRldGVybWluZSBpZiBhbnl0aGluZyBoYXMgc3VzcGVuZGVkLlxuLy8gUmV0dXJucyBmYWxzZSBpZiB3ZSdyZSBub3Qgc3VyZS5cblxuZnVuY3Rpb24gcmVuZGVySGFzTm90U3VzcGVuZGVkWWV0KCkge1xuICAvLyBJZiBzb21ldGhpbmcgZXJyb3JlZCBvciBjb21wbGV0ZWQsIHdlIGNhbid0IHJlYWxseSBiZSBzdXJlLFxuICAvLyBzbyB0aG9zZSBhcmUgZmFsc2UuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BTeW5jKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyBhIHN5bmMgcmVuZGVyLCBzbyB3ZSBzaG91bGQgaGF2ZSBmaW5pc2hlZCB0aGUgd2hvbGUgdHJlZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb21taXQgYW4gaW5jb21wbGV0ZSByb290LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSAnICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbn0gLy8gVGhlIHdvcmsgbG9vcCBpcyBhbiBleHRyZW1lbHkgaG90IHBhdGguIFRlbGwgQ2xvc3VyZSBub3QgdG8gaW5saW5lIGl0LlxuXG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BTeW5jKCkge1xuICAvLyBBbHJlYWR5IHRpbWVkIG91dCwgc28gcGVyZm9ybSB3b3JrIHdpdGhvdXQgY2hlY2tpbmcgaWYgd2UgbmVlZCB0byB5aWVsZC5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcENvbmN1cnJlbnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFN0aWxsIHdvcmsgcmVtYWluaW5nLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJZaWVsZGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJvb3RJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIC8vIENvbXBsZXRlZCB0aGUgdHJlZS5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFJldHVybiB0aGUgZmluYWwgZXhpdCBzdGF0dXMuXG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbiAgfVxufVxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wQ29uY3VycmVudCgpIHtcbiAgLy8gUGVyZm9ybSB3b3JrIHVudGlsIFNjaGVkdWxlciBhc2tzIHVzIHRvIHlpZWxkXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCAmJiAhc2hvdWxkWWllbGQoKSkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwZXJmb3JtVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgLy8gbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluIHByb2dyZXNzLlxuICB2YXIgY3VycmVudCA9IHVuaXRPZldvcmsuYWx0ZXJuYXRlO1xuICBzZXRDdXJyZW50RmliZXIodW5pdE9mV29yayk7XG4gIHZhciBuZXh0O1xuXG4gIGlmICggKHVuaXRPZldvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgc3RhcnRQcm9maWxlclRpbWVyKHVuaXRPZldvcmspO1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEodW5pdE9mV29yaywgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB1bml0T2ZXb3JrLm1lbW9pemVkUHJvcHMgPSB1bml0T2ZXb3JrLnBlbmRpbmdQcm9wcztcblxuICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgIC8vIElmIHRoaXMgZG9lc24ndCBzcGF3biBuZXcgd29yaywgY29tcGxldGUgdGhlIGN1cnJlbnQgd29yay5cbiAgICBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yayk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICB9XG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gQXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCB1bml0IG9mIHdvcmssIHRoZW4gbW92ZSB0byB0aGUgbmV4dFxuICAvLyBzaWJsaW5nLiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzaWJsaW5ncywgcmV0dXJuIHRvIHRoZSBwYXJlbnQgZmliZXIuXG4gIHZhciBjb21wbGV0ZWRXb3JrID0gdW5pdE9mV29yaztcblxuICBkbyB7XG4gICAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAgIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gICAgLy8gbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluIHByb2dyZXNzLlxuICAgIHZhciBjdXJyZW50ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGU7XG4gICAgdmFyIHJldHVybkZpYmVyID0gY29tcGxldGVkV29yay5yZXR1cm47IC8vIENoZWNrIGlmIHRoZSB3b3JrIGNvbXBsZXRlZCBvciBpZiBzb21ldGhpbmcgdGhyZXcuXG5cbiAgICBpZiAoKGNvbXBsZXRlZFdvcmsuZmxhZ3MgJiBJbmNvbXBsZXRlKSA9PT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgdmFyIG5leHQgPSB2b2lkIDA7XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpOyAvLyBVcGRhdGUgcmVuZGVyIGR1cmF0aW9uIGFzc3VtaW5nIHdlIGRpZG4ndCBlcnJvci5cblxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcblxuICAgICAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ29tcGxldGluZyB0aGlzIGZpYmVyIHNwYXduZWQgbmV3IHdvcmsuIFdvcmsgb24gdGhhdCBuZXh0LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBmaWJlciBkaWQgbm90IGNvbXBsZXRlIGJlY2F1c2Ugc29tZXRoaW5nIHRocmV3LiBQb3AgdmFsdWVzIG9mZlxuICAgICAgLy8gdGhlIHN0YWNrIHdpdGhvdXQgZW50ZXJpbmcgdGhlIGNvbXBsZXRlIHBoYXNlLiBJZiB0aGlzIGlzIGEgYm91bmRhcnksXG4gICAgICAvLyBjYXB0dXJlIHZhbHVlcyBpZiBwb3NzaWJsZS5cbiAgICAgIHZhciBfbmV4dCA9IHVud2luZFdvcmsoY3VycmVudCwgY29tcGxldGVkV29yayk7IC8vIEJlY2F1c2UgdGhpcyBmaWJlciBkaWQgbm90IGNvbXBsZXRlLCBkb24ndCByZXNldCBpdHMgbGFuZXMuXG5cblxuICAgICAgaWYgKF9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4gV2UnbGwgY29tZVxuICAgICAgICAvLyBiYWNrIGhlcmUgYWdhaW4uXG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJlc3RhcnRpbmcsIHJlbW92ZSBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGhvc3QgZWZmZWN0XG4gICAgICAgIC8vIGZyb20gdGhlIGVmZmVjdCB0YWcuXG4gICAgICAgIF9uZXh0LmZsYWdzICY9IEhvc3RFZmZlY3RNYXNrO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IF9uZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGZvciB0aGUgZmliZXIgdGhhdCBlcnJvcmVkLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTsgLy8gSW5jbHVkZSB0aGUgdGltZSBzcGVudCB3b3JraW5nIG9uIGZhaWxlZCBjaGlsZHJlbiBiZWZvcmUgY29udGludWluZy5cblxuICAgICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIHBhcmVudCBmaWJlciBhcyBpbmNvbXBsZXRlIGFuZCBjbGVhciBpdHMgc3VidHJlZSBmbGFncy5cbiAgICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gSW5jb21wbGV0ZTtcbiAgICAgICAgcmV0dXJuRmliZXIuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlJ3ZlIHVud291bmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RGlkTm90Q29tcGxldGU7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzaWJsaW5nRmliZXIgPSBjb21wbGV0ZWRXb3JrLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZ0ZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHdvcmsgdG8gZG8gaW4gdGhpcyByZXR1cm5GaWJlciwgZG8gdGhhdCBuZXh0LlxuICAgICAgd29ya0luUHJvZ3Jlc3MgPSBzaWJsaW5nRmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBPdGhlcndpc2UsIHJldHVybiB0byB0aGUgcGFyZW50XG5cblxuICAgIGNvbXBsZXRlZFdvcmsgPSByZXR1cm5GaWJlcjsgLy8gVXBkYXRlIHRoZSBuZXh0IHRoaW5nIHdlJ3JlIHdvcmtpbmcgb24gaW4gY2FzZSBzb21ldGhpbmcgdGhyb3dzLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjb21wbGV0ZWRXb3JrO1xuICB9IHdoaWxlIChjb21wbGV0ZWRXb3JrICE9PSBudWxsKTsgLy8gV2UndmUgcmVhY2hlZCB0aGUgcm9vdC5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290Q29tcGxldGVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJvb3Qocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zKSB7XG4gIC8vIFRPRE86IFRoaXMgbm8gbG9uZ2VyIG1ha2VzIGFueSBzZW5zZS4gV2UgYWxyZWFkeSB3cmFwIHRoZSBtdXRhdGlvbiBhbmRcbiAgLy8gbGF5b3V0IHBoYXNlcy4gU2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlLlxuICB2YXIgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICBkbyB7XG4gICAgLy8gYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIHdpbGwgY2FsbCBgZmx1c2hTeW5jVXBkYXRlUXVldWVgIGF0IHRoZSBlbmQsIHdoaWNoXG4gICAgLy8gbWVhbnMgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIHdpbGwgc29tZXRpbWVzIHJlc3VsdCBpbiBhZGRpdGlvbmFsXG4gICAgLy8gcGFzc2l2ZSBlZmZlY3RzLiBTbyB3ZSBuZWVkIHRvIGtlZXAgZmx1c2hpbmcgaW4gYSBsb29wIHVudGlsIHRoZXJlIGFyZVxuICAgIC8vIG5vIG1vcmUgcGVuZGluZyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1pZ2h0IGJlIGJldHRlciBpZiBgZmx1c2hQYXNzaXZlRWZmZWN0c2AgZGlkIG5vdCBhdXRvbWF0aWNhbGx5XG4gICAgLy8gZmx1c2ggc3luY2hyb25vdXMgd29yayBhdCB0aGUgZW5kLCB0byBhdm9pZCBmYWN0b3JpbmcgaGF6YXJkcyBsaWtlIHRoaXMuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IHdoaWxlIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCk7XG5cbiAgZmx1c2hSZW5kZXJQaGFzZVN0cmljdE1vZGVXYXJuaW5nc0luREVWKCk7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH1cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gIHZhciBsYW5lcyA9IHJvb3QuZmluaXNoZWRMYW5lcztcblxuICB7XG4gICAgbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gbnVsbCkge1xuXG4gICAge1xuICAgICAgbWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBpZiAobGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAgICAgZXJyb3IoJ3Jvb3QuZmluaXNoZWRMYW5lcyBzaG91bGQgbm90IGJlIGVtcHR5IGR1cmluZyBhIGNvbW1pdC4gVGhpcyBpcyBhICcgKyAnYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcblxuICBpZiAoZmluaXNoZWRXb3JrID09PSByb290LmN1cnJlbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb21taXQgdGhlIHNhbWUgdHJlZSBhcyBiZWZvcmUuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSAnICsgJ2EgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfSAvLyBjb21taXRSb290IG5ldmVyIHJldHVybnMgYSBjb250aW51YXRpb247IGl0IGFsd2F5cyBmaW5pc2hlcyBzeW5jaHJvbm91c2x5LlxuICAvLyBTbyB3ZSBjYW4gY2xlYXIgdGhlc2Ugbm93IHRvIGFsbG93IGEgbmV3IGNhbGxiYWNrIHRvIGJlIHNjaGVkdWxlZC5cblxuXG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lOyAvLyBVcGRhdGUgdGhlIGZpcnN0IGFuZCBsYXN0IHBlbmRpbmcgdGltZXMgb24gdGhpcyByb290LiBUaGUgbmV3IGZpcnN0XG4gIC8vIHBlbmRpbmcgdGltZSBpcyB3aGF0ZXZlciBpcyBsZWZ0IG9uIHRoZSByb290IGZpYmVyLlxuXG4gIHZhciByZW1haW5pbmdMYW5lcyA9IG1lcmdlTGFuZXMoZmluaXNoZWRXb3JrLmxhbmVzLCBmaW5pc2hlZFdvcmsuY2hpbGRMYW5lcyk7XG4gIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBXZSBjYW4gcmVzZXQgdGhlc2Ugbm93IHRoYXQgdGhleSBhcmUgZmluaXNoZWQuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICB9IC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cywgc2NoZWR1bGUgYSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZW0uXG4gIC8vIERvIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUsIHNvIGl0IGlzIHF1ZXVlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0XG4gIC8vIG1pZ2h0IGdldCBzY2hlZHVsZWQgaW4gdGhlIGNvbW1pdCBwaGFzZS4gKFNlZSAjMTY3MTQuKVxuICAvLyBUT0RPOiBEZWxldGUgYWxsIG90aGVyIHBsYWNlcyB0aGF0IHNjaGVkdWxlIHRoZSBwYXNzaXZlIGVmZmVjdCBjYWxsYmFja1xuICAvLyBUaGV5J3JlIHJlZHVuZGFudC5cblxuXG4gIGlmICgoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyB8fCAoZmluaXNoZWRXb3JrLmZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgICAgLy8gdG8gc3RvcmUgaXQgaW4gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyB1bnRpbCB0aGV5IGdldCBwcm9jZXNzZWRcbiAgICAgIC8vIFdlIG5lZWQgdG8gcGFzcyB0aGlzIHRocm91Z2ggYXMgYW4gYXJndW1lbnQgdG8gY29tbWl0Um9vdFxuICAgICAgLy8gYmVjYXVzZSB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zIG1pZ2h0IGhhdmUgY2hhbmdlZCBiZXR3ZWVuXG4gICAgICAvLyB0aGUgcHJldmlvdXMgcmVuZGVyIGFuZCBjb21taXQgaWYgd2UgdGhyb3R0bGUgdGhlIGNvbW1pdFxuICAgICAgLy8gd2l0aCBzZXRUaW1lb3V0XG5cbiAgICAgIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSB0cmFuc2l0aW9ucztcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7IC8vIFRoaXMgcmVuZGVyIHRyaWdnZXJlZCBwYXNzaXZlIGVmZmVjdHM6IHJlbGVhc2UgdGhlIHJvb3QgY2FjaGUgcG9vbFxuICAgICAgICAvLyAqYWZ0ZXIqIHBhc3NpdmUgZWZmZWN0cyBmaXJlIHRvIGF2b2lkIGZyZWVpbmcgYSBjYWNoZSBwb29sIHRoYXQgbWF5XG4gICAgICAgIC8vIGJlIHJlZmVyZW5jZWQgYnkgYSBub2RlIGluIHRoZSB0cmVlIChIb3N0Um9vdCwgQ2FjaGUgYm91bmRhcnkgZXRjKVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZWZmZWN0cyBpbiB0aGUgd2hvbGUgdHJlZS5cbiAgLy8gVE9ETzogVGhpcyBpcyBsZWZ0IG92ZXIgZnJvbSB0aGUgZWZmZWN0IGxpc3QgaW1wbGVtZW50YXRpb24sIHdoZXJlIHdlIGhhZFxuICAvLyB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBgZmlyc3RFZmZlY3RgIHRvIHNhdGlzZnkgRmxvdy4gSSB0aGluayB0aGVcbiAgLy8gb25seSBvdGhlciByZWFzb24gdGhpcyBvcHRpbWl6YXRpb24gZXhpc3RzIGlzIGJlY2F1c2UgaXQgYWZmZWN0cyBwcm9maWxpbmcuXG4gIC8vIFJlY29uc2lkZXIgd2hldGhlciB0aGlzIGlzIG5lY2Vzc2FyeS5cblxuXG4gIHZhciBzdWJ0cmVlSGFzRWZmZWN0cyA9IChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuICB2YXIgcm9vdEhhc0VmZmVjdCA9IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKHN1YnRyZWVIYXNFZmZlY3RzIHx8IHJvb3RIYXNFZmZlY3QpIHtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0OyAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDsgLy8gVGhlIGNvbW1pdCBwaGFzZSBpcyBicm9rZW4gaW50byBzZXZlcmFsIHN1Yi1waGFzZXMuIFdlIGRvIGEgc2VwYXJhdGUgcGFzc1xuICAgIC8vIG9mIHRoZSBlZmZlY3QgbGlzdCBmb3IgZWFjaCBwaGFzZTogYWxsIG11dGF0aW9uIGVmZmVjdHMgY29tZSBiZWZvcmUgYWxsXG4gICAgLy8gbGF5b3V0IGVmZmVjdHMsIGFuZCBzbyBvbi5cbiAgICAvLyBUaGUgZmlyc3QgcGhhc2UgYSBcImJlZm9yZSBtdXRhdGlvblwiIHBoYXNlLiBXZSB1c2UgdGhpcyBwaGFzZSB0byByZWFkIHRoZVxuICAgIC8vIHN0YXRlIG9mIHRoZSBob3N0IHRyZWUgcmlnaHQgYmVmb3JlIHdlIG11dGF0ZSBpdC4gVGhpcyBpcyB3aGVyZVxuICAgIC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGlzIGNhbGxlZC5cblxuICAgIHZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcblxuICAgIHtcbiAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgY29tbWl0IHRpbWUgdG8gYmUgc2hhcmVkIGJ5IGFsbCBQcm9maWxlcnMgaW4gdGhpc1xuICAgICAgLy8gYmF0Y2guIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIGdyb3VwZWQgbGF0ZXIuXG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuXG5cbiAgICBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG5cbiAgICByZXNldEFmdGVyQ29tbWl0KHJvb3QuY29udGFpbmVySW5mbyk7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIHRyZWUgaXMgbm93IHRoZSBjdXJyZW50IHRyZWUuIFRoaXMgbXVzdCBjb21lIGFmdGVyXG4gICAgLy8gdGhlIG11dGF0aW9uIHBoYXNlLCBzbyB0aGF0IHRoZSBwcmV2aW91cyB0cmVlIGlzIHN0aWxsIGN1cnJlbnQgZHVyaW5nXG4gICAgLy8gY29tcG9uZW50V2lsbFVubW91bnQsIGJ1dCBiZWZvcmUgdGhlIGxheW91dCBwaGFzZSwgc28gdGhhdCB0aGUgZmluaXNoZWRcbiAgICAvLyB3b3JrIGlzIGN1cnJlbnQgZHVyaW5nIGNvbXBvbmVudERpZE1vdW50L1VwZGF0ZS5cblxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gVGhlIG5leHQgcGhhc2UgaXMgdGhlIGxheW91dCBwaGFzZSwgd2hlcmUgd2UgY2FsbCBlZmZlY3RzIHRoYXQgcmVhZFxuXG4gICAge1xuICAgICAgbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG5cbiAgICBjb21taXRMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpO1xuXG4gICAge1xuICAgICAgbWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICAgIC8vIG9wcG9ydHVuaXR5IHRvIHBhaW50LlxuXG5cbiAgICByZXF1ZXN0UGFpbnQoKTtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIFJlc2V0IHRoZSBwcmlvcml0eSB0byB0aGUgcHJldmlvdXMgbm9uLXN5bmMgdmFsdWUuXG5cbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gZWZmZWN0cy5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIE1lYXN1cmUgdGhlc2UgYW55d2F5IHNvIHRoZSBmbGFtZWdyYXBoIGV4cGxpY2l0bHkgc2hvd3MgdGhhdCB0aGVyZSB3ZXJlXG4gICAgLy8gbm8gZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byByZXBvcnQgdGhpcy5cblxuICAgIHtcbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cyA9IHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzO1xuXG4gIGlmIChyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgIC8vIFRoaXMgY29tbWl0IGhhcyBwYXNzaXZlIGVmZmVjdHMuIFN0YXNoIGEgcmVmZXJlbmNlIHRvIHRoZW0uIEJ1dCBkb24ndFxuICAgIC8vIHNjaGVkdWxlIGEgY2FsbGJhY2sgdW50aWwgYWZ0ZXIgZmx1c2hpbmcgbGF5b3V0IHdvcmsuXG4gICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IHJvb3Q7XG4gICAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBsYW5lcztcbiAgfSBlbHNlIHtcblxuICAgIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbiAgICB9XG4gIH0gLy8gUmVhZCB0aGlzIGFnYWluLCBzaW5jZSBhbiBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzOyAvLyBDaGVjayBpZiB0aGVyZSdzIHJlbWFpbmluZyB3b3JrIG9uIHRoaXMgcm9vdFxuICAvLyBUT0RPOiBUaGlzIGlzIHBhcnQgb2YgdGhlIGBjb21wb25lbnREaWRDYXRjaGAgaW1wbGVtZW50YXRpb24uIEl0cyBwdXJwb3NlXG4gIC8vIGlzIHRvIGRldGVjdCB3aGV0aGVyIHNvbWV0aGluZyBtaWdodCBoYXZlIGNhbGxlZCBzZXRTdGF0ZSBpbnNpZGVcbiAgLy8gYGNvbXBvbmVudERpZENhdGNoYC4gVGhlIG1lY2hhbmlzbSBpcyBrbm93biB0byBiZSBmbGF3ZWQgYmVjYXVzZSBgc2V0U3RhdGVgXG4gIC8vIGluc2lkZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGlzIGl0c2VsZiBmbGF3ZWQgXHUyMDE0IHRoYXQncyB3aHkgd2UgcmVjb21tZW5kXG4gIC8vIGBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3JgIGluc3RlYWQuIEhvd2V2ZXIsIGl0IGNvdWxkIGJlIGltcHJvdmVkIGJ5XG4gIC8vIGNoZWNraW5nIGlmIHJlbWFpbmluZ0xhbmVzIGluY2x1ZGVzIFN5bmMgd29yaywgaW5zdGVhZCBvZiB3aGV0aGVyIHRoZXJlJ3NcbiAgLy8gYW55IHdvcmsgcmVtYWluaW5nIGF0IGFsbCAod2hpY2ggd291bGQgYWxzbyBpbmNsdWRlIHN0dWZmIGxpa2UgU3VzcGVuc2VcbiAgLy8gcmV0cmllcyBvciB0cmFuc2l0aW9ucykuIEl0J3MgYmVlbiBsaWtlIHRoaXMgZm9yIGEgd2hpbGUsIHRob3VnaCwgc28gZml4aW5nXG4gIC8vIGl0IHByb2JhYmx5IGlzbid0IHRoYXQgdXJnZW50LlxuXG4gIGlmIChyZW1haW5pbmdMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmssIHdlIGNhbiBjbGVhciB0aGUgc2V0IG9mIGFscmVhZHkgZmFpbGVkXG4gICAgLy8gZXJyb3IgYm91bmRhcmllcy5cbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKCFyb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgb25Db21taXRSb290KGZpbmlzaGVkV29yay5zdGF0ZU5vZGUsIHJlbmRlclByaW9yaXR5TGV2ZWwpO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHJvb3QubWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBvbkNvbW1pdFJvb3QkMSgpO1xuICB9IC8vIEFsd2F5cyBjYWxsIHRoaXMgYmVmb3JlIGV4aXRpbmcgYGNvbW1pdFJvb3RgLCB0byBlbnN1cmUgdGhhdCBhbnlcbiAgLy8gYWRkaXRpb25hbCB3b3JrIG9uIHRoaXMgcm9vdCBpcyBzY2hlZHVsZWQuXG5cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9ycyAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlIHdlcmUgZXJyb3JzIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHJlY292ZXJlZCBmcm9tIHRoZW0gd2l0aG91dFxuICAgIC8vIG5lZWRpbmcgdG8gc3VyZmFjZSBpdCB0byB0aGUgVUkuIFdlIGxvZyB0aGVtIGhlcmUuXG4gICAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IHJvb3Qub25SZWNvdmVyYWJsZUVycm9yO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvdmVyYWJsZUVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJlY292ZXJhYmxlRXJyb3IgPSByZWNvdmVyYWJsZUVycm9yc1tpXTtcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHJlY292ZXJhYmxlRXJyb3Iuc3RhY2s7XG4gICAgICB2YXIgZGlnZXN0ID0gcmVjb3ZlcmFibGVFcnJvci5kaWdlc3Q7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcmFibGVFcnJvci52YWx1ZSwge1xuICAgICAgICBjb21wb25lbnRTdGFjazogY29tcG9uZW50U3RhY2ssXG4gICAgICAgIGRpZ2VzdDogZGlnZXN0XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSBmYWxzZTtcbiAgICB2YXIgZXJyb3IkMSA9IGZpcnN0VW5jYXVnaHRFcnJvcjtcbiAgICBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yJDE7XG4gIH0gLy8gSWYgdGhlIHBhc3NpdmUgZWZmZWN0cyBhcmUgdGhlIHJlc3VsdCBvZiBhIGRpc2NyZXRlIHJlbmRlciwgZmx1c2ggdGhlbVxuICAvLyBzeW5jaHJvbm91c2x5IGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdGFzayBzbyB0aGF0IHRoZSByZXN1bHQgaXNcbiAgLy8gaW1tZWRpYXRlbHkgb2JzZXJ2YWJsZS4gT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgdGhhdCB0aGV5IGFyZSBub3RcbiAgLy8gb3JkZXItZGVwZW5kZW50IGFuZCBkbyBub3QgbmVlZCB0byBiZSBvYnNlcnZlZCBieSBleHRlcm5hbCBzeXN0ZW1zLCBzbyB3ZVxuICAvLyBjYW4gd2FpdCB1bnRpbCBhZnRlciBwYWludC5cbiAgLy8gVE9ETzogV2UgY2FuIG9wdGltaXplIHRoaXMgYnkgbm90IHNjaGVkdWxpbmcgdGhlIGNhbGxiYWNrIGVhcmxpZXIuIFNpbmNlIHdlXG4gIC8vIGN1cnJlbnRseSBzY2hlZHVsZSB0aGUgY2FsbGJhY2sgaW4gbXVsdGlwbGUgcGxhY2VzLCB3aWxsIHdhaXQgdW50aWwgdGhvc2VcbiAgLy8gYXJlIGNvbnNvbGlkYXRlZC5cblxuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzLCBTeW5jTGFuZSkgJiYgcm9vdC50YWcgIT09IExlZ2FjeVJvb3QpIHtcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gLy8gUmVhZCB0aGlzIGFnYWluLCBzaW5jZSBhIHBhc3NpdmUgZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW1haW5pbmdMYW5lcywgU3luY0xhbmUpKSB7XG4gICAge1xuICAgICAgbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpO1xuICAgIH0gLy8gQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcm9vdCBzeW5jaHJvbm91c2x5IHJlLXJlbmRlcnMgd2l0aG91dFxuICAgIC8vIGZpbmlzaGluZy4gSWYgdGhlcmUgYXJlIHRvbyBtYW55LCBpdCBpbmRpY2F0ZXMgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AuXG5cblxuICAgIGlmIChyb290ID09PSByb290V2l0aE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIG5lc3RlZFVwZGF0ZUNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgfSAvLyBJZiBsYXlvdXQgd29yayB3YXMgc2NoZWR1bGVkLCBmbHVzaCBpdCBub3cuXG5cblxuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgbWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzKCkge1xuICAvLyBSZXR1cm5zIHdoZXRoZXIgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgZmx1c2hlZC5cbiAgLy8gVE9ETzogQ29tYmluZSB0aGlzIGNoZWNrIHdpdGggdGhlIG9uZSBpbiBmbHVzaFBhc3NpdmVFRmZlY3RzSW1wbC4gV2Ugc2hvdWxkXG4gIC8vIHByb2JhYmx5IGp1c3QgY29tYmluZSB0aGUgdHdvIGZ1bmN0aW9ucy4gSSBiZWxpZXZlIHRoZXkgd2VyZSBvbmx5IHNlcGFyYXRlXG4gIC8vIGluIHRoZSBmaXJzdCBwbGFjZSBiZWNhdXNlIHdlIHVzZWQgdG8gd3JhcCBpdCB3aXRoXG4gIC8vIGBTY2hlZHVsZXIucnVuV2l0aFByaW9yaXR5YCwgd2hpY2ggYWNjZXB0cyBhIGZ1bmN0aW9uLiBCdXQgbm93IHdlIHRyYWNrIHRoZVxuICAvLyBwcmlvcml0eSB3aXRoaW4gUmVhY3QgaXRzZWxmLCBzbyB3ZSBjYW4gbXV0YXRlIHRoZSB2YXJpYWJsZSBkaXJlY3RseS5cbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKSB7XG4gICAgdmFyIHJlbmRlclByaW9yaXR5ID0gbGFuZXNUb0V2ZW50UHJpb3JpdHkocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMpO1xuICAgIHZhciBwcmlvcml0eSA9IGxvd2VyRXZlbnRQcmlvcml0eShEZWZhdWx0RXZlbnRQcmlvcml0eSwgcmVuZGVyUHJpb3JpdHkpO1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJpb3JpdHkpO1xuICAgICAgcmV0dXJuIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOyAvLyBPbmNlIHBhc3NpdmUgZWZmZWN0cyBoYXZlIHJ1biBmb3IgdGhlIHRyZWUgLSBnaXZpbmcgY29tcG9uZW50cyBhXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3QoZmliZXIpIHtcbiAge1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzLnB1c2goZmliZXIpO1xuXG4gICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKSB7XG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBDYWNoZSBhbmQgY2xlYXIgdGhlIHRyYW5zaXRpb25zIGZsYWdcblxuXG4gIHZhciB0cmFuc2l0aW9ucyA9IHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnM7XG4gIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsO1xuICB2YXIgcm9vdCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzO1xuICB2YXIgbGFuZXMgPSBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcztcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsOyAvLyBUT0RPOiBUaGlzIGlzIHNvbWV0aW1lcyBvdXQgb2Ygc3luYyB3aXRoIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzLlxuICAvLyBGaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBJdCdzIG5vdCBjYXVzaW5nIGFueSBrbm93biBpc3N1ZXMgKHByb2JhYmx5XG4gIC8vIGJlY2F1c2UgaXQncyBvbmx5IHVzZWQgZm9yIHByb2ZpbGluZyksIGJ1dCBpdCdzIGEgcmVmYWN0b3IgaGF6YXJkLlxuXG4gIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIHdoaWxlIGFscmVhZHkgcmVuZGVyaW5nLicpO1xuICB9XG5cbiAge1xuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0O1xuICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMocm9vdC5jdXJyZW50KTtcbiAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCByb290LmN1cnJlbnQsIGxhbmVzLCB0cmFuc2l0aW9ucyk7IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG4gIHtcbiAgICB2YXIgcHJvZmlsZXJFZmZlY3RzID0gcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHM7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvZmlsZXJFZmZlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX2ZpYmVyID0gcHJvZmlsZXJFZmZlY3RzW2ldO1xuICAgICAgY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhyb290LCBfZmliZXIpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gIH1cblxuICB7XG4gICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgdHJ1ZSk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICAvLyBJZiBhZGRpdGlvbmFsIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIHNjaGVkdWxlZCwgaW5jcmVtZW50IGEgY291bnRlci4gSWYgdGhpc1xuICAgIC8vIGV4Y2VlZHMgdGhlIGxpbWl0LCB3ZSdsbCBmaXJlIGEgd2FybmluZy5cbiAgICBpZiAoZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICB9XG5cbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH0gLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cblxuICBvblBvc3RDb21taXRSb290KHJvb3QpO1xuXG4gIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gcm9vdC5jdXJyZW50LnN0YXRlTm9kZTtcbiAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkICE9PSBudWxsICYmIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmhhcyhpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBtYXJrTGVnYWN5RXJyb3JCb3VuZGFyeUFzRmFpbGVkKGluc3RhbmNlKSB7XG4gIGlmIChsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9PT0gbnVsbCkge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbmV3IFNldChbaW5zdGFuY2VdKTtcbiAgfSBlbHNlIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5hZGQoaW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcihlcnJvcikge1xuICBpZiAoIWhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gdHJ1ZTtcbiAgICBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgfVxufVxuXG52YXIgb25VbmNhdWdodEVycm9yID0gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yO1xuXG5mdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChyb290RmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290RmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUocm9vdEZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihzb3VyY2VGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IkMSkge1xuICB7XG4gICAgcmVwb3J0VW5jYXVnaHRFcnJvckluREVWKGVycm9yJDEpO1xuICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gIH1cblxuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qoc291cmNlRmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvciQxKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZmliZXIgPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlciA9IG5lYXJlc3RNb3VudGVkQW5jZXN0b3I7XG4gIH1cblxuICB3aGlsZSAoZmliZXIgIT09IG51bGwpIHtcbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3QoZmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvciQxKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBjdG9yID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciQxLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcblxuICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IGZpYmVyLnJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBUT0RPOiBVbnRpbCB3ZSByZS1sYW5kIHNraXBVbm1vdW50ZWRCb3VuZGFyaWVzIChzZWUgIzIwMTQ3KSwgdGhpcyB3YXJuaW5nXG4gICAgLy8gd2lsbCBmaXJlIGZvciBlcnJvcnMgdGhhdCBhcmUgdGhyb3duIGJ5IGRlc3Ryb3kgZnVuY3Rpb25zIGluc2lkZSBkZWxldGVkXG4gICAgLy8gdHJlZXMuIFdoYXQgaXQgc2hvdWxkIGluc3RlYWQgZG8gaXMgcHJvcGFnYXRlIHRoZSBlcnJvciB0byB0aGUgcGFyZW50IG9mXG4gICAgLy8gdGhlIGRlbGV0ZWQgdHJlZS4gSW4gdGhlIG1lYW50aW1lLCBkbyBub3QgYWRkIHRoaXMgd2FybmluZyB0byB0aGVcbiAgICAvLyBhbGxvd2xpc3Q7IHRoaXMgaXMgb25seSBmb3Igb3VyIGludGVybmFsIHVzZS5cbiAgICBlcnJvcignSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEF0dGVtcHRlZCB0byBjYXB0dXJlIGEgY29tbWl0IHBoYXNlIGVycm9yICcgKyAnaW5zaWRlIGEgZGV0YWNoZWQgdHJlZS4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4gUmVhY3QuIExpa2VseSAnICsgJ2NhdXNlcyBpbmNsdWRlIGRlbGV0aW5nIHRoZSBzYW1lIGZpYmVyIG1vcmUgdGhhbiBvbmNlLCBjb21taXR0aW5nIGFuICcgKyAnYWxyZWFkeS1maW5pc2hlZCB0cmVlLCBvciBhbiBpbmNvbnNpc3RlbnQgcmV0dXJuIHBvaW50ZXIuXFxuXFxuJyArICdFcnJvciBtZXNzYWdlOlxcblxcbiVzJywgZXJyb3IkMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBpbmdTdXNwZW5kZWRSb290KHJvb3QsIHdha2VhYmxlLCBwaW5nZWRMYW5lcykge1xuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG5cbiAgaWYgKHBpbmdDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHBpbmdDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMpO1xuICB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ID09PSByb290ICYmIGlzU3Vic2V0T2ZMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcywgcGluZ2VkTGFuZXMpKSB7XG4gICAgLy8gUmVjZWl2ZWQgYSBwaW5nIGF0IHRoZSBzYW1lIHByaW9yaXR5IGxldmVsIGF0IHdoaWNoIHdlJ3JlIGN1cnJlbnRseVxuICAgIC8vIHJlbmRlcmluZy4gV2UgbWlnaHQgd2FudCB0byByZXN0YXJ0IHRoaXMgcmVuZGVyLiBUaGlzIHNob3VsZCBtaXJyb3JcbiAgICAvLyB0aGUgbG9naWMgb2Ygd2hldGhlciBvciBub3QgYSByb290IHN1c3BlbmRzIG9uY2UgaXQgY29tcGxldGVzLlxuICAgIC8vIFRPRE86IElmIHdlJ3JlIHJlbmRlcmluZyBzeW5jIGVpdGhlciBkdWUgdG8gU3luYywgQmF0Y2hlZCBvciBleHBpcmVkLFxuICAgIC8vIHdlIHNob3VsZCBwcm9iYWJseSBuZXZlciByZXN0YXJ0LlxuICAgIC8vIElmIHdlJ3JlIHN1c3BlbmRlZCB3aXRoIGRlbGF5LCBvciBpZiBpdCdzIGEgcmV0cnksIHdlJ2xsIGFsd2F5cyBzdXNwZW5kXG4gICAgLy8gc28gd2UgY2FuIGFsd2F5cyByZXN0YXJ0LlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5IHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWQgJiYgaW5jbHVkZXNPbmx5UmV0cmllcyh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcykgJiYgbm93KCkgLSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lIDwgRkFMTEJBQ0tfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFJlc3RhcnQgZnJvbSB0aGUgcm9vdC5cbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVuIHRob3VnaCB3ZSBjYW4ndCByZXN0YXJ0IHJpZ2h0IG5vdywgd2UgbWlnaHQgZ2V0IGFuXG4gICAgICAvLyBvcHBvcnR1bml0eSBsYXRlci4gU28gd2UgbWFyayB0aGlzIHJlbmRlciBhcyBoYXZpbmcgYSBwaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzLCBwaW5nZWRMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG59XG5cbmZ1bmN0aW9uIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpIHtcbiAgLy8gVGhlIGJvdW5kYXJ5IGZpYmVyIChhIFN1c3BlbnNlIGNvbXBvbmVudCBvciBTdXNwZW5zZUxpc3QgY29tcG9uZW50KVxuICAvLyBwcmV2aW91c2x5IHdhcyByZW5kZXJlZCBpbiBpdHMgZmFsbGJhY2sgc3RhdGUuIE9uZSBvZiB0aGUgcHJvbWlzZXMgdGhhdFxuICAvLyBzdXNwZW5kZWQgaXQgaGFzIHJlc29sdmVkLCB3aGljaCBtZWFucyBhdCBsZWFzdCBwYXJ0IG9mIHRoZSB0cmVlIHdhc1xuICAvLyBsaWtlbHkgdW5ibG9ja2VkLiBUcnkgcmVuZGVyaW5nIGFnYWluLCBhdCBhIG5ldyBsYW5lcy5cbiAgaWYgKHJldHJ5TGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgLy8gVE9ETzogQXNzaWduIHRoaXMgdG8gYHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lYD8gdG8gYXZvaWRcbiAgICAvLyB1bm5lY2Vzc2FyeSBlbnRhbmdsZW1lbnQ/XG4gICAgcmV0cnlMYW5lID0gcmVxdWVzdFJldHJ5TGFuZShib3VuZGFyeUZpYmVyKTtcbiAgfSAvLyBUT0RPOiBTcGVjaWFsIGNhc2UgaWRsZSBwcmlvcml0eT9cblxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgcmV0cnlMYW5lLCBldmVudFRpbWUpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoYm91bmRhcnlGaWJlcikge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICB9XG5cbiAgcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlUmV0cnlXYWtlYWJsZShib3VuZGFyeUZpYmVyLCB3YWtlYWJsZSkge1xuICB2YXIgcmV0cnlMYW5lID0gTm9MYW5lOyAvLyBEZWZhdWx0XG5cbiAgdmFyIHJldHJ5Q2FjaGU7XG5cbiAgc3dpdGNoIChib3VuZGFyeUZpYmVyLnRhZykge1xuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgcmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BpbmdlZCB1bmtub3duIHN1c3BlbnNlIGJvdW5kYXJ5IHR5cGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIGlmIChyZXRyeUNhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcmV0cnlDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG59IC8vIENvbXB1dGVzIHRoZSBuZXh0IEp1c3QgTm90aWNlYWJsZSBEaWZmZXJlbmNlIChKTkQpIGJvdW5kYXJ5LlxuLy8gVGhlIHRoZW9yeSBpcyB0aGF0IGEgcGVyc29uIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLlxuLy8gVGhlcmVmb3JlLCBpZiB3ZSB3YWl0IGEgYml0IGxvbmdlciB0aGFuIG5lY2Vzc2FyeSB0aGF0IHdvbid0IHRyYW5zbGF0ZSB0byBhIG5vdGljZWFibGVcbi8vIGRpZmZlcmVuY2UgaW4gdGhlIGV4cGVyaWVuY2UuIEhvd2V2ZXIsIHdhaXRpbmcgZm9yIGxvbmdlciBtaWdodCBtZWFuIHRoYXQgd2UgY2FuIGF2b2lkXG4vLyBzaG93aW5nIGFuIGludGVybWVkaWF0ZSBsb2FkaW5nIHN0YXRlLiBUaGUgbG9uZ2VyIHdlIGhhdmUgYWxyZWFkeSB3YWl0ZWQsIHRoZSBoYXJkZXIgaXRcbi8vIGlzIHRvIHRlbGwgc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS4gVGhlcmVmb3JlLCB0aGUgbG9uZ2VyIHdlJ3ZlIGFscmVhZHkgd2FpdGVkLFxuLy8gdGhlIGxvbmdlciB3ZSBjYW4gd2FpdCBhZGRpdGlvbmFsbHkuIEF0IHNvbWUgcG9pbnQgd2UgaGF2ZSB0byBnaXZlIHVwIHRob3VnaC5cbi8vIFdlIHBpY2sgYSB0cmFpbiBtb2RlbCB3aGVyZSB0aGUgbmV4dCBib3VuZGFyeSBjb21taXRzIGF0IGEgY29uc2lzdGVudCBzY2hlZHVsZS5cbi8vIFRoZXNlIHBhcnRpY3VsYXIgbnVtYmVycyBhcmUgdmFndWUgZXN0aW1hdGVzLiBXZSBleHBlY3QgdG8gYWRqdXN0IHRoZW0gYmFzZWQgb24gcmVzZWFyY2guXG5cbmZ1bmN0aW9uIGpuZCh0aW1lRWxhcHNlZCkge1xuICByZXR1cm4gdGltZUVsYXBzZWQgPCAxMjAgPyAxMjAgOiB0aW1lRWxhcHNlZCA8IDQ4MCA/IDQ4MCA6IHRpbWVFbGFwc2VkIDwgMTA4MCA/IDEwODAgOiB0aW1lRWxhcHNlZCA8IDE5MjAgPyAxOTIwIDogdGltZUVsYXBzZWQgPCAzMDAwID8gMzAwMCA6IHRpbWVFbGFwc2VkIDwgNDMyMCA/IDQzMjAgOiBjZWlsKHRpbWVFbGFwc2VkIC8gMTk2MCkgKiAxOTYwO1xufVxuXG5mdW5jdGlvbiBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKSB7XG4gIGlmIChuZXN0ZWRVcGRhdGVDb3VudCA+IE5FU1RFRF9VUERBVEVfTElNSVQpIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgJ3JlcGVhdGVkbHkgY2FsbHMgc2V0U3RhdGUgaW5zaWRlIGNvbXBvbmVudFdpbGxVcGRhdGUgb3IgJyArICdjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvICcgKyAncHJldmVudCBpbmZpbml0ZSBsb29wcy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID4gTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUKSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG5cbiAgICAgIGVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArIFwiY2FsbHMgc2V0U3RhdGUgaW5zaWRlIHVzZUVmZmVjdCwgYnV0IHVzZUVmZmVjdCBlaXRoZXIgZG9lc24ndCBcIiArICdoYXZlIGEgZGVwZW5kZW5jeSBhcnJheSwgb3Igb25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgY2hhbmdlcyBvbiAnICsgJ2V2ZXJ5IHJlbmRlci4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hSZW5kZXJQaGFzZVN0cmljdE1vZGVXYXJuaW5nc0luREVWKCkge1xuICB7XG4gICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZygpO1xuXG4gICAge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKGZpYmVyLCBoYXNQYXNzaXZlRWZmZWN0cykge1xuICB7XG4gICAgLy8gVE9ETyAoU3RyaWN0RWZmZWN0cykgU2hvdWxkIHdlIHNldCBhIG1hcmtlciBvbiB0aGUgcm9vdCBpZiBpdCBjb250YWlucyBzdHJpY3QgZWZmZWN0c1xuICAgIC8vIHNvIHdlIGRvbid0IHRyYXZlcnNlIHVubmVjZXNzYXJpbHk/IHNpbWlsYXIgdG8gc3VidHJlZUZsYWdzIGJ1dCBqdXN0IGF0IHRoZSByb290IGxldmVsLlxuICAgIC8vIE1heWJlIG5vdCBhIGJpZyBkZWFsIHNpbmNlIHRoaXMgaXMgREVWIG9ubHkgYmVoYXZpb3IuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVik7XG4gICAgfVxuXG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0TW91bnRJbkRFVik7XG5cbiAgICBpZiAoaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRQYXNzaXZlRGV2LCBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VFZmZlY3RzSW5EZXYoZmlyc3RDaGlsZCwgZmliZXJGbGFncywgaW52b2tlRWZmZWN0Rm4pIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHZhciBjdXJyZW50ID0gZmlyc3RDaGlsZDtcbiAgICB2YXIgc3VidHJlZVJvb3QgPSBudWxsO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmltYXJ5U3VidHJlZUZsYWcgPSBjdXJyZW50LnN1YnRyZWVGbGFncyAmIGZpYmVyRmxhZ3M7XG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBzdWJ0cmVlUm9vdCAmJiBjdXJyZW50LmNoaWxkICE9PSBudWxsICYmIHByaW1hcnlTdWJ0cmVlRmxhZyAhPT0gTm9GbGFncykge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIGZpYmVyRmxhZ3MpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgaW52b2tlRWZmZWN0Rm4oY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudC5zaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuc2libGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50ID0gc3VidHJlZVJvb3QgPSBjdXJyZW50LnJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5mdW5jdGlvbiB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAvLyBXZSBsZXQgdGhlIG90aGVyIHdhcm5pbmcgYWJvdXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgZGVhbCB3aXRoIHRoaXMgb25lLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFnID0gZmliZXIudGFnO1xuXG4gICAgaWYgKHRhZyAhPT0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCAmJiB0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdSZWFjdENvbXBvbmVudCc7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIGVycm9yKFwiQ2FuJ3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhIGNvbXBvbmVudCB0aGF0IGhhc24ndCBtb3VudGVkIHlldC4gXCIgKyAnVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3UgaGF2ZSBhIHNpZGUtZWZmZWN0IGluIHlvdXIgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgJyArICdhc3luY2hyb25vdXNseSBsYXRlciBjYWxscyB0cmllcyB0byB1cGRhdGUgdGhlIGNvbXBvbmVudC4gTW92ZSB0aGlzIHdvcmsgdG8gJyArICd1c2VFZmZlY3QgaW5zdGVhZC4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG52YXIgYmVnaW5Xb3JrJDE7XG5cbntcbiAgdmFyIGR1bW15RmliZXIgPSBudWxsO1xuXG4gIGJlZ2luV29yayQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKSB7XG4gICAgLy8gSWYgYSBjb21wb25lbnQgdGhyb3dzIGFuIGVycm9yLCB3ZSByZXBsYXkgaXQgYWdhaW4gaW4gYSBzeW5jaHJvbm91c2x5XG4gICAgLy8gZGlzcGF0Y2hlZCBldmVudCwgc28gdGhhdCB0aGUgZGVidWdnZXIgd2lsbCB0cmVhdCBpdCBhcyBhbiB1bmNhdWdodFxuICAgIC8vIGVycm9yIFNlZSBSZWFjdEVycm9yVXRpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY29weSB0aGUgd29yay1pbi1wcm9ncmVzcyBvbnRvIGEgZHVtbXlcbiAgICAvLyBmaWJlci4gSWYgYmVnaW5Xb3JrIHRocm93cywgd2UnbGwgdXNlIHRoaXMgdG8gcmVzZXQgdGhlIHN0YXRlLlxuICAgIHZhciBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSA9IGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKGR1bW15RmliZXIsIHVuaXRPZldvcmspO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiZWdpbldvcmsoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuICAgIH0gY2F0Y2ggKG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkgfHwgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBEb24ndCByZXBsYXkgcHJvbWlzZXMuXG4gICAgICAgIC8vIERvbid0IHJlcGxheSBlcnJvcnMgaWYgd2UgYXJlIGh5ZHJhdGluZyBhbmQgaGF2ZSBhbHJlYWR5IHN1c3BlbmRlZCBvciBoYW5kbGVkIGFuIGVycm9yXG4gICAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgICB9IC8vIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgd2l0aCBoYW5kbGVFcnJvcjsgYW55IGNoYW5nZXMgaGVyZSBtdXN0IGhhdmVcbiAgICAgIC8vIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0aGVyZS5cblxuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7IC8vIERvbid0IHJlc2V0IGN1cnJlbnQgZGVidWcgZmliZXIsIHNpbmNlIHdlJ3JlIGFib3V0IHRvIHdvcmsgb24gdGhlXG4gICAgICAvLyBzYW1lIGZpYmVyIGFnYWluLlxuICAgICAgLy8gVW53aW5kIHRoZSBmYWlsZWQgc3RhY2sgZnJhbWVcblxuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIHVuaXRPZldvcmspOyAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIG9mIHRoZSBmaWJlci5cblxuICAgICAgYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYodW5pdE9mV29yaywgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkpO1xuXG4gICAgICBpZiAoIHVuaXRPZldvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBwcm9maWxlciB0aW1lci5cbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKHVuaXRPZldvcmspO1xuICAgICAgfSAvLyBSdW4gYmVnaW5Xb3JrIGFnYWluLlxuXG5cbiAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBiZWdpbldvcmssIG51bGwsIGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcblxuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgdmFyIHJlcGxheUVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGF5RXJyb3IgPT09ICdvYmplY3QnICYmIHJlcGxheUVycm9yICE9PSBudWxsICYmIHJlcGxheUVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgIW9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICAgIC8vIElmIHN1cHByZXNzZWQsIGxldCB0aGUgZmxhZyBjYXJyeSBvdmVyIHRvIHRoZSBvcmlnaW5hbCBlcnJvciB3aGljaCBpcyB0aGUgb25lIHdlJ2xsIHJldGhyb3cuXG4gICAgICAgICAgb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBhbHdheXMgdGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yIGluIGNhc2UgdGhlIHNlY29uZCByZW5kZXIgcGFzcyBpcyBub3QgaWRlbXBvdGVudC5cbiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBhIG1lbW9pemVkIGZ1bmN0aW9uIG9yIENvbW1vbkpTIG1vZHVsZSBkb2Vzbid0IHRocm93IGFmdGVyIGZpcnN0IGludm9jYXRpb24uXG5cblxuICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICB9XG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IGZhbHNlO1xudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudDtcblxue1xuICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgJiYgIWdldElzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2VJbkRFVigpKSB7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSA9IHdvcmtJblByb2dyZXNzICYmIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJzsgLy8gRGVkdXBlIGJ5IHRoZSByZW5kZXJpbmcgY29tcG9uZW50IGJlY2F1c2UgaXQncyB0aGUgb25lIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQuXG5cbiAgICAgICAgICAgIHZhciBkZWR1cGVLZXkgPSByZW5kZXJpbmdDb21wb25lbnROYW1lO1xuXG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5oYXMoZGVkdXBlS2V5KSkge1xuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuYWRkKGRlZHVwZUtleSk7XG4gICAgICAgICAgICAgIHZhciBzZXRTdGF0ZUNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgKGAlc2ApIHdoaWxlIHJlbmRlcmluZyBhICcgKyAnZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgJyArICdmb2xsb3cgdGhlIHN0YWNrIHRyYWNlIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc2V0c3RhdGUtaW4tcmVuZGVyJywgc2V0U3RhdGVDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlcikge1xuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgJyArICdmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuJyk7XG5cbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG4gICAgICBtZW1vaXplZFVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxpbmdGaWJlcikge1xuICAgICAgICBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgc2NoZWR1bGluZ0ZpYmVyLCBsYW5lcyk7XG4gICAgICB9KTsgLy8gVGhpcyBmdW5jdGlvbiBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGNsZWFyIG1lbW9pemVkIHVwZGF0ZXJzLlxuICAgICAgLy8gVGhvc2UgbWF5IHN0aWxsIGJlIHJlbGV2YW50IHRvIHRoZSBjdXJyZW50IGNvbW1pdFxuICAgICAgLy8gYW5kIGEgZnV0dXJlIG9uZSAoZS5nLiBTdXNwZW5zZSkuXG4gICAgfVxuICB9XG59XG52YXIgZmFrZUFjdENhbGxiYWNrTm9kZSA9IHt9O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrJDEocHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spIHtcbiAge1xuICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYW4gYGFjdGAgc2NvcGUsIGJ5cGFzcyBTY2hlZHVsZXIgYW5kIHB1c2ggdG9cbiAgICAvLyB0aGUgYGFjdGAgcXVldWUgaW5zdGVhZC5cbiAgICB2YXIgYWN0UXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQ7XG5cbiAgICBpZiAoYWN0UXVldWUgIT09IG51bGwpIHtcbiAgICAgIGFjdFF1ZXVlLnB1c2goY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIGZha2VBY3RDYWxsYmFja05vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FuY2VsQ2FsbGJhY2skMShjYWxsYmFja05vZGUpIHtcbiAgaWYgKCBjYWxsYmFja05vZGUgPT09IGZha2VBY3RDYWxsYmFja05vZGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gSW4gcHJvZHVjdGlvbiwgYWx3YXlzIGNhbGwgU2NoZWR1bGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgc3RyaXBwZWQgb3V0LlxuXG5cbiAgcmV0dXJuIGNhbmNlbENhbGxiYWNrKGNhbGxiYWNrTm9kZSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpIHtcbiAgLy8gTmV2ZXIgZm9yY2UgZmx1c2ggaW4gcHJvZHVjdGlvbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2V0IHN0cmlwcGVkIG91dC5cbiAgcmV0dXJuICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlVwZGF0ZXNOb3RXcmFwcGVkV2l0aEFjdERFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgaWYgKCFpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWdhY3kgbW9kZSBoYXMgYWRkaXRpb25hbCBjYXNlcyB3aGVyZSB3ZSBzdXBwcmVzcyBhIHdhcm5pbmcuXG4gICAgICBpZiAoIWlzTGVnYWN5QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgIT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBMZWdhY3kgbW9kZSBkb2Vzbid0IHdhcm4gaWYgdGhlIHVwZGF0ZSBpcyBiYXRjaGVkLCBpLmUuXG4gICAgICAgIC8vIGJhdGNoZWRVcGRhdGVzIG9yIGZsdXNoU3luYy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmliZXIudGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiBmaWJlci50YWcgIT09IEZvcndhcmRSZWYgJiYgZmliZXIudGFnICE9PSBTaW1wbGVNZW1vQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZS1ob29rcyBjb2RlLCBsZWdhY3kgbW9kZSBvbmx5XG4gICAgICAgIC8vIHdhcm5zIGZvciB1cGRhdGVzIHRoYXQgb3JpZ2luYXRlIGZyb20gYSBob29rLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdBbiB1cGRhdGUgdG8gJXMgaW5zaWRlIGEgdGVzdCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCBjYXVzZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBzaG91bGQgYmUgJyArICd3cmFwcGVkIGludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaXJlIGV2ZW50cyB0aGF0IHVwZGF0ZSBzdGF0ZSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpIHtcbiAge1xuICAgIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0Egc3VzcGVuZGVkIHJlc291cmNlIGZpbmlzaGVkIGxvYWRpbmcgaW5zaWRlIGEgdGVzdCwgYnV0IHRoZSBldmVudCAnICsgJ3dhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IHJlc29sdmVzIHN1c3BlbmRlZCBkYXRhIHNob3VsZCBiZSB3cmFwcGVkICcgKyAnaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpbmlzaCBsb2FkaW5nIHN1c3BlbmRlZCBkYXRhICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0Jyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChpc1J1bm5pbmcpIHtcbiAge1xuICAgIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGlzUnVubmluZztcbiAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzICovXG52YXIgcmVzb2x2ZUZhbWlseSA9IG51bGw7IC8vICRGbG93Rml4TWUgRmxvdyBnZXRzIGNvbmZ1c2VkIGJ5IGEgV2Vha1NldCBmZWF0dXJlIGNoZWNrIGJlbG93LlxuXG52YXIgZmFpbGVkQm91bmRhcmllcyA9IG51bGw7XG52YXIgc2V0UmVmcmVzaEhhbmRsZXIgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICB7XG4gICAgcmVzb2x2ZUZhbWlseSA9IGhhbmRsZXI7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfSAvLyBVc2UgdGhlIGxhdGVzdCBrbm93biBpbXBsZW1lbnRhdGlvbi5cblxuXG4gICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICAvLyBObyBpbXBsZW1lbnRhdGlvbiBkaWZmZXJlbmNlcy5cbiAgcmV0dXJuIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHJlYWwgZm9yd2FyZFJlZi4gRG9uJ3Qgd2FudCB0byBjcmFzaCBlYXJseS5cbiAgICAgIGlmICh0eXBlICE9PSBudWxsICYmIHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRm9yd2FyZFJlZiBpcyBzcGVjaWFsIGJlY2F1c2UgaXRzIHJlc29sdmVkIC50eXBlIGlzIGFuIG9iamVjdCxcbiAgICAgICAgLy8gYnV0IGl0J3MgcG9zc2libGUgdGhhdCB3ZSBvbmx5IGhhdmUgaXRzIGlubmVyIHJlbmRlciBmdW5jdGlvbiBpbiB0aGUgbWFwLlxuICAgICAgICAvLyBJZiB0aGF0IGlubmVyIHJlbmRlciBmdW5jdGlvbiBpcyBkaWZmZXJlbnQsIHdlJ2xsIGJ1aWxkIGEgbmV3IGZvcndhcmRSZWYgdHlwZS5cbiAgICAgICAgdmFyIGN1cnJlbnRSZW5kZXIgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZS5yZW5kZXIpO1xuXG4gICAgICAgIGlmICh0eXBlLnJlbmRlciAhPT0gY3VycmVudFJlbmRlcikge1xuICAgICAgICAgIHZhciBzeW50aGV0aWNUeXBlID0ge1xuICAgICAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUsXG4gICAgICAgICAgICByZW5kZXI6IGN1cnJlbnRSZW5kZXJcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKHR5cGUuZGlzcGxheU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3ludGhldGljVHlwZS5kaXNwbGF5TmFtZSA9IHR5cGUuZGlzcGxheU5hbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN5bnRoZXRpY1R5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfSAvLyBVc2UgdGhlIGxhdGVzdCBrbm93biBpbXBsZW1lbnRhdGlvbi5cblxuXG4gICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoZmliZXIsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBwcmV2VHlwZSA9IGZpYmVyLmVsZW1lbnRUeXBlO1xuICAgIHZhciBuZXh0VHlwZSA9IGVsZW1lbnQudHlwZTsgLy8gSWYgd2UgZ290IGhlcmUsIHdlIGtub3cgdHlwZXMgYXJlbid0ID09PSBlcXVhbC5cblxuICAgIHZhciBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IGZhbHNlO1xuICAgIHZhciAkJHR5cGVvZk5leHRUeXBlID0gdHlwZW9mIG5leHRUeXBlID09PSAnb2JqZWN0JyAmJiBuZXh0VHlwZSAhPT0gbnVsbCA/IG5leHRUeXBlLiQkdHlwZW9mIDogbnVsbDtcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGlubmVyIHR5cGUgeWV0LlxuICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhlIGxhenkgaW5uZXIgdHlwZSBpcyBzdGFibGUsXG4gICAgICAgICAgICAvLyBhbmQgc28gaXQgaXMgc3VmZmljaWVudCB0byBhdm9pZCByZWNvbmNpbGluZyBpdCBhd2F5LlxuICAgICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHVud3JhcCBvciBhY3R1YWxseSB1c2UgdGhlIG5ldyBsYXp5IHR5cGUuXG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGlmIGl0IHdhcyBidXQgY2FuIG5vIGxvbmdlciBiZSBzaW1wbGUsXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3Qgc2V0IHRoaXMuXG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBDaGVjayBpZiBib3RoIHR5cGVzIGhhdmUgYSBmYW1pbHkgYW5kIGl0J3MgdGhlIHNhbWUgb25lLlxuXG5cbiAgICBpZiAobmVlZHNDb21wYXJlRmFtaWxpZXMpIHtcbiAgICAgIC8vIE5vdGU6IG1lbW8oKSBhbmQgZm9yd2FyZFJlZigpIHdlJ2xsIGNvbXBhcmUgb3V0ZXIgcmF0aGVyIHRoYW4gaW5uZXIgdHlwZS5cbiAgICAgIC8vIFRoaXMgbWVhbnMgYm90aCBvZiB0aGVtIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCB0byBwcmVzZXJ2ZSBzdGF0ZS5cbiAgICAgIC8vIElmIHdlIHVud3JhcHBlZCBhbmQgY29tcGFyZWQgdGhlIGlubmVyIHR5cGVzIGZvciB3cmFwcGVycyBpbnN0ZWFkLFxuICAgICAgLy8gdGhlbiB3ZSB3b3VsZCByaXNrIGZhbHNlbHkgc2F5aW5nIHR3byBzZXBhcmF0ZSBtZW1vKEZvbylcbiAgICAgIC8vIGNhbGxzIGFyZSBlcXVpdmFsZW50IGJlY2F1c2UgdGhleSB3cmFwIHRoZSBzYW1lIEZvbyBmdW5jdGlvbi5cbiAgICAgIHZhciBwcmV2RmFtaWx5ID0gcmVzb2x2ZUZhbWlseShwcmV2VHlwZSk7XG5cbiAgICAgIGlmIChwcmV2RmFtaWx5ICE9PSB1bmRlZmluZWQgJiYgcHJldkZhbWlseSA9PT0gcmVzb2x2ZUZhbWlseShuZXh0VHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcikge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBXZWFrU2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgPT09IG51bGwpIHtcbiAgICAgIGZhaWxlZEJvdW5kYXJpZXMgPSBuZXcgV2Vha1NldCgpO1xuICAgIH1cblxuICAgIGZhaWxlZEJvdW5kYXJpZXMuYWRkKGZpYmVyKTtcbiAgfVxufVxudmFyIHNjaGVkdWxlUmVmcmVzaCA9IGZ1bmN0aW9uIChyb290LCB1cGRhdGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzdGFsZUZhbWlsaWVzID0gdXBkYXRlLnN0YWxlRmFtaWxpZXMsXG4gICAgICAgIHVwZGF0ZWRGYW1pbGllcyA9IHVwZGF0ZS51cGRhdGVkRmFtaWxpZXM7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY2hlZHVsZVJvb3QgPSBmdW5jdGlvbiAocm9vdCwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJvb3QuY29udGV4dCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICAvLyBTdXBlciBlZGdlIGNhc2U6IHJvb3QgaGFzIGEgbGVnYWN5IF9yZW5kZXJTdWJ0cmVlIGNvbnRleHRcbiAgICAgIC8vIGJ1dCB3ZSBkb24ndCBrbm93IHRoZSBwYXJlbnRDb21wb25lbnQgc28gd2UgY2FuJ3QgcGFzcyBpdC5cbiAgICAgIC8vIEp1c3QgaWdub3JlLiBXZSdsbCBkZWxldGUgdGhpcyB3aXRoIF9yZW5kZXJTdWJ0cmVlIGNvZGUgcGF0aCBsYXRlci5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCByb290LCBudWxsLCBudWxsKTtcbiAgICB9KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShmaWJlciwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlLFxuICAgICAgICBjaGlsZCA9IGZpYmVyLmNoaWxkLFxuICAgICAgICBzaWJsaW5nID0gZmliZXIuc2libGluZyxcbiAgICAgICAgdGFnID0gZmliZXIudGFnLFxuICAgICAgICB0eXBlID0gZmliZXIudHlwZTtcbiAgICB2YXIgY2FuZGlkYXRlVHlwZSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZS5yZW5kZXI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlc29sdmVGYW1pbHkgdG8gYmUgc2V0IGR1cmluZyBob3QgcmVsb2FkLicpO1xuICAgIH1cblxuICAgIHZhciBuZWVkc1JlbmRlciA9IGZhbHNlO1xuICAgIHZhciBuZWVkc1JlbW91bnQgPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseShjYW5kaWRhdGVUeXBlKTtcblxuICAgICAgaWYgKGZhbWlseSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChzdGFsZUZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh1cGRhdGVkRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBpZiAodGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVlZHNSZW5kZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzICE9PSBudWxsKSB7XG4gICAgICBpZiAoZmFpbGVkQm91bmRhcmllcy5oYXMoZmliZXIpIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBmYWlsZWRCb3VuZGFyaWVzLmhhcyhhbHRlcm5hdGUpKSB7XG4gICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCkge1xuICAgICAgZmliZXIuX2RlYnVnTmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50IHx8IG5lZWRzUmVuZGVyKSB7XG4gICAgICB2YXIgX3Jvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKF9yb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihfcm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsICYmICFuZWVkc1JlbW91bnQpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoY2hpbGQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoc2libGluZywgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCA9IGZ1bmN0aW9uIChyb290LCBmYW1pbGllcykge1xuICB7XG4gICAgdmFyIGhvc3RJbnN0YW5jZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHR5cGVzID0gbmV3IFNldChmYW1pbGllcy5tYXAoZnVuY3Rpb24gKGZhbWlseSkge1xuICAgICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICAgIH0pKTtcbiAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgcmV0dXJuIGhvc3RJbnN0YW5jZXM7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShmaWJlciwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkLFxuICAgICAgICBzaWJsaW5nID0gZmliZXIuc2libGluZyxcbiAgICAgICAgdGFnID0gZmliZXIudGFnLFxuICAgICAgICB0eXBlID0gZmliZXIudHlwZTtcbiAgICB2YXIgY2FuZGlkYXRlVHlwZSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZS5yZW5kZXI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBkaWRNYXRjaCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlcy5oYXMoY2FuZGlkYXRlVHlwZSkpIHtcbiAgICAgICAgZGlkTWF0Y2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaWRNYXRjaCkge1xuICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoLiBUaGlzIG9ubHkgZHJpbGxzIGRvd24gdG8gdGhlIGNsb3Nlc3QgaG9zdCBjb21wb25lbnRzLlxuICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIHNlYXJjaCBkZWVwZXIgYmVjYXVzZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZ2l2aW5nXG4gICAgICAvLyB2aXN1YWwgZmVlZGJhY2ssIFwiZmxhc2hpbmdcIiBvdXRlcm1vc3QgcGFyZW50IHJlY3RhbmdsZXMgaXMgc3VmZmljaWVudC5cbiAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIG1hdGNoLCBtYXliZSB0aGVyZSB3aWxsIGJlIG9uZSBmdXJ0aGVyIGRvd24gaW4gdGhlIGNoaWxkIHRyZWUuXG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGNoaWxkLCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShzaWJsaW5nLCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpO1xuXG4gICAgaWYgKGZvdW5kSG9zdEluc3RhbmNlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55IGhvc3QgY2hpbGRyZW4sIGZhbGxiYWNrIHRvIGNsb3Nlc3QgaG9zdCBwYXJlbnQuXG5cblxuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byByZWFjaCByb290IGZpcnN0LicpO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmFsc2U7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIC8vIFdlIGdvdCBhIG1hdGNoLlxuICAgICAgICBmb3VuZEhvc3RJbnN0YW5jZXMgPSB0cnVlO1xuICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7IC8vIFRoZXJlIG1heSBzdGlsbCBiZSBtb3JlLCBzbyBrZWVwIHNlYXJjaGluZy5cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZpYmVyKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEhvc3RJbnN0YW5jZXM7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaWJlcikge1xuICAgICAgICAgIHJldHVybiBmb3VuZEhvc3RJbnN0YW5jZXM7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgaGFzQmFkTWFwUG9seWZpbGw7XG5cbntcbiAgaGFzQmFkTWFwUG9seWZpbGwgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi9cblxuICAgIG5ldyBNYXAoW1tub25FeHRlbnNpYmxlT2JqZWN0LCBudWxsXV0pO1xuICAgIG5ldyBTZXQoW25vbkV4dGVuc2libGVPYmplY3RdKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVE9ETzogQ29uc2lkZXIgd2FybmluZyBhYm91dCBiYWQgcG9seWZpbGxzXG4gICAgaGFzQmFkTWFwUG9seWZpbGwgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vIEluc3RhbmNlXG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmtleSA9IGtleTtcbiAgdGhpcy5lbGVtZW50VHlwZSA9IG51bGw7XG4gIHRoaXMudHlwZSA9IG51bGw7XG4gIHRoaXMuc3RhdGVOb2RlID0gbnVsbDsgLy8gRmliZXJcblxuICB0aGlzLnJldHVybiA9IG51bGw7XG4gIHRoaXMuY2hpbGQgPSBudWxsO1xuICB0aGlzLnNpYmxpbmcgPSBudWxsO1xuICB0aGlzLmluZGV4ID0gMDtcbiAgdGhpcy5yZWYgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wcztcbiAgdGhpcy5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgdGhpcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHRoaXMubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHRoaXMuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgdGhpcy5tb2RlID0gbW9kZTsgLy8gRWZmZWN0c1xuXG4gIHRoaXMuZmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuZGVsZXRpb25zID0gbnVsbDtcbiAgdGhpcy5sYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuYWx0ZXJuYXRlID0gbnVsbDtcblxuICB7XG4gICAgLy8gTm90ZTogVGhlIGZvbGxvd2luZyBpcyBkb25lIHRvIGF2b2lkIGEgdjggcGVyZm9ybWFuY2UgY2xpZmYuXG4gICAgLy9cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIGZpZWxkcyBiZWxvdyB0byBzbWlzIGFuZCBsYXRlciB1cGRhdGluZyB0aGVtIHdpdGhcbiAgICAvLyBkb3VibGUgdmFsdWVzIHdpbGwgY2F1c2UgRmliZXJzIHRvIGVuZCB1cCBoYXZpbmcgc2VwYXJhdGUgc2hhcGVzLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IvYnVnIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBPYmplY3QucHJldmVudEV4dGVuc2lvbigpLlxuICAgIC8vIEZvcnR1bmF0ZWx5IHRoaXMgb25seSBpbXBhY3RzIERFViBidWlsZHMuXG4gICAgLy8gVW5mb3J0dW5hdGVseSBpdCBtYWtlcyBSZWFjdCB1bnVzYWJseSBzbG93IGZvciBzb21lIGFwcGxpY2F0aW9ucy5cbiAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCBpbml0aWFsaXplIHRoZSBmaWVsZHMgYmVsb3cgd2l0aCBkb3VibGVzLlxuICAgIC8vXG4gICAgLy8gTGVhcm4gbW9yZSBhYm91dCB0aGlzIGhlcmU6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDM2NVxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTg1MzhcbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IE51bWJlci5OYU47XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOOyAvLyBJdCdzIG9rYXkgdG8gcmVwbGFjZSB0aGUgaW5pdGlhbCBkb3VibGVzIHdpdGggc21pcyBhZnRlciBpbml0aWFsaXphdGlvbi5cbiAgICAvLyBUaGlzIHdvbid0IHRyaWdnZXIgdGhlIHBlcmZvcm1hbmNlIGNsaWZmIG1lbnRpb25lZCBhYm92ZSxcbiAgICAvLyBhbmQgaXQgc2ltcGxpZmllcyBvdGhlciBwcm9maWxlciBjb2RlIChpbmNsdWRpbmcgRGV2VG9vbHMpLlxuXG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gIH1cblxuICB7XG4gICAgLy8gVGhpcyBpc24ndCBkaXJlY3RseSB1c2VkIGJ1dCBpcyBoYW5keSBmb3IgZGVidWdnaW5nIGludGVybmFsczpcbiAgICB0aGlzLl9kZWJ1Z1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdPd25lciA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdOZWVkc1JlbW91bnQgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG5cbiAgICBpZiAoIWhhc0JhZE1hcFBvbHlmaWxsICYmIHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gIH1cbn0gLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIFBPSk8gY29uc3RydWN0b3IsIHN0aWxsXG4vLyBwbGVhc2UgZW5zdXJlIHdlIGRvIHRoZSBmb2xsb3dpbmc6XG4vLyAxKSBOb2JvZHkgc2hvdWxkIGFkZCBhbnkgaW5zdGFuY2UgbWV0aG9kcyBvbiB0aGlzLiBJbnN0YW5jZSBtZXRob2RzIGNhbiBiZVxuLy8gICAgbW9yZSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGVuIHRoZXkgZ2V0IG9wdGltaXplZCBhbmQgdGhleSBhcmUgYWxtb3N0XG4vLyAgICBuZXZlciBpbmxpbmVkIHByb3Blcmx5IGluIHN0YXRpYyBjb21waWxlcnMuXG4vLyAyKSBOb2JvZHkgc2hvdWxkIHJlbHkgb24gYGluc3RhbmNlb2YgRmliZXJgIGZvciB0eXBlIHRlc3RpbmcuIFdlIHNob3VsZFxuLy8gICAgYWx3YXlzIGtub3cgd2hlbiBpdCBpcyBhIGZpYmVyLlxuLy8gMykgV2UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdpdGggdXNpbmcgbnVtZXJpYyBrZXlzIHNpbmNlIHRoZXkgYXJlIGVhc2llclxuLy8gICAgdG8gb3B0aW1pemUgaW4gYSBub24tSklUIGVudmlyb25tZW50LlxuLy8gNCkgV2UgY2FuIGVhc2lseSBnbyBmcm9tIGEgY29uc3RydWN0b3IgdG8gYSBjcmVhdGVGaWJlciBvYmplY3QgbGl0ZXJhbCBpZiB0aGF0XG4vLyAgICBpcyBmYXN0ZXIuXG4vLyA1KSBJdCBzaG91bGQgYmUgZWFzeSB0byBwb3J0IHRoaXMgdG8gYSBDIHN0cnVjdCBhbmQga2VlcCBhIEMgaW1wbGVtZW50YXRpb25cbi8vICAgIGNvbXBhdGlibGUuXG5cblxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2hvdWxkQ29uc3RydWN0JDEodHlwZSkgJiYgdHlwZS5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpID8gQ2xhc3NDb21wb25lbnQgOiBGdW5jdGlvbkNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChDb21wb25lbnQgIT09IHVuZGVmaW5lZCAmJiBDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBDb21wb25lbnQuJCR0eXBlb2Y7XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICByZXR1cm4gTWVtb0NvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDtcbn0gLy8gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUgZmliZXIgdG8gZG8gd29yayBvbi5cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzKSB7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gbnVsbCkge1xuICAgIC8vIFdlIHVzZSBhIGRvdWJsZSBidWZmZXJpbmcgcG9vbGluZyB0ZWNobmlxdWUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgd2UnbGxcbiAgICAvLyBvbmx5IGV2ZXIgbmVlZCBhdCBtb3N0IHR3byB2ZXJzaW9ucyBvZiBhIHRyZWUuIFdlIHBvb2wgdGhlIFwib3RoZXJcIiB1bnVzZWRcbiAgICAvLyBub2RlIHRoYXQgd2UncmUgZnJlZSB0byByZXVzZS4gVGhpcyBpcyBsYXppbHkgY3JlYXRlZCB0byBhdm9pZCBhbGxvY2F0aW5nXG4gICAgLy8gZXh0cmEgb2JqZWN0cyBmb3IgdGhpbmdzIHRoYXQgYXJlIG5ldmVyIHVwZGF0ZWQuIEl0IGFsc28gYWxsb3cgdXMgdG9cbiAgICAvLyByZWNsYWltIHRoZSBleHRyYSBtZW1vcnkgaWYgbmVlZGVkLlxuICAgIHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoY3VycmVudC50YWcsIHBlbmRpbmdQcm9wcywgY3VycmVudC5rZXksIGN1cnJlbnQubW9kZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPSBjdXJyZW50LmVsZW1lbnRUeXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGU7XG5cbiAgICB7XG4gICAgICAvLyBERVYtb25seSBmaWVsZHNcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZSA9IGN1cnJlbnQuX2RlYnVnU291cmNlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gY3VycmVudC5fZGVidWdIb29rVHlwZXM7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gY3VycmVudDtcbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wczsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBhbHRlcm5hdGUuXG4gICAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IE5vRmxhZ3M7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IHJlc2V0LCByYXRoZXIgdGhhbiBjb3B5LCBhY3R1YWxEdXJhdGlvbiAmIGFjdHVhbFN0YXJ0VGltZS5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGltZSBmcm9tIGVuZGxlc3NseSBhY2N1bXVsYXRpbmcgaW4gbmV3IGNvbW1pdHMuXG4gICAgICAvLyBUaGlzIGhhcyB0aGUgZG93bnNpZGUgb2YgcmVzZXR0aW5nIHZhbHVlcyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHJlbmRlcnMsXG4gICAgICAvLyBCdXQgd29ya3MgZm9yIHlpZWxkaW5nICh0aGUgY29tbW9uIGNhc2UpIGFuZCBzaG91bGQgc3VwcG9ydCByZXN1bWluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIH1cbiAgfSAvLyBSZXNldCBhbGwgZWZmZWN0cyBleGNlcHQgc3RhdGljIG9uZXMuXG4gIC8vIFN0YXRpYyBlZmZlY3RzIGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGN1cnJlbnQuZmxhZ3MgJiBTdGF0aWNNYXNrO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICB9OyAvLyBUaGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gZHVyaW5nIHRoZSBwYXJlbnQncyByZWNvbmNpbGlhdGlvblxuXG4gIHdvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBjdXJyZW50LnNpYmxpbmc7XG4gIHdvcmtJblByb2dyZXNzLmluZGV4ID0gY3VycmVudC5pbmRleDtcbiAgd29ya0luUHJvZ3Jlc3MucmVmID0gY3VycmVudC5yZWY7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgfVxuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgPSBjdXJyZW50Ll9kZWJ1Z05lZWRzUmVtb3VudDtcblxuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59IC8vIFVzZWQgdG8gcmV1c2UgYSBGaWJlciBmb3IgYSBzZWNvbmQgcGFzcy5cblxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyByZXNldHMgdGhlIEZpYmVyIHRvIHdoYXQgY3JlYXRlRmliZXIgb3IgY3JlYXRlV29ya0luUHJvZ3Jlc3Mgd291bGRcbiAgLy8gaGF2ZSBzZXQgdGhlIHZhbHVlcyB0byBiZWZvcmUgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLiBJZGVhbGx5IHRoaXMgd291bGRuJ3RcbiAgLy8gYmUgbmVjZXNzYXJ5IGJ1dCB1bmZvcnR1bmF0ZWx5IG1hbnkgY29kZSBwYXRocyByZWFkcyBmcm9tIHRoZSB3b3JrSW5Qcm9ncmVzc1xuICAvLyB3aGVuIHRoZXkgc2hvdWxkIGJlIHJlYWRpbmcgZnJvbSBjdXJyZW50IGFuZCB3cml0aW5nIHRvIHdvcmtJblByb2dyZXNzLlxuICAvLyBXZSBhc3N1bWUgcGVuZGluZ1Byb3BzLCBpbmRleCwga2V5LCByZWYsIHJldHVybiBhcmUgc3RpbGwgdW50b3VjaGVkIHRvXG4gIC8vIGF2b2lkIGRvaW5nIGFub3RoZXIgcmVjb25jaWxpYXRpb24uXG4gIC8vIFJlc2V0IHRoZSBlZmZlY3QgZmxhZ3MgYnV0IGtlZXAgYW55IFBsYWNlbWVudCB0YWdzLCBzaW5jZSB0aGF0J3Mgc29tZXRoaW5nXG4gIC8vIHRoYXQgY2hpbGQgZmliZXIgaXMgc2V0dGluZywgbm90IHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gU3RhdGljTWFzayB8IFBsYWNlbWVudDsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRvIGNyZWF0ZUZpYmVyJ3MgaW5pdGlhbCB2YWx1ZXMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlc2V0IHRvIHRoZSBjbG9uZWQgdmFsdWVzIHRoYXQgY3JlYXRlV29ya0luUHJvZ3Jlc3Mgd291bGQndmUuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gICAgfTtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlKSB7XG4gIHZhciBtb2RlO1xuXG4gIGlmICh0YWcgPT09IENvbmN1cnJlbnRSb290KSB7XG4gICAgbW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuXG4gICAgaWYgKGlzU3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgbW9kZSB8PSBTdHJpY3RMZWdhY3lNb2RlO1xuXG4gICAgICB7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG1vZGUgPSBOb01vZGU7XG4gIH1cblxuICBpZiAoIGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgLy8gQWx3YXlzIGNvbGxlY3QgcHJvZmlsZSB0aW1pbmdzIHdoZW4gRGV2VG9vbHMgYXJlIHByZXNlbnQuXG4gICAgLy8gVGhpcyBlbmFibGVzIERldlRvb2xzIHRvIHN0YXJ0IGNhcHR1cmluZyB0aW1pbmcgYXQgYW55IHBvaW50XHUyMDEzXG4gICAgLy8gV2l0aG91dCBzb21lIG5vZGVzIGluIHRoZSB0cmVlIGhhdmluZyBlbXB0eSBiYXNlIHRpbWVzLlxuICAgIG1vZGUgfD0gUHJvZmlsZU1vZGU7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRmliZXIoSG9zdFJvb3QsIG51bGwsIG51bGwsIG1vZGUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIC8vIFJlYWN0JEVsZW1lbnRUeXBlXG5rZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlclRhZyA9IEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7IC8vIFRoZSByZXNvbHZlZCB0eXBlIGlzIHNldCBpZiB3ZSBrbm93IHdoYXQgdGhlIGZpbmFsIHR5cGUgd2lsbCBiZS4gSS5lLiBpdCdzIG5vdCBsYXp5LlxuXG4gIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlO1xuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSkge1xuICAgICAgZmliZXJUYWcgPSBDbGFzc0NvbXBvbmVudDtcblxuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgZmliZXJUYWcgPSBIb3N0Q29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIGdldFRhZzogc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChwZW5kaW5nUHJvcHMuY2hpbGRyZW4sIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgIGZpYmVyVGFnID0gTW9kZTtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RMZWdhY3lNb2RlO1xuXG4gICAgICAgIGlmICggKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIC8vIFN0cmljdCBlZmZlY3RzIHNob3VsZCBuZXZlciBydW4gb24gbGVnYWN5IHJvb3RzXG4gICAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX09GRlNDUkVFTl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9TQ09QRV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9DQUNIRV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0UHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjb25zdW1lclxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dENvbnN1bWVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBGb3J3YXJkUmVmO1xuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBNZW1vQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IExhenlDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIFwiICsgJ25hbWVkIGltcG9ydHMuJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG93bmVyTmFtZSA9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lcikgOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgdHlwZSBpcyBpbnZhbGlkOiBleHBlY3RlZCBhIHN0cmluZyAoZm9yIGJ1aWx0LWluICcgKyAnY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSAnICsgKFwiYnV0IGdvdDogXCIgKyAodHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlKSArIFwiLlwiICsgaW5mbykpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoZmliZXJUYWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSB0eXBlO1xuICBmaWJlci50eXBlID0gcmVzb2x2ZWRUeXBlO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IG93bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCBtb2RlLCBsYW5lcykge1xuICB2YXIgb3duZXIgPSBudWxsO1xuXG4gIHtcbiAgICBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IGVsZW1lbnQucHJvcHM7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCBrZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGxhbmVzKTtcblxuICB7XG4gICAgZmliZXIuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50cywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihGcmFnbWVudCwgZWxlbWVudHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHBlbmRpbmdQcm9wcy5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdQcm9maWxlciBtdXN0IHNwZWNpZnkgYW4gXCJpZFwiIG9mIHR5cGUgYHN0cmluZ2AgYXMgYSBwcm9wLiBSZWNlaXZlZCB0aGUgdHlwZSBgJXNgIGluc3RlYWQuJywgdHlwZW9mIHBlbmRpbmdQcm9wcy5pZCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoUHJvZmlsZXIsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlIHwgUHJvZmlsZU1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLnN0YXRlTm9kZSA9IHtcbiAgICAgIGVmZmVjdER1cmF0aW9uOiAwLFxuICAgICAgcGFzc2l2ZUVmZmVjdER1cmF0aW9uOiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUxpc3RDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoT2Zmc2NyZWVuQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHZhciBwcmltYXJ5Q2hpbGRJbnN0YW5jZSA9IHtcbiAgICBpc0hpZGRlbjogZmFsc2VcbiAgfTtcbiAgZmliZXIuc3RhdGVOb2RlID0gcHJpbWFyeUNoaWxkSW5zdGFuY2U7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVRleHQoY29udGVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFRleHQsIGNvbnRlbnQsIG51bGwsIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdENvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChkZWh5ZHJhdGVkTm9kZSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihEZWh5ZHJhdGVkRnJhZ21lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLnN0YXRlTm9kZSA9IGRlaHlkcmF0ZWROb2RlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCBtb2RlLCBsYW5lcykge1xuICB2YXIgcGVuZGluZ1Byb3BzID0gcG9ydGFsLmNoaWxkcmVuICE9PSBudWxsID8gcG9ydGFsLmNoaWxkcmVuIDogW107XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RQb3J0YWwsIHBlbmRpbmdQcm9wcywgcG9ydGFsLmtleSwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHtcbiAgICBjb250YWluZXJJbmZvOiBwb3J0YWwuY29udGFpbmVySW5mbyxcbiAgICBwZW5kaW5nQ2hpbGRyZW46IG51bGwsXG4gICAgLy8gVXNlZCBieSBwZXJzaXN0ZW50IHVwZGF0ZXNcbiAgICBpbXBsZW1lbnRhdGlvbjogcG9ydGFsLmltcGxlbWVudGF0aW9uXG4gIH07XG4gIHJldHVybiBmaWJlcjtcbn0gLy8gVXNlZCBmb3Igc3Rhc2hpbmcgV0lQIHByb3BlcnRpZXMgdG8gcmVwbGF5IGZhaWxlZCB3b3JrIGluIERFVi5cblxuZnVuY3Rpb24gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYodGFyZ2V0LCBzb3VyY2UpIHtcbiAgaWYgKHRhcmdldCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgRmliZXIncyBpbml0aWFsIHByb3BlcnRpZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4uXG4gICAgLy8gV2Ugb25seSB1c2UgYSBGaWJlciB0byBlbnN1cmUgdGhlIHNhbWUgaGlkZGVuIGNsYXNzIHNvIERFViBpc24ndCBzbG93LlxuICAgIHRhcmdldCA9IGNyZWF0ZUZpYmVyKEluZGV0ZXJtaW5hdGVDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIH0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IHdyaXR0ZW4gYXMgYSBsaXN0IG9mIGFsbCBwcm9wZXJ0aWVzLlxuICAvLyBXZSB0cmllZCB0byB1c2UgT2JqZWN0LmFzc2lnbigpIGluc3RlYWQgYnV0IHRoaXMgaXMgY2FsbGVkIGluXG4gIC8vIHRoZSBob3R0ZXN0IHBhdGgsIGFuZCBPYmplY3QuYXNzaWduKCkgd2FzIHRvbyBzbG93OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTAyXG4gIC8vIFRoaXMgY29kZSBpcyBERVYtb25seSBzbyBzaXplIGlzIG5vdCBhIGNvbmNlcm4uXG5cblxuICB0YXJnZXQudGFnID0gc291cmNlLnRhZztcbiAgdGFyZ2V0LmtleSA9IHNvdXJjZS5rZXk7XG4gIHRhcmdldC5lbGVtZW50VHlwZSA9IHNvdXJjZS5lbGVtZW50VHlwZTtcbiAgdGFyZ2V0LnR5cGUgPSBzb3VyY2UudHlwZTtcbiAgdGFyZ2V0LnN0YXRlTm9kZSA9IHNvdXJjZS5zdGF0ZU5vZGU7XG4gIHRhcmdldC5yZXR1cm4gPSBzb3VyY2UucmV0dXJuO1xuICB0YXJnZXQuY2hpbGQgPSBzb3VyY2UuY2hpbGQ7XG4gIHRhcmdldC5zaWJsaW5nID0gc291cmNlLnNpYmxpbmc7XG4gIHRhcmdldC5pbmRleCA9IHNvdXJjZS5pbmRleDtcbiAgdGFyZ2V0LnJlZiA9IHNvdXJjZS5yZWY7XG4gIHRhcmdldC5wZW5kaW5nUHJvcHMgPSBzb3VyY2UucGVuZGluZ1Byb3BzO1xuICB0YXJnZXQubWVtb2l6ZWRQcm9wcyA9IHNvdXJjZS5tZW1vaXplZFByb3BzO1xuICB0YXJnZXQudXBkYXRlUXVldWUgPSBzb3VyY2UudXBkYXRlUXVldWU7XG4gIHRhcmdldC5tZW1vaXplZFN0YXRlID0gc291cmNlLm1lbW9pemVkU3RhdGU7XG4gIHRhcmdldC5kZXBlbmRlbmNpZXMgPSBzb3VyY2UuZGVwZW5kZW5jaWVzO1xuICB0YXJnZXQubW9kZSA9IHNvdXJjZS5tb2RlO1xuICB0YXJnZXQuZmxhZ3MgPSBzb3VyY2UuZmxhZ3M7XG4gIHRhcmdldC5zdWJ0cmVlRmxhZ3MgPSBzb3VyY2Uuc3VidHJlZUZsYWdzO1xuICB0YXJnZXQuZGVsZXRpb25zID0gc291cmNlLmRlbGV0aW9ucztcbiAgdGFyZ2V0LmxhbmVzID0gc291cmNlLmxhbmVzO1xuICB0YXJnZXQuY2hpbGRMYW5lcyA9IHNvdXJjZS5jaGlsZExhbmVzO1xuICB0YXJnZXQuYWx0ZXJuYXRlID0gc291cmNlLmFsdGVybmF0ZTtcblxuICB7XG4gICAgdGFyZ2V0LmFjdHVhbER1cmF0aW9uID0gc291cmNlLmFjdHVhbER1cmF0aW9uO1xuICAgIHRhcmdldC5hY3R1YWxTdGFydFRpbWUgPSBzb3VyY2UuYWN0dWFsU3RhcnRUaW1lO1xuICAgIHRhcmdldC5zZWxmQmFzZUR1cmF0aW9uID0gc291cmNlLnNlbGZCYXNlRHVyYXRpb247XG4gICAgdGFyZ2V0LnRyZWVCYXNlRHVyYXRpb24gPSBzb3VyY2UudHJlZUJhc2VEdXJhdGlvbjtcbiAgfVxuXG4gIHRhcmdldC5fZGVidWdTb3VyY2UgPSBzb3VyY2UuX2RlYnVnU291cmNlO1xuICB0YXJnZXQuX2RlYnVnT3duZXIgPSBzb3VyY2UuX2RlYnVnT3duZXI7XG4gIHRhcmdldC5fZGVidWdOZWVkc1JlbW91bnQgPSBzb3VyY2UuX2RlYnVnTmVlZHNSZW1vdW50O1xuICB0YXJnZXQuX2RlYnVnSG9va1R5cGVzID0gc291cmNlLl9kZWJ1Z0hvb2tUeXBlcztcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5jb250YWluZXJJbmZvID0gY29udGFpbmVySW5mbztcbiAgdGhpcy5wZW5kaW5nQ2hpbGRyZW4gPSBudWxsO1xuICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICB0aGlzLnBpbmdDYWNoZSA9IG51bGw7XG4gIHRoaXMuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgdGhpcy50aW1lb3V0SGFuZGxlID0gbm9UaW1lb3V0O1xuICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja05vZGUgPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7XG4gIHRoaXMuZXZlbnRUaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9MYW5lcyk7XG4gIHRoaXMuZXhwaXJhdGlvblRpbWVzID0gY3JlYXRlTGFuZU1hcChOb1RpbWVzdGFtcCk7XG4gIHRoaXMucGVuZGluZ0xhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmV4cGlyZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMubXV0YWJsZVJlYWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZW50YW5nbGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlbWVudHMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmlkZW50aWZpZXJQcmVmaXggPSBpZGVudGlmaWVyUHJlZml4O1xuICB0aGlzLm9uUmVjb3ZlcmFibGVFcnJvciA9IG9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICB7XG4gICAgdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICB0aGlzLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICB7XG4gICAgdGhpcy5tZW1vaXplZFVwZGF0ZXJzID0gbmV3IFNldCgpO1xuICAgIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gdGhpcy5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgVG90YWxMYW5lczsgX2krKykge1xuICAgICAgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcC5wdXNoKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIENvbmN1cnJlbnRSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gaHlkcmF0ZSA/ICdoeWRyYXRlUm9vdCgpJyA6ICdjcmVhdGVSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMZWdhY3lSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gaHlkcmF0ZSA/ICdoeWRyYXRlKCknIDogJ3JlbmRlcigpJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIC8vIFRPRE86IFdlIGhhdmUgc2V2ZXJhbCBvZiB0aGVzZSBhcmd1bWVudHMgdGhhdCBhcmUgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlXG4vLyBob3N0IGNvbmZpZywgYnV0IGJlY2F1c2UgdGhleSBhcmUgcGFzc2VkIGluIGF0IHJ1bnRpbWUsIHdlIGhhdmUgdG8gdGhyZWFkXG4vLyB0aGVtIHRocm91Z2ggdGhlIHJvb3QgY29uc3RydWN0b3IuIFBlcmhhcHMgd2Ugc2hvdWxkIHB1dCB0aGVtIGFsbCBpbnRvIGFcbi8vIHNpbmdsZSB0eXBlLCBsaWtlIGEgRHluYW1pY0hvc3RDb25maWcgdGhhdCBpcyBkZWZpbmVkIGJ5IHRoZSByZW5kZXJlci5cbmlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgcm9vdCA9IG5ldyBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgLy8gc3RhdGVOb2RlIGlzIGFueS5cblxuXG4gIHZhciB1bmluaXRpYWxpemVkRmliZXIgPSBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZywgaXNTdHJpY3RNb2RlKTtcbiAgcm9vdC5jdXJyZW50ID0gdW5pbml0aWFsaXplZEZpYmVyO1xuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcblxuICB7XG4gICAgdmFyIF9pbml0aWFsU3RhdGUgPSB7XG4gICAgICBlbGVtZW50OiBpbml0aWFsQ2hpbGRyZW4sXG4gICAgICBpc0RlaHlkcmF0ZWQ6IGh5ZHJhdGUsXG4gICAgICBjYWNoZTogbnVsbCxcbiAgICAgIC8vIG5vdCBlbmFibGVkIHlldFxuICAgICAgdHJhbnNpdGlvbnM6IG51bGwsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBudWxsXG4gICAgfTtcbiAgICB1bmluaXRpYWxpemVkRmliZXIubWVtb2l6ZWRTdGF0ZSA9IF9pbml0aWFsU3RhdGU7XG4gIH1cblxuICBpbml0aWFsaXplVXBkYXRlUXVldWUodW5pbml0aWFsaXplZEZpYmVyKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTguMi4wJztcblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXJJbmZvLCAvLyBUT0RPOiBmaWd1cmUgb3V0IHRoZSBBUEkgZm9yIGNyb3NzLXJlbmRlcmVyIGltcGxlbWVudGF0aW9uLlxuaW1wbGVtZW50YXRpb24pIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB7XG4gICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihrZXkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvdyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgUG9ydGFsXG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BPUlRBTF9UWVBFLFxuICAgIGtleToga2V5ID09IG51bGwgPyBudWxsIDogJycgKyBrZXksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIGNvbnRhaW5lckluZm86IGNvbnRhaW5lckluZm8sXG4gICAgaW1wbGVtZW50YXRpb246IGltcGxlbWVudGF0aW9uXG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzO1xudmFyIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlO1xuXG57XG4gIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGUgPSB7fTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KSB7XG4gIGlmICghcGFyZW50Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBmaWJlciA9IGdldChwYXJlbnRDb21wb25lbnQpO1xuICB2YXIgcGFyZW50Q29udGV4dCA9IGZpbmRDdXJyZW50VW5tYXNrZWRDb250ZXh0KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgIHZhciBDb21wb25lbnQgPSBmaWJlci50eXBlO1xuXG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCBDb21wb25lbnQsIHBhcmVudENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJlbnRDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlV2l0aFdhcm5pbmcoY29tcG9uZW50LCBtZXRob2ROYW1lKSB7XG4gIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICAgIGlmIChmaWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvbmVudCkuam9pbignLCcpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArIGtleXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaG9zdEZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGhvc3RGaWJlcik7XG5cbiAgICAgICAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCBpcyBpbnNpZGUgU3RyaWN0TW9kZS4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCByZW5kZXJzIFN0cmljdE1vZGUgY2hpbGRyZW4uICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIHJlc2V0IHRvIHByZXZpb3VzIGJ1dCB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgaW5cbiAgICAgICAgICAvLyByZW5kZXIgYW5kIHRoZXJlJ3MgYW5vdGhlciB3YXJuaW5nIGZvciB0aGF0IGFueXdheS5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgICAgc2V0Q3VycmVudEZpYmVyKHByZXZpb3VzRmliZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIGh5ZHJhdGUgPSBmYWxzZTtcbiAgdmFyIGluaXRpYWxDaGlsZHJlbiA9IG51bGw7XG4gIHJldHVybiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xufVxuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgLy8gVE9ETzogUmVtb3ZlIGBjYWxsYmFja2Agd2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUuXG5jYWxsYmFjaywgY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gdHJ1ZTtcbiAgdmFyIHJvb3QgPSBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpOyAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gRmliZXJSb290IGNvbnN0cnVjdG9yXG5cbiAgcm9vdC5jb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUobnVsbCk7IC8vIFNjaGVkdWxlIHRoZSBpbml0aWFsIHJlbmRlci4gSW4gYSBoeWRyYXRpb24gcm9vdCwgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbVxuICAvLyBhIHJlZ3VsYXIgdXBkYXRlIGJlY2F1c2UgdGhlIGluaXRpYWwgcmVuZGVyIG11c3QgbWF0Y2ggd2FzIHdhcyByZW5kZXJlZFxuICAvLyBvbiB0aGUgc2VydmVyLlxuICAvLyBOT1RFOiBUaGlzIHVwZGF0ZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgaGF2ZSBhIHBheWxvYWQuIFdlJ3JlIG9ubHkgdXNpbmdcbiAgLy8gdGhlIHVwZGF0ZSB0byBzY2hlZHVsZSB3b3JrIG9uIHRoZSByb290IGZpYmVyIChhbmQsIGZvciBsZWdhY3kgcm9vdHMsIHRvXG4gIC8vIGVucXVldWUgdGhlIGNhbGxiYWNrIGlmIG9uZSBpcyBwcm92aWRlZCkuXG5cbiAgdmFyIGN1cnJlbnQgPSByb290LmN1cnJlbnQ7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCk7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCA/IGNhbGxiYWNrIDogbnVsbDtcbiAgZW5xdWV1ZVVwZGF0ZShjdXJyZW50LCB1cGRhdGUsIGxhbmUpO1xuICBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5mdW5jdGlvbiB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBvblNjaGVkdWxlUm9vdChjb250YWluZXIsIGVsZW1lbnQpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnQkMSA9IGNvbnRhaW5lci5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQkMSk7XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gIH1cblxuICB2YXIgY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG5cbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBlcnJvcignUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7ICcgKyAndHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgaXMgbm90IGFsbG93ZWQuICcgKyAnSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG4nICsgJ0NoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkgfHwgJ1Vua25vd24nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHVwZGF0ZS5wYXlsb2FkID0ge1xuICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgfTtcbiAgY2FsbGJhY2sgPSBjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrO1xuXG4gIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICB9XG5cbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQkMSwgdXBkYXRlLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50JDEsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBjdXJyZW50JDEsIGxhbmUpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNSb290SW5zdGFuY2UoY29udGFpbmVyKSB7XG4gIHZhciBjb250YWluZXJGaWJlciA9IGNvbnRhaW5lci5jdXJyZW50O1xuXG4gIGlmICghY29udGFpbmVyRmliZXIuY2hpbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEoZmliZXIpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIC8vIEZsdXNoIHRoZSBmaXJzdCBzY2hlZHVsZWQgXCJ1cGRhdGVcIi5cbiAgICAgICAgICB2YXIgbGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCk7XG4gICAgICAgICAgZmx1c2hSb290KHJvb3QsIGxhbmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIElmIHdlJ3JlIHN0aWxsIGJsb2NrZWQgYWZ0ZXIgdGhpcywgd2UgbmVlZCB0byBpbmNyZWFzZVxuICAgICAgICAvLyB0aGUgcHJpb3JpdHkgb2YgYW55IHByb21pc2VzIHJlc29sdmluZyB3aXRoaW4gdGhpc1xuICAgICAgICAvLyBib3VuZGFyeSBzbyB0aGF0IHRoZXkgbmV4dCBhdHRlbXB0IGFsc28gaGFzIGhpZ2hlciBwcmkuXG5cbiAgICAgICAgdmFyIHJldHJ5TGFuZSA9IFN5bmNMYW5lO1xuICAgICAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSkge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBoaWdoZXJQcmlvcml0eUxhbmUoc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUsIHJldHJ5TGFuZSk7XG4gIH1cbn0gLy8gSW5jcmVhc2VzIHRoZSBwcmlvcml0eSBvZiB0aGVuYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBhbmQgdGhleSBzaG91bGQgbm90IHN1c3BlbmQgb24gSS9PLFxuICAgIC8vIHNpbmNlIHlvdSBoYXZlIHRvIHdyYXAgYW55dGhpbmcgdGhhdCBtaWdodCBzdXNwZW5kIGluXG4gICAgLy8gU3VzcGVuc2UuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxhbmUgPSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxuXG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBvdGhlciB0aGFuIHN5bmNocm9ub3VzbHkgZmx1c2ggaXQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRFcnJvckltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRFcnJvcihmaWJlcikge1xuICByZXR1cm4gc2hvdWxkRXJyb3JJbXBsKGZpYmVyKTtcbn1cblxudmFyIHNob3VsZFN1c3BlbmRJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZFN1c3BlbmQoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZFN1c3BlbmRJbXBsKGZpYmVyKTtcbn1cbnZhciBvdmVycmlkZUhvb2tTdGF0ZSA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHMgPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgc2NoZWR1bGVVcGRhdGUgPSBudWxsO1xudmFyIHNldEVycm9ySGFuZGxlciA9IG51bGw7XG52YXIgc2V0U3VzcGVuc2VIYW5kbGVyID0gbnVsbDtcblxue1xuICB2YXIgY29weVdpdGhEZWxldGVJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGgpIHtcbiAgICAgIHZhciBuZXdLZXkgPSBuZXdQYXRoW2luZGV4XTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgICB1cGRhdGVkW25ld0tleV0gPSB1cGRhdGVkW29sZEtleV07XG5cbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKG9sZEtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtvbGRLZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICB1cGRhdGVkW29sZEtleV0gPSBjb3B5V2l0aFJlbmFtZUltcGwoIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIG9ialtvbGRLZXldLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZSA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKSB7XG4gICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgb2YgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdQYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBpZiAob2xkUGF0aFtpXSAhPT0gbmV3UGF0aFtpXSkge1xuICAgICAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyB0byBiZSB0aGUgc2FtZSBleGNlcHQgZm9yIHRoZSBkZWVwZXN0IGtleScpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcHlXaXRoUmVuYW1lSW1wbChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCwgdmFsdWUpIHtcbiAgICBpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhTZXRJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBjb3B5V2l0aFNldEltcGwob2JqLCBwYXRoLCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgdmFyIGZpbmRIb29rID0gZnVuY3Rpb24gKGZpYmVyLCBpZCkge1xuICAgIC8vIEZvciBub3csIHRoZSBcImlkXCIgb2Ygc3RhdGVmdWwgaG9va3MgaXMganVzdCB0aGUgc3RhdGVmdWwgaG9vayBpbmRleC5cbiAgICAvLyBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB3aXRoIGUuZy4gbmVzdGVkIGhvb2tzLlxuICAgIHZhciBjdXJyZW50SG9vayA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoY3VycmVudEhvb2sgIT09IG51bGwgJiYgaWQgPiAwKSB7XG4gICAgICBjdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gICAgICBpZC0tO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50SG9vaztcbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBlZGl0YWJsZSB2YWx1ZXMgZm9yIHVzZVN0YXRlIGFuZCB1c2VSZWR1Y2VyLlxuXG5cbiAgb3ZlcnJpZGVIb29rU3RhdGUgPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoLCB2YWx1ZSkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFNldChob29rLm1lbW9pemVkU3RhdGUsIHBhdGgsIHZhbHVlKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhSZW5hbWUoaG9vay5tZW1vaXplZFN0YXRlLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIHByb3BzIGZvciBmdW5jdGlvbiBjb21wb25lbnRzLCBmb3J3YXJkUmVmLCBtZW1vLCBob3N0IGNvbXBvbmVudHMsIGV0Yy5cblxuXG4gIG92ZXJyaWRlUHJvcHMgPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgsIHZhbHVlKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXQoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgdmFsdWUpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZShmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgb2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBzY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7XG4gICAgc2hvdWxkRXJyb3JJbXBsID0gbmV3U2hvdWxkRXJyb3JJbXBsO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldEVycm9ySGFuZGxlcjogc2V0RXJyb3JIYW5kbGVyLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBkZXRlY3QgcmVjb25jaWxlciB2ZXJzaW9uIHJhdGhlciB0aGFuIHJlbmRlcmVyIHZlcnNpb25cbiAgICAvLyB3aGljaCBtYXkgbm90IG1hdGNoIGZvciB0aGlyZCBwYXJ0eSByZW5kZXJlcnMuXG4gICAgcmVjb25jaWxlclZlcnNpb246IFJlYWN0VmVyc2lvblxuICB9KTtcbn1cblxuLyogZ2xvYmFsIHJlcG9ydEVycm9yICovXG5cbnZhciBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yID0gdHlwZW9mIHJlcG9ydEVycm9yID09PSAnZnVuY3Rpb24nID8gLy8gSW4gbW9kZXJuIGJyb3dzZXJzLCByZXBvcnRFcnJvciB3aWxsIGRpc3BhdGNoIGFuIGVycm9yIGV2ZW50LFxuLy8gZW11bGF0aW5nIGFuIHVuY2F1Z2h0IEphdmFTY3JpcHQgZXJyb3IuXG5yZXBvcnRFcnJvciA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAvLyBJbiBvbGRlciBicm93c2VycyBhbmQgdGVzdCBlbnZpcm9ubWVudHMsIGZhbGxiYWNrIHRvIGNvbnNvbGUuZXJyb3IuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgY29uc29sZVsnZXJyb3InXShlcnJvcik7XG59O1xuXG5mdW5jdGlvbiBSZWFjdERPTVJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBhbiB1bm1vdW50ZWQgcm9vdC4nKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkQ29udGFpbmVyKGFyZ3VtZW50c1sxXSkpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgY29udGFpbmVyIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2Ygcm9vdC5yZW5kZXIoLi4uKS4gJyArIFwiWW91IGRvbid0IG5lZWQgdG8gcGFzcyBpdCBhZ2FpbiBzaW5jZSB5b3UgYWxyZWFkeSBwYXNzZWQgaXQgdG8gY3JlYXRlIHRoZSByb290LlwiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIHNlY29uZCBhcmd1bWVudCB0byByb290LnJlbmRlciguLi4pIGJ1dCBpdCBvbmx5IGFjY2VwdHMgJyArICdvbmUgYXJndW1lbnQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCd1bm1vdW50KC4uLik6IGRvZXMgbm90IHN1cHBvcnQgYSBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IG51bGw7XG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIHtcbiAgICAgIGlmIChpc0FscmVhZHlSZW5kZXJpbmcoKSkge1xuICAgICAgICBlcnJvcignQXR0ZW1wdGVkIHRvIHN5bmNocm9ub3VzbHkgdW5tb3VudCBhIHJvb3Qgd2hpbGUgUmVhY3Qgd2FzIGFscmVhZHkgJyArICdyZW5kZXJpbmcuIFJlYWN0IGNhbm5vdCBmaW5pc2ggdW5tb3VudGluZyB0aGUgcm9vdCB1bnRpbCB0aGUgJyArICdjdXJyZW50IHJlbmRlciBoYXMgY29tcGxldGVkLCB3aGljaCBtYXkgbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG4gIHZhciB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gbnVsbDtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgIHdhcm4oJ2h5ZHJhdGUgdGhyb3VnaCBjcmVhdGVSb290IGlzIGRlcHJlY2F0ZWQuIFVzZSBSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pIGluc3RlYWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucy4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBKU1ggZWxlbWVudCB0byBjcmVhdGVSb290LiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gJyArICdjYWxsIHJvb3QucmVuZGVyIGluc3RlYWQuICcgKyAnRXhhbXBsZSB1c2FnZTpcXG5cXG4nICsgJyAgbGV0IHJvb3QgPSBjcmVhdGVSb290KGRvbUNvbnRhaW5lcik7XFxuJyArICcgIHJvb3QucmVuZGVyKDxBcHAgLz4pOycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcztcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBudWxsLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHJldHVybiBuZXcgUmVhY3RET01Sb290KHJvb3QpO1xufVxuXG5mdW5jdGlvbiBSZWFjdERPTUh5ZHJhdGlvblJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVIeWRyYXRpb24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gIH1cbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbiA9IHNjaGVkdWxlSHlkcmF0aW9uO1xuZnVuY3Rpb24gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2h5ZHJhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG5cbiAge1xuICAgIGlmIChpbml0aWFsQ2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IoJ011c3QgcHJvdmlkZSBpbml0aWFsIGNoaWxkcmVuIGFzIHNlY29uZCBhcmd1bWVudCB0byBoeWRyYXRlUm9vdC4gJyArICdFeGFtcGxlIHVzYWdlOiBoeWRyYXRlUm9vdChkb21Db250YWluZXIsIDxBcHAgLz4pJyk7XG4gICAgfVxuICB9IC8vIEZvciBub3cgd2UgcmV1c2UgdGhlIHdob2xlIGJhZyBvZiBvcHRpb25zIHNpbmNlIHRoZXkgY29udGFpblxuICAvLyB0aGUgaHlkcmF0aW9uIGNhbGxiYWNrcy5cblxuXG4gIHZhciBoeWRyYXRpb25DYWxsYmFja3MgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDogbnVsbDsgLy8gVE9ETzogRGVsZXRlIHRoaXMgb3B0aW9uXG5cbiAgdmFyIG11dGFibGVTb3VyY2VzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0ZWRTb3VyY2VzIHx8IG51bGw7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgbnVsbCwgY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpOyAvLyBUaGlzIGNhbid0IGJlIGEgY29tbWVudCBub2RlIHNpbmNlIGh5ZHJhdGlvbiBkb2Vzbid0IHdvcmsgb24gY29tbWVudCBub2RlcyBhbnl3YXkuXG5cbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoY29udGFpbmVyKTtcblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhY3RET01IeWRyYXRpb25Sb290KHJvb3QpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8ICFkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgICkpO1xufSAvLyBUT0RPOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiB3aGljaCBhbHNvIGluY2x1ZGVzIGNvbW1lbnQgbm9kZXMuXG4vLyBXZSBvbmx5IHVzZSBpdCBpbiBwbGFjZXMgdGhhdCBhcmUgY3VycmVudGx5IG1vcmUgcmVsYXhlZC5cblxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lckxlZ2FjeShub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcignY3JlYXRlUm9vdCgpOiBDcmVhdGluZyByb290cyBkaXJlY3RseSB3aXRoIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSB1c2luZyBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikpIHtcbiAgICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NLnJlbmRlcigpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0ICcgKyAnaGFzIGFscmVhZHkgYmVlbiBwYXNzZWQgdG8gY3JlYXRlUm9vdCgpIGJlZm9yZS4gSW5zdGVhZCwgY2FsbCAnICsgJ3Jvb3QucmVuZGVyKCkgb24gdGhlIGV4aXN0aW5nIHJvb3QgaW5zdGVhZCBpZiB5b3Ugd2FudCB0byB1cGRhdGUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoaXMgJyArICdjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyAnUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSB0byBlbXB0eSBhIGNvbnRhaW5lci4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0ID0gISFjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEocm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKSk7XG5cbiAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQgJiYgIWlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogUmVwbGFjaW5nIFJlYWN0LXJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVudC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAnICsgJ3lvdSBzaG91bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUgdGhlaXIgc3RhdGUgJyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9mIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyLicpO1xuICAgIH1cblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoKTogUmVuZGVyaW5nIGNvbXBvbmVudHMgZGlyZWN0bHkgaW50byBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wT25SZWNvdmVyYWJsZUVycm9yKCkgey8vIFRoaXMgaXNuJ3QgcmVhY2hhYmxlIGJlY2F1c2Ugb25SZWNvdmVyYWJsZUVycm9yIGlzbid0IGNhbGxlZCBpbiB0aGVcbiAgLy8gbGVnYWN5IEFQSS5cbn1cblxuZnVuY3Rpb24gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gIGlmIChpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgY2FsbGJhY2ssIGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSByb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICAgIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgIGZsdXNoU3luYygpO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIC8vIEZpcnN0IGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50LlxuICAgIHZhciByb290U2libGluZztcblxuICAgIHdoaWxlIChyb290U2libGluZyA9IGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9vcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2UoX3Jvb3QpO1xuXG4gICAgICAgIF9vcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX3Jvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcblxuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gX3Jvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChfcm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuXG4gICAgdmFyIF9yb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG5cbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhfcm9vdENvbnRhaW5lckVsZW1lbnQpOyAvLyBJbml0aWFsIG1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBfcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF9yb290O1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY29udGFpbmVyLCBmb3JjZUh5ZHJhdGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzKGNvbnRhaW5lcik7XG4gICAgd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG5cbiAgdmFyIG1heWJlUm9vdCA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICB2YXIgcm9vdDtcblxuICBpZiAoIW1heWJlUm9vdCkge1xuICAgIC8vIEluaXRpYWwgbW91bnRcbiAgICByb290ID0gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgZm9yY2VIeWRyYXRlKTtcbiAgfSBlbHNlIHtcbiAgICByb290ID0gbWF5YmVSb290O1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfSAvLyBVcGRhdGVcblxuXG4gICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIHdhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcjtcblxuICAgICAgaWYgKCF3YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLmh5ZHJhdGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGh5ZHJhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLmh5ZHJhdGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9IC8vIFRPRE86IHRocm93IG9yIHdhcm4gaWYgd2UgY291bGRuJ3QgaHlkcmF0ZT9cblxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIHRydWUsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00ucmVuZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBjcmVhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlcigpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC5yZW5kZXIoZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcigpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdpbiBSZWFjdCAxOC4gQ29uc2lkZXIgdXNpbmcgYSBwb3J0YWwgaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byAnICsgXCJ0aGUgY3JlYXRlUm9vdCBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzIGlmIGl0J3MgcnVubmluZyBSZWFjdCBcIiArICcxNy4gTGVhcm4gbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyTm9kZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICBpZiAocGFyZW50Q29tcG9uZW50ID09IG51bGwgfHwgIWhhcyhwYXJlbnRDb21wb25lbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYXJlbnRDb21wb25lbnQgbXVzdCBiZSBhIHZhbGlkIFJlYWN0IENvbXBvbmVudCcpO1xuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgIHtcbiAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIHZhciByZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QgPSByb290RWwgJiYgIWdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcblxuICAgICAgaWYgKHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH0gLy8gVW5tb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEpO1xuc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkpO1xuXG57XG4gIGlmICh0eXBlb2YgTWFwICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgTWFwIGhhcyBubyBwcm90b3R5cGVcbiAgTWFwLnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBNYXAucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFNldCBoYXMgbm8gcHJvdG90eXBlXG4gIFNldC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZXJyb3IoJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICB9XG59XG5cbnNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihyZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMpO1xuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBkaXNjcmV0ZVVwZGF0ZXMsIGZsdXNoU3luYyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbCQxKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfSAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICAvLyAkRmxvd0ZpeE1lIFRoZSBGbG93IHR5cGUgaXMgb3BhcXVlIGJ1dCB0aGVyZSdzIG5vIHdheSB0byBhY3R1YWxseSBjcmVhdGUgaXQuXG5cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIsIG51bGwsIGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spO1xufVxuXG52YXIgSW50ZXJuYWxzID0ge1xuICB1c2luZ0NsaWVudEVudHJ5UG9pbnQ6IGZhbHNlLFxuICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdFRlc3RVdGlscy5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGJhdGNoZWRVcGRhdGVzJDFdXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290JDEoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgY3JlYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaHlkcmF0ZVJvb3QkMShjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGh5ZHJhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyQxKGZuKSB7XG4gIHtcbiAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgIGVycm9yKCdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIFJlYWN0IGNhbm5vdCAnICsgJ2ZsdXNoIHdoZW4gUmVhY3QgaXMgYWxyZWFkeSByZW5kZXJpbmcuIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhbGwgdG8gJyArICdhIHNjaGVkdWxlciB0YXNrIG9yIG1pY3JvIHRhc2suJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsdXNoU3luYyhmbik7XG59XG52YXIgZm91bmREZXZUb29scyA9IGluamVjdEludG9EZXZUb29scyh7XG4gIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgYnVuZGxlVHlwZTogIDEgLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOyAvLyBEb24ndCB3YXJuIGluIGV4b3RpYyBjYXNlcyBsaWtlIGNocm9tZS1leHRlbnNpb246Ly8uXG5cbiAgICAgIGlmICgvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyArIChwcm90b2NvbCA9PT0gJ2ZpbGU6JyA/ICdcXG5Zb3UgbWlnaHQgbmVlZCB0byB1c2UgYSBsb2NhbCBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBmaWxlOi8vKTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxJyA6ICcnKSwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IEludGVybmFscztcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsJDE7XG5leHBvcnRzLmNyZWF0ZVJvb3QgPSBjcmVhdGVSb290JDE7XG5leHBvcnRzLmZpbmRET01Ob2RlID0gZmluZERPTU5vZGU7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYyQxO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBoeWRyYXRlUm9vdCQxO1xuZXhwb3J0cy5yZW5kZXIgPSByZW5kZXI7XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGUgPSB1bm1vdW50Q29tcG9uZW50QXROb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA9IGJhdGNoZWRVcGRhdGVzJDE7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG4iLCAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4zLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBub29wO1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCAiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmcmVlR2xvYmFsO1xuIiwgInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsICIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiIsICJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG4iLCAidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5O1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCAidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbm1vZHVsZS5leHBvcnRzID0gY29yZUpzRGF0YTtcbiIsICJ2YXIgY29yZUpzRGF0YSA9IHJlcXVpcmUoJy4vX2NvcmVKc0RhdGEnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc01hc2tlZDtcbiIsICIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCAidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc01hc2tlZCA9IHJlcXVpcmUoJy4vX2lzTWFza2VkJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hdGl2ZTtcbiIsICIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRWYWx1ZTtcbiIsICJ2YXIgYmFzZUlzTmF0aXZlID0gcmVxdWlyZSgnLi9fYmFzZUlzTmF0aXZlJyksXG4gICAgZ2V0VmFsdWUgPSByZXF1aXJlKCcuL19nZXRWYWx1ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5hdGl2ZTtcbiIsICJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlQ3JlYXRlO1xuIiwgInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIEhhc2hcbiAqL1xuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaENsZWFyO1xuIiwgIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiIsICJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwgInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hIYXM7XG4iLCAidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuIiwgInZhciBoYXNoQ2xlYXIgPSByZXF1aXJlKCcuL19oYXNoQ2xlYXInKSxcbiAgICBoYXNoRGVsZXRlID0gcmVxdWlyZSgnLi9faGFzaERlbGV0ZScpLFxuICAgIGhhc2hHZXQgPSByZXF1aXJlKCcuL19oYXNoR2V0JyksXG4gICAgaGFzaEhhcyA9IHJlcXVpcmUoJy4vX2hhc2hIYXMnKSxcbiAgICBoYXNoU2V0ID0gcmVxdWlyZSgnLi9faGFzaFNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbkhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5IYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuIiwgIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsICIvKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcTtcbiIsICJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsICJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlR2V0O1xuIiwgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlSGFzO1xuIiwgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsICJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG4iLCAidmFyIEhhc2ggPSByZXF1aXJlKCcuL19IYXNoJyksXG4gICAgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUNsZWFyO1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG4iLCAidmFyIGlzS2V5YWJsZSA9IHJlcXVpcmUoJy4vX2lzS2V5YWJsZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFwRGF0YTtcbiIsICJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVEZWxldGU7XG4iLCAidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUdldDtcbiIsICJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsICJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlU2V0O1xuIiwgInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCAidmFyIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKlxuICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gKlxuICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIHZhbHVlcyhvdGhlcik7XG4gKiAvLyA9PiBbMywgNF1cbiAqXG4gKiBvYmplY3QuYSA9IDI7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddXG4gKlxuICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gKi9cbmZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxubWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemU7XG4iLCAidmFyIG1lbW9pemUgPSByZXF1aXJlKCcuL21lbW9pemUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xudmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG5cbiAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVDYXBwZWQ7XG4iLCAidmFyIG1lbW9pemVDYXBwZWQgPSByZXF1aXJlKCcuL19tZW1vaXplQ2FwcGVkJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG52YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoMCkgPT09IDQ2IC8qIC4gKi8pIHtcbiAgICByZXN1bHQucHVzaCgnJyk7XG4gIH1cbiAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdUb1BhdGg7XG4iLCAiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheU1hcDtcbiIsICJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG4iLCAidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCAidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgc3RyaW5nVG9QYXRoID0gcmVxdWlyZSgnLi9fc3RyaW5nVG9QYXRoJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG5mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FzdFBhdGg7XG4iLCAidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0tleTtcbiIsICJ2YXIgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IDAsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICB9XG4gIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0O1xuIiwgInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0O1xuIiwgInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcbiIsICIvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbnZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJpbW1lZEVuZEluZGV4O1xuIiwgInZhciB0cmltbWVkRW5kSW5kZXggPSByZXF1aXJlKCcuL190cmltbWVkRW5kSW5kZXgnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmdcbiAgICA/IHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKVxuICAgIDogc3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VUcmltO1xuIiwgInZhciBiYXNlVHJpbSA9IHJlcXVpcmUoJy4vX2Jhc2VUcmltJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvTnVtYmVyO1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBub3cgPSByZXF1aXJlKCcuL25vdycpLFxuICAgIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nXG4gICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG4gICAgICA6IHRpbWVXYWl0aW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsICJ2YXIgZGVib3VuY2UgPSByZXF1aXJlKCcuL2RlYm91bmNlJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICpcbiAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwge1xuICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgJ3RyYWlsaW5nJzogdHJhaWxpbmdcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iLCAiLyohXG5cdENvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLlxuXHRMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuXHRodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMgKCkge1xuXHRcdHZhciBjbGFzc2VzID0gJyc7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdGlmIChhcmcpIHtcblx0XHRcdFx0Y2xhc3NlcyA9IGFwcGVuZENsYXNzKGNsYXNzZXMsIHBhcnNlVmFsdWUoYXJnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXM7XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZVZhbHVlIChhcmcpIHtcblx0XHRpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcblx0XHRcdHJldHVybiBhcmc7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBhcmcgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKTtcblx0XHR9XG5cblx0XHRpZiAoYXJnLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICYmICFhcmcudG9TdHJpbmcudG9TdHJpbmcoKS5pbmNsdWRlcygnW25hdGl2ZSBjb2RlXScpKSB7XG5cdFx0XHRyZXR1cm4gYXJnLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNsYXNzZXMgPSAnJztcblxuXHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0Y2xhc3NlcyA9IGFwcGVuZENsYXNzKGNsYXNzZXMsIGtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXM7XG5cdH1cblxuXHRmdW5jdGlvbiBhcHBlbmRDbGFzcyAodmFsdWUsIG5ld0NsYXNzKSB7XG5cdFx0aWYgKCFuZXdDbGFzcykge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0XG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgKyAnICcgKyBuZXdDbGFzcztcblx0XHR9XG5cdFxuXHRcdHJldHVybiB2YWx1ZSArIG5ld0NsYXNzO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwgIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIHZhciBoYXMgPSByZXF1aXJlKCcuL2xpYi9oYXMnKTtcblxuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkgeyAvKiovIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZ2V0U3RhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoXG4gICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgK1xuICAgICAgICAgICAgICAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIHN0YWNrID0gZ2V0U3RhY2sgPyBnZXRTdGFjaygpIDogJyc7XG5cbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyAoc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0cyB3YXJuaW5nIGNhY2hlIHdoZW4gdGVzdGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tQcm9wVHlwZXM7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gICAqXG4gICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICAgKlxuICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICAgKiAgICAgICAuLi5cbiAgICogICAgIH1cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAgICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICAgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICAgKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gICAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAgICpcbiAgICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gICAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAgICogICAgIH0sXG4gICAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gICAqXG4gICAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICAgKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAgICpcbiAgICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICAgKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gICAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gICAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAgICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAqICAgICAgICAgICk7XG4gICAqICAgICAgICB9XG4gICAqICAgICAgfVxuICAgKiAgICB9LFxuICAgKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAgICogIH0pO1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgdmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBiaWdpbnQ6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdiaWdpbnQnKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBlbGVtZW50VHlwZTogY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpLFxuICAgIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gICAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICAgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbiAgICBleGFjdDogY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcixcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kYXRhID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhOiB7fTtcbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gIH1cbiAgLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuICBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBwcm9wIG9uIGAnICsgY29tcG9uZW50TmFtZSArICdgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArXG4gICAgICAgICAgICAgICdhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAgICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgK1xuICAgICAgICAgICAgICAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICAgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gICAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCdcbiAgICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSxcbiAgICAgICAgICB7ZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGV9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghUmVhY3RJcy5pc1ZhbGlkRWxlbWVudFR5cGUocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQgdHlwZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXksIGdvdCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICdBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHdyaXRlIG9uZU9mKHgsIHksIHopIGluc3RlYWQgb2Ygb25lT2YoW3gsIHksIHpdKS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcywgZnVuY3Rpb24gcmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgU3RyaW5nKHByb3BWYWx1ZSkgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKGhhcyhwcm9wVmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIHZhciBjaGVja2VyUmVzdWx0ID0gY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGNoZWNrZXJSZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja2VyUmVzdWx0LmRhdGEgJiYgaGFzKGNoZWNrZXJSZXN1bHQuZGF0YSwgJ2V4cGVjdGVkVHlwZScpKSB7XG4gICAgICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGNoZWNrZXJSZXN1bHQuZGF0YS5leHBlY3RlZFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZXhwZWN0ZWRUeXBlc01lc3NhZ2UgPSAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPiAwKSA/ICcsIGV4cGVjdGVkIG9uZSBvZiB0eXBlIFsnICsgZXhwZWN0ZWRUeXBlcy5qb2luKCcsICcpICsgJ10nOiAnJztcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AnICsgZXhwZWN0ZWRUeXBlc01lc3NhZ2UgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIHR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHByb3BGdWxsTmFtZSArICcuJyArIGtleSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZSArICdgLidcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCBnZXRQcmVjaXNlVHlwZShjaGVja2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBhbGwga2V5cyBpbiBjYXNlIHNvbWUgYXJlIHJlcXVpcmVkIGJ1dCBtaXNzaW5nIGZyb20gcHJvcHMuXG4gICAgICB2YXIgYWxsS2V5cyA9IGFzc2lnbih7fSwgcHJvcHNbcHJvcE5hbWVdLCBzaGFwZVR5cGVzKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhbGxLZXlzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoaGFzKHNoYXBlVHlwZXMsIGtleSkgJiYgdHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgZ2V0UHJlY2lzZVR5cGUoY2hlY2tlcikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHNoYXBlVHlwZXMpLCBudWxsLCAnICAnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGZhbHN5IHZhbHVlIGNhbid0IGJlIGEgU3ltYm9sXG4gICAgaWYgKCFwcm9wVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoUmVhY3RJcy5pc0VsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiIsICIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc051bGwobnVsbCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bGwodm9pZCAwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOdWxsO1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmluZztcbiIsICJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tDbGVhcjtcbiIsICIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgcmVzdWx0ID0gZGF0YVsnZGVsZXRlJ10oa2V5KTtcblxuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tEZWxldGU7XG4iLCAiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrR2V0O1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tIYXM7XG4iLCAidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gIH1cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tTZXQ7XG4iLCAidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0eTtcbiIsICJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcbiIsICJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAqIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduTWVyZ2VWYWx1ZTtcbiIsICIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwgInZhciBjcmVhdGVCYXNlRm9yID0gcmVxdWlyZSgnLi9fY3JlYXRlQmFzZUZvcicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xudmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvcjtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBhbGxvY1Vuc2FmZSA/IGFsbG9jVW5zYWZlKGxlbmd0aCkgOiBuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUJ1ZmZlcjtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5O1xuIiwgInZhciBVaW50OEFycmF5ID0gcmVxdWlyZSgnLi9fVWludDhBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlCdWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVBcnJheUJ1ZmZlcjtcbiIsICJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVR5cGVkQXJyYXk7XG4iLCAiLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weUFycmF5O1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xudmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgIH1cbiAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ3JlYXRlO1xuIiwgIi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJBcmc7XG4iLCAidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsICIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iLCAidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqL1xuZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzQXJndW1lbnRzO1xuIiwgInZhciBiYXNlSXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL19iYXNlSXNBcmd1bWVudHMnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiIsICIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLCAidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCAidmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZU9iamVjdDtcbiIsICIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwgInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpLFxuICAgIHN0dWJGYWxzZSA9IHJlcXVpcmUoJy4vc3R1YkZhbHNlJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZmZlcjtcbiIsICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwgInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vZGVVdGlsO1xuIiwgInZhciBiYXNlSXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fYmFzZUlzVHlwZWRBcnJheScpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUeXBlZEFycmF5O1xuIiwgIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJyAmJiB0eXBlb2Ygb2JqZWN0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVHZXQ7XG4iLCAidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnblZhbHVlO1xuIiwgInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iLCAiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW5kZXg7XG4iLCAidmFyIGJhc2VUaW1lcyA9IHJlcXVpcmUoJy4vX2Jhc2VUaW1lcycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKSxcbiAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSh2YWx1ZSksXG4gICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoXG4gICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLlxuICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHxcbiAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICApKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUxpa2VLZXlzO1xuIiwgIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXNJbjtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIG5hdGl2ZUtleXNJbiA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gIH1cbiAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzSW47XG4iLCAidmFyIGFycmF5TGlrZUtleXMgPSByZXF1aXJlKCcuL19hcnJheUxpa2VLZXlzJyksXG4gICAgYmFzZUtleXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzSW4nKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5c0luKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5c0luO1xuIiwgInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwgInZhciBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGNsb25lQnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVCdWZmZXInKSxcbiAgICBjbG9uZVR5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19jbG9uZVR5cGVkQXJyYXknKSxcbiAgICBjb3B5QXJyYXkgPSByZXF1aXJlKCcuL19jb3B5QXJyYXknKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNBcnJheUxpa2VPYmplY3QgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlT2JqZWN0JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL2lzUGxhaW5PYmplY3QnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0JyksXG4gICAgdG9QbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vdG9QbGFpbk9iamVjdCcpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksXG4gICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgaWYgKHN0YWNrZWQpIHtcbiAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICA6IHVuZGVmaW5lZDtcblxuICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gIGlmIChpc0NvbW1vbikge1xuICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNDb21tb24pIHtcbiAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spO1xuICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gIH1cbiAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNZXJnZURlZXA7XG4iLCAidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqXG4gKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcbiIsICIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCAidmFyIGFwcGx5ID0gcmVxdWlyZSgnLi9fYXBwbHknKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyUmVzdDtcbiIsICIvKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb25zdGFudDtcbiIsICJ2YXIgY29uc3RhbnQgPSByZXF1aXJlKCcuL2NvbnN0YW50JyksXG4gICAgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAnd3JpdGFibGUnOiB0cnVlXG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2V0VG9TdHJpbmc7XG4iLCAiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3J0T3V0O1xuIiwgInZhciBiYXNlU2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlU2V0VG9TdHJpbmcnKSxcbiAgICBzaG9ydE91dCA9IHJlcXVpcmUoJy4vX3Nob3J0T3V0Jyk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9TdHJpbmc7XG4iLCAidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpLFxuICAgIG92ZXJSZXN0ID0gcmVxdWlyZSgnLi9fb3ZlclJlc3QnKSxcbiAgICBzZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX3NldFRvU3RyaW5nJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZXN0O1xuIiwgInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KVxuICAgICAgKSB7XG4gICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJdGVyYXRlZUNhbGw7XG4iLCAidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCAidmFyIGJhc2VNZXJnZSA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZScpLFxuICAgIGNyZWF0ZUFzc2lnbmVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQXNzaWduZXInKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7XG4gKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gKiB9O1xuICpcbiAqIHZhciBvdGhlciA9IHtcbiAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAqIH07XG4gKlxuICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAqL1xudmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2U7XG4iLCAiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RWFjaDtcbiIsICJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXM7XG4iLCAidmFyIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5cycpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXM7XG4iLCAidmFyIGFycmF5TGlrZUtleXMgPSByZXF1aXJlKCcuL19hcnJheUxpa2VLZXlzJyksXG4gICAgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzO1xuIiwgInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ247XG4iLCAidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25JbjtcbiIsICIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlGaWx0ZXI7XG4iLCAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViQXJyYXk7XG4iLCAidmFyIGFycmF5RmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXlGaWx0ZXInKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9scztcbiIsICJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHM7XG4iLCAiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcbiIsICJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChvYmplY3QpIHtcbiAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHNJbjtcbiIsICJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKTtcblxuLyoqXG4gKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW1ib2xzSW47XG4iLCAidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRBbGxLZXlzO1xuIiwgInZhciBiYXNlR2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRBbGxLZXlzJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5cztcbiIsICJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUocm9vdCwgJ0RhdGFWaWV3Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVZpZXc7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBQcm9taXNlID0gZ2V0TmF0aXZlKHJvb3QsICdQcm9taXNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcbiIsICJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFNldCA9IGdldE5hdGl2ZShyb290LCAnU2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0O1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCAidmFyIERhdGFWaWV3ID0gcmVxdWlyZSgnLi9fRGF0YVZpZXcnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBQcm9taXNlID0gcmVxdWlyZSgnLi9fUHJvbWlzZScpLFxuICAgIFNldCA9IHJlcXVpcmUoJy4vX1NldCcpLFxuICAgIFdlYWtNYXAgPSByZXF1aXJlKCcuL19XZWFrTWFwJyksXG4gICAgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG52YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxuICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXG4gICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBgdG9TdHJpbmdUYWdgIG9mIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xudmFyIGdldFRhZyA9IGJhc2VHZXRUYWc7XG5cbi8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbmlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKSAhPSBtYXBUYWcpIHx8XG4gICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAoV2Vha01hcCAmJiBnZXRUYWcobmV3IFdlYWtNYXApICE9IHdlYWtNYXBUYWcpKSB7XG4gIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzogcmV0dXJuIHByb21pc2VUYWc7XG4gICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VGFnO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQXJyYXk7XG4iLCAidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBkYXRhVmlld2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhVmlldyBUaGUgZGF0YSB2aWV3IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICByZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlciwgZGF0YVZpZXcuYnl0ZU9mZnNldCwgZGF0YVZpZXcuYnl0ZUxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVEYXRhVmlldztcbiIsICIvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUZsYWdzID0gL1xcdyokLztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lUmVnRXhwO1xuIiwgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuIiwgInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpLFxuICAgIGNsb25lRGF0YVZpZXcgPSByZXF1aXJlKCcuL19jbG9uZURhdGFWaWV3JyksXG4gICAgY2xvbmVSZWdFeHAgPSByZXF1aXJlKCcuL19jbG9uZVJlZ0V4cCcpLFxuICAgIGNsb25lU3ltYm9sID0gcmVxdWlyZSgnLi9fY2xvbmVTeW1ib2wnKSxcbiAgICBjbG9uZVR5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19jbG9uZVR5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgIGNhc2UgaW50OFRhZzogY2FzZSBpbnQxNlRhZzogY2FzZSBpbnQzMlRhZzpcbiAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpO1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQnlUYWc7XG4iLCAidmFyIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gbWFwVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc01hcDtcbiIsICJ2YXIgYmFzZUlzTWFwID0gcmVxdWlyZSgnLi9fYmFzZUlzTWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc01hcChuZXcgTWFwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIiwgInZhciBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHNldFRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNTZXQ7XG4iLCAidmFyIGJhc2VJc1NldCA9IHJlcXVpcmUoJy4vX2Jhc2VJc1NldCcpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFNldGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTZXQobmV3IFNldCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1NldDtcbiIsICJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbicpLFxuICAgIGJhc2VBc3NpZ25JbiA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25JbicpLFxuICAgIGNsb25lQnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVCdWZmZXInKSxcbiAgICBjb3B5QXJyYXkgPSByZXF1aXJlKCcuL19jb3B5QXJyYXknKSxcbiAgICBjb3B5U3ltYm9scyA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzJyksXG4gICAgY29weVN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzSW4nKSxcbiAgICBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpLFxuICAgIGdldEFsbEtleXNJbiA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXNJbicpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGluaXRDbG9uZUFycmF5ID0gcmVxdWlyZSgnLi9faW5pdENsb25lQXJyYXknKSxcbiAgICBpbml0Q2xvbmVCeVRhZyA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZUJ5VGFnJyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzTWFwID0gcmVxdWlyZSgnLi9pc01hcCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU2V0ID0gcmVxdWlyZSgnLi9pc1NldCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG52YXIgY2xvbmVhYmxlVGFncyA9IHt9O1xuY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbmNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPVxuY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID1cbmNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG5jbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gRGVlcCBjbG9uZVxuICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gKiAgNCAtIENsb25lIHN5bWJvbHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gIHZhciByZXN1bHQsXG4gICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRyxcbiAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZSk7XG4gIH1cbiAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgaWYgKGlzQXJyKSB7XG4gICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgIGlmICghaXNEZWVwKSB7XG4gICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlLCByZXN1bHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTtcbiAgICB9XG4gICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKVxuICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgaWYgKHN0YWNrZWQpIHtcbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHtcbiAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ2xvbmU7XG4iLCAiLyoqXG4gKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFzdDtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gIH1cbiAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kO1xuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5ndGg7XG4gIH1cbiAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNsaWNlO1xuIiwgInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTbGljZSA9IHJlcXVpcmUoJy4vX2Jhc2VTbGljZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGFyZW50IHZhbHVlLlxuICovXG5mdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA8IDIgPyBvYmplY3QgOiBiYXNlR2V0KG9iamVjdCwgYmFzZVNsaWNlKHBhdGgsIDAsIC0xKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwgInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgbGFzdCA9IHJlcXVpcmUoJy4vbGFzdCcpLFxuICAgIHBhcmVudCA9IHJlcXVpcmUoJy4vX3BhcmVudCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bnNldGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCB0byB1bnNldC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IGRlbGV0ZSBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VVbnNldDtcbiIsICJ2YXIgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vaXNQbGFpbk9iamVjdCcpO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub21pdGAgdG8gY3VzdG9taXplIGl0cyBgXy5jbG9uZURlZXBgIHVzZSB0byBvbmx5IGNsb25lIHBsYWluXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVuY2xvbmVkIHZhbHVlIG9yIGB1bmRlZmluZWRgIHRvIGRlZmVyIGNsb25pbmcgdG8gYF8uY2xvbmVEZWVwYC5cbiAqL1xuZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGN1c3RvbU9taXRDbG9uZTtcbiIsICJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZsYXR0ZW5hYmxlO1xuIiwgInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0ZsYXR0ZW5hYmxlID0gcmVxdWlyZSgnLi9faXNGbGF0dGVuYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmxhdHRlbjtcbiIsICJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuO1xuIiwgInZhciBmbGF0dGVuID0gcmVxdWlyZSgnLi9mbGF0dGVuJyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXRSZXN0O1xuIiwgInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUNsb25lID0gcmVxdWlyZSgnLi9fYmFzZUNsb25lJyksXG4gICAgYmFzZVVuc2V0ID0gcmVxdWlyZSgnLi9fYmFzZVVuc2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAgY3VzdG9tT21pdENsb25lID0gcmVxdWlyZSgnLi9fY3VzdG9tT21pdENsb25lJyksXG4gICAgZmxhdFJlc3QgPSByZXF1aXJlKCcuL19mbGF0UmVzdCcpLFxuICAgIGdldEFsbEtleXNJbiA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXNJbicpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlXG4gKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2InOiAnMicgfVxuICovXG52YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHZhciBpc0RlZXAgPSBmYWxzZTtcbiAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgIGlzRGVlcCB8fCAoaXNEZWVwID0gcGF0aC5sZW5ndGggPiAxKTtcbiAgICByZXR1cm4gcGF0aDtcbiAgfSk7XG4gIGNvcHlPYmplY3Qob2JqZWN0LCBnZXRBbGxLZXlzSW4ob2JqZWN0KSwgcmVzdWx0KTtcbiAgaWYgKGlzRGVlcCkge1xuICAgIHJlc3VsdCA9IGJhc2VDbG9uZShyZXN1bHQsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX0ZMQVRfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9tT21pdENsb25lKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBiYXNlVW5zZXQocmVzdWx0LCBwYXRoc1tsZW5ndGhdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gb21pdDtcbiIsICIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNVbmRlZmluZWQodm9pZCAwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNVbmRlZmluZWQ7XG4iLCAiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuIiwgInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIiwgIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlTb21lO1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhY2hlSGFzO1xuIiwgInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9fYXJyYXlTb21lJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxBcnJheXM7XG4iLCAiLyoqXG4gKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICovXG5mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBUb0FycmF5O1xuIiwgIi8qKlxuICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9BcnJheTtcbiIsICJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vX2VxdWFsQXJyYXlzJyksXG4gICAgbWFwVG9BcnJheSA9IHJlcXVpcmUoJy4vX21hcFRvQXJyYXknKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQnlUYWc7XG4iLCAidmFyIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIG9ialByb3BzID0gZ2V0QWxsS2V5cyhvYmplY3QpLFxuICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDtcblxuICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBvYmpTdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgaWYgKG9ialN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgIHJldHVybiBvYmpTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gb2JqZWN0O1xuICB9XG4gIHZhciByZXN1bHQgPSB0cnVlO1xuICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gIHdoaWxlICgrK2luZGV4IDwgb2JqTGVuZ3RoKSB7XG4gICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgb2JqVmFsdWUsIGtleSwgb3RoZXIsIG9iamVjdCwgc3RhY2spXG4gICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICA6IGNvbXBhcmVkXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgfVxuICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBvdGhDdG9yID0gb3RoZXIuY29uc3RydWN0b3I7XG5cbiAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICgnY29uc3RydWN0b3InIGluIG9iamVjdCAmJiAnY29uc3RydWN0b3InIGluIG90aGVyKSAmJlxuICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsT2JqZWN0cztcbiIsICJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9fZXF1YWxBcnJheXMnKSxcbiAgICBlcXVhbEJ5VGFnID0gcmVxdWlyZSgnLi9fZXF1YWxCeVRhZycpLFxuICAgIGVxdWFsT2JqZWN0cyA9IHJlcXVpcmUoJy4vX2VxdWFsT2JqZWN0cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcbiAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgIG9iaklzT2JqID0gZmFsc2U7XG4gIH1cbiAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spXG4gICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgfVxuICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7XG4gICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbERlZXA7XG4iLCAidmFyIGJhc2VJc0VxdWFsRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsRGVlcCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgaWYgKHZhbHVlID09PSBvdGhlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdExpa2UodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICB9XG4gIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBiYXNlSXNFcXVhbCwgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsO1xuIiwgInZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyk7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICogZXF1aXZhbGVudC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsXG4gKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gKiBub2RlcyBhcmUgY29tcGFyZWQgYnkgc3RyaWN0IGVxdWFsaXR5LCBpLmUuIGA9PT1gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogb2JqZWN0ID09PSBvdGhlcjtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRXF1YWw7XG4iLCAidmFyIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LlxuICpcbiAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICogcHJvcGVydGllcy5cbiAqXG4gKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC5cbiAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNFbXB0eShudWxsKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkodHJ1ZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KDEpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICB9XG4gIGlmIChpc1Byb3RvdHlwZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gIH1cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFbXB0eTtcbiIsICJ2YXIgYmFzZUZvciA9IHJlcXVpcmUoJy4vX2Jhc2VGb3InKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yT3duO1xuIiwgInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRWFjaDtcbiIsICJ2YXIgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBjcmVhdGVCYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUJhc2VFYWNoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKi9cbnZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VFYWNoO1xuIiwgInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYXN0RnVuY3Rpb247XG4iLCAidmFyIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBjYXN0RnVuY3Rpb24gPSByZXF1aXJlKCcuL19jYXN0RnVuY3Rpb24nKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBlbGVtZW50LlxuICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAqIG9yIGBfLmZvck93bmAgZm9yIG9iamVjdCBpdGVyYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGFsaWFzIGVhY2hcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICogQHNlZSBfLmZvckVhY2hSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICpcbiAqIF8uZm9yRWFjaCh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAqICAgY29uc29sZS5sb2coa2V5KTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFYWNoIDogYmFzZUVhY2g7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGNhc3RGdW5jdGlvbihpdGVyYXRlZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2g7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZvckVhY2gnKTtcbiIsICJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldDtcbiIsICJ2YXIgYmFzZVNldCA9IHJlcXVpcmUoJy4vX2Jhc2VTZXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICogYXJlIGNyZWF0ZWQgZm9yIGFsbCBvdGhlciBtaXNzaW5nIHByb3BlcnRpZXMuIFVzZSBgXy5zZXRXaXRoYCB0byBjdXN0b21pemVcbiAqIGBwYXRoYCBjcmVhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gKiAvLyA9PiA0XG4gKlxuICogXy5zZXQob2JqZWN0LCBbJ3gnLCAnMCcsICd5JywgJ3onXSwgNSk7XG4gKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICogLy8gPT4gNVxuICovXG5mdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldDtcbiIsICJ2YXIgYmFzZUNsb25lID0gcmVxdWlyZSgnLi9fYmFzZUNsb25lJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVXaXRoYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICogICB9XG4gKiB9XG4gKlxuICogdmFyIGVsID0gXy5jbG9uZURlZXBXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICpcbiAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAqIC8vID0+IGZhbHNlXG4gKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gKiAvLyA9PiAnQk9EWSdcbiAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAqIC8vID0+IDIwXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lRGVlcFdpdGg7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjb3B5VGV4dFRvQ2xpcGJvYXJkID0gKGlucHV0LCB7dGFyZ2V0ID0gZG9jdW1lbnQuYm9keX0gPSB7fSkgPT4ge1xuXHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcblx0Y29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuXHRlbGVtZW50LnZhbHVlID0gaW5wdXQ7XG5cblx0Ly8gUHJldmVudCBrZXlib2FyZCBmcm9tIHNob3dpbmcgb24gbW9iaWxlXG5cdGVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcblxuXHRlbGVtZW50LnN0eWxlLmNvbnRhaW4gPSAnc3RyaWN0Jztcblx0ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdGVsZW1lbnQuc3R5bGUubGVmdCA9ICctOTk5OXB4Jztcblx0ZWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxMnB0JzsgLy8gUHJldmVudCB6b29taW5nIG9uIGlPU1xuXG5cdGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXHRsZXQgb3JpZ2luYWxSYW5nZSA9IGZhbHNlO1xuXHRpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG5cdFx0b3JpZ2luYWxSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuXHR9XG5cblx0dGFyZ2V0LmFwcGVuZChlbGVtZW50KTtcblx0ZWxlbWVudC5zZWxlY3QoKTtcblxuXHQvLyBFeHBsaWNpdCBzZWxlY3Rpb24gd29ya2Fyb3VuZCBmb3IgaU9TXG5cdGVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSAwO1xuXHRlbGVtZW50LnNlbGVjdGlvbkVuZCA9IGlucHV0Lmxlbmd0aDtcblxuXHRsZXQgaXNTdWNjZXNzID0gZmFsc2U7XG5cdHRyeSB7XG5cdFx0aXNTdWNjZXNzID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcblx0fSBjYXRjaCAoXykge31cblxuXHRlbGVtZW50LnJlbW92ZSgpO1xuXG5cdGlmIChvcmlnaW5hbFJhbmdlKSB7XG5cdFx0c2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXHRcdHNlbGVjdGlvbi5hZGRSYW5nZShvcmlnaW5hbFJhbmdlKTtcblx0fVxuXG5cdC8vIEdldCB0aGUgZm9jdXMgYmFjayBvbiB0aGUgcHJldmlvdXNseSBmb2N1c2VkIGVsZW1lbnQsIGlmIGFueVxuXHRpZiAocHJldmlvdXNseUZvY3VzZWRFbGVtZW50KSB7XG5cdFx0cHJldmlvdXNseUZvY3VzZWRFbGVtZW50LmZvY3VzKCk7XG5cdH1cblxuXHRyZXR1cm4gaXNTdWNjZXNzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5VGV4dFRvQ2xpcGJvYXJkO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgZm9yIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Vcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBjb3B5VGV4dFRvQ2xpcGJvYXJkO1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAqIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNOdW1iZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bWJlcjtcbiIsICJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKSxcbiAgICBiYXNlU2V0ID0gcmVxdWlyZSgnLi9fYmFzZVNldCcpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgIHZhbHVlID0gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuXG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVBpY2tCeTtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSGFzSW47XG4iLCAidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1BhdGg7XG4iLCAidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiIsICJ2YXIgYmFzZVBpY2tCeSA9IHJlcXVpcmUoJy4vX2Jhc2VQaWNrQnknKSxcbiAgICBoYXNJbiA9IHJlcXVpcmUoJy4vaGFzSW4nKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5waWNrYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQaWNrO1xuIiwgInZhciBiYXNlUGljayA9IHJlcXVpcmUoJy4vX2Jhc2VQaWNrJyksXG4gICAgZmxhdFJlc3QgPSByZXF1aXJlKCcuL19mbGF0UmVzdCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICpcbiAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gKi9cbnZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB7fSA6IGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGljaztcbiIsICIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgSW5maW5pdGVTY3JvbGwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSW5maW5pdGVTY3JvbGwsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEluZmluaXRlU2Nyb2xsKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEluZmluaXRlU2Nyb2xsKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChJbmZpbml0ZVNjcm9sbC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEluZmluaXRlU2Nyb2xsKSkuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMuc2Nyb2xsTGlzdGVuZXIgPSBfdGhpcy5zY3JvbGxMaXN0ZW5lci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5ldmVudExpc3RlbmVyT3B0aW9ucyA9IF90aGlzLmV2ZW50TGlzdGVuZXJPcHRpb25zLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm1vdXNld2hlZWxMaXN0ZW5lciA9IF90aGlzLm1vdXNld2hlZWxMaXN0ZW5lci5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW5maW5pdGVTY3JvbGwsIFt7XG4gICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMucGFnZUxvYWRlZCA9IHRoaXMucHJvcHMucGFnZVN0YXJ0O1xuICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5ldmVudExpc3RlbmVyT3B0aW9ucygpO1xuICAgICAgdGhpcy5hdHRhY2hTY3JvbGxMaXN0ZW5lcigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmlzUmV2ZXJzZSAmJiB0aGlzLmxvYWRNb3JlKSB7XG4gICAgICAgIHZhciBwYXJlbnRFbGVtZW50ID0gdGhpcy5nZXRQYXJlbnRFbGVtZW50KHRoaXMuc2Nyb2xsQ29tcG9uZW50KTtcbiAgICAgICAgcGFyZW50RWxlbWVudC5zY3JvbGxUb3AgPSBwYXJlbnRFbGVtZW50LnNjcm9sbEhlaWdodCAtIHRoaXMuYmVmb3JlU2Nyb2xsSGVpZ2h0ICsgdGhpcy5iZWZvcmVTY3JvbGxUb3A7XG4gICAgICAgIHRoaXMubG9hZE1vcmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXR0YWNoU2Nyb2xsTGlzdGVuZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5kZXRhY2hTY3JvbGxMaXN0ZW5lcigpO1xuICAgICAgdGhpcy5kZXRhY2hNb3VzZXdoZWVsTGlzdGVuZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1Bhc3NpdmVTdXBwb3J0ZWQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Bhc3NpdmVTdXBwb3J0ZWQoKSB7XG4gICAgICB2YXIgcGFzc2l2ZSA9IGZhbHNlO1xuXG4gICAgICB2YXIgdGVzdE9wdGlvbnMgPSB7XG4gICAgICAgIGdldCBwYXNzaXZlKCkge1xuICAgICAgICAgIHBhc3NpdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgdGVzdE9wdGlvbnMpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgdGVzdE9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXNzaXZlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2V2ZW50TGlzdGVuZXJPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXZlbnRMaXN0ZW5lck9wdGlvbnMoKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMucHJvcHMudXNlQ2FwdHVyZTtcblxuICAgICAgaWYgKHRoaXMuaXNQYXNzaXZlU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICB1c2VDYXB0dXJlOiB0aGlzLnByb3BzLnVzZUNhcHR1cmUsXG4gICAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gU2V0IGEgZGVmYXV0IGxvYWRlciBmb3IgYWxsIHlvdXIgYEluZmluaXRlU2Nyb2xsYCBjb21wb25lbnRzXG5cbiAgfSwge1xuICAgIGtleTogJ3NldERlZmF1bHRMb2FkZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREZWZhdWx0TG9hZGVyKGxvYWRlcikge1xuICAgICAgdGhpcy5kZWZhdWx0TG9hZGVyID0gbG9hZGVyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2RldGFjaE1vdXNld2hlZWxMaXN0ZW5lcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaE1vdXNld2hlZWxMaXN0ZW5lcigpIHtcbiAgICAgIHZhciBzY3JvbGxFbCA9IHdpbmRvdztcbiAgICAgIGlmICh0aGlzLnByb3BzLnVzZVdpbmRvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2Nyb2xsRWwgPSB0aGlzLnNjcm9sbENvbXBvbmVudC5wYXJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgdGhpcy5tb3VzZXdoZWVsTGlzdGVuZXIsIHRoaXMub3B0aW9ucyA/IHRoaXMub3B0aW9ucyA6IHRoaXMucHJvcHMudXNlQ2FwdHVyZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGV0YWNoU2Nyb2xsTGlzdGVuZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXRhY2hTY3JvbGxMaXN0ZW5lcigpIHtcbiAgICAgIHZhciBzY3JvbGxFbCA9IHdpbmRvdztcbiAgICAgIGlmICh0aGlzLnByb3BzLnVzZVdpbmRvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2Nyb2xsRWwgPSB0aGlzLmdldFBhcmVudEVsZW1lbnQodGhpcy5zY3JvbGxDb21wb25lbnQpO1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbExpc3RlbmVyLCB0aGlzLm9wdGlvbnMgPyB0aGlzLm9wdGlvbnMgOiB0aGlzLnByb3BzLnVzZUNhcHR1cmUpO1xuICAgICAgc2Nyb2xsRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5zY3JvbGxMaXN0ZW5lciwgdGhpcy5vcHRpb25zID8gdGhpcy5vcHRpb25zIDogdGhpcy5wcm9wcy51c2VDYXB0dXJlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRQYXJlbnRFbGVtZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGFyZW50RWxlbWVudChlbCkge1xuICAgICAgdmFyIHNjcm9sbFBhcmVudCA9IHRoaXMucHJvcHMuZ2V0U2Nyb2xsUGFyZW50ICYmIHRoaXMucHJvcHMuZ2V0U2Nyb2xsUGFyZW50KCk7XG4gICAgICBpZiAoc2Nyb2xsUGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbFBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbCAmJiBlbC5wYXJlbnROb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2ZpbHRlclByb3BzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmlsdGVyUHJvcHMocHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hTY3JvbGxMaXN0ZW5lcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaFNjcm9sbExpc3RlbmVyKCkge1xuICAgICAgdmFyIHBhcmVudEVsZW1lbnQgPSB0aGlzLmdldFBhcmVudEVsZW1lbnQodGhpcy5zY3JvbGxDb21wb25lbnQpO1xuXG4gICAgICBpZiAoIXRoaXMucHJvcHMuaGFzTW9yZSB8fCAhcGFyZW50RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzY3JvbGxFbCA9IHdpbmRvdztcbiAgICAgIGlmICh0aGlzLnByb3BzLnVzZVdpbmRvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2Nyb2xsRWwgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgdGhpcy5tb3VzZXdoZWVsTGlzdGVuZXIsIHRoaXMub3B0aW9ucyA/IHRoaXMub3B0aW9ucyA6IHRoaXMucHJvcHMudXNlQ2FwdHVyZSk7XG4gICAgICBzY3JvbGxFbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbExpc3RlbmVyLCB0aGlzLm9wdGlvbnMgPyB0aGlzLm9wdGlvbnMgOiB0aGlzLnByb3BzLnVzZUNhcHR1cmUpO1xuICAgICAgc2Nyb2xsRWwuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5zY3JvbGxMaXN0ZW5lciwgdGhpcy5vcHRpb25zID8gdGhpcy5vcHRpb25zIDogdGhpcy5wcm9wcy51c2VDYXB0dXJlKTtcblxuICAgICAgaWYgKHRoaXMucHJvcHMuaW5pdGlhbExvYWQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxMaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdXNld2hlZWxMaXN0ZW5lcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdXNld2hlZWxMaXN0ZW5lcihlKSB7XG4gICAgICAvLyBQcmV2ZW50cyBDaHJvbWUgaGFuZ3Vwc1xuICAgICAgLy8gU2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NzUyNDIwNS9yYW5kb20taGlnaC1jb250ZW50LWRvd25sb2FkLXRpbWUtaW4tY2hyb21lLzQ3Njg0MjU3IzQ3Njg0MjU3XG4gICAgICBpZiAoZS5kZWx0YVkgPT09IDEgJiYgIXRoaXMuaXNQYXNzaXZlU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3Njcm9sbExpc3RlbmVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Nyb2xsTGlzdGVuZXIoKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLnNjcm9sbENvbXBvbmVudDtcbiAgICAgIHZhciBzY3JvbGxFbCA9IHdpbmRvdztcbiAgICAgIHZhciBwYXJlbnROb2RlID0gdGhpcy5nZXRQYXJlbnRFbGVtZW50KGVsKTtcblxuICAgICAgdmFyIG9mZnNldCA9IHZvaWQgMDtcbiAgICAgIGlmICh0aGlzLnByb3BzLnVzZVdpbmRvdykge1xuICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgICB2YXIgc2Nyb2xsVG9wID0gc2Nyb2xsRWwucGFnZVlPZmZzZXQgIT09IHVuZGVmaW5lZCA/IHNjcm9sbEVsLnBhZ2VZT2Zmc2V0IDogZG9jLnNjcm9sbFRvcDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNSZXZlcnNlKSB7XG4gICAgICAgICAgb2Zmc2V0ID0gc2Nyb2xsVG9wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9mZnNldCA9IHRoaXMuY2FsY3VsYXRlT2Zmc2V0KGVsLCBzY3JvbGxUb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuaXNSZXZlcnNlKSB7XG4gICAgICAgIG9mZnNldCA9IHBhcmVudE5vZGUuc2Nyb2xsVG9wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2Zmc2V0ID0gZWwuc2Nyb2xsSGVpZ2h0IC0gcGFyZW50Tm9kZS5zY3JvbGxUb3AgLSBwYXJlbnROb2RlLmNsaWVudEhlaWdodDtcbiAgICAgIH1cblxuICAgICAgLy8gSGVyZSB3ZSBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBhcyB3ZWxsIGFzIGNoZWNraW5nIHRoZSBvZmZzZXRcbiAgICAgIGlmIChvZmZzZXQgPCBOdW1iZXIodGhpcy5wcm9wcy50aHJlc2hvbGQpICYmIGVsICYmIGVsLm9mZnNldFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRldGFjaFNjcm9sbExpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMuYmVmb3JlU2Nyb2xsSGVpZ2h0ID0gcGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHRoaXMuYmVmb3JlU2Nyb2xsVG9wID0gcGFyZW50Tm9kZS5zY3JvbGxUb3A7XG4gICAgICAgIC8vIENhbGwgbG9hZE1vcmUgYWZ0ZXIgZGV0YWNoU2Nyb2xsTGlzdGVuZXIgdG8gYWxsb3cgZm9yIG5vbi1hc3luYyBsb2FkTW9yZSBmdW5jdGlvbnNcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmxvYWRNb3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5sb2FkTW9yZSh0aGlzLnBhZ2VMb2FkZWQgKz0gMSk7XG4gICAgICAgICAgdGhpcy5sb2FkTW9yZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjYWxjdWxhdGVPZmZzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjdWxhdGVPZmZzZXQoZWwsIHNjcm9sbFRvcCkge1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlVG9wUG9zaXRpb24oZWwpICsgKGVsLm9mZnNldEhlaWdodCAtIHNjcm9sbFRvcCAtIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY2FsY3VsYXRlVG9wUG9zaXRpb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjdWxhdGVUb3BQb3NpdGlvbihlbCkge1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbC5vZmZzZXRUb3AgKyB0aGlzLmNhbGN1bGF0ZVRvcFBvc2l0aW9uKGVsLm9mZnNldFBhcmVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciByZW5kZXJQcm9wcyA9IHRoaXMuZmlsdGVyUHJvcHModGhpcy5wcm9wcyk7XG5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHJlbmRlclByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGVsZW1lbnQgPSByZW5kZXJQcm9wcy5lbGVtZW50LFxuICAgICAgICAgIGhhc01vcmUgPSByZW5kZXJQcm9wcy5oYXNNb3JlLFxuICAgICAgICAgIGluaXRpYWxMb2FkID0gcmVuZGVyUHJvcHMuaW5pdGlhbExvYWQsXG4gICAgICAgICAgaXNSZXZlcnNlID0gcmVuZGVyUHJvcHMuaXNSZXZlcnNlLFxuICAgICAgICAgIGxvYWRlciA9IHJlbmRlclByb3BzLmxvYWRlcixcbiAgICAgICAgICBsb2FkTW9yZSA9IHJlbmRlclByb3BzLmxvYWRNb3JlLFxuICAgICAgICAgIHBhZ2VTdGFydCA9IHJlbmRlclByb3BzLnBhZ2VTdGFydCxcbiAgICAgICAgICByZWYgPSByZW5kZXJQcm9wcy5yZWYsXG4gICAgICAgICAgdGhyZXNob2xkID0gcmVuZGVyUHJvcHMudGhyZXNob2xkLFxuICAgICAgICAgIHVzZUNhcHR1cmUgPSByZW5kZXJQcm9wcy51c2VDYXB0dXJlLFxuICAgICAgICAgIHVzZVdpbmRvdyA9IHJlbmRlclByb3BzLnVzZVdpbmRvdyxcbiAgICAgICAgICBnZXRTY3JvbGxQYXJlbnQgPSByZW5kZXJQcm9wcy5nZXRTY3JvbGxQYXJlbnQsXG4gICAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocmVuZGVyUHJvcHMsIFsnY2hpbGRyZW4nLCAnZWxlbWVudCcsICdoYXNNb3JlJywgJ2luaXRpYWxMb2FkJywgJ2lzUmV2ZXJzZScsICdsb2FkZXInLCAnbG9hZE1vcmUnLCAncGFnZVN0YXJ0JywgJ3JlZicsICd0aHJlc2hvbGQnLCAndXNlQ2FwdHVyZScsICd1c2VXaW5kb3cnLCAnZ2V0U2Nyb2xsUGFyZW50J10pO1xuXG4gICAgICBwcm9wcy5yZWYgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBfdGhpczIuc2Nyb2xsQ29tcG9uZW50ID0gbm9kZTtcbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgIHJlZihub2RlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFyIGNoaWxkcmVuQXJyYXkgPSBbY2hpbGRyZW5dO1xuICAgICAgaWYgKGhhc01vcmUpIHtcbiAgICAgICAgaWYgKGxvYWRlcikge1xuICAgICAgICAgIGlzUmV2ZXJzZSA/IGNoaWxkcmVuQXJyYXkudW5zaGlmdChsb2FkZXIpIDogY2hpbGRyZW5BcnJheS5wdXNoKGxvYWRlcik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0TG9hZGVyKSB7XG4gICAgICAgICAgaXNSZXZlcnNlID8gY2hpbGRyZW5BcnJheS51bnNoaWZ0KHRoaXMuZGVmYXVsdExvYWRlcikgOiBjaGlsZHJlbkFycmF5LnB1c2godGhpcy5kZWZhdWx0TG9hZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbkFycmF5KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW5maW5pdGVTY3JvbGw7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5JbmZpbml0ZVNjcm9sbC5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm5vZGUuaXNSZXF1aXJlZCxcbiAgZWxlbWVudDogX3Byb3BUeXBlczIuZGVmYXVsdC5ub2RlLFxuICBoYXNNb3JlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG4gIGluaXRpYWxMb2FkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG4gIGlzUmV2ZXJzZTogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuICBsb2FkZXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQubm9kZSxcbiAgbG9hZE1vcmU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkLFxuICBwYWdlU3RhcnQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLFxuICByZWY6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcbiAgZ2V0U2Nyb2xsUGFyZW50OiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG4gIHRocmVzaG9sZDogX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsXG4gIHVzZUNhcHR1cmU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcbiAgdXNlV2luZG93OiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2xcbn07XG5JbmZpbml0ZVNjcm9sbC5kZWZhdWx0UHJvcHMgPSB7XG4gIGVsZW1lbnQ6ICdkaXYnLFxuICBoYXNNb3JlOiBmYWxzZSxcbiAgaW5pdGlhbExvYWQ6IHRydWUsXG4gIHBhZ2VTdGFydDogMCxcbiAgcmVmOiBudWxsLFxuICB0aHJlc2hvbGQ6IDI1MCxcbiAgdXNlV2luZG93OiB0cnVlLFxuICBpc1JldmVyc2U6IGZhbHNlLFxuICB1c2VDYXB0dXJlOiBmYWxzZSxcbiAgbG9hZGVyOiBudWxsLFxuICBnZXRTY3JvbGxQYXJlbnQ6IG51bGxcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBJbmZpbml0ZVNjcm9sbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuIiwgIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L0luZmluaXRlU2Nyb2xsJylcbiIsICIvKipcbiAqIEBBdXRob3I6IFN0ZXBoZW5DaGVuXG4gKiBAQ3JlYXRlIFRpbWU6IDIwMjUtMDEtMjggMDU6Mzg6MDFcbiAqIEBNb2RpZmllZCBieTogU3RlcGhlbkNoZW5cbiAqIEBNb2RpZmllZCB0aW1lOiAyMDI1LTA1LTI2IDE3OjAyOjU0XG4gKiBARGVzY3JpcHRpb246IFx1NjNEMlx1NEVGNlx1NTE2NVx1NTNFM1xuICovXG5cbmltcG9ydCB7IE5vdGljZSwgUGx1Z2luLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSAnb2JzaWRpYW4nXG5pbXBvcnQgaW50ZXJjZXB0b3IgZnJvbSAnQC9pbnRlcmNlcHRvcidcbmltcG9ydCB7IHVzZUFjY291bnRTdG9yZSB9IGZyb20gJ0Avc3RvcmUnXG5pbXBvcnQgeyBwdWJsaXNoIH0gZnJvbSAnQC9zZXJ2aWNlL3B1Ymxpc2hfcHJvY2VzcydcblxuaW1wb3J0IHsgUHVibGlzaFNldHRpbmdzVGFiIH0gZnJvbSAnQC92aWV3cy9zZXR0aW5ncydcbmltcG9ydCB7IE9wcFByb2ZpbGVWaWV3LCBWSUVXX1BST0ZJTEUgfSBmcm9tICdAL3ZpZXdzL29wcF9wcm9maWxlJ1xuaW1wb3J0IHsgQXJ0aWNsZUxpc3RWaWV3LCBWSUVXX0FSVElDTEVfTElTVCB9IGZyb20gJ0Avdmlld3MvYXJ0aWNsZV9saXN0J1xuaW1wb3J0IHsgQXJ0aWNsZURldGFpbFZpZXcsIFZJRVdfQVJUSUNMRV9ERVRBSUwgfSBmcm9tICdAL3ZpZXdzL2FydGljbGVfZGV0YWlsJ1xuXG5pbXBvcnQgJ0Avc3R5bGUvaW5kZXguY3NzJ1xuXG5jbGFzcyBQdWJsaXNoUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgYWNjb3VudFN0b3JlID0gdXNlQWNjb3VudFN0b3JlLmdldFN0YXRlKClcbiAgc2V0dGluZ3NQYWdlOiBQdWJsaXNoU2V0dGluZ3NUYWJcbiAgcHJvZmlsZVZpZXc6IE9wcFByb2ZpbGVWaWV3XG4gIGFydGljbGVEZXRhaWxWaWV3OiBBcnRpY2xlRGV0YWlsVmlld1xuXG4gIGFzeW5jIG9ubG9hZCgpIHtcbiAgICBpbnRlcmNlcHRvcih0aGlzKVxuXG4gICAgLy8gXHU2Q0U4XHU1MThDXHU2M0QyXHU0RUY2XHU4RDQ0XHU2RTkwXG4gICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpblJlc291cmNlcygpXG5cbiAgICAvLyBcdTc2N0JcdTVGNTVcbiAgICBhd2FpdCB0aGlzLmFjY291bnRTdG9yZS5sb2dpbkFjY291bnQoKVxuICB9XG5cbiAgLy8gXHU2Q0U4XHU1MThDXHU2M0QyXHU0RUY2XHU4RDQ0XHU2RTkwXG4gIGFzeW5jIHJlZ2lzdGVyUGx1Z2luUmVzb3VyY2VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFx1NkNFOFx1NTE4Q1x1ODlDNlx1NTZGRVxuICAgIHRoaXMucmVnaXN0ZXJWaWV3KFZJRVdfUFJPRklMRSwgKGxlYWYpID0+ICh0aGlzLnByb2ZpbGVWaWV3ID0gbmV3IE9wcFByb2ZpbGVWaWV3KGxlYWYpKSlcbiAgICB0aGlzLnJlZ2lzdGVyVmlldyhWSUVXX0FSVElDTEVfTElTVCwgKGxlYWYpID0+IG5ldyBBcnRpY2xlTGlzdFZpZXcobGVhZikpXG4gICAgdGhpcy5yZWdpc3RlclZpZXcoVklFV19BUlRJQ0xFX0RFVEFJTCwgKGxlYWYpID0+ICh0aGlzLmFydGljbGVEZXRhaWxWaWV3ID0gbmV3IEFydGljbGVEZXRhaWxWaWV3KGxlYWYpKSlcbiAgICB0aGlzLmFkZFJpYmJvbkljb24oJ2RpY2UnLCAnT1BQIFByb2ZpbGUnLCAoKSA9PiB0aGlzLmFjdGl2YXRlVmlldyhWSUVXX1BST0ZJTEUpKVxuXG4gICAgLy8gXHU4QkJFXHU3RjZFXHU5NzYyXHU2NzdGXG4gICAgdGhpcy5zZXR0aW5nc1BhZ2UgPSBuZXcgUHVibGlzaFNldHRpbmdzVGFiKHRoaXMpXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKHRoaXMuc2V0dGluZ3NQYWdlKVxuXG4gICAgLy8gXHU2Q0U4XHU1MThDXHU2NTg3XHU0RUY2XHU4M0RDXHU1MzU1XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW1lbnUnLCAobWVudSwgZmlsZSkgPT4ge1xuICAgICAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICAgICAgICBpdGVtXG4gICAgICAgICAgICAuc2V0VGl0bGUoJ1B1Ymxpc2gnKVxuICAgICAgICAgICAgLnNldEljb24oJ1B1Ymxpc2gnKVxuICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodXNlQWNjb3VudFN0b3JlLmdldFN0YXRlKCkuaXNMb2dpbigpKSB7XG4gICAgICAgICAgICAgICAgLy8gXHU3ODZFXHU4QkE0XHU1RjUzXHU1MjREXHU2MjUzXHU1RjAwXHU2NTg3XHU0RUY2XG4gICAgICAgICAgICAgICAgY29uc3QgZiA9IGZpbGUudmF1bHQuZ2V0RmlsZUJ5UGF0aChmaWxlLnBhdGgpXG4gICAgICAgICAgICAgICAgaWYgKCFmKSByZXR1cm5cbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgcHVibGlzaChmLCB0aGlzLmFwcClcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSgnUHVibGlzaCBzdWNjZXNzJylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSgnUHVibGlzaCBmYWlsZWQnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKCdQbGVhc2UgbG9naW4gZmlyc3QnKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICAvLyBcdTZGQzBcdTZEM0JcdTg5QzZcdTU2RkVcbiAgYXN5bmMgYWN0aXZhdGVWaWV3KHZpZXdUeXBlOiBzdHJpbmcsIHBvc2l0aW9uOiAncmlnaHQnIHwgJ2xlZnQnIHwgJ2NlbnRlcicgPSAncmlnaHQnKSB7XG4gICAgY29uc3QgeyB3b3Jrc3BhY2UgfSA9IHRoaXMuYXBwXG4gICAgbGV0IGxlYWY6IFdvcmtzcGFjZUxlYWYgfCBudWxsID0gbnVsbFxuICAgIGNvbnN0IGxlYXZlcyA9IHdvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlld1R5cGUpXG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsZWFmID0gbGVhdmVzWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdldFJpZ2h0TGVhZiA9IHtcbiAgICAgICAgcmlnaHQ6ICgpID0+IHdvcmtzcGFjZS5nZXRSaWdodExlYWYoZmFsc2UpLFxuICAgICAgICBsZWZ0OiAoKSA9PiB3b3Jrc3BhY2UuZ2V0TGVmdExlYWYoZmFsc2UpLFxuICAgICAgICBjZW50ZXI6ICgpID0+IHdvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKVxuICAgICAgfVxuICAgICAgbGVhZiA9IGdldFJpZ2h0TGVhZltwb3NpdGlvbl0oKVxuICAgICAgYXdhaXQgbGVhZiEuc2V0Vmlld1N0YXRlKHsgdHlwZTogdmlld1R5cGUsIGFjdGl2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgICB3b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmISlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJsaXNoUGx1Z2luXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmd1bWVudHMpO1xuICB9O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGJpbmQgZnJvbSAnLi9oZWxwZXJzL2JpbmQuanMnO1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG5jb25zdCB7dG9TdHJpbmd9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHtnZXRQcm90b3R5cGVPZn0gPSBPYmplY3Q7XG5jb25zdCB7aXRlcmF0b3IsIHRvU3RyaW5nVGFnfSA9IFN5bWJvbDtcblxuY29uc3Qga2luZE9mID0gKGNhY2hlID0+IHRoaW5nID0+IHtcbiAgICBjb25zdCBzdHIgPSB0b1N0cmluZy5jYWxsKHRoaW5nKTtcbiAgICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3Qga2luZE9mVGVzdCA9ICh0eXBlKSA9PiB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAodGhpbmcpID0+IGtpbmRPZih0aGluZykgPT09IHR5cGVcbn1cblxuY29uc3QgdHlwZU9mVGVzdCA9IHR5cGUgPT4gdGhpbmcgPT4gdHlwZW9mIHRoaW5nID09PSB0eXBlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3Qge2lzQXJyYXl9ID0gQXJyYXk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNVbmRlZmluZWQgPSB0eXBlT2ZUZXN0KCd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiBpc0Z1bmN0aW9uKHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNBcnJheUJ1ZmZlciA9IGtpbmRPZlRlc3QoJ0FycmF5QnVmZmVyJyk7XG5cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICBsZXQgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmIChpc0FycmF5QnVmZmVyKHZhbC5idWZmZXIpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyaW5nID0gdHlwZU9mVGVzdCgnc3RyaW5nJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGdW5jdGlvbiA9IHR5cGVPZlRlc3QoJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNOdW1iZXIgPSB0eXBlT2ZUZXN0KCdudW1iZXInKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNPYmplY3QgPSAodGhpbmcpID0+IHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCb29sZWFuXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCb29sZWFuLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCb29sZWFuID0gdGhpbmcgPT4gdGhpbmcgPT09IHRydWUgfHwgdGhpbmcgPT09IGZhbHNlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsKSA9PiB7XG4gIGlmIChraW5kT2YodmFsKSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZih2YWwpO1xuICByZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEodG9TdHJpbmdUYWcgaW4gdmFsKSAmJiAhKGl0ZXJhdG9yIGluIHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0RhdGUgPSBraW5kT2ZUZXN0KCdEYXRlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGUgPSBraW5kT2ZUZXN0KCdGaWxlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jsb2IgPSBraW5kT2ZUZXN0KCdCbG9iJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlTGlzdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlTGlzdCA9IGtpbmRPZlRlc3QoJ0ZpbGVMaXN0Jyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJlYW0gPSAodmFsKSA9PiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Zvcm1EYXRhID0gKHRoaW5nKSA9PiB7XG4gIGxldCBraW5kO1xuICByZXR1cm4gdGhpbmcgJiYgKFxuICAgICh0eXBlb2YgRm9ybURhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpbmcgaW5zdGFuY2VvZiBGb3JtRGF0YSkgfHwgKFxuICAgICAgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIChcbiAgICAgICAgKGtpbmQgPSBraW5kT2YodGhpbmcpKSA9PT0gJ2Zvcm1kYXRhJyB8fFxuICAgICAgICAvLyBkZXRlY3QgZm9ybS1kYXRhIGluc3RhbmNlXG4gICAgICAgIChraW5kID09PSAnb2JqZWN0JyAmJiBpc0Z1bmN0aW9uKHRoaW5nLnRvU3RyaW5nKSAmJiB0aGluZy50b1N0cmluZygpID09PSAnW29iamVjdCBGb3JtRGF0YV0nKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNVUkxTZWFyY2hQYXJhbXMgPSBraW5kT2ZUZXN0KCdVUkxTZWFyY2hQYXJhbXMnKTtcblxuY29uc3QgW2lzUmVhZGFibGVTdHJlYW0sIGlzUmVxdWVzdCwgaXNSZXNwb25zZSwgaXNIZWFkZXJzXSA9IFsnUmVhZGFibGVTdHJlYW0nLCAnUmVxdWVzdCcsICdSZXNwb25zZScsICdIZWFkZXJzJ10ubWFwKGtpbmRPZlRlc3QpO1xuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5jb25zdCB0cmltID0gKHN0cikgPT4gc3RyLnRyaW0gP1xuICBzdHIudHJpbSgpIDogc3RyLnJlcGxhY2UoL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLCAnJyk7XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgYG9iamAgaXMgYW4gQXJyYXkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBpbmRleCwgYW5kIGNvbXBsZXRlIGFycmF5IGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgJ29iaicgaXMgYW4gT2JqZWN0IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwga2V5LCBhbmQgY29tcGxldGUgb2JqZWN0IGZvciBlYWNoIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGZvciBlYWNoIGl0ZW1cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzID0gZmFsc2VdXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4sIHthbGxPd25LZXlzID0gZmFsc2V9ID0ge30pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaTtcbiAgbGV0IGw7XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGNvbnN0IGtleXMgPSBhbGxPd25LZXlzID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKSA6IE9iamVjdC5rZXlzKG9iaik7XG4gICAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gICAgbGV0IGtleTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmosIGtleSkge1xuICBrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIGxldCBfa2V5O1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIF9rZXkgPSBrZXlzW2ldO1xuICAgIGlmIChrZXkgPT09IF9rZXkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIF9rZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBfZ2xvYmFsID0gKCgpID0+IHtcbiAgLyplc2xpbnQgbm8tdW5kZWY6MCovXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbFRoaXM7XG4gIHJldHVybiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpXG59KSgpO1xuXG5jb25zdCBpc0NvbnRleHREZWZpbmVkID0gKGNvbnRleHQpID0+ICFpc1VuZGVmaW5lZChjb250ZXh0KSAmJiBjb250ZXh0ICE9PSBfZ2xvYmFsO1xuXG4vKipcbiAqIEFjY2VwdHMgdmFyYXJncyBleHBlY3RpbmcgZWFjaCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QsIHRoZW5cbiAqIGltbXV0YWJseSBtZXJnZXMgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBvYmplY3QgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIGtleSB0aGUgbGF0ZXIgb2JqZWN0IGluXG4gKiB0aGUgYXJndW1lbnRzIGxpc3Qgd2lsbCB0YWtlIHByZWNlZGVuY2UuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIGNvbnN0IHtjYXNlbGVzc30gPSBpc0NvbnRleHREZWZpbmVkKHRoaXMpICYmIHRoaXMgfHwge307XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBjb25zdCBhc3NpZ25WYWx1ZSA9ICh2YWwsIGtleSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldEtleSA9IGNhc2VsZXNzICYmIGZpbmRLZXkocmVzdWx0LCBrZXkpIHx8IGtleTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChyZXN1bHRbdGFyZ2V0S2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IG1lcmdlKHJlc3VsdFt0YXJnZXRLZXldLCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IG1lcmdlKHt9LCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IHZhbC5zbGljZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBhcmd1bWVudHNbaV0gJiYgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5c11cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuY29uc3QgZXh0ZW5kID0gKGEsIGIsIHRoaXNBcmcsIHthbGxPd25LZXlzfT0ge30pID0+IHtcbiAgZm9yRWFjaChiLCAodmFsLCBrZXkpID0+IHtcbiAgICBpZiAodGhpc0FyZyAmJiBpc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSwge2FsbE93bktleXN9KTtcbiAgcmV0dXJuIGE7XG59XG5cbi8qKlxuICogUmVtb3ZlIGJ5dGUgb3JkZXIgbWFya2VyLiBUaGlzIGNhdGNoZXMgRUYgQkIgQkYgKHRoZSBVVEYtOCBCT00pXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgd2l0aCBCT01cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBjb250ZW50IHZhbHVlIHdpdGhvdXQgQk9NXG4gKi9cbmNvbnN0IHN0cmlwQk9NID0gKGNvbnRlbnQpID0+IHtcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDb25zdHJ1Y3RvclxuICogQHBhcmFtIHtvYmplY3R9IFtwcm9wc11cbiAqIEBwYXJhbSB7b2JqZWN0fSBbZGVzY3JpcHRvcnNdXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGluaGVyaXRzID0gKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yLCBwcm9wcywgZGVzY3JpcHRvcnMpID0+IHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpO1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLCAnc3VwZXInLCB7XG4gICAgdmFsdWU6IHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlXG4gIH0pO1xuICBwcm9wcyAmJiBPYmplY3QuYXNzaWduKGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvcHMpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgb2JqZWN0IHdpdGggZGVlcCBwcm90b3R5cGUgY2hhaW4gdG8gYSBmbGF0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZU9iaiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gW2Rlc3RPYmpdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEJvb2xlYW59IFtmaWx0ZXJdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcEZpbHRlcl1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCB0b0ZsYXRPYmplY3QgPSAoc291cmNlT2JqLCBkZXN0T2JqLCBmaWx0ZXIsIHByb3BGaWx0ZXIpID0+IHtcbiAgbGV0IHByb3BzO1xuICBsZXQgaTtcbiAgbGV0IHByb3A7XG4gIGNvbnN0IG1lcmdlZCA9IHt9O1xuXG4gIGRlc3RPYmogPSBkZXN0T2JqIHx8IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgaWYgKHNvdXJjZU9iaiA9PSBudWxsKSByZXR1cm4gZGVzdE9iajtcblxuICBkbyB7XG4gICAgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VPYmopO1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIGlmICgoIXByb3BGaWx0ZXIgfHwgcHJvcEZpbHRlcihwcm9wLCBzb3VyY2VPYmosIGRlc3RPYmopKSAmJiAhbWVyZ2VkW3Byb3BdKSB7XG4gICAgICAgIGRlc3RPYmpbcHJvcF0gPSBzb3VyY2VPYmpbcHJvcF07XG4gICAgICAgIG1lcmdlZFtwcm9wXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZU9iaiA9IGZpbHRlciAhPT0gZmFsc2UgJiYgZ2V0UHJvdG90eXBlT2Yoc291cmNlT2JqKTtcbiAgfSB3aGlsZSAoc291cmNlT2JqICYmICghZmlsdGVyIHx8IGZpbHRlcihzb3VyY2VPYmosIGRlc3RPYmopKSAmJiBzb3VyY2VPYmogIT09IE9iamVjdC5wcm90b3R5cGUpO1xuXG4gIHJldHVybiBkZXN0T2JqO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBlbmRzIHdpdGggdGhlIGNoYXJhY3RlcnMgb2YgYSBzcGVjaWZpZWQgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IHNlYXJjaFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbj0gMF1cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgZW5kc1dpdGggPSAoc3RyLCBzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKSA9PiB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fCBwb3NpdGlvbiA+IHN0ci5sZW5ndGgpIHtcbiAgICBwb3NpdGlvbiA9IHN0ci5sZW5ndGg7XG4gIH1cbiAgcG9zaXRpb24gLT0gc2VhcmNoU3RyaW5nLmxlbmd0aDtcbiAgY29uc3QgbGFzdEluZGV4ID0gc3RyLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbik7XG4gIHJldHVybiBsYXN0SW5kZXggIT09IC0xICYmIGxhc3RJbmRleCA9PT0gcG9zaXRpb247XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG5ldyBhcnJheSBmcm9tIGFycmF5IGxpa2Ugb2JqZWN0IG9yIG51bGwgaWYgZmFpbGVkXG4gKlxuICogQHBhcmFtIHsqfSBbdGhpbmddXG4gKlxuICogQHJldHVybnMgez9BcnJheX1cbiAqL1xuY29uc3QgdG9BcnJheSA9ICh0aGluZykgPT4ge1xuICBpZiAoIXRoaW5nKSByZXR1cm4gbnVsbDtcbiAgaWYgKGlzQXJyYXkodGhpbmcpKSByZXR1cm4gdGhpbmc7XG4gIGxldCBpID0gdGhpbmcubGVuZ3RoO1xuICBpZiAoIWlzTnVtYmVyKGkpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYXJyID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGFycltpXSA9IHRoaW5nW2ldO1xuICB9XG4gIHJldHVybiBhcnI7XG59XG5cbi8qKlxuICogQ2hlY2tpbmcgaWYgdGhlIFVpbnQ4QXJyYXkgZXhpc3RzIGFuZCBpZiBpdCBkb2VzLCBpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlXG4gKiB0aGluZyBwYXNzZWQgaW4gaXMgYW4gaW5zdGFuY2Ugb2YgVWludDhBcnJheVxuICpcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX1cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBpc1R5cGVkQXJyYXkgPSAoVHlwZWRBcnJheSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiB0aGluZyA9PiB7XG4gICAgcmV0dXJuIFR5cGVkQXJyYXkgJiYgdGhpbmcgaW5zdGFuY2VvZiBUeXBlZEFycmF5O1xuICB9O1xufSkodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkpKTtcblxuLyoqXG4gKiBGb3IgZWFjaCBlbnRyeSBpbiB0aGUgb2JqZWN0LCBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBrZXkgYW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBmb3JFYWNoRW50cnkgPSAob2JqLCBmbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSBvYmogJiYgb2JqW2l0ZXJhdG9yXTtcblxuICBjb25zdCBfaXRlcmF0b3IgPSBnZW5lcmF0b3IuY2FsbChvYmopO1xuXG4gIGxldCByZXN1bHQ7XG5cbiAgd2hpbGUgKChyZXN1bHQgPSBfaXRlcmF0b3IubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBwYWlyID0gcmVzdWx0LnZhbHVlO1xuICAgIGZuLmNhbGwob2JqLCBwYWlyWzBdLCBwYWlyWzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuLyogQ2hlY2tpbmcgaWYgdGhlIGtpbmRPZlRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGFuIEhUTUxGb3JtRWxlbWVudC4gKi9cbmNvbnN0IGlzSFRNTEZvcm0gPSBraW5kT2ZUZXN0KCdIVE1MRm9ybUVsZW1lbnQnKTtcblxuY29uc3QgdG9DYW1lbENhc2UgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxcbiAgICBmdW5jdGlvbiByZXBsYWNlcihtLCBwMSwgcDIpIHtcbiAgICAgIHJldHVybiBwMS50b1VwcGVyQ2FzZSgpICsgcDI7XG4gICAgfVxuICApO1xufTtcblxuLyogQ3JlYXRpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIHByb3BlcnR5LiAqL1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSAoKHtoYXNPd25Qcm9wZXJ0eX0pID0+IChvYmosIHByb3ApID0+IGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkoT2JqZWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlZ0V4cCA9IGtpbmRPZlRlc3QoJ1JlZ0V4cCcpO1xuXG5jb25zdCByZWR1Y2VEZXNjcmlwdG9ycyA9IChvYmosIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBjb25zdCByZWR1Y2VkRGVzY3JpcHRvcnMgPSB7fTtcblxuICBmb3JFYWNoKGRlc2NyaXB0b3JzLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIGxldCByZXQ7XG4gICAgaWYgKChyZXQgPSByZWR1Y2VyKGRlc2NyaXB0b3IsIG5hbWUsIG9iaikpICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gcmV0IHx8IGRlc2NyaXB0b3I7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHJlZHVjZWREZXNjcmlwdG9ycyk7XG59XG5cbi8qKlxuICogTWFrZXMgYWxsIG1ldGhvZHMgcmVhZC1vbmx5XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKi9cblxuY29uc3QgZnJlZXplTWV0aG9kcyA9IChvYmopID0+IHtcbiAgcmVkdWNlRGVzY3JpcHRvcnMob2JqLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIC8vIHNraXAgcmVzdHJpY3RlZCBwcm9wcyBpbiBzdHJpY3QgbW9kZVxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikgJiYgWydhcmd1bWVudHMnLCAnY2FsbGVyJywgJ2NhbGxlZSddLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpbbmFtZV07XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24odmFsdWUpKSByZXR1cm47XG5cbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBmYWxzZTtcblxuICAgIGlmICgnd3JpdGFibGUnIGluIGRlc2NyaXB0b3IpIHtcbiAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICBkZXNjcmlwdG9yLnNldCA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kIFxcJycgKyBuYW1lICsgJ1xcJycpO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaXNBcnJheShhcnJheU9yU3RyaW5nKSA/IGRlZmluZShhcnJheU9yU3RyaW5nKSA6IGRlZmluZShTdHJpbmcoYXJyYXlPclN0cmluZykuc3BsaXQoZGVsaW1pdGVyKSk7XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlID0gK3ZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufVxuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW3RvU3RyaW5nVGFnXSA9PT0gJ0Zvcm1EYXRhJyAmJiB0aGluZ1tpdGVyYXRvcl0pO1xufVxuXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEFycmF5KDEwKTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UsIGkpID0+IHtcblxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihzb3VyY2UpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZighKCd0b0pTT04nIGluIHNvdXJjZSkpIHtcbiAgICAgICAgc3RhY2tbaV0gPSBzb3VyY2U7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG5cbiAgICAgICAgZm9yRWFjaChzb3VyY2UsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gdmlzaXQodmFsdWUsIGkgKyAxKTtcbiAgICAgICAgICAhaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSAmJiAodGFyZ2V0W2tleV0gPSByZWR1Y2VkVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdGFja1tpXSA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICByZXR1cm4gdmlzaXQob2JqLCAwKTtcbn1cblxuY29uc3QgaXNBc3luY0ZuID0ga2luZE9mVGVzdCgnQXN5bmNGdW5jdGlvbicpO1xuXG5jb25zdCBpc1RoZW5hYmxlID0gKHRoaW5nKSA9PlxuICB0aGluZyAmJiAoaXNPYmplY3QodGhpbmcpIHx8IGlzRnVuY3Rpb24odGhpbmcpKSAmJiBpc0Z1bmN0aW9uKHRoaW5nLnRoZW4pICYmIGlzRnVuY3Rpb24odGhpbmcuY2F0Y2gpO1xuXG4vLyBvcmlnaW5hbCBjb2RlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vRGlnaXRhbEJyYWluSlMvQXhpb3NQcm9taXNlL2Jsb2IvMTZkZWFiMTM3MTBlYzA5Nzc5OTIyMTMxZjNmYTU5NTQzMjBmODNhYi9saWIvdXRpbHMuanMjTDExLUwzNFxuXG5jb25zdCBfc2V0SW1tZWRpYXRlID0gKChzZXRJbW1lZGlhdGVTdXBwb3J0ZWQsIHBvc3RNZXNzYWdlU3VwcG9ydGVkKSA9PiB7XG4gIGlmIChzZXRJbW1lZGlhdGVTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlO1xuICB9XG5cbiAgcmV0dXJuIHBvc3RNZXNzYWdlU3VwcG9ydGVkID8gKCh0b2tlbiwgY2FsbGJhY2tzKSA9PiB7XG4gICAgX2dsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoe3NvdXJjZSwgZGF0YX0pID0+IHtcbiAgICAgIGlmIChzb3VyY2UgPT09IF9nbG9iYWwgJiYgZGF0YSA9PT0gdG9rZW4pIHtcbiAgICAgICAgY2FsbGJhY2tzLmxlbmd0aCAmJiBjYWxsYmFja3Muc2hpZnQoKSgpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcblxuICAgIHJldHVybiAoY2IpID0+IHtcbiAgICAgIGNhbGxiYWNrcy5wdXNoKGNiKTtcbiAgICAgIF9nbG9iYWwucG9zdE1lc3NhZ2UodG9rZW4sIFwiKlwiKTtcbiAgICB9XG4gIH0pKGBheGlvc0Ake01hdGgucmFuZG9tKCl9YCwgW10pIDogKGNiKSA9PiBzZXRUaW1lb3V0KGNiKTtcbn0pKFxuICB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nLFxuICBpc0Z1bmN0aW9uKF9nbG9iYWwucG9zdE1lc3NhZ2UpXG4pO1xuXG5jb25zdCBhc2FwID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrICE9PSAndW5kZWZpbmVkJyA/XG4gIHF1ZXVlTWljcm90YXNrLmJpbmQoX2dsb2JhbCkgOiAoIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLm5leHRUaWNrIHx8IF9zZXRJbW1lZGlhdGUpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKipcblxuXG5jb25zdCBpc0l0ZXJhYmxlID0gKHRoaW5nKSA9PiB0aGluZyAhPSBudWxsICYmIGlzRnVuY3Rpb24odGhpbmdbaXRlcmF0b3JdKTtcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmcsXG4gIGlzTnVtYmVyLFxuICBpc0Jvb2xlYW4sXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1JlcXVlc3QsXG4gIGlzUmVzcG9uc2UsXG4gIGlzSGVhZGVycyxcbiAgaXNVbmRlZmluZWQsXG4gIGlzRGF0ZSxcbiAgaXNGaWxlLFxuICBpc0Jsb2IsXG4gIGlzUmVnRXhwLFxuICBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzVHlwZWRBcnJheSxcbiAgaXNGaWxlTGlzdCxcbiAgZm9yRWFjaCxcbiAgbWVyZ2UsXG4gIGV4dGVuZCxcbiAgdHJpbSxcbiAgc3RyaXBCT00sXG4gIGluaGVyaXRzLFxuICB0b0ZsYXRPYmplY3QsXG4gIGtpbmRPZixcbiAga2luZE9mVGVzdCxcbiAgZW5kc1dpdGgsXG4gIHRvQXJyYXksXG4gIGZvckVhY2hFbnRyeSxcbiAgbWF0Y2hBbGwsXG4gIGlzSFRNTEZvcm0sXG4gIGhhc093blByb3BlcnR5LFxuICBoYXNPd25Qcm9wOiBoYXNPd25Qcm9wZXJ0eSwgLy8gYW4gYWxpYXMgdG8gYXZvaWQgRVNMaW50IG5vLXByb3RvdHlwZS1idWlsdGlucyBkZXRlY3Rpb25cbiAgcmVkdWNlRGVzY3JpcHRvcnMsXG4gIGZyZWV6ZU1ldGhvZHMsXG4gIHRvT2JqZWN0U2V0LFxuICB0b0NhbWVsQ2FzZSxcbiAgbm9vcCxcbiAgdG9GaW5pdGVOdW1iZXIsXG4gIGZpbmRLZXksXG4gIGdsb2JhbDogX2dsb2JhbCxcbiAgaXNDb250ZXh0RGVmaW5lZCxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGUsXG4gIHNldEltbWVkaWF0ZTogX3NldEltbWVkaWF0ZSxcbiAgYXNhcCxcbiAgaXNJdGVyYWJsZVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnXSBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBBeGlvc0Vycm9yKG1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9ICdBeGlvc0Vycm9yJztcbiAgY29kZSAmJiAodGhpcy5jb2RlID0gY29kZSk7XG4gIGNvbmZpZyAmJiAodGhpcy5jb25maWcgPSBjb25maWcpO1xuICByZXF1ZXN0ICYmICh0aGlzLnJlcXVlc3QgPSByZXF1ZXN0KTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzID8gcmVzcG9uc2Uuc3RhdHVzIDogbnVsbDtcbiAgfVxufVxuXG51dGlscy5pbmhlcml0cyhBeGlvc0Vycm9yLCBFcnJvciwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB1dGlscy50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1c1xuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc0Vycm9yLnByb3RvdHlwZTtcbmNvbnN0IGRlc2NyaXB0b3JzID0ge307XG5cbltcbiAgJ0VSUl9CQURfT1BUSU9OX1ZBTFVFJyxcbiAgJ0VSUl9CQURfT1BUSU9OJyxcbiAgJ0VDT05OQUJPUlRFRCcsXG4gICdFVElNRURPVVQnLFxuICAnRVJSX05FVFdPUksnLFxuICAnRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUycsXG4gICdFUlJfREVQUkVDQVRFRCcsXG4gICdFUlJfQkFEX1JFU1BPTlNFJyxcbiAgJ0VSUl9CQURfUkVRVUVTVCcsXG4gICdFUlJfQ0FOQ0VMRUQnLFxuICAnRVJSX05PVF9TVVBQT1JUJyxcbiAgJ0VSUl9JTlZBTElEX1VSTCdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5dLmZvckVhY2goY29kZSA9PiB7XG4gIGRlc2NyaXB0b3JzW2NvZGVdID0ge3ZhbHVlOiBjb2RlfTtcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBeGlvc0Vycm9yLCBkZXNjcmlwdG9ycyk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG5cbiAgdXRpbHMudG9GbGF0T2JqZWN0KGVycm9yLCBheGlvc0Vycm9yLCBmdW5jdGlvbiBmaWx0ZXIob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAhPT0gRXJyb3IucHJvdG90eXBlO1xuICB9LCBwcm9wID0+IHtcbiAgICByZXR1cm4gcHJvcCAhPT0gJ2lzQXhpb3NFcnJvcic7XG4gIH0pO1xuXG4gIEF4aW9zRXJyb3IuY2FsbChheGlvc0Vycm9yLCBlcnJvci5tZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKTtcblxuICBheGlvc0Vycm9yLmNhdXNlID0gZXJyb3I7XG5cbiAgYXhpb3NFcnJvci5uYW1lID0gZXJyb3IubmFtZTtcblxuICBjdXN0b21Qcm9wcyAmJiBPYmplY3QuYXNzaWduKGF4aW9zRXJyb3IsIGN1c3RvbVByb3BzKTtcblxuICByZXR1cm4gYXhpb3NFcnJvcjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zRXJyb3I7XG4iLCAiaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1EYXRhO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG4vLyB0ZW1wb3JhcnkgaG90Zml4IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMgdW50aWwgQXhpb3NVUkxTZWFyY2hQYXJhbXMgaXMgcmVmYWN0b3JlZFxuaW1wb3J0IFBsYXRmb3JtRm9ybURhdGEgZnJvbSAnLi4vcGxhdGZvcm0vbm9kZS9jbGFzc2VzL0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscy5pc1BsYWluT2JqZWN0KHRoaW5nKSB8fCB1dGlscy5pc0FycmF5KHRoaW5nKTtcbn1cblxuLyoqXG4gKiBJdCByZW1vdmVzIHRoZSBicmFja2V0cyBmcm9tIHRoZSBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBrZXkgd2l0aG91dCB0aGUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUJyYWNrZXRzKGtleSkge1xuICByZXR1cm4gdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGguY29uY2F0KGtleSkubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0b2tlbiA9IHJlbW92ZUJyYWNrZXRzKHRva2VuKTtcbiAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gIH0pLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscy5pc0FycmF5KGFycikgJiYgIWFyci5zb21lKGlzVmlzaXRhYmxlKTtcbn1cblxuY29uc3QgcHJlZGljYXRlcyA9IHV0aWxzLnRvRmxhdE9iamVjdCh1dGlscywge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBmb3JtRGF0YSA9IGZvcm1EYXRhIHx8IG5ldyAoUGxhdGZvcm1Gb3JtRGF0YSB8fCBGb3JtRGF0YSkoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgb3B0aW9ucyA9IHV0aWxzLnRvRmxhdE9iamVjdChvcHRpb25zLCB7XG4gICAgbWV0YVRva2VuczogdHJ1ZSxcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBpbmRleGVzOiBmYWxzZVxuICB9LCBmYWxzZSwgZnVuY3Rpb24gZGVmaW5lZChvcHRpb24sIHNvdXJjZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgIHJldHVybiAhdXRpbHMuaXNVbmRlZmluZWQoc291cmNlW29wdGlvbl0pO1xuICB9KTtcblxuICBjb25zdCBtZXRhVG9rZW5zID0gb3B0aW9ucy5tZXRhVG9rZW5zO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgY29uc3QgdmlzaXRvciA9IG9wdGlvbnMudmlzaXRvciB8fCBkZWZhdWx0VmlzaXRvcjtcbiAgY29uc3QgZG90cyA9IG9wdGlvbnMuZG90cztcbiAgY29uc3QgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcztcbiAgY29uc3QgX0Jsb2IgPSBvcHRpb25zLkJsb2IgfHwgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2I7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscy5pc1NwZWNDb21wbGlhbnRGb3JtKGZvcm1EYXRhKTtcblxuICBpZiAoIXV0aWxzLmlzRnVuY3Rpb24odmlzaXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJyc7XG5cbiAgICBpZiAodXRpbHMuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghdXNlQmxvYiAmJiB1dGlscy5pc0Jsb2IodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgfHwgdXRpbHMuaXNUeXBlZEFycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVzZUJsb2IgJiYgdHlwZW9mIEJsb2IgPT09ICdmdW5jdGlvbicgPyBuZXcgQmxvYihbdmFsdWVdKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCB2aXNpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0ga2V5XG4gICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfE51bWJlcj59IHBhdGhcbiAgICogQHRoaXMge0Zvcm1EYXRhfVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGVhY2ggcHJvcCBvZiB0aGUgdmFsdWUgcmVjdXJzaXZlbHlcbiAgICovXG4gIGZ1bmN0aW9uIGRlZmF1bHRWaXNpdG9yKHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBsZXQgYXJyID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgIXBhdGggJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHV0aWxzLmVuZHNXaXRoKGtleSwgJ3t9JykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IG1ldGFUb2tlbnMgPyBrZXkgOiBrZXkuc2xpY2UoMCwgLTIpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAodXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgaXNGbGF0QXJyYXkodmFsdWUpKSB8fFxuICAgICAgICAoKHV0aWxzLmlzRmlsZUxpc3QodmFsdWUpIHx8IHV0aWxzLmVuZHNXaXRoKGtleSwgJ1tdJykpICYmIChhcnIgPSB1dGlscy50b0FycmF5KHZhbHVlKSlcbiAgICAgICAgKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gcmVtb3ZlQnJhY2tldHMoa2V5KTtcblxuICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiBlYWNoKGVsLCBpbmRleCkge1xuICAgICAgICAgICEodXRpbHMuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIGluZGV4ZXMgPT09IHRydWUgPyByZW5kZXJLZXkoW2tleV0sIGluZGV4LCBkb3RzKSA6IChpbmRleGVzID09PSBudWxsID8ga2V5IDoga2V5ICsgJ1tdJyksXG4gICAgICAgICAgICBjb252ZXJ0VmFsdWUoZWwpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNWaXNpdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQocmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cyksIGNvbnZlcnRWYWx1ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc3RhY2sgPSBbXTtcblxuICBjb25zdCBleHBvc2VkSGVscGVycyA9IE9iamVjdC5hc3NpZ24ocHJlZGljYXRlcywge1xuICAgIGRlZmF1bHRWaXNpdG9yLFxuICAgIGNvbnZlcnRWYWx1ZSxcbiAgICBpc1Zpc2l0YWJsZVxuICB9KTtcblxuICBmdW5jdGlvbiBidWlsZCh2YWx1ZSwgcGF0aCkge1xuICAgIGlmICh1dGlscy5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybjtcblxuICAgIGlmIChzdGFjay5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIHRocm93IEVycm9yKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJyArIHBhdGguam9pbignLicpKTtcbiAgICB9XG5cbiAgICBzdGFjay5wdXNoKHZhbHVlKTtcblxuICAgIHV0aWxzLmZvckVhY2godmFsdWUsIGZ1bmN0aW9uIGVhY2goZWwsIGtleSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gISh1dGlscy5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIHZpc2l0b3IuY2FsbChcbiAgICAgICAgZm9ybURhdGEsIGVsLCB1dGlscy5pc1N0cmluZyhrZXkpID8ga2V5LnRyaW0oKSA6IGtleSwgcGF0aCwgZXhwb3NlZEhlbHBlcnNcbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgYnVpbGQoZWwsIHBhdGggPyBwYXRoLmNvbmNhdChrZXkpIDogW2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc3RhY2sucG9wKCk7XG4gIH1cblxuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBidWlsZChvYmopO1xuXG4gIHJldHVybiBmb3JtRGF0YTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdG9Gb3JtRGF0YTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUoc3RyKSB7XG4gIGNvbnN0IGNoYXJNYXAgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICBcIidcIjogJyUyNycsXG4gICAgJygnOiAnJTI4JyxcbiAgICAnKSc6ICclMjknLFxuICAgICd+JzogJyU3RScsXG4gICAgJyUyMCc6ICcrJyxcbiAgICAnJTAwJzogJ1xceDAwJ1xuICB9O1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csIGZ1bmN0aW9uIHJlcGxhY2VyKG1hdGNoKSB7XG4gICAgcmV0dXJuIGNoYXJNYXBbbWF0Y2hdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhcmFtcyBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBGb3JtRGF0YSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBBeGlvcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKSB7XG4gIHRoaXMuX3BhaXJzID0gW107XG5cbiAgcGFyYW1zICYmIHRvRm9ybURhdGEocGFyYW1zLCB0aGlzLCBvcHRpb25zKTtcbn1cblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xuXG5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMuX3BhaXJzLnB1c2goW25hbWUsIHZhbHVlXSk7XG59O1xuXG5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhlbmNvZGVyKSB7XG4gIGNvbnN0IF9lbmNvZGUgPSBlbmNvZGVyID8gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2Rlci5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGUpO1xuICB9IDogZW5jb2RlO1xuXG4gIHJldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgcmV0dXJuIF9lbmNvZGUocGFpclswXSkgKyAnPScgKyBfZW5jb2RlKHBhaXJbMV0pO1xuICB9LCAnJykuam9pbignJicpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4uL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMnO1xuXG4vKipcbiAqIEl0IHJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGNoYXJhY3RlcnMgYDpgLCBgJGAsIGAsYCwgYCtgLCBgW2AsIGFuZCBgXWAgd2l0aCB0aGVpclxuICogVVJJIGVuY29kZWQgY291bnRlcnBhcnRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCBUaGUgdmFsdWUgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEBwYXJhbSB7PyhvYmplY3R8RnVuY3Rpb24pfSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGlmICh1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIHNlcmlhbGl6ZTogb3B0aW9uc1xuICAgIH07XG4gIH0gXG5cbiAgY29uc3Qgc2VyaWFsaXplRm4gPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplO1xuXG4gIGxldCBzZXJpYWxpemVkUGFyYW1zO1xuXG4gIGlmIChzZXJpYWxpemVGbikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBzZXJpYWxpemVGbihwYXJhbXMsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSB1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpID9cbiAgICAgIHBhcmFtcy50b1N0cmluZygpIDpcbiAgICAgIG5ldyBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpLnRvU3RyaW5nKF9lbmNvZGUpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICBjb25zdCBoYXNobWFya0luZGV4ID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuXG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbmNsYXNzIEludGVyY2VwdG9yTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICAgKi9cbiAgdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgICAgZnVsZmlsbGVkLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcbiAgICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnRlcmNlcHRvciB3YXMgcmVtb3ZlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIGVqZWN0KGlkKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICAgKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmb3JFYWNoKGZuKSB7XG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgICBmbihoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmNlcHRvck1hbmFnZXI7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNpbGVudEpTT05QYXJzaW5nOiB0cnVlLFxuICBmb3JjZWRKU09OUGFyc2luZzogdHJ1ZSxcbiAgY2xhcmlmeVRpbWVvdXRFcnJvcjogZmFsc2Vcbn07XG4iLCAiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IFVSTFNlYXJjaFBhcmFtcyBmcm9tICcuL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzJ1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJy4vY2xhc3Nlcy9Gb3JtRGF0YS5qcydcblxuY29uc3QgQUxQSEEgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonXG5cbmNvbnN0IERJR0lUID0gJzAxMjM0NTY3ODknO1xuXG5jb25zdCBBTFBIQUJFVCA9IHtcbiAgRElHSVQsXG4gIEFMUEhBLFxuICBBTFBIQV9ESUdJVDogQUxQSEEgKyBBTFBIQS50b1VwcGVyQ2FzZSgpICsgRElHSVRcbn1cblxuY29uc3QgZ2VuZXJhdGVTdHJpbmcgPSAoc2l6ZSA9IDE2LCBhbHBoYWJldCA9IEFMUEhBQkVULkFMUEhBX0RJR0lUKSA9PiB7XG4gIGxldCBzdHIgPSAnJztcbiAgY29uc3Qge2xlbmd0aH0gPSBhbHBoYWJldDtcbiAgY29uc3QgcmFuZG9tVmFsdWVzID0gbmV3IFVpbnQzMkFycmF5KHNpemUpO1xuICBjcnlwdG8ucmFuZG9tRmlsbFN5bmMocmFuZG9tVmFsdWVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICBzdHIgKz0gYWxwaGFiZXRbcmFuZG9tVmFsdWVzW2ldICUgbGVuZ3RoXTtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc05vZGU6IHRydWUsXG4gIGNsYXNzZXM6IHtcbiAgICBVUkxTZWFyY2hQYXJhbXMsXG4gICAgRm9ybURhdGEsXG4gICAgQmxvYjogdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2IgfHwgbnVsbFxuICB9LFxuICBBTFBIQUJFVCxcbiAgZ2VuZXJhdGVTdHJpbmcsXG4gIHByb3RvY29sczogWyAnaHR0cCcsICdodHRwcycsICdmaWxlJywgJ2RhdGEnIF1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXJsIGZyb20gJ3VybCc7XG5leHBvcnQgZGVmYXVsdCB1cmwuVVJMU2VhcmNoUGFyYW1zO1xuIiwgImNvbnN0IGhhc0Jyb3dzZXJFbnYgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5jb25zdCBfbmF2aWdhdG9yID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yIHx8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlckVudiA9IGhhc0Jyb3dzZXJFbnYgJiZcbiAgKCFfbmF2aWdhdG9yIHx8IFsnUmVhY3ROYXRpdmUnLCAnTmF0aXZlU2NyaXB0JywgJ05TJ10uaW5kZXhPZihfbmF2aWdhdG9yLnByb2R1Y3QpIDwgMCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIHdlYldvcmtlciBlbnZpcm9ubWVudFxuICpcbiAqIEFsdGhvdWdoIHRoZSBgaXNTdGFuZGFyZEJyb3dzZXJFbnZgIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdFxuICogYGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyYCwgdGhlIFdlYldvcmtlciB3aWxsIHN0aWxsIGJlXG4gKiBmaWx0ZXJlZCBvdXQgZHVlIHRvIGl0cyBqdWRnbWVudCBzdGFuZGFyZFxuICogYHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdgLlxuICogVGhpcyBsZWFkcyB0byBhIHByb2JsZW0gd2hlbiBheGlvcyBwb3N0IGBGb3JtRGF0YWAgaW4gd2ViV29ya2VyXG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiA9ICgoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJlxuICAgIHR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbidcbiAgKTtcbn0pKCk7XG5cbmNvbnN0IG9yaWdpbiA9IGhhc0Jyb3dzZXJFbnYgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG5leHBvcnQge1xuICBoYXNCcm93c2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlckVudixcbiAgX25hdmlnYXRvciBhcyBuYXZpZ2F0b3IsXG4gIG9yaWdpblxufVxuIiwgImltcG9ydCBwbGF0Zm9ybSBmcm9tICcuL25vZGUvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9jb21tb24vdXRpbHMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC4uLnV0aWxzLFxuICAuLi5wbGF0Zm9ybVxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRvRm9ybURhdGEoZGF0YSwgbmV3IHBsYXRmb3JtLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zKCksIE9iamVjdC5hc3NpZ24oe1xuICAgIHZpc2l0b3I6IGZ1bmN0aW9uKHZhbHVlLCBrZXksIHBhdGgsIGhlbHBlcnMpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5pc05vZGUgJiYgdXRpbHMuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfSwgb3B0aW9ucykpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZyBsaWtlIGBmb29beF1beV1bel1gIGFuZCByZXR1cm5zIGFuIGFycmF5IGxpa2UgYFsnZm9vJywgJ3gnLCAneScsICd6J11cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQcm9wUGF0aChuYW1lKSB7XG4gIC8vIGZvb1t4XVt5XVt6XVxuICAvLyBmb28ueC55LnpcbiAgLy8gZm9vLXgteS16XG4gIC8vIGZvbyB4IHkgelxuICByZXR1cm4gdXRpbHMubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLCBuYW1lKS5tYXAobWF0Y2ggPT4ge1xuICAgIHJldHVybiBtYXRjaFswXSA9PT0gJ1tdJyA/ICcnIDogbWF0Y2hbMV0gfHwgbWF0Y2hbMF07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gYXJyYXkgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJyIC0gVGhlIGFycmF5IHRvIGNvbnZlcnQgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBhcyB0aGUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5VG9PYmplY3QoYXJyKSB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyKTtcbiAgbGV0IGk7XG4gIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICBsZXQga2V5O1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBrZXkgPSBrZXlzW2ldO1xuICAgIG9ialtrZXldID0gYXJyW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIEZvcm1EYXRhIG9iamVjdCBhbmQgcmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1EYXRhIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gY29udmVydCB0byBKU09OLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3Q8c3RyaW5nLCBhbnk+IHwgbnVsbH0gVGhlIGNvbnZlcnRlZCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGZvcm1EYXRhVG9KU09OKGZvcm1EYXRhKSB7XG4gIGZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0LCBpbmRleCkge1xuICAgIGxldCBuYW1lID0gcGF0aFtpbmRleCsrXTtcblxuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBpc051bWVyaWNLZXkgPSBOdW1iZXIuaXNGaW5pdGUoK25hbWUpO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID49IHBhdGgubGVuZ3RoO1xuICAgIG5hbWUgPSAhbmFtZSAmJiB1dGlscy5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQubGVuZ3RoIDogbmFtZTtcblxuICAgIGlmIChpc0xhc3QpIHtcbiAgICAgIGlmICh1dGlscy5oYXNPd25Qcm9wKHRhcmdldCwgbmFtZSkpIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gW3RhcmdldFtuYW1lXSwgdmFsdWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0W25hbWVdIHx8ICF1dGlscy5pc09iamVjdCh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldFtuYW1lXSwgaW5kZXgpO1xuXG4gICAgaWYgKHJlc3VsdCAmJiB1dGlscy5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IGFycmF5VG9PYmplY3QodGFyZ2V0W25hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc0Zvcm1EYXRhKGZvcm1EYXRhKSAmJiB1dGlscy5pc0Z1bmN0aW9uKGZvcm1EYXRhLmVudHJpZXMpKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG5cbiAgICB1dGlscy5mb3JFYWNoRW50cnkoZm9ybURhdGEsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgYnVpbGRQYXRoKHBhcnNlUHJvcFBhdGgobmFtZSksIHZhbHVlLCBvYmosIDApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmb3JtRGF0YVRvSlNPTjtcbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4vdHJhbnNpdGlvbmFsLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4uL2hlbHBlcnMvdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgdG9VUkxFbmNvZGVkRm9ybSBmcm9tICcuLi9oZWxwZXJzL3RvVVJMRW5jb2RlZEZvcm0uanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcbmltcG9ydCBmb3JtRGF0YVRvSlNPTiBmcm9tICcuLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZywgdHJpZXMgdG8gcGFyc2UgaXQsIGFuZCBpZiBpdCBmYWlscywgaXQgcmV0dXJucyB0aGUgc3RyaW5naWZpZWQgdmVyc2lvblxuICogb2YgdGhlIGlucHV0XG4gKlxuICogQHBhcmFtIHthbnl9IHJhd1ZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHN0cmluZ2lmaWVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyc2VyIC0gQSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBhIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBvYmplY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgYSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSByYXdWYWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5U2FmZWx5KHJhd1ZhbHVlLCBwYXJzZXIsIGVuY29kZXIpIHtcbiAgaWYgKHV0aWxzLmlzU3RyaW5nKHJhd1ZhbHVlKSkge1xuICAgIHRyeSB7XG4gICAgICAocGFyc2VyIHx8IEpTT04ucGFyc2UpKHJhd1ZhbHVlKTtcbiAgICAgIHJldHVybiB1dGlscy50cmltKHJhd1ZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5uYW1lICE9PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChlbmNvZGVyIHx8IEpTT04uc3RyaW5naWZ5KShyYXdWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogWyd4aHInLCAnaHR0cCcsICdmZXRjaCddLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSB8fCAnJztcbiAgICBjb25zdCBoYXNKU09OQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB1dGlscy5pc09iamVjdChkYXRhKTtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgJiYgdXRpbHMuaXNIVE1MRm9ybShkYXRhKSkge1xuICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Zvcm1EYXRhID0gdXRpbHMuaXNGb3JtRGF0YShkYXRhKTtcblxuICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICByZXR1cm4gaGFzSlNPTkNvbnRlbnRUeXBlID8gSlNPTi5zdHJpbmdpZnkoZm9ybURhdGFUb0pTT04oZGF0YSkpIDogZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04JywgZmFsc2UpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBsZXQgaXNGaWxlTGlzdDtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaXNGaWxlTGlzdCA9IHV0aWxzLmlzRmlsZUxpc3QoZGF0YSkpIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+IC0xKSB7XG4gICAgICAgIGNvbnN0IF9Gb3JtRGF0YSA9IHRoaXMuZW52ICYmIHRoaXMuZW52LkZvcm1EYXRhO1xuXG4gICAgICAgIHJldHVybiB0b0Zvcm1EYXRhKFxuICAgICAgICAgIGlzRmlsZUxpc3QgPyB7J2ZpbGVzW10nOiBkYXRhfSA6IGRhdGEsXG4gICAgICAgICAgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSxcbiAgICAgICAgICB0aGlzLmZvcm1TZXJpYWxpemVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCB8fCBoYXNKU09OQ29udGVudFR5cGUgKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi9qc29uJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeVNhZmVseShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgY29uc3QgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIGNvbnN0IGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICBjb25zdCBKU09OUmVxdWVzdGVkID0gdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmICh1dGlscy5pc1Jlc3BvbnNlKGRhdGEpIHx8IHV0aWxzLmlzUmVhZGFibGVTdHJlYW0oZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIHV0aWxzLmlzU3RyaW5nKGRhdGEpICYmICgoZm9yY2VkSlNPTlBhcnNpbmcgJiYgIXRoaXMucmVzcG9uc2VUeXBlKSB8fCBKU09OUmVxdWVzdGVkKSkge1xuICAgICAgY29uc3Qgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgICAgY29uc3Qgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgSlNPTlJlcXVlc3RlZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChzdHJpY3RKU09OUGFyc2luZykge1xuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIHRoaXMsIG51bGwsIHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuICBtYXhCb2R5TGVuZ3RoOiAtMSxcblxuICBlbnY6IHtcbiAgICBGb3JtRGF0YTogcGxhdGZvcm0uY2xhc3Nlcy5Gb3JtRGF0YSxcbiAgICBCbG9iOiBwbGF0Zm9ybS5jbGFzc2VzLkJsb2JcbiAgfSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9LFxuXG4gIGhlYWRlcnM6IHtcbiAgICBjb21tb246IHtcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgKG1ldGhvZCkgPT4ge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0cztcbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscy50b09iamVjdFNldChbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXSk7XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByYXdIZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5leHBvcnQgZGVmYXVsdCByYXdIZWFkZXJzID0+IHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrZXk7XG4gIGxldCB2YWw7XG4gIGxldCBpO1xuXG4gIHJhd0hlYWRlcnMgJiYgcmF3SGVhZGVycy5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSBsaW5lLnN1YnN0cmluZyhpICsgMSkudHJpbSgpO1xuXG4gICAgaWYgKCFrZXkgfHwgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mW2tleV0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0pIHtcbiAgICAgICAgcGFyc2VkW2tleV0ucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBbdmFsXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBwYXJzZUhlYWRlcnMgZnJvbSAnLi4vaGVscGVycy9wYXJzZUhlYWRlcnMuanMnO1xuXG5jb25zdCAkaW50ZXJuYWxzID0gU3ltYm9sKCdpbnRlcm5hbHMnKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyICYmIFN0cmluZyhoZWFkZXIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdXRpbHMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAobm9ybWFsaXplVmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb2tlbnMoc3RyKSB7XG4gIGNvbnN0IHRva2VucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGNvbnN0IHRva2Vuc1JFID0gLyhbXlxccyw7PV0rKVxccyooPzo9XFxzKihbXiw7XSspKT8vZztcbiAgbGV0IG1hdGNoO1xuXG4gIHdoaWxlICgobWF0Y2ggPSB0b2tlbnNSRS5leGVjKHN0cikpKSB7XG4gICAgdG9rZW5zW21hdGNoWzFdXSA9IG1hdGNoWzJdO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuY29uc3QgaXNWYWxpZEhlYWRlck5hbWUgPSAoc3RyKSA9PiAvXlstX2EtekEtWjAtOV5gfH4sISMkJSYnKisuXSskLy50ZXN0KHN0ci50cmltKCkpO1xuXG5mdW5jdGlvbiBtYXRjaEhlYWRlclZhbHVlKGNvbnRleHQsIHZhbHVlLCBoZWFkZXIsIGZpbHRlciwgaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gIGlmICh1dGlscy5pc0Z1bmN0aW9uKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcywgdmFsdWUsIGhlYWRlcik7XG4gIH1cblxuICBpZiAoaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gICAgdmFsdWUgPSBoZWFkZXI7XG4gIH1cblxuICBpZiAoIXV0aWxzLmlzU3RyaW5nKHZhbHVlKSkgcmV0dXJuO1xuXG4gIGlmICh1dGlscy5pc1N0cmluZyhmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoZmlsdGVyKSAhPT0gLTE7XG4gIH1cblxuICBpZiAodXRpbHMuaXNSZWdFeHAoZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIudGVzdCh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0SGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyLnRyaW0oKVxuICAgIC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XFxkXSkoXFx3KikvZywgKHcsIGNoYXIsIHN0cikgPT4ge1xuICAgICAgcmV0dXJuIGNoYXIudG9VcHBlckNhc2UoKSArIHN0cjtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBY2Nlc3NvcnMob2JqLCBoZWFkZXIpIHtcbiAgY29uc3QgYWNjZXNzb3JOYW1lID0gdXRpbHMudG9DYW1lbENhc2UoJyAnICsgaGVhZGVyKTtcblxuICBbJ2dldCcsICdzZXQnLCAnaGFzJ10uZm9yRWFjaChtZXRob2ROYW1lID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBtZXRob2ROYW1lICsgYWNjZXNzb3JOYW1lLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgICByZXR1cm4gdGhpc1ttZXRob2ROYW1lXS5jYWxsKHRoaXMsIGhlYWRlciwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xufVxuXG5jbGFzcyBBeGlvc0hlYWRlcnMge1xuICBjb25zdHJ1Y3RvcihoZWFkZXJzKSB7XG4gICAgaGVhZGVycyAmJiB0aGlzLnNldChoZWFkZXJzKTtcbiAgfVxuXG4gIHNldChoZWFkZXIsIHZhbHVlT3JSZXdyaXRlLCByZXdyaXRlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFsSGVhZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShzZWxmLCBsSGVhZGVyKTtcblxuICAgICAgaWYoIWtleSB8fCBzZWxmW2tleV0gPT09IHVuZGVmaW5lZCB8fCBfcmV3cml0ZSA9PT0gdHJ1ZSB8fCAoX3Jld3JpdGUgPT09IHVuZGVmaW5lZCAmJiBzZWxmW2tleV0gIT09IGZhbHNlKSkge1xuICAgICAgICBzZWxmW2tleSB8fCBfaGVhZGVyXSA9IG5vcm1hbGl6ZVZhbHVlKF92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0SGVhZGVycyA9IChoZWFkZXJzLCBfcmV3cml0ZSkgPT5cbiAgICAgIHV0aWxzLmZvckVhY2goaGVhZGVycywgKF92YWx1ZSwgX2hlYWRlcikgPT4gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpKTtcblxuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KGhlYWRlcikgfHwgaGVhZGVyIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcikge1xuICAgICAgc2V0SGVhZGVycyhoZWFkZXIsIHZhbHVlT3JSZXdyaXRlKVxuICAgIH0gZWxzZSBpZih1dGlscy5pc1N0cmluZyhoZWFkZXIpICYmIChoZWFkZXIgPSBoZWFkZXIudHJpbSgpKSAmJiAhaXNWYWxpZEhlYWRlck5hbWUoaGVhZGVyKSkge1xuICAgICAgc2V0SGVhZGVycyhwYXJzZUhlYWRlcnMoaGVhZGVyKSwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QoaGVhZGVyKSAmJiB1dGlscy5pc0l0ZXJhYmxlKGhlYWRlcikpIHtcbiAgICAgIGxldCBvYmogPSB7fSwgZGVzdCwga2V5O1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBoZWFkZXIpIHtcbiAgICAgICAgaWYgKCF1dGlscy5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAgIHRocm93IFR5cGVFcnJvcignT2JqZWN0IGl0ZXJhdG9yIG11c3QgcmV0dXJuIGEga2V5LXZhbHVlIHBhaXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ialtrZXkgPSBlbnRyeVswXV0gPSAoZGVzdCA9IG9ialtrZXldKSA/XG4gICAgICAgICAgKHV0aWxzLmlzQXJyYXkoZGVzdCkgPyBbLi4uZGVzdCwgZW50cnlbMV1dIDogW2Rlc3QsIGVudHJ5WzFdXSkgOiBlbnRyeVsxXTtcbiAgICAgIH1cblxuICAgICAgc2V0SGVhZGVycyhvYmosIHZhbHVlT3JSZXdyaXRlKVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgIT0gbnVsbCAmJiBzZXRIZWFkZXIodmFsdWVPclJld3JpdGUsIGhlYWRlciwgcmV3cml0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXQoaGVhZGVyLCBwYXJzZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgICBpZiAoIXBhcnNlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZXIgPT09IHRydWUpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbnModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24ocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuY2FsbCh0aGlzLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc1JlZ0V4cChwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5leGVjKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhcnNlciBtdXN0IGJlIGJvb2xlYW58cmVnZXhwfGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFzKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICByZXR1cm4gISEoa2V5ICYmIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZShoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gZGVsZXRlSGVhZGVyKF9oZWFkZXIpIHtcbiAgICAgIF9oZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmIChfaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoc2VsZiwgX2hlYWRlcik7XG5cbiAgICAgICAgaWYgKGtleSAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZShzZWxmLCBzZWxmW2tleV0sIGtleSwgbWF0Y2hlcikpKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGZba2V5XTtcblxuICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXkoaGVhZGVyKSkge1xuICAgICAgaGVhZGVyLmZvckVhY2goZGVsZXRlSGVhZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlSGVhZGVyKGhlYWRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBjbGVhcihtYXRjaGVyKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICAgIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZighbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyLCB0cnVlKSkge1xuICAgICAgICBkZWxldGUgdGhpc1trZXldO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIG5vcm1hbGl6ZShmb3JtYXQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG5cbiAgICB1dGlscy5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KGhlYWRlcnMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgc2VsZltrZXldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmb3JtYXQgPyBmb3JtYXRIZWFkZXIoaGVhZGVyKSA6IFN0cmluZyhoZWFkZXIpLnRyaW0oKTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZWQgIT09IGhlYWRlcikge1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgfVxuXG4gICAgICBzZWxmW25vcm1hbGl6ZWRdID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuXG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWRdID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29uY2F0KC4uLnRhcmdldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywgLi4udGFyZ2V0cyk7XG4gIH1cblxuICB0b0pTT04oYXNTdHJpbmdzKSB7XG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHV0aWxzLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09IGZhbHNlICYmIChvYmpbaGVhZGVyXSA9IGFzU3RyaW5ncyAmJiB1dGlscy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmpvaW4oJywgJykgOiB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtoZWFkZXIsIHZhbHVlXSkgPT4gaGVhZGVyICsgJzogJyArIHZhbHVlKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGdldFNldENvb2tpZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXCJzZXQtY29va2llXCIpIHx8IFtdO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzWyRpbnRlcm5hbHNdID0gKHRoaXNbJGludGVybmFsc10gPSB7XG4gICAgICBhY2Nlc3NvcnM6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSBpbnRlcm5hbHMuYWNjZXNzb3JzO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgZnVuY3Rpb24gZGVmaW5lQWNjZXNzb3IoX2hlYWRlcikge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFhY2Nlc3NvcnNbbEhlYWRlcl0pIHtcbiAgICAgICAgYnVpbGRBY2Nlc3NvcnMocHJvdG90eXBlLCBfaGVhZGVyKTtcbiAgICAgICAgYWNjZXNzb3JzW2xIZWFkZXJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlscy5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFsnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTGVuZ3RoJywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnVXNlci1BZ2VudCcsICdBdXRob3JpemF0aW9uJ10pO1xuXG4vLyByZXNlcnZlZCBuYW1lcyBob3RmaXhcbnV0aWxzLnJlZHVjZURlc2NyaXB0b3JzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUsICh7dmFsdWV9LCBrZXkpID0+IHtcbiAgbGV0IG1hcHBlZCA9IGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpOyAvLyBtYXAgYHNldGAgPT4gYFNldGBcbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHZhbHVlLFxuICAgIHNldChoZWFkZXJWYWx1ZSkge1xuICAgICAgdGhpc1ttYXBwZWRdID0gaGVhZGVyVmFsdWU7XG4gICAgfVxuICB9XG59KTtcblxudXRpbHMuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0hlYWRlcnM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7P09iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShmbnMsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHRoaXMgfHwgZGVmYXVsdHM7XG4gIGNvbnN0IGNvbnRleHQgPSByZXNwb25zZSB8fCBjb25maWc7XG4gIGNvbnN0IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb250ZXh0LmhlYWRlcnMpO1xuICBsZXQgZGF0YSA9IGNvbnRleHQuZGF0YTtcblxuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuLmNhbGwoY29uZmlnLCBkYXRhLCBoZWFkZXJzLm5vcm1hbGl6ZSgpLCByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGhlYWRlcnMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBBIGBDYW5jZWxlZEVycm9yYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsZWRFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG59XG5cbnV0aWxzLmluaGVyaXRzKENhbmNlbGVkRXJyb3IsIEF4aW9zRXJyb3IsIHtcbiAgX19DQU5DRUxfXzogdHJ1ZVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IENhbmNlbGVkRXJyb3I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuL0F4aW9zRXJyb3IuanMnO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpIHtcbiAgY29uc3QgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIFtBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFXVtNYXRoLmZsb29yKHJlc3BvbnNlLnN0YXR1cyAvIDEwMCkgLSA0XSxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvP1xcLyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBpc0Fic29sdXRlVVJMIGZyb20gJy4uL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyc7XG5pbXBvcnQgY29tYmluZVVSTHMgZnJvbSAnLi4vaGVscGVycy9jb21iaW5lVVJMcy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCwgYWxsb3dBYnNvbHV0ZVVybHMpIHtcbiAgbGV0IGlzUmVsYXRpdmVVcmwgPSAhaXNBYnNvbHV0ZVVSTChyZXF1ZXN0ZWRVUkwpO1xuICBpZiAoYmFzZVVSTCAmJiAoaXNSZWxhdGl2ZVVybCB8fCBhbGxvd0Fic29sdXRlVXJscyA9PSBmYWxzZSkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHNldHRsZSBmcm9tICcuLy4uL2NvcmUvc2V0dGxlLmpzJztcbmltcG9ydCBidWlsZEZ1bGxQYXRoIGZyb20gJy4uL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyc7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSAnLi8uLi9oZWxwZXJzL2J1aWxkVVJMLmpzJztcbmltcG9ydCBwcm94eUZyb21FbnYgZnJvbSAncHJveHktZnJvbS1lbnYnO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgZm9sbG93UmVkaXJlY3RzIGZyb20gJ2ZvbGxvdy1yZWRpcmVjdHMnO1xuaW1wb3J0IHpsaWIgZnJvbSAnemxpYic7XG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4uL2Vudi9kYXRhLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgZnJvbURhdGFVUkkgZnJvbSAnLi4vaGVscGVycy9mcm9tRGF0YVVSSS5qcyc7XG5pbXBvcnQgc3RyZWFtIGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCBBeGlvc1RyYW5zZm9ybVN0cmVhbSBmcm9tICcuLi9oZWxwZXJzL0F4aW9zVHJhbnNmb3JtU3RyZWFtLmpzJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IGZvcm1EYXRhVG9TdHJlYW0gZnJvbSBcIi4uL2hlbHBlcnMvZm9ybURhdGFUb1N0cmVhbS5qc1wiO1xuaW1wb3J0IHJlYWRCbG9iIGZyb20gXCIuLi9oZWxwZXJzL3JlYWRCbG9iLmpzXCI7XG5pbXBvcnQgWmxpYkhlYWRlclRyYW5zZm9ybVN0cmVhbSBmcm9tICcuLi9oZWxwZXJzL1psaWJIZWFkZXJUcmFuc2Zvcm1TdHJlYW0uanMnO1xuaW1wb3J0IGNhbGxiYWNraWZ5IGZyb20gXCIuLi9oZWxwZXJzL2NhbGxiYWNraWZ5LmpzXCI7XG5pbXBvcnQge3Byb2dyZXNzRXZlbnRSZWR1Y2VyLCBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yLCBhc3luY0RlY29yYXRvcn0gZnJvbSBcIi4uL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanNcIjtcblxuY29uc3QgemxpYk9wdGlvbnMgPSB7XG4gIGZsdXNoOiB6bGliLmNvbnN0YW50cy5aX1NZTkNfRkxVU0gsXG4gIGZpbmlzaEZsdXNoOiB6bGliLmNvbnN0YW50cy5aX1NZTkNfRkxVU0hcbn07XG5cbmNvbnN0IGJyb3RsaU9wdGlvbnMgPSB7XG4gIGZsdXNoOiB6bGliLmNvbnN0YW50cy5CUk9UTElfT1BFUkFUSU9OX0ZMVVNILFxuICBmaW5pc2hGbHVzaDogemxpYi5jb25zdGFudHMuQlJPVExJX09QRVJBVElPTl9GTFVTSFxufVxuXG5jb25zdCBpc0Jyb3RsaVN1cHBvcnRlZCA9IHV0aWxzLmlzRnVuY3Rpb24oemxpYi5jcmVhdGVCcm90bGlEZWNvbXByZXNzKTtcblxuY29uc3Qge2h0dHA6IGh0dHBGb2xsb3csIGh0dHBzOiBodHRwc0ZvbGxvd30gPSBmb2xsb3dSZWRpcmVjdHM7XG5cbmNvbnN0IGlzSHR0cHMgPSAvaHR0cHM6Py87XG5cbmNvbnN0IHN1cHBvcnRlZFByb3RvY29scyA9IHBsYXRmb3JtLnByb3RvY29scy5tYXAocHJvdG9jb2wgPT4ge1xuICByZXR1cm4gcHJvdG9jb2wgKyAnOic7XG59KTtcblxuY29uc3QgZmx1c2hPbkZpbmlzaCA9IChzdHJlYW0sIFt0aHJvdHRsZWQsIGZsdXNoXSkgPT4ge1xuICBzdHJlYW1cbiAgICAub24oJ2VuZCcsIGZsdXNoKVxuICAgIC5vbignZXJyb3InLCBmbHVzaCk7XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn1cblxuLyoqXG4gKiBJZiB0aGUgcHJveHkgb3IgY29uZmlnIGJlZm9yZVJlZGlyZWN0cyBmdW5jdGlvbnMgYXJlIGRlZmluZWQsIGNhbGwgdGhlbSB3aXRoIHRoZSBvcHRpb25zXG4gKiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0PHN0cmluZywgYW55Pn1cbiAqL1xuZnVuY3Rpb24gZGlzcGF0Y2hCZWZvcmVSZWRpcmVjdChvcHRpb25zLCByZXNwb25zZURldGFpbHMpIHtcbiAgaWYgKG9wdGlvbnMuYmVmb3JlUmVkaXJlY3RzLnByb3h5KSB7XG4gICAgb3B0aW9ucy5iZWZvcmVSZWRpcmVjdHMucHJveHkob3B0aW9ucyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuYmVmb3JlUmVkaXJlY3RzLmNvbmZpZykge1xuICAgIG9wdGlvbnMuYmVmb3JlUmVkaXJlY3RzLmNvbmZpZyhvcHRpb25zLCByZXNwb25zZURldGFpbHMpO1xuICB9XG59XG5cbi8qKlxuICogSWYgdGhlIHByb3h5IG9yIGNvbmZpZyBhZnRlclJlZGlyZWN0cyBmdW5jdGlvbnMgYXJlIGRlZmluZWQsIGNhbGwgdGhlbSB3aXRoIHRoZSBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtodHRwLkNsaWVudFJlcXVlc3RBcmdzfSBvcHRpb25zXG4gKiBAcGFyYW0ge0F4aW9zUHJveHlDb25maWd9IGNvbmZpZ1Byb3h5IGNvbmZpZ3VyYXRpb24gZnJvbSBBeGlvcyBvcHRpb25zIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKlxuICogQHJldHVybnMge2h0dHAuQ2xpZW50UmVxdWVzdEFyZ3N9XG4gKi9cbmZ1bmN0aW9uIHNldFByb3h5KG9wdGlvbnMsIGNvbmZpZ1Byb3h5LCBsb2NhdGlvbikge1xuICBsZXQgcHJveHkgPSBjb25maWdQcm94eTtcbiAgaWYgKCFwcm94eSAmJiBwcm94eSAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm94eVVybCA9IHByb3h5RnJvbUVudi5nZXRQcm94eUZvclVybChsb2NhdGlvbik7XG4gICAgaWYgKHByb3h5VXJsKSB7XG4gICAgICBwcm94eSA9IG5ldyBVUkwocHJveHlVcmwpO1xuICAgIH1cbiAgfVxuICBpZiAocHJveHkpIHtcbiAgICAvLyBCYXNpYyBwcm94eSBhdXRob3JpemF0aW9uXG4gICAgaWYgKHByb3h5LnVzZXJuYW1lKSB7XG4gICAgICBwcm94eS5hdXRoID0gKHByb3h5LnVzZXJuYW1lIHx8ICcnKSArICc6JyArIChwcm94eS5wYXNzd29yZCB8fCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3h5LmF1dGgpIHtcbiAgICAgIC8vIFN1cHBvcnQgcHJveHkgYXV0aCBvYmplY3QgZm9ybVxuICAgICAgaWYgKHByb3h5LmF1dGgudXNlcm5hbWUgfHwgcHJveHkuYXV0aC5wYXNzd29yZCkge1xuICAgICAgICBwcm94eS5hdXRoID0gKHByb3h5LmF1dGgudXNlcm5hbWUgfHwgJycpICsgJzonICsgKHByb3h5LmF1dGgucGFzc3dvcmQgfHwgJycpO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFzZTY0ID0gQnVmZmVyXG4gICAgICAgIC5mcm9tKHByb3h5LmF1dGgsICd1dGY4JylcbiAgICAgICAgLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgKyBiYXNlNjQ7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5oZWFkZXJzLmhvc3QgPSBvcHRpb25zLmhvc3RuYW1lICsgKG9wdGlvbnMucG9ydCA/ICc6JyArIG9wdGlvbnMucG9ydCA6ICcnKTtcbiAgICBjb25zdCBwcm94eUhvc3QgPSBwcm94eS5ob3N0bmFtZSB8fCBwcm94eS5ob3N0O1xuICAgIG9wdGlvbnMuaG9zdG5hbWUgPSBwcm94eUhvc3Q7XG4gICAgLy8gUmVwbGFjZSAnaG9zdCcgc2luY2Ugb3B0aW9ucyBpcyBub3QgYSBVUkwgb2JqZWN0XG4gICAgb3B0aW9ucy5ob3N0ID0gcHJveHlIb3N0O1xuICAgIG9wdGlvbnMucG9ydCA9IHByb3h5LnBvcnQ7XG4gICAgb3B0aW9ucy5wYXRoID0gbG9jYXRpb247XG4gICAgaWYgKHByb3h5LnByb3RvY29sKSB7XG4gICAgICBvcHRpb25zLnByb3RvY29sID0gcHJveHkucHJvdG9jb2wuaW5jbHVkZXMoJzonKSA/IHByb3h5LnByb3RvY29sIDogYCR7cHJveHkucHJvdG9jb2x9OmA7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9ucy5iZWZvcmVSZWRpcmVjdHMucHJveHkgPSBmdW5jdGlvbiBiZWZvcmVSZWRpcmVjdChyZWRpcmVjdE9wdGlvbnMpIHtcbiAgICAvLyBDb25maWd1cmUgcHJveHkgZm9yIHJlZGlyZWN0ZWQgcmVxdWVzdCwgcGFzc2luZyB0aGUgb3JpZ2luYWwgY29uZmlnIHByb3h5IHRvIGFwcGx5XG4gICAgLy8gdGhlIGV4YWN0IHNhbWUgbG9naWMgYXMgaWYgdGhlIHJlZGlyZWN0ZWQgcmVxdWVzdCB3YXMgcGVyZm9ybWVkIGJ5IGF4aW9zIGRpcmVjdGx5LlxuICAgIHNldFByb3h5KHJlZGlyZWN0T3B0aW9ucywgY29uZmlnUHJveHksIHJlZGlyZWN0T3B0aW9ucy5ocmVmKTtcbiAgfTtcbn1cblxuY29uc3QgaXNIdHRwQWRhcHRlclN1cHBvcnRlZCA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB1dGlscy5raW5kT2YocHJvY2VzcykgPT09ICdwcm9jZXNzJztcblxuLy8gdGVtcG9yYXJ5IGhvdGZpeFxuXG5jb25zdCB3cmFwQXN5bmMgPSAoYXN5bmNFeGVjdXRvcikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBvbkRvbmU7XG4gICAgbGV0IGlzRG9uZTtcblxuICAgIGNvbnN0IGRvbmUgPSAodmFsdWUsIGlzUmVqZWN0ZWQpID0+IHtcbiAgICAgIGlmIChpc0RvbmUpIHJldHVybjtcbiAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICBvbkRvbmUgJiYgb25Eb25lKHZhbHVlLCBpc1JlamVjdGVkKTtcbiAgICB9XG5cbiAgICBjb25zdCBfcmVzb2x2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgICAgZG9uZSh2YWx1ZSk7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgX3JlamVjdCA9IChyZWFzb24pID0+IHtcbiAgICAgIGRvbmUocmVhc29uLCB0cnVlKTtcbiAgICAgIHJlamVjdChyZWFzb24pO1xuICAgIH1cblxuICAgIGFzeW5jRXhlY3V0b3IoX3Jlc29sdmUsIF9yZWplY3QsIChvbkRvbmVIYW5kbGVyKSA9PiAob25Eb25lID0gb25Eb25lSGFuZGxlcikpLmNhdGNoKF9yZWplY3QpO1xuICB9KVxufTtcblxuY29uc3QgcmVzb2x2ZUZhbWlseSA9ICh7YWRkcmVzcywgZmFtaWx5fSkgPT4ge1xuICBpZiAoIXV0aWxzLmlzU3RyaW5nKGFkZHJlc3MpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdhZGRyZXNzIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuICByZXR1cm4gKHtcbiAgICBhZGRyZXNzLFxuICAgIGZhbWlseTogZmFtaWx5IHx8IChhZGRyZXNzLmluZGV4T2YoJy4nKSA8IDAgPyA2IDogNClcbiAgfSk7XG59XG5cbmNvbnN0IGJ1aWxkQWRkcmVzc0VudHJ5ID0gKGFkZHJlc3MsIGZhbWlseSkgPT4gcmVzb2x2ZUZhbWlseSh1dGlscy5pc09iamVjdChhZGRyZXNzKSA/IGFkZHJlc3MgOiB7YWRkcmVzcywgZmFtaWx5fSk7XG5cbi8qZXNsaW50IGNvbnNpc3RlbnQtcmV0dXJuOjAqL1xuZXhwb3J0IGRlZmF1bHQgaXNIdHRwQWRhcHRlclN1cHBvcnRlZCAmJiBmdW5jdGlvbiBodHRwQWRhcHRlcihjb25maWcpIHtcbiAgcmV0dXJuIHdyYXBBc3luYyhhc3luYyBmdW5jdGlvbiBkaXNwYXRjaEh0dHBSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCwgb25Eb25lKSB7XG4gICAgbGV0IHtkYXRhLCBsb29rdXAsIGZhbWlseX0gPSBjb25maWc7XG4gICAgY29uc3Qge3Jlc3BvbnNlVHlwZSwgcmVzcG9uc2VFbmNvZGluZ30gPSBjb25maWc7XG4gICAgY29uc3QgbWV0aG9kID0gY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIGxldCBpc0RvbmU7XG4gICAgbGV0IHJlamVjdGVkID0gZmFsc2U7XG4gICAgbGV0IHJlcTtcblxuICAgIGlmIChsb29rdXApIHtcbiAgICAgIGNvbnN0IF9sb29rdXAgPSBjYWxsYmFja2lmeShsb29rdXAsICh2YWx1ZSkgPT4gdXRpbHMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICAgICAgLy8gaG90Zml4IHRvIHN1cHBvcnQgb3B0LmFsbCBvcHRpb24gd2hpY2ggaXMgcmVxdWlyZWQgZm9yIG5vZGUgMjAueFxuICAgICAgbG9va3VwID0gKGhvc3RuYW1lLCBvcHQsIGNiKSA9PiB7XG4gICAgICAgIF9sb29rdXAoaG9zdG5hbWUsIG9wdCwgKGVyciwgYXJnMCwgYXJnMSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IHV0aWxzLmlzQXJyYXkoYXJnMCkgPyBhcmcwLm1hcChhZGRyID0+IGJ1aWxkQWRkcmVzc0VudHJ5KGFkZHIpKSA6IFtidWlsZEFkZHJlc3NFbnRyeShhcmcwLCBhcmcxKV07XG5cbiAgICAgICAgICBvcHQuYWxsID8gY2IoZXJyLCBhZGRyZXNzZXMpIDogY2IoZXJyLCBhZGRyZXNzZXNbMF0uYWRkcmVzcywgYWRkcmVzc2VzWzBdLmZhbWlseSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRlbXBvcmFyeSBpbnRlcm5hbCBlbWl0dGVyIHVudGlsIHRoZSBBeGlvc1JlcXVlc3QgY2xhc3Mgd2lsbCBiZSBpbXBsZW1lbnRlZFxuICAgIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBjb25zdCBvbkZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgICBjb25maWcuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUoYWJvcnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBjb25maWcuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQpO1xuICAgICAgfVxuXG4gICAgICBlbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIG9uRG9uZSgodmFsdWUsIGlzUmVqZWN0ZWQpID0+IHtcbiAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICBpZiAoaXNSZWplY3RlZCkge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFib3J0KHJlYXNvbikge1xuICAgICAgZW1pdHRlci5lbWl0KCdhYm9ydCcsICFyZWFzb24gfHwgcmVhc29uLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcSkgOiByZWFzb24pO1xuICAgIH1cblxuICAgIGVtaXR0ZXIub25jZSgnYWJvcnQnLCByZWplY3QpO1xuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbiB8fCBjb25maWcuc2lnbmFsKSB7XG4gICAgICBjb25maWcuY2FuY2VsVG9rZW4gJiYgY29uZmlnLmNhbmNlbFRva2VuLnN1YnNjcmliZShhYm9ydCk7XG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBjb25maWcuc2lnbmFsLmFib3J0ZWQgPyBhYm9ydCgpIDogY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXJzZSB1cmxcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwsIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyk7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChmdWxsUGF0aCwgcGxhdGZvcm0uaGFzQnJvd3NlckVudiA/IHBsYXRmb3JtLm9yaWdpbiA6IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcHJvdG9jb2wgPSBwYXJzZWQucHJvdG9jb2wgfHwgc3VwcG9ydGVkUHJvdG9jb2xzWzBdO1xuXG4gICAgaWYgKHByb3RvY29sID09PSAnZGF0YTonKSB7XG4gICAgICBsZXQgY29udmVydGVkRGF0YTtcblxuICAgICAgaWYgKG1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgICAgcmV0dXJuIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHtcbiAgICAgICAgICBzdGF0dXM6IDQwNSxcbiAgICAgICAgICBzdGF0dXNUZXh0OiAnbWV0aG9kIG5vdCBhbGxvd2VkJyxcbiAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnZlcnRlZERhdGEgPSBmcm9tRGF0YVVSSShjb25maWcudXJsLCByZXNwb25zZVR5cGUgPT09ICdibG9iJywge1xuICAgICAgICAgIEJsb2I6IGNvbmZpZy5lbnYgJiYgY29uZmlnLmVudi5CbG9iXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBjb25maWcpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgY29udmVydGVkRGF0YSA9IGNvbnZlcnRlZERhdGEudG9TdHJpbmcocmVzcG9uc2VFbmNvZGluZyk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZUVuY29kaW5nIHx8IHJlc3BvbnNlRW5jb2RpbmcgPT09ICd1dGY4Jykge1xuICAgICAgICAgIGNvbnZlcnRlZERhdGEgPSB1dGlscy5zdHJpcEJPTShjb252ZXJ0ZWREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nKSB7XG4gICAgICAgIGNvbnZlcnRlZERhdGEgPSBzdHJlYW0uUmVhZGFibGUuZnJvbShjb252ZXJ0ZWREYXRhKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHtcbiAgICAgICAgZGF0YTogY29udmVydGVkRGF0YSxcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIHN0YXR1c1RleHQ6ICdPSycsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBBeGlvc0hlYWRlcnMoKSxcbiAgICAgICAgY29uZmlnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3VwcG9ydGVkUHJvdG9jb2xzLmluZGV4T2YocHJvdG9jb2wpID09PSAtMSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgJ1Vuc3VwcG9ydGVkIHByb3RvY29sICcgKyBwcm90b2NvbCxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsXG4gICAgICAgIGNvbmZpZ1xuICAgICAgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcblxuICAgIC8vIFNldCBVc2VyLUFnZW50IChyZXF1aXJlZCBieSBzb21lIHNlcnZlcnMpXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9heGlvcy9heGlvcy9pc3N1ZXMvNjlcbiAgICAvLyBVc2VyLUFnZW50IGlzIHNwZWNpZmllZDsgaGFuZGxlIGNhc2Ugd2hlcmUgbm8gVUEgaGVhZGVyIGlzIGRlc2lyZWRcbiAgICAvLyBPbmx5IHNldCBoZWFkZXIgaWYgaXQgaGFzbid0IGJlZW4gc2V0IGluIGNvbmZpZ1xuICAgIGhlYWRlcnMuc2V0KCdVc2VyLUFnZW50JywgJ2F4aW9zLycgKyBWRVJTSU9OLCBmYWxzZSk7XG5cbiAgICBjb25zdCB7b25VcGxvYWRQcm9ncmVzcywgb25Eb3dubG9hZFByb2dyZXNzfSA9IGNvbmZpZztcbiAgICBjb25zdCBtYXhSYXRlID0gY29uZmlnLm1heFJhdGU7XG4gICAgbGV0IG1heFVwbG9hZFJhdGUgPSB1bmRlZmluZWQ7XG4gICAgbGV0IG1heERvd25sb2FkUmF0ZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIHN1cHBvcnQgZm9yIHNwZWMgY29tcGxpYW50IEZvcm1EYXRhIG9iamVjdHNcbiAgICBpZiAodXRpbHMuaXNTcGVjQ29tcGxpYW50Rm9ybShkYXRhKSkge1xuICAgICAgY29uc3QgdXNlckJvdW5kYXJ5ID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgvYm91bmRhcnk9KFstX1xcd1xcZF17MTAsNzB9KS9pKTtcblxuICAgICAgZGF0YSA9IGZvcm1EYXRhVG9TdHJlYW0oZGF0YSwgKGZvcm1IZWFkZXJzKSA9PiB7XG4gICAgICAgIGhlYWRlcnMuc2V0KGZvcm1IZWFkZXJzKTtcbiAgICAgIH0sIHtcbiAgICAgICAgdGFnOiBgYXhpb3MtJHtWRVJTSU9OfS1ib3VuZGFyeWAsXG4gICAgICAgIGJvdW5kYXJ5OiB1c2VyQm91bmRhcnkgJiYgdXNlckJvdW5kYXJ5WzFdIHx8IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICAvLyBzdXBwb3J0IGZvciBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9mb3JtLWRhdGEgYXBpXG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpICYmIHV0aWxzLmlzRnVuY3Rpb24oZGF0YS5nZXRIZWFkZXJzKSkge1xuICAgICAgaGVhZGVycy5zZXQoZGF0YS5nZXRIZWFkZXJzKCkpO1xuXG4gICAgICBpZiAoIWhlYWRlcnMuaGFzQ29udGVudExlbmd0aCgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qga25vd25MZW5ndGggPSBhd2FpdCB1dGlsLnByb21pc2lmeShkYXRhLmdldExlbmd0aCkuY2FsbChkYXRhKTtcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUoa25vd25MZW5ndGgpICYmIGtub3duTGVuZ3RoID49IDAgJiYgaGVhZGVycy5zZXRDb250ZW50TGVuZ3RoKGtub3duTGVuZ3RoKTtcbiAgICAgICAgICAvKmVzbGludCBuby1lbXB0eTowKi9cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0Jsb2IoZGF0YSkgfHwgdXRpbHMuaXNGaWxlKGRhdGEpKSB7XG4gICAgICBkYXRhLnNpemUgJiYgaGVhZGVycy5zZXRDb250ZW50VHlwZShkYXRhLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpO1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50TGVuZ3RoKGRhdGEuc2l6ZSB8fCAwKTtcbiAgICAgIGRhdGEgPSBzdHJlYW0uUmVhZGFibGUuZnJvbShyZWFkQmxvYihkYXRhKSk7XG4gICAgfSBlbHNlIGlmIChkYXRhICYmICF1dGlscy5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLi4uXG4gICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMuaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsICd1dGYtOCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAnRGF0YSBhZnRlciB0cmFuc2Zvcm1hdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBhbiBBcnJheUJ1ZmZlciwgYSBCdWZmZXIsIG9yIGEgU3RyZWFtJyxcbiAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBDb250ZW50LUxlbmd0aCBoZWFkZXIgaWYgZGF0YSBleGlzdHNcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudExlbmd0aChkYXRhLmxlbmd0aCwgZmFsc2UpO1xuXG4gICAgICBpZiAoY29uZmlnLm1heEJvZHlMZW5ndGggPiAtMSAmJiBkYXRhLmxlbmd0aCA+IGNvbmZpZy5tYXhCb2R5TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgJ1JlcXVlc3QgYm9keSBsYXJnZXIgdGhhbiBtYXhCb2R5TGVuZ3RoIGxpbWl0JyxcbiAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICAgIGlmICh1dGlscy5pc0FycmF5KG1heFJhdGUpKSB7XG4gICAgICBtYXhVcGxvYWRSYXRlID0gbWF4UmF0ZVswXTtcbiAgICAgIG1heERvd25sb2FkUmF0ZSA9IG1heFJhdGVbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1heFVwbG9hZFJhdGUgPSBtYXhEb3dubG9hZFJhdGUgPSBtYXhSYXRlO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIChvblVwbG9hZFByb2dyZXNzIHx8IG1heFVwbG9hZFJhdGUpKSB7XG4gICAgICBpZiAoIXV0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIGRhdGEgPSBzdHJlYW0uUmVhZGFibGUuZnJvbShkYXRhLCB7b2JqZWN0TW9kZTogZmFsc2V9KTtcbiAgICAgIH1cblxuICAgICAgZGF0YSA9IHN0cmVhbS5waXBlbGluZShbZGF0YSwgbmV3IEF4aW9zVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgbWF4UmF0ZTogdXRpbHMudG9GaW5pdGVOdW1iZXIobWF4VXBsb2FkUmF0ZSlcbiAgICAgIH0pXSwgdXRpbHMubm9vcCk7XG5cbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MgJiYgZGF0YS5vbigncHJvZ3Jlc3MnLCBmbHVzaE9uRmluaXNoKFxuICAgICAgICBkYXRhLFxuICAgICAgICBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25VcGxvYWRQcm9ncmVzcyksIGZhbHNlLCAzKVxuICAgICAgICApXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgbGV0IGF1dGggPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICBjb25zdCB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBjb25maWcuYXV0aC5wYXNzd29yZCB8fCAnJztcbiAgICAgIGF1dGggPSB1c2VybmFtZSArICc6JyArIHBhc3N3b3JkO1xuICAgIH1cblxuICAgIGlmICghYXV0aCAmJiBwYXJzZWQudXNlcm5hbWUpIHtcbiAgICAgIGNvbnN0IHVybFVzZXJuYW1lID0gcGFyc2VkLnVzZXJuYW1lO1xuICAgICAgY29uc3QgdXJsUGFzc3dvcmQgPSBwYXJzZWQucGFzc3dvcmQ7XG4gICAgICBhdXRoID0gdXJsVXNlcm5hbWUgKyAnOicgKyB1cmxQYXNzd29yZDtcbiAgICB9XG5cbiAgICBhdXRoICYmIGhlYWRlcnMuZGVsZXRlKCdhdXRob3JpemF0aW9uJyk7XG5cbiAgICBsZXQgcGF0aDtcblxuICAgIHRyeSB7XG4gICAgICBwYXRoID0gYnVpbGRVUkwoXG4gICAgICAgIHBhcnNlZC5wYXRobmFtZSArIHBhcnNlZC5zZWFyY2gsXG4gICAgICAgIGNvbmZpZy5wYXJhbXMsXG4gICAgICAgIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyXG4gICAgICApLnJlcGxhY2UoL15cXD8vLCAnJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBjdXN0b21FcnIgPSBuZXcgRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgY3VzdG9tRXJyLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgIGN1c3RvbUVyci51cmwgPSBjb25maWcudXJsO1xuICAgICAgY3VzdG9tRXJyLmV4aXN0cyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVqZWN0KGN1c3RvbUVycik7XG4gICAgfVxuXG4gICAgaGVhZGVycy5zZXQoXG4gICAgICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgICAgICdnemlwLCBjb21wcmVzcywgZGVmbGF0ZScgKyAoaXNCcm90bGlTdXBwb3J0ZWQgPyAnLCBicicgOiAnJyksIGZhbHNlXG4gICAgICApO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHBhdGgsXG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMudG9KU09OKCksXG4gICAgICBhZ2VudHM6IHsgaHR0cDogY29uZmlnLmh0dHBBZ2VudCwgaHR0cHM6IGNvbmZpZy5odHRwc0FnZW50IH0sXG4gICAgICBhdXRoLFxuICAgICAgcHJvdG9jb2wsXG4gICAgICBmYW1pbHksXG4gICAgICBiZWZvcmVSZWRpcmVjdDogZGlzcGF0Y2hCZWZvcmVSZWRpcmVjdCxcbiAgICAgIGJlZm9yZVJlZGlyZWN0czoge31cbiAgICB9O1xuXG4gICAgLy8gY2FjaGVhYmxlLWxvb2t1cCBpbnRlZ3JhdGlvbiBob3RmaXhcbiAgICAhdXRpbHMuaXNVbmRlZmluZWQobG9va3VwKSAmJiAob3B0aW9ucy5sb29rdXAgPSBsb29rdXApO1xuXG4gICAgaWYgKGNvbmZpZy5zb2NrZXRQYXRoKSB7XG4gICAgICBvcHRpb25zLnNvY2tldFBhdGggPSBjb25maWcuc29ja2V0UGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5ob3N0bmFtZSA9IHBhcnNlZC5ob3N0bmFtZS5zdGFydHNXaXRoKFwiW1wiKSA/IHBhcnNlZC5ob3N0bmFtZS5zbGljZSgxLCAtMSkgOiBwYXJzZWQuaG9zdG5hbWU7XG4gICAgICBvcHRpb25zLnBvcnQgPSBwYXJzZWQucG9ydDtcbiAgICAgIHNldFByb3h5KG9wdGlvbnMsIGNvbmZpZy5wcm94eSwgcHJvdG9jb2wgKyAnLy8nICsgcGFyc2VkLmhvc3RuYW1lICsgKHBhcnNlZC5wb3J0ID8gJzonICsgcGFyc2VkLnBvcnQgOiAnJykgKyBvcHRpb25zLnBhdGgpO1xuICAgIH1cblxuICAgIGxldCB0cmFuc3BvcnQ7XG4gICAgY29uc3QgaXNIdHRwc1JlcXVlc3QgPSBpc0h0dHBzLnRlc3Qob3B0aW9ucy5wcm90b2NvbCk7XG4gICAgb3B0aW9ucy5hZ2VudCA9IGlzSHR0cHNSZXF1ZXN0ID8gY29uZmlnLmh0dHBzQWdlbnQgOiBjb25maWcuaHR0cEFnZW50O1xuICAgIGlmIChjb25maWcudHJhbnNwb3J0KSB7XG4gICAgICB0cmFuc3BvcnQgPSBjb25maWcudHJhbnNwb3J0O1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLm1heFJlZGlyZWN0cyA9PT0gMCkge1xuICAgICAgdHJhbnNwb3J0ID0gaXNIdHRwc1JlcXVlc3QgPyBodHRwcyA6IGh0dHA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb25maWcubWF4UmVkaXJlY3RzKSB7XG4gICAgICAgIG9wdGlvbnMubWF4UmVkaXJlY3RzID0gY29uZmlnLm1heFJlZGlyZWN0cztcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuYmVmb3JlUmVkaXJlY3QpIHtcbiAgICAgICAgb3B0aW9ucy5iZWZvcmVSZWRpcmVjdHMuY29uZmlnID0gY29uZmlnLmJlZm9yZVJlZGlyZWN0O1xuICAgICAgfVxuICAgICAgdHJhbnNwb3J0ID0gaXNIdHRwc1JlcXVlc3QgPyBodHRwc0ZvbGxvdyA6IGh0dHBGb2xsb3c7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5tYXhCb2R5TGVuZ3RoID4gLTEpIHtcbiAgICAgIG9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IGNvbmZpZy5tYXhCb2R5TGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb2xsb3ctcmVkaXJlY3RzIGRvZXMgbm90IHNraXAgY29tcGFyaXNvbiwgc28gaXQgc2hvdWxkIGFsd2F5cyBzdWNjZWVkIGZvciBheGlvcyAtMSB1bmxpbWl0ZWRcbiAgICAgIG9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IEluZmluaXR5O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuaW5zZWN1cmVIVFRQUGFyc2VyKSB7XG4gICAgICBvcHRpb25zLmluc2VjdXJlSFRUUFBhcnNlciA9IGNvbmZpZy5pbnNlY3VyZUhUVFBQYXJzZXI7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSByZXF1ZXN0XG4gICAgcmVxID0gdHJhbnNwb3J0LnJlcXVlc3Qob3B0aW9ucywgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzKSB7XG4gICAgICBpZiAocmVxLmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzdHJlYW1zID0gW3Jlc107XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlTGVuZ3RoID0gK3Jlcy5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xuXG4gICAgICBpZiAob25Eb3dubG9hZFByb2dyZXNzIHx8IG1heERvd25sb2FkUmF0ZSkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1TdHJlYW0gPSBuZXcgQXhpb3NUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICAgIG1heFJhdGU6IHV0aWxzLnRvRmluaXRlTnVtYmVyKG1heERvd25sb2FkUmF0ZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb25Eb3dubG9hZFByb2dyZXNzICYmIHRyYW5zZm9ybVN0cmVhbS5vbigncHJvZ3Jlc3MnLCBmbHVzaE9uRmluaXNoKFxuICAgICAgICAgIHRyYW5zZm9ybVN0cmVhbSxcbiAgICAgICAgICBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICAgICAgcmVzcG9uc2VMZW5ndGgsXG4gICAgICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvbkRvd25sb2FkUHJvZ3Jlc3MpLCB0cnVlLCAzKVxuICAgICAgICAgIClcbiAgICAgICAgKSk7XG5cbiAgICAgICAgc3RyZWFtcy5wdXNoKHRyYW5zZm9ybVN0cmVhbSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlY29tcHJlc3MgdGhlIHJlc3BvbnNlIGJvZHkgdHJhbnNwYXJlbnRseSBpZiByZXF1aXJlZFxuICAgICAgbGV0IHJlc3BvbnNlU3RyZWFtID0gcmVzO1xuXG4gICAgICAvLyByZXR1cm4gdGhlIGxhc3QgcmVxdWVzdCBpbiBjYXNlIG9mIHJlZGlyZWN0c1xuICAgICAgY29uc3QgbGFzdFJlcXVlc3QgPSByZXMucmVxIHx8IHJlcTtcblxuICAgICAgLy8gaWYgZGVjb21wcmVzcyBkaXNhYmxlZCB3ZSBzaG91bGQgbm90IGRlY29tcHJlc3NcbiAgICAgIGlmIChjb25maWcuZGVjb21wcmVzcyAhPT0gZmFsc2UgJiYgcmVzLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSkge1xuICAgICAgICAvLyBpZiBubyBjb250ZW50LCBidXQgaGVhZGVycyBzdGlsbCBzYXkgdGhhdCBpdCBpcyBlbmNvZGVkLFxuICAgICAgICAvLyByZW1vdmUgdGhlIGhlYWRlciBub3QgY29uZnVzZSBkb3duc3RyZWFtIG9wZXJhdGlvbnNcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gJ0hFQUQnIHx8IHJlcy5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgICAgICBkZWxldGUgcmVzLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoKHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gfHwgJycpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgLyplc2xpbnQgZGVmYXVsdC1jYXNlOjAqL1xuICAgICAgICBjYXNlICdnemlwJzpcbiAgICAgICAgY2FzZSAneC1nemlwJzpcbiAgICAgICAgY2FzZSAnY29tcHJlc3MnOlxuICAgICAgICBjYXNlICd4LWNvbXByZXNzJzpcbiAgICAgICAgICAvLyBhZGQgdGhlIHVuemlwcGVyIHRvIHRoZSBib2R5IHN0cmVhbSBwcm9jZXNzaW5nIHBpcGVsaW5lXG4gICAgICAgICAgc3RyZWFtcy5wdXNoKHpsaWIuY3JlYXRlVW56aXAoemxpYk9wdGlvbnMpKTtcblxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY29udGVudC1lbmNvZGluZyBpbiBvcmRlciB0byBub3QgY29uZnVzZSBkb3duc3RyZWFtIG9wZXJhdGlvbnNcbiAgICAgICAgICBkZWxldGUgcmVzLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGVmbGF0ZSc6XG4gICAgICAgICAgc3RyZWFtcy5wdXNoKG5ldyBabGliSGVhZGVyVHJhbnNmb3JtU3RyZWFtKCkpO1xuXG4gICAgICAgICAgLy8gYWRkIHRoZSB1bnppcHBlciB0byB0aGUgYm9keSBzdHJlYW0gcHJvY2Vzc2luZyBwaXBlbGluZVxuICAgICAgICAgIHN0cmVhbXMucHVzaCh6bGliLmNyZWF0ZVVuemlwKHpsaWJPcHRpb25zKSk7XG5cbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGNvbnRlbnQtZW5jb2RpbmcgaW4gb3JkZXIgdG8gbm90IGNvbmZ1c2UgZG93bnN0cmVhbSBvcGVyYXRpb25zXG4gICAgICAgICAgZGVsZXRlIHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JyJzpcbiAgICAgICAgICBpZiAoaXNCcm90bGlTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIHN0cmVhbXMucHVzaCh6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoYnJvdGxpT3B0aW9ucykpO1xuICAgICAgICAgICAgZGVsZXRlIHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3BvbnNlU3RyZWFtID0gc3RyZWFtcy5sZW5ndGggPiAxID8gc3RyZWFtLnBpcGVsaW5lKHN0cmVhbXMsIHV0aWxzLm5vb3ApIDogc3RyZWFtc1swXTtcblxuICAgICAgY29uc3Qgb2ZmTGlzdGVuZXJzID0gc3RyZWFtLmZpbmlzaGVkKHJlc3BvbnNlU3RyZWFtLCAoKSA9PiB7XG4gICAgICAgIG9mZkxpc3RlbmVycygpO1xuICAgICAgICBvbkZpbmlzaGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIHN0YXR1czogcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcy5zdGF0dXNNZXNzYWdlLFxuICAgICAgICBoZWFkZXJzOiBuZXcgQXhpb3NIZWFkZXJzKHJlcy5oZWFkZXJzKSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0OiBsYXN0UmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ3N0cmVhbScpIHtcbiAgICAgICAgcmVzcG9uc2UuZGF0YSA9IHJlc3BvbnNlU3RyZWFtO1xuICAgICAgICBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNwb25zZUJ1ZmZlciA9IFtdO1xuICAgICAgICBsZXQgdG90YWxSZXNwb25zZUJ5dGVzID0gMDtcblxuICAgICAgICByZXNwb25zZVN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIGhhbmRsZVN0cmVhbURhdGEoY2h1bmspIHtcbiAgICAgICAgICByZXNwb25zZUJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgICB0b3RhbFJlc3BvbnNlQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGxlbmd0aCBpcyBub3Qgb3ZlciB0aGUgbWF4Q29udGVudExlbmd0aCBpZiBzcGVjaWZpZWRcbiAgICAgICAgICBpZiAoY29uZmlnLm1heENvbnRlbnRMZW5ndGggPiAtMSAmJiB0b3RhbFJlc3BvbnNlQnl0ZXMgPiBjb25maWcubWF4Q29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgLy8gc3RyZWFtLmRlc3Ryb3koKSBlbWl0IGFib3J0ZWQgZXZlbnQgYmVmb3JlIGNhbGxpbmcgcmVqZWN0KCkgb24gTm9kZS5qcyB2MTZcbiAgICAgICAgICAgIHJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc3BvbnNlU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignbWF4Q29udGVudExlbmd0aCBzaXplIG9mICcgKyBjb25maWcubWF4Q29udGVudExlbmd0aCArICcgZXhjZWVkZWQnLFxuICAgICAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIGNvbmZpZywgbGFzdFJlcXVlc3QpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlU3RyZWFtLm9uKCdhYm9ydGVkJywgZnVuY3Rpb24gaGFuZGxlclN0cmVhbUFib3J0ZWQoKSB7XG4gICAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgICAnc3RyZWFtIGhhcyBiZWVuIGFib3J0ZWQnLFxuICAgICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgbGFzdFJlcXVlc3RcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc3BvbnNlU3RyZWFtLmRlc3Ryb3koZXJyKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzcG9uc2VTdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gaGFuZGxlU3RyZWFtRXJyb3IoZXJyKSB7XG4gICAgICAgICAgaWYgKHJlcS5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgICAgICByZWplY3QoQXhpb3NFcnJvci5mcm9tKGVyciwgbnVsbCwgY29uZmlnLCBsYXN0UmVxdWVzdCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZVN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gaGFuZGxlU3RyZWFtRW5kKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VCdWZmZXIubGVuZ3RoID09PSAxID8gcmVzcG9uc2VCdWZmZXJbMF0gOiBCdWZmZXIuY29uY2F0KHJlc3BvbnNlQnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgIT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VEYXRhLnRvU3RyaW5nKHJlc3BvbnNlRW5jb2RpbmcpO1xuICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlRW5jb2RpbmcgfHwgcmVzcG9uc2VFbmNvZGluZyA9PT0gJ3V0ZjgnKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhID0gdXRpbHMuc3RyaXBCT00ocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2UuZGF0YSA9IHJlc3BvbnNlRGF0YTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoQXhpb3NFcnJvci5mcm9tKGVyciwgbnVsbCwgY29uZmlnLCByZXNwb25zZS5yZXF1ZXN0LCByZXNwb25zZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBlbWl0dGVyLm9uY2UoJ2Fib3J0JywgZXJyID0+IHtcbiAgICAgICAgaWYgKCFyZXNwb25zZVN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXNwb25zZVN0cmVhbS5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgcmVzcG9uc2VTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVtaXR0ZXIub25jZSgnYWJvcnQnLCBlcnIgPT4ge1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgICByZXEuZGVzdHJveShlcnIpO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGVycm9yc1xuICAgIHJlcS5vbignZXJyb3InLCBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0RXJyb3IoZXJyKSB7XG4gICAgICAvLyBAdG9kbyByZW1vdmVcbiAgICAgIC8vIGlmIChyZXEuYWJvcnRlZCAmJiBlcnIuY29kZSAhPT0gQXhpb3NFcnJvci5FUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTKSByZXR1cm47XG4gICAgICByZWplY3QoQXhpb3NFcnJvci5mcm9tKGVyciwgbnVsbCwgY29uZmlnLCByZXEpKTtcbiAgICB9KTtcblxuICAgIC8vIHNldCB0Y3Aga2VlcCBhbGl2ZSB0byBwcmV2ZW50IGRyb3AgY29ubmVjdGlvbiBieSBwZWVyXG4gICAgcmVxLm9uKCdzb2NrZXQnLCBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0U29ja2V0KHNvY2tldCkge1xuICAgICAgLy8gZGVmYXVsdCBpbnRlcnZhbCBvZiBzZW5kaW5nIGFjayBwYWNrZXQgaXMgMSBtaW51dGVcbiAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwgMTAwMCAqIDYwKTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSByZXF1ZXN0IHRpbWVvdXRcbiAgICBpZiAoY29uZmlnLnRpbWVvdXQpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yY2luZyBhIGludCB0aW1lb3V0IHRvIGF2b2lkIHByb2JsZW1zIGlmIHRoZSBgcmVxYCBpbnRlcmZhY2UgZG9lc24ndCBoYW5kbGUgb3RoZXIgdHlwZXMuXG4gICAgICBjb25zdCB0aW1lb3V0ID0gcGFyc2VJbnQoY29uZmlnLnRpbWVvdXQsIDEwKTtcblxuICAgICAgaWYgKE51bWJlci5pc05hTih0aW1lb3V0KSkge1xuICAgICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgJ2Vycm9yIHRyeWluZyB0byBwYXJzZSBgY29uZmlnLnRpbWVvdXRgIHRvIGludCcsXG4gICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVxXG4gICAgICAgICkpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU29tZXRpbWUsIHRoZSByZXNwb25zZSB3aWxsIGJlIHZlcnkgc2xvdywgYW5kIGRvZXMgbm90IHJlc3BvbmQsIHRoZSBjb25uZWN0IGV2ZW50IHdpbGwgYmUgYmxvY2sgYnkgZXZlbnQgbG9vcCBzeXN0ZW0uXG4gICAgICAvLyBBbmQgdGltZXIgY2FsbGJhY2sgd2lsbCBiZSBmaXJlZCwgYW5kIGFib3J0KCkgd2lsbCBiZSBpbnZva2VkIGJlZm9yZSBjb25uZWN0aW9uLCB0aGVuIGdldCBcInNvY2tldCBoYW5nIHVwXCIgYW5kIGNvZGUgRUNPTk5SRVNFVC5cbiAgICAgIC8vIEF0IHRoaXMgdGltZSwgaWYgd2UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiByZXF1ZXN0LCBub2RlanMgd2lsbCBoYW5nIHVwIHNvbWUgc29ja2V0IG9uIGJhY2tncm91bmQuIGFuZCB0aGUgbnVtYmVyIHdpbGwgdXAgYW5kIHVwLlxuICAgICAgLy8gQW5kIHRoZW4gdGhlc2Ugc29ja2V0IHdoaWNoIGJlIGhhbmcgdXAgd2lsbCBkZXZvdXJpbmcgQ1BVIGxpdHRsZSBieSBsaXR0bGUuXG4gICAgICAvLyBDbGllbnRSZXF1ZXN0LnNldFRpbWVvdXQgd2lsbCBiZSBmaXJlZCBvbiB0aGUgc3BlY2lmeSBtaWxsaXNlY29uZHMsIGFuZCBjYW4gbWFrZSBzdXJlIHRoYXQgYWJvcnQoKSB3aWxsIGJlIGZpcmVkIGFmdGVyIGNvbm5lY3QuXG4gICAgICByZXEuc2V0VGltZW91dCh0aW1lb3V0LCBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0VGltZW91dCgpIHtcbiAgICAgICAgaWYgKGlzRG9uZSkgcmV0dXJuO1xuICAgICAgICBsZXQgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIGNvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyA6ICd0aW1lb3V0IGV4Y2VlZGVkJztcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbmFsID0gY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgICAgaWYgKGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICAgIHRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yID8gQXhpb3NFcnJvci5FVElNRURPVVQgOiBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVxXG4gICAgICAgICkpO1xuICAgICAgICBhYm9ydCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgaWYgKHV0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICBsZXQgZW5kZWQgPSBmYWxzZTtcbiAgICAgIGxldCBlcnJvcmVkID0gZmFsc2U7XG5cbiAgICAgIGRhdGEub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgZW5kZWQgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGRhdGEub25jZSgnZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICBlcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVxLmRlc3Ryb3koZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBkYXRhLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgaWYgKCFlbmRlZCAmJiAhZXJyb3JlZCkge1xuICAgICAgICAgIGFib3J0KG5ldyBDYW5jZWxlZEVycm9yKCdSZXF1ZXN0IHN0cmVhbSBoYXMgYmVlbiBhYm9ydGVkJywgY29uZmlnLCByZXEpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGRhdGEucGlwZShyZXEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXEuZW5kKGRhdGEpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBfX3NldFByb3h5ID0gc2V0UHJveHk7XG4iLCAiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIjEuMTAuMFwiOyIsICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlUHJvdG9jb2wodXJsKSB7XG4gIGNvbnN0IG1hdGNoID0gL14oWy0rXFx3XXsxLDI1fSkoOj9cXC9cXC98OikvLmV4ZWModXJsKTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBwYXJzZVByb3RvY29sIGZyb20gJy4vcGFyc2VQcm90b2NvbC5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5jb25zdCBEQVRBX1VSTF9QQVRURVJOID0gL14oPzooW147XSspOyk/KD86W147XSs7KT8oYmFzZTY0fCksKFtcXHNcXFNdKikkLztcblxuLyoqXG4gKiBQYXJzZSBkYXRhIHVyaSB0byBhIEJ1ZmZlciBvciBCbG9iXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gYXNCbG9iXG4gKiBAcGFyYW0gez9PYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBvcHRpb25zLkJsb2JcbiAqXG4gKiBAcmV0dXJucyB7QnVmZmVyfEJsb2J9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZyb21EYXRhVVJJKHVyaSwgYXNCbG9iLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9CbG9iID0gb3B0aW9ucyAmJiBvcHRpb25zLkJsb2IgfHwgcGxhdGZvcm0uY2xhc3Nlcy5CbG9iO1xuICBjb25zdCBwcm90b2NvbCA9IHBhcnNlUHJvdG9jb2wodXJpKTtcblxuICBpZiAoYXNCbG9iID09PSB1bmRlZmluZWQgJiYgX0Jsb2IpIHtcbiAgICBhc0Jsb2IgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHByb3RvY29sID09PSAnZGF0YScpIHtcbiAgICB1cmkgPSBwcm90b2NvbC5sZW5ndGggPyB1cmkuc2xpY2UocHJvdG9jb2wubGVuZ3RoICsgMSkgOiB1cmk7XG5cbiAgICBjb25zdCBtYXRjaCA9IERBVEFfVVJMX1BBVFRFUk4uZXhlYyh1cmkpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0ludmFsaWQgVVJMJywgQXhpb3NFcnJvci5FUlJfSU5WQUxJRF9VUkwpO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbWUgPSBtYXRjaFsxXTtcbiAgICBjb25zdCBpc0Jhc2U2NCA9IG1hdGNoWzJdO1xuICAgIGNvbnN0IGJvZHkgPSBtYXRjaFszXTtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShkZWNvZGVVUklDb21wb25lbnQoYm9keSksIGlzQmFzZTY0ID8gJ2Jhc2U2NCcgOiAndXRmOCcpO1xuXG4gICAgaWYgKGFzQmxvYikge1xuICAgICAgaWYgKCFfQmxvYikge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignQmxvYiBpcyBub3Qgc3VwcG9ydGVkJywgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IF9CbG9iKFtidWZmZXJdLCB7dHlwZTogbWltZX0pO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICB0aHJvdyBuZXcgQXhpb3NFcnJvcignVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sLCBBeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgc3RyZWFtIGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG5jb25zdCBrSW50ZXJuYWxzID0gU3ltYm9sKCdpbnRlcm5hbHMnKTtcblxuY2xhc3MgQXhpb3NUcmFuc2Zvcm1TdHJlYW0gZXh0ZW5kcyBzdHJlYW0uVHJhbnNmb3Jte1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHV0aWxzLnRvRmxhdE9iamVjdChvcHRpb25zLCB7XG4gICAgICBtYXhSYXRlOiAwLFxuICAgICAgY2h1bmtTaXplOiA2NCAqIDEwMjQsXG4gICAgICBtaW5DaHVua1NpemU6IDEwMCxcbiAgICAgIHRpbWVXaW5kb3c6IDUwMCxcbiAgICAgIHRpY2tzUmF0ZTogMixcbiAgICAgIHNhbXBsZXNDb3VudDogMTVcbiAgICB9LCBudWxsLCAocHJvcCwgc291cmNlKSA9PiB7XG4gICAgICByZXR1cm4gIXV0aWxzLmlzVW5kZWZpbmVkKHNvdXJjZVtwcm9wXSk7XG4gICAgfSk7XG5cbiAgICBzdXBlcih7XG4gICAgICByZWFkYWJsZUhpZ2hXYXRlck1hcms6IG9wdGlvbnMuY2h1bmtTaXplXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzW2tJbnRlcm5hbHNdID0ge1xuICAgICAgdGltZVdpbmRvdzogb3B0aW9ucy50aW1lV2luZG93LFxuICAgICAgY2h1bmtTaXplOiBvcHRpb25zLmNodW5rU2l6ZSxcbiAgICAgIG1heFJhdGU6IG9wdGlvbnMubWF4UmF0ZSxcbiAgICAgIG1pbkNodW5rU2l6ZTogb3B0aW9ucy5taW5DaHVua1NpemUsXG4gICAgICBieXRlc1NlZW46IDAsXG4gICAgICBpc0NhcHR1cmVkOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkQnl0ZXNMb2FkZWQ6IDAsXG4gICAgICB0czogRGF0ZS5ub3coKSxcbiAgICAgIGJ5dGVzOiAwLFxuICAgICAgb25SZWFkQ2FsbGJhY2s6IG51bGxcbiAgICB9O1xuXG4gICAgdGhpcy5vbignbmV3TGlzdGVuZXInLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQgPT09ICdwcm9ncmVzcycpIHtcbiAgICAgICAgaWYgKCFpbnRlcm5hbHMuaXNDYXB0dXJlZCkge1xuICAgICAgICAgIGludGVybmFscy5pc0NhcHR1cmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3JlYWQoc2l6ZSkge1xuICAgIGNvbnN0IGludGVybmFscyA9IHRoaXNba0ludGVybmFsc107XG5cbiAgICBpZiAoaW50ZXJuYWxzLm9uUmVhZENhbGxiYWNrKSB7XG4gICAgICBpbnRlcm5hbHMub25SZWFkQ2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuX3JlYWQoc2l6ZSk7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzW2tJbnRlcm5hbHNdO1xuICAgIGNvbnN0IG1heFJhdGUgPSBpbnRlcm5hbHMubWF4UmF0ZTtcblxuICAgIGNvbnN0IHJlYWRhYmxlSGlnaFdhdGVyTWFyayA9IHRoaXMucmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuXG4gICAgY29uc3QgdGltZVdpbmRvdyA9IGludGVybmFscy50aW1lV2luZG93O1xuXG4gICAgY29uc3QgZGl2aWRlciA9IDEwMDAgLyB0aW1lV2luZG93O1xuICAgIGNvbnN0IGJ5dGVzVGhyZXNob2xkID0gKG1heFJhdGUgLyBkaXZpZGVyKTtcbiAgICBjb25zdCBtaW5DaHVua1NpemUgPSBpbnRlcm5hbHMubWluQ2h1bmtTaXplICE9PSBmYWxzZSA/IE1hdGgubWF4KGludGVybmFscy5taW5DaHVua1NpemUsIGJ5dGVzVGhyZXNob2xkICogMC4wMSkgOiAwO1xuXG4gICAgY29uc3QgcHVzaENodW5rID0gKF9jaHVuaywgX2NhbGxiYWNrKSA9PiB7XG4gICAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKF9jaHVuayk7XG4gICAgICBpbnRlcm5hbHMuYnl0ZXNTZWVuICs9IGJ5dGVzO1xuICAgICAgaW50ZXJuYWxzLmJ5dGVzICs9IGJ5dGVzO1xuXG4gICAgICBpbnRlcm5hbHMuaXNDYXB0dXJlZCAmJiB0aGlzLmVtaXQoJ3Byb2dyZXNzJywgaW50ZXJuYWxzLmJ5dGVzU2Vlbik7XG5cbiAgICAgIGlmICh0aGlzLnB1c2goX2NodW5rKSkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKF9jYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbHMub25SZWFkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgaW50ZXJuYWxzLm9uUmVhZENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKF9jYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNmb3JtQ2h1bmsgPSAoX2NodW5rLCBfY2FsbGJhY2spID0+IHtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKF9jaHVuayk7XG4gICAgICBsZXQgY2h1bmtSZW1haW5kZXIgPSBudWxsO1xuICAgICAgbGV0IG1heENodW5rU2l6ZSA9IHJlYWRhYmxlSGlnaFdhdGVyTWFyaztcbiAgICAgIGxldCBieXRlc0xlZnQ7XG4gICAgICBsZXQgcGFzc2VkID0gMDtcblxuICAgICAgaWYgKG1heFJhdGUpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBpZiAoIWludGVybmFscy50cyB8fCAocGFzc2VkID0gKG5vdyAtIGludGVybmFscy50cykpID49IHRpbWVXaW5kb3cpIHtcbiAgICAgICAgICBpbnRlcm5hbHMudHMgPSBub3c7XG4gICAgICAgICAgYnl0ZXNMZWZ0ID0gYnl0ZXNUaHJlc2hvbGQgLSBpbnRlcm5hbHMuYnl0ZXM7XG4gICAgICAgICAgaW50ZXJuYWxzLmJ5dGVzID0gYnl0ZXNMZWZ0IDwgMCA/IC1ieXRlc0xlZnQgOiAwO1xuICAgICAgICAgIHBhc3NlZCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBieXRlc0xlZnQgPSBieXRlc1RocmVzaG9sZCAtIGludGVybmFscy5ieXRlcztcbiAgICAgIH1cblxuICAgICAgaWYgKG1heFJhdGUpIHtcbiAgICAgICAgaWYgKGJ5dGVzTGVmdCA8PSAwKSB7XG4gICAgICAgICAgLy8gbmV4dCB0aW1lIHdpbmRvd1xuICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIF9jYWxsYmFjayhudWxsLCBfY2h1bmspO1xuICAgICAgICAgIH0sIHRpbWVXaW5kb3cgLSBwYXNzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ5dGVzTGVmdCA8IG1heENodW5rU2l6ZSkge1xuICAgICAgICAgIG1heENodW5rU2l6ZSA9IGJ5dGVzTGVmdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF4Q2h1bmtTaXplICYmIGNodW5rU2l6ZSA+IG1heENodW5rU2l6ZSAmJiAoY2h1bmtTaXplIC0gbWF4Q2h1bmtTaXplKSA+IG1pbkNodW5rU2l6ZSkge1xuICAgICAgICBjaHVua1JlbWFpbmRlciA9IF9jaHVuay5zdWJhcnJheShtYXhDaHVua1NpemUpO1xuICAgICAgICBfY2h1bmsgPSBfY2h1bmsuc3ViYXJyYXkoMCwgbWF4Q2h1bmtTaXplKTtcbiAgICAgIH1cblxuICAgICAgcHVzaENodW5rKF9jaHVuaywgY2h1bmtSZW1haW5kZXIgPyAoKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soX2NhbGxiYWNrLCBudWxsLCBjaHVua1JlbWFpbmRlcik7XG4gICAgICB9IDogX2NhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgdHJhbnNmb3JtQ2h1bmsoY2h1bmssIGZ1bmN0aW9uIHRyYW5zZm9ybU5leHRDaHVuayhlcnIsIF9jaHVuaykge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF9jaHVuaykge1xuICAgICAgICB0cmFuc2Zvcm1DaHVuayhfY2h1bmssIHRyYW5zZm9ybU5leHRDaHVuayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBeGlvc1RyYW5zZm9ybVN0cmVhbTtcbiIsICJpbXBvcnQgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCB7UmVhZGFibGV9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgcmVhZEJsb2IgZnJvbSBcIi4vcmVhZEJsb2IuanNcIjtcbmltcG9ydCBwbGF0Zm9ybSBmcm9tIFwiLi4vcGxhdGZvcm0vaW5kZXguanNcIjtcblxuY29uc3QgQk9VTkRBUllfQUxQSEFCRVQgPSBwbGF0Zm9ybS5BTFBIQUJFVC5BTFBIQV9ESUdJVCArICctXyc7XG5cbmNvbnN0IHRleHRFbmNvZGVyID0gdHlwZW9mIFRleHRFbmNvZGVyID09PSAnZnVuY3Rpb24nID8gbmV3IFRleHRFbmNvZGVyKCkgOiBuZXcgdXRpbC5UZXh0RW5jb2RlcigpO1xuXG5jb25zdCBDUkxGID0gJ1xcclxcbic7XG5jb25zdCBDUkxGX0JZVEVTID0gdGV4dEVuY29kZXIuZW5jb2RlKENSTEYpO1xuY29uc3QgQ1JMRl9CWVRFU19DT1VOVCA9IDI7XG5cbmNsYXNzIEZvcm1EYXRhUGFydCB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3Qge2VzY2FwZU5hbWV9ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICBjb25zdCBpc1N0cmluZ1ZhbHVlID0gdXRpbHMuaXNTdHJpbmcodmFsdWUpO1xuXG4gICAgbGV0IGhlYWRlcnMgPSBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiJHtlc2NhcGVOYW1lKG5hbWUpfVwiJHtcbiAgICAgICFpc1N0cmluZ1ZhbHVlICYmIHZhbHVlLm5hbWUgPyBgOyBmaWxlbmFtZT1cIiR7ZXNjYXBlTmFtZSh2YWx1ZS5uYW1lKX1cImAgOiAnJ1xuICAgIH0ke0NSTEZ9YDtcblxuICAgIGlmIChpc1N0cmluZ1ZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IHRleHRFbmNvZGVyLmVuY29kZShTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xccj9cXG58XFxyXFxuPy9nLCBDUkxGKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlcnMgKz0gYENvbnRlbnQtVHlwZTogJHt2YWx1ZS50eXBlIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJ9JHtDUkxGfWBcbiAgICB9XG5cbiAgICB0aGlzLmhlYWRlcnMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoaGVhZGVycyArIENSTEYpO1xuXG4gICAgdGhpcy5jb250ZW50TGVuZ3RoID0gaXNTdHJpbmdWYWx1ZSA/IHZhbHVlLmJ5dGVMZW5ndGggOiB2YWx1ZS5zaXplO1xuXG4gICAgdGhpcy5zaXplID0gdGhpcy5oZWFkZXJzLmJ5dGVMZW5ndGggKyB0aGlzLmNvbnRlbnRMZW5ndGggKyBDUkxGX0JZVEVTX0NPVU5UO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBhc3luYyAqZW5jb2RlKCl7XG4gICAgeWllbGQgdGhpcy5oZWFkZXJzO1xuXG4gICAgY29uc3Qge3ZhbHVlfSA9IHRoaXM7XG5cbiAgICBpZih1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQqIHJlYWRCbG9iKHZhbHVlKTtcbiAgICB9XG5cbiAgICB5aWVsZCBDUkxGX0JZVEVTO1xuICB9XG5cbiAgc3RhdGljIGVzY2FwZU5hbWUobmFtZSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhuYW1lKS5yZXBsYWNlKC9bXFxyXFxuXCJdL2csIChtYXRjaCkgPT4gKHtcbiAgICAgICAgJ1xccicgOiAnJTBEJyxcbiAgICAgICAgJ1xcbicgOiAnJTBBJyxcbiAgICAgICAgJ1wiJyA6ICclMjInLFxuICAgICAgfVttYXRjaF0pKTtcbiAgfVxufVxuXG5jb25zdCBmb3JtRGF0YVRvU3RyZWFtID0gKGZvcm0sIGhlYWRlcnNIYW5kbGVyLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB0YWcgPSAnZm9ybS1kYXRhLWJvdW5kYXJ5JyxcbiAgICBzaXplID0gMjUsXG4gICAgYm91bmRhcnkgPSB0YWcgKyAnLScgKyBwbGF0Zm9ybS5nZW5lcmF0ZVN0cmluZyhzaXplLCBCT1VOREFSWV9BTFBIQUJFVClcbiAgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYoIXV0aWxzLmlzRm9ybURhdGEoZm9ybSkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0Zvcm1EYXRhIGluc3RhbmNlIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoYm91bmRhcnkubGVuZ3RoIDwgMSB8fCBib3VuZGFyeS5sZW5ndGggPiA3MCkge1xuICAgIHRocm93IEVycm9yKCdib3VuZGFyeSBtdXN0IGJlIDEwLTcwIGNoYXJhY3RlcnMgbG9uZycpXG4gIH1cblxuICBjb25zdCBib3VuZGFyeUJ5dGVzID0gdGV4dEVuY29kZXIuZW5jb2RlKCctLScgKyBib3VuZGFyeSArIENSTEYpO1xuICBjb25zdCBmb290ZXJCeXRlcyA9IHRleHRFbmNvZGVyLmVuY29kZSgnLS0nICsgYm91bmRhcnkgKyAnLS0nICsgQ1JMRik7XG4gIGxldCBjb250ZW50TGVuZ3RoID0gZm9vdGVyQnl0ZXMuYnl0ZUxlbmd0aDtcblxuICBjb25zdCBwYXJ0cyA9IEFycmF5LmZyb20oZm9ybS5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHBhcnQgPSBuZXcgRm9ybURhdGFQYXJ0KG5hbWUsIHZhbHVlKTtcbiAgICBjb250ZW50TGVuZ3RoICs9IHBhcnQuc2l6ZTtcbiAgICByZXR1cm4gcGFydDtcbiAgfSk7XG5cbiAgY29udGVudExlbmd0aCArPSBib3VuZGFyeUJ5dGVzLmJ5dGVMZW5ndGggKiBwYXJ0cy5sZW5ndGg7XG5cbiAgY29udGVudExlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKGNvbnRlbnRMZW5ndGgpO1xuXG4gIGNvbnN0IGNvbXB1dGVkSGVhZGVycyA9IHtcbiAgICAnQ29udGVudC1UeXBlJzogYG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSR7Ym91bmRhcnl9YFxuICB9XG5cbiAgaWYgKE51bWJlci5pc0Zpbml0ZShjb250ZW50TGVuZ3RoKSkge1xuICAgIGNvbXB1dGVkSGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IGNvbnRlbnRMZW5ndGg7XG4gIH1cblxuICBoZWFkZXJzSGFuZGxlciAmJiBoZWFkZXJzSGFuZGxlcihjb21wdXRlZEhlYWRlcnMpO1xuXG4gIHJldHVybiBSZWFkYWJsZS5mcm9tKChhc3luYyBmdW5jdGlvbiAqKCkge1xuICAgIGZvcihjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICB5aWVsZCBib3VuZGFyeUJ5dGVzO1xuICAgICAgeWllbGQqIHBhcnQuZW5jb2RlKCk7XG4gICAgfVxuXG4gICAgeWllbGQgZm9vdGVyQnl0ZXM7XG4gIH0pKCkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9ybURhdGFUb1N0cmVhbTtcbiIsICJjb25zdCB7YXN5bmNJdGVyYXRvcn0gPSBTeW1ib2w7XG5cbmNvbnN0IHJlYWRCbG9iID0gYXN5bmMgZnVuY3Rpb24qIChibG9iKSB7XG4gIGlmIChibG9iLnN0cmVhbSkge1xuICAgIHlpZWxkKiBibG9iLnN0cmVhbSgpXG4gIH0gZWxzZSBpZiAoYmxvYi5hcnJheUJ1ZmZlcikge1xuICAgIHlpZWxkIGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKVxuICB9IGVsc2UgaWYgKGJsb2JbYXN5bmNJdGVyYXRvcl0pIHtcbiAgICB5aWVsZCogYmxvYlthc3luY0l0ZXJhdG9yXSgpO1xuICB9IGVsc2Uge1xuICAgIHlpZWxkIGJsb2I7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVhZEJsb2I7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBzdHJlYW0gZnJvbSBcInN0cmVhbVwiO1xuXG5jbGFzcyBabGliSGVhZGVyVHJhbnNmb3JtU3RyZWFtIGV4dGVuZHMgc3RyZWFtLlRyYW5zZm9ybSB7XG4gIF9fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAoY2h1bmsubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm0gPSB0aGlzLl9fdHJhbnNmb3JtO1xuXG4gICAgICAvLyBBZGQgRGVmYXVsdCBDb21wcmVzc2lvbiBoZWFkZXJzIGlmIG5vIHpsaWIgaGVhZGVycyBhcmUgcHJlc2VudFxuICAgICAgaWYgKGNodW5rWzBdICE9PSAxMjApIHsgLy8gSGV4OiA3OFxuICAgICAgICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMik7XG4gICAgICAgIGhlYWRlclswXSA9IDEyMDsgLy8gSGV4OiA3OFxuICAgICAgICBoZWFkZXJbMV0gPSAxNTY7IC8vIEhleDogOUMgXG4gICAgICAgIHRoaXMucHVzaChoZWFkZXIsIGVuY29kaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFpsaWJIZWFkZXJUcmFuc2Zvcm1TdHJlYW07XG4iLCAiaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuXG5jb25zdCBjYWxsYmFja2lmeSA9IChmbiwgcmVkdWNlcikgPT4ge1xuICByZXR1cm4gdXRpbHMuaXNBc3luY0ZuKGZuKSA/IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgY29uc3QgY2IgPSBhcmdzLnBvcCgpO1xuICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZWR1Y2VyID8gY2IobnVsbCwgLi4ucmVkdWNlcih2YWx1ZSkpIDogY2IobnVsbCwgdmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNiKGVycik7XG4gICAgICB9XG4gICAgfSwgY2IpO1xuICB9IDogZm47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhbGxiYWNraWZ5O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGF0YSBtYXhSYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3NhbXBsZXNDb3VudD0gMTBdXG4gKiBAcGFyYW0ge051bWJlcn0gW21pbj0gMTAwMF1cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3BlZWRvbWV0ZXIoc2FtcGxlc0NvdW50LCBtaW4pIHtcbiAgc2FtcGxlc0NvdW50ID0gc2FtcGxlc0NvdW50IHx8IDEwO1xuICBjb25zdCBieXRlcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBjb25zdCB0aW1lc3RhbXBzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGxldCBoZWFkID0gMDtcbiAgbGV0IHRhaWwgPSAwO1xuICBsZXQgZmlyc3RTYW1wbGVUUztcblxuICBtaW4gPSBtaW4gIT09IHVuZGVmaW5lZCA/IG1pbiA6IDEwMDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1c2goY2h1bmtMZW5ndGgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gdGltZXN0YW1wc1t0YWlsXTtcblxuICAgIGlmICghZmlyc3RTYW1wbGVUUykge1xuICAgICAgZmlyc3RTYW1wbGVUUyA9IG5vdztcbiAgICB9XG5cbiAgICBieXRlc1toZWFkXSA9IGNodW5rTGVuZ3RoO1xuICAgIHRpbWVzdGFtcHNbaGVhZF0gPSBub3c7XG5cbiAgICBsZXQgaSA9IHRhaWw7XG4gICAgbGV0IGJ5dGVzQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGkgIT09IGhlYWQpIHtcbiAgICAgIGJ5dGVzQ291bnQgKz0gYnl0ZXNbaSsrXTtcbiAgICAgIGkgPSBpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGhlYWQgPSAoaGVhZCArIDEpICUgc2FtcGxlc0NvdW50O1xuXG4gICAgaWYgKGhlYWQgPT09IHRhaWwpIHtcbiAgICAgIHRhaWwgPSAodGFpbCArIDEpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChub3cgLSBmaXJzdFNhbXBsZVRTIDwgbWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc2VkID0gc3RhcnRlZEF0ICYmIG5vdyAtIHN0YXJ0ZWRBdDtcblxuICAgIHJldHVybiBwYXNzZWQgPyBNYXRoLnJvdW5kKGJ5dGVzQ291bnQgKiAxMDAwIC8gcGFzc2VkKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3BlZWRvbWV0ZXI7XG4iLCAiLyoqXG4gKiBUaHJvdHRsZSBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gZnJlcVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCBmcmVxKSB7XG4gIGxldCB0aW1lc3RhbXAgPSAwO1xuICBsZXQgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCBsYXN0QXJncztcbiAgbGV0IHRpbWVyO1xuXG4gIGNvbnN0IGludm9rZSA9IChhcmdzLCBub3cgPSBEYXRlLm5vdygpKSA9PiB7XG4gICAgdGltZXN0YW1wID0gbm93O1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9XG5cbiAgY29uc3QgdGhyb3R0bGVkID0gKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBhc3NlZCA9IG5vdyAtIHRpbWVzdGFtcDtcbiAgICBpZiAoIHBhc3NlZCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGludm9rZShhcmdzLCBub3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGludm9rZShsYXN0QXJncylcbiAgICAgICAgfSwgdGhyZXNob2xkIC0gcGFzc2VkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBmbHVzaCA9ICgpID0+IGxhc3RBcmdzICYmIGludm9rZShsYXN0QXJncyk7XG5cbiAgcmV0dXJuIFt0aHJvdHRsZWQsIGZsdXNoXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGhyb3R0bGU7XG4iLCAiaW1wb3J0IHNwZWVkb21ldGVyIGZyb20gXCIuL3NwZWVkb21ldGVyLmpzXCI7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSBcIi4vdGhyb3R0bGUuanNcIjtcbmltcG9ydCB1dGlscyBmcm9tIFwiLi4vdXRpbHMuanNcIjtcblxuZXhwb3J0IGNvbnN0IHByb2dyZXNzRXZlbnRSZWR1Y2VyID0gKGxpc3RlbmVyLCBpc0Rvd25sb2FkU3RyZWFtLCBmcmVxID0gMykgPT4ge1xuICBsZXQgYnl0ZXNOb3RpZmllZCA9IDA7XG4gIGNvbnN0IF9zcGVlZG9tZXRlciA9IHNwZWVkb21ldGVyKDUwLCAyNTApO1xuXG4gIHJldHVybiB0aHJvdHRsZShlID0+IHtcbiAgICBjb25zdCBsb2FkZWQgPSBlLmxvYWRlZDtcbiAgICBjb25zdCB0b3RhbCA9IGUubGVuZ3RoQ29tcHV0YWJsZSA/IGUudG90YWwgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvZ3Jlc3NCeXRlcyA9IGxvYWRlZCAtIGJ5dGVzTm90aWZpZWQ7XG4gICAgY29uc3QgcmF0ZSA9IF9zcGVlZG9tZXRlcihwcm9ncmVzc0J5dGVzKTtcbiAgICBjb25zdCBpblJhbmdlID0gbG9hZGVkIDw9IHRvdGFsO1xuXG4gICAgYnl0ZXNOb3RpZmllZCA9IGxvYWRlZDtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBsb2FkZWQsXG4gICAgICB0b3RhbCxcbiAgICAgIHByb2dyZXNzOiB0b3RhbCA/IChsb2FkZWQgLyB0b3RhbCkgOiB1bmRlZmluZWQsXG4gICAgICBieXRlczogcHJvZ3Jlc3NCeXRlcyxcbiAgICAgIHJhdGU6IHJhdGUgPyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXN0aW1hdGVkOiByYXRlICYmIHRvdGFsICYmIGluUmFuZ2UgPyAodG90YWwgLSBsb2FkZWQpIC8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGV2ZW50OiBlLFxuICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdG90YWwgIT0gbnVsbCxcbiAgICAgIFtpc0Rvd25sb2FkU3RyZWFtID8gJ2Rvd25sb2FkJyA6ICd1cGxvYWQnXTogdHJ1ZVxuICAgIH07XG5cbiAgICBsaXN0ZW5lcihkYXRhKTtcbiAgfSwgZnJlcSk7XG59XG5cbmV4cG9ydCBjb25zdCBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yID0gKHRvdGFsLCB0aHJvdHRsZWQpID0+IHtcbiAgY29uc3QgbGVuZ3RoQ29tcHV0YWJsZSA9IHRvdGFsICE9IG51bGw7XG5cbiAgcmV0dXJuIFsobG9hZGVkKSA9PiB0aHJvdHRsZWRbMF0oe1xuICAgIGxlbmd0aENvbXB1dGFibGUsXG4gICAgdG90YWwsXG4gICAgbG9hZGVkXG4gIH0pLCB0aHJvdHRsZWRbMV1dO1xufVxuXG5leHBvcnQgY29uc3QgYXN5bmNEZWNvcmF0b3IgPSAoZm4pID0+ICguLi5hcmdzKSA9PiB1dGlscy5hc2FwKCgpID0+IGZuKC4uLmFyZ3MpKTtcbiIsICJpbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgPyAoKG9yaWdpbiwgaXNNU0lFKSA9PiAodXJsKSA9PiB7XG4gIHVybCA9IG5ldyBVUkwodXJsLCBwbGF0Zm9ybS5vcmlnaW4pO1xuXG4gIHJldHVybiAoXG4gICAgb3JpZ2luLnByb3RvY29sID09PSB1cmwucHJvdG9jb2wgJiZcbiAgICBvcmlnaW4uaG9zdCA9PT0gdXJsLmhvc3QgJiZcbiAgICAoaXNNU0lFIHx8IG9yaWdpbi5wb3J0ID09PSB1cmwucG9ydClcbiAgKTtcbn0pKFxuICBuZXcgVVJMKHBsYXRmb3JtLm9yaWdpbiksXG4gIHBsYXRmb3JtLm5hdmlnYXRvciAmJiAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KHBsYXRmb3JtLm5hdmlnYXRvci51c2VyQWdlbnQpXG4pIDogKCkgPT4gdHJ1ZTtcbiIsICJpbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICB7XG4gICAgd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICBjb25zdCBjb29raWUgPSBbbmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSldO1xuXG4gICAgICB1dGlscy5pc051bWJlcihleHBpcmVzKSAmJiBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG5cbiAgICAgIHV0aWxzLmlzU3RyaW5nKHBhdGgpICYmIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcblxuICAgICAgdXRpbHMuaXNTdHJpbmcoZG9tYWluKSAmJiBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuXG4gICAgICBzZWN1cmUgPT09IHRydWUgJiYgY29va2llLnB1c2goJ3NlY3VyZScpO1xuXG4gICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICB9LFxuXG4gICAgcmVhZChuYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgIH0sXG5cbiAgICByZW1vdmUobmFtZSkge1xuICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICB9XG4gIH1cblxuICA6XG5cbiAgLy8gTm9uLXN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICB7XG4gICAgd3JpdGUoKSB7fSxcbiAgICByZWFkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW1vdmUoKSB7fVxuICB9O1xuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi9BeGlvc0hlYWRlcnMuanNcIjtcblxuY29uc3QgaGVhZGVyc1RvT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyBpbnN0YW5jZW9mIEF4aW9zSGVhZGVycyA/IHsgLi4udGhpbmcgfSA6IHRoaW5nO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICBjb25zdCBjb25maWcgPSB7fTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSwgcHJvcCwgY2FzZWxlc3MpIHtcbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlLmNhbGwoe2Nhc2VsZXNzfSwgdGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2Uoe30sIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKGEsIGIsIHByb3AgLCBjYXNlbGVzcykge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiLCBwcm9wICwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhLCBwcm9wICwgY2FzZWxlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiB2YWx1ZUZyb21Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURpcmVjdEtleXMoYSwgYiwgcHJvcCkge1xuICAgIGlmIChwcm9wIGluIGNvbmZpZzIpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiKTtcbiAgICB9IGVsc2UgaWYgKHByb3AgaW4gY29uZmlnMSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVyZ2VNYXAgPSB7XG4gICAgdXJsOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIG1ldGhvZDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBkYXRhOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGJhc2VVUkw6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBwYXJhbXNTZXJpYWxpemVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dE1lc3NhZ2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aENyZWRlbnRpYWxzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhYU1JGVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYWRhcHRlcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZVR5cGU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkNvb2tpZU5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkhlYWRlck5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25VcGxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgZGVjb21wcmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhDb250ZW50TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heEJvZHlMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYmVmb3JlUmVkaXJlY3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNwb3J0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwc0FnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGNhbmNlbFRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHNvY2tldFBhdGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VFbmNvZGluZzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB2YWxpZGF0ZVN0YXR1czogbWVyZ2VEaXJlY3RLZXlzLFxuICAgIGhlYWRlcnM6IChhLCBiICwgcHJvcCkgPT4gbWVyZ2VEZWVwUHJvcGVydGllcyhoZWFkZXJzVG9PYmplY3QoYSksIGhlYWRlcnNUb09iamVjdChiKSxwcm9wLCB0cnVlKVxuICB9O1xuXG4gIHV0aWxzLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnMSwgY29uZmlnMikpLCBmdW5jdGlvbiBjb21wdXRlQ29uZmlnVmFsdWUocHJvcCkge1xuICAgIGNvbnN0IG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0sIHByb3ApO1xuICAgICh1dGlscy5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cbiIsICJpbXBvcnQgcGxhdGZvcm0gZnJvbSBcIi4uL3BsYXRmb3JtL2luZGV4LmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgaXNVUkxTYW1lT3JpZ2luIGZyb20gXCIuL2lzVVJMU2FtZU9yaWdpbi5qc1wiO1xuaW1wb3J0IGNvb2tpZXMgZnJvbSBcIi4vY29va2llcy5qc1wiO1xuaW1wb3J0IGJ1aWxkRnVsbFBhdGggZnJvbSBcIi4uL2NvcmUvYnVpbGRGdWxsUGF0aC5qc1wiO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gXCIuLi9jb3JlL21lcmdlQ29uZmlnLmpzXCI7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IGJ1aWxkVVJMIGZyb20gXCIuL2J1aWxkVVJMLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChjb25maWcpID0+IHtcbiAgY29uc3QgbmV3Q29uZmlnID0gbWVyZ2VDb25maWcoe30sIGNvbmZpZyk7XG5cbiAgbGV0IHtkYXRhLCB3aXRoWFNSRlRva2VuLCB4c3JmSGVhZGVyTmFtZSwgeHNyZkNvb2tpZU5hbWUsIGhlYWRlcnMsIGF1dGh9ID0gbmV3Q29uZmlnO1xuXG4gIG5ld0NvbmZpZy5oZWFkZXJzID0gaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGhlYWRlcnMpO1xuXG4gIG5ld0NvbmZpZy51cmwgPSBidWlsZFVSTChidWlsZEZ1bGxQYXRoKG5ld0NvbmZpZy5iYXNlVVJMLCBuZXdDb25maWcudXJsLCBuZXdDb25maWcuYWxsb3dBYnNvbHV0ZVVybHMpLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoYXV0aCkge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgK1xuICAgICAgYnRvYSgoYXV0aC51c2VybmFtZSB8fCAnJykgKyAnOicgKyAoYXV0aC5wYXNzd29yZCA/IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhdXRoLnBhc3N3b3JkKSkgOiAnJykpXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb250ZW50VHlwZTtcblxuICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSkge1xuICAgIGlmIChwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgfHwgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKHVuZGVmaW5lZCk7IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcbiAgICB9IGVsc2UgaWYgKChjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSkgIT09IGZhbHNlKSB7XG4gICAgICAvLyBmaXggc2VtaWNvbG9uIGR1cGxpY2F0aW9uIGlzc3VlIGZvciBSZWFjdE5hdGl2ZSBGb3JtRGF0YSBpbXBsZW1lbnRhdGlvblxuICAgICAgY29uc3QgW3R5cGUsIC4uLnRva2Vuc10gPSBjb250ZW50VHlwZSA/IGNvbnRlbnRUeXBlLnNwbGl0KCc7JykubWFwKHRva2VuID0+IHRva2VuLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pIDogW107XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKFt0eXBlIHx8ICdtdWx0aXBhcnQvZm9ybS1kYXRhJywgLi4udG9rZW5zXS5qb2luKCc7ICcpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG5cbiAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudikge1xuICAgIHdpdGhYU1JGVG9rZW4gJiYgdXRpbHMuaXNGdW5jdGlvbih3aXRoWFNSRlRva2VuKSAmJiAod2l0aFhTUkZUb2tlbiA9IHdpdGhYU1JGVG9rZW4obmV3Q29uZmlnKSk7XG5cbiAgICBpZiAod2l0aFhTUkZUb2tlbiB8fCAod2l0aFhTUkZUb2tlbiAhPT0gZmFsc2UgJiYgaXNVUkxTYW1lT3JpZ2luKG5ld0NvbmZpZy51cmwpKSkge1xuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICBjb25zdCB4c3JmVmFsdWUgPSB4c3JmSGVhZGVyTmFtZSAmJiB4c3JmQ29va2llTmFtZSAmJiBjb29raWVzLnJlYWQoeHNyZkNvb2tpZU5hbWUpO1xuXG4gICAgICBpZiAoeHNyZlZhbHVlKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KHhzcmZIZWFkZXJOYW1lLCB4c3JmVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdDb25maWc7XG59XG5cbiIsICJpbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgc2V0dGxlIGZyb20gJy4vLi4vY29yZS9zZXR0bGUuanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IHBhcnNlUHJvdG9jb2wgZnJvbSAnLi4vaGVscGVycy9wYXJzZVByb3RvY29sLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCB7cHJvZ3Jlc3NFdmVudFJlZHVjZXJ9IGZyb20gJy4uL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMnO1xuaW1wb3J0IHJlc29sdmVDb25maWcgZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qc1wiO1xuXG5jb25zdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oX2NvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcbiAgICBsZXQge3Jlc3BvbnNlVHlwZSwgb25VcGxvYWRQcm9ncmVzcywgb25Eb3dubG9hZFByb2dyZXNzfSA9IF9jb25maWc7XG4gICAgbGV0IG9uQ2FuY2VsZWQ7XG4gICAgbGV0IHVwbG9hZFRocm90dGxlZCwgZG93bmxvYWRUaHJvdHRsZWQ7XG4gICAgbGV0IGZsdXNoVXBsb2FkLCBmbHVzaERvd25sb2FkO1xuXG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGZsdXNoVXBsb2FkICYmIGZsdXNoVXBsb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuICAgICAgZmx1c2hEb3dubG9hZCAmJiBmbHVzaERvd25sb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuXG4gICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG5cbiAgICAgIF9jb25maWcuc2lnbmFsICYmIF9jb25maWcuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIHJlcXVlc3Qub3BlbihfY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBfY29uZmlnLnVybCwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IF9jb25maWcudGltZW91dDtcblxuICAgIGZ1bmN0aW9uIG9ubG9hZGVuZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oXG4gICAgICAgICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9ICFyZXNwb25zZVR5cGUgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgcmVzcG9uc2VUeXBlID09PSAnanNvbicgP1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgcmVxdWVzdC5vbmxvYWRlbmQgPSBvbmxvYWRlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcbiAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgbGV0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBfY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgX2NvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyA6ICd0aW1lb3V0IGV4Y2VlZGVkJztcbiAgICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IF9jb25maWcudHJhbnNpdGlvbmFsIHx8IHRyYW5zaXRpb25hbERlZmF1bHRzO1xuICAgICAgaWYgKF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/IEF4aW9zRXJyb3IuRVRJTUVET1VUIDogQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgIHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQgJiYgcmVxdWVzdEhlYWRlcnMuc2V0Q29udGVudFR5cGUobnVsbCk7XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycy50b0pTT04oKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoX2NvbmZpZy53aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9ICEhX2NvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gX2NvbmZpZy5yZXNwb25zZVR5cGU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmIChvbkRvd25sb2FkUHJvZ3Jlc3MpIHtcbiAgICAgIChbZG93bmxvYWRUaHJvdHRsZWQsIGZsdXNoRG93bmxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25Eb3dubG9hZFByb2dyZXNzLCB0cnVlKSk7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgZG93bmxvYWRUaHJvdHRsZWQpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKG9uVXBsb2FkUHJvZ3Jlc3MgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgIChbdXBsb2FkVGhyb3R0bGVkLCBmbHVzaFVwbG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvblVwbG9hZFByb2dyZXNzKSk7XG5cbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdXBsb2FkVGhyb3R0bGVkKTtcblxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVuZCcsIGZsdXNoVXBsb2FkKTtcbiAgICB9XG5cbiAgICBpZiAoX2NvbmZpZy5jYW5jZWxUb2tlbiB8fCBfY29uZmlnLnNpZ25hbCkge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIG9uQ2FuY2VsZWQgPSBjYW5jZWwgPT4ge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCFjYW5jZWwgfHwgY2FuY2VsLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcXVlc3QpIDogY2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICBpZiAoX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgX2NvbmZpZy5zaWduYWwuYWJvcnRlZCA/IG9uQ2FuY2VsZWQoKSA6IF9jb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBwYXJzZVByb3RvY29sKF9jb25maWcudXJsKTtcblxuICAgIGlmIChwcm90b2NvbCAmJiBwbGF0Zm9ybS5wcm90b2NvbHMuaW5kZXhPZihwcm90b2NvbCkgPT09IC0xKSB7XG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1Vuc3VwcG9ydGVkIHByb3RvY29sICcgKyBwcm90b2NvbCArICc6JywgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIGNvbmZpZykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSBcIi4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzXCI7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG5jb25zdCBjb21wb3NlU2lnbmFscyA9IChzaWduYWxzLCB0aW1lb3V0KSA9PiB7XG4gIGNvbnN0IHtsZW5ndGh9ID0gKHNpZ25hbHMgPSBzaWduYWxzID8gc2lnbmFscy5maWx0ZXIoQm9vbGVhbikgOiBbXSk7XG5cbiAgaWYgKHRpbWVvdXQgfHwgbGVuZ3RoKSB7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBsZXQgYWJvcnRlZDtcblxuICAgIGNvbnN0IG9uYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBpZiAoIWFib3J0ZWQpIHtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNvbnN0IGVyciA9IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uIDogdGhpcy5yZWFzb247XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZXJyIGluc3RhbmNlb2YgQXhpb3NFcnJvciA/IGVyciA6IG5ldyBDYW5jZWxlZEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKVxuICAgIH0sIHRpbWVvdXQpXG5cbiAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgIGlmIChzaWduYWxzKSB7XG4gICAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgc2lnbmFscy5mb3JFYWNoKHNpZ25hbCA9PiB7XG4gICAgICAgICAgc2lnbmFsLnVuc3Vic2NyaWJlID8gc2lnbmFsLnVuc3Vic2NyaWJlKG9uYWJvcnQpIDogc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzaWduYWxzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gICAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gICAgc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdXRpbHMuYXNhcCh1bnN1YnNjcmliZSk7XG5cbiAgICByZXR1cm4gc2lnbmFsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2VTaWduYWxzO1xuIiwgIlxuZXhwb3J0IGNvbnN0IHN0cmVhbUNodW5rID0gZnVuY3Rpb24qIChjaHVuaywgY2h1bmtTaXplKSB7XG4gIGxldCBsZW4gPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gIGlmICghY2h1bmtTaXplIHx8IGxlbiA8IGNodW5rU2l6ZSkge1xuICAgIHlpZWxkIGNodW5rO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3MgPSAwO1xuICBsZXQgZW5kO1xuXG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBlbmQgPSBwb3MgKyBjaHVua1NpemU7XG4gICAgeWllbGQgY2h1bmsuc2xpY2UocG9zLCBlbmQpO1xuICAgIHBvcyA9IGVuZDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVhZEJ5dGVzID0gYXN5bmMgZnVuY3Rpb24qIChpdGVyYWJsZSwgY2h1bmtTaXplKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVhZFN0cmVhbShpdGVyYWJsZSkpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoY2h1bmssIGNodW5rU2l6ZSk7XG4gIH1cbn1cblxuY29uc3QgcmVhZFN0cmVhbSA9IGFzeW5jIGZ1bmN0aW9uKiAoc3RyZWFtKSB7XG4gIGlmIChzdHJlYW1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKSB7XG4gICAgeWllbGQqIHN0cmVhbTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIHRyeSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRyYWNrU3RyZWFtID0gKHN0cmVhbSwgY2h1bmtTaXplLCBvblByb2dyZXNzLCBvbkZpbmlzaCkgPT4ge1xuICBjb25zdCBpdGVyYXRvciA9IHJlYWRCeXRlcyhzdHJlYW0sIGNodW5rU2l6ZSk7XG5cbiAgbGV0IGJ5dGVzID0gMDtcbiAgbGV0IGRvbmU7XG4gIGxldCBfb25GaW5pc2ggPSAoZSkgPT4ge1xuICAgIGlmICghZG9uZSkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaChlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHtkb25lLCB2YWx1ZX0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgIF9vbkZpbmlzaCgpO1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGVuID0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICBsZXQgbG9hZGVkQnl0ZXMgPSBieXRlcyArPSBsZW47XG4gICAgICAgICAgb25Qcm9ncmVzcyhsb2FkZWRCeXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX29uRmluaXNoKGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbmNlbChyZWFzb24pIHtcbiAgICAgIF9vbkZpbmlzaChyZWFzb24pO1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yLnJldHVybigpO1xuICAgIH1cbiAgfSwge1xuICAgIGhpZ2hXYXRlck1hcms6IDJcbiAgfSlcbn1cbiIsICJpbXBvcnQgcGxhdGZvcm0gZnJvbSBcIi4uL3BsYXRmb3JtL2luZGV4LmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5pbXBvcnQgY29tcG9zZVNpZ25hbHMgZnJvbSBcIi4uL2hlbHBlcnMvY29tcG9zZVNpZ25hbHMuanNcIjtcbmltcG9ydCB7dHJhY2tTdHJlYW19IGZyb20gXCIuLi9oZWxwZXJzL3RyYWNrU3RyZWFtLmpzXCI7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IHtwcm9ncmVzc0V2ZW50UmVkdWNlciwgcHJvZ3Jlc3NFdmVudERlY29yYXRvciwgYXN5bmNEZWNvcmF0b3J9IGZyb20gXCIuLi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzXCI7XG5pbXBvcnQgcmVzb2x2ZUNvbmZpZyBmcm9tIFwiLi4vaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzXCI7XG5pbXBvcnQgc2V0dGxlIGZyb20gXCIuLi9jb3JlL3NldHRsZS5qc1wiO1xuXG5jb25zdCBpc0ZldGNoU3VwcG9ydGVkID0gdHlwZW9mIGZldGNoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBSZXF1ZXN0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBpc0ZldGNoU3VwcG9ydGVkICYmIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSA9PT0gJ2Z1bmN0aW9uJztcblxuLy8gdXNlZCBvbmx5IGluc2lkZSB0aGUgZmV0Y2ggYWRhcHRlclxuY29uc3QgZW5jb2RlVGV4dCA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgKChlbmNvZGVyKSA9PiAoc3RyKSA9PiBlbmNvZGVyLmVuY29kZShzdHIpKShuZXcgVGV4dEVuY29kZXIoKSkgOlxuICAgIGFzeW5jIChzdHIpID0+IG5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBSZXNwb25zZShzdHIpLmFycmF5QnVmZmVyKCkpXG4pO1xuXG5jb25zdCB0ZXN0ID0gKGZuLCAuLi5hcmdzKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5jb25zdCBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gPSBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmIHRlc3QoKCkgPT4ge1xuICBsZXQgZHVwbGV4QWNjZXNzZWQgPSBmYWxzZTtcblxuICBjb25zdCBoYXNDb250ZW50VHlwZSA9IG5ldyBSZXF1ZXN0KHBsYXRmb3JtLm9yaWdpbiwge1xuICAgIGJvZHk6IG5ldyBSZWFkYWJsZVN0cmVhbSgpLFxuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGdldCBkdXBsZXgoKSB7XG4gICAgICBkdXBsZXhBY2Nlc3NlZCA9IHRydWU7XG4gICAgICByZXR1cm4gJ2hhbGYnO1xuICAgIH0sXG4gIH0pLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKTtcblxuICByZXR1cm4gZHVwbGV4QWNjZXNzZWQgJiYgIWhhc0NvbnRlbnRUeXBlO1xufSk7XG5cbmNvbnN0IERFRkFVTFRfQ0hVTktfU0laRSA9IDY0ICogMTAyNDtcblxuY29uc3Qgc3VwcG9ydHNSZXNwb25zZVN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiZcbiAgdGVzdCgoKSA9PiB1dGlscy5pc1JlYWRhYmxlU3RyZWFtKG5ldyBSZXNwb25zZSgnJykuYm9keSkpO1xuXG5cbmNvbnN0IHJlc29sdmVycyA9IHtcbiAgc3RyZWFtOiBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmICgocmVzKSA9PiByZXMuYm9keSlcbn07XG5cbmlzRmV0Y2hTdXBwb3J0ZWQgJiYgKCgocmVzKSA9PiB7XG4gIFsndGV4dCcsICdhcnJheUJ1ZmZlcicsICdibG9iJywgJ2Zvcm1EYXRhJywgJ3N0cmVhbSddLmZvckVhY2godHlwZSA9PiB7XG4gICAgIXJlc29sdmVyc1t0eXBlXSAmJiAocmVzb2x2ZXJzW3R5cGVdID0gdXRpbHMuaXNGdW5jdGlvbihyZXNbdHlwZV0pID8gKHJlcykgPT4gcmVzW3R5cGVdKCkgOlxuICAgICAgKF8sIGNvbmZpZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULCBjb25maWcpO1xuICAgICAgfSlcbiAgfSk7XG59KShuZXcgUmVzcG9uc2UpKTtcblxuY29uc3QgZ2V0Qm9keUxlbmd0aCA9IGFzeW5jIChib2R5KSA9PiB7XG4gIGlmIChib2R5ID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmKHV0aWxzLmlzQmxvYihib2R5KSkge1xuICAgIHJldHVybiBib2R5LnNpemU7XG4gIH1cblxuICBpZih1dGlscy5pc1NwZWNDb21wbGlhbnRGb3JtKGJvZHkpKSB7XG4gICAgY29uc3QgX3JlcXVlc3QgPSBuZXcgUmVxdWVzdChwbGF0Zm9ybS5vcmlnaW4sIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keSxcbiAgICB9KTtcbiAgICByZXR1cm4gKGF3YWl0IF9yZXF1ZXN0LmFycmF5QnVmZmVyKCkpLmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscy5pc0FycmF5QnVmZmVyVmlldyhib2R5KSB8fCB1dGlscy5pc0FycmF5QnVmZmVyKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGJvZHkpKSB7XG4gICAgYm9keSA9IGJvZHkgKyAnJztcbiAgfVxuXG4gIGlmKHV0aWxzLmlzU3RyaW5nKGJvZHkpKSB7XG4gICAgcmV0dXJuIChhd2FpdCBlbmNvZGVUZXh0KGJvZHkpKS5ieXRlTGVuZ3RoO1xuICB9XG59XG5cbmNvbnN0IHJlc29sdmVCb2R5TGVuZ3RoID0gYXN5bmMgKGhlYWRlcnMsIGJvZHkpID0+IHtcbiAgY29uc3QgbGVuZ3RoID0gdXRpbHMudG9GaW5pdGVOdW1iZXIoaGVhZGVycy5nZXRDb250ZW50TGVuZ3RoKCkpO1xuXG4gIHJldHVybiBsZW5ndGggPT0gbnVsbCA/IGdldEJvZHlMZW5ndGgoYm9keSkgOiBsZW5ndGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKGFzeW5jIChjb25maWcpID0+IHtcbiAgbGV0IHtcbiAgICB1cmwsXG4gICAgbWV0aG9kLFxuICAgIGRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbFRva2VuLFxuICAgIHRpbWVvdXQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgcmVzcG9uc2VUeXBlLFxuICAgIGhlYWRlcnMsXG4gICAgd2l0aENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJyxcbiAgICBmZXRjaE9wdGlvbnNcbiAgfSA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcblxuICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgPyAocmVzcG9uc2VUeXBlICsgJycpLnRvTG93ZXJDYXNlKCkgOiAndGV4dCc7XG5cbiAgbGV0IGNvbXBvc2VkU2lnbmFsID0gY29tcG9zZVNpZ25hbHMoW3NpZ25hbCwgY2FuY2VsVG9rZW4gJiYgY2FuY2VsVG9rZW4udG9BYm9ydFNpZ25hbCgpXSwgdGltZW91dCk7XG5cbiAgbGV0IHJlcXVlc3Q7XG5cbiAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb21wb3NlZFNpZ25hbCAmJiBjb21wb3NlZFNpZ25hbC51bnN1YnNjcmliZSAmJiAoKCkgPT4ge1xuICAgICAgY29tcG9zZWRTaWduYWwudW5zdWJzY3JpYmUoKTtcbiAgfSk7XG5cbiAgbGV0IHJlcXVlc3RDb250ZW50TGVuZ3RoO1xuXG4gIHRyeSB7XG4gICAgaWYgKFxuICAgICAgb25VcGxvYWRQcm9ncmVzcyAmJiBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gJiYgbWV0aG9kICE9PSAnZ2V0JyAmJiBtZXRob2QgIT09ICdoZWFkJyAmJlxuICAgICAgKHJlcXVlc3RDb250ZW50TGVuZ3RoID0gYXdhaXQgcmVzb2x2ZUJvZHlMZW5ndGgoaGVhZGVycywgZGF0YSkpICE9PSAwXG4gICAgKSB7XG4gICAgICBsZXQgX3JlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IGRhdGEsXG4gICAgICAgIGR1cGxleDogXCJoYWxmXCJcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgY29udGVudFR5cGVIZWFkZXI7XG5cbiAgICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpICYmIChjb250ZW50VHlwZUhlYWRlciA9IF9yZXF1ZXN0LmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkpIHtcbiAgICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZUhlYWRlcilcbiAgICAgIH1cblxuICAgICAgaWYgKF9yZXF1ZXN0LmJvZHkpIHtcbiAgICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9IHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgICAgcmVxdWVzdENvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25VcGxvYWRQcm9ncmVzcykpXG4gICAgICAgICk7XG5cbiAgICAgICAgZGF0YSA9IHRyYWNrU3RyZWFtKF9yZXF1ZXN0LmJvZHksIERFRkFVTFRfQ0hVTktfU0laRSwgb25Qcm9ncmVzcywgZmx1c2gpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXRpbHMuaXNTdHJpbmcod2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgd2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzID8gJ2luY2x1ZGUnIDogJ29taXQnO1xuICAgIH1cblxuICAgIC8vIENsb3VkZmxhcmUgV29ya2VycyB0aHJvd3Mgd2hlbiBjcmVkZW50aWFscyBhcmUgZGVmaW5lZFxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2xvdWRmbGFyZS93b3JrZXJkL2lzc3Vlcy85MDJcbiAgICBjb25zdCBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID0gXCJjcmVkZW50aWFsc1wiIGluIFJlcXVlc3QucHJvdG90eXBlO1xuICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgIC4uLmZldGNoT3B0aW9ucyxcbiAgICAgIHNpZ25hbDogY29tcG9zZWRTaWduYWwsXG4gICAgICBtZXRob2Q6IG1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgICAgaGVhZGVyczogaGVhZGVycy5ub3JtYWxpemUoKS50b0pTT04oKSxcbiAgICAgIGJvZHk6IGRhdGEsXG4gICAgICBkdXBsZXg6IFwiaGFsZlwiLFxuICAgICAgY3JlZGVudGlhbHM6IGlzQ3JlZGVudGlhbHNTdXBwb3J0ZWQgPyB3aXRoQ3JlZGVudGlhbHMgOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QsIGZldGNoT3B0aW9ucyk7XG5cbiAgICBjb25zdCBpc1N0cmVhbVJlc3BvbnNlID0gc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAocmVzcG9uc2VUeXBlID09PSAnc3RyZWFtJyB8fCByZXNwb25zZVR5cGUgPT09ICdyZXNwb25zZScpO1xuXG4gICAgaWYgKHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKG9uRG93bmxvYWRQcm9ncmVzcyB8fCAoaXNTdHJlYW1SZXNwb25zZSAmJiB1bnN1YnNjcmliZSkpKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge307XG5cbiAgICAgIFsnc3RhdHVzJywgJ3N0YXR1c1RleHQnLCAnaGVhZGVycyddLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIG9wdGlvbnNbcHJvcF0gPSByZXNwb25zZVtwcm9wXTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNwb25zZUNvbnRlbnRMZW5ndGggPSB1dGlscy50b0Zpbml0ZU51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSk7XG5cbiAgICAgIGNvbnN0IFtvblByb2dyZXNzLCBmbHVzaF0gPSBvbkRvd25sb2FkUHJvZ3Jlc3MgJiYgcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgcmVzcG9uc2VDb250ZW50TGVuZ3RoLFxuICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvbkRvd25sb2FkUHJvZ3Jlc3MpLCB0cnVlKVxuICAgICAgKSB8fCBbXTtcblxuICAgICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoXG4gICAgICAgIHRyYWNrU3RyZWFtKHJlc3BvbnNlLmJvZHksIERFRkFVTFRfQ0hVTktfU0laRSwgb25Qcm9ncmVzcywgKCkgPT4ge1xuICAgICAgICAgIGZsdXNoICYmIGZsdXNoKCk7XG4gICAgICAgICAgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSksXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlIHx8ICd0ZXh0JztcblxuICAgIGxldCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNvbHZlcnNbdXRpbHMuZmluZEtleShyZXNvbHZlcnMsIHJlc3BvbnNlVHlwZSkgfHwgJ3RleHQnXShyZXNwb25zZSwgY29uZmlnKTtcblxuICAgICFpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIGhlYWRlcnM6IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0XG4gICAgICB9KVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvTG9hZCBmYWlsZWR8ZmV0Y2gvaS50ZXN0KGVyci5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpLFxuICAgICAgICB7XG4gICAgICAgICAgY2F1c2U6IGVyci5jYXVzZSB8fCBlcnJcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIGVyciAmJiBlcnIuY29kZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgfVxufSk7XG5cblxuIiwgImltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgaHR0cEFkYXB0ZXIgZnJvbSAnLi9odHRwLmpzJztcbmltcG9ydCB4aHJBZGFwdGVyIGZyb20gJy4veGhyLmpzJztcbmltcG9ydCBmZXRjaEFkYXB0ZXIgZnJvbSAnLi9mZXRjaC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiBmZXRjaEFkYXB0ZXJcbn1cblxudXRpbHMuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzLmlzRnVuY3Rpb24oYWRhcHRlcikgfHwgYWRhcHRlciA9PT0gbnVsbCB8fCBhZGFwdGVyID09PSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBnZXRBZGFwdGVyOiAoYWRhcHRlcnMpID0+IHtcbiAgICBhZGFwdGVycyA9IHV0aWxzLmlzQXJyYXkoYWRhcHRlcnMpID8gYWRhcHRlcnMgOiBbYWRhcHRlcnNdO1xuXG4gICAgY29uc3Qge2xlbmd0aH0gPSBhZGFwdGVycztcbiAgICBsZXQgbmFtZU9yQWRhcHRlcjtcbiAgICBsZXQgYWRhcHRlcjtcblxuICAgIGNvbnN0IHJlamVjdGVkUmVhc29ucyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgICAgbGV0IGlkO1xuXG4gICAgICBhZGFwdGVyID0gbmFtZU9yQWRhcHRlcjtcblxuICAgICAgaWYgKCFpc1Jlc29sdmVkSGFuZGxlKG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICAgIGFkYXB0ZXIgPSBrbm93bkFkYXB0ZXJzWyhpZCA9IFN0cmluZyhuYW1lT3JBZGFwdGVyKSkudG9Mb3dlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGFkYXB0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBVbmtub3duIGFkYXB0ZXIgJyR7aWR9J2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZWplY3RlZFJlYXNvbnNbaWQgfHwgJyMnICsgaV0gPSBhZGFwdGVyO1xuICAgIH1cblxuICAgIGlmICghYWRhcHRlcikge1xuXG4gICAgICBjb25zdCByZWFzb25zID0gT2JqZWN0LmVudHJpZXMocmVqZWN0ZWRSZWFzb25zKVxuICAgICAgICAubWFwKChbaWQsIHN0YXRlXSkgPT4gYGFkYXB0ZXIgJHtpZH0gYCArXG4gICAgICAgICAgKHN0YXRlID09PSBmYWxzZSA/ICdpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCcgOiAnaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQnKVxuICAgICAgICApO1xuXG4gICAgICBsZXQgcyA9IGxlbmd0aCA/XG4gICAgICAgIChyZWFzb25zLmxlbmd0aCA+IDEgPyAnc2luY2UgOlxcbicgKyByZWFzb25zLm1hcChyZW5kZXJSZWFzb24pLmpvaW4oJ1xcbicpIDogJyAnICsgcmVuZGVyUmVhc29uKHJlYXNvbnNbMF0pKSA6XG4gICAgICAgICdhcyBubyBhZGFwdGVyIHNwZWNpZmllZCc7XG5cbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCBgICsgcyxcbiAgICAgICAgJ0VSUl9OT1RfU1VQUE9SVCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkYXB0ZXI7XG4gIH0sXG4gIGFkYXB0ZXJzOiBrbm93bkFkYXB0ZXJzXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdHJhbnNmb3JtRGF0YSBmcm9tICcuL3RyYW5zZm9ybURhdGEuanMnO1xuaW1wb3J0IGlzQ2FuY2VsIGZyb20gJy4uL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSBcIi4uL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzXCI7XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcbiAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgIGNvbmZpZy5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7XG4gIH1cblxuICBpZiAoY29uZmlnLnNpZ25hbCAmJiBjb25maWcuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb25maWcuaGVhZGVycyk7XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICBpZiAoWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLmluZGV4T2YoY29uZmlnLm1ldGhvZCkgIT09IC0xKSB7XG4gICAgY29uZmlnLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyKGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZVxuICAgICAgICApO1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4uL2Vudi9kYXRhLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gIHZhbGlkYXRvcnNbdHlwZV0gPSBmdW5jdGlvbiB2YWxpZGF0b3IodGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSB0eXBlIHx8ICdhJyArIChpIDwgMSA/ICduICcgOiAnICcpICsgdHlwZTtcbiAgfTtcbn0pO1xuXG5jb25zdCBkZXByZWNhdGVkV2FybmluZ3MgPSB7fTtcblxuLyoqXG4gKiBUcmFuc2l0aW9uYWwgb3B0aW9uIHZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb258Ym9vbGVhbj99IHZhbGlkYXRvciAtIHNldCB0byBmYWxzZSBpZiB0aGUgdHJhbnNpdGlvbmFsIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkXG4gKiBAcGFyYW0ge3N0cmluZz99IHZlcnNpb24gLSBkZXByZWNhdGVkIHZlcnNpb24gLyByZW1vdmVkIHNpbmNlIHZlcnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nP30gbWVzc2FnZSAtIHNvbWUgbWVzc2FnZSB3aXRoIGFkZGl0aW9uYWwgaW5mb1xuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn1cbiAqL1xudmFsaWRhdG9ycy50cmFuc2l0aW9uYWwgPSBmdW5jdGlvbiB0cmFuc2l0aW9uYWwodmFsaWRhdG9yLCB2ZXJzaW9uLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XG4gICAgcmV0dXJuICdbQXhpb3MgdicgKyBWRVJTSU9OICsgJ10gVHJhbnNpdGlvbmFsIG9wdGlvbiBcXCcnICsgb3B0ICsgJ1xcJycgKyBkZXNjICsgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiAodmFsdWUsIG9wdCwgb3B0cykgPT4ge1xuICAgIGlmICh2YWxpZGF0b3IgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShvcHQsICcgaGFzIGJlZW4gcmVtb3ZlZCcgKyAodmVyc2lvbiA/ICcgaW4gJyArIHZlcnNpb24gOiAnJykpLFxuICAgICAgICBBeGlvc0Vycm9yLkVSUl9ERVBSRUNBVEVEXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICYmICFkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSkge1xuICAgICAgZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0gPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICBvcHQsXG4gICAgICAgICAgJyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYnICsgdmVyc2lvbiArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XG4gIH07XG59O1xuXG52YWxpZGF0b3JzLnNwZWxsaW5nID0gZnVuY3Rpb24gc3BlbGxpbmcoY29ycmVjdFNwZWxsaW5nKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGAke29wdH0gaXMgbGlrZWx5IGEgbWlzc3BlbGxpbmcgb2YgJHtjb3JyZWN0U3BlbGxpbmd9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogQXNzZXJ0IG9iamVjdCdzIHByb3BlcnRpZXMgdHlwZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGFzc2VydE9wdGlvbnMob3B0aW9ucywgc2NoZW1hLCBhbGxvd1Vua25vd24pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGNvbnN0IG9wdCA9IGtleXNbaV07XG4gICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdF07XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbiAnICsgb3B0ICsgJyBtdXN0IGJlICcgKyByZXN1bHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdVbmtub3duIG9wdGlvbiAnICsgb3B0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IGJ1aWxkVVJMIGZyb20gJy4uL2hlbHBlcnMvYnVpbGRVUkwuanMnO1xuaW1wb3J0IEludGVyY2VwdG9yTWFuYWdlciBmcm9tICcuL0ludGVyY2VwdG9yTWFuYWdlci5qcyc7XG5pbXBvcnQgZGlzcGF0Y2hSZXF1ZXN0IGZyb20gJy4vZGlzcGF0Y2hSZXF1ZXN0LmpzJztcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tICcuL21lcmdlQ29uZmlnLmpzJztcbmltcG9ydCBidWlsZEZ1bGxQYXRoIGZyb20gJy4vYnVpbGRGdWxsUGF0aC5qcyc7XG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJy4uL2hlbHBlcnMvdmFsaWRhdG9yLmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi9BeGlvc0hlYWRlcnMuanMnO1xuXG5jb25zdCB2YWxpZGF0b3JzID0gdmFsaWRhdG9yLnZhbGlkYXRvcnM7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmNsYXNzIEF4aW9zIHtcbiAgY29uc3RydWN0b3IoaW5zdGFuY2VDb25maWcpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWcgfHwge307XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCksXG4gICAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBjb25maWdPclVybCBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gICAqIEBwYXJhbSB7P09iamVjdH0gY29uZmlnXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAgICovXG4gIGFzeW5jIHJlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBsZXQgZHVtbXkgPSB7fTtcblxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGR1bW15KSA6IChkdW1teSA9IG5ldyBFcnJvcigpKTtcblxuICAgICAgICAvLyBzbGljZSBvZmYgdGhlIEVycm9yOiAuLi4gbGluZVxuICAgICAgICBjb25zdCBzdGFjayA9IGR1bW15LnN0YWNrID8gZHVtbXkuc3RhY2sucmVwbGFjZSgvXi4rXFxuLywgJycpIDogJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIGVyci5zdGFjayA9IHN0YWNrO1xuICAgICAgICAgICAgLy8gbWF0Y2ggd2l0aG91dCB0aGUgMiB0b3Agc3RhY2sgbGluZXNcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrICYmICFTdHJpbmcoZXJyLnN0YWNrKS5lbmRzV2l0aChzdGFjay5yZXBsYWNlKC9eLitcXG4uK1xcbi8sICcnKSkpIHtcbiAgICAgICAgICAgIGVyci5zdGFjayArPSAnXFxuJyArIHN0YWNrXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gaWdub3JlIHRoZSBjYXNlIHdoZXJlIFwic3RhY2tcIiBpcyBhbiB1bi13cml0YWJsZSBwcm9wZXJ0eVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBfcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgLy8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuICAgIGlmICh0eXBlb2YgY29uZmlnT3JVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgICBjb25maWcudXJsID0gY29uZmlnT3JVcmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZ09yVXJsIHx8IHt9O1xuICAgIH1cblxuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG5cbiAgICBjb25zdCB7dHJhbnNpdGlvbmFsLCBwYXJhbXNTZXJpYWxpemVyLCBoZWFkZXJzfSA9IGNvbmZpZztcblxuICAgIGlmICh0cmFuc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnModHJhbnNpdGlvbmFsLCB7XG4gICAgICAgIHNpbGVudEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBmb3JjZWRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgY2xhcmlmeVRpbWVvdXRFcnJvcjogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKVxuICAgICAgfSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXNTZXJpYWxpemVyICE9IG51bGwpIHtcbiAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHBhcmFtc1NlcmlhbGl6ZXIpKSB7XG4gICAgICAgIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyID0ge1xuICAgICAgICAgIHNlcmlhbGl6ZTogcGFyYW1zU2VyaWFsaXplclxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyhwYXJhbXNTZXJpYWxpemVyLCB7XG4gICAgICAgICAgZW5jb2RlOiB2YWxpZGF0b3JzLmZ1bmN0aW9uLFxuICAgICAgICAgIHNlcmlhbGl6ZTogdmFsaWRhdG9ycy5mdW5jdGlvblxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzXG4gICAgaWYgKGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyA9IHRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMoY29uZmlnLCB7XG4gICAgICBiYXNlVXJsOiB2YWxpZGF0b3JzLnNwZWxsaW5nKCdiYXNlVVJMJyksXG4gICAgICB3aXRoWHNyZlRva2VuOiB2YWxpZGF0b3JzLnNwZWxsaW5nKCd3aXRoWFNSRlRva2VuJylcbiAgICB9LCB0cnVlKTtcblxuICAgIC8vIFNldCBjb25maWcubWV0aG9kXG4gICAgY29uZmlnLm1ldGhvZCA9IChjb25maWcubWV0aG9kIHx8IHRoaXMuZGVmYXVsdHMubWV0aG9kIHx8ICdnZXQnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gICAgbGV0IGNvbnRleHRIZWFkZXJzID0gaGVhZGVycyAmJiB1dGlscy5tZXJnZShcbiAgICAgIGhlYWRlcnMuY29tbW9uLFxuICAgICAgaGVhZGVyc1tjb25maWcubWV0aG9kXVxuICAgICk7XG5cbiAgICBoZWFkZXJzICYmIHV0aWxzLmZvckVhY2goXG4gICAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICAgIChtZXRob2QpID0+IHtcbiAgICAgICAgZGVsZXRlIGhlYWRlcnNbbWV0aG9kXTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuY29uY2F0KGNvbnRleHRIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIC8vIGZpbHRlciBvdXQgc2tpcHBlZCBpbnRlcmNlcHRvcnNcbiAgICBjb25zdCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIGxldCBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSB0cnVlO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICAgIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIHB1c2hSZXNwb25zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcHJvbWlzZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbjtcblxuICAgIGlmICghc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QuYmluZCh0aGlzKSwgdW5kZWZpbmVkXTtcbiAgICAgIGNoYWluLnVuc2hpZnQuYXBwbHkoY2hhaW4sIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGNoYWluLnB1c2guYXBwbHkoY2hhaW4sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBsZW4gPSBjaGFpbi5sZW5ndGg7XG5cbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbltpKytdLCBjaGFpbltpKytdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgbGVuID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcblxuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIGNvbnN0IG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIGNvbnN0IG9uUmVqZWN0ZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3Q29uZmlnID0gb25GdWxmaWxsZWQobmV3Q29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uUmVqZWN0ZWQuY2FsbCh0aGlzLCBlcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0LmNhbGwodGhpcywgbmV3Q29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG5cbiAgICBpID0gMDtcbiAgICBsZW4gPSByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4ocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGdldFVyaShjb25maWcpIHtcbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCwgY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzKTtcbiAgICByZXR1cm4gYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcbiAgfVxufVxuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIGRhdGE6IChjb25maWcgfHwge30pLmRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUhUVFBNZXRob2QoaXNGb3JtKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGh0dHBNZXRob2QodXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogaXNGb3JtID8ge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSdcbiAgICAgICAgfSA6IHt9LFxuICAgICAgICB1cmwsXG4gICAgICAgIGRhdGFcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBnZW5lcmF0ZUhUVFBNZXRob2QoKTtcblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kICsgJ0Zvcm0nXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCh0cnVlKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvcztcbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vQ2FuY2VsZWRFcnJvci5qcyc7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKGNhbmNlbCA9PiB7XG4gICAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgICAgbGV0IGkgPSB0b2tlbi5fbGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgICAgfVxuICAgICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuID0gb25mdWxmaWxsZWQgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgdG9BYm9ydFNpZ25hbCgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgYWJvcnQgPSAoZXJyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KGVycik7XG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIGNvbnRyb2xsZXIuc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdGhpcy51bnN1YnNjcmliZShhYm9ydCk7XG5cbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYW5jZWxUb2tlbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcbiAqXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMuaXNPYmplY3QocGF5bG9hZCkgJiYgKHBheWxvYWQuaXNBeGlvc0Vycm9yID09PSB0cnVlKTtcbn1cbiIsICJjb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSHR0cFN0YXR1c0NvZGU7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgYmluZCBmcm9tICcuL2hlbHBlcnMvYmluZC5qcyc7XG5pbXBvcnQgQXhpb3MgZnJvbSAnLi9jb3JlL0F4aW9zLmpzJztcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tICcuL2NvcmUvbWVyZ2VDb25maWcuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IGZvcm1EYXRhVG9KU09OIGZyb20gJy4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBDYW5jZWxUb2tlbiBmcm9tICcuL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyc7XG5pbXBvcnQgaXNDYW5jZWwgZnJvbSAnLi9jYW5jZWwvaXNDYW5jZWwuanMnO1xuaW1wb3J0IHtWRVJTSU9OfSBmcm9tICcuL2Vudi9kYXRhLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vaGVscGVycy90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBzcHJlYWQgZnJvbSAnLi9oZWxwZXJzL3NwcmVhZC5qcyc7XG5pbXBvcnQgaXNBeGlvc0Vycm9yIGZyb20gJy4vaGVscGVycy9pc0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IGFkYXB0ZXJzIGZyb20gJy4vYWRhcHRlcnMvYWRhcHRlcnMuanMnO1xuaW1wb3J0IEh0dHBTdGF0dXNDb2RlIGZyb20gJy4vaGVscGVycy9IdHRwU3RhdHVzQ29kZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJucyB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgY29uc3QgY29udGV4dCA9IG5ldyBBeGlvcyhkZWZhdWx0Q29uZmlnKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCwge2FsbE93bktleXM6IHRydWV9KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0LCBudWxsLCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbmNvbnN0IGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsZWRFcnJvciA9IENhbmNlbGVkRXJyb3I7XG5heGlvcy5DYW5jZWxUb2tlbiA9IENhbmNlbFRva2VuO1xuYXhpb3MuaXNDYW5jZWwgPSBpc0NhbmNlbDtcbmF4aW9zLlZFUlNJT04gPSBWRVJTSU9OO1xuYXhpb3MudG9Gb3JtRGF0YSA9IHRvRm9ybURhdGE7XG5cbi8vIEV4cG9zZSBBeGlvc0Vycm9yIGNsYXNzXG5heGlvcy5BeGlvc0Vycm9yID0gQXhpb3NFcnJvcjtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5cbmF4aW9zLnNwcmVhZCA9IHNwcmVhZDtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gaXNBeGlvc0Vycm9yO1xuXG4vLyBFeHBvc2UgbWVyZ2VDb25maWdcbmF4aW9zLm1lcmdlQ29uZmlnID0gbWVyZ2VDb25maWc7XG5cbmF4aW9zLkF4aW9zSGVhZGVycyA9IEF4aW9zSGVhZGVycztcblxuYXhpb3MuZm9ybVRvSlNPTiA9IHRoaW5nID0+IGZvcm1EYXRhVG9KU09OKHV0aWxzLmlzSFRNTEZvcm0odGhpbmcpID8gbmV3IEZvcm1EYXRhKHRoaW5nKSA6IHRoaW5nKTtcblxuYXhpb3MuZ2V0QWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXI7XG5cbmF4aW9zLkh0dHBTdGF0dXNDb2RlID0gSHR0cFN0YXR1c0NvZGU7XG5cbmF4aW9zLmRlZmF1bHQgPSBheGlvcztcblxuLy8gdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgaGF2ZSBhIGRlZmF1bHQgZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBheGlvc1xuIiwgIi8qKlxuICogQEF1dGhvcjogU3RlcGhlbkNoZW5cbiAqIEBDcmVhdGUgVGltZTogMjAyNS0wNS0yNiAxMDo1MTowM1xuICogQE1vZGlmaWVkIGJ5OiBTdGVwaGVuQ2hlblxuICogQE1vZGlmaWVkIHRpbWU6IDIwMjUtMDUtMjYgMTE6MDc6MzRcbiAqIEBEZXNjcmlwdGlvbjogXHU4QkY3XHU2QzQyXHU1REU1XHU1MTc3XG4gKi9cblxuaW1wb3J0IGF4aW9zLCB7XG4gIEF4aW9zSW5zdGFuY2UsXG4gIEF4aW9zUHJvbWlzZSxcbiAgQXhpb3NSZXF1ZXN0Q29uZmlnLFxuICBBeGlvc1Jlc3BvbnNlLFxuICBJbnRlcm5hbEF4aW9zUmVxdWVzdENvbmZpZ1xufSBmcm9tICdheGlvcydcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICdvYnNpZGlhbidcbmltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCBDb25maWcgZnJvbSAnQC9jb21tb24vY29uZmlnJ1xuXG5jbGFzcyBSZXF1ZXN0IHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBSZXF1ZXN0XG4gIHByaXZhdGUgX2F4aW9zOiBBeGlvc0luc3RhbmNlXG4gIHByaXZhdGUgX2hlYWRlcnMgPSB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9heGlvcyA9IGF4aW9zLmNyZWF0ZSh7IGJhc2VVUkw6IENvbmZpZy5iYXNlVVJMLCBhZGFwdGVyOiB0aGlzLm9iQWRhcHRlciB9KVxuICB9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IFJlcXVlc3Qge1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHRoaXMuX2luc3RhbmNlID0gbmV3IFJlcXVlc3QoKVxuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZVxuICB9XG5cbiAgcHJpdmF0ZSBvYkFkYXB0ZXIoY29uZmlnOiBBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2Uge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czogcmVzLnN0YXR1c0NvZGUgfHwgcmVzLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXMuZXJyTXNnIHx8IHJlcy5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6IHJlcy5oZWFkZXIsXG4gICAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgICBkYXRhOiB7IC4uLnJlcyB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgclVybCA9ICgpID0+IHtcbiAgICAgICAgbGV0IHVybCA9IGNvbmZpZy51cmwgPz8gJydcbiAgICAgICAgY29uc3QgcGFyYW1zID0gcXMuc3RyaW5naWZ5KHsgLi4uY29uZmlnLnBhcmFtcywgLi4ucXMucGFyc2UodXJsLnNwbGl0KCc/JylbMV0gPz8gJycpIH0pXG4gICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJz8nKSkgdXJsID0gdXJsLnNwbGl0KCc/JylbMF1cbiAgICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB1cmwgPSAoY29uZmlnLmJhc2VVUkwgPz8gJycpICsgdXJsXG4gICAgICAgIHJldHVybiBgJHt1cmx9PyR7cGFyYW1zfWBcbiAgICAgIH1cblxuICAgICAgY29uc3QgckhlYWRlciA9ICgpID0+IHtcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7fVxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5oZWFkZXJzPy50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIGNvbmZpZy5oZWFkZXJzLnRvSlNPTih0cnVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIGNvbmZpZy5oZWFkZXJzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJzXG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3Qoe1xuICAgICAgICB1cmw6IHJVcmwoKSxcbiAgICAgICAgbWV0aG9kOiBjb25maWcubWV0aG9kLFxuICAgICAgICBjb250ZW50VHlwZTogY29uZmlnLmhlYWRlcnM/LlsnQ29udGVudC1UeXBlJ10gPz8gJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsXG4gICAgICAgIGJvZHk6IGNvbmZpZy5kYXRhLFxuICAgICAgICBoZWFkZXJzOiBySGVhZGVyKClcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKChyZXMpID0+IHJlc29sdmUocmVzcG9uc2UocmVzKSBhcyBBeGlvc1Jlc3BvbnNlKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHJlamVjdChyZXNwb25zZShlcnIpKSlcbiAgICB9KVxuICB9XG5cbiAgZ2V0QXhpb3MoKTogQXhpb3NJbnN0YW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuX2F4aW9zXG4gIH1cblxuICBzZXRSZXF1ZXN0SW50ZXJjZXB0b3IoXG4gICAgb25GdWxmaWxsZWQ/OiAoY29uZmlnOiBJbnRlcm5hbEF4aW9zUmVxdWVzdENvbmZpZykgPT4gSW50ZXJuYWxBeGlvc1JlcXVlc3RDb25maWcsXG4gICAgb25SZWplY3RlZD86IChlcnJvcjogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgdGhpcy5fYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICB9XG5cbiAgc2V0UmVzcG9uc2VJbnRlcmNlcHRvcihvbkZ1bGZpbGxlZD86IChyZXNwb25zZTogQXhpb3NSZXNwb25zZSkgPT4gQXhpb3NSZXNwb25zZSwgb25SZWplY3RlZD86IChlcnJvcjogYW55KSA9PiBhbnkpIHtcbiAgICB0aGlzLl9heGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICB9XG5cbiAgZ2V0KGNvbmZpZzogQXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NQcm9taXNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXhpb3MucmVxdWVzdCh7IGhlYWRlcnM6IHRoaXMuX2hlYWRlcnMsIC4uLmNvbmZpZywgbWV0aG9kOiAnR0VUJyB9KVxuICB9XG5cbiAgcG9zdChjb25maWc6IEF4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUHJvbWlzZSB7XG4gICAgcmV0dXJuIHRoaXMuX2F4aW9zLnJlcXVlc3QoeyBoZWFkZXJzOiB0aGlzLl9oZWFkZXJzLCAuLi5jb25maWcsIG1ldGhvZDogJ1BPU1QnIH0pXG4gIH1cblxuICBkZWxldGUoY29uZmlnOiBBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2Uge1xuICAgIHJldHVybiB0aGlzLl9heGlvcy5yZXF1ZXN0KHsgaGVhZGVyczogdGhpcy5faGVhZGVycywgLi4uY29uZmlnLCBtZXRob2Q6ICdERUxFVEUnIH0pXG4gIH1cblxuICBwdXQoY29uZmlnOiBBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1Byb21pc2Uge1xuICAgIHJldHVybiB0aGlzLl9heGlvcy5yZXF1ZXN0KHsgaGVhZGVyczogdGhpcy5faGVhZGVycywgLi4uY29uZmlnLCBtZXRob2Q6ICdQVVQnIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVxdWVzdC5nZXRJbnN0YW5jZSgpXG4iLCAiLyoqXG4gKiBAQXV0aG9yOiBTdGVwaGVuQ2hlblxuICogQENyZWF0ZSBUaW1lOiAyMDI1LTA1LTI2IDExOjA2OjU1XG4gKiBATW9kaWZpZWQgYnk6IFN0ZXBoZW5DaGVuXG4gKiBATW9kaWZpZWQgdGltZTogMjAyNS0wNS0yNiAxMTowNzowM1xuICogQERlc2NyaXB0aW9uOiBcdTkxNERcdTdGNkVcdTRGRTFcdTYwNkZcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8vIGJhc2VVUkw6ICdodHRwczovL29icHViLmdvZ2FvLnRvcCcgLy8gVE9ETzogXHU4QkY3XHU2QzQyXHU1NzMwXHU1NzQwXG4gIGJhc2VVUkw6ICdodHRwOi8vMTI3LjAuMC4xOjgwODEnIC8vIFRPRE86IFx1OEJGN1x1NkM0Mlx1NTczMFx1NTc0MFxufVxuIiwgIi8qKlxuICogQEF1dGhvcjogU3RlcGhlbkNoZW5cbiAqIEBDcmVhdGUgVGltZTogMjAyNS0wNS0yNiAxNDoxMzozNlxuICogQE1vZGlmaWVkIGJ5OiBTdGVwaGVuQ2hlblxuICogQE1vZGlmaWVkIHRpbWU6IDIwMjUtMDUtMjYgMTQ6MjY6MDVcbiAqIEBEZXNjcmlwdGlvbjogXHU4QkY3XHU2QzQyXHU2MkU2XHU2MjJBXHU1NjY4XG4gKi9cblxuaW1wb3J0IFB1Ymxpc2hQbHVnaW4gZnJvbSAnQC9tYWluJ1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnQC91dGlscy9yZXF1ZXN0J1xuXG5jb25zdCBzdWNjZXNzQ29kZSA9IFsnUkMwMDAwMCddXG5jb25zdCBpc1NraXBFcnJvciA9IChjb25maWc6IGFueSk6IGJvb2xlYW4gPT4gY29uZmlnPy5oZWFkZXJzPy5za2lwRXJyb3IgPz8gZmFsc2VcblxuY29uc3QgaW50ZXJjZXB0b3IgPSAocGx1Z2luOiBQdWJsaXNoUGx1Z2luKSA9PiB7XG4gIHJlcXVlc3Quc2V0UmVxdWVzdEludGVyY2VwdG9yKChjb25maWcpID0+IHtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIGNvbmZpZ1xuXG4gICAgY29uc3QgdG9rZW4gPSBwbHVnaW4uYWNjb3VudFN0b3JlLmFjY291bnRJbmZvPy50b2tlblxuICAgIGlmICh0b2tlbikge1xuICAgICAgY29uZmlnLmhlYWRlcnMudG9rZW4gPSBgJHt0b2tlbn1gXG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ1x1MzAxMFx1OEJGN1x1NkM0Mlx1NUYwMFx1NTlDQlx1MzAxMScsIGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH0pXG4gIHJlcXVlc3Quc2V0UmVzcG9uc2VJbnRlcmNlcHRvcihcbiAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdcdTMwMTBcdThCRjdcdTZDNDJcdTdFRDNcdTY3OUNcdTMwMTEnLCByZXNwb25zZSlcbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhID8/IHt9XG4gICAgICBjb25zdCBjb2RlID0gZGF0YS5jb2RlID8/ICctMSdcbiAgICAgIC8vIGNvbnN0IGluZm8gPSBkYXRhLmluZm8gPz8gJ1x1N0Y1MVx1N0VEQ1x1NEUwRFx1N0EzM1x1NUI5QVx1RkYwQ1x1OEJGN1x1OTFDRFx1OEJENSdcblxuICAgICAgaWYgKCFzdWNjZXNzQ29kZS5pbmNsdWRlcyhjb2RlKSkge1xuICAgICAgICBpZiAoaXNTa2lwRXJyb3IocmVzcG9uc2U/LmNvbmZpZykpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBhbnlcbiAgICB9LFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGlzU2tpcEVycm9yKGVycm9yLmNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnXHUzMDEwXHU4QkY3XHU2QzQyXHU1RjAyXHU1RTM4XHUzMDExJywgZXJyb3IpXG4gICAgICAvLyBjb25zdCB7IGluZm8gPSAnXHU3RjUxXHU3RURDXHU0RTBEXHU3QTMzXHU1QjlBXHVGRjBDXHU4QkY3XHU5MUNEXHU4QkQ1JyB9ID0gZXJyb3IuZGF0YSA/PyB7fVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgIH1cbiAgKVxufVxuXG5leHBvcnQgY29uc3QgcmVxdWVzdEludGVyY2VwdG9yID0ge1xuICBpbnN0YWxsOiBpbnRlcmNlcHRvclxufVxuIiwgIi8qKlxuICogQEF1dGhvcjogU3RlcGhlbkNoZW5cbiAqIEBDcmVhdGUgVGltZTogMjAyNS0wNS0yNiAxNDoxMzoyNFxuICogQE1vZGlmaWVkIGJ5OiBTdGVwaGVuQ2hlblxuICogQE1vZGlmaWVkIHRpbWU6IDIwMjUtMDUtMjYgMTc6MDM6MTFcbiAqIEBEZXNjcmlwdGlvbjogXHU2MkU2XHU2MjJBXHU1NjY4XG4gKi9cblxuaW1wb3J0IFB1Ymxpc2hQbHVnaW4gZnJvbSAnQC9tYWluJ1xuaW1wb3J0IHsgcmVxdWVzdEludGVyY2VwdG9yIH0gZnJvbSAnLi9yZXF1ZXN0J1xuXG5jb25zdCBpbnN0YWxsID0gKHBsdWdpbjogUHVibGlzaFBsdWdpbikgPT4ge1xuICByZXF1ZXN0SW50ZXJjZXB0b3IuaW5zdGFsbChwbHVnaW4pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluc3RhbGxcbiIsICJjb25zdCBjcmVhdGVTdG9yZUltcGwgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgbGV0IHN0YXRlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBzZXRTdGF0ZSA9IChwYXJ0aWFsLCByZXBsYWNlKSA9PiB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gdHlwZW9mIHBhcnRpYWwgPT09IFwiZnVuY3Rpb25cIiA/IHBhcnRpYWwoc3RhdGUpIDogcGFydGlhbDtcbiAgICBpZiAoIU9iamVjdC5pcyhuZXh0U3RhdGUsIHN0YXRlKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IHN0YXRlO1xuICAgICAgc3RhdGUgPSAocmVwbGFjZSAhPSBudWxsID8gcmVwbGFjZSA6IHR5cGVvZiBuZXh0U3RhdGUgIT09IFwib2JqZWN0XCIgfHwgbmV4dFN0YXRlID09PSBudWxsKSA/IG5leHRTdGF0ZSA6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihzdGF0ZSwgcHJldmlvdXNTdGF0ZSkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0U3RhdGUgPSAoKSA9PiBzdGF0ZTtcbiAgY29uc3QgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBzdWJzY3JpYmUgPSAobGlzdGVuZXIpID0+IHtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH07XG4gIGNvbnN0IGFwaSA9IHsgc2V0U3RhdGUsIGdldFN0YXRlLCBnZXRJbml0aWFsU3RhdGUsIHN1YnNjcmliZSB9O1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBzdGF0ZSA9IGNyZWF0ZVN0YXRlKHNldFN0YXRlLCBnZXRTdGF0ZSwgYXBpKTtcbiAgcmV0dXJuIGFwaTtcbn07XG5jb25zdCBjcmVhdGVTdG9yZSA9IChjcmVhdGVTdGF0ZSkgPT4gY3JlYXRlU3RhdGUgPyBjcmVhdGVTdG9yZUltcGwoY3JlYXRlU3RhdGUpIDogY3JlYXRlU3RvcmVJbXBsO1xuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSB9O1xuIiwgIi8qKlxuICogQEF1dGhvcjogU3RlcGhlbkNoZW5cbiAqIEBDcmVhdGUgVGltZTogMjAyNS0wNS0yNiAxNDo0MTo0OFxuICogQE1vZGlmaWVkIGJ5OiBTdGVwaGVuQ2hlblxuICogQE1vZGlmaWVkIHRpbWU6IDIwMjUtMDUtMjYgMTQ6NDQ6MzNcbiAqIEBEZXNjcmlwdGlvbjogXHU1MkEwXHU1QkM2XHU4OUUzXHU1QkM2XHU1REU1XHU1MTc3XG4gKi9cblxuY29uc3QgYmFzZTY0RW5jb2RlID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShzdHIpLnRvU3RyaW5nKCdiYXNlNjQnKVxufVxuY29uc3QgYmFzZTY0RGVjb2RlID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShzdHIsICdiYXNlNjQnKS50b1N0cmluZygpXG59XG5cbmV4cG9ydCB7IGJhc2U2NEVuY29kZSwgYmFzZTY0RGVjb2RlIH1cbiIsICIvKipcbiAqIEBBdXRob3I6IFN0ZXBoZW5DaGVuXG4gKiBAQ3JlYXRlIFRpbWU6IDIwMjUtMDUtMjYgMTA6NTA6MDFcbiAqIEBNb2RpZmllZCBieTogU3RlcGhlbkNoZW5cbiAqIEBNb2RpZmllZCB0aW1lOiAyMDI1LTA1LTI2IDE3OjAzOjIzXG4gKiBARGVzY3JpcHRpb246IFx1OEQyNlx1NTNGN1x1NzZGOFx1NTE3M1x1NjNBNVx1NTNFM1xuICovXG5cbmltcG9ydCByZXF1ZXN0IGZyb20gJ0AvdXRpbHMvcmVxdWVzdCdcbmltcG9ydCB7IGJhc2U2NEVuY29kZSB9IGZyb20gJ0AvdXRpbHMvY3J5cHRvJ1xuXG5leHBvcnQgZnVuY3Rpb24gc2VuZExpY2Vuc2UoZW1haWw6IHN0cmluZykge1xuICByZXR1cm4gcmVxdWVzdC5wb3N0KHtcbiAgICB1cmw6ICcvYWNjb3VudC9lbWFpbC9saWNlbnNlJyxcbiAgICBkYXRhOiB7IGVtYWlsIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKGVtYWlsOiBzdHJpbmcsIGxpY2Vuc2U6IHN0cmluZykge1xuICByZXR1cm4gcmVxdWVzdC5wb3N0KHtcbiAgICB1cmw6ICcvYWNjb3VudC9sb2dpbicsXG4gICAgZGF0YTogeyBlbWFpbCwgbGljZW5zZTogYmFzZTY0RW5jb2RlKGxpY2Vuc2UpIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjY291bnRJbmZvKCkge1xuICByZXR1cm4gcmVxdWVzdC5nZXQoe1xuICAgIHVybDogJy9hY2NvdW50L2luZm8nXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBdmF0YXIoYXZhdGFyUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGF2YXRhciA9IG5ldyBGb3JtRGF0YSgpXG4gIGF2YXRhci5hcHBlbmQoJ2hlYWRlcicsIGF2YXRhclBhdGgpXG4gIHJldHVybiByZXF1ZXN0LnBvc3Qoe1xuICAgIHVybDogJy9hY2NvdW50L2F2YXRhcicsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJ1xuICAgIH0sXG4gICAgZGF0YTogYXZhdGFyXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOaWNrbmFtZShuaWNrbmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiByZXF1ZXN0LnBvc3Qoe1xuICAgIHVybDogJy9hY2NvdW50L25pY2tuYW1lJyxcbiAgICBkYXRhOiB7IG5pY2tuYW1lIH1cbiAgfSlcbn1cbiIsICJjb25zdCByZWR1eEltcGwgPSAocmVkdWNlciwgaW5pdGlhbCkgPT4gKHNldCwgX2dldCwgYXBpKSA9PiB7XG4gIGFwaS5kaXNwYXRjaCA9IChhY3Rpb24pID0+IHtcbiAgICBzZXQoKHN0YXRlKSA9PiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pLCBmYWxzZSwgYWN0aW9uKTtcbiAgICByZXR1cm4gYWN0aW9uO1xuICB9O1xuICBhcGkuZGlzcGF0Y2hGcm9tRGV2dG9vbHMgPSB0cnVlO1xuICByZXR1cm4geyBkaXNwYXRjaDogKC4uLmFyZ3MpID0+IGFwaS5kaXNwYXRjaCguLi5hcmdzKSwgLi4uaW5pdGlhbCB9O1xufTtcbmNvbnN0IHJlZHV4ID0gcmVkdXhJbXBsO1xuXG5jb25zdCB0cmFja2VkQ29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuY29uc3QgZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZSA9IChuYW1lKSA9PiB7XG4gIGNvbnN0IGFwaSA9IHRyYWNrZWRDb25uZWN0aW9ucy5nZXQobmFtZSk7XG4gIGlmICghYXBpKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoYXBpLnN0b3JlcykubWFwKChba2V5LCBhcGkyXSkgPT4gW2tleSwgYXBpMi5nZXRTdGF0ZSgpXSlcbiAgKTtcbn07XG5jb25zdCBleHRyYWN0Q29ubmVjdGlvbkluZm9ybWF0aW9uID0gKHN0b3JlLCBleHRlbnNpb25Db25uZWN0b3IsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ1bnRyYWNrZWRcIixcbiAgICAgIGNvbm5lY3Rpb246IGV4dGVuc2lvbkNvbm5lY3Rvci5jb25uZWN0KG9wdGlvbnMpXG4gICAgfTtcbiAgfVxuICBjb25zdCBleGlzdGluZ0Nvbm5lY3Rpb24gPSB0cmFja2VkQ29ubmVjdGlvbnMuZ2V0KG9wdGlvbnMubmFtZSk7XG4gIGlmIChleGlzdGluZ0Nvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInRyYWNrZWRcIiwgc3RvcmUsIC4uLmV4aXN0aW5nQ29ubmVjdGlvbiB9O1xuICB9XG4gIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSB7XG4gICAgY29ubmVjdGlvbjogZXh0ZW5zaW9uQ29ubmVjdG9yLmNvbm5lY3Qob3B0aW9ucyksXG4gICAgc3RvcmVzOiB7fVxuICB9O1xuICB0cmFja2VkQ29ubmVjdGlvbnMuc2V0KG9wdGlvbnMubmFtZSwgbmV3Q29ubmVjdGlvbik7XG4gIHJldHVybiB7IHR5cGU6IFwidHJhY2tlZFwiLCBzdG9yZSwgLi4ubmV3Q29ubmVjdGlvbiB9O1xufTtcbmNvbnN0IHJlbW92ZVN0b3JlRnJvbVRyYWNrZWRDb25uZWN0aW9ucyA9IChuYW1lLCBzdG9yZSkgPT4ge1xuICBpZiAoc3RvcmUgPT09IHZvaWQgMCkgcmV0dXJuO1xuICBjb25zdCBjb25uZWN0aW9uSW5mbyA9IHRyYWNrZWRDb25uZWN0aW9ucy5nZXQobmFtZSk7XG4gIGlmICghY29ubmVjdGlvbkluZm8pIHJldHVybjtcbiAgZGVsZXRlIGNvbm5lY3Rpb25JbmZvLnN0b3Jlc1tzdG9yZV07XG4gIGlmIChPYmplY3Qua2V5cyhjb25uZWN0aW9uSW5mby5zdG9yZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRyYWNrZWRDb25uZWN0aW9ucy5kZWxldGUobmFtZSk7XG4gIH1cbn07XG5jb25zdCBmaW5kQ2FsbGVyTmFtZSA9IChzdGFjaykgPT4ge1xuICB2YXIgX2EsIF9iO1xuICBpZiAoIXN0YWNrKSByZXR1cm4gdm9pZCAwO1xuICBjb25zdCB0cmFjZUxpbmVzID0gc3RhY2suc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IGFwaVNldFN0YXRlTGluZUluZGV4ID0gdHJhY2VMaW5lcy5maW5kSW5kZXgoXG4gICAgKHRyYWNlTGluZSkgPT4gdHJhY2VMaW5lLmluY2x1ZGVzKFwiYXBpLnNldFN0YXRlXCIpXG4gICk7XG4gIGlmIChhcGlTZXRTdGF0ZUxpbmVJbmRleCA8IDApIHJldHVybiB2b2lkIDA7XG4gIGNvbnN0IGNhbGxlckxpbmUgPSAoKF9hID0gdHJhY2VMaW5lc1thcGlTZXRTdGF0ZUxpbmVJbmRleCArIDFdKSA9PSBudWxsID8gdm9pZCAwIDogX2EudHJpbSgpKSB8fCBcIlwiO1xuICByZXR1cm4gKF9iID0gLy4rICguKykgLisvLmV4ZWMoY2FsbGVyTGluZSkpID09IG51bGwgPyB2b2lkIDAgOiBfYlsxXTtcbn07XG5jb25zdCBkZXZ0b29sc0ltcGwgPSAoZm4sIGRldnRvb2xzT3B0aW9ucyA9IHt9KSA9PiAoc2V0LCBnZXQsIGFwaSkgPT4ge1xuICBjb25zdCB7IGVuYWJsZWQsIGFub255bW91c0FjdGlvblR5cGUsIHN0b3JlLCAuLi5vcHRpb25zIH0gPSBkZXZ0b29sc09wdGlvbnM7XG4gIGxldCBleHRlbnNpb25Db25uZWN0b3I7XG4gIHRyeSB7XG4gICAgZXh0ZW5zaW9uQ29ubmVjdG9yID0gKGVuYWJsZWQgIT0gbnVsbCA/IGVuYWJsZWQgOiAoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX187XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxuICBpZiAoIWV4dGVuc2lvbkNvbm5lY3Rvcikge1xuICAgIHJldHVybiBmbihzZXQsIGdldCwgYXBpKTtcbiAgfVxuICBjb25zdCB7IGNvbm5lY3Rpb24sIC4uLmNvbm5lY3Rpb25JbmZvcm1hdGlvbiB9ID0gZXh0cmFjdENvbm5lY3Rpb25JbmZvcm1hdGlvbihzdG9yZSwgZXh0ZW5zaW9uQ29ubmVjdG9yLCBvcHRpb25zKTtcbiAgbGV0IGlzUmVjb3JkaW5nID0gdHJ1ZTtcbiAgYXBpLnNldFN0YXRlID0gKHN0YXRlLCByZXBsYWNlLCBuYW1lT3JBY3Rpb24pID0+IHtcbiAgICBjb25zdCByID0gc2V0KHN0YXRlLCByZXBsYWNlKTtcbiAgICBpZiAoIWlzUmVjb3JkaW5nKSByZXR1cm4gcjtcbiAgICBjb25zdCBpbmZlcnJlZEFjdGlvblR5cGUgPSBmaW5kQ2FsbGVyTmFtZShuZXcgRXJyb3IoKS5zdGFjayk7XG4gICAgY29uc3QgYWN0aW9uID0gbmFtZU9yQWN0aW9uID09PSB2b2lkIDAgPyB7IHR5cGU6IGFub255bW91c0FjdGlvblR5cGUgfHwgaW5mZXJyZWRBY3Rpb25UeXBlIHx8IFwiYW5vbnltb3VzXCIgfSA6IHR5cGVvZiBuYW1lT3JBY3Rpb24gPT09IFwic3RyaW5nXCIgPyB7IHR5cGU6IG5hbWVPckFjdGlvbiB9IDogbmFtZU9yQWN0aW9uO1xuICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoYWN0aW9uLCBnZXQoKSk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5zZW5kKFxuICAgICAge1xuICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgIHR5cGU6IGAke3N0b3JlfS8ke2FjdGlvbi50eXBlfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLmdldFRyYWNrZWRDb25uZWN0aW9uU3RhdGUob3B0aW9ucy5uYW1lKSxcbiAgICAgICAgW3N0b3JlXTogYXBpLmdldFN0YXRlKClcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiByO1xuICB9O1xuICBhcGkuZGV2dG9vbHMgPSB7XG4gICAgY2xlYW51cDogKCkgPT4ge1xuICAgICAgaWYgKGNvbm5lY3Rpb24gJiYgdHlwZW9mIGNvbm5lY3Rpb24udW5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICByZW1vdmVTdG9yZUZyb21UcmFja2VkQ29ubmVjdGlvbnMob3B0aW9ucy5uYW1lLCBzdG9yZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXRTdGF0ZUZyb21EZXZ0b29scyA9ICguLi5hKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxJc1JlY29yZGluZyA9IGlzUmVjb3JkaW5nO1xuICAgIGlzUmVjb3JkaW5nID0gZmFsc2U7XG4gICAgc2V0KC4uLmEpO1xuICAgIGlzUmVjb3JkaW5nID0gb3JpZ2luYWxJc1JlY29yZGluZztcbiAgfTtcbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gZm4oYXBpLnNldFN0YXRlLCBnZXQsIGFwaSk7XG4gIGlmIChjb25uZWN0aW9uSW5mb3JtYXRpb24udHlwZSA9PT0gXCJ1bnRyYWNrZWRcIikge1xuICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChpbml0aWFsU3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIGNvbm5lY3Rpb25JbmZvcm1hdGlvbi5zdG9yZXNbY29ubmVjdGlvbkluZm9ybWF0aW9uLnN0b3JlXSA9IGFwaTtcbiAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoXG4gICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbm5lY3Rpb25JbmZvcm1hdGlvbi5zdG9yZXMpLm1hcCgoW2tleSwgc3RvcmUyXSkgPT4gW1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBrZXkgPT09IGNvbm5lY3Rpb25JbmZvcm1hdGlvbi5zdG9yZSA/IGluaXRpYWxTdGF0ZSA6IHN0b3JlMi5nZXRTdGF0ZSgpXG4gICAgICAgIF0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBpZiAoYXBpLmRpc3BhdGNoRnJvbURldnRvb2xzICYmIHR5cGVvZiBhcGkuZGlzcGF0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCBkaWRXYXJuQWJvdXRSZXNlcnZlZEFjdGlvblR5cGUgPSBmYWxzZTtcbiAgICBjb25zdCBvcmlnaW5hbERpc3BhdGNoID0gYXBpLmRpc3BhdGNoO1xuICAgIGFwaS5kaXNwYXRjaCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgYXJnc1swXS50eXBlID09PSBcIl9fc2V0U3RhdGVcIiAmJiAhZGlkV2FybkFib3V0UmVzZXJ2ZWRBY3Rpb25UeXBlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW3p1c3RhbmQgZGV2dG9vbHMgbWlkZGxld2FyZV0gXCJfX3NldFN0YXRlXCIgYWN0aW9uIHR5cGUgaXMgcmVzZXJ2ZWQgdG8gc2V0IHN0YXRlIGZyb20gdGhlIGRldnRvb2xzLiBBdm9pZCB1c2luZyBpdC4nXG4gICAgICAgICk7XG4gICAgICAgIGRpZFdhcm5BYm91dFJlc2VydmVkQWN0aW9uVHlwZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBvcmlnaW5hbERpc3BhdGNoKC4uLmFyZ3MpO1xuICAgIH07XG4gIH1cbiAgY29ubmVjdGlvbi5zdWJzY3JpYmUoKG1lc3NhZ2UpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJBQ1RJT05cIjpcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLnBheWxvYWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJbenVzdGFuZCBkZXZ0b29scyBtaWRkbGV3YXJlXSBVbnN1cHBvcnRlZCBhY3Rpb24gZm9ybWF0XCJcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VKc29uVGhlbihcbiAgICAgICAgICBtZXNzYWdlLnBheWxvYWQsXG4gICAgICAgICAgKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBcIl9fc2V0U3RhdGVcIikge1xuICAgICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGFjdGlvbi5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhhY3Rpb24uc3RhdGUpLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgIFt6dXN0YW5kIGRldnRvb2xzIG1pZGRsZXdhcmVdIFVuc3VwcG9ydGVkIF9fc2V0U3RhdGUgYWN0aW9uIGZvcm1hdC5cbiAgICAgICAgICAgICAgICAgICAgV2hlbiB1c2luZyAnc3RvcmUnIG9wdGlvbiBpbiBkZXZ0b29scygpLCB0aGUgJ3N0YXRlJyBzaG91bGQgaGF2ZSBvbmx5IG9uZSBrZXksIHdoaWNoIGlzIGEgdmFsdWUgb2YgJ3N0b3JlJyB0aGF0IHdhcyBwYXNzZWQgaW4gZGV2dG9vbHMoKSxcbiAgICAgICAgICAgICAgICAgICAgYW5kIHZhbHVlIG9mIHRoaXMgb25seSBrZXkgc2hvdWxkIGJlIGEgc3RhdGUgb2JqZWN0LiBFeGFtcGxlOiB7IFwidHlwZVwiOiBcIl9fc2V0U3RhdGVcIiwgXCJzdGF0ZVwiOiB7IFwiYWJjMTIzU3RvcmVcIjogeyBcImZvb1wiOiBcImJhclwiIH0gfSB9XG4gICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRlRnJvbURldnRvb2xzID0gYWN0aW9uLnN0YXRlW3N0b3JlXTtcbiAgICAgICAgICAgICAgaWYgKHN0YXRlRnJvbURldnRvb2xzID09PSB2b2lkIDAgfHwgc3RhdGVGcm9tRGV2dG9vbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFwaS5nZXRTdGF0ZSgpKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3RhdGVGcm9tRGV2dG9vbHMpKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoc3RhdGVGcm9tRGV2dG9vbHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXBpLmRpc3BhdGNoRnJvbURldnRvb2xzKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFwaS5kaXNwYXRjaCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgICAgICAgICBhcGkuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiRElTUEFUQ0hcIjpcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnBheWxvYWQudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJSRVNFVFwiOlxuICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChnZXRUcmFja2VkQ29ubmVjdGlvblN0YXRlKG9wdGlvbnMubmFtZSkpO1xuICAgICAgICAgIGNhc2UgXCJDT01NSVRcIjpcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChhcGkuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICBjYXNlIFwiUk9MTEJBQ0tcIjpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUpzb25UaGVuKG1lc3NhZ2Uuc3RhdGUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNhc2UgXCJKVU1QX1RPX1NUQVRFXCI6XG4gICAgICAgICAgY2FzZSBcIkpVTVBfVE9fQUNUSU9OXCI6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VKc29uVGhlbihtZXNzYWdlLnN0YXRlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcGkuZ2V0U3RhdGUoKSkgIT09IEpTT04uc3RyaW5naWZ5KHN0YXRlW3N0b3JlXSkpIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBjYXNlIFwiSU1QT1JUX1NUQVRFXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmV4dExpZnRlZFN0YXRlIH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICBjb25zdCBsYXN0Q29tcHV0ZWRTdGF0ZSA9IChfYSA9IG5leHRMaWZ0ZWRTdGF0ZS5jb21wdXRlZFN0YXRlcy5zbGljZSgtMSlbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfYS5zdGF0ZTtcbiAgICAgICAgICAgIGlmICghbGFzdENvbXB1dGVkU3RhdGUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGxhc3RDb21wdXRlZFN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGxhc3RDb21wdXRlZFN0YXRlW3N0b3JlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIC8vIEZJWE1FIG5vLWFueVxuICAgICAgICAgICAgICBuZXh0TGlmdGVkU3RhdGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJQQVVTRV9SRUNPUkRJTkdcIjpcbiAgICAgICAgICAgIHJldHVybiBpc1JlY29yZGluZyA9ICFpc1JlY29yZGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbn07XG5jb25zdCBkZXZ0b29scyA9IGRldnRvb2xzSW1wbDtcbmNvbnN0IHBhcnNlSnNvblRoZW4gPSAoc3RyaW5naWZpZWQsIGZuKSA9PiB7XG4gIGxldCBwYXJzZWQ7XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShzdHJpbmdpZmllZCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJbenVzdGFuZCBkZXZ0b29scyBtaWRkbGV3YXJlXSBDb3VsZCBub3QgcGFyc2UgdGhlIHJlY2VpdmVkIGpzb25cIixcbiAgICAgIGVcbiAgICApO1xuICB9XG4gIGlmIChwYXJzZWQgIT09IHZvaWQgMCkgZm4ocGFyc2VkKTtcbn07XG5cbmNvbnN0IHN1YnNjcmliZVdpdGhTZWxlY3RvckltcGwgPSAoZm4pID0+IChzZXQsIGdldCwgYXBpKSA9PiB7XG4gIGNvbnN0IG9yaWdTdWJzY3JpYmUgPSBhcGkuc3Vic2NyaWJlO1xuICBhcGkuc3Vic2NyaWJlID0gKHNlbGVjdG9yLCBvcHRMaXN0ZW5lciwgb3B0aW9ucykgPT4ge1xuICAgIGxldCBsaXN0ZW5lciA9IHNlbGVjdG9yO1xuICAgIGlmIChvcHRMaXN0ZW5lcikge1xuICAgICAgY29uc3QgZXF1YWxpdHlGbiA9IChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmVxdWFsaXR5Rm4pIHx8IE9iamVjdC5pcztcbiAgICAgIGxldCBjdXJyZW50U2xpY2UgPSBzZWxlY3RvcihhcGkuZ2V0U3RhdGUoKSk7XG4gICAgICBsaXN0ZW5lciA9IChzdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0U2xpY2UgPSBzZWxlY3RvcihzdGF0ZSk7XG4gICAgICAgIGlmICghZXF1YWxpdHlGbihjdXJyZW50U2xpY2UsIG5leHRTbGljZSkpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c1NsaWNlID0gY3VycmVudFNsaWNlO1xuICAgICAgICAgIG9wdExpc3RlbmVyKGN1cnJlbnRTbGljZSA9IG5leHRTbGljZSwgcHJldmlvdXNTbGljZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5maXJlSW1tZWRpYXRlbHkpIHtcbiAgICAgICAgb3B0TGlzdGVuZXIoY3VycmVudFNsaWNlLCBjdXJyZW50U2xpY2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3JpZ1N1YnNjcmliZShsaXN0ZW5lcik7XG4gIH07XG4gIGNvbnN0IGluaXRpYWxTdGF0ZSA9IGZuKHNldCwgZ2V0LCBhcGkpO1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcbmNvbnN0IHN1YnNjcmliZVdpdGhTZWxlY3RvciA9IHN1YnNjcmliZVdpdGhTZWxlY3RvckltcGw7XG5cbmZ1bmN0aW9uIGNvbWJpbmUoaW5pdGlhbFN0YXRlLCBjcmVhdGUpIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiBPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsU3RhdGUsIGNyZWF0ZSguLi5hcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUpTT05TdG9yYWdlKGdldFN0b3JhZ2UsIG9wdGlvbnMpIHtcbiAgbGV0IHN0b3JhZ2U7XG4gIHRyeSB7XG4gICAgc3RvcmFnZSA9IGdldFN0b3JhZ2UoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwZXJzaXN0U3RvcmFnZSA9IHtcbiAgICBnZXRJdGVtOiAobmFtZSkgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgY29uc3QgcGFyc2UgPSAoc3RyMikgPT4ge1xuICAgICAgICBpZiAoc3RyMiA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cjIsIG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMucmV2aXZlcik7XG4gICAgICB9O1xuICAgICAgY29uc3Qgc3RyID0gKF9hID0gc3RvcmFnZS5nZXRJdGVtKG5hbWUpKSAhPSBudWxsID8gX2EgOiBudWxsO1xuICAgICAgaWYgKHN0ciBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHN0ci50aGVuKHBhcnNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZShzdHIpO1xuICAgIH0sXG4gICAgc2V0SXRlbTogKG5hbWUsIG5ld1ZhbHVlKSA9PiBzdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUsIG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMucmVwbGFjZXIpKSxcbiAgICByZW1vdmVJdGVtOiAobmFtZSkgPT4gc3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpXG4gIH07XG4gIHJldHVybiBwZXJzaXN0U3RvcmFnZTtcbn1cbmNvbnN0IHRvVGhlbmFibGUgPSAoZm4pID0+IChpbnB1dCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuKGlucHV0KTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW4ob25GdWxmaWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIHRvVGhlbmFibGUob25GdWxmaWxsZWQpKHJlc3VsdCk7XG4gICAgICB9LFxuICAgICAgY2F0Y2goX29uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0aGVuKF9vbkZ1bGZpbGxlZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiB0b1RoZW5hYmxlKG9uUmVqZWN0ZWQpKGUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5jb25zdCBwZXJzaXN0SW1wbCA9IChjb25maWcsIGJhc2VPcHRpb25zKSA9PiAoc2V0LCBnZXQsIGFwaSkgPT4ge1xuICBsZXQgb3B0aW9ucyA9IHtcbiAgICBzdG9yYWdlOiBjcmVhdGVKU09OU3RvcmFnZSgoKSA9PiBsb2NhbFN0b3JhZ2UpLFxuICAgIHBhcnRpYWxpemU6IChzdGF0ZSkgPT4gc3RhdGUsXG4gICAgdmVyc2lvbjogMCxcbiAgICBtZXJnZTogKHBlcnNpc3RlZFN0YXRlLCBjdXJyZW50U3RhdGUpID0+ICh7XG4gICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICAuLi5wZXJzaXN0ZWRTdGF0ZVxuICAgIH0pLFxuICAgIC4uLmJhc2VPcHRpb25zXG4gIH07XG4gIGxldCBoYXNIeWRyYXRlZCA9IGZhbHNlO1xuICBjb25zdCBoeWRyYXRpb25MaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBsZXQgc3RvcmFnZSA9IG9wdGlvbnMuc3RvcmFnZTtcbiAgaWYgKCFzdG9yYWdlKSB7XG4gICAgcmV0dXJuIGNvbmZpZyhcbiAgICAgICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW3p1c3RhbmQgcGVyc2lzdCBtaWRkbGV3YXJlXSBVbmFibGUgdG8gdXBkYXRlIGl0ZW0gJyR7b3B0aW9ucy5uYW1lfScsIHRoZSBnaXZlbiBzdG9yYWdlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS5gXG4gICAgICAgICk7XG4gICAgICAgIHNldCguLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgICBnZXQsXG4gICAgICBhcGlcbiAgICApO1xuICB9XG4gIGNvbnN0IHNldEl0ZW0gPSAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBvcHRpb25zLnBhcnRpYWxpemUoeyAuLi5nZXQoKSB9KTtcbiAgICByZXR1cm4gc3RvcmFnZS5zZXRJdGVtKG9wdGlvbnMubmFtZSwge1xuICAgICAgc3RhdGUsXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb25cbiAgICB9KTtcbiAgfTtcbiAgY29uc3Qgc2F2ZWRTZXRTdGF0ZSA9IGFwaS5zZXRTdGF0ZTtcbiAgYXBpLnNldFN0YXRlID0gKHN0YXRlLCByZXBsYWNlKSA9PiB7XG4gICAgc2F2ZWRTZXRTdGF0ZShzdGF0ZSwgcmVwbGFjZSk7XG4gICAgdm9pZCBzZXRJdGVtKCk7XG4gIH07XG4gIGNvbnN0IGNvbmZpZ1Jlc3VsdCA9IGNvbmZpZyhcbiAgICAoLi4uYXJncykgPT4ge1xuICAgICAgc2V0KC4uLmFyZ3MpO1xuICAgICAgdm9pZCBzZXRJdGVtKCk7XG4gICAgfSxcbiAgICBnZXQsXG4gICAgYXBpXG4gICk7XG4gIGFwaS5nZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBjb25maWdSZXN1bHQ7XG4gIGxldCBzdGF0ZUZyb21TdG9yYWdlO1xuICBjb25zdCBoeWRyYXRlID0gKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgaWYgKCFzdG9yYWdlKSByZXR1cm47XG4gICAgaGFzSHlkcmF0ZWQgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25MaXN0ZW5lcnMuZm9yRWFjaCgoY2IpID0+IHtcbiAgICAgIHZhciBfYTI7XG4gICAgICByZXR1cm4gY2IoKF9hMiA9IGdldCgpKSAhPSBudWxsID8gX2EyIDogY29uZmlnUmVzdWx0KTtcbiAgICB9KTtcbiAgICBjb25zdCBwb3N0UmVoeWRyYXRpb25DYWxsYmFjayA9ICgoX2IgPSBvcHRpb25zLm9uUmVoeWRyYXRlU3RvcmFnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmNhbGwob3B0aW9ucywgKF9hID0gZ2V0KCkpICE9IG51bGwgPyBfYSA6IGNvbmZpZ1Jlc3VsdCkpIHx8IHZvaWQgMDtcbiAgICByZXR1cm4gdG9UaGVuYWJsZShzdG9yYWdlLmdldEl0ZW0uYmluZChzdG9yYWdlKSkob3B0aW9ucy5uYW1lKS50aGVuKChkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUpID0+IHtcbiAgICAgIGlmIChkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUudmVyc2lvbiA9PT0gXCJudW1iZXJcIiAmJiBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUudmVyc2lvbiAhPT0gb3B0aW9ucy52ZXJzaW9uKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMubWlncmF0ZSkge1xuICAgICAgICAgICAgY29uc3QgbWlncmF0aW9uID0gb3B0aW9ucy5taWdyYXRlKFxuICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUuc3RhdGUsXG4gICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG1pZ3JhdGlvbiBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG1pZ3JhdGlvbi50aGVuKChyZXN1bHQpID0+IFt0cnVlLCByZXN1bHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgbWlncmF0aW9uXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBTdGF0ZSBsb2FkZWQgZnJvbSBzdG9yYWdlIGNvdWxkbid0IGJlIG1pZ3JhdGVkIHNpbmNlIG5vIG1pZ3JhdGUgZnVuY3Rpb24gd2FzIHByb3ZpZGVkYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtmYWxzZSwgZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnN0YXRlXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFtmYWxzZSwgdm9pZCAwXTtcbiAgICB9KS50aGVuKChtaWdyYXRpb25SZXN1bHQpID0+IHtcbiAgICAgIHZhciBfYTI7XG4gICAgICBjb25zdCBbbWlncmF0ZWQsIG1pZ3JhdGVkU3RhdGVdID0gbWlncmF0aW9uUmVzdWx0O1xuICAgICAgc3RhdGVGcm9tU3RvcmFnZSA9IG9wdGlvbnMubWVyZ2UoXG4gICAgICAgIG1pZ3JhdGVkU3RhdGUsXG4gICAgICAgIChfYTIgPSBnZXQoKSkgIT0gbnVsbCA/IF9hMiA6IGNvbmZpZ1Jlc3VsdFxuICAgICAgKTtcbiAgICAgIHNldChzdGF0ZUZyb21TdG9yYWdlLCB0cnVlKTtcbiAgICAgIGlmIChtaWdyYXRlZCkge1xuICAgICAgICByZXR1cm4gc2V0SXRlbSgpO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrKHN0YXRlRnJvbVN0b3JhZ2UsIHZvaWQgMCk7XG4gICAgICBzdGF0ZUZyb21TdG9yYWdlID0gZ2V0KCk7XG4gICAgICBoYXNIeWRyYXRlZCA9IHRydWU7XG4gICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuZm9yRWFjaCgoY2IpID0+IGNiKHN0YXRlRnJvbVN0b3JhZ2UpKTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrKHZvaWQgMCwgZSk7XG4gICAgfSk7XG4gIH07XG4gIGFwaS5wZXJzaXN0ID0ge1xuICAgIHNldE9wdGlvbnM6IChuZXdPcHRpb25zKSA9PiB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAuLi5uZXdPcHRpb25zXG4gICAgICB9O1xuICAgICAgaWYgKG5ld09wdGlvbnMuc3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gbmV3T3B0aW9ucy5zdG9yYWdlO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYXJTdG9yYWdlOiAoKSA9PiB7XG4gICAgICBzdG9yYWdlID09IG51bGwgPyB2b2lkIDAgOiBzdG9yYWdlLnJlbW92ZUl0ZW0ob3B0aW9ucy5uYW1lKTtcbiAgICB9LFxuICAgIGdldE9wdGlvbnM6ICgpID0+IG9wdGlvbnMsXG4gICAgcmVoeWRyYXRlOiAoKSA9PiBoeWRyYXRlKCksXG4gICAgaGFzSHlkcmF0ZWQ6ICgpID0+IGhhc0h5ZHJhdGVkLFxuICAgIG9uSHlkcmF0ZTogKGNiKSA9PiB7XG4gICAgICBoeWRyYXRpb25MaXN0ZW5lcnMuYWRkKGNiKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGh5ZHJhdGlvbkxpc3RlbmVycy5kZWxldGUoY2IpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG9uRmluaXNoSHlkcmF0aW9uOiAoY2IpID0+IHtcbiAgICAgIGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycy5hZGQoY2IpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZmluaXNoSHlkcmF0aW9uTGlzdGVuZXJzLmRlbGV0ZShjYik7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgaWYgKCFvcHRpb25zLnNraXBIeWRyYXRpb24pIHtcbiAgICBoeWRyYXRlKCk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlRnJvbVN0b3JhZ2UgfHwgY29uZmlnUmVzdWx0O1xufTtcbmNvbnN0IHBlcnNpc3QgPSBwZXJzaXN0SW1wbDtcblxuZXhwb3J0IHsgY29tYmluZSwgY3JlYXRlSlNPTlN0b3JhZ2UsIGRldnRvb2xzLCBwZXJzaXN0LCByZWR1eCwgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH07XG4iLCAiaW1wb3J0IHsgbG9naW4gfSBmcm9tICdAL2FwaS9hY2NvdW50J1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnXG5pbXBvcnQgeyBwZXJzaXN0LCBjcmVhdGVKU09OU3RvcmFnZSB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSdcblxuZXhwb3J0IGludGVyZmFjZSBJUHVibGlzaEFjY291bnQge1xuICBhY2NvdW50SWQ/OiBzdHJpbmcgLy8gXHU3NTI4XHU2MjM3aWRcbiAgZW1haWw/OiBzdHJpbmcgLy8gXHU5MEFFXHU3QkIxXG4gIGxpY2Vuc2U/OiBzdHJpbmcgLy8gXHU4QkI4XHU1M0VGXHU4QkMxXG4gIGF2YXRhcj86IHN0cmluZyAvLyBcdTU5MzRcdTUwQ0ZcbiAgbmlja25hbWU/OiBzdHJpbmcgLy8gXHU2NjM1XHU3OUYwXG4gIHRva2VuPzogc3RyaW5nIC8vIHRva2VuXG59XG5cbmNvbnN0IERFRkFVTFRfQUNDT1VOVDogSVB1Ymxpc2hBY2NvdW50ID0ge1xuICBhY2NvdW50SWQ6ICcnLFxuICBlbWFpbDogJycsXG4gIGxpY2Vuc2U6ICcnLFxuICBhdmF0YXI6ICcnLFxuICBuaWNrbmFtZTogJycsXG4gIHRva2VuOiAnJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRTdG9yZSB7XG4gIGFjY291bnRJbmZvOiBJUHVibGlzaEFjY291bnRcbiAgc2V0QWNjb3VudDogKGFjY291bnQ6IElQdWJsaXNoQWNjb3VudCkgPT4gdm9pZFxuICByZXNldEFjY291bnQ6ICgpID0+IHZvaWRcbiAgaXNMb2dpbjogKCkgPT4gYm9vbGVhblxuICBsb2dpbkFjY291bnQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj5cbn1cblxuZXhwb3J0IGNvbnN0IHVzZUFjY291bnRTdG9yZSA9IGNyZWF0ZVN0b3JlKFxuICBwZXJzaXN0PEFjY291bnRTdG9yZT4oXG4gICAgKHNldCkgPT4gKHtcbiAgICAgIC8vIFx1OEQyNlx1NjIzN1x1NEZFMVx1NjA2RlxuICAgICAgYWNjb3VudEluZm86IERFRkFVTFRfQUNDT1VOVCxcblxuICAgICAgLy8gXHU4QkJFXHU3RjZFXHU4RDI2XHU2MjM3XHU0RkUxXHU2MDZGXG4gICAgICBzZXRBY2NvdW50OiAoYWNjb3VudDogSVB1Ymxpc2hBY2NvdW50KSA9PlxuICAgICAgICBzZXQoKHN0YXRlKSA9PiB7XG4gICAgICAgICAgc3RhdGUuYWNjb3VudEluZm8gPSB7IC4uLnN0YXRlLmFjY291bnRJbmZvLCAuLi5hY2NvdW50IH1cbiAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgfSksXG5cbiAgICAgIC8vIFx1OTFDRFx1N0Y2RVx1OEQyNlx1NjIzN1x1NEZFMVx1NjA2RlxuICAgICAgcmVzZXRBY2NvdW50OiAoKSA9PlxuICAgICAgICBzZXQoKHN0YXRlKSA9PiB7XG4gICAgICAgICAgc3RhdGUuYWNjb3VudEluZm8gPSB7IC4uLkRFRkFVTFRfQUNDT1VOVCB9XG4gICAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICAgIH0pLFxuXG4gICAgICAvLyBcdTY2MkZcdTU0MjZcdTc2N0JcdTVGNTVcbiAgICAgIGlzTG9naW46ICgpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGFjY291bnRJZCA9ICcnLFxuICAgICAgICAgIGVtYWlsID0gJycsXG4gICAgICAgICAgbGljZW5zZSA9ICcnLFxuICAgICAgICAgIHRva2VuID0gJydcbiAgICAgICAgfSA9IHVzZUFjY291bnRTdG9yZS5nZXRTdGF0ZSgpLmFjY291bnRJbmZvIGFzIElQdWJsaXNoQWNjb3VudFxuICAgICAgICByZXR1cm4gYWNjb3VudElkICE9PSAnJyAmJiBlbWFpbCAhPT0gJycgJiYgbGljZW5zZSAhPT0gJycgJiYgdG9rZW4gIT09ICcnXG4gICAgICB9LFxuXG4gICAgICAvLyBcdTc2N0JcdTVGNTVcdThEMjZcdTYyMzdcbiAgICAgIGxvZ2luQWNjb3VudDogYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBlbWFpbCwgbGljZW5zZSB9ID0gdXNlQWNjb3VudFN0b3JlLmdldFN0YXRlKCkuYWNjb3VudEluZm9cbiAgICAgICAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmxlbmd0aCB8fCAhbGljZW5zZSB8fCAhbGljZW5zZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsb2dpblJlcyA9IGF3YWl0IGxvZ2luKGVtYWlsLCBsaWNlbnNlKVxuICAgICAgICAgICAgY29uc3QgeyB0b2tlbiwgYWNjb3VudCA9IHt9IH0gPSBsb2dpblJlcy5kYXRhLnJlc3VsdCB8fCB7fVxuXG4gICAgICAgICAgICB1c2VBY2NvdW50U3RvcmUuZ2V0U3RhdGUoKS5zZXRBY2NvdW50KHtcbiAgICAgICAgICAgICAgLi4udXNlQWNjb3VudFN0b3JlLmdldFN0YXRlKCkuYWNjb3VudEluZm8sXG4gICAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgICBhY2NvdW50SWQ6IGFjY291bnQuYWNjb3VudElkLFxuICAgICAgICAgICAgICBhdmF0YXI6IGFjY291bnQuaGVhZGVyLFxuICAgICAgICAgICAgICBuaWNrbmFtZTogYWNjb3VudC5uaWNrbmFtZVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB1c2VBY2NvdW50U3RvcmUuZ2V0U3RhdGUoKS5zZXRBY2NvdW50KHsgLi4udXNlQWNjb3VudFN0b3JlLmdldFN0YXRlKCkuYWNjb3VudEluZm8sIHRva2VuOiAnJyB9KVxuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSksXG4gICAge1xuICAgICAgbmFtZTogJ3NwYWNlc2hpcC1wdWJsaXNoLWFjY291bnQnLFxuICAgICAgc3RvcmFnZTogY3JlYXRlSlNPTlN0b3JhZ2UoKCkgPT4gbG9jYWxTdG9yYWdlKVxuICAgIH1cbiAgKVxuKVxuIiwgIi8qKlxuICogQEF1dGhvcjogU3RlcGhlbkNoZW5cbiAqIEBDcmVhdGUgVGltZTogMjAyNS0wNi0xMCAxMTozNjoyNFxuICogQE1vZGlmaWVkIGJ5OiBTdGVwaGVuQ2hlblxuICogQE1vZGlmaWVkIHRpbWU6IDIwMjUtMDYtMTAgMTE6NDk6MTRcbiAqIEBEZXNjcmlwdGlvbjogXHU0RUQzXHU1RTkzXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnXG5cbmNvbnN0IHVzZUFwcFN0b3JlID0gY3JlYXRlU3RvcmUoKHNldCkgPT4ge30pXG5cbmV4cG9ydCBkZWZhdWx0IHVzZUFwcFN0b3JlXG5cbmV4cG9ydCAqIGZyb20gJy4vYWNjb3VudCdcbiIsICJpbXBvcnQgeyBBcHAsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nXG5pbXBvcnQgeyBkcmFmdEFydGljbGUsIHB1Ymxpc2hBcnRpY2xlLCB1cGxvYWRBdHRhY2htZW50IH0gZnJvbSAnQC9hcGkvYXJ0aWNsZSdcbmltcG9ydCBNZXNzYWdlLCB7IFN0YXR1c1R5cGUgfSBmcm9tICdAL2NvbXBvbmVudHMvbWVzc2FnZSdcblxuLy8gRnJvbnQgTWF0dGVyIFx1NUI1N1x1NkJCNVx1NUUzOFx1OTFDRlx1NUI5QVx1NEU0OVxuLy8gXHU3NTI4XHU0RThFXHU1NzI4IE9ic2lkaWFuIFx1NjU4N1x1NEVGNlx1NzY4NCBGcm9udCBNYXR0ZXIgXHU0RTJEXHU1QjU4XHU1MEE4XHU1M0QxXHU1RTAzXHU3NkY4XHU1MTczXHU0RkUxXHU2MDZGXG5jb25zdCBmbV9rZXlfcHVibGlzaF9pZCA9ICdvcHBfcHVibGlzaF9pZCcgICAgICAgLy8gXHU2NTg3XHU3QUUwXHU1M0QxXHU1RTAzSURcbmNvbnN0IGZtX2tleV9wdWJsaXNoX3RpdGxlID0gJ29wcF9wdWJsaXNoX3RpdGxlJyAvLyBcdTY1ODdcdTdBRTBcdTUzRDFcdTVFMDNcdTY4MDdcdTk4OThcbmNvbnN0IGZtX2tleV9wdWJsaXNoX3N0YXR1cyA9ICdvcHBfcHVibGlzaF9zdGF0dXMnIC8vIFx1NjU4N1x1N0FFMFx1NTNEMVx1NUUwM1x1NzJCNlx1NjAwMVxuXG4vKipcbiAqIFx1NjU4N1x1N0FFMFx1NTNEMVx1NUUwM1x1NEUzQlx1NkQ0MVx1N0EwQlxuICogXHU1OTA0XHU3NDA2IE9ic2lkaWFuIFx1NjU4N1x1NEVGNlx1NzY4NFx1NTNEMVx1NUUwM1x1NkQ0MVx1N0EwQlx1RkYwQ1x1NTMwNVx1NjJFQ1x1OTg4NFx1NTNEMVx1NUUwM1x1NTQ4Q1x1NkI2M1x1NUYwRlx1NTNEMVx1NUUwM1xuICpcbiAqIEBwYXJhbSBmaWxlIC0gT2JzaWRpYW4gXHU2NTg3XHU0RUY2XHU1QkY5XHU4QzYxXG4gKiBAcGFyYW0gYXBwIC0gT2JzaWRpYW4gXHU1RTk0XHU3NTI4XHU1QjlFXHU0RjhCXG4gKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+IC0gXHU1M0QxXHU1RTAzXHU2NjJGXHU1NDI2XHU2MjEwXHU1MjlGXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGZpbGU6IFRGaWxlLCBhcHA6IEFwcCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBcdTUyMURcdTU5Q0JcdTUzMTZcdTUzRDFcdTVFMDNcdTc2RjhcdTUxNzNcdTUzRDhcdTkxQ0ZcbiAgbGV0IGFydGljbGVJZDogc3RyaW5nID0gJydcbiAgbGV0IHB1Ymxpc2hTdGF0dXM6IHN0cmluZyA9ICcnXG5cbiAgLy8gXHU2QjY1XHU5QUE0MTogXHU2OEMwXHU2N0U1XHU2NTg3XHU0RUY2XHU3Njg0XHU1M0QxXHU1RTAzXHU4QkIwXHU1RjU1XG4gIC8vIFx1NEVDRVx1NjU4N1x1NEVGNlx1NzY4NCBGcm9udCBNYXR0ZXIgXHU0RTJEXHU4QkZCXHU1M0Q2XHU1REYyXHU2NzA5XHU3Njg0XHU1M0QxXHU1RTAzXHU0RkUxXHU2MDZGXG4gIGF3YWl0IGFwcC5maWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIoZmlsZSwgKGRhdGEpID0+IHtcbiAgICBpZiAoZGF0YVtmbV9rZXlfcHVibGlzaF9pZF0pIHtcbiAgICAgIGFydGljbGVJZCA9IGRhdGFbZm1fa2V5X3B1Ymxpc2hfaWRdXG4gICAgICBwdWJsaXNoU3RhdHVzID0gZGF0YVtmbV9rZXlfcHVibGlzaF9zdGF0dXNdXG4gICAgICBjb25zb2xlLmxvZyhmbV9rZXlfcHVibGlzaF9pZCArICcgPSAnICsgYXJ0aWNsZUlkKVxuICAgICAgY29uc29sZS5sb2coZm1fa2V5X3B1Ymxpc2hfc3RhdHVzICsgJyA9ICcgKyBwdWJsaXNoU3RhdHVzKVxuICAgIH1cbiAgfSlcblxuICAvLyBcdTZCNjVcdTlBQTQyOiBcdTU5MDRcdTc0MDZcdTk5OTZcdTZCMjFcdTUzRDFcdTVFMDMgLSBcdTk4ODRcdTUzRDFcdTVFMDNcdTZENDFcdTdBMEJcbiAgLy8gXHU1OTgyXHU2NzlDXHU2NTg3XHU0RUY2XHU2Q0ExXHU2NzA5XHU1M0QxXHU1RTAzXHU3MkI2XHU2MDAxXHVGRjBDXHU4QkY0XHU2NjBFXHU2NjJGXHU5OTk2XHU2QjIxXHU1M0QxXHU1RTAzXHVGRjBDXHU5NzAwXHU4OTgxXHU1MTQ4XHU4RkRCXHU4ODRDXHU5ODg0XHU1M0QxXHU1RTAzXG4gIGlmICghcHVibGlzaFN0YXR1cykge1xuICAgIGNvbnNvbGUubG9nKCdubyBwdWJsaXNoIGluZm8gJyArIHB1Ymxpc2hTdGF0dXMpXG5cbiAgICB0cnkge1xuICAgICAgLy8gXHU4QzAzXHU3NTI4XHU5ODg0XHU1M0QxXHU1RTAzQVBJXHVGRjBDXHU4M0I3XHU1M0Q2XHU2NTg3XHU3QUUwSURcdTU0OENcdTUyMURcdTU5Q0JcdTcyQjZcdTYwMDFcbiAgICAgIGNvbnN0IHByZVB1Ymxpc2hSZXNwID0gYXdhaXQgZHJhZnRBcnRpY2xlKClcbiAgICAgIGNvbnN0IHByZVB1YlJlc3AgPSBwcmVQdWJsaXNoUmVzcC5kYXRhIHx8IHt9XG4gICAgICBjb25zb2xlLmxvZygnXHU5ODg0XHU1M0QxXHU1RTAzXHU2MjEwXHU1MjlGJywgcHJlUHViUmVzcClcblxuICAgICAgLy8gXHU1QzA2XHU5ODg0XHU1M0QxXHU1RTAzXHU4RkQ0XHU1NkRFXHU3Njg0XHU0RkUxXHU2MDZGXHU1MTk5XHU1MTY1XHU2NTg3XHU0RUY2XHU3Njg0IEZyb250IE1hdHRlclxuICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnByb2Nlc3NGcm9udE1hdHRlcihmaWxlLCAoZGF0YSkgPT4ge1xuICAgICAgICBkYXRhW2ZtX2tleV9wdWJsaXNoX2lkXSA9IHByZVB1YlJlc3AucmVzdWx0LmFydGljbGVJZFxuICAgICAgICBkYXRhW2ZtX2tleV9wdWJsaXNoX3N0YXR1c10gPSBwcmVQdWJSZXNwLnJlc3VsdC5zdGF0dXNcbiAgICAgICAgZGF0YVtmbV9rZXlfcHVibGlzaF90aXRsZV0gPSBwcmVQdWJSZXNwLnJlc3VsdC50aXRsZVxuICAgICAgICAvLyBcdTU0MENcdTY1RjZcdTY2RjRcdTY1QjBcdTY3MkNcdTU3MzBcdTUzRDhcdTkxQ0ZcdUZGMENcdTRGOUJcdTU0MEVcdTdFRURcdTRGN0ZcdTc1MjhcbiAgICAgICAgYXJ0aWNsZUlkID0gcHJlUHViUmVzcC5yZXN1bHQuYXJ0aWNsZUlkXG4gICAgICAgIHB1Ymxpc2hTdGF0dXMgPSBwcmVQdWJSZXNwLnJlc3VsdC5zdGF0dXNcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1x1OTg4NFx1NTNEMVx1NUUwM1x1NTkzMVx1OEQyNScgKyBlcnJvcilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIFx1NkI2NVx1OUFBNDM6IFx1NkI2M1x1NUYwRlx1NTNEMVx1NUUwM1x1NkQ0MVx1N0EwQlxuICAvLyBcdThCRkJcdTUzRDZcdTY1ODdcdTRFRjZcdTVCOENcdTY1NzRcdTUxODVcdTVCQjlcbiAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmaWxlLnZhdWx0LnJlYWQoZmlsZSlcblxuICB0cnkge1xuICAgIC8vIFx1NkI2NVx1OUFBNDMuNTogXHU2NTg3XHU0RUY2XHU2NTg3XHU2NzJDXHU5ODg0XHU1OTA0XHU3NDA2IC0gXHU1OTA0XHU3NDA2IE9ic2lkaWFuIFx1NUYxNVx1NzUyOFx1NjgzQ1x1NUYwRlxuICAgIC8vIFx1NjdFNVx1NjI3RVx1NUU3Nlx1NTkwNFx1NzQwNlx1NjU4N1x1Njg2M1x1NEUyRFx1NzY4NCBbW11dIFx1NUYxNVx1NzUyOFx1NjgzQ1x1NUYwRlx1RkYwQ1x1NUMwNlx1NTZGRVx1NzI0N1x1NjU4N1x1NEVGNlx1NEUwQVx1NEYyMFx1NUU3Nlx1NjZGRlx1NjM2Mlx1NEUzQVx1OEZEQ1x1N0EwQlx1OTRGRVx1NjNBNVxuICAgIGNvbnRlbnQgPSBhd2FpdCBwcm9jZXNzT2JzaWRpYW5SZWZlcmVuY2VzKGNvbnRlbnQsIGZpbGUsIGFwcCwgYXJ0aWNsZUlkKVxuXG4gICAgLy8gXHU4QzAzXHU3NTI4XHU1M0QxXHU1RTAzQVBJXHVGRjBDXHU1QzA2XHU2NTg3XHU3QUUwXHU1MTg1XHU1QkI5XHU1M0QxXHU1RTAzXHU1MjMwXHU4RkRDXHU3QTBCXHU2NzBEXHU1MkExXG4gICAgY29uc3QgcHVibGlzaFJlc3AgPSBhd2FpdCBwdWJsaXNoQXJ0aWNsZShhcnRpY2xlSWQsIGZpbGUuYmFzZW5hbWUsIGNvbnRlbnQpXG4gICAgY29uc3QgcmVzcERhdGEgPSBwdWJsaXNoUmVzcC5kYXRhXG4gICAgY29uc29sZS5sb2coJ1x1NTNEMVx1NUUwM1x1N0VEM1x1Njc5QzogJyArIHJlc3BEYXRhLmNvZGUpXG5cbiAgICAvLyBcdTZCNjVcdTlBQTQ0OiBcdTY2RjRcdTY1QjBcdTUzRDFcdTVFMDNcdTcyQjZcdTYwMDFcbiAgICAvLyBcdTUzRDFcdTVFMDNcdTYyMTBcdTUyOUZcdTU0MEVcdUZGMENcdTY2RjRcdTY1QjBcdTY1ODdcdTRFRjZcdTc2ODQgRnJvbnQgTWF0dGVyIFx1NEUyRFx1NzY4NFx1NzJCNlx1NjAwMVx1NEZFMVx1NjA2RlxuICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIoZmlsZSwgKGRhdGEpID0+IHtcbiAgICAgIGRhdGFbZm1fa2V5X3B1Ymxpc2hfc3RhdHVzXSA9ICdwdWJsaXNoZWQnICAvLyBcdTY4MDdcdThCQjBcdTRFM0FcdTVERjJcdTUzRDFcdTVFMDNcbiAgICAgIGRhdGFbZm1fa2V5X3B1Ymxpc2hfdGl0bGVdID0gZmlsZS5iYXNlbmFtZSAvLyBcdTY2RjRcdTY1QjBcdTUzRDFcdTVFMDNcdTY4MDdcdTk4OThcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdcdTUzRDFcdTVFMDNcdTk1MTlcdThCRUY6ICcgKyBlcnJvcilcblxuICAgIC8vIFx1NjYzRVx1NzkzQVx1OTUxOVx1OEJFRlx1NkQ4OFx1NjA2Rlx1N0VEOVx1NzUyOFx1NjIzN1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBuZXcgTWVzc2FnZShgXHU1M0QxXHU1RTAzXHU1OTMxXHU4RDI1OiAke2Vycm9yLm1lc3NhZ2V9YCwgU3RhdHVzVHlwZS5FcnJvciwgODAwMClcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3IE1lc3NhZ2UoJ1x1NTNEMVx1NUUwM1x1NUYwMlx1NUUzOFx1RkYwQ1x1OEJGN1x1NjhDMFx1NjdFNVx1N0Y1MVx1N0VEQ1x1OEZERVx1NjNBNVx1NTQ4Q1x1NjU4N1x1NEVGNlx1NUYxNVx1NzUyOCcsIFN0YXR1c1R5cGUuRXJyb3IsIDgwMDApXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBcdTU5MDRcdTc0MDYgT2JzaWRpYW4gXHU1RjE1XHU3NTI4XHU2ODNDXHU1RjBGIFtbXV0gXHU0RTJEXHU3Njg0XHU1NkZFXHU3MjQ3XHU2NTg3XHU0RUY2XG4gKiBcdTY3RTVcdTYyN0VcdTY1ODdcdTY4NjNcdTRFMkRcdTc2ODQgW1tdXSBcdTVGMTVcdTc1MjhcdUZGMENcdThCQzZcdTUyMkJcdTU2RkVcdTcyNDdcdTY1ODdcdTRFRjZcdUZGMENcdTRFMEFcdTRGMjBcdTUyMzBcdThGRENcdTdBMEJcdTY3MERcdTUyQTFcdTVFNzZcdTY2RkZcdTYzNjJcdTRFM0FcdThGRENcdTdBMEJcdTk0RkVcdTYzQTVcbiAqXG4gKiBAcGFyYW0gY29udGVudCAtIFx1NTM5Rlx1NTlDQiBtYXJrZG93biBcdTUxODVcdTVCQjlcbiAqIEBwYXJhbSBjdXJyZW50RmlsZSAtIFx1NUY1M1x1NTI0RFx1NjU4N1x1NEVGNlx1NUJGOVx1OEM2MVxuICogQHBhcmFtIGFwcCAtIE9ic2lkaWFuIFx1NUU5NFx1NzUyOFx1NUI5RVx1NEY4QlxuICogQHBhcmFtIGFydGljbGVJZCAtIFx1NjU4N1x1N0FFMElEXHVGRjBDXHU3NTI4XHU0RThFXHU0RTBBXHU0RjIwXHU5NjQ0XHU0RUY2XG4gKiBAcmV0dXJucyBQcm9taXNlPHN0cmluZz4gLSBcdTU5MDRcdTc0MDZcdTU0MEVcdTc2ODQgbWFya2Rvd24gXHU1MTg1XHU1QkI5XG4gKiBAdGhyb3dzIEVycm9yIC0gXHU1RjUzXHU1NkZFXHU3MjQ3XHU0RTBBXHU0RjIwXHU1OTMxXHU4RDI1XHU2MjE2XHU2NTg3XHU0RUY2XHU0RTBEXHU1QjU4XHU1NzI4XHU2NUY2XHU2MjlCXHU1MUZBXHU5NTE5XHU4QkVGXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NPYnNpZGlhblJlZmVyZW5jZXMoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgY3VycmVudEZpbGU6IFRGaWxlLFxuICBhcHA6IEFwcCxcbiAgYXJ0aWNsZUlkOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFx1NTMzOVx1OTE0RCBbW11dIFx1NUYxNVx1NzUyOFx1NjgzQ1x1NUYwRlx1NzY4NFx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRlxuICAvLyBcdTY1MkZcdTYzMDEgW1tmaWxlbmFtZV1dIFx1NTQ4QyBbW2ZpbGVuYW1lfGRpc3BsYXkgdGV4dF1dIFx1NEUyNFx1NzlDRFx1NjgzQ1x1NUYwRlxuICBjb25zdCByZWZlcmVuY2VSZWdleCA9IC9cXFtcXFsoW15cXF18XSspKFxcfFteXFxdXSspP1xcXVxcXS9nXG5cbiAgLy8gXHU1QjlBXHU0RTQ5XHU2NTJGXHU2MzAxXHU3Njg0XHU1NkZFXHU3MjQ3XHU2NTg3XHU0RUY2XHU2MjY5XHU1QzU1XHU1NDBEXG4gIGNvbnN0IGltYWdlRXh0ZW5zaW9ucyA9IFsnLnBuZycsICcuanBnJywgJy5qcGVnJywgJy5naWYnLCAnLmJtcCcsICcuc3ZnJywgJy53ZWJwJ11cblxuICBsZXQgcHJvY2Vzc2VkQ29udGVudCA9IGNvbnRlbnRcbiAgY29uc3QgbWF0Y2hlcyA9IEFycmF5LmZyb20oY29udGVudC5tYXRjaEFsbChyZWZlcmVuY2VSZWdleCkpXG5cbiAgY29uc29sZS5sb2coYFx1NjI3RVx1NTIzMCAke21hdGNoZXMubGVuZ3RofSBcdTRFMkEgT2JzaWRpYW4gXHU1RjE1XHU3NTI4YClcblxuICAvLyBcdTU5MDRcdTc0MDZcdTZCQ0ZcdTRFMkFcdTUzMzlcdTkxNERcdTc2ODRcdTVGMTVcdTc1MjhcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF0gLy8gXHU1QjhDXHU2NTc0XHU3Njg0IFtbLi4uXV0gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAgY29uc3QgZmlsZW5hbWUgPSBtYXRjaFsxXS50cmltKCkgLy8gXHU2NTg3XHU0RUY2XHU1NDBEXHU5MEU4XHU1MjA2XG4gICAgY29uc3QgZGlzcGxheVRleHQgPSBtYXRjaFsyXSAvLyBcdTY2M0VcdTc5M0FcdTY1ODdcdTY3MkNcdTkwRThcdTUyMDZcdUZGMDhcdTUzRUZcdTkwMDlcdUZGMDlcblxuICAgIC8vIFx1NjhDMFx1NjdFNVx1NjYyRlx1NTQyNlx1NEUzQVx1NTZGRVx1NzI0N1x1NjU4N1x1NEVGNlxuICAgIGNvbnN0IGlzSW1hZ2UgPSBpbWFnZUV4dGVuc2lvbnMuc29tZShleHQgPT5cbiAgICAgIGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZXh0KVxuICAgIClcblxuICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgXHU1OTA0XHU3NDA2XHU1NkZFXHU3MjQ3XHU1RjE1XHU3NTI4OiAke2ZpbGVuYW1lfWApXG5cbiAgICAgIC8vIFx1NTcyOCB2YXVsdCBcdTRFMkRcdTY3RTVcdTYyN0VcdTVGMTVcdTc1MjhcdTc2ODRcdTY1ODdcdTRFRjZcbiAgICAgIGNvbnN0IHJlZmVyZW5jZWRGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlbmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChmaWxlbmFtZSwgY3VycmVudEZpbGUucGF0aClcblxuICAgICAgaWYgKCFyZWZlcmVuY2VkRmlsZSB8fCAhKHJlZmVyZW5jZWRGaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG4gICAgICAgIC8vIFx1NjI3RVx1NEUwRFx1NTIzMFx1NUYxNVx1NzUyOFx1NzY4NFx1NTZGRVx1NzI0N1x1NjU4N1x1NEVGNlx1RkYwQ1x1NjI5Qlx1NTFGQVx1OTUxOVx1OEJFRlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFx1NjI3RVx1NEUwRFx1NTIzMFx1NUYxNVx1NzUyOFx1NzY4NFx1NTZGRVx1NzI0N1x1NjU4N1x1NEVGNjogJHtmaWxlbmFtZX1gKVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBcdThCRkJcdTUzRDZcdTY1ODdcdTRFRjZcdTUxODVcdTVCQjlcdTVFNzZcdThGNkNcdTYzNjJcdTRFM0EgRmlsZSBcdTVCRjlcdThDNjFcbiAgICAgICAgY29uc3QgZmlsZUJ1ZmZlciA9IGF3YWl0IGFwcC52YXVsdC5yZWFkQmluYXJ5KHJlZmVyZW5jZWRGaWxlKVxuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2ZpbGVCdWZmZXJdLCB7IHR5cGU6IGdldE1pbWVUeXBlKHJlZmVyZW5jZWRGaWxlLmV4dGVuc2lvbikgfSlcbiAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgcmVmZXJlbmNlZEZpbGUubmFtZSwgeyB0eXBlOiBibG9iLnR5cGUgfSlcblxuICAgICAgICAvLyBcdTRFMEFcdTRGMjBcdTY1ODdcdTRFRjZcdTUyMzBcdThGRENcdTdBMEJcdTY3MERcdTUyQTFcbiAgICAgICAgY29uc3QgdXBsb2FkUmVzcCA9IGF3YWl0IHVwbG9hZEF0dGFjaG1lbnQoYXJ0aWNsZUlkLCBbZmlsZV0pXG4gICAgICAgIGNvbnN0IHVwbG9hZERhdGEgPSB1cGxvYWRSZXNwLmRhdGFcblxuICAgICAgICAvLyBcdTY4QzBcdTY3RTVcdTRFMEFcdTRGMjBcdTdFRDNcdTY3OUNcbiAgICAgICAgaWYgKCF1cGxvYWREYXRhIHx8ICF1cGxvYWREYXRhLnJlc3VsdCB8fCB1cGxvYWREYXRhLnJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBcdTRFMEFcdTRGMjBcdTU5MzFcdThEMjVcdUZGMENcdTYyOUJcdTUxRkFcdTk1MTlcdThCRUZcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IHVwbG9hZERhdGE/LmluZm8gfHwgJ1x1NjcyQVx1NzdFNVx1OTUxOVx1OEJFRidcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFx1NTZGRVx1NzI0N1x1NEUwQVx1NEYyMFx1NTkzMVx1OEQyNTogJHtmaWxlbmFtZX0gLSAke2Vycm9yTXNnfWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBcdTY4QzBcdTY3RTVcdTRFMEFcdTRGMjBcdTdFRDNcdTY3OUNcdTRFMkRcdTY2MkZcdTU0MjZcdTUzMDVcdTU0MkJVUkxcbiAgICAgICAgY29uc3QgdXBsb2FkUmVzdWx0ID0gdXBsb2FkRGF0YS5yZXN1bHRbMF1cbiAgICAgICAgaWYgKCF1cGxvYWRSZXN1bHQgfHwgIXVwbG9hZFJlc3VsdC51cmwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFx1NTZGRVx1NzI0N1x1NEUwQVx1NEYyMFx1NTkzMVx1OEQyNTogJHtmaWxlbmFtZX0gLSBcdTY3MERcdTUyQTFcdTU2NjhcdTY3MkFcdThGRDRcdTU2REVcdTY3MDlcdTY1NDhcdTc2ODRcdTU2RkVcdTcyNDdVUkxgKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gXHU4M0I3XHU1M0Q2XHU0RTBBXHU0RjIwXHU1NDBFXHU3Njg0XHU4RkRDXHU3QTBCVVJMXG4gICAgICAgIGNvbnN0IHJlbW90ZVVybCA9IHVwbG9hZFJlc3VsdC51cmxcbiAgICAgICAgY29uc29sZS5sb2coYFx1NTZGRVx1NzI0N1x1NEUwQVx1NEYyMFx1NjIxMFx1NTI5RjogJHtmaWxlbmFtZX0gLT4gJHtyZW1vdGVVcmx9YClcblxuICAgICAgICAvLyBcdTY2RkZcdTYzNjJcdTUzOUZcdTU5Q0JcdTVGMTVcdTc1MjhcdTRFM0FcdTY4MDdcdTUxQzYgbWFya2Rvd24gXHU1NkZFXHU3MjQ3XHU4QkVEXHU2Q0Q1XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gZGlzcGxheVRleHQgPyBkaXNwbGF5VGV4dC5zdWJzdHJpbmcoMSkgOiBmaWxlbmFtZSAvLyBcdTc5RkJcdTk2NjQgfCBcdTUyNERcdTdGMDBcbiAgICAgICAgY29uc3QgbWFya2Rvd25JbWFnZSA9IGAhWyR7ZGlzcGxheU5hbWV9XSgke3JlbW90ZVVybH0pYFxuXG4gICAgICAgIC8vIFx1NTcyOFx1NTE4NVx1NUJCOVx1NEUyRFx1NjZGRlx1NjM2Mlx1NUYxNVx1NzUyOFxuICAgICAgICBwcm9jZXNzZWRDb250ZW50ID0gcHJvY2Vzc2VkQ29udGVudC5yZXBsYWNlKGZ1bGxNYXRjaCwgbWFya2Rvd25JbWFnZSlcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gXHU5MUNEXHU2NUIwXHU2MjlCXHU1MUZBXHU5NTE5XHU4QkVGXHVGRjBDXHU4QkE5XHU0RTBBXHU1QzQyXHU1OTA0XHU3NDA2XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFx1NTkwNFx1NzQwNlx1NTZGRVx1NzI0N1x1NUYxNVx1NzUyOFx1NjVGNlx1NTFGQVx1OTUxOTogJHtmaWxlbmFtZX0gLSAke1N0cmluZyhlcnJvcil9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcm9jZXNzZWRDb250ZW50XG59XG5cbi8qKlxuICogXHU2ODM5XHU2MzZFXHU2NTg3XHU0RUY2XHU2MjY5XHU1QzU1XHU1NDBEXHU4M0I3XHU1M0Q2IE1JTUUgXHU3QzdCXHU1NzhCXG4gKiBAcGFyYW0gZXh0ZW5zaW9uIC0gXHU2NTg3XHU0RUY2XHU2MjY5XHU1QzU1XHU1NDBEXG4gKiBAcmV0dXJucyBzdHJpbmcgLSBNSU1FIFx1N0M3Qlx1NTc4QlxuICovXG5mdW5jdGlvbiBnZXRNaW1lVHlwZShleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1pbWVUeXBlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAncG5nJzogJ2ltYWdlL3BuZycsXG4gICAgJ2pwZyc6ICdpbWFnZS9qcGVnJyxcbiAgICAnanBlZyc6ICdpbWFnZS9qcGVnJyxcbiAgICAnZ2lmJzogJ2ltYWdlL2dpZicsXG4gICAgJ2JtcCc6ICdpbWFnZS9ibXAnLFxuICAgICdzdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gICAgJ3dlYnAnOiAnaW1hZ2Uvd2VicCdcbiAgfVxuXG4gIHJldHVybiBtaW1lVHlwZXNbZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCldIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG59XG4iLCAiLyoqXG4gKiBAQXV0aG9yOiBTdGVwaGVuQ2hlblxuICogQENyZWF0ZSBUaW1lOiAyMDI1LTA1LTI2IDEwOjU2OjE5XG4gKiBATW9kaWZpZWQgYnk6IFN0ZXBoZW5DaGVuXG4gKiBATW9kaWZpZWQgdGltZTogMjAyNS0wNS0yNiAxNzowMzozMFxuICogQERlc2NyaXB0aW9uOiBcdTY1ODdcdTdBRTBcdTc2RjhcdTUxNzNcdTYzQTVcdTUzRTNcbiAqL1xuXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdAL3V0aWxzL3JlcXVlc3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVB1Ymxpc2hBcnRpY2xlIHt9XG5cbi8qKiBcdTgzQjdcdTUzRDZcdTc1MjhcdTYyMzdcdTUzRDFcdTVFMDNcdTc2ODRcdTY1ODdcdTdBRTBcdTUyMTdcdTg4NjggKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcnRpY2xlTGlzdChcbiAgcGFnZT86IG51bWJlcixcbiAgc2l6ZT86IG51bWJlcixcbiAgc3RhdHVzPzogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnIHwgJ3ByaXZhdGUnLFxuICB0aXRsZT86IHN0cmluZyxcbiAgdXNlclNvdXJjZUlkPzogc3RyaW5nXG4pIHtcbiAgcmV0dXJuIHJlcXVlc3QucG9zdCh7XG4gICAgdXJsOiAnL2FjY291bnQvYXJ0aWNsZS9saXN0JyxcbiAgICBkYXRhOiB7IG5vOiBwYWdlIHx8IDEsIHNpemU6IHNpemUgfHwgMTAsIHN0YXR1cywgdGl0bGUsIHVzZXJTb3VyY2VJZCB9XG4gIH0pXG59XG4vKiogXHU4M0I3XHU1M0Q2XHU2NTg3XHU3QUUwXHU4QkU2XHU2MEM1ICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJ0aWNsZURldGFpbChhcnRpY2xlSWQ6IHN0cmluZykge1xuICByZXR1cm4gcmVxdWVzdC5nZXQoeyB1cmw6IGAvYXJ0aWNsZS8ke2FydGljbGVJZH1gIH0pXG59XG4vKiogXHU1M0QxXHU1RTAzXHU4MzQ5XHU3QTNGICovXG5leHBvcnQgZnVuY3Rpb24gZHJhZnRBcnRpY2xlKCkge1xuICByZXR1cm4gcmVxdWVzdC5wb3N0KHsgdXJsOiAnL2FjY291bnQvYXJ0aWNsZS9kcmFmdCcgfSlcbn1cbi8qKiBcdTUzRDFcdTVFMDNcdTY1ODdcdTdBRTAgKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoQXJ0aWNsZShhcnRpY2xlSWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgbWRDb250ZW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHJlcXVlc3QucG9zdCh7XG4gICAgdXJsOiAnL2FjY291bnQvYXJ0aWNsZS9wdWJsaXNoJyxcbiAgICBkYXRhOiB7IGFydGljbGVJZCwgdGl0bGUsIG1kQ29udGVudCB9XG4gIH0pXG59XG4vKiogXHU0RTBBXHU0RjIwXHU2NTg3XHU3QUUwXHU5NjQ0XHU0RUY2ICovXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkQXR0YWNobWVudChhcnRpY2xlSWQ6IHN0cmluZywgZmlsZXM6IEZpbGVbXSkge1xuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gIGZvcm1EYXRhLmFwcGVuZCgnYXJ0aWNsZUlkJywgYXJ0aWNsZUlkKVxuXG4gIC8vIFx1NjgzOVx1NjM2RVx1NjcwRFx1NTJBMVx1N0FFRlx1NjNBNVx1NTNFM1x1ODk4MVx1NkM0Mlx1RkYwQ1x1NEY3Rlx1NzUyOCAnYXR0YWNobWVudHMnIFx1NEY1Q1x1NEUzQVx1NUI1N1x1NkJCNVx1NTQwRFx1RkYwQ1x1NjUyRlx1NjMwMVx1NTkxQVx1NjU4N1x1NEVGNlx1NEUwQVx1NEYyMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhdHRhY2htZW50cycsIGZpbGVzW2ldKVxuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3QucG9zdCh7XG4gICAgdXJsOiBgL2FjY291bnQvYXJ0aWNsZS9hdHRhY2htZW50L3VwbG9hZGAsXG4gICAgLy8gXHU2Q0U4XHU2MTBGXHVGRjFBXHU0RTBEXHU4OTgxXHU2MjRCXHU1MkE4XHU4QkJFXHU3RjZFIENvbnRlbnQtVHlwZVx1RkYwQ1x1OEJBOVx1NkQ0Rlx1ODlDOFx1NTY2OFx1ODFFQVx1NTJBOFx1OEJCRVx1N0Y2RSBtdWx0aXBhcnQvZm9ybS1kYXRhIFx1NTQ4QyBib3VuZGFyeVxuICAgIGRhdGE6IGZvcm1EYXRhXG4gIH0pXG59XG4vKiogXHU1M0Q2XHU2RDg4XHU2NTg3XHU3QUUwXHU1M0QxXHU1RTAzICovXG5leHBvcnQgZnVuY3Rpb24gdW5QdWJsaXNoQXJ0aWNsZShhcnRpY2xlSWQ6IHN0cmluZykge1xuICByZXR1cm4gcmVxdWVzdC5wb3N0KHsgdXJsOiAnL2FjY291bnQvYXJ0aWNsZS91bnB1Ymxpc2gnLCBkYXRhOiB7IGFydGljbGVJZDogYXJ0aWNsZUlkIH0gfSlcbn1cblxuLyoqIFx1NzBCOVx1OEQ1RVx1NjU4N1x1N0FFMCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpa2VBcnRpY2xlKGFydGljbGVJZDogc3RyaW5nKSB7XG4gIHJldHVybiByZXF1ZXN0LmdldCh7IHVybDogYC9hcnRpY2xlL2xpa2UvJHthcnRpY2xlSWR9YCB9KVxufVxuLyoqIFx1NTNENlx1NkQ4OFx1NzBCOVx1OEQ1RVx1NjU4N1x1N0FFMCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubGlrZUFydGljbGUoYXJ0aWNsZUlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHJlcXVlc3QuZ2V0KHsgdXJsOiBgL2FydGljbGUvdW5saWtlLyR7YXJ0aWNsZUlkfWAgfSlcbn1cblxuLyoqIFx1ODNCN1x1NTNENlx1NzUyOFx1NjIzN1x1NjUzNlx1ODVDRlx1NzY4NFx1NjU4N1x1N0FFMFx1NTIxN1x1ODg2OCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RBcnRpY2xlTGlzdChwYWdlPzogbnVtYmVyLCBzaXplPzogbnVtYmVyKSB7XG4gIHJldHVybiByZXF1ZXN0LnBvc3QoeyB1cmw6ICcvY29sbGVjdC9saXN0JywgZGF0YTogeyBwYWdlTm86IHBhZ2UgfHwgMSwgcGFnZVNpemU6IHNpemUgfHwgMTAgfSB9KVxufVxuLyoqIFx1NjUzNlx1ODVDRlx1NjU4N1x1N0FFMCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RBcnRpY2xlKGFydGljbGVJZDogc3RyaW5nKSB7XG4gIHJldHVybiByZXF1ZXN0LmdldCh7IHVybDogYC9jb2xsZWN0LyR7YXJ0aWNsZUlkfWAgfSlcbn1cbi8qKiBcdTUzRDZcdTZEODhcdTY1MzZcdTg1Q0ZcdTY1ODdcdTdBRTAgKi9cbmV4cG9ydCBmdW5jdGlvbiB1bkNvbGxlY3RBcnRpY2xlKGFydGljbGVJZDogc3RyaW5nKSB7XG4gIHJldHVybiByZXF1ZXN0LmdldCh7IHVybDogYC9jb2xsZWN0L3JlbW92ZS8ke2FydGljbGVJZH1gIH0pXG59XG5cbi8qKiBcdTgzQjdcdTUzRDZcdTc1MjhcdTYyMzdcdThCQTJcdTk2MDVcdTc2ODRcdTY1ODdcdTdBRTBcdTUyMTdcdTg4NjggKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xsb3dBcnRpY2xlTGlzdChwYWdlPzogbnVtYmVyLCBzaXplPzogbnVtYmVyKSB7XG4gIHJldHVybiByZXF1ZXN0LnBvc3QoeyB1cmw6ICcvc3Vic2NyaXB0aW9uL3VwZGF0ZXMvbGlzdCcsIGRhdGE6IHsgcGFnZU5vOiBwYWdlIHx8IDEsIHBhZ2VTaXplOiBzaXplIHx8IDEwIH0gfSlcbn1cblxuLyoqIFx1ODNCN1x1NTNENlx1NzUyOFx1NjIzN1x1NTE3M1x1NkNFOFx1NzY4NFx1NzUyOFx1NjIzN1x1NTIxN1x1ODg2OCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvbGxvd1VzZXJMaXN0KHBhZ2U/OiBudW1iZXIsIHNpemU/OiBudW1iZXIpIHtcbiAgcmV0dXJuIHJlcXVlc3QucG9zdCh7XG4gICAgdXJsOiAnL3N1YnNjcmlwdGlvbi9saXN0JyxcbiAgICBkYXRhOiB7IHBhZ2VObzogcGFnZSB8fCAxLCBwYWdlU2l6ZTogc2l6ZSB8fCAxMCwgc3Vic2NyaWJlVHlwZTogJ2FjY291bnQnIH1cbiAgfSlcbn1cbi8qKiBcdTUxNzNcdTZDRThcdTc1MjhcdTYyMzcgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xsb3dVc2VyKHVzZXJJZDogc3RyaW5nKSB7XG4gIHJldHVybiByZXF1ZXN0LnBvc3QoeyB1cmw6ICcvc3Vic2NyaXB0aW9uL2ZvbGxvdycsIGRhdGE6IHsgaWQ6IHVzZXJJZCwgc3Vic2NyaWJlVHlwZTogJ2FjY291bnQnIH0gfSlcbn1cbi8qKiBcdTUzRDZcdTZEODhcdTUxNzNcdTZDRThcdTc1MjhcdTYyMzcgKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmZvbGxvd1VzZXIodXNlcklkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHJlcXVlc3QucG9zdCh7IHVybDogJy9zdWJzY3JpcHRpb24vdW5mb2xsb3cnLCBkYXRhOiB7IGlkOiB1c2VySWQsIHN1YnNjcmliZVR5cGU6ICdhY2NvdW50JyB9IH0pXG59XG5cbi8qKiBcdTgzQjdcdTUzRDZcdTc1MjhcdTYyMzdcdTdDODlcdTRFMURcdTUyMTdcdTg4NjggKi9cbmV4cG9ydCBmdW5jdGlvbiBmYW5zVXNlckxpc3QocGFnZT86IG51bWJlciwgc2l6ZT86IG51bWJlcikge1xuICByZXR1cm4gcmVxdWVzdC5wb3N0KHsgdXJsOiAnL3N1YnNjcmlwdGlvbi9mb2xsb3dlci9saXN0JywgZGF0YTogeyBwYWdlTm86IHBhZ2UgfHwgMSwgcGFnZVNpemU6IHNpemUgfHwgMTAgfSB9KVxufVxuIiwgIi8qKlxuICogQEF1dGhvcjogU3RlcGhlbkNoZW5cbiAqIEBDcmVhdGUgVGltZTogMjAyNS0wNi0xMCAxNzowMzo0NFxuICogQE1vZGlmaWVkIGJ5OiBTdGVwaGVuQ2hlblxuICogQE1vZGlmaWVkIHRpbWU6IDIwMjUtMDYtMTAgMTc6MDU6MDZcbiAqIEBEZXNjcmlwdGlvbjogXHU2RDg4XHU2MDZGXHU2M0QwXHU3OTNBXG4gKi9cblxuaW1wb3J0IHsgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nXG5cbmNvbnN0IHBsdWdpbk5hbWUgPSByZXF1aXJlKCdALy4uL21hbmlmZXN0Lmpzb24nKS5uYW1lXG5cbmV4cG9ydCBlbnVtIFN0YXR1c1R5cGUge1xuICBEZWZhdWx0LFxuICBJbmZvLFxuICBFcnJvcixcbiAgU3VjY2Vzc1xufVxuXG5pbnRlcmZhY2UgU3RhdHVzQXR0cmlidXRlcyB7XG4gIGNsYXNzOiBzdHJpbmdcbiAgaWNvbjogc3RyaW5nXG59XG5cbmNvbnN0IHN0YXR1c2VzOiB7IFtrZXk6IG51bWJlcl06IFN0YXR1c0F0dHJpYnV0ZXMgfSA9IHtcbiAgW1N0YXR1c1R5cGUuRXJyb3JdOiB7XG4gICAgY2xhc3M6ICdwdWJsaXNoLW5vdGUtc3RhdHVzLWVycm9yJyxcbiAgICBpY29uOiAnXHUyNzRDICdcbiAgfSxcbiAgW1N0YXR1c1R5cGUuSW5mb106IHtcbiAgICBjbGFzczogJ3B1Ymxpc2gtbm90ZS1zdGF0dXMtaW5mbycsXG4gICAgaWNvbjogJydcbiAgfSxcbiAgW1N0YXR1c1R5cGUuU3VjY2Vzc106IHtcbiAgICBjbGFzczogJ3B1Ymxpc2gtbm90ZS1zdGF0dXMtc3VjY2VzcycsXG4gICAgaWNvbjogJ1x1MjcxNCAnXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVzc2FnZSBleHRlbmRzIE5vdGljZSB7XG4gIG1lc3NhZ2VFbDogSFRNTERpdkVsZW1lbnRcbiAgaWNvbjogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IodGV4dDogc3RyaW5nLCB0eXBlOiBTdGF0dXNUeXBlID0gU3RhdHVzVHlwZS5EZWZhdWx0LCBkdXJhdGlvbiA9IDUwMDApIHtcbiAgICBjb25zdCBtZXNzYWdlRG9jID0gbmV3IERvY3VtZW50RnJhZ21lbnQoKVxuXG4gICAgY29uc3QgaWNvbiA9IHN0YXR1c2VzW3R5cGVdPy5pY29uIHx8ICcnXG4gICAgY29uc3QgbWVzc2FnZUVsID0gbWVzc2FnZURvYy5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgdGV4dDogYCR7aWNvbn0ke3BsdWdpbk5hbWV9OiAke3RleHR9YFxuICAgIH0pXG4gICAgc3VwZXIobWVzc2FnZURvYywgZHVyYXRpb24pXG4gICAgaWYgKG1lc3NhZ2VFbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBpZiAoc3RhdHVzZXNbdHlwZV0pIHtcbiAgICAgICAgbWVzc2FnZUVsLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChzdGF0dXNlc1t0eXBlXS5jbGFzcylcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pY29uID0gaWNvblxuICAgIHRoaXMubWVzc2FnZUVsID0gbWVzc2FnZUVsXG4gIH1cblxuICBzZXRTdGF0dXMobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5tZXNzYWdlRWwuaW5uZXJUZXh0ID0gYCR7dGhpcy5pY29ufSR7cGx1Z2luTmFtZX06ICR7bWVzc2FnZX1gXG4gIH1cbn1cbiIsICIvKipcbiAqIEBBdXRob3I6IFN0ZXBoZW5DaGVuXG4gKiBAQ3JlYXRlIFRpbWU6IDIwMjUtMDUtMjIgMTc6NDU6NTFcbiAqIEBNb2RpZmllZCBieTogU3RlcGhlbkNoZW5cbiAqIEBNb2RpZmllZCB0aW1lOiAyMDI1LTA1LTI2IDE3OjAyOjQzXG4gKiBARGVzY3JpcHRpb246IFx1OEJCRVx1N0Y2RVxuICovXG5cbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJ1xuaW1wb3J0IHsgc2VuZExpY2Vuc2UgfSBmcm9tICdAL2FwaS9hY2NvdW50J1xuaW1wb3J0IHsgdXNlQWNjb3VudFN0b3JlIH0gZnJvbSAnQC9zdG9yZSdcbmltcG9ydCBQdWJsaXNoUGx1Z2luIGZyb20gJ0AvbWFpbidcblxuZXhwb3J0IGNsYXNzIFB1Ymxpc2hTZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICBwbHVnaW46IFB1Ymxpc2hQbHVnaW5cbiAgZW1haWxTZXR0aW5nPzogU2V0dGluZ1xuICBsaWNlbnNlU2V0dGluZz86IFNldHRpbmdcblxuICBjb25zdHJ1Y3RvcihwbHVnaW46IFB1Ymxpc2hQbHVnaW4pIHtcbiAgICBzdXBlcihwbHVnaW4uYXBwLCBwbHVnaW4pXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW5cbiAgICB1c2VBY2NvdW50U3RvcmUuc3Vic2NyaWJlKHRoaXMudXBkYXRlTG9naW5TdGF0dXMpXG4gIH1cblxuICB1cGRhdGVMb2dpblN0YXR1cygpIHtcbiAgICBpZiAodGhpcy5wbHVnaW4uYWNjb3VudFN0b3JlLmlzTG9naW4oKSkge1xuICAgICAgdGhpcy51cGRhdGVTZXR0aW5nRGVzYyh0aGlzLmxpY2Vuc2VTZXR0aW5nLCAnTGljZW5zZSBpcyB2YWxpZCcsICdncmVlbicpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlU2V0dGluZ0Rlc2ModGhpcy5saWNlbnNlU2V0dGluZywgJ1lvdXIgbGljZW5zZSBrZXknKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNldHRpbmdEZXNjKHNldHRpbmc/OiBTZXR0aW5nLCBkZXNjPzogc3RyaW5nLCBjb2xvcj86IHN0cmluZykge1xuICAgIHNldHRpbmc/LnNldERlc2MoZGVzYyA/PyAnJykudGhlbigoc2V0dGluZykgPT4ge1xuICAgICAgc2V0dGluZy5kZXNjRWwuc3R5bGUuY29sb3IgPSBjb2xvciA/PyAndmFyKC0tdGV4dC1tdXRlZCknXG4gICAgICByZXR1cm4gc2V0dGluZ1xuICAgIH0pXG4gIH1cblxuICBhc3luYyBoYW5kbGVFbWFpbENoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBhY2NvdW50SW5mbyB9ID0gdGhpcy5wbHVnaW4uYWNjb3VudFN0b3JlXG4gICAgaWYgKGFjY291bnRJbmZvLmVtYWlsID09PSB2YWx1ZSkgcmV0dXJuXG4gICAgdGhpcy5wbHVnaW4uYWNjb3VudFN0b3JlLnNldEFjY291bnQoeyAuLi5hY2NvdW50SW5mbywgZW1haWw6IHZhbHVlLCBsaWNlbnNlOiAnJywgdG9rZW46ICcnIH0pXG5cbiAgICAvLyBcdTZFMDVcdTdBN0EgbGljZW5zZSBcdThGOTNcdTUxNjVcdTY4NDZcbiAgICB0aGlzLmxpY2Vuc2VTZXR0aW5nPy5jb250cm9sRWwucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKS5mb3JFYWNoKChpbnB1dEVsKSA9PiB7XG4gICAgICBpbnB1dEVsLnZhbHVlID0gJydcbiAgICB9KVxuXG4gICAgdGhpcy51cGRhdGVTZXR0aW5nRGVzYyh0aGlzLmVtYWlsU2V0dGluZywgJ1lvdXIgZW1haWwgYWRkcmVzcycpXG4gICAgdGhpcy51cGRhdGVTZXR0aW5nRGVzYyh0aGlzLmxpY2Vuc2VTZXR0aW5nLCAnWW91ciBsaWNlbnNlIGtleScpXG4gIH1cblxuICBhc3luYyBoYW5kbGVMaWNlbnNlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IGFjY291bnRJbmZvIH0gPSB0aGlzLnBsdWdpbi5hY2NvdW50U3RvcmVcbiAgICBpZiAoYWNjb3VudEluZm8ubGljZW5zZSA9PT0gdmFsdWUpIHJldHVyblxuICAgIHRoaXMucGx1Z2luLmFjY291bnRTdG9yZS5zZXRBY2NvdW50KHsgLi4uYWNjb3VudEluZm8sIGxpY2Vuc2U6IHZhbHVlLCB0b2tlbjogJycgfSlcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdEZXNjKHRoaXMubGljZW5zZVNldHRpbmcsICdZb3VyIGxpY2Vuc2Uga2V5JylcbiAgfVxuXG4gIGhhbmRsZUdldExpY2Vuc2UoYnRuOiBCdXR0b25Db21wb25lbnQpIHtcbiAgICBjb25zdCBlbWFpbCA9IHRoaXMucGx1Z2luLmFjY291bnRTdG9yZS5hY2NvdW50SW5mby5lbWFpbD8udHJpbSgpIHx8ICcnXG5cbiAgICAvLyBcdTY4MjFcdTlBOENcdTkwQUVcdTdCQjFcdTU3MzBcdTU3NDBcbiAgICBpZiAoZW1haWwgPT09ICcnKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNldHRpbmdEZXNjKHRoaXMuZW1haWxTZXR0aW5nLCAnUGxlYXNlIGlucHV0IHlvdXIgZW1haWwgYWRkcmVzcycsICdyZWQnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghZW1haWwubWF0Y2goL15bYS16QS1aMC05Xy1dK0BbYS16QS1aMC05Xy1dKyhcXC5bYS16QS1aMC05Xy1dKykrJC8pKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNldHRpbmdEZXNjKHRoaXMuZW1haWxTZXR0aW5nLCAnUGxlYXNlIGlucHV0IGEgdmFsaWQgZW1haWwgYWRkcmVzcycsICdyZWQnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gXHU1M0QxXHU5MDAxXHU5MEFFXHU0RUY2XG4gICAgYnRuLnNldERpc2FibGVkKHRydWUpXG4gICAgYnRuLnNldEJ1dHRvblRleHQoJ1NlbmRpbmcuLi4nKVxuICAgIHRoaXMudXBkYXRlU2V0dGluZ0Rlc2ModGhpcy5lbWFpbFNldHRpbmcsICdTZW5kaW5nIGVtYWlsLi4uJylcbiAgICBzZW5kTGljZW5zZShlbWFpbClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5nRGVzYyh0aGlzLmVtYWlsU2V0dGluZywgJ1BsZWFzZSBnbyBhbmQgY2hlY2sgeW91ciBlbWFpbCcsICdncmVlbicpXG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5nRGVzYyh0aGlzLmVtYWlsU2V0dGluZywgJ1NlbmQgZW1haWwgZmFpbGVkJywgJ3JlZCcpXG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBidG4uc2V0RGlzYWJsZWQoZmFsc2UpXG4gICAgICAgIGJ0bi5zZXRCdXR0b25UZXh0KCdHZXQgTGljZW5zZScpXG4gICAgICB9KVxuICB9XG5cbiAgaGFuZGxlQ2hlY2tMaWNlbnNlKGJ0bjogQnV0dG9uQ29tcG9uZW50KSB7XG4gICAgY29uc3QgbGljZW5zZSA9IHRoaXMucGx1Z2luLmFjY291bnRTdG9yZS5hY2NvdW50SW5mby5saWNlbnNlPy50cmltKCkgfHwgJydcblxuICAgIGlmIChsaWNlbnNlID09PSAnJykge1xuICAgICAgdGhpcy51cGRhdGVTZXR0aW5nRGVzYyh0aGlzLmxpY2Vuc2VTZXR0aW5nLCAnUGxlYXNlIGlucHV0IHlvdXIgbGljZW5zZScsICdyZWQnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gXHU2ODIxXHU5QThDXHU4QkI4XHU1M0VGXHU4QkMxXG4gICAgYnRuLnNldERpc2FibGVkKHRydWUpXG4gICAgYnRuLnNldEJ1dHRvblRleHQoJ0NoZWNraW5nLi4uJylcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdEZXNjKHRoaXMubGljZW5zZVNldHRpbmcsICdDaGVja2luZyBsaWNlbnNlLi4uJylcbiAgICB0aGlzLnBsdWdpbi5hY2NvdW50U3RvcmVcbiAgICAgIC5sb2dpbkFjY291bnQoKVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5nRGVzYyh0aGlzLmxpY2Vuc2VTZXR0aW5nLCAnTGljZW5zZSBpcyB2YWxpZCcsICdncmVlbicpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5nRGVzYyh0aGlzLmxpY2Vuc2VTZXR0aW5nLCAnTGljZW5zZSBpcyBpbnZhbGlkJywgJ3JlZCcpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGJ0bi5zZXREaXNhYmxlZChmYWxzZSlcbiAgICAgICAgYnRuLnNldEJ1dHRvblRleHQoJ0NoZWNrIExpY2Vuc2UnKVxuICAgICAgfSlcbiAgfVxuXG4gIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpc1xuICAgIGNvbnRhaW5lckVsLmVtcHR5KClcblxuICAgIC8vIGVtYWlsXG4gICAgdGhpcy5lbWFpbFNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKCdFbWFpbCcpXG4gICAgICAuc2V0RGVzYygnWW91ciBlbWFpbCBhZGRyZXNzJylcbiAgICAgIC5hZGRCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICBidG5cbiAgICAgICAgICAuc2V0QnV0dG9uVGV4dCgnR2V0IExpY2Vuc2UnKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHRoaXMuaGFuZGxlR2V0TGljZW5zZShidG4pKVxuICAgICAgfSlcbiAgICAgIC5hZGRUZXh0KChpbnB1dEVsKSA9PiB7XG4gICAgICAgIGlucHV0RWxcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoJ2VtYWlsIGFkZHJlc3MnKVxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5hY2NvdW50U3RvcmUuYWNjb3VudEluZm8uZW1haWwgPz8gJycpXG4gICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4gdGhpcy5oYW5kbGVFbWFpbENoYW5nZSh2YWx1ZSkpXG4gICAgICB9KVxuXG4gICAgLy8gbGljZW5zZVxuICAgIHRoaXMubGljZW5zZVNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKCdMaWNlbnNlJylcbiAgICAgIC5zZXREZXNjKCdZb3VyIGxpY2Vuc2Uga2V5JylcbiAgICAgIC5hZGRCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICBidG5cbiAgICAgICAgICAuc2V0QnV0dG9uVGV4dCgnQ2hlY2sgTGljZW5zZScpXG4gICAgICAgICAgLnNldEN0YSgpXG4gICAgICAgICAgLm9uQ2xpY2soKCkgPT4gdGhpcy5oYW5kbGVDaGVja0xpY2Vuc2UoYnRuKSlcbiAgICAgIH0pXG4gICAgICAuYWRkVGV4dCgoaW5wdXRFbCkgPT4ge1xuICAgICAgICBpbnB1dEVsXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKCdsaWNlbnNlIGtleScpXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmFjY291bnRTdG9yZS5hY2NvdW50SW5mby5saWNlbnNlID8/ICcnKVxuICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHRoaXMuaGFuZGxlTGljZW5zZUNoYW5nZSh2YWx1ZSkpXG4gICAgICB9KVxuXG4gICAgLy8gXHU1NDBDXHU2QjY1XHU3MkI2XHU2MDAxXG4gICAgdGhpcy51cGRhdGVMb2dpblN0YXR1cygpXG4gIH1cbn1cbiIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCdcbmltcG9ydCB7IEJhc2VJdGVtVmlldyB9IGZyb20gJ0AvY29tcG9uZW50cy9iYXNlSXRlbVZpZXcnXG5pbXBvcnQgUHJvZmlsZVZpZXcgZnJvbSAnLi9jb21wb25lbnRzL3Byb2ZpbGVfdmlldydcblxuZXhwb3J0IGNvbnN0IFZJRVdfUFJPRklMRSA9ICdPUFAgUHJvZmlsZSBWaWV3J1xuZXhwb3J0IGNsYXNzIE9wcFByb2ZpbGVWaWV3IGV4dGVuZHMgQmFzZUl0ZW1WaWV3IHtcbiAgcmVhY3RDb21wb25lbnQ6IFJlYWN0LlJlYWN0RWxlbWVudFxuXG4gIGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFZJRVdfUFJPRklMRVxuICB9XG5cbiAgZ2V0RGlzcGxheVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ09QUCBQcm9maWxlIFZpZXcnXG4gIH1cblxuICBhc3luYyBvbk9wZW4oKSB7XG4gICAgdGhpcy5yZWFjdENvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUHJvZmlsZVZpZXcsIHRoaXMuYXBwKVxuICAgIHRoaXMuY29udGVudEVsLmNsYXNzTGlzdC5hZGQoJ3B1Ymxpc2gtcGx1Z2luJylcbiAgICBjb25zdCByb290ID0gY3JlYXRlUm9vdCh0aGlzLmNvbnRlbnRFbClcbiAgICByb290LnJlbmRlcih0aGlzLnJlYWN0Q29tcG9uZW50KVxuICB9XG59XG4iLCAiaW1wb3J0IFB1Ymxpc2hQbHVnaW4gZnJvbSAnQC9tYWluJ1xuaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tICdvYnNpZGlhbidcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VJdGVtVmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcbiAgcGx1Z2luOiBQdWJsaXNoUGx1Z2luXG5cbiAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZikge1xuICAgIHN1cGVyKGxlYWYpXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5wbHVnaW4gPSB0aGlzLmFwcC5wbHVnaW5zLnBsdWdpbnNbJ3B1Ymxpc2gnXVxuICB9XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbidcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IElQdWJsaXNoQWNjb3VudCwgdXNlQWNjb3VudFN0b3JlIH0gZnJvbSAnQC9zdG9yZSdcbmltcG9ydCB7IGdldEFjY291bnRJbmZvIH0gZnJvbSAnQC9hcGkvYWNjb3VudCdcbmltcG9ydCB7XG4gIGZvbGxvd0FydGljbGVMaXN0LFxuICBmb2xsb3dVc2VyTGlzdCxcbiAgY29sbGVjdEFydGljbGVMaXN0LFxuICBnZXRBcnRpY2xlTGlzdCxcbiAgdW5Db2xsZWN0QXJ0aWNsZSxcbiAgdW5mb2xsb3dVc2VyLFxuICB1blB1Ymxpc2hBcnRpY2xlXG59IGZyb20gJ0AvYXBpL2FydGljbGUnXG5pbXBvcnQgeyBMYXlvdXQsIFRhYnMsIFRhYlBhbmUsIEF2YXRhciwgRW1wdHksIENhcmQsIFR5cG9ncmFwaHksIFNwYWNlIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktdWknXG5pbXBvcnQgeyBJbGx1c3RyYXRpb25Ob0FjY2VzcywgSWxsdXN0cmF0aW9uTm9BY2Nlc3NEYXJrIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktaWxsdXN0cmF0aW9ucydcbmltcG9ydCBMaXN0LCB7IElMaXN0TG9hZERhdGEsIElMaXN0UmVmIH0gZnJvbSAnQC92aWV3cy9jb21wb25lbnRzL2xpc3RfdmlldydcbmltcG9ydCB7XG4gIGZvbGxvd2luZ0l0ZW0sXG4gIGNvbGxlY3Rpb25JdGVtLFxuICBmb2xsb3dlcnNJdGVtLFxuICBwdWJsaXNoSXRlbSxcbiAgSUFydGljbGUsXG4gIElGb2xsb3dlclxufSBmcm9tICdAL3ZpZXdzL2NvbXBvbmVudHMvYXJ0aWNsZV9pdGVtJ1xuaW1wb3J0IHsgVklFV19BUlRJQ0xFX0RFVEFJTCB9IGZyb20gJ0Avdmlld3MvYXJ0aWNsZV9kZXRhaWwnXG5cbmludGVyZmFjZSBJQWNjb3VudEluZm8ge1xuICBhY2NvdW50OiBJUHVibGlzaEFjY291bnRcbiAgc3Vic2NyaXB0aW9uSW5mbzogSVN1YnNjcmlwdGlvbkluZm9cbn1cblxuaW50ZXJmYWNlIElTdWJzY3JpcHRpb25JbmZvIHtcbiAgY250QXV0aG9yU3Vic2NyaXB0aW9ucz86IG51bWJlclxuICBjbnRGZWxsb3dzPzogbnVtYmVyXG4gIHJlY2VpdmVkTGlrZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGFwcDogQXBwKSA9PiB7XG4gIC8vIFRPRE86IFx1NzZGNFx1NjNBNVx1NEYyMFx1NTE2NSBwbHVnaW4gXHU0RjFBXHU1QkZDXHU4MUY0XHU5MEU4XHU1MjA2XHU1QzVFXHU2MDI3XHU0RTIyXHU1OTMxXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgcGx1Z2luID0gYXBwLnBsdWdpbnMucGx1Z2luc1sncHVibGlzaCddXG5cbiAgY29uc3QgeyBIZWFkZXIsIENvbnRlbnQgfSA9IExheW91dFxuICBjb25zdCB7IE1ldGEgfSA9IENhcmRcbiAgY29uc3QgeyBUaXRsZSwgVGV4dCB9ID0gVHlwb2dyYXBoeVxuXG4gIHVzZUFjY291bnRTdG9yZS5zdWJzY3JpYmUoKCkgPT4gdXBkYXRlTG9naW5TdGF0dXMoKSlcbiAgY29uc3QgW2lzTG9naW4sIHNldElzTG9naW5dID0gdXNlU3RhdGUodXNlQWNjb3VudFN0b3JlLmdldFN0YXRlKCkuaXNMb2dpbigpKVxuICBjb25zdCBbYWNjb3VudEluZm8sIHNldEFjY291bnRJbmZvXSA9IHVzZVN0YXRlPElBY2NvdW50SW5mbz4oe1xuICAgIGFjY291bnQ6IHsgLi4udXNlQWNjb3VudFN0b3JlLmdldFN0YXRlKCkuYWNjb3VudEluZm8gfSxcbiAgICBzdWJzY3JpcHRpb25JbmZvOiB7fVxuICB9KVxuICBjb25zdCBbYXZhdGFyTW90aW9uLCBzZXRBdmF0YXJNb3Rpb25dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGFjY291bnRTdGF0cyA9IFtcbiAgICB7IGtleTogJ3JlY2VpdmVkTGlrZXMnLCBsYWJlbDogJ1x1ODNCN1x1OEQ1RScgfSxcbiAgICB7IGtleTogJ2NudEF1dGhvclN1YnNjcmlwdGlvbnMnLCBsYWJlbDogJ1x1NTE3M1x1NkNFOCcgfSxcbiAgICB7IGtleTogJ2NudEZlbGxvd3MnLCBsYWJlbDogJ1x1N0M4OVx1NEUxRCcgfVxuICBdXG5cbiAgY29uc3QgdGFicyA9IFtcbiAgICB7XG4gICAgICBrZXk6ICdmb2xsb3dpbmcnLFxuICAgICAgdGFiOiAnXHU4QkEyXHU5NjA1JyxcbiAgICAgIHJlZjogdXNlUmVmPElMaXN0UmVmPihudWxsKSxcbiAgICAgIGxvYWREYXRhOiBmb2xsb3dBcnRpY2xlTGlzdCxcbiAgICAgIHJlbmRlckl0ZW06IGZvbGxvd2luZ0l0ZW1cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2NvbGxlY3Rpb24nLFxuICAgICAgdGFiOiAnXHU2NTM2XHU4NUNGJyxcbiAgICAgIHJlZjogdXNlUmVmPElMaXN0UmVmPihudWxsKSxcbiAgICAgIGxvYWREYXRhOiBjb2xsZWN0QXJ0aWNsZUxpc3QsXG4gICAgICByZW5kZXJJdGVtOiBjb2xsZWN0aW9uSXRlbVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZm9sbG93ZXJzJyxcbiAgICAgIHRhYjogJ1x1NTE3M1x1NkNFOCcsXG4gICAgICByZWY6IHVzZVJlZjxJTGlzdFJlZj4obnVsbCksXG4gICAgICBsb2FkRGF0YTogZm9sbG93VXNlckxpc3QsXG4gICAgICByZW5kZXJJdGVtOiBmb2xsb3dlcnNJdGVtXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdwdWJsaXNoJyxcbiAgICAgIHRhYjogJ1x1NTNEMVx1NUUwMycsXG4gICAgICByZWY6IHVzZVJlZjxJTGlzdFJlZj4obnVsbCksXG4gICAgICBsb2FkRGF0YTogZ2V0QXJ0aWNsZUxpc3QsXG4gICAgICByZW5kZXJJdGVtOiBwdWJsaXNoSXRlbVxuICAgIH1cbiAgXVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZEFjY291bnRJbmZvKClcbiAgfSwgW2lzTG9naW5dKVxuXG4gIGNvbnN0IHVwZGF0ZUxvZ2luU3RhdHVzID0gKCkgPT4ge1xuICAgIHNldElzTG9naW4odXNlQWNjb3VudFN0b3JlLmdldFN0YXRlKCkuaXNMb2dpbigpKVxuICB9XG5cbiAgY29uc3QgbG9hZEFjY291bnRJbmZvID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaXNMb2dpbikgcmV0dXJuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZGF0YSA9IHt9IH0gPSBhd2FpdCBnZXRBY2NvdW50SW5mbygpXG4gICAgICBzZXRBY2NvdW50SW5mbyhkYXRhLnJlc3VsdClcbiAgICB9IGNhdGNoIChlcnJvcikge31cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVRhYkNoYW5nZSA9IChhY3RpdmVLZXk6IHN0cmluZykgPT4ge1xuICAgIGN1cnJlbnRMaXN0UmVmKGFjdGl2ZUtleSk/LnJlZnJlc2hEYXRhKClcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRMaXN0UmVmID0gKGFjdGl2ZUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY3VycmVudFRhYiA9IHRhYnMuZmluZCgodGFiKSA9PiB0YWIua2V5ID09PSBhY3RpdmVLZXkpXG4gICAgcmV0dXJuIGN1cnJlbnRUYWI/LnJlZi5jdXJyZW50XG4gIH1cblxuICBjb25zdCBoYW5kbGVJdGVtQ2xpY2sgPSAodHlwZTogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFpZD8ubGVuZ3RoKSByZXR1cm5cbiAgICBpZiAodHlwZSA9PT0gJ2ZvbGxvd2VycycpIHtcbiAgICAgIC8vIFRPRE86IFx1NjI1M1x1NUYwMFx1NEY1Q1x1ODAwNVx1NjU4N1x1N0FFMFx1NTIxN1x1ODg2OFxuICAgIH0gZWxzZSB7XG4gICAgICBwbHVnaW4uYWN0aXZhdGVWaWV3KFZJRVdfQVJUSUNMRV9ERVRBSUwsICdjZW50ZXInKVxuICAgICAgcGx1Z2luLmFydGljbGVEZXRhaWxWaWV3Py5zZXRBcnRpY2xlSWQoaWQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlSXRlbUFjdGlvbiA9IGFzeW5jICh0eXBlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBpdGVtOiBJQXJ0aWNsZSB8IElGb2xsb3dlcikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICBjYXNlICdjb3B5TGluayc6IC8vIFx1NTkwRFx1NTIzNlx1OTRGRVx1NjNBNVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbGluayA9ICcnIH0gPSBpdGVtIGFzIElBcnRpY2xlXG4gICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChsaW5rKVxuICAgICAgICAgICAgbmV3IE5vdGljZSgnXHU5NEZFXHU2M0E1XHU1REYyXHU1OTBEXHU1MjM2XHU1MjMwXHU1MjZBXHU4RDM0XHU2NzdGJyArIGxpbmspXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2NhbmNlbFB1Ymxpc2gnOiAvLyBcdTUzRDZcdTZEODhcdTUzRDFcdTVFMDNcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB7IGlkID0gJycgfSA9IGl0ZW0gYXMgSUFydGljbGVcbiAgICAgICAgICAgIGF3YWl0IHVuUHVibGlzaEFydGljbGUoaWQpXG4gICAgICAgICAgICBjdXJyZW50TGlzdFJlZih0eXBlKT8ucmVtb3ZlRGF0YUJ5SWQoaWQpXG4gICAgICAgICAgICBuZXcgTm90aWNlKCdcdTUzRDFcdTVFMDNcdTVERjJcdTUzRDZcdTZEODgnKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdjYW5jZWxDb2xsZWN0aW9uJzogLy8gXHU1M0Q2XHU2RDg4XHU2NTM2XHU4NUNGXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeyBpZCA9ICcnIH0gPSBpdGVtIGFzIElBcnRpY2xlXG4gICAgICAgICAgICBhd2FpdCB1bkNvbGxlY3RBcnRpY2xlKGlkKVxuICAgICAgICAgICAgY3VycmVudExpc3RSZWYodHlwZSk/LnJlbW92ZURhdGFCeUlkKGlkKVxuICAgICAgICAgICAgbmV3IE5vdGljZSgnXHU2NTM2XHU4NUNGXHU1REYyXHU1M0Q2XHU2RDg4JylcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY2FuY2VsRm9sbG93JzogLy8gXHU1M0Q2XHU2RDg4XHU1MTczXHU2Q0U4XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeyBhdXRob3JJZCA9ICcnIH0gPSBpdGVtIGFzIElGb2xsb3dlclxuICAgICAgICAgICAgYXdhaXQgdW5mb2xsb3dVc2VyKGF1dGhvcklkKVxuICAgICAgICAgICAgY3VycmVudExpc3RSZWYodHlwZSk/LnJlbW92ZURhdGFCeUlkKGF1dGhvcklkLCAnYXV0aG9ySWQnKVxuICAgICAgICAgICAgbmV3IE5vdGljZSgnXHU1MTczXHU2Q0U4XHU1REYyXHU1M0Q2XHU2RDg4JylcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdcdTY0Q0RcdTRGNUNcdTU5MzFcdThEMjU6JywgZXJyb3IpXG4gICAgICBuZXcgTm90aWNlKCdcdTY0Q0RcdTRGNUNcdTU5MzFcdThEMjUnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtpc0xvZ2luID8gKFxuICAgICAgICA8TGF5b3V0PlxuICAgICAgICAgIDxIZWFkZXI+XG4gICAgICAgICAgICB7LyogXHU3NTI4XHU2MjM3XHU0RkUxXHU2MDZGICovfVxuICAgICAgICAgICAgPENhcmQgYm9keVN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2ZsZXgtc3RhcnQnLCBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWJldHdlZW4nIH19PlxuICAgICAgICAgICAgICA8TWV0YVxuICAgICAgICAgICAgICAgIGF2YXRhcj17XG4gICAgICAgICAgICAgICAgICA8QXZhdGFyXG4gICAgICAgICAgICAgICAgICAgIHNpemU9J2xhcmdlJ1xuICAgICAgICAgICAgICAgICAgICBzcmM9e1xuICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRJbmZvLmFjY291bnQuYXZhdGFyPy5sZW5ndGggPyBhY2NvdW50SW5mby5hY2NvdW50LmF2YXRhciA6ICdodHRwczovL2pvZXNjaC5tb2UvYXBpL3YxL2pvc2gnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWx0PXthY2NvdW50SW5mby5hY2NvdW50Lm5pY2tuYW1lID8/ICcnfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBtYXJnaW46IDQgfX1cbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyPXt7IGNvbG9yOiAndmFyKC0tY29sb3ItYWNjZW50KScsIG1vdGlvbjogYXZhdGFyTW90aW9uIH19XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRNb3Rpb249e2F2YXRhck1vdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiBzZXRBdmF0YXJNb3Rpb24odHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KCkgPT4gc2V0QXZhdGFyTW90aW9uKGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgICAgICAgIDxUaXRsZSBoZWFkaW5nPXszfT5cbiAgICAgICAgICAgICAgICAgICAge2FjY291bnRJbmZvLmFjY291bnQubmlja25hbWU/Lmxlbmd0aCA/IGFjY291bnRJbmZvLmFjY291bnQubmlja25hbWUgOiAnSGVsbG8sIG5pY2UgdG8gbWVldCB5b3UhJ31cbiAgICAgICAgICAgICAgICAgIDwvVGl0bGU+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtcbiAgICAgICAgICAgICAgICAgIDxTcGFjZSBzcGFjaW5nPXszMH0gc3R5bGU9e3sgbWFyZ2luVG9wOiAnOHB4JyB9fT5cbiAgICAgICAgICAgICAgICAgICAge2FjY291bnRTdGF0cy5tYXAoKHN0YXQpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nYWNjb3VudC1zdGF0JyBrZXk9e3N0YXQua2V5fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUaXRsZSBoZWFkaW5nPXs2fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2FjY291bnRJbmZvLnN1YnNjcmlwdGlvbkluZm9bc3RhdC5rZXkgYXMga2V5b2YgSVN1YnNjcmlwdGlvbkluZm9dID8/IDB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQ+e3N0YXQubGFiZWx9PC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvU3BhY2U+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8VGV4dCBsaW5rPkVkaXQ8L1RleHQ+XG4gICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgPC9IZWFkZXI+XG5cbiAgICAgICAgICA8Q29udGVudCBzdHlsZT17eyBwYWRkaW5nOiAnMCA4cHgnIH19PlxuICAgICAgICAgICAgey8qIFx1N0M3Qlx1NTIyQiAqL31cbiAgICAgICAgICAgIDxUYWJzIGRlZmF1bHRBY3RpdmVLZXk9J2ZvbGxvd2luZycgb25DaGFuZ2U9e2hhbmRsZVRhYkNoYW5nZX0+XG4gICAgICAgICAgICAgIHt0YWJzLm1hcCgodGFiKSA9PiAoXG4gICAgICAgICAgICAgICAgPFRhYlBhbmUgdGFiPXt0YWIudGFifSBpdGVtS2V5PXt0YWIua2V5fSBrZXk9e3RhYi5rZXl9PlxuICAgICAgICAgICAgICAgICAgPExpc3RcbiAgICAgICAgICAgICAgICAgICAgcmVmPXt0YWIucmVmfVxuICAgICAgICAgICAgICAgICAgICBsb2FkRGF0YT17dGFiLmxvYWREYXRhIGFzIHVua25vd24gYXMgSUxpc3RMb2FkRGF0YX1cbiAgICAgICAgICAgICAgICAgICAgcmVuZGVySXRlbT17KGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgdGFiLnJlbmRlckl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gaGFuZGxlSXRlbUNsaWNrKHRhYi5rZXksIGl0ZW0uaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gaGFuZGxlSXRlbUFjdGlvbih0YWIua2V5LCBhY3Rpb24sIGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtcHR5RGVzY3JpcHRpb249e2BcdTY2ODJcdTY1RTAke3RhYi50YWJ9XHU1MTg1XHU1QkI5YH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9UYWJQYW5lPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvVGFicz5cbiAgICAgICAgICA8L0NvbnRlbnQ+XG4gICAgICAgIDwvTGF5b3V0PlxuICAgICAgKSA6IChcbiAgICAgICAgPEVtcHR5XG4gICAgICAgICAgc3R5bGU9e3sgbWFyZ2luVG9wOiAxMjAgfX1cbiAgICAgICAgICBpbWFnZT17PElsbHVzdHJhdGlvbk5vQWNjZXNzIHN0eWxlPXt7IHdpZHRoOiAxNTAsIGhlaWdodDogMTUwIH19IC8+fVxuICAgICAgICAgIGRhcmtNb2RlSW1hZ2U9ezxJbGx1c3RyYXRpb25Ob0FjY2Vzc0Rhcmsgc3R5bGU9e3sgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAgfX0gLz59XG4gICAgICAgICAgZGVzY3JpcHRpb249eydcdThCRjdcdTYyNTNcdTVGMDBPYnNpZGlhblx1OTE0RFx1N0Y2RVx1RkYwQ1x1NkRGQlx1NTE5OVx1NUUxMFx1NjIzN1x1NEZFMVx1NjA2Rid9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG4iLCAiaW1wb3J0IF9ub29wIGZyb20gXCJsb2Rhc2gvbm9vcFwiO1xuLyoqXG4gKiBUaGUgU2VtaSBGb3VuZGF0aW9uIC8gQWRhcHRlciBhcmNoaXRlY3R1cmUgc3BsaXQgd2FzIGluc3BpcmVkIGJ5IE1hdGVyaWFsIENvbXBvbmVudCBGb3IgV2ViLiBcdUZGMDhodHRwczovL2dpdGh1Yi5jb20vbWF0ZXJpYWwtY29tcG9uZW50cy9tYXRlcmlhbC1jb21wb25lbnRzLXdlYlx1RkYwOVxuICogV2UgcmUtaW1wbGVtZW50ZWQgb3VyIG93biBjb2RlIGJhc2VkIG9uIHRoZSBwcmluY2lwbGUgYW5kIGFkZGVkIG1vcmUgZnVuY3Rpb25zIHdlIG5lZWQgYWNjb3JkaW5nIHRvIGFjdHVhbCBuZWVkcy5cbiAqXG4gKi9cbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmNsYXNzIEJhc2VGb3VuZGF0aW9uIHtcbiAgLyoqIEByZXR1cm4gZW51bXtjc3MgY2xhc3NOYW1lfSAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBzdGF0aWMgZ2V0IGNzc0NsYXNzZXMoKSB7XG4gICAgLy8gQ2xhc3NlcyBleHRlbmRpbmcgRm91bmRhdGlvbiBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbiBvYmplY3Qgd2hpY2ggZXhwb3J0cyBldmVyeVxuICAgIC8vIENTUyBjbGFzcyB0aGUgZm91bmRhdGlvbiBjbGFzcyBuZWVkcyBhcyBhIHByb3BlcnR5LiBlLmcuIHtBQ1RJVkU6ICdjb21wb25lbnQtLWFjdGl2ZSd9XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIC8qKiBAcmV0dXJuIGVudW17c3RyaW5nc30gKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgc3RhdGljIGdldCBzdHJpbmdzKCkge1xuICAgIC8vIENsYXNzZXMgZXh0ZW5kaW5nIEZvdW5kYXRpb24gc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gb2JqZWN0IHdoaWNoIGV4cG9ydHMgYWxsXG4gICAgLy8gc2VtYW50aWMgc3RyaW5ncyBhcyBjb25zdGFudHMuIGUuZy4ge0FSSUFfUk9MRTogJ3RhYmxpc3QnfVxuICAgIHJldHVybiB7fTtcbiAgfVxuICAvKiogQHJldHVybiBlbnVte251bWJlcnN9ICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHN0YXRpYyBnZXQgbnVtYmVycygpIHtcbiAgICAvLyBDbGFzc2VzIGV4dGVuZGluZyBGb3VuZGF0aW9uIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGFuIG9iamVjdCB3aGljaCBleHBvcnRzIGFsbFxuICAgIC8vIG9mIGl0cyBzZW1hbnRpYyBudW1iZXJzIGFzIGNvbnN0YW50cy4gZS5nLiB7QU5JTUFUSU9OX0RFTEFZX01TOiAzNTB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdEFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFByb3A6IF9ub29wLFxuICAgICAgZ2V0UHJvcHM6IF9ub29wLFxuICAgICAgZ2V0U3RhdGU6IF9ub29wLFxuICAgICAgZ2V0U3RhdGVzOiBfbm9vcCxcbiAgICAgIHNldFN0YXRlOiBfbm9vcCxcbiAgICAgIGdldENvbnRleHQ6IF9ub29wLFxuICAgICAgZ2V0Q29udGV4dHM6IF9ub29wLFxuICAgICAgZ2V0Q2FjaGU6IF9ub29wLFxuICAgICAgc2V0Q2FjaGU6IF9ub29wLFxuICAgICAgZ2V0Q2FjaGVzOiBfbm9vcCxcbiAgICAgIHN0b3BQcm9wYWdhdGlvbjogX25vb3AsXG4gICAgICBwZXJzaXN0RXZlbnQ6IF9ub29wXG4gICAgfTtcbiAgfVxuICBjb25zdHJ1Y3RvcihhZGFwdGVyKSB7XG4gICAgdGhpcy5fYWRhcHRlciA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgQmFzZUZvdW5kYXRpb24uZGVmYXVsdEFkYXB0ZXIpLCBhZGFwdGVyKTtcbiAgfVxuICBnZXRQcm9wKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmdldFByb3Aoa2V5KTtcbiAgfVxuICBnZXRQcm9wcygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRQcm9wcygpO1xuICB9XG4gIGdldFN0YXRlKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmdldFN0YXRlKGtleSk7XG4gIH1cbiAgZ2V0U3RhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmdldFN0YXRlcygpO1xuICB9XG4gIHNldFN0YXRlKHN0YXRlcywgY2IpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5zZXRTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBzdGF0ZXMpLCBjYik7XG4gIH1cbiAgZ2V0Q29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRDb250ZXh0KGtleSk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0Q29udGV4dHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0Q29udGV4dHMoKTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBnZXRDYWNoZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0Q2FjaGVzKCk7XG4gIH1cbiAgZ2V0Q2FjaGUoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0Q2FjaGUoa2V5KTtcbiAgfVxuICBzZXRDYWNoZShrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIGtleSAmJiB0aGlzLl9hZGFwdGVyLnNldENhY2hlKGtleSwgdmFsdWUpO1xuICB9XG4gIHN0b3BQcm9wYWdhdGlvbihlKSB7XG4gICAgdGhpcy5fYWRhcHRlci5zdG9wUHJvcGFnYXRpb24oZSk7XG4gIH1cbiAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb250cm9sbGVkIGNvbXBvbmVudFxuICBfaXNDb250cm9sbGVkQ29tcG9uZW50KCkge1xuICAgIGxldCBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICd2YWx1ZSc7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKCk7XG4gICAgY29uc3QgaXNDb250cm9sQ29tcG9uZW50ID0ga2V5IGluIHByb3BzO1xuICAgIHJldHVybiBpc0NvbnRyb2xDb21wb25lbnQ7XG4gIH1cbiAgLy8gRG9lcyB0aGUgdXNlciBoYXZlIGluY29taW5nIHByb3BzLCBlZzogX2lzSW5Qcm9wcyAodmFsdWUpXG4gIF9pc0luUHJvcHMoa2V5KSB7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKCk7XG4gICAgcmV0dXJuIGtleSBpbiBwcm9wcztcbiAgfVxuICBpbml0KGxpZmVjeWNsZSkge1xuICAgIC8vIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKHJlZ2lzdGVyaW5nIGV2ZW50cywgZXRjLilcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIC8vIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gZGUtaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKGRlLXJlZ2lzdGVyaW5nIGV2ZW50cywgZXRjLilcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBsb2codGV4dCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHJlc3RbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBsb2codGV4dCwgLi4ucmVzdCk7XG4gIH1cbiAgX3BlcnNpc3RFdmVudChlKSB7XG4gICAgLy8gb25seSB3b3JrIGZvciByZWFjdCBhZGFwdGVyIGZvciBub3dcbiAgICB0aGlzLl9hZGFwdGVyLnBlcnNpc3RFdmVudChlKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgQmFzZUZvdW5kYXRpb247IiwgImltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5jb25zdCBsb2cgPSBmdW5jdGlvbiAodGV4dCkge1xuICBpZiAoX2dldChwcm9jZXNzLCAnZW52Lk5PREVfRU5WJykgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICByZXN0W19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgY29uc29sZS5sb2codGV4dCwgLi4ucmVzdCk7XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBsb2c7IiwgIi8qKlxuICogVGhlIFNlbWkgRm91bmRhdGlvbiAvIEFkYXB0ZXIgYXJjaGl0ZWN0dXJlIHNwbGl0IHdhcyBpbnNwaXJlZCBieSBNYXRlcmlhbCBDb21wb25lbnQgRm9yIFdlYi4gXHVGRjA4aHR0cHM6Ly9naXRodWIuY29tL21hdGVyaWFsLWNvbXBvbmVudHMvbWF0ZXJpYWwtY29tcG9uZW50cy13ZWJcdUZGMDlcbiAqIFdlIHJlLWltcGxlbWVudGVkIG91ciBvd24gY29kZSBiYXNlZCBvbiB0aGUgcHJpbmNpcGxlIGFuZCBhZGRlZCBtb3JlIGZ1bmN0aW9ucyB3ZSBuZWVkIGFjY29yZGluZyB0byBhY3R1YWwgbmVlZHMuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBsb2cgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvbG9nJztcbmltcG9ydCBnZXREYXRhQXR0ciBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy9nZXREYXRhQXR0cic7XG5jb25zdCB7XG4gIGhhc093blByb3BlcnR5XG59ID0gT2JqZWN0LnByb3RvdHlwZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHRoaXMuaXNDb250cm9sbGVkID0ga2V5ID0+IEJvb2xlYW4oa2V5ICYmIHRoaXMucHJvcHMgJiYgdHlwZW9mIHRoaXMucHJvcHMgPT09ICdvYmplY3QnICYmIGhhc093blByb3BlcnR5LmNhbGwodGhpcy5wcm9wcywga2V5KSk7XG4gICAgdGhpcy5zZXRTdGF0ZUFzeW5jID0gc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHN0YXRlLCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5jYWNoZSA9IHt9O1xuICAgIHRoaXMuZm91bmRhdGlvbiA9IG51bGw7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5mb3VuZGF0aW9uICYmIHR5cGVvZiB0aGlzLmZvdW5kYXRpb24uaW5pdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLmZvdW5kYXRpb24uaW5pdCgpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZm91bmRhdGlvbiAmJiB0eXBlb2YgdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKTtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gIH1cbiAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldENvbnRleHQ6IGtleSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQgJiYga2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dFtrZXldO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGV4dHM6ICgpID0+IHRoaXMuY29udGV4dCxcbiAgICAgIGdldFByb3A6IGtleSA9PiB0aGlzLnByb3BzW2tleV0sXG4gICAgICAvLyByZXR1cm4gYWxsIHByb3BzXG4gICAgICBnZXRQcm9wczogKCkgPT4gdGhpcy5wcm9wcyxcbiAgICAgIGdldFN0YXRlOiBrZXkgPT4gdGhpcy5zdGF0ZVtrZXldLFxuICAgICAgZ2V0U3RhdGVzOiAoKSA9PiB0aGlzLnN0YXRlLFxuICAgICAgc2V0U3RhdGU6IChzdGF0ZXMsIGNiKSA9PiB0aGlzLnNldFN0YXRlKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlcyksIGNiKSxcbiAgICAgIGdldENhY2hlOiBrZXkgPT4ga2V5ICYmIHRoaXMuY2FjaGVba2V5XSxcbiAgICAgIGdldENhY2hlczogKCkgPT4gdGhpcy5jYWNoZSxcbiAgICAgIHNldENhY2hlOiAoa2V5LCB2YWx1ZSkgPT4ga2V5ICYmICh0aGlzLmNhY2hlW2tleV0gPSB2YWx1ZSksXG4gICAgICBzdG9wUHJvcGFnYXRpb246IGUgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5uYXRpdmVFdmVudCAmJiBlLm5hdGl2ZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgIH0sXG4gICAgICBwZXJzaXN0RXZlbnQ6IGUgPT4ge1xuICAgICAgICBlICYmIGUucGVyc2lzdCAmJiB0eXBlb2YgZS5wZXJzaXN0ID09PSAnZnVuY3Rpb24nID8gZS5wZXJzaXN0KCkgOiBudWxsO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgbG9nKHRleHQpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICByZXN0W19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZyh0ZXh0LCAuLi5yZXN0KTtcbiAgfVxuICBnZXREYXRhQXR0cigpIHtcbiAgICBsZXQgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIGdldERhdGFBdHRyKHByb3BzKTtcbiAgfVxufVxuQmFzZUNvbXBvbmVudC5wcm9wVHlwZXMgPSB7fTtcbkJhc2VDb21wb25lbnQuZGVmYXVsdFByb3BzID0ge307IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERhdGFBdHRyKHByb3BzKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykucmVkdWNlKChwcmV2LCBrZXkpID0+IHtcbiAgICBpZiAoa2V5LnN1YnN0cigwLCA1KSA9PT0gJ2RhdGEtJykge1xuICAgICAgcHJldltrZXldID0gcHJvcHNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXY7XG4gIH0sIHt9KTtcbn0iLCAiZXhwb3J0IGNvbnN0IEJBU0VfQ0xBU1NfUFJFRklYID0gJ3NlbWknOyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNzc0NsYXNzZXMgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy90eXBvZ3JhcGh5L2NvbnN0YW50cyc7XG5pbXBvcnQgJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3R5cG9ncmFwaHkvdHlwb2dyYXBoeS5jc3MnO1xuY29uc3QgcHJlZml4Q2xzID0gY3NzQ2xhc3Nlcy5QUkVGSVg7XG5jbGFzcyBUeXBvZ3JhcGh5IGV4dGVuZHMgUHVyZUNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgZm9yd2FyZFJlZlxuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wiY29tcG9uZW50XCIsIFwiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJmb3J3YXJkUmVmXCJdKTtcbiAgICBjb25zdCBDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNscyhwcmVmaXhDbHMsIGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMsXG4gICAgICByZWY6IGZvcndhcmRSZWZcbiAgICB9LCByZXN0KSwgY2hpbGRyZW4pO1xuICB9XG59XG5UeXBvZ3JhcGh5LmRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50OiAnYXJ0aWNsZScsXG4gIHN0eWxlOiB7fSxcbiAgY2xhc3NOYW1lOiAnJ1xufTtcblR5cG9ncmFwaHkucHJvcFR5cGVzID0ge1xuICBjb21wb25lbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5leHBvcnQgZGVmYXVsdCBUeXBvZ3JhcGh5OyIsICJpbXBvcnQgeyBCQVNFX0NMQVNTX1BSRUZJWCB9IGZyb20gJy4uL2Jhc2UvY29uc3RhbnRzJztcbmNvbnN0IGNzc0NsYXNzZXMgPSB7XG4gIFBSRUZJWDogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXR5cG9ncmFwaHlgXG59O1xuY29uc3Qgc3RyaW5ncyA9IHtcbiAgV0VJR0hUOiBbJ2xpZ2h0JywgJ3JlZ3VsYXInLCAnbWVkaXVtJywgJ3NlbWlib2xkJywgJ2JvbGQnLCBcImRlZmF1bHRcIl0sXG4gIFRZUEU6IFsncHJpbWFyeScsICdzZWNvbmRhcnknLCAnZGFuZ2VyJywgJ3dhcm5pbmcnLCAnc3VjY2VzcycsICd0ZXJ0aWFyeScsICdxdWF0ZXJuYXJ5J10sXG4gIFNJWkU6IFsnbm9ybWFsJywgJ3NtYWxsJywgXCJpbmhlcml0XCJdLFxuICBTUEFDSU5HOiBbJ25vcm1hbCcsICdleHRlbmRlZCddLFxuICBIRUFESU5HOiBbMSwgMiwgMywgNCwgNSwgNl0sXG4gIFJVTEU6IFsndGV4dCcsICdudW1iZXJzJywgJ2J5dGVzLWRlY2ltYWwnLCAnYnl0ZXMtYmluYXJ5JywgJ3BlcmNlbnRhZ2VzJywgJ2V4cG9uZW50aWFsJ10sXG4gIFRSVU5DQVRFOiBbJ2NlaWwnLCAnZmxvb3InLCAncm91bmQnXVxufTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MgfTsiLCAiaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgc3RyaW5ncyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3R5cG9ncmFwaHkvY29uc3RhbnRzJztcbmltcG9ydCBCYXNlIGZyb20gJy4vYmFzZSc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0IGV4dGVuZHMgUHVyZUNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZSwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjb21wb25lbnQ6ICdzcGFuJ1xuICAgIH0sIHRoaXMucHJvcHMpKTtcbiAgfVxufVxuVGV4dC5wcm9wVHlwZXMgPSB7XG4gIGNvcHlhYmxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuYm9vbF0pLFxuICBkZWxldGU6IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGljb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ub2RlLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIGVsbGlwc2lzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuYm9vbF0pLFxuICBtYXJrOiBQcm9wVHlwZXMuYm9vbCxcbiAgdW5kZXJsaW5lOiBQcm9wVHlwZXMuYm9vbCxcbiAgbGluazogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgc3Ryb25nOiBQcm9wVHlwZXMuYm9vbCxcbiAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuVFlQRSksXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLlNJWkUpLFxuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjb2RlOiBQcm9wVHlwZXMuYm9vbCxcbiAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuICB3ZWlnaHQ6IFByb3BUeXBlcy5udW1iZXJcbn07XG5UZXh0LmRlZmF1bHRQcm9wcyA9IHtcbiAgY29weWFibGU6IGZhbHNlLFxuICBkZWxldGU6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGljb246ICcnLFxuICAvLyBlZGl0YWJsZTogZmFsc2UsXG4gIGVsbGlwc2lzOiBmYWxzZSxcbiAgbWFyazogZmFsc2UsXG4gIHVuZGVybGluZTogZmFsc2UsXG4gIHN0cm9uZzogZmFsc2UsXG4gIGxpbms6IGZhbHNlLFxuICB0eXBlOiAncHJpbWFyeScsXG4gIHN0eWxlOiB7fSxcbiAgc2l6ZTogJ25vcm1hbCcsXG4gIGNsYXNzTmFtZTogJydcbn07IiwgImltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwibG9kYXNoL2lzRnVuY3Rpb25cIjtcbmltcG9ydCBfaXNOdWxsIGZyb20gXCJsb2Rhc2gvaXNOdWxsXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCJsb2Rhc2gvaXNTdHJpbmdcIjtcbmltcG9ydCBfbWVyZ2UgZnJvbSBcImxvZGFzaC9tZXJnZVwiO1xuaW1wb3J0IF9vbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xuaW1wb3J0IF9pc1VuZGVmaW5lZCBmcm9tIFwibG9kYXNoL2lzVW5kZWZpbmVkXCI7XG52YXIgX19hd2FpdGVyID0gdGhpcyAmJiB0aGlzLl9fYXdhaXRlciB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzLCBzdHJpbmdzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdHlwb2dyYXBoeS9jb25zdGFudHMnO1xuaW1wb3J0IFR5cG9ncmFwaHkgZnJvbSAnLi90eXBvZ3JhcGh5JztcbmltcG9ydCBDb3B5YWJsZSBmcm9tICcuL2NvcHlhYmxlJztcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uL3Rvb2x0aXAvaW5kZXgnO1xuaW1wb3J0IFBvcG92ZXIgZnJvbSAnLi4vcG9wb3Zlci9pbmRleCc7XG5pbXBvcnQgZ2V0UmVuZGVyVGV4dCBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvd2FybmluZyc7XG5pbXBvcnQgaXNFbnRlclByZXNzIGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3V0aWxzL2lzRW50ZXJQcmVzcyc7XG5pbXBvcnQgTG9jYWxlQ29uc3VtZXIgZnJvbSAnLi4vbG9jYWxlL2xvY2FsZUNvbnN1bWVyJztcbmltcG9ydCB7IGlzU2VtaUljb24sIHJ1bkFmdGVyVGlja3MgfSBmcm9tICcuLi9fdXRpbHMnO1xuaW1wb3J0IFNpemVDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIsIHsgT2JzZXJ2ZXJQcm9wZXJ0eSB9IGZyb20gJy4uL3Jlc2l6ZU9ic2VydmVyJztcbmNvbnN0IHByZWZpeENscyA9IGNzc0NsYXNzZXMuUFJFRklYO1xuY29uc3QgRUxMSVBTSVNfU1RSID0gJy4uLic7XG5jb25zdCB3cmFwcGVyRGVjb3JhdGlvbnMgPSAocHJvcHMsIGNvbnRlbnQpID0+IHtcbiAgY29uc3Qge1xuICAgIG1hcmssXG4gICAgY29kZSxcbiAgICB1bmRlcmxpbmUsXG4gICAgc3Ryb25nLFxuICAgIGxpbmssXG4gICAgZGlzYWJsZWRcbiAgfSA9IHByb3BzO1xuICBsZXQgd3JhcHBlZCA9IGNvbnRlbnQ7XG4gIGNvbnN0IHdyYXAgPSAoaXNOZWVkZWQsIHRhZykgPT4ge1xuICAgIGxldCB3cmFwUHJvcHMgPSB7fTtcbiAgICBpZiAoIWlzTmVlZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaXNOZWVkZWQgPT09ICdvYmplY3QnKSB7XG4gICAgICB3cmFwUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBpc05lZWRlZCk7XG4gICAgfVxuICAgIHdyYXBwZWQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudCh0YWcsIHdyYXBQcm9wcywgd3JhcHBlZCk7XG4gIH07XG4gIHdyYXAobWFyaywgJ21hcmsnKTtcbiAgd3JhcChjb2RlLCAnY29kZScpO1xuICB3cmFwKHVuZGVybGluZSAmJiAhbGluaywgJ3UnKTtcbiAgd3JhcChzdHJvbmcsICdzdHJvbmcnKTtcbiAgd3JhcChwcm9wcy5kZWxldGUsICdkZWwnKTtcbiAgd3JhcChsaW5rLCBkaXNhYmxlZCA/ICdzcGFuJyA6ICdhJyk7XG4gIHJldHVybiB3cmFwcGVkO1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2UgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLm9ic2VydmVyVGFraW5nRWZmZWN0ID0gZmFsc2U7XG4gICAgdGhpcy5vblJlc2l6ZSA9IGVudHJpZXMgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgaWYgKHRoaXMucmFmSWQpIHtcbiAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmSWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0aGlzLnJhZklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgeWllbGQgdGhpcy5nZXRFbGxpcHNpc1N0YXRlKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBpZiBpdCBuZWVkcyB0byB1c2UganMgb3ZlcmZsb3dlZDpcbiAgICAvLyAxLiB0ZXh0IGlzIGV4cGFuZGFibGUgMi4gZXhwYW5kVGV4dCBuZWVkIHRvIGJlIHNob3duICAzLiBoYXMgZXh0cmEgb3BlcmF0aW9uIDQuIHRleHQgbmVlZCB0byBlbGxpcHNlIGZyb20gbWlkXG4gICAgdGhpcy5jYW5Vc2VDU1NFbGxpcHNpcyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29weWFibGVcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge1xuICAgICAgICBleHBhbmRhYmxlLFxuICAgICAgICBleHBhbmRUZXh0LFxuICAgICAgICBwb3MsXG4gICAgICAgIHN1ZmZpeFxuICAgICAgfSA9IHRoaXMuZ2V0RWxsaXBzaXNPcHQoKTtcbiAgICAgIHJldHVybiAhZXhwYW5kYWJsZSAmJiBfaXNVbmRlZmluZWQoZXhwYW5kVGV4dCkgJiYgIWNvcHlhYmxlICYmIHBvcyA9PT0gJ2VuZCcgJiYgIXN1ZmZpeC5sZW5ndGg7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiB3aGV0aGVyIHRydW5jYXRlZFxuICAgICAqICByb3dzIDwgPSAxIGlmIHRoZXJlIGlzIG92ZXJmbG93IGNvbnRlbnQsIHJldHVybiB0cnVlXG4gICAgICogIHJvd3MgPiAxIGlmIHRoZXJlIGlzIG92ZXJmbG93IGhlaWdodCwgcmV0dXJuIHRydWVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcm93c1xuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuc2hvdWxkVHJ1bmNhdGVkID0gcm93cyA9PiB7XG4gICAgICBpZiAoIXJvd3MgfHwgcm93cyA8IDEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlT3ZlcmZsb3cgPSByb3dzIDw9IDEgPyB0aGlzLmNvbXBhcmVTaW5nbGVSb3coKSA6IHRoaXMud3JhcHBlclJlZi5jdXJyZW50LnNjcm9sbEhlaWdodCA+IHRoaXMud3JhcHBlclJlZi5jdXJyZW50Lm9mZnNldEhlaWdodDtcbiAgICAgIHJldHVybiB1cGRhdGVPdmVyZmxvdztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFx1OTAxQVx1OEZDN1x1NUMwNiBjb250ZW50IFx1N0VEOVx1NTIzMCBSYW5nZSBcdTVCRjlcdThDNjFcdUZGMENcdTUwMUZcdTUyQTkgUmFuZ2UgXHU3Njg0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBcdTYyRkZcdTUyMzAgY29udGVudCBcdTc2ODRcdTUxQzZcdTc4NkUgd2lkdGhcbiAgICAgKiBcdTRFMERcdTUzRDcgY3NzIGVsbGlwc2lzIFx1NEUwRVx1NTQyNlx1NzY4NFx1NUY3MVx1NTRDRFxuICAgICAqIEJ5IGdpdmluZyB0aGUgY29udGVudCB0byB0aGUgUmFuZ2Ugb2JqZWN0LCBnZXQgdGhlIGV4YWN0IHdpZHRoIG9mIHRoZSBjb250ZW50IHdpdGggdGhlIGhlbHAgb2YgUmFuZ2UncyBnZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAgICAgKiBOb3QgYWZmZWN0ZWQgYnkgY3NzIGVsbGlwc2lzIG9yIG5vdFxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Eb3V5aW5GRS9zZW1pLWRlc2lnbi9pc3N1ZXMvMTczMVxuICAgICAqL1xuICAgIHRoaXMuY29tcGFyZVNpbmdsZVJvdyA9ICgpID0+IHtcbiAgICAgIGlmICghKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZVJhbmdlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250YWluZXJOb2RlID0gdGhpcy53cmFwcGVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lck5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICBjb25zdCBjaGlsZE5vZGVzID0gQXJyYXkuZnJvbShjb250YWluZXJOb2RlLmNoaWxkTm9kZXMpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgY29uc3QgY29udGVudFdpZHRoID0gY2hpbGROb2Rlcy5yZWR1Y2UoKGFjYywgbm9kZSkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICAgICAgcmV0dXJuIGFjYyArICgoX2EgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCk7XG4gICAgICB9LCAwKTtcbiAgICAgIHJhbmdlLmRldGFjaCgpO1xuICAgICAgcmV0dXJuIGNvbnRlbnRXaWR0aCA+IGNvbnRhaW5lcldpZHRoO1xuICAgIH07XG4gICAgdGhpcy5zaG93VG9vbHRpcCA9ICgpID0+IHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlzT3ZlcmZsb3dlZCxcbiAgICAgICAgaXNUcnVuY2F0ZWQsXG4gICAgICAgIGV4cGFuZGVkXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2hvd1Rvb2x0aXAsXG4gICAgICAgIGV4cGFuZGFibGUsXG4gICAgICAgIGV4cGFuZFRleHRcbiAgICAgIH0gPSB0aGlzLmdldEVsbGlwc2lzT3B0KCk7XG4gICAgICBjb25zdCBjYW5Vc2VDU1NFbGxpcHNpcyA9IHRoaXMuY2FuVXNlQ1NTRWxsaXBzaXMoKTtcbiAgICAgIC8vIElmIHRoZSBjc3MgaXMgdHJ1bmNhdGVkLCB1c2UgaXNPdmVyZmxvd2VkIHRvIGp1ZGdlLiBJZiB0aGUgY3NzIGlzIHRydW5jYXRlZCwgdXNlIGlzVHJ1bmNhdGVkIHRvIGp1ZGdlLlxuICAgICAgY29uc3Qgb3ZlcmZsb3dlZCA9ICFleHBhbmRlZCAmJiAoY2FuVXNlQ1NTRWxsaXBzaXMgPyBpc092ZXJmbG93ZWQgOiBpc1RydW5jYXRlZCk7XG4gICAgICBjb25zdCBub0V4cGFuZFRleHQgPSAhZXhwYW5kYWJsZSAmJiBfaXNVbmRlZmluZWQoZXhwYW5kVGV4dCk7XG4gICAgICBjb25zdCBzaG93ID0gbm9FeHBhbmRUZXh0ICYmIG92ZXJmbG93ZWQgJiYgc2hvd1Rvb2x0aXA7XG4gICAgICBpZiAoIXNob3cpIHtcbiAgICAgICAgcmV0dXJuIHNob3c7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgdHlwZTogJ3Rvb2x0aXAnXG4gICAgICB9O1xuICAgICAgaWYgKHR5cGVvZiBzaG93VG9vbHRpcCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHNob3dUb29sdGlwLnR5cGUgJiYgc2hvd1Rvb2x0aXAudHlwZS50b0xvd2VyQ2FzZSgpID09PSAncG9wb3ZlcicpIHtcbiAgICAgICAgICByZXR1cm4gX21lcmdlKHtcbiAgICAgICAgICAgIG9wdHM6IHtcbiAgICAgICAgICAgICAgLy8gc3R5bGU6IHsgd2lkdGg6ICcyNDBweCcgfSxcbiAgICAgICAgICAgICAgc2hvd0Fycm93OiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgc2hvd1Rvb2x0aXAsIHtcbiAgICAgICAgICAgIG9wdHM6IHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbHMoe1xuICAgICAgICAgICAgICAgIFtgJHtwcmVmaXhDbHN9LWVsbGlwc2lzLXBvcG92ZXJgXTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBbKF9hID0gc2hvd1Rvb2x0aXAgPT09IG51bGwgfHwgc2hvd1Rvb2x0aXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNob3dUb29sdGlwLm9wdHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbGFzc05hbWVdOiBCb29sZWFuKChfYiA9IHNob3dUb29sdGlwID09PSBudWxsIHx8IHNob3dUb29sdGlwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaG93VG9vbHRpcC5vcHRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xhc3NOYW1lKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRzKSwgc2hvd1Rvb2x0aXApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmF1bHRPcHRzO1xuICAgIH07XG4gICAgdGhpcy5vbkhvdmVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2FuVXNlQ1NTRWxsaXBzaXMgPSB0aGlzLmNhblVzZUNTU0VsbGlwc2lzKCk7XG4gICAgICBpZiAoY2FuVXNlQ1NTRWxsaXBzaXMpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJvd3MsXG4gICAgICAgICAgc3VmZml4LFxuICAgICAgICAgIHBvc1xuICAgICAgICB9ID0gdGhpcy5nZXRFbGxpcHNpc09wdCgpO1xuICAgICAgICBjb25zdCB1cGRhdGVPdmVyZmxvdyA9IHRoaXMuc2hvdWxkVHJ1bmNhdGVkKHJvd3MpO1xuICAgICAgICAvLyBpc092ZXJmbG93ZWQgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byBzaG93IHRvb2x0aXAgd2hlbiB1c2luZyBjc3MgZWxsaXBzaXNcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNPdmVyZmxvd2VkOiB1cGRhdGVPdmVyZmxvdyxcbiAgICAgICAgICBpc1RydW5jYXRlZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmdldEVsbGlwc2lzU3RhdGUgPSAoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJvd3MsXG4gICAgICAgIHN1ZmZpeCxcbiAgICAgICAgcG9zXG4gICAgICB9ID0gdGhpcy5nZXRFbGxpcHNpc09wdCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgc3Ryb25nXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIC8vIHdhaXQgdW50aWwgZWxlbWVudCBtb3VudGVkXG4gICAgICBpZiAoIXRoaXMud3JhcHBlclJlZiB8fCAhdGhpcy53cmFwcGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgeWllbGQgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIGV4cGFuZGVkXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IGNhblVzZUNTU0VsbGlwc2lzID0gdGhpcy5jYW5Vc2VDU1NFbGxpcHNpcygpO1xuICAgICAgaWYgKGNhblVzZUNTU0VsbGlwc2lzKSB7XG4gICAgICAgIC8vIGNvbnN0IHVwZGF0ZU92ZXJmbG93ID0gdGhpcy5zaG91bGRUcnVuY2F0ZWQocm93cyk7XG4gICAgICAgIC8vIC8vIGlzT3ZlcmZsb3dlZCBuZWVkcyB0byBiZSB1cGRhdGVkIHRvIHNob3cgdG9vbHRpcCB3aGVuIHVzaW5nIGNzcyBlbGxpcHNpc1xuICAgICAgICAvLyB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgLy8gICAgIGlzT3ZlcmZsb3dlZDogdXBkYXRlT3ZlcmZsb3csXG4gICAgICAgIC8vICAgICBpc1RydW5jYXRlZDogZmFsc2VcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIElmIGNoaWxkcmVuIGlzIG51bGwsIGNzcy9qcyB0cnVuY2F0ZWQgZmxhZyBpc1RydW5jYXRlIGlzIGZhbHNlXG4gICAgICBpZiAoX2lzTnVsbChjaGlsZHJlbikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaXNUcnVuY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNPdmVyZmxvd2VkOiBmYWxzZVxuICAgICAgICAgIH0sIHJlc29sdmUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEN1cnJlbnRseSBvbmx5IHRleHQgdHJ1bmNhdGlvbiBpcyBzdXBwb3J0ZWQsIGlmIHRoZXJlIGlzIG5vbi10ZXh0LCBcbiAgICAgIC8vIGJvdGggY3NzIHRydW5jYXRpb24gYW5kIGpzIHRydW5jYXRpb24gc2hvdWxkIHRocm93IGEgd2FybmluZ1xuICAgICAgd2FybmluZygnY2hpbGRyZW4nIGluIHRoaXMucHJvcHMgJiYgdHlwZW9mIGNoaWxkcmVuICE9PSAnc3RyaW5nJywgXCJbU2VtaSBUeXBvZ3JhcGh5XSBPbmx5IGNoaWxkcmVuIHdpdGggcHVyZSB0ZXh0IGNvdWxkIGJlIHVzZWQgd2l0aCBlbGxpcHNpcyBhdCB0aGlzIG1vbWVudC5cIik7XG4gICAgICBpZiAoIXJvd3MgfHwgcm93cyA8IDAgfHwgZXhwYW5kZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZXh0cmFOb2RlID0ge1xuICAgICAgICBleHBhbmQ6IHRoaXMuZXhwYW5kUmVmLmN1cnJlbnQsXG4gICAgICAgIGNvcHk6IHRoaXMuY29weVJlZiAmJiB0aGlzLmNvcHlSZWYuY3VycmVudFxuICAgICAgfTtcbiAgICAgIC8vIFBlcmZvcm0gdHlwZSBjb252ZXJzaW9uIG9uIGNoaWxkcmVuIHRvIHByZXZlbnQgY29tcG9uZW50IGNyYXNoIGR1ZSB0byBub24tc3RyaW5nIHR5cGUgb2YgY2hpbGRyZW5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Eb3V5aW5GRS9zZW1pLWRlc2lnbi9pc3N1ZXMvMjE2N1xuICAgICAgY29uc3QgcmVhbENoaWxkcmVuID0gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbi5qb2luKCcnKSA6IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2V0UmVuZGVyVGV4dCh0aGlzLndyYXBwZXJSZWYuY3VycmVudCwgcm93cywgcmVhbENoaWxkcmVuLCBleHRyYU5vZGUsIEVMTElQU0lTX1NUUiwgc3VmZml4LCBwb3MsIHN0cm9uZyk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlzT3ZlcmZsb3dlZDogZmFsc2UsXG4gICAgICAgICAgZWxsaXBzaXNDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIGlzVHJ1bmNhdGVkOiByZWFsQ2hpbGRyZW4gIT09IGNvbnRlbnRcbiAgICAgICAgfSwgcmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgZm9sZCBidXR0b24gaXMgY2xpY2tlZCB0byBzYXZlIHRoZSBsYXRlc3QgZXhwYW5kZWQgc3RhdGVcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG4gICAgdGhpcy50b2dnbGVPdmVyZmxvdyA9IGUgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBvbkV4cGFuZCxcbiAgICAgICAgZXhwYW5kYWJsZSxcbiAgICAgICAgY29sbGFwc2libGVcbiAgICAgIH0gPSB0aGlzLmdldEVsbGlwc2lzT3B0KCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGV4cGFuZGVkXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIG9uRXhwYW5kICYmIG9uRXhwYW5kKCFleHBhbmRlZCwgZSk7XG4gICAgICBpZiAoZXhwYW5kYWJsZSAmJiAhZXhwYW5kZWQgfHwgY29sbGFwc2libGUgJiYgZXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZXhwYW5kZWQ6ICFleHBhbmRlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuZ2V0RWxsaXBzaXNPcHQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGVsbGlwc2lzXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmICghZWxsaXBzaXMpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHJvd3M6IDEsXG4gICAgICAgIGV4cGFuZGFibGU6IGZhbHNlLFxuICAgICAgICBwb3M6ICdlbmQnLFxuICAgICAgICBzdWZmaXg6ICcnLFxuICAgICAgICBzaG93VG9vbHRpcDogZmFsc2UsXG4gICAgICAgIGNvbGxhcHNpYmxlOiBmYWxzZSxcbiAgICAgICAgZXhwYW5kVGV4dDogZWxsaXBzaXMuZXhwYW5kYWJsZSA/IHRoaXMuZXhwYW5kU3RyIDogdW5kZWZpbmVkLFxuICAgICAgICBjb2xsYXBzZVRleHQ6IGVsbGlwc2lzLmNvbGxhcHNpYmxlID8gdGhpcy5jb2xsYXBzZVN0ciA6IHVuZGVmaW5lZFxuICAgICAgfSwgdHlwZW9mIGVsbGlwc2lzID09PSAnb2JqZWN0JyA/IGVsbGlwc2lzIDogbnVsbCk7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJFeHBhbmRhYmxlID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBleHBhbmRlZCxcbiAgICAgICAgaXNUcnVuY2F0ZWRcbiAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgaWYgKCFpc1RydW5jYXRlZCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGV4cGFuZFRleHQsXG4gICAgICAgIGV4cGFuZGFibGUsXG4gICAgICAgIGNvbGxhcHNlVGV4dCxcbiAgICAgICAgY29sbGFwc2libGVcbiAgICAgIH0gPSB0aGlzLmdldEVsbGlwc2lzT3B0KCk7XG4gICAgICBjb25zdCBub0V4cGFuZFRleHQgPSAhZXhwYW5kYWJsZSAmJiBfaXNVbmRlZmluZWQoZXhwYW5kVGV4dCk7XG4gICAgICBjb25zdCBub0NvbGxhcHNlVGV4dCA9ICFjb2xsYXBzaWJsZSAmJiBfaXNVbmRlZmluZWQoY29sbGFwc2VUZXh0KTtcbiAgICAgIGxldCB0ZXh0O1xuICAgICAgaWYgKCFleHBhbmRlZCAmJiAhbm9FeHBhbmRUZXh0KSB7XG4gICAgICAgIHRleHQgPSBleHBhbmRUZXh0O1xuICAgICAgfSBlbHNlIGlmIChleHBhbmRlZCAmJiAhbm9Db2xsYXBzZVRleHQpIHtcbiAgICAgICAgdGV4dCA9IGNvbGxhcHNlVGV4dDtcbiAgICAgIH1cbiAgICAgIGlmICghbm9FeHBhbmRUZXh0IHx8ICFub0NvbGxhcHNlVGV4dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICAvLyBUT0RPOiByZXBsYWNlIGBhYCB0YWcgd2l0aCBgc3BhbmAgaW4gbmV4dCBtYWpvciB2ZXJzaW9uXG4gICAgICAgICAgLy8gTk9URTogbWF5IGhhdmUgZWZmZWN0IG9uIHN0eWxlXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzeC1hMTF5L2FuY2hvci1pcy12YWxpZFxuICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1lbGxpcHNpcy1leHBhbmRgLFxuICAgICAgICAgICAga2V5OiBcImV4cGFuZFwiLFxuICAgICAgICAgICAgcmVmOiB0aGlzLmV4cGFuZFJlZixcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiB0ZXh0LFxuICAgICAgICAgICAgb25DbGljazogdGhpcy50b2dnbGVPdmVyZmxvdyxcbiAgICAgICAgICAgIG9uS2V5UHJlc3M6IGUgPT4gaXNFbnRlclByZXNzKGUpICYmIHRoaXMudG9nZ2xlT3ZlcmZsb3coZSlcbiAgICAgICAgICB9LCB0ZXh0KVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBcdTgzQjdcdTUzRDZcdTY1ODdcdTY3MkNcdTc2ODRcdTdGMjlcdTc1NjVjbGFzc1x1NTQ4Q3N0eWxlXG4gICAgICpcbiAgICAgKiBcdTYyMkFcdTY1QURcdTdDN0JcdTU3OEJcdUZGMUFcbiAgICAgKiAgLSBcdTVGNTNcdThCQkVcdTdGNkVcdTRFMkRcdTk1RjRcdTYyMkFcdTY1QURcdUZGMDhwb3M9J21pZGRsZScpXHUzMDAxXHU1M0VGXHU1QzU1XHU1RjAwXHVGRjA4ZXhwYW5kYWJsZSlcdTMwMDFcdTY3MDlcdTU0MEVcdTdGMDBcdUZGMDhzdWZmaXggXHU5NzVFXHU3QTdBXHVGRjA5XHUzMDAxXHU1M0VGXHU1OTBEXHU1MjM2XHVGRjA4Y29weWFibGVcdUZGMDlcdUZGMENcdTU0MkZcdTc1MjggSlMgXHU2MjJBXHU2NUFEXHU3QjU2XHU3NTY1XG4gICAgICogIC0gXHU5NzVFXHU0RUU1XHU0RTBBXHU1NzNBXHU2NjZGXHVGRjBDXHU1NDJGXHU3NTI4IENTUyBcdTYyMkFcdTY1QURcdTdCNTZcdTc1NjVcbiAgICAgKiBcdTc2RjhcdTUxNzNcdTUzRDhcdTkxQ0ZcbiAgICAgKiAgcHJvcHM6XG4gICAgICogICAgICAtIGVsbGlwc2lzOlxuICAgICAqICAgICAgICAgIC0gcm93c1xuICAgICAqICAgICAgICAgIC0gZXhwYW5kYWJsZVxuICAgICAqICAgICAgICAgIC0gcG9zXG4gICAgICogICAgICAgICAgLSBzdWZmaXhcbiAgICAgKiAgc3RhdGU6XG4gICAgICogICAgICAtIGlzT3ZlcmZsb3dlZFx1RkYwQ1x1NjU4N1x1NjcyQ1x1NjYyRlx1NTQyNlx1NTkwNFx1NEU4RW92ZXJmbG93XHU3MkI2XHU2MDAxXG4gICAgICogICAgICAtIGV4cGFuZGVkXHVGRjBDXHU2NTg3XHU2NzJDXHU2NjJGXHU1NDI2XHU1OTA0XHU0RThFXHU2Mjk4XHU1M0UwXHU3MkI2XHU2MDAxXG4gICAgICogICAgICAtIGlzVHJ1bmNhdGVkXHVGRjBDXHU2NTg3XHU2NzJDXHU2NjJGXHU1NDI2XHU4OEFCanNcdTYyMkFcdTY1QURcbiAgICAgKlxuICAgICAqIEdldCB0aGUgYWJicmV2aWF0ZWQgY2xhc3MgYW5kIHN0eWxlIG9mIHRoZSB0ZXh0XG4gICAgICpcbiAgICAgKiBUcnVuY2F0aW9uIHR5cGU6XG4gICAgICogIC1XaGVuIHNldHRpbmcgbWlkZGxlIGVsbGlwc2lzIChwb3M9J21pZGRsZScpXHUzMDAxZXhwYW5kYWJsZVx1MzAwMXN1ZmZpeCBpcyBub3QgZW1wdHlcdTMwMDFjb3B5YWJsZSwgdGhlIEpTIGVsbGlwc2lzIHN0cmF0ZWd5IGlzIGVuYWJsZWRcbiAgICAgKiAgLU90aGVyd2lzZSwgZW5hYmxlIHRoZSBDU1MgZWxsaXBzaXMgc3RyYXRlZ3lcbiAgICAgKiByZWxhdGVkIHZhcmlhYmxlc1xuICAgICAqICBwcm9wczpcbiAgICAgKiAgICAgIC1lbGxpcHNpczpcbiAgICAgKiAgICAgICAgICAtcm93c1xuICAgICAqICAgICAgICAgIC1leHBhbmRhYmxlXG4gICAgICogICAgICAgICAgLXBvc1xuICAgICAqICAgICAgICAgIC1zdWZmaXhcbiAgICAgKiAgc3RhdGU6XG4gICAgICogICAgICAtaXNPdmVyZmxvd2VkLCB3aGV0aGVyIHRoZSB0ZXh0IGlzIGluIGFuIG92ZXJmbG93IHN0YXRlXG4gICAgICogICAgICAtZXhwYW5kZWQsIHdoZXRoZXIgdGhlIHRleHQgaXMgaW4gYSBjb2xsYXBzZWQgc3RhdGVcbiAgICAgKiAgICAgIC1pc1RydW5jYXRlZCwgd2hldGhlciB0aGUgdGV4dCBpcyB0cnVuY2F0ZWQgYnkganNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuZ2V0RWxsaXBzaXNTdHlsZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZWxsaXBzaXMsXG4gICAgICAgIGNvbXBvbmVudFxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBpZiAoIWVsbGlwc2lzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZWxsaXBzaXNDbHM6ICcnLFxuICAgICAgICAgIGVsbGlwc2lzU3R5bGU6IHt9XG4gICAgICAgICAgLy8gZWxsaXBzaXNBdHRyOiB7fVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICByb3dzXG4gICAgICB9ID0gdGhpcy5nZXRFbGxpcHNpc09wdCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBleHBhbmRlZFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCB1c2VDU1MgPSAhZXhwYW5kZWQgJiYgdGhpcy5jYW5Vc2VDU1NFbGxpcHNpcygpO1xuICAgICAgY29uc3QgZWxsaXBzaXNDbHMgPSBjbHMoe1xuICAgICAgICBbYCR7cHJlZml4Q2xzfS1lbGxpcHNpc2BdOiB0cnVlLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1lbGxpcHNpcy1zaW5nbGUtbGluZWBdOiByb3dzID09PSAxLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1lbGxpcHNpcy1tdWx0aXBsZS1saW5lYF06IHJvd3MgPiAxLFxuICAgICAgICAvLyBjb21wb25lbnQgPT09ICdzcGFuJywgVGV4dCBjb21wb25lbnQsIEl0IHNob3VsZCBiZSBleHRlcm5hbGx5IGRpc3BsYXllZCBpbmxpbmVcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZWxsaXBzaXMtbXVsdGlwbGUtbGluZS10ZXh0YF06IHJvd3MgPiAxICYmIGNvbXBvbmVudCA9PT0gJ3NwYW4nLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1lbGxpcHNpcy1vdmVyZmxvdy1lbGxpcHNpc2BdOiByb3dzID09PSAxICYmIHVzZUNTUyxcbiAgICAgICAgLy8gY29tcG9uZW50ID09PSAnc3BhbicsIFRleHQgY29tcG9uZW50LCBJdCBzaG91bGQgYmUgZXh0ZXJuYWxseSBkaXNwbGF5ZWQgaW5saW5lXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWVsbGlwc2lzLW92ZXJmbG93LWVsbGlwc2lzLXRleHRgXTogcm93cyA9PT0gMSAmJiB1c2VDU1MgJiYgY29tcG9uZW50ID09PSAnc3BhbidcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZWxsaXBzaXNTdHlsZSA9IHVzZUNTUyAmJiByb3dzID4gMSA/IHtcbiAgICAgICAgV2Via2l0TGluZUNsYW1wOiByb3dzXG4gICAgICB9IDoge307XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGxpcHNpc0NscyxcbiAgICAgICAgZWxsaXBzaXNTdHlsZVxuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMucmVuZGVyRWxsaXBzaXNUZXh0ID0gb3B0ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3VmZml4XG4gICAgICB9ID0gb3B0O1xuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlsZHJlblxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlzVHJ1bmNhdGVkLFxuICAgICAgICBleHBhbmRlZCxcbiAgICAgICAgZWxsaXBzaXNDb250ZW50XG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGlmIChleHBhbmRlZCB8fCAhaXNUcnVuY2F0ZWQpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLm9uSG92ZXJcbiAgICAgICAgfSwgY2hpbGRyZW4sIHN1ZmZpeCAmJiBzdWZmaXgubGVuZ3RoID8gc3VmZml4IDogbnVsbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLm9uSG92ZXJcbiAgICAgIH0sIGVsbGlwc2lzQ29udGVudCwgc3VmZml4KTtcbiAgICB9O1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgLy8gZWxsaXBzaXNcbiAgICAgIC8vIGlmIHRleHQgaXMgb3ZlcmZsb3cgaW4gY29udGFpbmVyXG4gICAgICBpc092ZXJmbG93ZWQ6IGZhbHNlLFxuICAgICAgZWxsaXBzaXNDb250ZW50OiBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICAgIC8vIGlmIHRleHQgaXMgdHJ1bmNhdGVkIHdpdGgganNcbiAgICAgIGlzVHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgIHByZXZDaGlsZHJlbjogbnVsbFxuICAgIH07XG4gICAgdGhpcy53cmFwcGVyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICAgIHRoaXMuZXhwYW5kUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICAgIHRoaXMuY29weVJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbGxpcHNpcykge1xuICAgICAgLy8gcnVuQWZ0ZXJUaWNrczogbWFrZSBzdXJlIHN0YXJ0IG9ic2VydmVyIG9uIHRoZSBuZXh0IHRpY2tcbiAgICAgIHRoaXMub25SZXNpemUoKS50aGVuKCgpID0+IHJ1bkFmdGVyVGlja3MoKCkgPT4gdGhpcy5vYnNlcnZlclRha2luZ0VmZmVjdCA9IHRydWUsIDEpKTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgcHJldlN0YXRlKSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJldkNoaWxkcmVuXG4gICAgfSA9IHByZXZTdGF0ZTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHt9O1xuICAgIG5ld1N0YXRlLnByZXZDaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIGlmIChwcm9wcy5lbGxpcHNpcyAmJiBwcmV2Q2hpbGRyZW4gIT09IHByb3BzLmNoaWxkcmVuKSB7XG4gICAgICAvLyByZXNldCBlbGxpcHNpcyBzdGF0ZSBpZiBjaGlsZHJlbiB1cGRhdGVcbiAgICAgIG5ld1N0YXRlLmlzT3ZlcmZsb3dlZCA9IGZhbHNlO1xuICAgICAgbmV3U3RhdGUuZWxsaXBzaXNDb250ZW50ID0gcHJvcHMuY2hpbGRyZW47XG4gICAgICBuZXdTdGF0ZS5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgbmV3U3RhdGUuaXNUcnVuY2F0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH1cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIC8vIFJlbmRlciB3YXMgYmFzZWQgb24gb3V0ZGF0ZWQgcmVmcyBhbmQgbmVlZHMgdG8gYmUgcmVydW5cbiAgICBpZiAodGhpcy5wcm9wcy5jaGlsZHJlbiAhPT0gcHJldlByb3BzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICBpZiAodGhpcy5wcm9wcy5lbGxpcHNpcykge1xuICAgICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICh0aGlzLnJhZklkKSB7XG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yYWZJZCk7XG4gICAgfVxuICB9XG4gIHJlbmRlck9wZXJhdGlvbnMoKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB0aGlzLnJlbmRlckV4cGFuZGFibGUoKSwgdGhpcy5yZW5kZXJDb3B5KCkpO1xuICB9XG4gIHJlbmRlckNvcHkoKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvcHlhYmxlLFxuICAgICAgY2hpbGRyZW5cbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoIWNvcHlhYmxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gSWYgaXQgaXMgY29uZmlndXJlZCBpbiB0aGUgY29udGVudCBvZiBjb3B5YWJsZSwgdGhlIGNvcGllZCBjb250ZW50IHdpbGwgYmUgdGhlIGNvbnRlbnQgaW4gY29weWFibGVcbiAgICBjb25zdCB3aWxsQ29weUNvbnRlbnQgPSAoX2EgPSBjb3B5YWJsZSA9PT0gbnVsbCB8fCBjb3B5YWJsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29weWFibGUuY29udGVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY2hpbGRyZW47XG4gICAgbGV0IGNvcHlDb250ZW50O1xuICAgIGxldCBoYXNPYmplY3QgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh3aWxsQ29weUNvbnRlbnQpKSB7XG4gICAgICBjb3B5Q29udGVudCA9ICcnO1xuICAgICAgd2lsbENvcHlDb250ZW50LmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29weUNvbnRlbnQgKz0gU3RyaW5nKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbGxDb3B5Q29udGVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGNvcHlDb250ZW50ID0gU3RyaW5nKHdpbGxDb3B5Q29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICBjb3B5Q29udGVudCA9IFN0cmluZyh3aWxsQ29weUNvbnRlbnQpO1xuICAgIH1cbiAgICB3YXJuaW5nKGhhc09iamVjdCwgJ0NvbnRlbnQgdG8gYmUgY29waWVkIGluIFR5cG9ncmFwaHkgaXMgYSBvYmplY3QsIGl0IHdpbGwgY2FzZSBhIFtvYmplY3QgT2JqZWN0XSBtaXN0YWtlIHdoZW4gY29weSB0byBjbGlwYm9hcmQuJyk7XG4gICAgY29uc3QgY29weUNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29udGVudDogY29weUNvbnRlbnQsXG4gICAgICBkdXJhdGlvbjogM1xuICAgIH0sIHR5cGVvZiBjb3B5YWJsZSA9PT0gJ29iamVjdCcgPyBjb3B5YWJsZSA6IG51bGwpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb3B5YWJsZSwgT2JqZWN0LmFzc2lnbih7fSwgY29weUNvbmZpZywge1xuICAgICAgZm9yd2FyZFJlZjogdGhpcy5jb3B5UmVmXG4gICAgfSkpO1xuICB9XG4gIHJlbmRlckljb24oKSB7XG4gICAgY29uc3Qge1xuICAgICAgaWNvbixcbiAgICAgIHNpemVcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCByZWFsU2l6ZSA9IHNpemUgPT09ICdpbmhlcml0JyA/IHRoaXMuY29udGV4dCA6IHNpemU7XG4gICAgaWYgKCFpY29uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgaWNvblNpemUgPSByZWFsU2l6ZSA9PT0gJ3NtYWxsJyA/ICdzbWFsbCcgOiAnZGVmYXVsdCc7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taWNvbmAsXG4gICAgICBcIngtc2VtaS1wcm9wXCI6IFwiaWNvblwiXG4gICAgfSwgaXNTZW1pSWNvbihpY29uKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoaWNvbiwge1xuICAgICAgc2l6ZTogaWNvblNpemVcbiAgICB9KSA6IGljb24pO1xuICB9XG4gIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgY29uc3QgX2EgPSB0aGlzLnByb3BzLFxuICAgICAge1xuICAgICAgICBjb21wb25lbnQsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHNwYWNpbmcsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgZWxsaXBzaXMsXG4gICAgICAgIGljb24sXG4gICAgICAgIHNpemUsXG4gICAgICAgIGxpbmssXG4gICAgICAgIGhlYWRpbmcsXG4gICAgICAgIHdlaWdodFxuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wiY29tcG9uZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJ0eXBlXCIsIFwic3BhY2luZ1wiLCBcImRpc2FibGVkXCIsIFwic3R5bGVcIiwgXCJlbGxpcHNpc1wiLCBcImljb25cIiwgXCJzaXplXCIsIFwibGlua1wiLCBcImhlYWRpbmdcIiwgXCJ3ZWlnaHRcIl0pO1xuICAgIGNvbnN0IHRleHRQcm9wcyA9IF9vbWl0KHJlc3QsIFsnc3Ryb25nJywgJ2VkaXRhYmxlJywgJ21hcmsnLCAnY29weWFibGUnLCAndW5kZXJsaW5lJywgJ2NvZGUnLFxuICAgIC8vICdsaW5rJyxcbiAgICAnZGVsZXRlJ10pO1xuICAgIGNvbnN0IHJlYWxTaXplID0gc2l6ZSA9PT0gJ2luaGVyaXQnID8gdGhpcy5jb250ZXh0IDogc2l6ZTtcbiAgICBjb25zdCBpY29uTm9kZSA9IHRoaXMucmVuZGVySWNvbigpO1xuICAgIGNvbnN0IGVsbGlwc2lzT3B0ID0gdGhpcy5nZXRFbGxpcHNpc09wdCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGVsbGlwc2lzQ2xzLFxuICAgICAgZWxsaXBzaXNTdHlsZVxuICAgIH0gPSB0aGlzLmdldEVsbGlwc2lzU3R5bGUoKTtcbiAgICBsZXQgdGV4dE5vZGUgPSBlbGxpcHNpcyA/IHRoaXMucmVuZGVyRWxsaXBzaXNUZXh0KGVsbGlwc2lzT3B0KSA6IGNoaWxkcmVuO1xuICAgIGNvbnN0IGxpbmtDbHMgPSBjbHMoe1xuICAgICAgW2Ake3ByZWZpeENsc30tbGluay10ZXh0YF06IGxpbmssXG4gICAgICBbYCR7cHJlZml4Q2xzfS1saW5rLXVuZGVybGluZWBdOiB0aGlzLnByb3BzLnVuZGVybGluZSAmJiBsaW5rXG4gICAgfSk7XG4gICAgdGV4dE5vZGUgPSB3cmFwcGVyRGVjb3JhdGlvbnModGhpcy5wcm9wcywgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGljb25Ob2RlLCB0aGlzLnByb3BzLmxpbmsgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBsaW5rQ2xzXG4gICAgfSwgdGV4dE5vZGUpIDogdGV4dE5vZGUpKTtcbiAgICBjb25zdCBoVGFnUmVnID0gL15oWzEtNl0kLztcbiAgICBjb25zdCBpc0hlYWRlciA9IF9pc1N0cmluZyhoZWFkaW5nKSAmJiBoVGFnUmVnLnRlc3QoaGVhZGluZyk7XG4gICAgY29uc3Qgd3JhcHBlckNscyA9IGNscyhjbGFzc05hbWUsIGVsbGlwc2lzQ2xzLCB7XG4gICAgICAvLyBbYCR7cHJlZml4Q2xzfS1wcmltYXJ5YF06ICF0eXBlIHx8IHR5cGUgPT09ICdwcmltYXJ5JyxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LSR7dHlwZX1gXTogdHlwZSAmJiAhbGluayxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LSR7cmVhbFNpemV9YF06IHJlYWxTaXplLFxuICAgICAgW2Ake3ByZWZpeENsc30tbGlua2BdOiBsaW5rLFxuICAgICAgW2Ake3ByZWZpeENsc30tZGlzYWJsZWRgXTogZGlzYWJsZWQsXG4gICAgICBbYCR7cHJlZml4Q2xzfS0ke3NwYWNpbmd9YF06IHNwYWNpbmcsXG4gICAgICBbYCR7cHJlZml4Q2xzfS0ke2hlYWRpbmd9YF06IGlzSGVhZGVyLFxuICAgICAgW2Ake3ByZWZpeENsc30tJHtoZWFkaW5nfS13ZWlnaHQtJHt3ZWlnaHR9YF06IGlzSGVhZGVyICYmIHdlaWdodCAmJiBpc05hTihOdW1iZXIod2VpZ2h0KSlcbiAgICB9KTtcbiAgICBjb25zdCB0ZXh0U3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGlzTmFOKE51bWJlcih3ZWlnaHQpKSA/IHt9IDoge1xuICAgICAgZm9udFdlaWdodDogd2VpZ2h0XG4gICAgfSksIHN0eWxlKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHlwb2dyYXBoeSwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6IHdyYXBwZXJDbHMsXG4gICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0ZXh0U3R5bGUpLCBlbGxpcHNpc1N0eWxlKSxcbiAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxuICAgICAgZm9yd2FyZFJlZjogdGhpcy53cmFwcGVyUmVmXG4gICAgfSwgdGV4dFByb3BzKSwgdGV4dE5vZGUsIHRoaXMucmVuZGVyT3BlcmF0aW9ucygpKTtcbiAgfVxuICByZW5kZXJUaXBXcmFwcGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoaWxkcmVuXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2hvd1Rvb2x0aXAgPSB0aGlzLnNob3dUb29sdGlwKCk7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMucmVuZGVyQ29udGVudCgpO1xuICAgIGlmIChzaG93VG9vbHRpcCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB0eXBlLFxuICAgICAgICBvcHRzLFxuICAgICAgICByZW5kZXJUb29sdGlwXG4gICAgICB9ID0gc2hvd1Rvb2x0aXA7XG4gICAgICBpZiAoX2lzRnVuY3Rpb24ocmVuZGVyVG9vbHRpcCkpIHtcbiAgICAgICAgcmV0dXJuIHJlbmRlclRvb2x0aXAoY2hpbGRyZW4sIGNvbnRlbnQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdwb3BvdmVyJykge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9wb3ZlciwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgY29udGVudDogY2hpbGRyZW4sXG4gICAgICAgICAgcG9zaXRpb246IFwidG9wXCJcbiAgICAgICAgfSwgb3B0cyksIGNvbnRlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjb250ZW50OiBjaGlsZHJlbixcbiAgICAgICAgcG9zaXRpb246IFwidG9wXCJcbiAgICAgIH0sIG9wdHMpLCBjb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIHNpemVcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCByZWFsU2l6ZSA9IHNpemUgPT09ICdpbmhlcml0JyA/IHRoaXMuY29udGV4dCA6IHNpemU7XG4gICAgY29uc3QgY29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpemVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogcmVhbFNpemVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVDb25zdW1lciwge1xuICAgICAgY29tcG9uZW50TmFtZTogXCJUeXBvZ3JhcGh5XCJcbiAgICB9LCBsb2NhbGUgPT4ge1xuICAgICAgdGhpcy5leHBhbmRTdHIgPSBsb2NhbGUuZXhwYW5kO1xuICAgICAgdGhpcy5jb2xsYXBzZVN0ciA9IGxvY2FsZS5jb2xsYXBzZTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRpcFdyYXBwZXIoKTtcbiAgICB9KSk7XG4gICAgaWYgKHRoaXMucHJvcHMuZWxsaXBzaXMpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgICAgICBvblJlc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfdGhpcy5vYnNlcnZlclRha2luZ0VmZmVjdCkge1xuICAgICAgICAgICAgX3RoaXMub25SZXNpemUoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9ic2VydmVQYXJlbnQ6IHRydWUsXG4gICAgICAgIG9ic2VydmVyUHJvcGVydHk6IE9ic2VydmVyUHJvcGVydHkuV2lkdGhcbiAgICAgIH0sIGNvbnRlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxufVxuQmFzZS5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgY29weWFibGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zaGFwZSh7XG4gICAgdGV4dDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBvbkNvcHk6IFByb3BUeXBlcy5mdW5jLFxuICAgIHN1Y2Nlc3NUaXA6IFByb3BUeXBlcy5ub2RlLFxuICAgIGNvcHlUaXA6IFByb3BUeXBlcy5ub2RlXG4gIH0pLCBQcm9wVHlwZXMuYm9vbF0pLFxuICBkZWxldGU6IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIC8vIGVkaXRhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgZWxsaXBzaXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zaGFwZSh7XG4gICAgcm93czogUHJvcFR5cGVzLm51bWJlcixcbiAgICBleHBhbmRhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBleHBhbmRUZXh0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9uRXhwYW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzdWZmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgc2hvd1Rvb2x0aXA6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgb3B0czogUHJvcFR5cGVzLm9iamVjdFxuICAgIH0pLCBQcm9wVHlwZXMuYm9vbF0pLFxuICAgIGNvbGxhcHNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjb2xsYXBzZVRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcG9zOiBQcm9wVHlwZXMub25lT2YoWydlbmQnLCAnbWlkZGxlJ10pXG4gIH0pLCBQcm9wVHlwZXMuYm9vbF0pLFxuICBtYXJrOiBQcm9wVHlwZXMuYm9vbCxcbiAgdW5kZXJsaW5lOiBQcm9wVHlwZXMuYm9vbCxcbiAgbGluazogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgc3BhY2luZzogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuU1BBQ0lORyksXG4gIHN0cm9uZzogUHJvcFR5cGVzLmJvb2wsXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLlNJWkUpLFxuICB0eXBlOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5UWVBFKSxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgaWNvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgaGVhZGluZzogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuQmFzZS5kZWZhdWx0UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBudWxsLFxuICBjb3B5YWJsZTogZmFsc2UsXG4gIGRlbGV0ZTogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgLy8gZWRpdGFibGU6IGZhbHNlLFxuICBlbGxpcHNpczogZmFsc2UsXG4gIGljb246ICcnLFxuICBtYXJrOiBmYWxzZSxcbiAgdW5kZXJsaW5lOiBmYWxzZSxcbiAgc3Ryb25nOiBmYWxzZSxcbiAgbGluazogZmFsc2UsXG4gIHR5cGU6ICdwcmltYXJ5JyxcbiAgc3BhY2luZzogJ25vcm1hbCcsXG4gIHNpemU6ICdub3JtYWwnLFxuICBzdHlsZToge30sXG4gIGNsYXNzTmFtZTogJydcbn07XG5CYXNlLmNvbnRleHRUeXBlID0gU2l6ZUNvbnRleHQ7IiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi4vdG9vbHRpcC9pbmRleCc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdHlwb2dyYXBoeS9jb25zdGFudHMnO1xuaW1wb3J0IGNvcHkgZnJvbSAnY29weS10ZXh0LXRvLWNsaXBib2FyZCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3V0aWxzL2Z1bmN0aW9uJztcbmltcG9ydCBMb2NhbGVDb25zdW1lciBmcm9tICcuLi9sb2NhbGUvbG9jYWxlQ29uc3VtZXInO1xuaW1wb3J0IHsgSWNvbkNvcHksIEljb25UaWNrIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktaWNvbnMnO1xuaW1wb3J0IGlzRW50ZXJQcmVzcyBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy9pc0VudGVyUHJlc3MnO1xuY29uc3QgcHJlZml4Q2xzID0gY3NzQ2xhc3Nlcy5QUkVGSVg7XG5leHBvcnQgY2xhc3MgQ29weWFibGUgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5jb3B5ID0gZSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBvbkNvcHlcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgcmVzID0gY29weShjb250ZW50KTtcbiAgICAgIG9uQ29weSAmJiBvbkNvcHkoZSwgY29udGVudCwgcmVzKTtcbiAgICAgIHRoaXMuc2V0Q29waWVkKGNvbnRlbnQsIGR1cmF0aW9uKTtcbiAgICB9O1xuICAgIHRoaXMuc2V0Q29waWVkID0gKGl0ZW0sIHRpbWVyKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY29waWVkOiB0cnVlLFxuICAgICAgICBpdGVtXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3RpbWVJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2V0Q29waWVkKCk7XG4gICAgICB9LCB0aW1lciAqIDEwMDApO1xuICAgIH07XG4gICAgdGhpcy5yZXNldENvcGllZCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl90aW1lSWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVJZCk7XG4gICAgICAgIHRoaXMuX3RpbWVJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICAgICAgaXRlbTogJydcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnJlbmRlclN1Y2Nlc3NUaXAgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN1Y2Nlc3NUaXBcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgaWYgKHR5cGVvZiBzdWNjZXNzVGlwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gc3VjY2Vzc1RpcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVDb25zdW1lciwge1xuICAgICAgICBjb21wb25lbnROYW1lOiBcIlR5cG9ncmFwaHlcIlxuICAgICAgfSwgbG9jYWxlID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvblRpY2ssIG51bGwpLCBsb2NhbGUuY29waWVkKSkpO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJDb3B5SWNvbiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaWNvblxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBjb3B5UHJvcHMgPSB7XG4gICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNvcHksXG4gICAgICAgIG9uS2V5UHJlc3M6IGUgPT4gaXNFbnRlclByZXNzKGUpICYmIHRoaXMuY29weShlKVxuICAgICAgfTtcbiAgICAgIHsvKiBUT0RPOiByZXBsYWNlIGBhYCB0YWcgd2l0aCBgc3BhbmAgaW4gbmV4dCBtYWpvciB2ZXJzaW9uXG4gICAgICAgICBOT1RFOiBtYXkgaGF2ZSBlZmZlY3Qgb24gc3R5bGUgKi9cbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlZmF1bHRJY29uID1cbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc3gtYTExeS9hbmNob3ItaXMtdmFsaWRcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWFjdGlvbi1jb3B5LWljb25gXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQ29weSwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY29weVxuICAgICAgfSwgY29weVByb3BzKSkpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChpY29uKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoaWNvbiwgY29weVByb3BzKSA6IGRlZmF1bHRJY29uO1xuICAgIH07XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICBpdGVtOiAnJ1xuICAgIH07XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVJZCk7XG4gICAgICB0aGlzLl90aW1lSWQgPSBudWxsO1xuICAgIH1cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGUsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBmb3J3YXJkUmVmLFxuICAgICAgY29weVRpcCxcbiAgICAgIHJlbmRlclxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvcGllZFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGZpbmFsQ2xzID0gY2xzKGNsYXNzTmFtZSwge1xuICAgICAgW2Ake3ByZWZpeENsc30tYWN0aW9uLWNvcHlgXTogIWNvcGllZCxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWFjdGlvbi1jb3BpZWRgXTogY29waWVkXG4gICAgfSk7XG4gICAgaWYgKHJlbmRlcikge1xuICAgICAgcmV0dXJuIHJlbmRlcihjb3BpZWQsIHRoaXMuY29weSwgdGhpcy5wcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVDb25zdW1lciwge1xuICAgICAgY29tcG9uZW50TmFtZTogXCJUeXBvZ3JhcGh5XCJcbiAgICB9LCBsb2NhbGUgPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIG1hcmdpbkxlZnQ6ICc0cHgnXG4gICAgICB9LCBzdHlsZSksXG4gICAgICBjbGFzc05hbWU6IGZpbmFsQ2xzLFxuICAgICAgcmVmOiBmb3J3YXJkUmVmXG4gICAgfSwgY29waWVkID8gdGhpcy5yZW5kZXJTdWNjZXNzVGlwKCkgOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcCwge1xuICAgICAgY29udGVudDogdHlwZW9mIGNvcHlUaXAgIT09ICd1bmRlZmluZWQnID8gY29weVRpcCA6IGxvY2FsZS5jb3B5XG4gICAgfSwgdGhpcy5yZW5kZXJDb3B5SWNvbigpKSkpKSk7XG4gIH1cbn1cbkNvcHlhYmxlLnByb3BUeXBlcyA9IHtcbiAgY29udGVudDogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25Db3B5OiBQcm9wVHlwZXMuZnVuYyxcbiAgc3VjY2Vzc1RpcDogUHJvcFR5cGVzLm5vZGUsXG4gIGNvcHlUaXA6IFByb3BUeXBlcy5ub2RlLFxuICBkdXJhdGlvbjogUHJvcFR5cGVzLm51bWJlcixcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgaWNvbjogUHJvcFR5cGVzLm5vZGVcbn07XG5Db3B5YWJsZS5kZWZhdWx0UHJvcHMgPSB7XG4gIGNvbnRlbnQ6ICcnLFxuICBvbkNvcHk6IG5vb3AsXG4gIGR1cmF0aW9uOiAzLFxuICBzdHlsZToge30sXG4gIGNsYXNzTmFtZTogJydcbn07XG5leHBvcnQgZGVmYXVsdCBDb3B5YWJsZTsiLCAiaW1wb3J0IF9pc0VxdWFsIGZyb20gXCJsb2Rhc2gvaXNFcXVhbFwiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9pc0VtcHR5IGZyb20gXCJsb2Rhc2gvaXNFbXB0eVwiO1xuaW1wb3J0IF9lYWNoIGZyb20gXCJsb2Rhc2gvZWFjaFwiO1xuaW1wb3J0IF9vbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xuaW1wb3J0IF9nZXQgZnJvbSBcImxvZGFzaC9nZXRcIjtcbmltcG9ydCBfbm9vcCBmcm9tIFwibG9kYXNoL25vb3BcIjtcbmltcG9ydCBfdGhyb3R0bGUgZnJvbSBcImxvZGFzaC90aHJvdHRsZVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCwgeyBpc1ZhbGlkRWxlbWVudCwgY2xvbmVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NLCB7IGZpbmRET01Ob2RlIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IEJBU0VfQ0xBU1NfUFJFRklYIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvYmFzZS9jb25zdGFudHMnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvd2FybmluZyc7XG5pbXBvcnQgRXZlbnQgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvRXZlbnQnO1xuaW1wb3J0IHsgY29udmVydERPTVJlY3RUb09iamVjdCB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3V0aWxzL2RvbSc7XG5pbXBvcnQgVG9vbHRpcEZvdW5kYXRpb24gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdG9vbHRpcC9mb3VuZGF0aW9uJztcbmltcG9ydCB7IHN0cmluZ3MsIGNzc0NsYXNzZXMsIG51bWJlcnMgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy90b29sdGlwL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRVdWlkU2hvcnQgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy91dWlkJztcbmltcG9ydCAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdG9vbHRpcC90b29sdGlwLmNzcyc7XG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuLi9fYmFzZS9iYXNlQ29tcG9uZW50JztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuLi9fYmFzZS9yZWFjdFV0aWxzJztcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnQsIGdldERlZmF1bHRQcm9wc0Zyb21HbG9iYWxDb25maWcsIGdldEZvY3VzYWJsZUVsZW1lbnRzLCBydW5BZnRlclRpY2tzLCBzdG9wUHJvcGFnYXRpb24gfSBmcm9tICcuLi9fdXRpbHMnO1xuaW1wb3J0IFBvcnRhbCBmcm9tICcuLi9fcG9ydGFsL2luZGV4JztcbmltcG9ydCBDb25maWdDb250ZXh0IGZyb20gJy4uL2NvbmZpZ1Byb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IFRyaWFuZ2xlQXJyb3cgZnJvbSAnLi9UcmlhbmdsZUFycm93JztcbmltcG9ydCBUcmlhbmdsZUFycm93VmVydGljYWwgZnJvbSAnLi9UcmlhbmdsZUFycm93VmVydGljYWwnO1xuaW1wb3J0IEFycm93Qm91bmRpbmdTaGFwZSBmcm9tICcuL0Fycm93Qm91bmRpbmdTaGFwZSc7XG5pbXBvcnQgQ1NTQW5pbWF0aW9uIGZyb20gXCIuLi9fY3NzQW5pbWF0aW9uXCI7XG5jb25zdCBwcmVmaXggPSBjc3NDbGFzc2VzLlBSRUZJWDtcbmNvbnN0IHBvc2l0aW9uU2V0ID0gc3RyaW5ncy5QT1NJVElPTl9TRVQ7XG5jb25zdCB0cmlnZ2VyU2V0ID0gc3RyaW5ncy5UUklHR0VSX1NFVDtcbmNvbnN0IGJsb2NrRGlzcGxheXMgPSBbJ2ZsZXgnLCAnYmxvY2snLCAndGFibGUnLCAnZmxvdy1yb290JywgJ2dyaWQnXTtcbmNvbnN0IGRlZmF1bHRHZXRDb250YWluZXIgPSAoKSA9PiBkb2N1bWVudC5ib2R5O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9vbHRpcCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zZXRDb250YWluZXJFbCA9IG5vZGUgPT4gdGhpcy5jb250YWluZXJFbCA9IHtcbiAgICAgIGN1cnJlbnQ6IG5vZGVcbiAgICB9O1xuICAgIHRoaXMuaXNTcGVjaWFsID0gZWxlbSA9PiB7XG4gICAgICBpZiAoaXNIVE1MRWxlbWVudChlbGVtKSkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihlbGVtLmRpc2FibGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KGVsZW0pKSB7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gX2dldChlbGVtLCAncHJvcHMuZGlzYWJsZWQnKTtcbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmluZ3MuU1RBVFVTX0RJU0FCTEVEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSBfZ2V0KGVsZW0sICdwcm9wcy5sb2FkaW5nJyk7XG4gICAgICAgIC8qIE9ubHkganVkZ2UgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhlIEJ1dHRvbiwgYW5kIG5vIGxvbmdlciBqdWRnZSBvdGhlciBjb21wb25lbnRzICovXG4gICAgICAgIGNvbnN0IGlzQnV0dG9uID0gIV9pc0VtcHR5KGVsZW0pICYmICFfaXNFbXB0eShlbGVtLnR5cGUpICYmIChfZ2V0KGVsZW0sICd0eXBlLmVsZW1lbnRUeXBlJykgPT09ICdCdXR0b24nIHx8IF9nZXQoZWxlbSwgJ3R5cGUuZWxlbWVudFR5cGUnKSA9PT0gJ0ljb25CdXR0b24nKTtcbiAgICAgICAgaWYgKGxvYWRpbmcgJiYgaXNCdXR0b24pIHtcbiAgICAgICAgICByZXR1cm4gc3RyaW5ncy5TVEFUVVNfTE9BRElORztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLy8gd2lsbEVudGVyID0gKCkgPT4ge1xuICAgIC8vIHRoaXMuZm91bmRhdGlvbi5jYWxjUG9zaXRpb24oKTtcbiAgICAvLyB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogdHJ1ZSB9KTtcbiAgICAvLyB9O1xuICAgIHRoaXMuZGlkTGVhdmUgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5rZWVwRE9NKSB7XG4gICAgICAgIHRoaXMuZm91bmRhdGlvbi5zZXREaXNwbGF5Tm9uZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm91bmRhdGlvbi5yZW1vdmVQb3J0YWwoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm91bmRhdGlvbi51bkJpbmRFdmVudCgpO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJJY29uID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnRcbiAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBzaG93QXJyb3csXG4gICAgICAgIHByZWZpeENscyxcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgbGV0IGljb24gPSBudWxsO1xuICAgICAgY29uc3QgdHJpYW5nbGVDbHMgPSBjbGFzc05hbWVzKFtgJHtwcmVmaXhDbHN9LWljb24tYXJyb3dgXSk7XG4gICAgICBjb25zdCBiZ0NvbG9yID0gX2dldChzdHlsZSwgJ2JhY2tncm91bmRDb2xvcicpO1xuICAgICAgY29uc3QgaWNvbkNvbXBvbmVudCA9IChwbGFjZW1lbnQgPT09IG51bGwgfHwgcGxhY2VtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwbGFjZW1lbnQuaW5jbHVkZXMoJ2xlZnQnKSkgfHwgKHBsYWNlbWVudCA9PT0gbnVsbCB8fCBwbGFjZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBsYWNlbWVudC5pbmNsdWRlcygncmlnaHQnKSkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmlhbmdsZUFycm93VmVydGljYWwsIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJpYW5nbGVBcnJvdywgbnVsbCk7XG4gICAgICBpZiAoc2hvd0Fycm93KSB7XG4gICAgICAgIGlmICgvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQoc2hvd0Fycm93KSkge1xuICAgICAgICAgIGljb24gPSBzaG93QXJyb3c7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoaWNvbkNvbXBvbmVudCwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiB0cmlhbmdsZUNscyxcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiBiZ0NvbG9yLFxuICAgICAgICAgICAgICBmaWxsOiAnY3VycmVudENvbG9yJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaWNvbjtcbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlUG9ydGFsSW5uZXJDbGljayA9IGUgPT4ge1xuICAgICAgaWYgKHRoaXMucHJvcHMuY2xpY2tUb0hpZGUpIHtcbiAgICAgICAgdGhpcy5mb3VuZGF0aW9uLmhpZGUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByb3BzLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBzdG9wUHJvcGFnYXRpb24oZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZVBvcnRhbE1vdXNlRG93biA9IGUgPT4ge1xuICAgICAgaWYgKHRoaXMucHJvcHMuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbihlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlUG9ydGFsRm9jdXMgPSBlID0+IHtcbiAgICAgIGlmICh0aGlzLnByb3BzLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBzdG9wUHJvcGFnYXRpb24oZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZVBvcnRhbEJsdXIgPSBlID0+IHtcbiAgICAgIGlmICh0aGlzLnByb3BzLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBzdG9wUHJvcGFnYXRpb24oZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZVBvcnRhbElubmVyS2V5RG93biA9IGUgPT4ge1xuICAgICAgdGhpcy5mb3VuZGF0aW9uLmhhbmRsZUNvbnRhaW5lcktleWRvd24oZSk7XG4gICAgfTtcbiAgICB0aGlzLnJlbmRlckNvbnRlbnROb2RlID0gY29udGVudCA9PiB7XG4gICAgICBjb25zdCBjb250ZW50UHJvcHMgPSB7XG4gICAgICAgIGluaXRpYWxGb2N1c1JlZjogdGhpcy5pbml0aWFsRm9jdXNSZWZcbiAgICAgIH07XG4gICAgICByZXR1cm4gIV9pc0Z1bmN0aW9uKGNvbnRlbnQpID8gY29udGVudCA6IGNvbnRlbnQoY29udGVudFByb3BzKTtcbiAgICB9O1xuICAgIHRoaXMucmVuZGVyUG9ydGFsID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb250YWluZXJTdHlsZSA9IHt9LFxuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBwb3J0YWxFdmVudFNldCxcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBkaXNwbGF5Tm9uZSxcbiAgICAgICAgdHJhbnNpdGlvblN0YXRlLFxuICAgICAgICBpZCxcbiAgICAgICAgaXNQb3NpdGlvblVwZGF0ZWRcbiAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBwcmVmaXhDbHMsXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIHNob3dBcnJvdyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIG1vdGlvbixcbiAgICAgICAgcm9sZSxcbiAgICAgICAgekluZGV4XG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGNvbnRlbnROb2RlID0gdGhpcy5yZW5kZXJDb250ZW50Tm9kZShjb250ZW50KTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2xhc3NOYW1lOiBwcm9wQ2xhc3NOYW1lXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuY29udGV4dC5kaXJlY3Rpb247XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc05hbWVzKHByb3BDbGFzc05hbWUsIHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30td3JhcHBlcmBdOiB0cnVlLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS13cmFwcGVyLXNob3dgXTogdmlzaWJsZSxcbiAgICAgICAgW2Ake3ByZWZpeENsc30td2l0aC1hcnJvd2BdOiBCb29sZWFuKHNob3dBcnJvdyksXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGljb24gPSB0aGlzLnJlbmRlckljb24oKTtcbiAgICAgIGNvbnN0IHBvcnRhbElubmVyU3R5bGUgPSBfb21pdChjb250YWluZXJTdHlsZSwgbW90aW9uID8gWyd0cmFuc2Zvcm1PcmlnaW4nXSA6IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1PcmlnaW4gPSBfZ2V0KGNvbnRhaW5lclN0eWxlLCAndHJhbnNmb3JtT3JpZ2luJyk7XG4gICAgICBjb25zdCB1c2VyT3BhY2l0eSA9IF9nZXQoc3R5bGUsICdvcGFjaXR5JywgbnVsbCk7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gdXNlck9wYWNpdHkgPyB1c2VyT3BhY2l0eSA6IDE7XG4gICAgICBjb25zdCBpbm5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU0FuaW1hdGlvbiwge1xuICAgICAgICBmaWxsTW9kZTogXCJmb3J3YXJkc1wiLFxuICAgICAgICBhbmltYXRpb25TdGF0ZTogdHJhbnNpdGlvblN0YXRlLFxuICAgICAgICBtb3Rpb246IG1vdGlvbiAmJiBpc1Bvc2l0aW9uVXBkYXRlZCxcbiAgICAgICAgc3RhcnRDbGFzc05hbWU6IHRyYW5zaXRpb25TdGF0ZSA9PT0gJ2VudGVyJyA/IGAke3ByZWZpeH0tYW5pbWF0aW9uLXNob3dgIDogYCR7cHJlZml4fS1hbmltYXRpb24taGlkZWAsXG4gICAgICAgIG9uQW5pbWF0aW9uU3RhcnQ6ICgpID0+IHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlLFxuICAgICAgICBvbkFuaW1hdGlvbkVuZDogKCkgPT4ge1xuICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgaWYgKHRyYW5zaXRpb25TdGF0ZSA9PT0gJ2xlYXZlJykge1xuICAgICAgICAgICAgdGhpcy5kaWRMZWF2ZSgpO1xuICAgICAgICAgICAgKF9iID0gKF9hID0gdGhpcy5wcm9wcykuYWZ0ZXJDbG9zZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sIF9yZWYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGFuaW1hdGlvblN0eWxlLFxuICAgICAgICAgIGFuaW1hdGlvbkNsYXNzTmFtZSxcbiAgICAgICAgICBhbmltYXRpb25FdmVudHNOZWVkQmluZFxuICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGFuaW1hdGlvbkNsYXNzTmFtZSksXG4gICAgICAgICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYW5pbWF0aW9uU3R5bGUpLCBkaXNwbGF5Tm9uZSA/IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IFwibm9uZVwiXG4gICAgICAgICAgfSA6IHt9KSwge1xuICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luXG4gICAgICAgICAgfSksIHN0eWxlKSwgdXNlck9wYWNpdHkgPyB7XG4gICAgICAgICAgICBvcGFjaXR5OiBpc1Bvc2l0aW9uVXBkYXRlZCA/IG9wYWNpdHkgOiBcIjBcIlxuICAgICAgICAgIH0gOiB7fSlcbiAgICAgICAgfSwgcG9ydGFsRXZlbnRTZXQsIGFuaW1hdGlvbkV2ZW50c05lZWRCaW5kLCB7XG4gICAgICAgICAgcm9sZTogcm9sZSxcbiAgICAgICAgICBcIngtcGxhY2VtZW50XCI6IHBsYWNlbWVudCxcbiAgICAgICAgICBpZDogaWRcbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeH0tY29udGVudGBcbiAgICAgICAgfSwgY29udGVudE5vZGUpLCBpY29uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbCwge1xuICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogdGhpcy5wcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB6SW5kZXhcbiAgICAgICAgfVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAvLyBsaXN0ZW4ga2V5Ym9hcmQgZXZlbnQsIGRvbid0IG1vdmUgdGFiSW5kZXggLTFcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBjbGFzc05hbWU6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS1wb3J0YWwtaW5uZXJgLFxuICAgICAgICBzdHlsZTogcG9ydGFsSW5uZXJTdHlsZSxcbiAgICAgICAgcmVmOiB0aGlzLnNldENvbnRhaW5lckVsLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZVBvcnRhbElubmVyQ2xpY2ssXG4gICAgICAgIG9uRm9jdXM6IHRoaXMuaGFuZGxlUG9ydGFsRm9jdXMsXG4gICAgICAgIG9uQmx1cjogdGhpcy5oYW5kbGVQb3J0YWxCbHVyLFxuICAgICAgICBvbk1vdXNlRG93bjogdGhpcy5oYW5kbGVQb3J0YWxNb3VzZURvd24sXG4gICAgICAgIG9uS2V5RG93bjogdGhpcy5oYW5kbGVQb3J0YWxJbm5lcktleURvd25cbiAgICAgIH0sIGlubmVyKSk7XG4gICAgfTtcbiAgICB0aGlzLndyYXBTcGFuID0gZWxlbSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdyYXBwZXJDbGFzc05hbWVcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgZGlzcGxheSA9IF9nZXQoZWxlbSwgJ3Byb3BzLnN0eWxlLmRpc3BsYXknKTtcbiAgICAgIGNvbnN0IGJsb2NrID0gX2dldChlbGVtLCAncHJvcHMuYmxvY2snKTtcbiAgICAgIGNvbnN0IGlzU3RyaW5nRWxlbSA9IHR5cGVvZiBlbGVtID09ICdzdHJpbmcnO1xuICAgICAgY29uc3Qgc3R5bGUgPSB7fTtcbiAgICAgIGlmICghaXNTdHJpbmdFbGVtKSB7XG4gICAgICAgIHN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICAgIH1cbiAgICAgIGlmIChibG9jayB8fCBibG9ja0Rpc3BsYXlzLmluY2x1ZGVzKGRpc3BsYXkpKSB7XG4gICAgICAgIHN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9uc1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LCBlbGVtKTtcbiAgICB9O1xuICAgIHRoaXMubWVyZ2VFdmVudHMgPSAocmF3RXZlbnRzLCBldmVudHMpID0+IHtcbiAgICAgIGNvbnN0IG1lcmdlZEV2ZW50cyA9IHt9O1xuICAgICAgX2VhY2goZXZlbnRzLCAoaGFuZGxlciwga2V5KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG1lcmdlZEV2ZW50c1trZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaGFuZGxlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgaWYgKHJhd0V2ZW50cyAmJiB0eXBlb2YgcmF3RXZlbnRzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmF3RXZlbnRzW2tleV0oLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtZXJnZWRFdmVudHM7XG4gICAgfTtcbiAgICB0aGlzLmdldFBvcHVwSWQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pZDtcbiAgICB9O1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICpcbiAgICAgICAqIE5vdGU6IFRoZSB0cmFuc2l0aW9uU3RhdGUgcGFyYW1ldGVyIGlzIGVxdWl2YWxlbnQgdG8gaXNJbnNlcnRcbiAgICAgICAqL1xuICAgICAgdHJhbnNpdGlvblN0YXRlOiAnJyxcbiAgICAgIHRyaWdnZXJFdmVudFNldDoge30sXG4gICAgICBwb3J0YWxFdmVudFNldDoge30sXG4gICAgICBjb250YWluZXJTdHlsZToge1xuICAgICAgICAvLyB6SW5kZXg6IHByb3BzLnpJbmRleCxcbiAgICAgIH0sXG4gICAgICBpc0luc2VydDogZmFsc2UsXG4gICAgICBwbGFjZW1lbnQ6IHByb3BzLnBvc2l0aW9uIHx8ICd0b3AnLFxuICAgICAgdHJhbnNpdGlvblN0eWxlOiB7fSxcbiAgICAgIGlzUG9zaXRpb25VcGRhdGVkOiBmYWxzZSxcbiAgICAgIGlkOiBwcm9wcy53cmFwcGVySWQsXG4gICAgICBkaXNwbGF5Tm9uZTogZmFsc2VcbiAgICB9O1xuICAgIHRoaXMuZm91bmRhdGlvbiA9IG5ldyBUb29sdGlwRm91bmRhdGlvbih0aGlzLmFkYXB0ZXIpO1xuICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gbmV3IEV2ZW50KCk7XG4gICAgdGhpcy50cmlnZ2VyRWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgdGhpcy5jb250YWluZXJFbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgICB0aGlzLmluaXRpYWxGb2N1c1JlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIgPSBudWxsO1xuICAgIHRoaXMucmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgdGhpcy5pc1dyYXBwZWQgPSBmYWxzZTsgLy8gSWRlbnRpZmllcyB3aGV0aGVyIGEgc3BhbiBlbGVtZW50IGlzIHdyYXBwZWRcbiAgICB0aGlzLmNvbnRhaW5lclBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIGdldCBhZGFwdGVyKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuYWRhcHRlciksIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5ldmVudE1hbmFnZXIub24oLi4uYXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvZmY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmV2ZW50TWFuYWdlci5vZmYoLi4uYXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBnZXRBbmltYXRpbmdTdGF0ZTogKCkgPT4gdGhpcy5pc0FuaW1hdGluZyxcbiAgICAgIGluc2VydFBvcnRhbDogKGNvbnRlbnQsIF9hKSA9PiB7XG4gICAgICAgIHZhciB7XG4gICAgICAgICAgICBwb3NpdGlvblxuICAgICAgICAgIH0gPSBfYSxcbiAgICAgICAgICBjb250YWluZXJTdHlsZSA9IF9fcmVzdChfYSwgW1wicG9zaXRpb25cIl0pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc0luc2VydDogdHJ1ZSxcbiAgICAgICAgICB0cmFuc2l0aW9uU3RhdGU6ICdlbnRlcicsXG4gICAgICAgICAgY29udGFpbmVyU3R5bGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5jb250YWluZXJTdHlsZSksIGNvbnRhaW5lclN0eWxlKVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKG9sZFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnRyYW5zaXRpb25TdGF0ZSA9PT0gJ2VudGVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ3BvcnRhbEluc2VydGVkJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyB3YWl0aW5nIGNoaWxkIGNvbXBvbmVudCBtb3VudGVkXG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZVBvcnRhbDogKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc0luc2VydDogZmFsc2UsXG4gICAgICAgICAgaXNQb3NpdGlvblVwZGF0ZWQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGdldEV2ZW50TmFtZTogKCkgPT4gKHtcbiAgICAgICAgbW91c2VFbnRlcjogJ29uTW91c2VFbnRlcicsXG4gICAgICAgIG1vdXNlTGVhdmU6ICdvbk1vdXNlTGVhdmUnLFxuICAgICAgICBtb3VzZU91dDogJ29uTW91c2VPdXQnLFxuICAgICAgICBtb3VzZU92ZXI6ICdvbk1vdXNlT3ZlcicsXG4gICAgICAgIGNsaWNrOiAnb25DbGljaycsXG4gICAgICAgIGZvY3VzOiAnb25Gb2N1cycsXG4gICAgICAgIGJsdXI6ICdvbkJsdXInLFxuICAgICAgICBrZXlkb3duOiAnb25LZXlEb3duJyxcbiAgICAgICAgY29udGV4dE1lbnU6ICdvbkNvbnRleHRNZW51J1xuICAgICAgfSksXG4gICAgICByZWdpc3RlclRyaWdnZXJFdmVudDogdHJpZ2dlckV2ZW50U2V0ID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50U2V0XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHJlZ2lzdGVyUG9ydGFsRXZlbnQ6IHBvcnRhbEV2ZW50U2V0ID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcG9ydGFsRXZlbnRTZXRcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZ2V0VHJpZ2dlckJvdW5kaW5nOiAoKSA9PiB7XG4gICAgICAgIC8vIEl0IG1heSBiZSBhIFJlYWN0IGNvbXBvbmVudCBvciBhbiBodG1sIGVsZW1lbnRcbiAgICAgICAgLy8gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdHJpZ2dlckUgbC5jdXJyZW50IGNhbiBnZXQgdGhlIHJlYWwgZG9tLCBzbyBjYWxsIGZpbmRET01Ob2RlIHRvIGVuc3VyZSB0aGF0IHlvdSBjYW4gZ2V0IHRoZSByZWFsIGRvbVxuICAgICAgICBjb25zdCB0cmlnZ2VyRE9NID0gdGhpcy5hZGFwdGVyLmdldFRyaWdnZXJOb2RlKCk7XG4gICAgICAgIHRoaXMudHJpZ2dlckVsLmN1cnJlbnQgPSB0cmlnZ2VyRE9NO1xuICAgICAgICByZXR1cm4gdHJpZ2dlckRPTSAmJiB0cmlnZ2VyRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgfSxcbiAgICAgIC8vIEdldHMgdGhlIG91dGVyIHNpemUgb2YgdGhlIHNwZWNpZmllZCBjb250YWluZXJcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyUmVjdDogKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmdldFBvcHVwQ29udGFpbmVyKCk7XG4gICAgICAgIGxldCByZWN0ID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnRhaW5lciAmJiBpc0hUTUxFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSBjb252ZXJ0RE9NUmVjdFRvT2JqZWN0KGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgICAgcmVjdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYm91bmRpbmdSZWN0KSwge1xuICAgICAgICAgICAgc2Nyb2xsTGVmdDogY29udGFpbmVyLnNjcm9sbExlZnQsXG4gICAgICAgICAgICBzY3JvbGxUb3A6IGNvbnRhaW5lci5zY3JvbGxUb3BcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgIH0sXG4gICAgICBjb250YWluZXJJc0JvZHk6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRQb3B1cENvbnRhaW5lcigpO1xuICAgICAgICByZXR1cm4gY29udGFpbmVyID09PSBkb2N1bWVudC5ib2R5O1xuICAgICAgfSxcbiAgICAgIGNvbnRhaW5lcklzUmVsYXRpdmU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRQb3B1cENvbnRhaW5lcigpO1xuICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncG9zaXRpb24nKSA9PT0gJ3JlbGF0aXZlJztcbiAgICAgIH0sXG4gICAgICBjb250YWluZXJJc1JlbGF0aXZlT3JBYnNvbHV0ZTogKCkgPT4gWydyZWxhdGl2ZScsICdhYnNvbHV0ZSddLmluY2x1ZGVzKHRoaXMuY29udGFpbmVyUG9zaXRpb24pLFxuICAgICAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBwb3AtdXAgbGF5ZXJcbiAgICAgIGdldFdyYXBwZXJCb3VuZGluZzogKCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMuY29udGFpbmVyRWwgJiYgdGhpcy5jb250YWluZXJFbC5jdXJyZW50O1xuICAgICAgICByZXR1cm4gZWwgJiYgZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB9LFxuICAgICAgZ2V0RG9jdW1lbnRFbGVtZW50Qm91bmRpbmc6ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHNldFBvc2l0aW9uOiBfYSA9PiB7XG4gICAgICAgIHZhciB7XG4gICAgICAgICAgICBwb3NpdGlvblxuICAgICAgICAgIH0gPSBfYSxcbiAgICAgICAgICBzdHlsZSA9IF9fcmVzdChfYSwgW1wicG9zaXRpb25cIl0pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjb250YWluZXJTdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmNvbnRhaW5lclN0eWxlKSwgc3R5bGUpLFxuICAgICAgICAgIHBsYWNlbWVudDogcG9zaXRpb24sXG4gICAgICAgICAgaXNQb3NpdGlvblVwZGF0ZWQ6IHRydWVcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ3Bvc2l0aW9uVXBkYXRlZCcpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBzZXREaXNwbGF5Tm9uZTogKGRpc3BsYXlOb25lLCBjYikgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkaXNwbGF5Tm9uZVxuICAgICAgICB9LCBjYik7XG4gICAgICB9LFxuICAgICAgdXBkYXRlUGxhY2VtZW50QXR0cjogcGxhY2VtZW50ID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcGxhY2VtZW50XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHRvZ2dsZVBvcnRhbFZpc2libGU6ICh2aXNpYmxlLCBjYikgPT4ge1xuICAgICAgICBjb25zdCB3aWxsVXBkYXRlU3RhdGVzID0ge307XG4gICAgICAgIHdpbGxVcGRhdGVTdGF0ZXMudHJhbnNpdGlvblN0YXRlID0gdmlzaWJsZSA/ICdlbnRlcicgOiAnbGVhdmUnO1xuICAgICAgICB3aWxsVXBkYXRlU3RhdGVzLnZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICB0aGlzLm1vdW50ZWQgJiYgdGhpcy5zZXRTdGF0ZSh3aWxsVXBkYXRlU3RhdGVzLCAoKSA9PiB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmVnaXN0ZXJDbGlja091dHNpZGVIYW5kbGVyOiBjYiA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmFkYXB0ZXIudW5yZWdpc3RlckNsaWNrT3V0c2lkZUhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIgPSBlID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMubW91bnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgZWwgPSB0aGlzLnRyaWdnZXJFbCAmJiB0aGlzLnRyaWdnZXJFbC5jdXJyZW50O1xuICAgICAgICAgIGxldCBwb3B1cEVsID0gdGhpcy5jb250YWluZXJFbCAmJiB0aGlzLmNvbnRhaW5lckVsLmN1cnJlbnQ7XG4gICAgICAgICAgZWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZShlbCk7XG4gICAgICAgICAgcG9wdXBFbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHBvcHVwRWwpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBlLmNvbXBvc2VkUGF0aCAmJiBlLmNvbXBvc2VkUGF0aCgpIHx8IFt0YXJnZXRdO1xuICAgICAgICAgIGNvbnN0IGlzQ2xpY2tUcmlnZ2VyVG9IaWRlID0gdGhpcy5wcm9wcy5jbGlja1RyaWdnZXJUb0hpZGUgPyBlbCAmJiBlbC5jb250YWlucyh0YXJnZXQpIHx8IHBhdGguaW5jbHVkZXMoZWwpIDogZmFsc2U7XG4gICAgICAgICAgaWYgKGVsICYmICFlbC5jb250YWlucyh0YXJnZXQpICYmIHBvcHVwRWwgJiYgIXBvcHVwRWwuY29udGFpbnModGFyZ2V0KSAmJiAhKHBhdGguaW5jbHVkZXMocG9wdXBFbCkgfHwgcGF0aC5pbmNsdWRlcyhlbCkpIHx8IGlzQ2xpY2tUcmlnZ2VyVG9IaWRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2tPdXRTaWRlKGUpO1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgfSxcbiAgICAgIHVucmVnaXN0ZXJDbGlja091dHNpZGVIYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5jbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICAgICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVnaXN0ZXJSZXNpemVIYW5kbGVyOiBjYiA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmFkYXB0ZXIudW5yZWdpc3RlclJlc2l6ZUhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2l6ZUhhbmRsZXIgPSBfdGhyb3R0bGUoZSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLm1vdW50ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2IoZSk7XG4gICAgICAgIH0sIDEwKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVzaXplSGFuZGxlciwgZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIHVucmVnaXN0ZXJSZXNpemVIYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemVIYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5yZXNpemVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG5vdGlmeVZpc2libGVDaGFuZ2U6IHZpc2libGUgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uVmlzaWJsZUNoYW5nZSh2aXNpYmxlKTtcbiAgICAgIH0sXG4gICAgICByZWdpc3RlclNjcm9sbEhhbmRsZXI6IHJlUG9zaXRpb25DYiA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbEhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmFkYXB0ZXIudW5yZWdpc3RlclNjcm9sbEhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSBfdGhyb3R0bGUoZSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLm1vdW50ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdHJpZ2dlckRPTSA9IHRoaXMuYWRhcHRlci5nZXRUcmlnZ2VyTm9kZSgpO1xuICAgICAgICAgIGNvbnN0IGlzUmVsYXRpdmVTY3JvbGwgPSBlLnRhcmdldC5jb250YWlucyh0cmlnZ2VyRE9NKTtcbiAgICAgICAgICBpZiAoaXNSZWxhdGl2ZVNjcm9sbCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsUG9zID0ge1xuICAgICAgICAgICAgICB4OiBlLnRhcmdldC5zY3JvbGxMZWZ0LFxuICAgICAgICAgICAgICB5OiBlLnRhcmdldC5zY3JvbGxUb3BcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZVBvc2l0aW9uQ2Ioc2Nyb2xsUG9zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwKTsgLy8gV2hlbiBpdCBpcyBncmVhdGVyIHRoYW4gMTZtcywgaXQgd2lsbCBiZSB2ZXJ5IG9idmlvdXNcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsSGFuZGxlciwgdHJ1ZSk7XG4gICAgICB9LFxuICAgICAgdW5yZWdpc3RlclNjcm9sbEhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsSGFuZGxlcikge1xuICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbEhhbmRsZXIsIHRydWUpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjYW5Nb3Rpb246ICgpID0+IEJvb2xlYW4odGhpcy5wcm9wcy5tb3Rpb24pLFxuICAgICAgdXBkYXRlQ29udGFpbmVyUG9zaXRpb246ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRQb3B1cENvbnRhaW5lcigpO1xuICAgICAgICBpZiAoY29udGFpbmVyICYmIGlzSFRNTEVsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICAgIC8vIGdldENvbXB1dGVkU3R5bGUgbmVlZCBmaXJzdCBwYXJhbWV0ZXIgaXMgRWxlbWVudCB0eXBlXG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJyk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXJQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGFpbmVyUG9zaXRpb246ICgpID0+IHRoaXMuY29udGFpbmVyUG9zaXRpb24sXG4gICAgICBnZXRDb250YWluZXI6ICgpID0+IHRoaXMuY29udGFpbmVyRWwgJiYgdGhpcy5jb250YWluZXJFbC5jdXJyZW50LFxuICAgICAgZ2V0VHJpZ2dlck5vZGU6ICgpID0+IHtcbiAgICAgICAgbGV0IHRyaWdnZXJET00gPSB0aGlzLnRyaWdnZXJFbC5jdXJyZW50O1xuICAgICAgICBpZiAoIWlzSFRNTEVsZW1lbnQodGhpcy50cmlnZ2VyRWwuY3VycmVudCkpIHtcbiAgICAgICAgICB0cmlnZ2VyRE9NID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcy50cmlnZ2VyRWwuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyaWdnZXJET007XG4gICAgICB9LFxuICAgICAgZ2V0Rm9jdXNhYmxlRWxlbWVudHM6IG5vZGUgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Rm9jdXNhYmxlRWxlbWVudHMobm9kZSk7XG4gICAgICB9LFxuICAgICAgZ2V0QWN0aXZlRWxlbWVudDogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0QWN0aXZlRWxlbWVudCgpO1xuICAgICAgfSxcbiAgICAgIHNldEluaXRpYWxGb2N1czogKCkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcHJldmVudFNjcm9sbFxuICAgICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgZm9jdXNSZWZOb2RlID0gX2dldCh0aGlzLCAnaW5pdGlhbEZvY3VzUmVmLmN1cnJlbnQnKTtcbiAgICAgICAgaWYgKGZvY3VzUmVmTm9kZSAmJiAnZm9jdXMnIGluIGZvY3VzUmVmTm9kZSkge1xuICAgICAgICAgIGZvY3VzUmVmTm9kZS5mb2N1cyh7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBub3RpZnlFc2NLZXlkb3duOiBldmVudCA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25Fc2NLZXlEb3duKGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBzZXRJZDogKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpZDogZ2V0VXVpZFNob3J0KClcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZ2V0VHJpZ2dlckRPTTogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50cmlnZ2VyRWwuY3VycmVudCkge1xuICAgICAgICAgIHJldHVybiBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLnRyaWdnZXJFbC5jdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgdGhpcy5nZXRQb3B1cENvbnRhaW5lciA9IHRoaXMucHJvcHMuZ2V0UG9wdXBDb250YWluZXIgfHwgdGhpcy5jb250ZXh0LmdldFBvcHVwQ29udGFpbmVyIHx8IGRlZmF1bHRHZXRDb250YWluZXI7XG4gICAgdGhpcy5mb3VuZGF0aW9uLmluaXQoKTtcbiAgICBydW5BZnRlclRpY2tzKCgpID0+IHtcbiAgICAgIGxldCB0cmlnZ2VyRWxlID0gdGhpcy50cmlnZ2VyRWwuY3VycmVudDtcbiAgICAgIGlmICh0cmlnZ2VyRWxlKSB7XG4gICAgICAgIGlmICghKHRyaWdnZXJFbGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICB0cmlnZ2VyRWxlID0gZmluZERPTU5vZGUodHJpZ2dlckVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZm91bmRhdGlvbi51cGRhdGVTdGF0ZUlmQ3Vyc29yT25UcmlnZ2VyKHRyaWdnZXJFbGUpO1xuICAgIH0sIDEpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCk7XG4gIH1cbiAgLyoqXG4gICAqIGZvY3VzIG9uIHRvb2x0aXAgdHJpZ2dlclxuICAgKi9cbiAgZm9jdXNUcmlnZ2VyKCkge1xuICAgIHRoaXMuZm91bmRhdGlvbi5mb2N1c1RyaWdnZXIoKTtcbiAgfVxuICAvKiogZm9yIHRyYW5zaXRpb24gLSBlbmQgKi9cbiAgcmVQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5mb3VuZGF0aW9uLmNhbGNQb3NpdGlvbigpO1xuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIHdhcm5pbmcodGhpcy5wcm9wcy5tb3VzZUxlYXZlRGVsYXkgPCB0aGlzLnByb3BzLm1vdXNlRW50ZXJEZWxheSwgXCJbU2VtaSBUb29sdGlwXSAnbW91c2VMZWF2ZURlbGF5JyBjYW5ub3QgYmUgbGVzcyB0aGFuICdtb3VzZUVudGVyRGVsYXknLCB3aGljaCBtYXkgY2F1c2UgdGhlIGRyb3Bkb3duIGxheWVyIHRvIG5vdCBiZSBoaWRkZW4uXCIpO1xuICAgIGlmIChwcmV2UHJvcHMudmlzaWJsZSAhPT0gdGhpcy5wcm9wcy52aXNpYmxlKSB7XG4gICAgICBpZiAoWydob3ZlcicsICdmb2N1cyddLmluY2x1ZGVzKHRoaXMucHJvcHMudHJpZ2dlcikpIHtcbiAgICAgICAgdGhpcy5wcm9wcy52aXNpYmxlID8gdGhpcy5mb3VuZGF0aW9uLmRlbGF5U2hvdygpIDogdGhpcy5mb3VuZGF0aW9uLmRlbGF5SGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9wcy52aXNpYmxlID8gdGhpcy5mb3VuZGF0aW9uLnNob3coKSA6IHRoaXMuZm91bmRhdGlvbi5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghX2lzRXF1YWwocHJldlByb3BzLnJlUG9zS2V5LCB0aGlzLnByb3BzLnJlUG9zS2V5KSkge1xuICAgICAgdGhpcy5yZVBvc2l0aW9uKCk7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc0luc2VydCxcbiAgICAgIHRyaWdnZXJFdmVudFNldCxcbiAgICAgIHZpc2libGUsXG4gICAgICBpZFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHtcbiAgICAgIHdyYXBXaGVuU3BlY2lhbCxcbiAgICAgIHJvbGUsXG4gICAgICB0cmlnZ2VyXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHtcbiAgICAgIGNoaWxkcmVuXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgY2hpbGRyZW5TdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIF9nZXQoY2hpbGRyZW4sICdwcm9wcy5zdHlsZScpKTtcbiAgICBjb25zdCBleHRyYVN0eWxlID0ge307XG4gICAgaWYgKHdyYXBXaGVuU3BlY2lhbCkge1xuICAgICAgY29uc3QgaXNTcGVjaWFsID0gdGhpcy5pc1NwZWNpYWwoY2hpbGRyZW4pO1xuICAgICAgaWYgKGlzU3BlY2lhbCkge1xuICAgICAgICBjaGlsZHJlblN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgIGlmIChpc1NwZWNpYWwgPT09IHN0cmluZ3MuU1RBVFVTX0RJU0FCTEVEKSB7XG4gICAgICAgICAgZXh0cmFTdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuID0gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgICAgICAgIHN0eWxlOiBjaGlsZHJlblN0eWxlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHJpZ2dlciAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAvLyBubyBuZWVkIHRvIHdyYXAgc3BhbiB3aGVuIHRyaWdnZXIgaXMgY3VzdG9tLCBjYXVzZSBpdCBkb24ndCBuZWVkIGJpbmQgZXZlbnRcbiAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMud3JhcFNwYW4oY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNXcmFwcGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoISAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gdGhpcy53cmFwU3BhbihjaGlsZHJlbik7XG4gICAgICAgIHRoaXMuaXNXcmFwcGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGFyaWFBdHRyaWJ1dGUgPSB7fTtcbiAgICAvLyBUYWtlIGVmZmVjdCB3aGVuIHVzZWQgYnkgUG9wb3ZlciBjb21wb25lbnRcbiAgICBpZiAocm9sZSA9PT0gJ2RpYWxvZycpIHtcbiAgICAgIGFyaWFBdHRyaWJ1dGVbJ2FyaWEtZXhwYW5kZWQnXSA9IHZpc2libGUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgYXJpYUF0dHJpYnV0ZVsnYXJpYS1oYXNwb3B1cCddID0gJ2RpYWxvZyc7XG4gICAgICBhcmlhQXR0cmlidXRlWydhcmlhLWNvbnRyb2xzJ10gPSBpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJpYUF0dHJpYnV0ZVsnYXJpYS1kZXNjcmliZWRieSddID0gaWQ7XG4gICAgfVxuICAgIC8vIFRoZSBpbmNvbWluZyBjaGlsZHJlbiBpcyBhIHNpbmdsZSB2YWxpZCBlbGVtZW50LCBvdGhlcndpc2Ugd3JhcCBhIGxheWVyIHdpdGggc3BhblxuICAgIGNvbnN0IG5ld0NoaWxkID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYXJpYUF0dHJpYnV0ZSksIGNoaWxkcmVuLnByb3BzKSwgdGhpcy5tZXJnZUV2ZW50cyhjaGlsZHJlbi5wcm9wcywgdHJpZ2dlckV2ZW50U2V0KSksIHtcbiAgICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIF9nZXQoY2hpbGRyZW4sICdwcm9wcy5zdHlsZScpKSwgZXh0cmFTdHlsZSksXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoX2dldChjaGlsZHJlbiwgJ3Byb3BzLmNsYXNzTmFtZScpKSxcbiAgICAgIC8vIHRvIG1haW50YWluIHJlZnMgd2l0aCBjYWxsYmFja1xuICAgICAgcmVmOiBub2RlID0+IHtcbiAgICAgICAgLy8gS2VlcCB5b3VyIG93biByZWZlcmVuY2VcbiAgICAgICAgdGhpcy50cmlnZ2VyRWwuY3VycmVudCA9IG5vZGU7XG4gICAgICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHJlZiwgaWYgYW55XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICByZWZcbiAgICAgICAgfSA9IGNoaWxkcmVuO1xuICAgICAgICAvLyB0aGlzLmxvZygndG9vbHRpcCByZW5kZXIoKSAtIGdldCByZWYnLCByZWYpO1xuICAgICAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlZihub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWYgJiYgdHlwZW9mIHJlZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWJJbmRleDogY2hpbGRyZW4ucHJvcHMudGFiSW5kZXggfHwgMCxcbiAgICAgICdkYXRhLXBvcHVwaWQnOiBpZFxuICAgIH0pKTtcbiAgICAvLyBJZiB5b3UgZG8gbm90IGFkZCBhIGxheWVyIG9mIGRpdiwgaW4gb3JkZXIgdG8gYmluZCB0aGUgZXZlbnRzIGFuZCBjbGFzc05hbWUgaW4gdGhlIHRvb2x0aXAsIHlvdSBuZWVkIHRvIGNsb25lRWxlbWVudCBjaGlsZHJlbiwgYnV0IHRoaXMgdGltZSBpdCBtYXkgb3ZlcndyaXRlIHRoZSBjaGlsZHJlbidzIG9yaWdpbmFsIHJlZiByZWZlcmVuY2VcbiAgICAvLyBTbyBpZiB0aGUgdXNlciBhZGRzIHJlZiB0byB0aGUgY29udGVudCwgeW91IG5lZWQgdG8gdXNlIGNhbGxiYWNrIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy84ODczXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBpc0luc2VydCA/IHRoaXMucmVuZGVyUG9ydGFsKCkgOiBudWxsLCBuZXdDaGlsZCk7XG4gIH1cbn1cblRvb2x0aXAuY29udGV4dFR5cGUgPSBDb25maWdDb250ZXh0O1xuVG9vbHRpcC5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgbW90aW9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgYXV0b0FkanVzdE92ZXJmbG93OiBQcm9wVHlwZXMuYm9vbCxcbiAgcG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihwb3NpdGlvblNldCksXG4gIGdldFBvcHVwQ29udGFpbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgbW91c2VFbnRlckRlbGF5OiBQcm9wVHlwZXMubnVtYmVyLFxuICBtb3VzZUxlYXZlRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gIHRyaWdnZXI6IFByb3BUeXBlcy5vbmVPZih0cmlnZ2VyU2V0KS5pc1JlcXVpcmVkLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHdyYXBwZXJDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsaWNrVG9IaWRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgLy8gdXNlZCB3aXRoIHRyaWdnZXIgPT09IGhvdmVyLCBwcml2YXRlXG4gIGNsaWNrVHJpZ2dlclRvSGlkZTogUHJvcFR5cGVzLmJvb2wsXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY29udGVudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5mdW5jXSksXG4gIHByZWZpeENsczogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25WaXNpYmxlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25DbGlja091dFNpZGU6IFByb3BUeXBlcy5mdW5jLFxuICBzcGFjaW5nOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBzaG93QXJyb3c6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMubm9kZV0pLFxuICB6SW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gIHJlUG9zS2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gIGFycm93Qm91bmRpbmc6IEFycm93Qm91bmRpbmdTaGFwZSxcbiAgdHJhbnNmb3JtRnJvbUNlbnRlcjogUHJvcFR5cGVzLmJvb2wsXG4gIGFycm93UG9pbnRBdENlbnRlcjogUHJvcFR5cGVzLmJvb2wsXG4gIHN0b3BQcm9wYWdhdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIC8vIHByaXZhdGVcbiAgcm9sZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgd3JhcFdoZW5TcGVjaWFsOiBQcm9wVHlwZXMuYm9vbCxcbiAgZ3VhcmRGb2N1czogUHJvcFR5cGVzLmJvb2wsXG4gIHJldHVybkZvY3VzT25DbG9zZTogUHJvcFR5cGVzLmJvb2wsXG4gIHByZXZlbnRTY3JvbGw6IFByb3BUeXBlcy5ib29sLFxuICBrZWVwRE9NOiBQcm9wVHlwZXMuYm9vbFxufTtcblRvb2x0aXAuX19TZW1pQ29tcG9uZW50TmFtZV9fID0gXCJUb29sdGlwXCI7XG5Ub29sdGlwLmRlZmF1bHRQcm9wcyA9IGdldERlZmF1bHRQcm9wc0Zyb21HbG9iYWxDb25maWcoVG9vbHRpcC5fX1NlbWlDb21wb25lbnROYW1lX18sIHtcbiAgYXJyb3dCb3VuZGluZzogbnVtYmVycy5BUlJPV19CT1VORElORyxcbiAgYXV0b0FkanVzdE92ZXJmbG93OiB0cnVlLFxuICBhcnJvd1BvaW50QXRDZW50ZXI6IHRydWUsXG4gIHRyaWdnZXI6ICdob3ZlcicsXG4gIHRyYW5zZm9ybUZyb21DZW50ZXI6IHRydWUsXG4gIHBvc2l0aW9uOiAndG9wJyxcbiAgcHJlZml4Q2xzOiBwcmVmaXgsXG4gIHJvbGU6ICd0b29sdGlwJyxcbiAgbW91c2VFbnRlckRlbGF5OiBudW1iZXJzLk1PVVNFX0VOVEVSX0RFTEFZLFxuICBtb3VzZUxlYXZlRGVsYXk6IG51bWJlcnMuTU9VU0VfTEVBVkVfREVMQVksXG4gIG1vdGlvbjogdHJ1ZSxcbiAgb25WaXNpYmxlQ2hhbmdlOiBfbm9vcCxcbiAgb25DbGlja091dFNpZGU6IF9ub29wLFxuICBzcGFjaW5nOiBudW1iZXJzLlNQQUNJTkcsXG4gIG1hcmdpbjogbnVtYmVycy5NQVJHSU4sXG4gIHNob3dBcnJvdzogdHJ1ZSxcbiAgd3JhcFdoZW5TcGVjaWFsOiB0cnVlLFxuICB6SW5kZXg6IG51bWJlcnMuREVGQVVMVF9aX0lOREVYLFxuICBjbG9zZU9uRXNjOiBmYWxzZSxcbiAgZ3VhcmRGb2N1czogZmFsc2UsXG4gIHJldHVybkZvY3VzT25DbG9zZTogZmFsc2UsXG4gIG9uRXNjS2V5RG93bjogX25vb3AsXG4gIGRpc2FibGVGb2N1c0xpc3RlbmVyOiBmYWxzZSxcbiAgZGlzYWJsZUFycm93S2V5RG93bjogZmFsc2UsXG4gIGtlZXBET006IGZhbHNlXG59KTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2FybmluZyhmbGFnLCBpbmZvKSB7XG4gIGlmIChmbGFnKSB7XG4gICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiAke2luZm99YCk7XG4gIH1cbn0iLCAiLyoqXG4gKiBXaGV0aGVyIG51bGwgb3IgdW5kZWZpbmVkXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyAge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufSIsICJpbXBvcnQgaXNOdWxsT3JVbmRlZmluZWQgZnJvbSBcIi4vaXNOdWxsT3JVbmRlZmluZWRcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZXZlbnRNYXAgPSBuZXcgTWFwKCk7XG4gIH1cbiAgb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGV2ZW50ICYmIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fZXZlbnRNYXAuaGFzKGV2ZW50KSB8fCB0aGlzLl9ldmVudE1hcC5zZXQoZXZlbnQsIFtdKTtcbiAgICAgIHRoaXMuX2V2ZW50TWFwLmdldChldmVudCkucHVzaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9uY2UoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBpZiAoZXZlbnQgJiYgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBmbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2soLi4uYXJndW1lbnRzKTtcbiAgICAgICAgX3RoaXMub2ZmKGV2ZW50LCBmbik7XG4gICAgICB9O1xuICAgICAgdGhpcy5vbihldmVudCwgZm4pO1xuICAgIH1cbiAgfVxuICBvZmYoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuX2V2ZW50TWFwLmdldChldmVudCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhbGxiYWNrcykgJiYgY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICAgIHdoaWxlICgoaW5kZXggPSBjYWxsYmFja3MuZmluZEluZGV4KGNiID0+IGNiID09PSBjYWxsYmFjaykpID4gLTEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc051bGxPclVuZGVmaW5lZChjYWxsYmFjaykpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRNYXAuZGVsZXRlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZW1pdChldmVudCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2V2ZW50TWFwLmhhcyhldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2tzID0gWy4uLnRoaXMuX2V2ZW50TWFwLmdldChldmVudCldO1xuICAgIC8vIGNsb25lIHRvIGF2b2lkIHNvbWVvbmUgd3JpdGluZyAgdGhlIGxvZ2ljIG9mIGRlbGV0aW5nIGNhbGxiYWNrIGluIGNhbGxiYWNrcyBpbnRvIGhpcyBvciBoZXIgY2FsbGJhY2sgY29kZSwgZm9yIGV4YW1wbGUgdGhlIG9uY2UgZnVuYyBhYm92ZVxuICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKC4uLmFyZ3MpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufSIsICIvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNFbGVtZW50KG9iaikge1xuICB0cnkge1xuICAgIC8vIFVzaW5nIFczIERPTTIgKHdvcmtzIGZvciBGRiwgT3BlcmEgYW5kIENocm9tZSlcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBCcm93c2VycyBub3Qgc3VwcG9ydGluZyBXMyBET00yIGRvbid0IGhhdmUgSFRNTEVsZW1lbnQgYW5kXG4gICAgLy8gYW4gZXhjZXB0aW9uIGlzIHRocm93biBhbmQgd2UgZW5kIHVwIGhlcmUuIFRlc3Rpbmcgc29tZVxuICAgIC8vIHByb3BlcnRpZXMgdGhhdCBhbGwgZWxlbWVudHMgaGF2ZSAod29ya3Mgb24gSUU3KVxuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmoubm9kZVR5cGUgPT09IDEgJiYgdHlwZW9mIG9iai5zdHlsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iai5vd25lckRvY3VtZW50ID09PSAnb2JqZWN0JztcbiAgfVxufSIsICJpbXBvcnQgaXNIVE1MRWxlbWVudCBmcm9tICcuL2lzRWxlbWVudCc7XG4vKipcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnROb2RlXG4gKiBAcGFyYW0gIHsuLi5IVE1MRWxlbWVudH0gbm9kZXNcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kKHBhcmVudE5vZGUpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG5vZGVzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBub2Rlc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChub2RlKTtcbiAgfVxuICByZXR1cm4gcGFyZW50Tm9kZTtcbn1cbi8qKlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudE5vZGVcbiAqIEBwYXJhbSAgey4uLkhUTUxFbGVtZW50fSBub2Rlc1xuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwZW5kKHBhcmVudE5vZGUpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBub2RlcyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgbm9kZXNbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cbiAgaWYgKHBhcmVudE5vZGUuY2hpbGRyZW4gJiYgcGFyZW50Tm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjb25zdCBmaXJzdE5vZGUgPSBwYXJlbnROb2RlLmNoaWxkcmVuWzBdO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgZmlyc3ROb2RlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXBwZW5kKHBhcmVudE5vZGUsIC4uLm5vZGVzKTtcbiAgfVxuICByZXR1cm4gcGFyZW50Tm9kZTtcbn1cbi8qKlxuICpcbiAqIEBwYXJhbSB7RE9NUmVjdH0gZG9tUmVjdFxuICogQHJldHVybnMge29iamVjdHx1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RE9NUmVjdFRvT2JqZWN0KGRvbVJlY3QpIHtcbiAgaWYgKGRvbVJlY3QgJiYgdHlwZW9mIGRvbVJlY3QgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKHR5cGVvZiBkb21SZWN0LnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGRvbVJlY3QudG9KU09OKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2xlZnQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICd3aWR0aCcsICdoZWlnaHQnXTtcbiAgICAgIHJldHVybiBrZXlzLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcbiAgICAgICAgb2JqW2tleV0gPSBkb21SZWN0W2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9LCB7fSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5leHBvcnQgeyBpc0hUTUxFbGVtZW50IH07IiwgImltcG9ydCBfaXNFbXB0eSBmcm9tIFwibG9kYXNoL2lzRW1wdHlcIjtcbmltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgQmFzZUZvdW5kYXRpb24gZnJvbSAnLi4vYmFzZS9mb3VuZGF0aW9uJztcbmltcG9ydCB7IGhhbmRsZVByZXZlbnQgfSBmcm9tICcuLi91dGlscy9hMTF5JztcbmNvbnN0IFJFR1MgPSB7XG4gIFRPUDogL3RvcC9pLFxuICBSSUdIVDogL3JpZ2h0L2ksXG4gIEJPVFRPTTogL2JvdHRvbS9pLFxuICBMRUZUOiAvbGVmdC9pXG59O1xuY29uc3QgZGVmYXVsdFJlY3QgPSB7XG4gIGxlZnQ6IDAsXG4gIHRvcDogMCxcbiAgaGVpZ2h0OiAwLFxuICB3aWR0aDogMCxcbiAgc2Nyb2xsTGVmdDogMCxcbiAgc2Nyb2xsVG9wOiAwXG59O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9vbHRpcCBleHRlbmRzIEJhc2VGb3VuZGF0aW9uIHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcikge1xuICAgIHZhciBfdGhpcztcbiAgICBzdXBlcihPYmplY3QuYXNzaWduKHt9LCBhZGFwdGVyKSk7XG4gICAgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMucmVtb3ZlUG9ydGFsID0gKCkgPT4ge1xuICAgICAgdGhpcy5fYWRhcHRlci5yZW1vdmVQb3J0YWwoKTtcbiAgICB9O1xuICAgIHRoaXMuc2V0RGlzcGxheU5vbmUgPSAoZGlzcGxheU5vbmUsIGNiKSA9PiB7XG4gICAgICB0aGlzLl9hZGFwdGVyLnNldERpc3BsYXlOb25lKGRpc3BsYXlOb25lLCBjYik7XG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZVN0YXRlSWZDdXJzb3JPblRyaWdnZXIgPSB0cmlnZ2VyID0+IHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICBpZiAoKF9hID0gdHJpZ2dlciA9PT0gbnVsbCB8fCB0cmlnZ2VyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0cmlnZ2VyLm1hdGNoZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHRyaWdnZXIsIFwiOmhvdmVyXCIpKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0aGlzLl9hZGFwdGVyLmdldEV2ZW50TmFtZSgpO1xuICAgICAgICBjb25zdCB0cmlnZ2VyRXZlbnRTZXQgPSB0aGlzLmdldFN0YXRlKFwidHJpZ2dlckV2ZW50U2V0XCIpO1xuICAgICAgICAoX2IgPSB0cmlnZ2VyRXZlbnRTZXRbZXZlbnROYW1lcy5tb3VzZUVudGVyXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwodHJpZ2dlckV2ZW50U2V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25SZXNpemUgPSAoKSA9PiB7XG4gICAgICAvLyB0aGlzLmxvZygncmVzaXplJyk7XG4gICAgICAvLyByZVBvc2l0aW9uIHdoZW4gd2luZG93IHJlc2l6ZVxuICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZ2V0U3RhdGUoJ3Zpc2libGUnKTtcbiAgICAgIGlmICghdmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGNQb3NpdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy5kZWxheVNob3cgPSAoKSA9PiB7XG4gICAgICBjb25zdCBtb3VzZUVudGVyRGVsYXkgPSB0aGlzLmdldFByb3AoJ21vdXNlRW50ZXJEZWxheScpO1xuICAgICAgdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcbiAgICAgIGlmIChtb3VzZUVudGVyRGVsYXkgPiAwKSB7XG4gICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcbiAgICAgICAgfSwgbW91c2VFbnRlckRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5zaG93ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2FkYXB0ZXIuZ2V0QW5pbWF0aW5nU3RhdGUoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRQcm9wKCdjb250ZW50Jyk7XG4gICAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5nZXRQcm9wKCd0cmlnZ2VyJyk7XG4gICAgICBjb25zdCBjbGlja1RyaWdnZXJUb0hpZGUgPSB0aGlzLmdldFByb3AoJ2NsaWNrVHJpZ2dlclRvSGlkZScpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBkaXNwbGF5Tm9uZVxuICAgICAgfSA9IHRoaXMuZ2V0U3RhdGVzKCk7XG4gICAgICBpZiAoZGlzcGxheU5vbmUpIHtcbiAgICAgICAgdGhpcy5zZXREaXNwbGF5Tm9uZShmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgICAgLyoqXG4gICAgICAgKiBJZiB5b3UgZW1pdCBhbiBldmVudCBpbiBzZXRTdGF0ZSBjYWxsYmFjaywgeW91IG5lZWQgdG8gcGxhY2UgdGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uIGJlZm9yZSBzZXRTdGF0ZSB0byBleGVjdXRlLlxuICAgICAgICogVGhpcyBpcyB0byBhdm9pZCBldmVudCByZWdpc3RyYXRpb24gYmVpbmcgZXhlY3V0ZWQgbGF0ZXIgdGhhbiBzZXRTdGF0ZSBjYWxsYmFjayB3aGVuIHNldFN0YXRlIGlzIGV4ZWN1dGVkIGluIHNldFRpbWVvdXQuXG4gICAgICAgKiBpbnRlcm5hbC1pc3N1ZXM6MTQwMiNub3RlXzM4OTY5NDEyXG4gICAgICAgKi9cbiAgICAgIHRoaXMuX2FkYXB0ZXIub24oJ3BvcnRhbEluc2VydGVkJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbGNQb3NpdGlvbigpO1xuICAgICAgfSk7XG4gICAgICBpZiAodHJpZ2dlciA9PT0gXCJob3ZlclwiKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrVHJpZ2dlcklzSG92ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJET00gPSB0aGlzLl9hZGFwdGVyLmdldFRyaWdnZXJET00oKTtcbiAgICAgICAgICBpZiAodHJpZ2dlciAmJiAhKChfYSA9IHRyaWdnZXJET00gPT09IG51bGwgfHwgdHJpZ2dlckRPTSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdHJpZ2dlckRPTS5tYXRjaGVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0cmlnZ2VyRE9NLCBcIjpob3ZlclwiKSkpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9hZGFwdGVyLm9mZihcInBvcnRhbEluc2VydGVkXCIsIGNoZWNrVHJpZ2dlcklzSG92ZXIpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9hZGFwdGVyLm9uKCdwb3J0YWxJbnNlcnRlZCcsIGNoZWNrVHJpZ2dlcklzSG92ZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYWRhcHRlci5vbigncG9zaXRpb25VcGRhdGVkJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl90b2dnbGVQb3J0YWxWaXNpYmxlKHRydWUpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9hZGFwdGVyLmluc2VydFBvcnRhbChjb250ZW50LCB7XG4gICAgICAgIGxlZnQ6IC05OTk5LFxuICAgICAgICB0b3A6IC05OTk5XG4gICAgICB9KTsgLy8gb2Zmc2NyZWVuIHJlbmRlcmluZ1xuICAgICAgaWYgKHRyaWdnZXIgPT09ICdjdXN0b20nKSB7XG4gICAgICAgIHRoaXMuX2FkYXB0ZXIucmVnaXN0ZXJDbGlja091dHNpZGVIYW5kbGVyKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogdHJpZ2dlclx1N0M3Qlx1NTc4Qlx1NjYyRmNsaWNrXHU2NUY2XHVGRjBDXHU0RUM1XHU1RjUzcG9ydGFsXHU4OEFCXHU2M0QyXHU1MTY1XHU2NjNFXHU3OTNBXHU1NDBFXHVGRjBDXHU2MjREXHU3RUQxXHU1QjlBY2xpY2tPdXRzaWRlSGFuZGxlclxuICAgICAgICogXHU1NkUwXHU0RTNBaGFuZGxlclx1OTcwMFx1ODk4MVx1N0VEMVx1NUI5QVx1NTcyOGRvY3VtZW50XHU0RTBBXHUzMDAyXHU1OTgyXHU2NzlDXHU1NzI4Y29uc3RydWN0b3JcdTk2MzZcdTZCQjVcdTdFRDFcdTVCOUFcbiAgICAgICAqIFx1NUY1M1x1NEUwMFx1NEUyQVx1OTg3NVx1OTc2Mlx1NEUyRFx1NjcwOVx1NTkxQVx1NEUyQVx1NUJCOVx1NTY2OFx1NUI5RVx1NEY4Qlx1NjVGNlx1RkYwQ1x1NEUwMFx1NkIyMWNsaWNrXHU0RjFBXHU4OUU2XHU1M0QxXHU1OTFBXHU0RTJBXHU1QkI5XHU1NjY4XHU3Njg0aGFuZGxlclxuICAgICAgICpcbiAgICAgICAqIFdoZW4gdGhlIHRyaWdnZXIgdHlwZSBpcyBjbGljaywgY2xpY2tPdXRzaWRlSGFuZGxlciBpcyBib3VuZCBvbmx5IGFmdGVyIHRoZSBwb3J0YWwgaXMgaW5zZXJ0ZWQgYW5kIGRpc3BsYXllZFxuICAgICAgICogQmVjYXVzZSB0aGUgaGFuZGxlciBuZWVkcyB0byBiZSBib3VuZCB0byB0aGUgZG9jdW1lbnQuIElmIHlvdSBiaW5kIGR1cmluZyB0aGUgY29uc3RydWN0b3IgcGhhc2VcbiAgICAgICAqIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGNvbnRhaW5lciBpbnN0YW5jZXMgaW4gYSBwYWdlLCBvbmUgY2xpY2sgdHJpZ2dlcnMgdGhlIGhhbmRsZXIgb2YgbXVsdGlwbGUgY29udGFpbmVyc1xuICAgICAgICovXG4gICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJyB8fCBjbGlja1RyaWdnZXJUb0hpZGUgfHwgdHJpZ2dlciA9PT0gJ2NvbnRleHRNZW51Jykge1xuICAgICAgICB0aGlzLl9hZGFwdGVyLnJlZ2lzdGVyQ2xpY2tPdXRzaWRlSGFuZGxlcih0aGlzLmhpZGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYmluZFNjcm9sbEV2ZW50KCk7XG4gICAgICB0aGlzLl9iaW5kUmVzaXplRXZlbnQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFx1ODAyNlx1NTQwOFx1NzY4NFx1NEUxQ1x1ODk3Rlx1NkJENFx1OEY4M1x1NTkxQVx1RkYwQ1x1N0EwRFx1NUZBRVx1N0Y1N1x1NTIxN1x1NEUwMFx1NEUwQlx1RkYxQVxuICAgICAqXG4gICAgICogLSBcdTY4MzlcdTYzNkUgdHJpZ2dlciBcdTU0OEMgd3JhcHBlciBcdTc2ODQgYm91bmRpbmdDbGllbnQgXHU4QkExXHU3Qjk3XHU1RjUzXHU1MjREXHU3Njg0IGxlZnRcdTMwMDF0b3BcdTMwMDF0cmFuc2Zvcm0tb3JpZ2luXG4gICAgICogLSBcdTY4MzlcdTYzNkVcdTVGNTNcdTUyNERcdTc2ODQgcG9zaXRpb24gXHU1NDhDIHdyYXBwZXIgXHU3Njg0IGJvdW5kaW5nQ2xpZW50IFx1NTFCM1x1NUI5QVx1NjYyRlx1NTQyNlx1OTcwMFx1ODk4MVx1ODFFQVx1NTJBOFx1OEMwM1x1NjU3NFx1NEY0RFx1N0Y2RVxuICAgICAqIC0gXHU2ODM5XHU2MzZFXHU1RjUzXHU1MjREXHU3Njg0IHBvc2l0aW9uXHUzMDAxdHJpZ2dlciBcdTc2ODQgYm91bmRpbmdDbGllbnQgXHU0RUU1XHU1M0NBIG1vdGlvbi5oYW5kbGVTdHlsZSBcdThDMDNcdTY1NzRcdTVGNTNcdTUyNERcdTc2ODQgc3R5bGVcbiAgICAgKlxuICAgICAqIFRoZXJlIGFyZSBtYW55IGNvdXBsaW5nIHRoaW5ncywgYSBsaXR0bGUgbGlzdDpcbiAgICAgKlxuICAgICAqIC0gY2FsY3VsYXRlIHRoZSBjdXJyZW50IGxlZnQsIHRvcCwgYW5kIHRyYW5zZmVyLW9yaWdpbiBhY2NvcmRpbmcgdG8gdGhlIGJvdW5kaW5nQ2xpZW50IG9mIHRyaWdnZXIgYW5kIHdyYXBwZXJcbiAgICAgKiAtIGRlY2lkZSB3aGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBib3VuZGluZ0NsaWVudCBvZiB3cmFwcGVyXG4gICAgICogLSBhZGp1c3QgdGhlIGN1cnJlbnQgc3R5bGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aGUgYm91bmRpbmdDbGllbnQgb2YgdHJpZ2dlciBhbmQgbW90aW9uLmhhbmRsZSBTdHlsZVxuICAgICAqL1xuICAgIHRoaXMuY2FsY1Bvc2l0aW9uID0gZnVuY3Rpb24gKHRyaWdnZXJSZWN0LCB3cmFwcGVyUmVjdCwgY29udGFpbmVyUmVjdCkge1xuICAgICAgbGV0IHNob3VsZFVwZGF0ZVBvcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgICAgIHRyaWdnZXJSZWN0ID0gKF9pc0VtcHR5KHRyaWdnZXJSZWN0KSA/IF90aGlzLl9hZGFwdGVyLmdldFRyaWdnZXJCb3VuZGluZygpIDogdHJpZ2dlclJlY3QpIHx8IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSZWN0KTtcbiAgICAgIGNvbnRhaW5lclJlY3QgPSAoX2lzRW1wdHkoY29udGFpbmVyUmVjdCkgPyBfdGhpcy5fYWRhcHRlci5nZXRQb3B1cENvbnRhaW5lclJlY3QoKSA6IGNvbnRhaW5lclJlY3QpIHx8IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSZWN0KTtcbiAgICAgIHdyYXBwZXJSZWN0ID0gKF9pc0VtcHR5KHdyYXBwZXJSZWN0KSA/IF90aGlzLl9hZGFwdGVyLmdldFdyYXBwZXJCb3VuZGluZygpIDogd3JhcHBlclJlY3QpIHx8IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSZWN0KTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdjb250YWluZXJSZWN0OiAnLCBjb250YWluZXJSZWN0LCAndHJpZ2dlclJlY3Q6ICcsIHRyaWdnZXJSZWN0LCAnd3JhcHBlclJlY3Q6ICcsIHdyYXBwZXJSZWN0KTtcbiAgICAgIGxldCBzdHlsZSA9IF90aGlzLmNhbGNQb3NTdHlsZSh7XG4gICAgICAgIHRyaWdnZXJSZWN0LFxuICAgICAgICB3cmFwcGVyUmVjdCxcbiAgICAgICAgY29udGFpbmVyUmVjdFxuICAgICAgfSk7XG4gICAgICBsZXQgcG9zaXRpb24gPSBfdGhpcy5nZXRQcm9wKCdwb3NpdGlvbicpO1xuICAgICAgaWYgKF90aGlzLmdldFByb3AoJ2F1dG9BZGp1c3RPdmVyZmxvdycpKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzdHlsZTogJywgc3R5bGUsICdcXG50cmlnZ2VyUmVjdDogJywgdHJpZ2dlclJlY3QsICdcXG53cmFwcGVyUmVjdDogJywgd3JhcHBlclJlY3QpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcG9zaXRpb246IGFkanVzdGVkUG9zLFxuICAgICAgICAgIGlzSGVpZ2h0T3ZlckZsb3csXG4gICAgICAgICAgaXNXaWR0aE92ZXJGbG93XG4gICAgICAgIH0gPSBfdGhpcy5hZGp1c3RQb3NJZk5lZWQocG9zaXRpb24sIHN0eWxlLCB0cmlnZ2VyUmVjdCwgd3JhcHBlclJlY3QsIGNvbnRhaW5lclJlY3QpO1xuICAgICAgICBpZiAocG9zaXRpb24gIT09IGFkanVzdGVkUG9zIHx8IGlzSGVpZ2h0T3ZlckZsb3cgfHwgaXNXaWR0aE92ZXJGbG93KSB7XG4gICAgICAgICAgcG9zaXRpb24gPSBhZGp1c3RlZFBvcztcbiAgICAgICAgICBzdHlsZSA9IF90aGlzLmNhbGNQb3NTdHlsZSh7XG4gICAgICAgICAgICB0cmlnZ2VyUmVjdCxcbiAgICAgICAgICAgIHdyYXBwZXJSZWN0LFxuICAgICAgICAgICAgY29udGFpbmVyUmVjdCxcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgc3BhY2luZzogbnVsbCxcbiAgICAgICAgICAgIGlzT3ZlckZsb3c6IFtpc0hlaWdodE92ZXJGbG93LCBpc1dpZHRoT3ZlckZsb3ddXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRVcGRhdGVQb3MgJiYgX3RoaXMuX21vdW50ZWQpIHtcbiAgICAgICAgLy8gdGhpcy5fYWRhcHRlci51cGRhdGVQbGFjZW1lbnRBdHRyKHN0eWxlLnBvc2l0aW9uKTtcbiAgICAgICAgX3RoaXMuX2FkYXB0ZXIuc2V0UG9zaXRpb24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSksIHtcbiAgICAgICAgICBwb3NpdGlvblxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfTtcbiAgICB0aGlzLmRlbGF5SGlkZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG1vdXNlTGVhdmVEZWxheSA9IHRoaXMuZ2V0UHJvcCgnbW91c2VMZWF2ZURlbGF5Jyk7XG4gICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgICAgaWYgKG1vdXNlTGVhdmVEZWxheSA+IDApIHtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZGVsYXlIaWRlIGZvciAnLCBtb3VzZUxlYXZlRGVsYXksICcgbXMsICcsIC4uLmFyZ3MpO1xuICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgIHRoaXMuY2xlYXJEZWxheVRpbWVyKCk7XG4gICAgICAgIH0sIG1vdXNlTGVhdmVEZWxheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuaGlkZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJEZWxheVRpbWVyKCk7XG4gICAgICB0aGlzLl90b2dnbGVQb3J0YWxWaXNpYmxlKGZhbHNlKTtcbiAgICAgIHRoaXMuX2FkYXB0ZXIub2ZmKCdwb3J0YWxJbnNlcnRlZCcpO1xuICAgICAgdGhpcy5fYWRhcHRlci5vZmYoJ3Bvc2l0aW9uVXBkYXRlZCcpO1xuICAgIH07XG4gICAgdGhpcy5oYW5kbGVDb250YWluZXJLZXlkb3duID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBndWFyZEZvY3VzLFxuICAgICAgICBjbG9zZU9uRXNjXG4gICAgICB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgICAgc3dpdGNoIChldmVudCAmJiBldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSBcIkVzY2FwZVwiOlxuICAgICAgICAgIGNsb3NlT25Fc2MgJiYgdGhpcy5faGFuZGxlRXNjS2V5RG93bihldmVudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJUYWJcIjpcbiAgICAgICAgICBpZiAoZ3VhcmRGb2N1cykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fYWRhcHRlci5nZXRDb250YWluZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gdGhpcy5fYWRhcHRlci5nZXRGb2N1c2FibGVFbGVtZW50cyhjb250YWluZXIpO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlTnVtID0gZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZU51bSkge1xuICAgICAgICAgICAgICAvLyBTaGlmdCArIFRhYiB3aWxsIG1vdmUgZm9jdXMgYmFja3dhcmRcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlQ29udGFpbmVyU2hpZnRUYWJLZXlEb3duKGZvY3VzYWJsZUVsZW1lbnRzLCBldmVudCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlQ29udGFpbmVyVGFiS2V5RG93bihmb2N1c2FibGVFbGVtZW50cywgZXZlbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICB9XG4gIGluaXQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgd3JhcHBlcklkXG4gICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICB0aGlzLl9tb3VudGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9iaW5kRXZlbnQoKTtcbiAgICB0aGlzLl9zaG91bGRTaG93KCk7XG4gICAgdGhpcy5faW5pdENvbnRhaW5lclBvc2l0aW9uKCk7XG4gICAgaWYgKCF3cmFwcGVySWQpIHtcbiAgICAgIHRoaXMuX2FkYXB0ZXIuc2V0SWQoKTtcbiAgICB9XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9tb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy51bkJpbmRFdmVudCgpO1xuICB9XG4gIF9iaW5kRXZlbnQoKSB7XG4gICAgY29uc3QgdHJpZ2dlciA9IHRoaXMuZ2V0UHJvcCgndHJpZ2dlcicpOyAvLyBnZXQgdHJpZ2dlciB0eXBlXG4gICAgY29uc3Qge1xuICAgICAgdHJpZ2dlckV2ZW50U2V0LFxuICAgICAgcG9ydGFsRXZlbnRTZXRcbiAgICB9ID0gdGhpcy5fZ2VuZXJhdGVFdmVudCh0cmlnZ2VyKTtcbiAgICB0aGlzLl9iaW5kVHJpZ2dlckV2ZW50KHRyaWdnZXJFdmVudFNldCk7XG4gICAgdGhpcy5fYmluZFBvcnRhbEV2ZW50KHBvcnRhbEV2ZW50U2V0KTtcbiAgICB0aGlzLl9iaW5kUmVzaXplRXZlbnQoKTtcbiAgfVxuICB1bkJpbmRFdmVudCgpIHtcbiAgICB0aGlzLl9hZGFwdGVyLnVucmVnaXN0ZXJDbGlja091dHNpZGVIYW5kbGVyKCk7XG4gICAgdGhpcy51bkJpbmRSZXNpemVFdmVudCgpO1xuICAgIHRoaXMudW5CaW5kU2Nyb2xsRXZlbnQoKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICB9XG4gIF9iaW5kVHJpZ2dlckV2ZW50KHRyaWdnZXJFdmVudFNldCkge1xuICAgIHRoaXMuX2FkYXB0ZXIucmVnaXN0ZXJUcmlnZ2VyRXZlbnQodHJpZ2dlckV2ZW50U2V0KTtcbiAgfVxuICBfYmluZFBvcnRhbEV2ZW50KHBvcnRhbEV2ZW50U2V0KSB7XG4gICAgdGhpcy5fYWRhcHRlci5yZWdpc3RlclBvcnRhbEV2ZW50KHBvcnRhbEV2ZW50U2V0KTtcbiAgfVxuICBfYmluZFJlc2l6ZUV2ZW50KCkge1xuICAgIHRoaXMuX2FkYXB0ZXIucmVnaXN0ZXJSZXNpemVIYW5kbGVyKHRoaXMub25SZXNpemUpO1xuICB9XG4gIHVuQmluZFJlc2l6ZUV2ZW50KCkge1xuICAgIHRoaXMuX2FkYXB0ZXIudW5yZWdpc3RlclJlc2l6ZUhhbmRsZXIodGhpcy5vblJlc2l6ZSk7XG4gIH1cbiAgX2FkanVzdFBvcygpIHtcbiAgICBsZXQgcG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgIGxldCBpc1ZlcnRpY2FsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICBsZXQgYWRqdXN0VHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogJ3JldmVyc2UnO1xuICAgIGxldCBjb25jYXRQb3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyA/IGFyZ3VtZW50c1szXSA6IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKGFkanVzdFR5cGUpIHtcbiAgICAgIGNhc2UgJ3JldmVyc2UnOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmV2ZXJzZVBvcyhwb3NpdGlvbiwgaXNWZXJ0aWNhbCk7XG4gICAgICBjYXNlICdleHBhbmQnOlxuICAgICAgICAvLyBvbmx5IGhhcHBlbnMgd2hlbiBwb3NpdGlvbiBpcyB0b3AvYm90dG9tL2xlZnQvcmlnaHRcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZFBvcyhwb3NpdGlvbiwgY29uY2F0UG9zKTtcbiAgICAgIGNhc2UgJ3JlZHVjZSc6XG4gICAgICAgIC8vIG9ubHkgaGFwcGVucyB3aGVuIHBvc2l0aW9uIG90aGVyIHRoYW4gdG9wL2JvdHRvbS9sZWZ0L3JpZ2h0XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWR1Y2VQb3MocG9zaXRpb24pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmVyc2VQb3MocG9zaXRpb24sIGlzVmVydGljYWwpO1xuICAgIH1cbiAgfVxuICBfcmV2ZXJzZVBvcygpIHtcbiAgICBsZXQgcG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgIGxldCBpc1ZlcnRpY2FsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICBpZiAoaXNWZXJ0aWNhbCkge1xuICAgICAgaWYgKFJFR1MuVE9QLnRlc3QocG9zaXRpb24pKSB7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbi5yZXBsYWNlKCd0b3AnLCAnYm90dG9tJykucmVwbGFjZSgnVG9wJywgJ0JvdHRvbScpO1xuICAgICAgfSBlbHNlIGlmIChSRUdTLkJPVFRPTS50ZXN0KHBvc2l0aW9uKSkge1xuICAgICAgICByZXR1cm4gcG9zaXRpb24ucmVwbGFjZSgnYm90dG9tJywgJ3RvcCcpLnJlcGxhY2UoJ0JvdHRvbScsICdUb3AnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFJFR1MuTEVGVC50ZXN0KHBvc2l0aW9uKSkge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uLnJlcGxhY2UoJ2xlZnQnLCAncmlnaHQnKS5yZXBsYWNlKCdMZWZ0JywgJ1JpZ2h0Jyk7XG4gICAgfSBlbHNlIGlmIChSRUdTLlJJR0hULnRlc3QocG9zaXRpb24pKSB7XG4gICAgICByZXR1cm4gcG9zaXRpb24ucmVwbGFjZSgncmlnaHQnLCAnbGVmdCcpLnJlcGxhY2UoJ1JpZ2h0JywgJ0xlZnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG4gIF9leHBhbmRQb3MoKSB7XG4gICAgbGV0IHBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgICBsZXQgY29uY2F0UG9zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHBvc2l0aW9uLmNvbmNhdChjb25jYXRQb3MpO1xuICB9XG4gIF9yZWR1Y2VQb3MoKSB7XG4gICAgbGV0IHBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgICAvLyBpZiBjdXIgcG9zaXRpb24gY29uc2lzdHMgb2YgdHdvIGRpcmVjdGlvbnMsIHJlbW92ZSB0aGUgbGFzdCBwb3NpdGlvblxuICAgIGNvbnN0IGZvdW5kID0gWydUb3AnLCAnQm90dG9tJywgJ0xlZnQnLCAnUmlnaHQnXS5maW5kKHBvcyA9PiBwb3NpdGlvbi5lbmRzV2l0aChwb3MpKTtcbiAgICByZXR1cm4gZm91bmQgPyBwb3NpdGlvbi5yZXBsYWNlKGZvdW5kLCAnJykgOiBwb3NpdGlvbjtcbiAgfVxuICBjbGVhckRlbGF5VGltZXIoKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBfZ2VuZXJhdGVFdmVudCh0eXBlcykge1xuICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0aGlzLl9hZGFwdGVyLmdldEV2ZW50TmFtZSgpO1xuICAgIGNvbnN0IHRyaWdnZXJFdmVudFNldCA9IHtcbiAgICAgIC8vIGJpbmQgZXNjIGtleWRvd24gb24gdHJpZ2dlciBmb3IgYTExeVxuICAgICAgW2V2ZW50TmFtZXMua2V5ZG93bl06IGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5faGFuZGxlVHJpZ2dlcktleWRvd24oZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgbGV0IHBvcnRhbEV2ZW50U2V0ID0ge307XG4gICAgc3dpdGNoICh0eXBlcykge1xuICAgICAgY2FzZSAnZm9jdXMnOlxuICAgICAgICB0cmlnZ2VyRXZlbnRTZXRbZXZlbnROYW1lcy5mb2N1c10gPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kZWxheVNob3coKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJpZ2dlckV2ZW50U2V0W2V2ZW50TmFtZXMuYmx1cl0gPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kZWxheUhpZGUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcG9ydGFsRXZlbnRTZXQgPSB0cmlnZ2VyRXZlbnRTZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2xpY2snOlxuICAgICAgICB0cmlnZ2VyRXZlbnRTZXRbZXZlbnROYW1lcy5jbGlja10gPSAoKSA9PiB7XG4gICAgICAgICAgLy8gdGhpcy5kZWxheVNob3coKTtcbiAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgfTtcbiAgICAgICAgcG9ydGFsRXZlbnRTZXQgPSB7fTtcbiAgICAgICAgLy8gQ2xpY2sgb3V0c2lkZSBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudCwgY2FuIG5vdCBiZSBkaXJlY3RseSB0aWVkIHRvIHRoZSB0cmlnZ2VyIEVsZW1lbnQsIG5lZWQgdG8gYmUgYm91bmQgdG8gdGhlIGRvY3VtZW50XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaG92ZXInOlxuICAgICAgICB0cmlnZ2VyRXZlbnRTZXRbZXZlbnROYW1lcy5tb3VzZUVudGVyXSA9ICgpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICB0aGlzLnNldENhY2hlKCdpc0NsaWNrVG9IaWRlJywgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuZGVsYXlTaG93KCk7XG4gICAgICAgICAgLy8gdGhpcy5zaG93KCd0cmlnZ2VyJyk7XG4gICAgICAgIH07XG4gICAgICAgIHRyaWdnZXJFdmVudFNldFtldmVudE5hbWVzLm1vdXNlTGVhdmVdID0gKCkgPT4ge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgIHRoaXMuZGVsYXlIaWRlKCk7XG4gICAgICAgICAgLy8gdGhpcy5oaWRlKCd0cmlnZ2VyJyk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGJpbmQgZm9jdXMgdG8gaG92ZXIgdHJpZ2dlciBmb3IgYTExeVxuICAgICAgICB0cmlnZ2VyRXZlbnRTZXRbZXZlbnROYW1lcy5mb2N1c10gPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZGlzYWJsZUZvY3VzTGlzdGVuZXJcbiAgICAgICAgICB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgICAgICAgICFkaXNhYmxlRm9jdXNMaXN0ZW5lciAmJiB0aGlzLmRlbGF5U2hvdygpO1xuICAgICAgICB9O1xuICAgICAgICB0cmlnZ2VyRXZlbnRTZXRbZXZlbnROYW1lcy5ibHVyXSA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkaXNhYmxlRm9jdXNMaXN0ZW5lclxuICAgICAgICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgICAgICAgIWRpc2FibGVGb2N1c0xpc3RlbmVyICYmIHRoaXMuZGVsYXlIaWRlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnRhbEV2ZW50U2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgdHJpZ2dlckV2ZW50U2V0KTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0UHJvcCgnY2xpY2tUb0hpZGUnKSkge1xuICAgICAgICAgIHBvcnRhbEV2ZW50U2V0W2V2ZW50TmFtZXMuY2xpY2tdID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRDYWNoZSgnaXNDbGlja1RvSGlkZScsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBwb3J0YWxFdmVudFNldFtldmVudE5hbWVzLm1vdXNlRW50ZXJdID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q2FjaGUoJ2lzQ2xpY2tUb0hpZGUnKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlbGF5U2hvdygpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjdXN0b20nOlxuICAgICAgICAvLyB3aGVuIHRyaWdnZXIgdHlwZSBpcyAnY3VzdG9tJywgbm8gbmVlZCB0byBiaW5kIGV2ZW50SGFuZGxlclxuICAgICAgICAvLyBzaG93L2hpZGUgY29tcGxldGVseSBkZXBlbmQgb24gcHJvcHMudmlzaWJsZSB3aGljaCBjaGFuZ2UgYnkgdXNlclxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbnRleHRNZW51JzpcbiAgICAgICAgdHJpZ2dlckV2ZW50U2V0W2V2ZW50TmFtZXMuY29udGV4dE1lbnVdID0gZSA9PiB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBDbGljayBvdXRzaWRlIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LCBjYW4gbm90IGJlIGRpcmVjdGx5IHRpZWQgdG8gdGhlIHRyaWdnZXIgRWxlbWVudCwgbmVlZCB0byBiZSBib3VuZCB0byB0aGUgZG9jdW1lbnRcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyaWdnZXJFdmVudFNldCxcbiAgICAgIHBvcnRhbEV2ZW50U2V0XG4gICAgfTtcbiAgfVxuICBfc2hvdWxkU2hvdygpIHtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5nZXRQcm9wKCd2aXNpYmxlJyk7XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLmhpZGUoKTtcbiAgICB9XG4gIH1cbiAgX3RvZ2dsZVBvcnRhbFZpc2libGUoaXNWaXNpYmxlKSB7XG4gICAgY29uc3Qgbm93VmlzaWJsZSA9IHRoaXMuZ2V0U3RhdGUoJ3Zpc2libGUnKTtcbiAgICBjb25zdCBpc0luc2VydCA9IHRoaXMuZ2V0U3RhdGUoXCJpc0luc2VydFwiKTtcbiAgICBpZiAobm93VmlzaWJsZSAhPT0gaXNWaXNpYmxlIHx8IGlzSW5zZXJ0ICE9PSBpc1Zpc2libGUpIHtcbiAgICAgIHRoaXMuX2FkYXB0ZXIudG9nZ2xlUG9ydGFsVmlzaWJsZShpc1Zpc2libGUsICgpID0+IHtcbiAgICAgICAgaWYgKGlzVmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuc2V0SW5pdGlhbEZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWRhcHRlci5ub3RpZnlWaXNpYmxlQ2hhbmdlKGlzVmlzaWJsZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgX3JvdW5kUGl4ZWwocGl4ZWwpIHtcbiAgICBpZiAodHlwZW9mIHBpeGVsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQocGl4ZWwpO1xuICAgIH1cbiAgICByZXR1cm4gcGl4ZWw7XG4gIH1cbiAgY2FsY1RyYW5zZm9ybU9yaWdpbihwb3NpdGlvbiwgdHJpZ2dlclJlY3QsIHRyYW5zbGF0ZVgsIHRyYW5zbGF0ZVkpIHtcbiAgICBpZiAocG9zaXRpb24gJiYgdHJpZ2dlclJlY3QgJiYgdHJhbnNsYXRlWCAhPSBudWxsICYmIHRyYW5zbGF0ZVkgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuZ2V0UHJvcCgndHJhbnNmb3JtRnJvbUNlbnRlcicpKSB7XG4gICAgICAgIGlmIChbJ3RvcExlZnQnLCAnYm90dG9tTGVmdCddLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBgJHt0aGlzLl9yb3VuZFBpeGVsKHRyaWdnZXJSZWN0LndpZHRoIC8gMil9cHggJHstdHJhbnNsYXRlWSAqIDEwMH0lYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoWyd0b3BSaWdodCcsICdib3R0b21SaWdodCddLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBgY2FsYygxMDAlIC0gJHt0aGlzLl9yb3VuZFBpeGVsKHRyaWdnZXJSZWN0LndpZHRoIC8gMil9cHgpICR7LXRyYW5zbGF0ZVkgKiAxMDB9JWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFsnbGVmdFRvcCcsICdyaWdodFRvcCddLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBgJHstdHJhbnNsYXRlWCAqIDEwMH0lICR7dGhpcy5fcm91bmRQaXhlbCh0cmlnZ2VyUmVjdC5oZWlnaHQgLyAyKX1weGA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFsnbGVmdEJvdHRvbScsICdyaWdodEJvdHRvbSddLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBgJHstdHJhbnNsYXRlWCAqIDEwMH0lIGNhbGMoMTAwJSAtICR7dGhpcy5fcm91bmRQaXhlbCh0cmlnZ2VyUmVjdC5oZWlnaHQgLyAyKX1weClgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7LXRyYW5zbGF0ZVggKiAxMDB9JSAkey10cmFuc2xhdGVZICogMTAwfSVgO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjYWxjUG9zU3R5bGUocHJvcHMpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qge1xuICAgICAgc3BhY2luZyxcbiAgICAgIGlzT3ZlckZsb3dcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3Qge1xuICAgICAgaW5uZXJXaWR0aFxuICAgIH0gPSB3aW5kb3c7XG4gICAgY29uc3QgdHJpZ2dlclJlY3QgPSAoX2lzRW1wdHkocHJvcHMudHJpZ2dlclJlY3QpID8gcHJvcHMudHJpZ2dlclJlY3QgOiB0aGlzLl9hZGFwdGVyLmdldFRyaWdnZXJCb3VuZGluZygpKSB8fCBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UmVjdCk7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IChfaXNFbXB0eShwcm9wcy5jb250YWluZXJSZWN0KSA/IHByb3BzLmNvbnRhaW5lclJlY3QgOiB0aGlzLl9hZGFwdGVyLmdldFBvcHVwQ29udGFpbmVyUmVjdCgpKSB8fCBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UmVjdCk7XG4gICAgY29uc3Qgd3JhcHBlclJlY3QgPSAoX2lzRW1wdHkocHJvcHMud3JhcHBlclJlY3QpID8gcHJvcHMud3JhcHBlclJlY3QgOiB0aGlzLl9hZGFwdGVyLmdldFdyYXBwZXJCb3VuZGluZygpKSB8fCBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UmVjdCk7XG4gICAgY29uc3QgcG9zaXRpb24gPSBwcm9wcy5wb3NpdGlvbiAhPSBudWxsID8gcHJvcHMucG9zaXRpb24gOiB0aGlzLmdldFByb3AoJ3Bvc2l0aW9uJyk7XG4gICAgY29uc3QgUkFXX1NQQUNJTkcgPSBzcGFjaW5nICE9IG51bGwgPyBzcGFjaW5nIDogdGhpcy5nZXRQcm9wKCdzcGFjaW5nJyk7XG4gICAgY29uc3Qge1xuICAgICAgYXJyb3dQb2ludEF0Q2VudGVyLFxuICAgICAgc2hvd0Fycm93LFxuICAgICAgYXJyb3dCb3VuZGluZ1xuICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgY29uc3QgcG9pbnRBdENlbnRlciA9IHNob3dBcnJvdyAmJiBhcnJvd1BvaW50QXRDZW50ZXI7XG4gICAgbGV0IFNQQUNJTkcgPSBSQVdfU1BBQ0lORztcbiAgICBsZXQgQU5PX1NQQUNJTkcgPSAwO1xuICAgIGlmICh0eXBlb2YgUkFXX1NQQUNJTkcgIT09ICdudW1iZXInKSB7XG4gICAgICAvLyBleHRlbmRlZCBzcGFjaW5nIGFwaSB3aXRoIHt4OiBudW1iZXIsIHk6IG51bWJlcn0sIHRoZSBheGVzIG9mIHRoZSBzcGFjaW5nIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIHBvc2l0aW9uXG4gICAgICBjb25zdCBpc1RvcE9yQm90dG9tID0gcG9zaXRpb24uaW5jbHVkZXMoJ3RvcCcpIHx8IHBvc2l0aW9uLmluY2x1ZGVzKCdib3R0b20nKTtcbiAgICAgIFNQQUNJTkcgPSBpc1RvcE9yQm90dG9tID8gUkFXX1NQQUNJTkcueSA6IFJBV19TUEFDSU5HLng7XG4gICAgICBBTk9fU1BBQ0lORyA9IGlzVG9wT3JCb3R0b20gPyBSQVdfU1BBQ0lORy54IDogUkFXX1NQQUNJTkcueTtcbiAgICB9XG4gICAgY29uc3QgaG9yaXpvbnRhbEFycm93V2lkdGggPSBfZ2V0KGFycm93Qm91bmRpbmcsICd3aWR0aCcsIDI0KTtcbiAgICBjb25zdCB2ZXJ0aWNhbEFycm93SGVpZ2h0ID0gX2dldChhcnJvd0JvdW5kaW5nLCAnd2lkdGgnLCAyNCk7XG4gICAgY29uc3QgYXJyb3dPZmZzZXRZID0gX2dldChhcnJvd0JvdW5kaW5nLCAnb2Zmc2V0WScsIDApO1xuICAgIGNvbnN0IHBvc2l0aW9uT2Zmc2V0WCA9IDY7XG4gICAgY29uc3QgcG9zaXRpb25PZmZzZXRZID0gNjtcbiAgICAvLyBZb3UgbXVzdCB1c2UgbGVmdC90b3Agd2hlbiByZW5kZXJpbmcsIHVzaW5nIHJpZ2h0L2JvdHRvbSBkb2VzIG5vdCByZW5kZXIgdGhlIGVsZW1lbnQgcG9zaXRpb24gY29ycmVjdGx5XG4gICAgLy8gVXNlIGxlZnQvdG9wICsgdHJhbnNsYXRlIHRvIGFjaGlldmUgdG9vbHRpcCBwb3NpdGlvbmluZyBwZXJmZWN0bHkgd2l0aG91dCBrbm93aW5nIHRoZSBzaXplIG9mIHRoZSB0b29sdGlwIGV4cGFuc2lvbiBsYXllclxuICAgIGxldCBsZWZ0O1xuICAgIGxldCB0b3A7XG4gICAgbGV0IHRyYW5zbGF0ZVggPSAwOyAvLyBDb250YWluZXIgeC1kaXJlY3Rpb24gdHJhbnNsYXRpb24gZGlzdGFuY2VcbiAgICBsZXQgdHJhbnNsYXRlWSA9IDA7IC8vIENvbnRhaW5lciB5LWRpcmVjdGlvbiB0cmFuc2xhdGlvbiBkaXN0YW5jZVxuICAgIGNvbnN0IG1pZGRsZVggPSB0cmlnZ2VyUmVjdC5sZWZ0ICsgdHJpZ2dlclJlY3Qud2lkdGggLyAyO1xuICAgIGNvbnN0IG1pZGRsZVkgPSB0cmlnZ2VyUmVjdC50b3AgKyB0cmlnZ2VyUmVjdC5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IG9mZnNldFhXaXRoQXJyb3cgPSBwb3NpdGlvbk9mZnNldFggKyBob3Jpem9udGFsQXJyb3dXaWR0aCAvIDI7XG4gICAgY29uc3Qgb2Zmc2V0WVdpdGhBcnJvdyA9IHBvc2l0aW9uT2Zmc2V0WSArIHZlcnRpY2FsQXJyb3dIZWlnaHQgLyAyO1xuICAgIGNvbnN0IGhlaWdodERpZmZlcmVuY2UgPSB3cmFwcGVyUmVjdC5oZWlnaHQgLSBjb250YWluZXJSZWN0LmhlaWdodDtcbiAgICBjb25zdCB3aWR0aERpZmZlcmVuY2UgPSB3cmFwcGVyUmVjdC53aWR0aCAtIGNvbnRhaW5lclJlY3Qud2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0SGVpZ2h0ID0gaGVpZ2h0RGlmZmVyZW5jZSA+IDAgPyBoZWlnaHREaWZmZXJlbmNlIDogMDtcbiAgICBjb25zdCBvZmZzZXRXaWR0aCA9IHdpZHRoRGlmZmVyZW5jZSA+IDAgPyB3aWR0aERpZmZlcmVuY2UgOiAwO1xuICAgIGNvbnN0IGlzSGVpZ2h0T3ZlckZsb3cgPSBpc092ZXJGbG93ICYmIGlzT3ZlckZsb3dbMF07XG4gICAgY29uc3QgaXNXaWR0aE92ZXJGbG93ID0gaXNPdmVyRmxvdyAmJiBpc092ZXJGbG93WzFdO1xuICAgIGNvbnN0IGlzVHJpZ2dlck5lYXJMZWZ0ID0gbWlkZGxlWCAtIGNvbnRhaW5lclJlY3QubGVmdCA8IGNvbnRhaW5lclJlY3QucmlnaHQgLSBtaWRkbGVYO1xuICAgIGNvbnN0IGlzVHJpZ2dlck5lYXJUb3AgPSBtaWRkbGVZIC0gY29udGFpbmVyUmVjdC50b3AgPCBjb250YWluZXJSZWN0LmJvdHRvbSAtIG1pZGRsZVk7XG4gICAgY29uc3QgaXNXcmFwcGVyV2lkdGhPdmVyZmxvdyA9IHdyYXBwZXJSZWN0LndpZHRoID4gaW5uZXJXaWR0aDtcbiAgICBjb25zdCBzY2FsZWQgPSBNYXRoLmFicygod3JhcHBlclJlY3QgPT09IG51bGwgfHwgd3JhcHBlclJlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdyYXBwZXJSZWN0LndpZHRoKSAtICgoX2EgPSB0aGlzLl9hZGFwdGVyLmdldENvbnRhaW5lcigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xpZW50V2lkdGgpKSA+IDE7XG4gICAgaWYgKHNjYWxlZCkge1xuICAgICAgU1BBQ0lORyA9IFNQQUNJTkcgKiB3cmFwcGVyUmVjdC53aWR0aCAvIHRoaXMuX2FkYXB0ZXIuZ2V0Q29udGFpbmVyKCkuY2xpZW50V2lkdGg7XG4gICAgfVxuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIC8vIGxlZnQgPSBtaWRkbGVYO1xuICAgICAgICAvLyB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgLSBTUEFDSU5HO1xuICAgICAgICBsZWZ0ID0gaXNXaWR0aE92ZXJGbG93ID8gaXNUcmlnZ2VyTmVhckxlZnQgPyBjb250YWluZXJSZWN0LmxlZnQgKyB3cmFwcGVyUmVjdC53aWR0aCAvIDIgOiBjb250YWluZXJSZWN0LnJpZ2h0IC0gd3JhcHBlclJlY3Qud2lkdGggLyAyICsgb2Zmc2V0V2lkdGggOiBtaWRkbGVYICsgQU5PX1NQQUNJTkc7XG4gICAgICAgIHRvcCA9IGlzSGVpZ2h0T3ZlckZsb3cgPyBjb250YWluZXJSZWN0LmJvdHRvbSArIG9mZnNldEhlaWdodCA6IHRyaWdnZXJSZWN0LnRvcCAtIFNQQUNJTkc7XG4gICAgICAgIHRyYW5zbGF0ZVggPSAtMC41O1xuICAgICAgICB0cmFuc2xhdGVZID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICAgIC8vIGxlZnQgPSBwb2ludEF0Q2VudGVyID8gbWlkZGxlWCAtIG9mZnNldFhXaXRoQXJyb3cgOiB0cmlnZ2VyUmVjdC5sZWZ0O1xuICAgICAgICAvLyB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgLSBTUEFDSU5HO1xuICAgICAgICBsZWZ0ID0gaXNXaWR0aE92ZXJGbG93ID8gaXNXcmFwcGVyV2lkdGhPdmVyZmxvdyA/IGNvbnRhaW5lclJlY3QubGVmdCA6IGNvbnRhaW5lclJlY3QucmlnaHQgLSB3cmFwcGVyUmVjdC53aWR0aCA6IHBvaW50QXRDZW50ZXIgPyBtaWRkbGVYIC0gb2Zmc2V0WFdpdGhBcnJvdyArIEFOT19TUEFDSU5HIDogdHJpZ2dlclJlY3QubGVmdCArIEFOT19TUEFDSU5HO1xuICAgICAgICB0b3AgPSBpc0hlaWdodE92ZXJGbG93ID8gY29udGFpbmVyUmVjdC5ib3R0b20gKyBvZmZzZXRIZWlnaHQgOiB0cmlnZ2VyUmVjdC50b3AgLSBTUEFDSU5HO1xuICAgICAgICB0cmFuc2xhdGVZID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgICAvLyBsZWZ0ID0gcG9pbnRBdENlbnRlciA/IG1pZGRsZVggKyBvZmZzZXRYV2l0aEFycm93IDogdHJpZ2dlclJlY3QucmlnaHQ7XG4gICAgICAgIC8vIHRvcCA9IHRyaWdnZXJSZWN0LnRvcCAtIFNQQUNJTkc7XG4gICAgICAgIGxlZnQgPSBpc1dpZHRoT3ZlckZsb3cgPyBjb250YWluZXJSZWN0LnJpZ2h0ICsgb2Zmc2V0V2lkdGggOiBwb2ludEF0Q2VudGVyID8gbWlkZGxlWCArIG9mZnNldFhXaXRoQXJyb3cgKyBBTk9fU1BBQ0lORyA6IHRyaWdnZXJSZWN0LnJpZ2h0ICsgQU5PX1NQQUNJTkc7XG4gICAgICAgIHRvcCA9IGlzSGVpZ2h0T3ZlckZsb3cgPyBjb250YWluZXJSZWN0LmJvdHRvbSArIG9mZnNldEhlaWdodCA6IHRyaWdnZXJSZWN0LnRvcCAtIFNQQUNJTkc7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSAtMTtcbiAgICAgICAgdHJhbnNsYXRlWCA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAvLyBsZWZ0ID0gdHJpZ2dlclJlY3QubGVmdCAtIFNQQUNJTkc7XG4gICAgICAgIC8vIHRvcCA9IG1pZGRsZVk7XG4gICAgICAgIC8vIGxlZnQgPSBpc1dpZHRoT3ZlckZsb3c/IGNvbnRhaW5lclJlY3QucmlnaHQgLSBTUEFDSU5HIDogdHJpZ2dlclJlY3QubGVmdCAtIFNQQUNJTkc7XG4gICAgICAgIGxlZnQgPSBpc1dpZHRoT3ZlckZsb3cgPyBjb250YWluZXJSZWN0LnJpZ2h0ICsgb2Zmc2V0V2lkdGggLSBTUEFDSU5HICsgb2Zmc2V0WFdpdGhBcnJvdyA6IHRyaWdnZXJSZWN0LmxlZnQgLSBTUEFDSU5HO1xuICAgICAgICB0b3AgPSBpc0hlaWdodE92ZXJGbG93ID8gaXNUcmlnZ2VyTmVhclRvcCA/IGNvbnRhaW5lclJlY3QudG9wICsgd3JhcHBlclJlY3QuaGVpZ2h0IC8gMiA6IGNvbnRhaW5lclJlY3QuYm90dG9tIC0gd3JhcHBlclJlY3QuaGVpZ2h0IC8gMiArIG9mZnNldEhlaWdodCA6IG1pZGRsZVkgKyBBTk9fU1BBQ0lORztcbiAgICAgICAgdHJhbnNsYXRlWCA9IC0xO1xuICAgICAgICB0cmFuc2xhdGVZID0gLTAuNTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0VG9wJzpcbiAgICAgICAgLy8gbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQgLSBTUEFDSU5HO1xuICAgICAgICAvLyB0b3AgPSBwb2ludEF0Q2VudGVyID8gbWlkZGxlWSAtIG9mZnNldFlXaXRoQXJyb3cgOiB0cmlnZ2VyUmVjdC50b3A7XG4gICAgICAgIGxlZnQgPSBpc1dpZHRoT3ZlckZsb3cgPyBjb250YWluZXJSZWN0LnJpZ2h0ICsgb2Zmc2V0V2lkdGggLSBTUEFDSU5HICsgb2Zmc2V0WFdpdGhBcnJvdyA6IHRyaWdnZXJSZWN0LmxlZnQgLSBTUEFDSU5HO1xuICAgICAgICB0b3AgPSBpc0hlaWdodE92ZXJGbG93ID8gY29udGFpbmVyUmVjdC50b3AgOiBwb2ludEF0Q2VudGVyID8gbWlkZGxlWSAtIG9mZnNldFlXaXRoQXJyb3cgKyBBTk9fU1BBQ0lORyA6IHRyaWdnZXJSZWN0LnRvcCArIEFOT19TUEFDSU5HO1xuICAgICAgICB0cmFuc2xhdGVYID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdEJvdHRvbSc6XG4gICAgICAgIC8vIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0IC0gU1BBQ0lORztcbiAgICAgICAgLy8gdG9wID0gcG9pbnRBdENlbnRlciA/IG1pZGRsZVkgKyBvZmZzZXRZV2l0aEFycm93IDogdHJpZ2dlclJlY3QuYm90dG9tO1xuICAgICAgICBsZWZ0ID0gaXNXaWR0aE92ZXJGbG93ID8gY29udGFpbmVyUmVjdC5yaWdodCArIG9mZnNldFdpZHRoIC0gU1BBQ0lORyArIG9mZnNldFhXaXRoQXJyb3cgOiB0cmlnZ2VyUmVjdC5sZWZ0IC0gU1BBQ0lORztcbiAgICAgICAgdG9wID0gaXNIZWlnaHRPdmVyRmxvdyA/IGNvbnRhaW5lclJlY3QuYm90dG9tICsgb2Zmc2V0SGVpZ2h0IDogcG9pbnRBdENlbnRlciA/IG1pZGRsZVkgKyBvZmZzZXRZV2l0aEFycm93ICsgQU5PX1NQQUNJTkcgOiB0cmlnZ2VyUmVjdC5ib3R0b20gKyBBTk9fU1BBQ0lORztcbiAgICAgICAgdHJhbnNsYXRlWCA9IC0xO1xuICAgICAgICB0cmFuc2xhdGVZID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgLy8gbGVmdCA9IG1pZGRsZVg7XG4gICAgICAgIC8vIHRvcCA9IHRyaWdnZXJSZWN0LnRvcCArIHRyaWdnZXJSZWN0LmhlaWdodCArIFNQQUNJTkc7XG4gICAgICAgIGxlZnQgPSBpc1dpZHRoT3ZlckZsb3cgPyBpc1RyaWdnZXJOZWFyTGVmdCA/IGNvbnRhaW5lclJlY3QubGVmdCArIHdyYXBwZXJSZWN0LndpZHRoIC8gMiA6IGNvbnRhaW5lclJlY3QucmlnaHQgLSB3cmFwcGVyUmVjdC53aWR0aCAvIDIgKyBvZmZzZXRXaWR0aCA6IG1pZGRsZVggKyBBTk9fU1BBQ0lORztcbiAgICAgICAgdG9wID0gaXNIZWlnaHRPdmVyRmxvdyA/IGNvbnRhaW5lclJlY3QudG9wICsgb2Zmc2V0WVdpdGhBcnJvdyAtIFNQQUNJTkcgOiB0cmlnZ2VyUmVjdC50b3AgKyB0cmlnZ2VyUmVjdC5oZWlnaHQgKyBTUEFDSU5HO1xuICAgICAgICB0cmFuc2xhdGVYID0gLTAuNTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgICAgLy8gbGVmdCA9IHBvaW50QXRDZW50ZXIgPyBtaWRkbGVYIC0gb2Zmc2V0WFdpdGhBcnJvdyA6IHRyaWdnZXJSZWN0LmxlZnQ7XG4gICAgICAgIC8vIHRvcCA9IHRyaWdnZXJSZWN0LmJvdHRvbSArIFNQQUNJTkc7XG4gICAgICAgIGxlZnQgPSBpc1dpZHRoT3ZlckZsb3cgPyBpc1dyYXBwZXJXaWR0aE92ZXJmbG93ID8gY29udGFpbmVyUmVjdC5sZWZ0IDogY29udGFpbmVyUmVjdC5yaWdodCAtIHdyYXBwZXJSZWN0LndpZHRoIDogcG9pbnRBdENlbnRlciA/IG1pZGRsZVggLSBvZmZzZXRYV2l0aEFycm93ICsgQU5PX1NQQUNJTkcgOiB0cmlnZ2VyUmVjdC5sZWZ0ICsgQU5PX1NQQUNJTkc7XG4gICAgICAgIHRvcCA9IGlzSGVpZ2h0T3ZlckZsb3cgPyBjb250YWluZXJSZWN0LnRvcCArIG9mZnNldFlXaXRoQXJyb3cgLSBTUEFDSU5HIDogdHJpZ2dlclJlY3QudG9wICsgdHJpZ2dlclJlY3QuaGVpZ2h0ICsgU1BBQ0lORztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b21SaWdodCc6XG4gICAgICAgIC8vIGxlZnQgPSBwb2ludEF0Q2VudGVyID8gbWlkZGxlWCArIG9mZnNldFhXaXRoQXJyb3cgOiB0cmlnZ2VyUmVjdC5yaWdodDtcbiAgICAgICAgLy8gdG9wID0gdHJpZ2dlclJlY3QuYm90dG9tICsgU1BBQ0lORztcbiAgICAgICAgbGVmdCA9IGlzV2lkdGhPdmVyRmxvdyA/IGNvbnRhaW5lclJlY3QucmlnaHQgKyBvZmZzZXRXaWR0aCA6IHBvaW50QXRDZW50ZXIgPyBtaWRkbGVYICsgb2Zmc2V0WFdpdGhBcnJvdyArIEFOT19TUEFDSU5HIDogdHJpZ2dlclJlY3QucmlnaHQgKyBBTk9fU1BBQ0lORztcbiAgICAgICAgdG9wID0gaXNIZWlnaHRPdmVyRmxvdyA/IGNvbnRhaW5lclJlY3QudG9wICsgb2Zmc2V0WVdpdGhBcnJvdyAtIFNQQUNJTkcgOiB0cmlnZ2VyUmVjdC50b3AgKyB0cmlnZ2VyUmVjdC5oZWlnaHQgKyBTUEFDSU5HO1xuICAgICAgICB0cmFuc2xhdGVYID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAvLyBsZWZ0ID0gdHJpZ2dlclJlY3QucmlnaHQgKyBTUEFDSU5HO1xuICAgICAgICAvLyB0b3AgPSBtaWRkbGVZO1xuICAgICAgICBsZWZ0ID0gaXNXaWR0aE92ZXJGbG93ID8gY29udGFpbmVyUmVjdC5sZWZ0IC0gU1BBQ0lORyArIG9mZnNldFhXaXRoQXJyb3cgOiB0cmlnZ2VyUmVjdC5yaWdodCArIFNQQUNJTkc7XG4gICAgICAgIHRvcCA9IGlzSGVpZ2h0T3ZlckZsb3cgPyBpc1RyaWdnZXJOZWFyVG9wID8gY29udGFpbmVyUmVjdC50b3AgKyB3cmFwcGVyUmVjdC5oZWlnaHQgLyAyIDogY29udGFpbmVyUmVjdC5ib3R0b20gLSB3cmFwcGVyUmVjdC5oZWlnaHQgLyAyICsgb2Zmc2V0SGVpZ2h0IDogbWlkZGxlWSArIEFOT19TUEFDSU5HO1xuICAgICAgICB0cmFuc2xhdGVZID0gLTAuNTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaWdodFRvcCc6XG4gICAgICAgIC8vIGxlZnQgPSB0cmlnZ2VyUmVjdC5yaWdodCArIFNQQUNJTkc7XG4gICAgICAgIC8vIHRvcCA9IHBvaW50QXRDZW50ZXIgPyBtaWRkbGVZIC0gb2Zmc2V0WVdpdGhBcnJvdyA6IHRyaWdnZXJSZWN0LnRvcDtcbiAgICAgICAgbGVmdCA9IGlzV2lkdGhPdmVyRmxvdyA/IGNvbnRhaW5lclJlY3QubGVmdCAtIFNQQUNJTkcgKyBvZmZzZXRYV2l0aEFycm93IDogdHJpZ2dlclJlY3QucmlnaHQgKyBTUEFDSU5HO1xuICAgICAgICB0b3AgPSBpc0hlaWdodE92ZXJGbG93ID8gY29udGFpbmVyUmVjdC50b3AgOiBwb2ludEF0Q2VudGVyID8gbWlkZGxlWSAtIG9mZnNldFlXaXRoQXJyb3cgKyBBTk9fU1BBQ0lORyA6IHRyaWdnZXJSZWN0LnRvcCArIEFOT19TUEFDSU5HO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0Qm90dG9tJzpcbiAgICAgICAgLy8gbGVmdCA9IHRyaWdnZXJSZWN0LnJpZ2h0ICsgU1BBQ0lORztcbiAgICAgICAgLy8gdG9wID0gcG9pbnRBdENlbnRlciA/IG1pZGRsZVkgKyBvZmZzZXRZV2l0aEFycm93IDogdHJpZ2dlclJlY3QuYm90dG9tO1xuICAgICAgICBsZWZ0ID0gaXNXaWR0aE92ZXJGbG93ID8gY29udGFpbmVyUmVjdC5sZWZ0IC0gU1BBQ0lORyArIG9mZnNldFhXaXRoQXJyb3cgOiB0cmlnZ2VyUmVjdC5yaWdodCArIFNQQUNJTkc7XG4gICAgICAgIHRvcCA9IGlzSGVpZ2h0T3ZlckZsb3cgPyBjb250YWluZXJSZWN0LmJvdHRvbSArIG9mZnNldEhlaWdodCA6IHBvaW50QXRDZW50ZXIgPyBtaWRkbGVZICsgb2Zmc2V0WVdpdGhBcnJvdyArIEFOT19TUEFDSU5HIDogdHJpZ2dlclJlY3QuYm90dG9tICsgQU5PX1NQQUNJTkc7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0VG9wT3Zlcic6XG4gICAgICAgIGxlZnQgPSB0cmlnZ2VyUmVjdC5sZWZ0IC0gU1BBQ0lORztcbiAgICAgICAgdG9wID0gdHJpZ2dlclJlY3QudG9wIC0gU1BBQ0lORztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaWdodFRvcE92ZXInOlxuICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QucmlnaHQgKyBTUEFDSU5HO1xuICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgLSBTUEFDSU5HO1xuICAgICAgICB0cmFuc2xhdGVYID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdEJvdHRvbU92ZXInOlxuICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QubGVmdCAtIFNQQUNJTkc7XG4gICAgICAgIHRvcCA9IHRyaWdnZXJSZWN0LmJvdHRvbSArIFNQQUNJTkc7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaWdodEJvdHRvbU92ZXInOlxuICAgICAgICBsZWZ0ID0gdHJpZ2dlclJlY3QucmlnaHQgKyBTUEFDSU5HO1xuICAgICAgICB0b3AgPSB0cmlnZ2VyUmVjdC5ib3R0b20gKyBTUEFDSU5HO1xuICAgICAgICB0cmFuc2xhdGVYID0gLTE7XG4gICAgICAgIHRyYW5zbGF0ZVkgPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgdHJhbnNmb3JtT3JpZ2luID0gdGhpcy5jYWxjVHJhbnNmb3JtT3JpZ2luKHBvc2l0aW9uLCB0cmlnZ2VyUmVjdCwgdHJhbnNsYXRlWCwgdHJhbnNsYXRlWSk7IC8vIFRyYW5zZm9ybSBvcmlnaW5cbiAgICBjb25zdCBfY29udGFpbmVySXNCb2R5ID0gdGhpcy5fYWRhcHRlci5jb250YWluZXJJc0JvZHkoKTtcbiAgICAvLyBDYWxjdWxhdGUgY29udGFpbmVyIHBvc2l0aW9uaW5nIHJlbGF0aXZlIHRvIHdpbmRvd1xuICAgIGxlZnQgPSBsZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0O1xuICAgIHRvcCA9IHRvcCAtIGNvbnRhaW5lclJlY3QudG9wO1xuICAgIGlmIChzY2FsZWQpIHtcbiAgICAgIGxlZnQgLz0gd3JhcHBlclJlY3Qud2lkdGggLyB0aGlzLl9hZGFwdGVyLmdldENvbnRhaW5lcigpLmNsaWVudFdpZHRoO1xuICAgIH1cbiAgICBpZiAoc2NhbGVkKSB7XG4gICAgICB0b3AgLz0gd3JhcHBlclJlY3QuaGVpZ2h0IC8gdGhpcy5fYWRhcHRlci5nZXRDb250YWluZXIoKS5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNvbnRhaW5lclx1NEUzQWJvZHlcdTY1RjZcdUZGMENcdTU5ODJcdTY3OUNwb3NpdGlvblx1NEUwRFx1NEUzQXJlbGF0aXZlXHU2MjE2YWJzb2x1dGVcdUZGMENcdThGRDlcdTY1RjZ0cmlnZ2VyXHU4QkExXHU3Qjk3XHU1MUZBXHU3Njg0dG9wL2xlZnRcdTRGMUFcdTY4MzlcdTYzNkVodG1sXHU1QjlBXHU0RjREXHVGRjA4aW5pdGlhbCBjb250YWluaW5nIGJsb2NrXHVGRjA5XG4gICAgICogXHU2QjY0XHU2NUY2XHU1OTgyXHU2NzlDYm9keVx1NjcwOW1hcmdpblx1RkYwQ1x1NTIxOVx1OEJBMVx1N0I5N1x1NTFGQVx1NzY4NFx1NEY0RFx1N0Y2RVx1NzZGOFx1NUJGOVx1NEU4RWJvZHlcdTRGMUFcdTY3MDlcdTk1RUVcdTk4OTggZml4IGlzc3VlICMxMzY4XG4gICAgICpcbiAgICAgKiBXaGVuIGNvbnRhaW5lciBpcyBib2R5LCBpZiBwb3NpdGlvbiBpcyBub3QgcmVsYXRpdmUgb3IgYWJzb2x1dGUsIHRoZW4gdGhlIHRvcC9sZWZ0IGNhbGN1bGF0ZWQgYnkgdHJpZ2dlciB3aWxsIGJlIHBvc2l0aW9uZWQgYWNjb3JkaW5nIHRvIGh0bWxcbiAgICAgKiBBdCB0aGlzIHRpbWUsIGlmIHRoZSBib2R5IGhhcyBhIG1hcmdpbiwgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gd2lsbCBoYXZlIGEgcHJvYmxlbSByZWxhdGl2ZSB0byB0aGUgYm9keSBmaXggaXNzdWUgIzEzNjhcbiAgICAgKi9cbiAgICBpZiAoX2NvbnRhaW5lcklzQm9keSAmJiAhdGhpcy5fYWRhcHRlci5jb250YWluZXJJc1JlbGF0aXZlT3JBYnNvbHV0ZSgpKSB7XG4gICAgICBjb25zdCBkb2N1bWVudEVsZVJlY3QgPSB0aGlzLl9hZGFwdGVyLmdldERvY3VtZW50RWxlbWVudEJvdW5kaW5nKCk7XG4gICAgICAvLyBSZXByZXNlbnRzIHRoZSBsZWZ0IG9mIHRoZSBib2R5IHJlbGF0aXZlIHRvIGh0bWxcbiAgICAgIGxlZnQgKz0gY29udGFpbmVyUmVjdC5sZWZ0IC0gZG9jdW1lbnRFbGVSZWN0LmxlZnQ7XG4gICAgICAvLyBSZXByZXNlbnRzIHRoZSB0b3Agb2YgdGhlIGJvZHkgcmVsYXRpdmUgdG8gaHRtbFxuICAgICAgdG9wICs9IGNvbnRhaW5lclJlY3QudG9wIC0gZG9jdW1lbnRFbGVSZWN0LnRvcDtcbiAgICB9XG4gICAgLy8gQ29udGFpbmVyUmVjdC5zY3JvbGxMZWZ0IHRvIHNvbHZlIHRoZSBpbm5lciBzY3JvbGxpbmcgb2YgdGhlIGNvbnRhaW5lclxuICAgIGxlZnQgPSBfY29udGFpbmVySXNCb2R5ID8gbGVmdCA6IGxlZnQgKyBjb250YWluZXJSZWN0LnNjcm9sbExlZnQ7XG4gICAgdG9wID0gX2NvbnRhaW5lcklzQm9keSA/IHRvcCA6IHRvcCArIGNvbnRhaW5lclJlY3Quc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSB0cmlnZ2VyUmVjdC5oZWlnaHQ7XG4gICAgaWYgKHRoaXMuZ2V0UHJvcCgnc2hvd0Fycm93JykgJiYgIWFycm93UG9pbnRBdENlbnRlciAmJiB0cmlnZ2VySGVpZ2h0IDw9ICh2ZXJ0aWNhbEFycm93SGVpZ2h0IC8gMiArIGFycm93T2Zmc2V0WSkgKiAyKSB7XG4gICAgICBjb25zdCBvZmZzZXRZID0gdHJpZ2dlckhlaWdodCAvIDIgLSAoYXJyb3dPZmZzZXRZICsgdmVydGljYWxBcnJvd0hlaWdodCAvIDIpO1xuICAgICAgaWYgKChwb3NpdGlvbi5pbmNsdWRlcygnVG9wJykgfHwgcG9zaXRpb24uaW5jbHVkZXMoJ0JvdHRvbScpKSAmJiAhcG9zaXRpb24uaW5jbHVkZXMoJ092ZXInKSkge1xuICAgICAgICB0b3AgPSBwb3NpdGlvbi5pbmNsdWRlcygnVG9wJykgPyB0b3AgKyBvZmZzZXRZIDogdG9wIC0gb2Zmc2V0WTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlIGxlZnQvdG9wIHZhbHVlIGhlcmUgbXVzdCBiZSByb3VuZGVkLCBvdGhlcndpc2UgaXQgd2lsbCBjYXVzZSB0aGUgc21hbGwgdHJpYW5nbGUgdG8gc2hha2VcbiAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgIGxlZnQ6IHRoaXMuX3JvdW5kUGl4ZWwobGVmdCksXG4gICAgICB0b3A6IHRoaXMuX3JvdW5kUGl4ZWwodG9wKVxuICAgIH07XG4gICAgbGV0IHRyYW5zZm9ybSA9ICcnO1xuICAgIGlmICh0cmFuc2xhdGVYICE9IG51bGwpIHtcbiAgICAgIHRyYW5zZm9ybSArPSBgdHJhbnNsYXRlWCgke3RyYW5zbGF0ZVggKiAxMDB9JSkgYDtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZSwgJ3RyYW5zbGF0ZVgnLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdHJhbnNsYXRlWFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0cmFuc2xhdGVZICE9IG51bGwpIHtcbiAgICAgIHRyYW5zZm9ybSArPSBgdHJhbnNsYXRlWSgke3RyYW5zbGF0ZVkgKiAxMDB9JSkgYDtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZSwgJ3RyYW5zbGF0ZVknLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdHJhbnNsYXRlWVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0cmFuc2Zvcm1PcmlnaW4gIT0gbnVsbCkge1xuICAgICAgc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gdHJhbnNmb3JtT3JpZ2luO1xuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICBzdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgfVxuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuICBpc0xSKCkge1xuICAgIGxldCBwb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgcmV0dXJuIHBvc2l0aW9uLmluY2x1ZGVzKCdsZWZ0JykgfHwgcG9zaXRpb24uaW5jbHVkZXMoJ3JpZ2h0Jyk7XG4gIH1cbiAgaXNUQigpIHtcbiAgICBsZXQgcG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgIHJldHVybiBwb3NpdGlvbi5pbmNsdWRlcygndG9wJykgfHwgcG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpO1xuICB9XG4gIGlzUmV2ZXJzZShyb3dTcGFjZSwgcmV2ZXJzZVNwYWNlLCBzaXplKSB7XG4gICAgLy8gXHU1MzlGXHU3QTdBXHU5NUY0XHU0RTBEXHU4REIzXHVGRjBDXHU1M0NEXHU1NDExXHU3QTdBXHU5NUY0XHU4REIzXHU1OTFGXG4gICAgLy8gSW5zdWZmaWNpZW50IG9yaWdpbmFsIHNwYWNlLCBlbm91Z2ggcmV2ZXJzZSBzcGFjZVxuICAgIHJldHVybiByb3dTcGFjZSA8IHNpemUgJiYgcmV2ZXJzZVNwYWNlID4gc2l6ZTtcbiAgfVxuICBpc092ZXJGbG93KHJvd1NwYWNlLCByZXZlcnNlU3BhY2UsIHNpemUpIHtcbiAgICAvLyBcdTUzOUZcdTdBN0FcdTk1RjRcdTRFMTRcdTUzQ0RcdTU0MTFcdTdBN0FcdTk1RjRcdTkwRkRcdTRFMERcdThEQjNcbiAgICAvLyBUaGUgb3JpZ2luYWwgc3BhY2UgYW5kIHRoZSByZXZlcnNlIHNwYWNlIGFyZSBub3QgZW5vdWdoXG4gICAgcmV0dXJuIHJvd1NwYWNlIDwgc2l6ZSAmJiByZXZlcnNlU3BhY2UgPCBzaXplO1xuICB9XG4gIGlzSGFsZk92ZXJGbG93KHBvc1NwYWNlLCBuZWdTcGFjZSwgc2l6ZSkge1xuICAgIC8vIFx1NkI2M1x1NTM0QVx1N0E3QVx1OTVGNFx1NjIxNlx1ODAwNVx1OEQxRlx1NTM0QVx1N0E3QVx1OTVGNFx1NEUwRFx1OERCM1x1RkYwQ1x1NTM3M1x1ODg2OFx1NzkzQVx1NjcwOVx1OTA2RVx1NjMyMVx1RkYwQ1x1OTcwMFx1ODk4MVx1NTA0Rlx1NzlGQlxuICAgIC8vIEluc3VmZmljaWVudCBwb3NpdGl2ZSBoYWxmIHNwYWNlIG9yIG5lZ2F0aXZlIGhhbGYgc3BhY2UgbWVhbnMgdGhhdCB0aGVyZSBpcyBvY2NsdXNpb24gYW5kIG5lZWRzIHRvIGJlIG9mZnNldFxuICAgIHJldHVybiBwb3NTcGFjZSA8IHNpemUgfHwgbmVnU3BhY2UgPCBzaXplO1xuICB9XG4gIGlzSGFsZkFsbEVub3VnaChwb3NTcGFjZSwgbmVnU3BhY2UsIHNpemUpIHtcbiAgICAvLyBcdTZCNjNcdTUzNEFcdTdBN0FcdTk1RjRcdTU0OENcdThEMUZcdTUzNEFcdTdBN0FcdTk1RjRcdTkwRkRcdThEQjNcdTU5MUZcdUZGMENcdTUzNzNcdTg4NjhcdTc5M0FcdTUzRUZcdTRFRTVcdTRFQ0UgdG9wTGVmdC90b3BSaWdodCBcdTUzRDhcdTYyMTAgdG9wXG4gICAgLy8gQm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaGFsZi1zcGFjZXMgYXJlIHN1ZmZpY2llbnQsIHdoaWNoIG1lYW5zIHlvdSBjYW4gY2hhbmdlIGZyb20gdG9wTGVmdC90b3BSaWdodCB0byB0b3BcbiAgICByZXR1cm4gcG9zU3BhY2UgPj0gc2l6ZSB8fCBuZWdTcGFjZSA+PSBzaXplO1xuICB9XG4gIGdldFJldmVyc2Uodmlld092ZXJGbG93LCBjb250YWluZXJPdmVyRmxvdywgc2hvdWxkUmV2ZXJzZVZpZXcsIHNob3VsZFJldmVyc2VDb250YWluZXIpIHtcbiAgICAvKipcbiAgICAgKiBcdTU3RkFcdTRFOEVcdTg5QzZcdTUzRTNcdTU0OENcdTVCQjlcdTU2NjhcdTRFMDBcdThENzdcdTUyMjRcdTY1QURcdUZGMENcdTRFRTVcdTRFMEJcdTUxRTBcdTc5Q0RcdTYwQzVcdTUxQjVcdTUxNDFcdThCQjhcdTRFQ0VcdTUzOUZcdTY1QjlcdTU0MTFcdThGNkNcdTUyMzBcdTUzQ0RcdTY1QjlcdTU0MTFcdUZGMENcdTRFRTVcdTUyMjRcdTY1QURcdTY2MkZcdTU0MjZcdTVFOTRcdThCRTVcdTc1MzF0b3AtPmJvdHRvbVx1NEUzQVx1NEY4Qlx1NUI1MFxuICAgICAqXG4gICAgICogMS4gXHU4OUM2XHU1M0UzXHU0RTBBXHU0RTBCXHU3QTdBXHU5NUY0XHU0RTBEXHU4REIzIFx1NEUxNCBcdTVCQjlcdTU2NjhcdTRFMEFcdTdBN0FcdTk1RjRcdTI3NENcdTRFMEJcdTdBN0FcdTk1RjRcdTI3MDVcbiAgICAgKiAyLiBcdTg5QzZcdTUzRTNcdTRFMEFcdTdBN0FcdTk1RjRcdTI3NENcdTRFMEJcdTdBN0FcdTk1RjRcdTI3MDVcbiAgICAgKlxuICAgICAqIEJhc2VkIG9uIHRoZSBqdWRnbWVudCBvZiB0aGUgdmlld3BvcnQgYW5kIHRoZSBjb250YWluZXIsIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9ucyBhcmUgYWxsb3dlZCB0byB0dXJuIGZyb20gdGhlIG9yaWdpbmFsIGRpcmVjdGlvbiB0byB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uXG4gICAgICogdG8ganVkZ2Ugd2hldGhlciBpdCBzaG91bGQgYmUgdG9wLT5ib3R0b20gYXMgYW4gZXhhbXBsZVxuICAgICAqIDEuIFRoZXJlIGlzIGluc3VmZmljaWVudCBzcGFjZSBhYm92ZSBhbmQgYmVsb3cgdGhlIHZpZXdwb3J0IGFuZCB0aGUgc3BhY2UgYWJvdmUgdGhlIGNvbnRhaW5lciBcdTI3NEMgdGhlIHNwYWNlIGJlbG93IFx1MjcwNVxuICAgICAqIDIuIFRoZSBzcGFjZSBhYm92ZSB0aGUgdmlld3BvcnQgXHUyNzRDIHRoZSBzcGFjZSBiZWxvdyBcdTI3MDUgYW5kIHRoZSBzcGFjZSBhYm92ZSBhbmQgYmVsb3cgdGhlIGNvbnRhaW5lciBpcyBpbnN1ZmZpY2llbnRcbiAgICAgKiAzLiBWaWV3cG9ydCB1cHBlciBzcGFjZSBcdTI3NEMgbG93ZXIgc3BhY2VcdTI3MDUgYW5kIGNvbnRhaW5lciB1cHBlciBzcGFjZSBcdTI3NEMgbG93ZXIgc3BhY2VcdTI3MDVcbiAgICAgKi9cbiAgICByZXR1cm4gdmlld092ZXJGbG93ICYmIHNob3VsZFJldmVyc2VDb250YWluZXIgfHwgc2hvdWxkUmV2ZXJzZVZpZXc7XG4gIH1cbiAgLy8gcGxhY2UgdGhlIGRvbSBjb3JyZWN0bHlcbiAgYWRqdXN0UG9zSWZOZWVkKHBvc2l0aW9uLCBzdHlsZSwgdHJpZ2dlclJlY3QsIHdyYXBwZXJSZWN0LCBjb250YWluZXJSZWN0KSB7XG4gICAgY29uc3Qge1xuICAgICAgaW5uZXJXaWR0aCxcbiAgICAgIGlubmVySGVpZ2h0XG4gICAgfSA9IHdpbmRvdztcbiAgICBjb25zdCB7XG4gICAgICBtYXJnaW5cbiAgICB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgIGNvbnN0IG1hcmdpbkxlZnQgPSB0eXBlb2YgbWFyZ2luID09PSAnbnVtYmVyJyA/IG1hcmdpbiA6IG1hcmdpbi5tYXJnaW5MZWZ0O1xuICAgIGNvbnN0IG1hcmdpblRvcCA9IHR5cGVvZiBtYXJnaW4gPT09ICdudW1iZXInID8gbWFyZ2luIDogbWFyZ2luLm1hcmdpblRvcDtcbiAgICBjb25zdCBtYXJnaW5SaWdodCA9IHR5cGVvZiBtYXJnaW4gPT09ICdudW1iZXInID8gbWFyZ2luIDogbWFyZ2luLm1hcmdpblJpZ2h0O1xuICAgIGNvbnN0IG1hcmdpbkJvdHRvbSA9IHR5cGVvZiBtYXJnaW4gPT09ICdudW1iZXInID8gbWFyZ2luIDogbWFyZ2luLm1hcmdpbkJvdHRvbTtcbiAgICBsZXQgaXNIZWlnaHRPdmVyRmxvdyA9IGZhbHNlO1xuICAgIGxldCBpc1dpZHRoT3ZlckZsb3cgPSBmYWxzZTtcbiAgICBjb25zdCByYXdfc3BhY2luZyA9IHRoaXMuZ2V0UHJvcCgnc3BhY2luZycpO1xuICAgIGxldCBzcGFjaW5nID0gcmF3X3NwYWNpbmc7XG4gICAgbGV0IGFub19zcGFjaW5nID0gMDtcbiAgICBpZiAodHlwZW9mIHJhd19zcGFjaW5nICE9PSAnbnVtYmVyJykge1xuICAgICAgLy8gZXh0ZW5kZWQgc3BhY2luZyBhcGkgd2l0aCB7eDogbnVtYmVyLCB5OiBudW1iZXJ9LCB0aGUgYXhlcyBvZiB0aGUgc3BhY2luZyBpcyBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSBwb3NpdGlvblxuICAgICAgY29uc3QgaXNUb3BPckJvdHRvbSA9IHBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSB8fCBwb3NpdGlvbi5pbmNsdWRlcygnYm90dG9tJyk7XG4gICAgICBzcGFjaW5nID0gaXNUb3BPckJvdHRvbSA/IHJhd19zcGFjaW5nLnkgOiByYXdfc3BhY2luZy54O1xuICAgICAgYW5vX3NwYWNpbmcgPSBpc1RvcE9yQm90dG9tID8gcmF3X3NwYWNpbmcueCA6IHJhd19zcGFjaW5nLnk7XG4gICAgfVxuICAgIGlmICh3cmFwcGVyUmVjdC53aWR0aCA+IDAgJiYgd3JhcHBlclJlY3QuaGVpZ2h0ID4gMCkge1xuICAgICAgLy8gbGV0IGNsaWVudExlZnQgPSBsZWZ0ICsgdHJhbnNsYXRlWCAqIHdyYXBwZXJSZWN0LndpZHRoIC0gY29udGFpbmVyUmVjdC5zY3JvbGxMZWZ0O1xuICAgICAgLy8gbGV0IGNsaWVudFRvcCA9IHRvcCArIHRyYW5zbGF0ZVkgKiB3cmFwcGVyUmVjdC5oZWlnaHQgLSBjb250YWluZXJSZWN0LnNjcm9sbFRvcDtcbiAgICAgIC8vIGlmICh0aGlzLl9hZGFwdGVyLmNvbnRhaW5lcklzQm9keSgpIHx8IHRoaXMuX2FkYXB0ZXIuY29udGFpbmVySXNSZWxhdGl2ZSgpKSB7XG4gICAgICAvLyAgICAgY2xpZW50TGVmdCArPSBjb250YWluZXJSZWN0LmxlZnQ7XG4gICAgICAvLyAgICAgY2xpZW50VG9wICs9IGNvbnRhaW5lclJlY3QudG9wO1xuICAgICAgLy8gfVxuICAgICAgLy8gY29uc3QgY2xpZW50UmlnaHQgPSBjbGllbnRMZWZ0ICsgd3JhcHBlclJlY3Qud2lkdGg7XG4gICAgICAvLyBjb25zdCBjbGllbnRCb3R0b20gPSBjbGllbnRUb3AgKyB3cmFwcGVyUmVjdC5oZWlnaHQ7XG4gICAgICAvLyBUaGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnRzIG9uIHRoZSBzY3JlZW5cbiAgICAgIC8vIGh0dHBzOi8vbGYzLXN0YXRpYy5ieXRlZG5zZG9jLmNvbS9vYmovZWRlbi1jbi9wdGx6X3pscC9samh3WnRobGF1a2psa3VsemxwL3Rvb2x0aXAtcGljLnN2Z1xuICAgICAgY29uc3QgY2xpZW50TGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQ7XG4gICAgICBjb25zdCBjbGllbnRSaWdodCA9IHRyaWdnZXJSZWN0LnJpZ2h0O1xuICAgICAgY29uc3QgY2xpZW50VG9wID0gdHJpZ2dlclJlY3QudG9wO1xuICAgICAgY29uc3QgY2xpZW50Qm90dG9tID0gdHJpZ2dlclJlY3QuYm90dG9tO1xuICAgICAgY29uc3QgcmVzdENsaWVudExlZnQgPSBpbm5lcldpZHRoIC0gY2xpZW50TGVmdDtcbiAgICAgIGNvbnN0IHJlc3RDbGllbnRUb3AgPSBpbm5lckhlaWdodCAtIGNsaWVudFRvcDtcbiAgICAgIGNvbnN0IHJlc3RDbGllbnRSaWdodCA9IGlubmVyV2lkdGggLSBjbGllbnRSaWdodDtcbiAgICAgIGNvbnN0IHJlc3RDbGllbnRCb3R0b20gPSBpbm5lckhlaWdodCAtIGNsaWVudEJvdHRvbTtcbiAgICAgIGNvbnN0IHdpZHRoSXNCaWdnZXIgPSB3cmFwcGVyUmVjdC53aWR0aCA+IHRyaWdnZXJSZWN0LndpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0SXNCaWdnZXIgPSB3cmFwcGVyUmVjdC5oZWlnaHQgPiB0cmlnZ2VyUmVjdC5oZWlnaHQ7XG4gICAgICAvLyBUaGUgd3JhcHBlclIgZWN0LnRvcHxib3R0b20gZXF1aXZhbGVudCBjYW5ub3QgYmUgZGlyZWN0bHkgdXNlZCBoZXJlIGZvciBjb21wYXJpc29uLCB3aGljaCBpcyBlYXN5IHRvIGNhdXNlIGppdHRlclxuICAgICAgLy8gXHU1N0ZBXHU0RThFXHU4OUM2XHU1M0UzXHU3Njg0XHU1RkFFXHU4QzAzXHU1MjI0XHU2NUFEXG4gICAgICAvLyBGaW5lLXR1bmluZyBqdWRnbWVudCBiYXNlZCBvbiB2aWV3cG9ydFxuICAgICAgY29uc3Qgc2hvdWxkVmlld1JldmVyc2VUb3AgPSBjbGllbnRUb3AgLSBtYXJnaW5Ub3AgPCB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nICYmIHJlc3RDbGllbnRCb3R0b20gLSBtYXJnaW5Cb3R0b20gPiB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nO1xuICAgICAgY29uc3Qgc2hvdWxkVmlld1JldmVyc2VMZWZ0ID0gY2xpZW50TGVmdCAtIG1hcmdpbkxlZnQgPCB3cmFwcGVyUmVjdC53aWR0aCArIHNwYWNpbmcgJiYgcmVzdENsaWVudFJpZ2h0IC0gbWFyZ2luUmlnaHQgPiB3cmFwcGVyUmVjdC53aWR0aCArIHNwYWNpbmc7XG4gICAgICBjb25zdCBzaG91bGRWaWV3UmV2ZXJzZUJvdHRvbSA9IHJlc3RDbGllbnRCb3R0b20gLSBtYXJnaW5Cb3R0b20gPCB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nICYmIGNsaWVudFRvcCAtIG1hcmdpblRvcCA+IHdyYXBwZXJSZWN0LmhlaWdodCArIHNwYWNpbmc7XG4gICAgICBjb25zdCBzaG91bGRWaWV3UmV2ZXJzZVJpZ2h0ID0gcmVzdENsaWVudFJpZ2h0IC0gbWFyZ2luUmlnaHQgPCB3cmFwcGVyUmVjdC53aWR0aCArIHNwYWNpbmcgJiYgY2xpZW50TGVmdCAtIG1hcmdpbkxlZnQgPiB3cmFwcGVyUmVjdC53aWR0aCArIHNwYWNpbmc7XG4gICAgICBjb25zdCBzaG91bGRWaWV3UmV2ZXJzZVRvcE92ZXIgPSByZXN0Q2xpZW50VG9wIC0gbWFyZ2luQm90dG9tIDwgd3JhcHBlclJlY3QuaGVpZ2h0ICsgc3BhY2luZyAmJiBjbGllbnRCb3R0b20gLSBtYXJnaW5Ub3AgPiB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nO1xuICAgICAgY29uc3Qgc2hvdWxkVmlld1JldmVyc2VCb3R0b21PdmVyID0gY2xpZW50Qm90dG9tIC0gbWFyZ2luVG9wIDwgd3JhcHBlclJlY3QuaGVpZ2h0ICsgc3BhY2luZyAmJiByZXN0Q2xpZW50VG9wIC0gbWFyZ2luQm90dG9tID4gd3JhcHBlclJlY3QuaGVpZ2h0ICsgc3BhY2luZztcbiAgICAgIGNvbnN0IHNob3VsZFZpZXdSZXZlcnNlVG9wU2lkZSA9IHJlc3RDbGllbnRUb3AgPCB3cmFwcGVyUmVjdC5oZWlnaHQgKyBhbm9fc3BhY2luZyAmJiBjbGllbnRCb3R0b20gPiB3cmFwcGVyUmVjdC5oZWlnaHQgKyBhbm9fc3BhY2luZztcbiAgICAgIGNvbnN0IHNob3VsZFZpZXdSZXZlcnNlQm90dG9tU2lkZSA9IGNsaWVudEJvdHRvbSA8IHdyYXBwZXJSZWN0LmhlaWdodCArIGFub19zcGFjaW5nICYmIHJlc3RDbGllbnRUb3AgPiB3cmFwcGVyUmVjdC5oZWlnaHQgKyBhbm9fc3BhY2luZztcbiAgICAgIGNvbnN0IHNob3VsZFZpZXdSZXZlcnNlTGVmdFNpZGUgPSByZXN0Q2xpZW50TGVmdCA8IHdyYXBwZXJSZWN0LndpZHRoICsgYW5vX3NwYWNpbmcgJiYgY2xpZW50UmlnaHQgPiB3cmFwcGVyUmVjdC53aWR0aCArIGFub19zcGFjaW5nO1xuICAgICAgY29uc3Qgc2hvdWxkVmlld1JldmVyc2VSaWdodFNpZGUgPSBjbGllbnRSaWdodCA8IHdyYXBwZXJSZWN0LndpZHRoICsgYW5vX3NwYWNpbmcgJiYgcmVzdENsaWVudExlZnQgPiB3cmFwcGVyUmVjdC53aWR0aCArIGFub19zcGFjaW5nO1xuICAgICAgY29uc3Qgc2hvdWxkUmV2ZXJzZVRvcE92ZXIgPSByZXN0Q2xpZW50VG9wIDwgd3JhcHBlclJlY3QuaGVpZ2h0ICsgc3BhY2luZyAmJiBjbGllbnRCb3R0b20gPiB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nO1xuICAgICAgY29uc3Qgc2hvdWxkUmV2ZXJzZUJvdHRvbU92ZXIgPSBjbGllbnRCb3R0b20gPCB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nICYmIHJlc3RDbGllbnRUb3AgPiB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nO1xuICAgICAgY29uc3Qgc2hvdWxkUmV2ZXJzZUxlZnRPdmVyID0gcmVzdENsaWVudExlZnQgPCB3cmFwcGVyUmVjdC53aWR0aCAmJiBjbGllbnRSaWdodCA+IHdyYXBwZXJSZWN0LndpZHRoO1xuICAgICAgY29uc3Qgc2hvdWxkUmV2ZXJzZVJpZ2h0T3ZlciA9IGNsaWVudFJpZ2h0IDwgd3JhcHBlclJlY3Qud2lkdGggJiYgcmVzdENsaWVudExlZnQgPiB3cmFwcGVyUmVjdC53aWR0aDtcbiAgICAgIC8vIFx1NTdGQVx1NEU4RVx1NUJCOVx1NTY2OFx1NzY4NFx1NUZBRVx1OEMwM1x1NTIyNFx1NjVBRFxuICAgICAgLy8gRmluZS10dW5pbmcganVkZ21lbnQgYmFzZWQgb24gY29udGFpbmVyXG4gICAgICBjb25zdCBjbGllbnRUb3BJbkNvbnRhaW5lciA9IGNsaWVudFRvcCAtIGNvbnRhaW5lclJlY3QudG9wO1xuICAgICAgY29uc3QgY2xpZW50TGVmdEluQ29udGFpbmVyID0gY2xpZW50TGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdDtcbiAgICAgIGNvbnN0IGNsaWVudEJvdHRvbUluQ29udGFpbmVyID0gY2xpZW50VG9wSW5Db250YWluZXIgKyB0cmlnZ2VyUmVjdC5oZWlnaHQ7XG4gICAgICBjb25zdCBjbGllbnRSaWdodEluQ29udGFpbmVyID0gY2xpZW50TGVmdEluQ29udGFpbmVyICsgdHJpZ2dlclJlY3Qud2lkdGg7XG4gICAgICBjb25zdCByZXN0Q2xpZW50Qm90dG9tSW5Db250YWluZXIgPSBjb250YWluZXJSZWN0LmJvdHRvbSAtIGNsaWVudEJvdHRvbTtcbiAgICAgIGNvbnN0IHJlc3RDbGllbnRSaWdodEluQ29udGFpbmVyID0gY29udGFpbmVyUmVjdC5yaWdodCAtIGNsaWVudFJpZ2h0O1xuICAgICAgY29uc3QgcmVzdENsaWVudFRvcEluQ29udGFpbmVyID0gcmVzdENsaWVudEJvdHRvbUluQ29udGFpbmVyICsgdHJpZ2dlclJlY3QuaGVpZ2h0O1xuICAgICAgY29uc3QgcmVzdENsaWVudExlZnRJbkNvbnRhaW5lciA9IHJlc3RDbGllbnRSaWdodEluQ29udGFpbmVyICsgdHJpZ2dlclJlY3Qud2lkdGg7XG4gICAgICAvLyBcdTVGNTNcdTUzOUZcdTdBN0FcdTk1RjRcdTRFMERcdThEQjNcdUZGMENcdTUzQ0RcdTU0MTFcdTdBN0FcdTk1RjRcdThEQjNcdTU5MUZcdTY1RjZcdUZGMENcdTUzRUZcdTRFRTVcdTUzQ0RcdTU0MTFcdTMwMDJcbiAgICAgIC8vIFdoZW4gdGhlIG9yaWdpbmFsIHNwYWNlIGlzIGluc3VmZmljaWVudCBhbmQgdGhlIHJldmVyc2Ugc3BhY2UgaXMgc3VmZmljaWVudCwgdGhlIHJldmVyc2UgY2FuIGJlIHBlcmZvcm1lZC5cbiAgICAgIGNvbnN0IHNob3VsZENvbnRhaW5lclJldmVyc2VUb3AgPSB0aGlzLmlzUmV2ZXJzZShjbGllbnRUb3BJbkNvbnRhaW5lciAtIG1hcmdpblRvcCwgcmVzdENsaWVudEJvdHRvbUluQ29udGFpbmVyIC0gbWFyZ2luQm90dG9tLCB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nKTtcbiAgICAgIGNvbnN0IHNob3VsZENvbnRhaW5lclJldmVyc2VMZWZ0ID0gdGhpcy5pc1JldmVyc2UoY2xpZW50TGVmdEluQ29udGFpbmVyIC0gbWFyZ2luTGVmdCwgcmVzdENsaWVudFJpZ2h0SW5Db250YWluZXIgLSBtYXJnaW5SaWdodCwgd3JhcHBlclJlY3Qud2lkdGggKyBzcGFjaW5nKTtcbiAgICAgIGNvbnN0IHNob3VsZENvbnRhaW5lclJldmVyc2VCb3R0b20gPSB0aGlzLmlzUmV2ZXJzZShyZXN0Q2xpZW50Qm90dG9tSW5Db250YWluZXIgLSBtYXJnaW5Cb3R0b20sIGNsaWVudFRvcEluQ29udGFpbmVyIC0gbWFyZ2luVG9wLCB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nKTtcbiAgICAgIGNvbnN0IHNob3VsZENvbnRhaW5lclJldmVyc2VSaWdodCA9IHRoaXMuaXNSZXZlcnNlKHJlc3RDbGllbnRSaWdodEluQ29udGFpbmVyIC0gbWFyZ2luUmlnaHQsIGNsaWVudExlZnRJbkNvbnRhaW5lciAtIG1hcmdpbkxlZnQsIHdyYXBwZXJSZWN0LndpZHRoICsgc3BhY2luZyk7XG4gICAgICBjb25zdCBzaG91bGRDb250YWluZXJSZXZlcnNlVG9wT3ZlciA9IHRoaXMuaXNSZXZlcnNlKHJlc3RDbGllbnRUb3BJbkNvbnRhaW5lciAtIG1hcmdpbkJvdHRvbSwgY2xpZW50Qm90dG9tSW5Db250YWluZXIgLSBtYXJnaW5Ub3AsIHdyYXBwZXJSZWN0LmhlaWdodCArIHNwYWNpbmcpO1xuICAgICAgY29uc3Qgc2hvdWxkQ29udGFpbmVyUmV2ZXJzZUJvdHRvbU92ZXIgPSB0aGlzLmlzUmV2ZXJzZShjbGllbnRCb3R0b21JbkNvbnRhaW5lciAtIG1hcmdpblRvcCwgcmVzdENsaWVudFRvcEluQ29udGFpbmVyIC0gbWFyZ2luQm90dG9tLCB3cmFwcGVyUmVjdC5oZWlnaHQgKyBzcGFjaW5nKTtcbiAgICAgIGNvbnN0IHNob3VsZENvbnRhaW5lclJldmVyc2VUb3BTaWRlID0gdGhpcy5pc1JldmVyc2UocmVzdENsaWVudFRvcEluQ29udGFpbmVyLCBjbGllbnRCb3R0b21JbkNvbnRhaW5lciwgd3JhcHBlclJlY3QuaGVpZ2h0ICsgYW5vX3NwYWNpbmcpO1xuICAgICAgY29uc3Qgc2hvdWxkQ29udGFpbmVyUmV2ZXJzZUJvdHRvbVNpZGUgPSB0aGlzLmlzUmV2ZXJzZShjbGllbnRCb3R0b21JbkNvbnRhaW5lciwgcmVzdENsaWVudFRvcEluQ29udGFpbmVyLCB3cmFwcGVyUmVjdC5oZWlnaHQgKyBhbm9fc3BhY2luZyk7XG4gICAgICBjb25zdCBzaG91bGRDb250YWluZXJSZXZlcnNlTGVmdFNpZGUgPSB0aGlzLmlzUmV2ZXJzZShyZXN0Q2xpZW50TGVmdEluQ29udGFpbmVyLCBjbGllbnRSaWdodEluQ29udGFpbmVyLCB3cmFwcGVyUmVjdC53aWR0aCArIGFub19zcGFjaW5nKTtcbiAgICAgIGNvbnN0IHNob3VsZENvbnRhaW5lclJldmVyc2VSaWdodFNpZGUgPSB0aGlzLmlzUmV2ZXJzZShjbGllbnRSaWdodEluQ29udGFpbmVyLCByZXN0Q2xpZW50TGVmdEluQ29udGFpbmVyLCB3cmFwcGVyUmVjdC53aWR0aCArIGFub19zcGFjaW5nKTtcbiAgICAgIGNvbnN0IGhhbGZIZWlnaHQgPSB0cmlnZ2VyUmVjdC5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgaGFsZldpZHRoID0gdHJpZ2dlclJlY3Qud2lkdGggLyAyO1xuICAgICAgLy8gXHU4OUM2XHU1M0UzLCBcdTUzOUZcdTdBN0FcdTk1RjRcdTRFMEVcdTUzQ0RcdTU0MTFcdTdBN0FcdTk1RjRcdTY2MkZcdTU0MjZcdTkwRkRcdTRFMERcdThEQjNcdTUyMjRcdTY1QURcbiAgICAgIC8vIFZpZXdwb3J0LCB3aGV0aGVyIHRoZSBvcmlnaW5hbCBzcGFjZSBhbmQgdGhlIHJldmVyc2Ugc3BhY2UgYXJlIGluc3VmZmljaWVudCB0byBqdWRnZVxuICAgICAgY29uc3QgaXNWaWV3WU92ZXJGbG93ID0gdGhpcy5pc092ZXJGbG93KGNsaWVudFRvcCAtIG1hcmdpblRvcCwgcmVzdENsaWVudEJvdHRvbSAtIG1hcmdpbkJvdHRvbSwgd3JhcHBlclJlY3QuaGVpZ2h0ICsgc3BhY2luZyk7XG4gICAgICBjb25zdCBpc1ZpZXdYT3ZlckZsb3cgPSB0aGlzLmlzT3ZlckZsb3coY2xpZW50TGVmdCAtIG1hcmdpbkxlZnQsIHJlc3RDbGllbnRSaWdodCAtIG1hcmdpblJpZ2h0LCB3cmFwcGVyUmVjdC53aWR0aCArIHNwYWNpbmcpO1xuICAgICAgY29uc3QgaXNWaWV3WU92ZXJGbG93U2lkZSA9IHRoaXMuaXNPdmVyRmxvdyhjbGllbnRCb3R0b20gLSBtYXJnaW5Ub3AsIHJlc3RDbGllbnRUb3AgLSBtYXJnaW5Cb3R0b20sIHdyYXBwZXJSZWN0LmhlaWdodCArIHNwYWNpbmcpO1xuICAgICAgY29uc3QgaXNWaWV3WE92ZXJGbG93U2lkZSA9IHRoaXMuaXNPdmVyRmxvdyhjbGllbnRSaWdodCAtIG1hcmdpbkxlZnQsIHJlc3RDbGllbnRMZWZ0IC0gbWFyZ2luUmlnaHQsIHdyYXBwZXJSZWN0LndpZHRoICsgc3BhY2luZyk7XG4gICAgICBjb25zdCBpc1ZpZXdZT3ZlckZsb3dTaWRlSGFsZiA9IHRoaXMuaXNIYWxmT3ZlckZsb3coY2xpZW50Qm90dG9tIC0gaGFsZkhlaWdodCwgcmVzdENsaWVudFRvcCAtIGhhbGZIZWlnaHQsICh3cmFwcGVyUmVjdC5oZWlnaHQgKyBhbm9fc3BhY2luZykgLyAyKTtcbiAgICAgIGNvbnN0IGlzVmlld1hPdmVyRmxvd1NpZGVIYWxmID0gdGhpcy5pc0hhbGZPdmVyRmxvdyhjbGllbnRSaWdodCAtIGhhbGZXaWR0aCwgcmVzdENsaWVudExlZnQgLSBoYWxmV2lkdGgsICh3cmFwcGVyUmVjdC53aWR0aCArIGFub19zcGFjaW5nKSAvIDIpO1xuICAgICAgY29uc3QgaXNWaWV3WUVub3VnaFNpZGVIYWxmID0gdGhpcy5pc0hhbGZBbGxFbm91Z2goY2xpZW50Qm90dG9tIC0gaGFsZkhlaWdodCwgcmVzdENsaWVudFRvcCAtIGhhbGZIZWlnaHQsICh3cmFwcGVyUmVjdC5oZWlnaHQgKyBhbm9fc3BhY2luZykgLyAyKTtcbiAgICAgIGNvbnN0IGlzVmlld1hFbm91Z2hTaWRlSGFsZiA9IHRoaXMuaXNIYWxmQWxsRW5vdWdoKGNsaWVudFJpZ2h0IC0gaGFsZldpZHRoLCByZXN0Q2xpZW50TGVmdCAtIGhhbGZXaWR0aCwgKHdyYXBwZXJSZWN0LndpZHRoICsgYW5vX3NwYWNpbmcpIC8gMik7XG4gICAgICAvLyBcdTVCQjlcdTU2NjgsIFx1NTM5Rlx1N0E3QVx1OTVGNFx1NEUwRVx1NTNDRFx1NTQxMVx1N0E3QVx1OTVGNFx1NjYyRlx1NTQyNlx1OTBGRFx1NEUwRFx1OERCM1x1NTIyNFx1NjVBRFxuICAgICAgLy8gY29udGFpbmVyLCB3aGV0aGVyIHRoZSBvcmlnaW5hbCBzcGFjZSBhbmQgdGhlIHJldmVyc2Ugc3BhY2UgYXJlIGluc3VmZmljaWVudCB0byBqdWRnZVxuICAgICAgY29uc3QgaXNDb250YWluZXJZT3ZlckZsb3cgPSB0aGlzLmlzT3ZlckZsb3coY2xpZW50VG9wSW5Db250YWluZXIgLSBtYXJnaW5Ub3AsIHJlc3RDbGllbnRCb3R0b21JbkNvbnRhaW5lciAtIG1hcmdpbkJvdHRvbSwgd3JhcHBlclJlY3QuaGVpZ2h0ICsgc3BhY2luZyk7XG4gICAgICBjb25zdCBpc0NvbnRhaW5lclhPdmVyRmxvdyA9IHRoaXMuaXNPdmVyRmxvdyhjbGllbnRMZWZ0SW5Db250YWluZXIgLSBtYXJnaW5MZWZ0LCByZXN0Q2xpZW50UmlnaHRJbkNvbnRhaW5lciAtIG1hcmdpblJpZ2h0LCB3cmFwcGVyUmVjdC53aWR0aCArIHNwYWNpbmcpO1xuICAgICAgY29uc3QgaXNDb250YWluZXJZT3ZlckZsb3dTaWRlID0gdGhpcy5pc092ZXJGbG93KGNsaWVudEJvdHRvbUluQ29udGFpbmVyIC0gbWFyZ2luVG9wLCByZXN0Q2xpZW50VG9wSW5Db250YWluZXIgLSBtYXJnaW5Cb3R0b20sIHdyYXBwZXJSZWN0LmhlaWdodCArIHNwYWNpbmcpO1xuICAgICAgY29uc3QgaXNDb250YWluZXJYT3ZlckZsb3dTaWRlID0gdGhpcy5pc092ZXJGbG93KGNsaWVudFJpZ2h0SW5Db250YWluZXIgLSBtYXJnaW5MZWZ0LCByZXN0Q2xpZW50TGVmdEluQ29udGFpbmVyIC0gbWFyZ2luUmlnaHQsIHdyYXBwZXJSZWN0LndpZHRoICsgc3BhY2luZyk7XG4gICAgICBjb25zdCBpc0NvbnRhaW5lcllPdmVyRmxvd1NpZGVIYWxmID0gdGhpcy5pc0hhbGZPdmVyRmxvdyhjbGllbnRCb3R0b21JbkNvbnRhaW5lciAtIGhhbGZIZWlnaHQsIHJlc3RDbGllbnRUb3BJbkNvbnRhaW5lciAtIGhhbGZIZWlnaHQsICh3cmFwcGVyUmVjdC5oZWlnaHQgKyBhbm9fc3BhY2luZykgLyAyKTtcbiAgICAgIGNvbnN0IGlzQ29udGFpbmVyWE92ZXJGbG93U2lkZUhhbGYgPSB0aGlzLmlzSGFsZk92ZXJGbG93KGNsaWVudFJpZ2h0SW5Db250YWluZXIgLSBoYWxmV2lkdGgsIHJlc3RDbGllbnRMZWZ0SW5Db250YWluZXIgLSBoYWxmV2lkdGgsICh3cmFwcGVyUmVjdC53aWR0aCArIGFub19zcGFjaW5nKSAvIDIpO1xuICAgICAgY29uc3QgaXNDb250YWluZXJZRW5vdWdoU2lkZUhhbGYgPSB0aGlzLmlzSGFsZkFsbEVub3VnaChjbGllbnRCb3R0b21JbkNvbnRhaW5lciAtIGhhbGZIZWlnaHQsIHJlc3RDbGllbnRUb3BJbkNvbnRhaW5lciAtIGhhbGZIZWlnaHQsICh3cmFwcGVyUmVjdC5oZWlnaHQgKyBhbm9fc3BhY2luZykgLyAyKTtcbiAgICAgIGNvbnN0IGlzQ29udGFpbmVyWEVub3VnaFNpZGVIYWxmID0gdGhpcy5pc0hhbGZBbGxFbm91Z2goY2xpZW50UmlnaHRJbkNvbnRhaW5lciAtIGhhbGZXaWR0aCwgcmVzdENsaWVudExlZnRJbkNvbnRhaW5lciAtIGhhbGZXaWR0aCwgKHdyYXBwZXJSZWN0LndpZHRoICsgYW5vX3NwYWNpbmcpIC8gMik7XG4gICAgICAvLyBcdTdFRkNcdTU0MDggdmlld3BvcnQgKyBjb250YWluZXIgXHU1MjI0XHU2NUFEXHU1RkFFXHU4QzAzXHVGRjBDXHU1MzczXHU4OUM2XHU1M0UzICsgXHU1QkI5XHU1NjY4XHU5MEZEXHU2NTNFXHU3RjZFXHU0RTBEXHU4ODRDXHU2NUY2XHU2MjREXHU4MEZEXHU4MDAzXHU4NjUxXHU0RjREXHU3RjZFXHU4QzAzXHU2NTc0XG4gICAgICAvLyBDb21wcmVoZW5zaXZlIHZpZXdwb3J0ICsgY29udGFpbmVyIGp1ZGdtZW50IGZpbmUtdHVuaW5nLCB0aGF0IGlzLCB0aGUgcG9zaXRpb24gYWRqdXN0bWVudCBjYW4gb25seSBiZSBjb25zaWRlcmVkIHdoZW4gdGhlIHZpZXdwb3J0ICsgY29udGFpbmVyIGNhbm5vdCBiZSBwbGFjZWQuXG4gICAgICBjb25zdCBzaG91bGRSZXZlcnNlVG9wID0gdGhpcy5nZXRSZXZlcnNlKGlzVmlld1lPdmVyRmxvdywgaXNDb250YWluZXJZT3ZlckZsb3csIHNob3VsZFZpZXdSZXZlcnNlVG9wLCBzaG91bGRDb250YWluZXJSZXZlcnNlVG9wKTtcbiAgICAgIGNvbnN0IHNob3VsZFJldmVyc2VMZWZ0ID0gdGhpcy5nZXRSZXZlcnNlKGlzVmlld1hPdmVyRmxvdywgaXNDb250YWluZXJYT3ZlckZsb3csIHNob3VsZFZpZXdSZXZlcnNlTGVmdCwgc2hvdWxkQ29udGFpbmVyUmV2ZXJzZUxlZnQpO1xuICAgICAgY29uc3Qgc2hvdWxkUmV2ZXJzZUJvdHRvbSA9IHRoaXMuZ2V0UmV2ZXJzZShpc1ZpZXdZT3ZlckZsb3csIGlzQ29udGFpbmVyWU92ZXJGbG93LCBzaG91bGRWaWV3UmV2ZXJzZUJvdHRvbSwgc2hvdWxkQ29udGFpbmVyUmV2ZXJzZUJvdHRvbSk7XG4gICAgICBjb25zdCBzaG91bGRSZXZlcnNlUmlnaHQgPSB0aGlzLmdldFJldmVyc2UoaXNWaWV3WE92ZXJGbG93LCBpc0NvbnRhaW5lclhPdmVyRmxvdywgc2hvdWxkVmlld1JldmVyc2VSaWdodCwgc2hvdWxkQ29udGFpbmVyUmV2ZXJzZVJpZ2h0KTtcbiAgICAgIC8vIGNvbnN0IHNob3VsZFJldmVyc2VUb3BPdmVyID0gdGhpcy5nZXRSZXZlcnNlKGlzVmlld1lPdmVyRmxvd1NpZGUsIGlzQ29udGFpbmVyWU92ZXJGbG93U2lkZSwgc2hvdWxkVmlld1JldmVyc2VUb3BPdmVyLCBzaG91bGRDb250YWluZXJSZXZlcnNlVG9wT3Zlcik7XG4gICAgICAvLyBjb25zdCBzaG91bGRSZXZlcnNlQm90dG9tT3ZlciA9IHRoaXMuZ2V0UmV2ZXJzZShpc1ZpZXdZT3ZlckZsb3dTaWRlLCBpc0NvbnRhaW5lcllPdmVyRmxvd1NpZGUsIHNob3VsZFZpZXdSZXZlcnNlQm90dG9tT3Zlciwgc2hvdWxkQ29udGFpbmVyUmV2ZXJzZUJvdHRvbU92ZXIpO1xuICAgICAgY29uc3Qgc2hvdWxkUmV2ZXJzZVRvcFNpZGUgPSB0aGlzLmdldFJldmVyc2UoaXNWaWV3WU92ZXJGbG93U2lkZSwgaXNDb250YWluZXJZT3ZlckZsb3dTaWRlLCBzaG91bGRWaWV3UmV2ZXJzZVRvcFNpZGUsIHNob3VsZENvbnRhaW5lclJldmVyc2VUb3BTaWRlKTtcbiAgICAgIGNvbnN0IHNob3VsZFJldmVyc2VCb3R0b21TaWRlID0gdGhpcy5nZXRSZXZlcnNlKGlzVmlld1lPdmVyRmxvd1NpZGUsIGlzQ29udGFpbmVyWU92ZXJGbG93U2lkZSwgc2hvdWxkVmlld1JldmVyc2VCb3R0b21TaWRlLCBzaG91bGRDb250YWluZXJSZXZlcnNlQm90dG9tU2lkZSk7XG4gICAgICBjb25zdCBzaG91bGRSZXZlcnNlTGVmdFNpZGUgPSB0aGlzLmdldFJldmVyc2UoaXNWaWV3WE92ZXJGbG93U2lkZSwgaXNDb250YWluZXJYT3ZlckZsb3dTaWRlLCBzaG91bGRWaWV3UmV2ZXJzZUxlZnRTaWRlLCBzaG91bGRDb250YWluZXJSZXZlcnNlTGVmdFNpZGUpO1xuICAgICAgY29uc3Qgc2hvdWxkUmV2ZXJzZVJpZ2h0U2lkZSA9IHRoaXMuZ2V0UmV2ZXJzZShpc1ZpZXdYT3ZlckZsb3dTaWRlLCBpc0NvbnRhaW5lclhPdmVyRmxvd1NpZGUsIHNob3VsZFZpZXdSZXZlcnNlUmlnaHRTaWRlLCBzaG91bGRDb250YWluZXJSZXZlcnNlUmlnaHRTaWRlKTtcbiAgICAgIGNvbnN0IGlzWU92ZXJGbG93U2lkZUhhbGYgPSBpc1ZpZXdZT3ZlckZsb3dTaWRlSGFsZiAmJiBpc0NvbnRhaW5lcllPdmVyRmxvd1NpZGVIYWxmO1xuICAgICAgY29uc3QgaXNYT3ZlckZsb3dTaWRlSGFsZiA9IGlzVmlld1hPdmVyRmxvd1NpZGVIYWxmICYmIGlzQ29udGFpbmVyWE92ZXJGbG93U2lkZUhhbGY7XG4gICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgaWYgKHNob3VsZFJldmVyc2VUb3ApIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzWE92ZXJGbG93U2lkZUhhbGYgJiYgKHNob3VsZFJldmVyc2VMZWZ0U2lkZSB8fCBzaG91bGRSZXZlcnNlUmlnaHRTaWRlKSkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24sIHRydWUsICdleHBhbmQnLCBzaG91bGRSZXZlcnNlTGVmdFNpZGUgPyAnUmlnaHQnIDogJ0xlZnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlVG9wKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlTGVmdFNpZGUgJiYgd2lkdGhJc0JpZ2dlcikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNXaWR0aE92ZXJGbG93ICYmIChpc1ZpZXdYRW5vdWdoU2lkZUhhbGYgfHwgaXNDb250YWluZXJYRW5vdWdoU2lkZUhhbGYpKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgdHJ1ZSwgJ3JlZHVjZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlVG9wKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlUmlnaHRTaWRlICYmIHdpZHRoSXNCaWdnZXIpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzV2lkdGhPdmVyRmxvdyAmJiAoaXNWaWV3WEVub3VnaFNpZGVIYWxmIHx8IGlzQ29udGFpbmVyWEVub3VnaFNpZGVIYWxmKSkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24sIHRydWUsICdyZWR1Y2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlTGVmdCkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNZT3ZlckZsb3dTaWRlSGFsZiAmJiAoc2hvdWxkUmV2ZXJzZVRvcFNpZGUgfHwgc2hvdWxkUmV2ZXJzZUJvdHRvbVNpZGUpKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgZmFsc2UsICdleHBhbmQnLCBzaG91bGRSZXZlcnNlVG9wU2lkZSA/ICdCb3R0b20nIDogJ1RvcCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdFRvcCc6XG4gICAgICAgICAgaWYgKHNob3VsZFJldmVyc2VMZWZ0KSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlVG9wU2lkZSAmJiBoZWlnaHRJc0JpZ2dlcikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIZWlnaHRPdmVyRmxvdyAmJiAoaXNWaWV3WUVub3VnaFNpZGVIYWxmIHx8IGlzQ29udGFpbmVyWUVub3VnaFNpZGVIYWxmKSkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24sIGZhbHNlLCAncmVkdWNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsZWZ0Qm90dG9tJzpcbiAgICAgICAgICBpZiAoc2hvdWxkUmV2ZXJzZUxlZnQpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNob3VsZFJldmVyc2VCb3R0b21TaWRlICYmIGhlaWdodElzQmlnZ2VyKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0hlaWdodE92ZXJGbG93ICYmIChpc1ZpZXdZRW5vdWdoU2lkZUhhbGYgfHwgaXNDb250YWluZXJZRW5vdWdoU2lkZUhhbGYpKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgZmFsc2UsICdyZWR1Y2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgaWYgKHNob3VsZFJldmVyc2VCb3R0b20pIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzWE92ZXJGbG93U2lkZUhhbGYgJiYgKHNob3VsZFJldmVyc2VMZWZ0U2lkZSB8fCBzaG91bGRSZXZlcnNlUmlnaHRTaWRlKSkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24sIHRydWUsICdleHBhbmQnLCBzaG91bGRSZXZlcnNlTGVmdFNpZGUgPyAnUmlnaHQnIDogJ0xlZnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlQm90dG9tKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlTGVmdFNpZGUgJiYgd2lkdGhJc0JpZ2dlcikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNXaWR0aE92ZXJGbG93ICYmIChpc1ZpZXdYRW5vdWdoU2lkZUhhbGYgfHwgaXNDb250YWluZXJYRW5vdWdoU2lkZUhhbGYpKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgdHJ1ZSwgJ3JlZHVjZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tUmlnaHQnOlxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlQm90dG9tKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlUmlnaHRTaWRlICYmIHdpZHRoSXNCaWdnZXIpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzV2lkdGhPdmVyRmxvdyAmJiAoaXNWaWV3WEVub3VnaFNpZGVIYWxmIHx8IGlzQ29udGFpbmVyWEVub3VnaFNpZGVIYWxmKSkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24sIHRydWUsICdyZWR1Y2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBpZiAoc2hvdWxkUmV2ZXJzZVJpZ2h0KSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1lPdmVyRmxvd1NpZGVIYWxmICYmIChzaG91bGRSZXZlcnNlVG9wU2lkZSB8fCBzaG91bGRSZXZlcnNlQm90dG9tU2lkZSkpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uLCBmYWxzZSwgJ2V4cGFuZCcsIHNob3VsZFJldmVyc2VUb3BTaWRlID8gJ0JvdHRvbScgOiAnVG9wJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodFRvcCc6XG4gICAgICAgICAgaWYgKHNob3VsZFJldmVyc2VSaWdodCkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdWxkUmV2ZXJzZVRvcFNpZGUgJiYgaGVpZ2h0SXNCaWdnZXIpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzSGVpZ2h0T3ZlckZsb3cgJiYgKGlzVmlld1lFbm91Z2hTaWRlSGFsZiB8fCBpc0NvbnRhaW5lcllFbm91Z2hTaWRlSGFsZikpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uLCBmYWxzZSwgJ3JlZHVjZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHRCb3R0b20nOlxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlUmlnaHQpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNob3VsZFJldmVyc2VCb3R0b21TaWRlICYmIGhlaWdodElzQmlnZ2VyKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0hlaWdodE92ZXJGbG93ICYmIChpc1ZpZXdZRW5vdWdoU2lkZUhhbGYgfHwgaXNDb250YWluZXJZRW5vdWdoU2lkZUhhbGYpKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbiwgZmFsc2UsICdyZWR1Y2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnRUb3BPdmVyJzpcbiAgICAgICAgICBpZiAoc2hvdWxkUmV2ZXJzZVRvcE92ZXIpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNob3VsZFJldmVyc2VMZWZ0T3Zlcikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdEJvdHRvbU92ZXInOlxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlQm90dG9tT3Zlcikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdWxkUmV2ZXJzZUxlZnRPdmVyKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuX2FkanVzdFBvcyhwb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodFRvcE92ZXInOlxuICAgICAgICAgIGlmIChzaG91bGRSZXZlcnNlVG9wT3Zlcikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdWxkUmV2ZXJzZVJpZ2h0T3Zlcikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLl9hZGp1c3RQb3MocG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHRCb3R0b21PdmVyJzpcbiAgICAgICAgICBpZiAoc2hvdWxkUmV2ZXJzZUJvdHRvbU92ZXIpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNob3VsZFJldmVyc2VSaWdodE92ZXIpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fYWRqdXN0UG9zKHBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBcdTUyMjRcdTY1QURcdTZFQTJcdTUxRkEgSnVkZ21lbnQgb3ZlcmZsb3dcbiAgICAgIC8vIFx1NEUwQVx1NEUwQlx1NjVCOVx1NTQxMSB0b3AgYW5kIGJvdHRvbVxuICAgICAgaWYgKHRoaXMuaXNUQihwb3NpdGlvbikpIHtcbiAgICAgICAgaXNIZWlnaHRPdmVyRmxvdyA9IGlzVmlld1lPdmVyRmxvdyAmJiBpc0NvbnRhaW5lcllPdmVyRmxvdztcbiAgICAgICAgLy8gUmVsYXRlZCBQUjogaHR0cHM6Ly9naXRodWIuY29tL0RvdXlpbkZFL3NlbWktZGVzaWduL3B1bGwvMTI5N1xuICAgICAgICAvLyBJZiBjbGllbnRSaWdodCBvciByZXN0Q2xpZW50UmlnaHQgbGVzcyB0aGFuIDAsIG1lYW5zIHRoYXQgdGhlIGxlZnQgYW5kIHJpZ2h0IHBhcnRzIG9mIHRoZSB0cmlnZ2VyIGFyZSBibG9ja2VkXG4gICAgICAgIC8vIFRoZW4gdGhlIGRpc3BsYXkgb2YgdGhlIHdyYXBwZXIgd2lsbCBhbHNvIGJlIGFmZmVjdGVkLCBtYWtlIHdpZHRoIG92ZXJmbG93IHRvIG9mZnNldCB0aGUgd3JhcHBlclxuICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnIHx8IHBvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlzV2lkdGhPdmVyRmxvdyA9IGlzVmlld1hPdmVyRmxvd1NpZGVIYWxmICYmIGlzQ29udGFpbmVyWE92ZXJGbG93U2lkZUhhbGYgfHwgY2xpZW50UmlnaHQgPCAwIHx8IHJlc3RDbGllbnRSaWdodCA8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXNXaWR0aE92ZXJGbG93ID0gaXNWaWV3WE92ZXJGbG93U2lkZSAmJiBpc0NvbnRhaW5lclhPdmVyRmxvd1NpZGUgfHwgY2xpZW50UmlnaHQgPCAwIHx8IHJlc3RDbGllbnRSaWdodCA8IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFx1NURFNlx1NTNGM1x1NjVCOVx1NTQxMSBsZWZ0IGFuZCByaWdodFxuICAgICAgaWYgKHRoaXMuaXNMUihwb3NpdGlvbikpIHtcbiAgICAgICAgaXNXaWR0aE92ZXJGbG93ID0gaXNWaWV3WE92ZXJGbG93ICYmIGlzQ29udGFpbmVyWE92ZXJGbG93O1xuICAgICAgICAvLyBJZiBjbGllbnRUb3Agb3IgcmVzdENsaWVudFRvcCBsZXNzIHRoYW4gMCwgbWVhbnMgdGhhdCB0aGUgdG9wIGFuZCBib3R0b20gcGFydHMgb2YgdGhlIHRyaWdnZXIgYXJlIGJsb2NrZWRcbiAgICAgICAgLy8gVGhlbiB0aGUgZGlzcGxheSBvZiB0aGUgd3JhcHBlciB3aWxsIGFsc28gYmUgYWZmZWN0ZWQsIG1ha2UgaGVpZ2h0IG92ZXJmbG93IHRvIG9mZnNldCB0aGUgd3JhcHBlclxuICAgICAgICBpZiAocG9zaXRpb24gPT09ICdsZWZ0JyB8fCBwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlzSGVpZ2h0T3ZlckZsb3cgPSBpc1ZpZXdZT3ZlckZsb3dTaWRlSGFsZiAmJiBpc0NvbnRhaW5lcllPdmVyRmxvd1NpZGVIYWxmIHx8IGNsaWVudFRvcCA8IDAgfHwgcmVzdENsaWVudFRvcCA8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXNIZWlnaHRPdmVyRmxvdyA9IGlzVmlld1lPdmVyRmxvd1NpZGUgJiYgaXNDb250YWluZXJZT3ZlckZsb3dTaWRlIHx8IGNsaWVudFRvcCA8IDAgfHwgcmVzdENsaWVudFRvcCA8IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgaXNIZWlnaHRPdmVyRmxvdyxcbiAgICAgIGlzV2lkdGhPdmVyRmxvd1xuICAgIH07XG4gIH1cbiAgX2JpbmRTY3JvbGxFdmVudCgpIHtcbiAgICB0aGlzLl9hZGFwdGVyLnJlZ2lzdGVyU2Nyb2xsSGFuZGxlcigoKSA9PiB0aGlzLmNhbGNQb3NpdGlvbigpKTtcbiAgICAvLyBDYXB0dXJlIHNjcm9sbCBldmVudHMgb24gdGhlIHdpbmRvdyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxpbmcgYXJlYSAoZS50YXJnZXQpIHdpbGwgYWZmZWN0IHRoZSBwb3NpdGlvbmluZyBvZiB0aGUgcG9wLXVwIGxheWVyIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydCB3aGVuIHNjcm9sbGluZ1xuICAgIC8vIChCeSBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBlLnRhcmdldCBjb250YWlucyB0aGUgdHJpZ2dlckRvbSBvZiB0aGUgY3VycmVudCB0b29sdGlwKSBJZiBzbywgdGhlIHBvcC11cCBsYXllciB3aWxsIGFsc28gYmUgYWZmZWN0ZWQgYW5kIG5lZWRzIHRvIGJlIHJlcG9zaXRpb25lZFxuICB9XG4gIHVuQmluZFNjcm9sbEV2ZW50KCkge1xuICAgIHRoaXMuX2FkYXB0ZXIudW5yZWdpc3RlclNjcm9sbEhhbmRsZXIoKTtcbiAgfVxuICBfaW5pdENvbnRhaW5lclBvc2l0aW9uKCkge1xuICAgIHRoaXMuX2FkYXB0ZXIudXBkYXRlQ29udGFpbmVyUG9zaXRpb24oKTtcbiAgfVxuICBfaGFuZGxlVHJpZ2dlcktleWRvd24oZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBjbG9zZU9uRXNjLFxuICAgICAgZGlzYWJsZUFycm93S2V5RG93blxuICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fYWRhcHRlci5nZXRDb250YWluZXIoKTtcbiAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IHRoaXMuX2FkYXB0ZXIuZ2V0Rm9jdXNhYmxlRWxlbWVudHMoY29udGFpbmVyKTtcbiAgICBjb25zdCBmb2N1c2FibGVOdW0gPSBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGg7XG4gICAgc3dpdGNoIChldmVudCAmJiBldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgXCJFc2NhcGVcIjpcbiAgICAgICAgaGFuZGxlUHJldmVudChldmVudCk7XG4gICAgICAgIGNsb3NlT25Fc2MgJiYgdGhpcy5faGFuZGxlRXNjS2V5RG93bihldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgLy8gd2hlbiBkaXNhYmxlQXJyb3dLZXlEb3duIGlzIHRydWUsIGRpc2FibGUgdG9vbHRpcCdzIGFycm93IGtleWJvYXJkIGV2ZW50IGFjdGlvblxuICAgICAgICAhZGlzYWJsZUFycm93S2V5RG93biAmJiBmb2N1c2FibGVOdW0gJiYgdGhpcy5faGFuZGxlVHJpZ2dlckFycm93VXBLZXlkb3duKGZvY3VzYWJsZUVsZW1lbnRzLCBldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93RG93blwiOlxuICAgICAgICAhZGlzYWJsZUFycm93S2V5RG93biAmJiBmb2N1c2FibGVOdW0gJiYgdGhpcy5faGFuZGxlVHJpZ2dlckFycm93RG93bktleWRvd24oZm9jdXNhYmxlRWxlbWVudHMsIGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIGZvY3VzIHRyaWdnZXJcbiAgICpcbiAgICogd2hlbiB0cmlnZ2VyIGlzICdmb2N1cycgb3IgJ2hvdmVyJywgb25Gb2N1cyBpcyBiaW5kIHRvIHNob3cgcG9wdXBcbiAgICogaWYgd2UgZm9jdXMgdHJpZ2dlciwgcG9wdXAgd2lsbCBzaG93IGFnYWluXG4gICAqXG4gICAqIFx1NTk4Mlx1Njc5QyB0cmlnZ2VyIFx1NjYyRiBmb2N1cyBcdTYyMTZcdTgwMDUgaG92ZXJcdUZGMENcdTUyMTlcdTVCODNcdTdFRDFcdTVCOUFcdTRFODYgb25Gb2N1c1x1RkYwQ1x1OEZEOVx1OTFDQ1x1NjIxMVx1NEVFQ1x1NTk4Mlx1Njc5Q1x1OTFDRFx1NjVCMCBmb2N1cyBcdTc2ODRcdThCRERcdUZGMENwb3B1cCBcdTRGMUFcdTUxOERcdTZCMjFcdTYyNTNcdTVGMDBcbiAgICogXHU1NkUwXHU2QjY0IHJldHVybkZvY3VzT25DbG9zZSBcdTUzRUFcdTY1MkZcdTYzMDEgY2xpY2sgdHJpZ2dlclxuICAgKi9cbiAgZm9jdXNUcmlnZ2VyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyaWdnZXIsXG4gICAgICByZXR1cm5Gb2N1c09uQ2xvc2UsXG4gICAgICBwcmV2ZW50U2Nyb2xsXG4gICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBpZiAocmV0dXJuRm9jdXNPbkNsb3NlICYmIHRyaWdnZXIgIT09ICdjdXN0b20nKSB7XG4gICAgICBjb25zdCB0cmlnZ2VyTm9kZSA9IHRoaXMuX2FkYXB0ZXIuZ2V0VHJpZ2dlck5vZGUoKTtcbiAgICAgIGlmICh0cmlnZ2VyTm9kZSAmJiAnZm9jdXMnIGluIHRyaWdnZXJOb2RlKSB7XG4gICAgICAgIHRyaWdnZXJOb2RlLmZvY3VzKHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfaGFuZGxlRXNjS2V5RG93bihldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyaWdnZXJcbiAgICB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgIGlmICh0cmlnZ2VyICE9PSAnY3VzdG9tJykge1xuICAgICAgLy8gTW92ZSB0aGUgZm9jdXMgaW50byB0aGUgdHJpZ2dlciBmaXJzdCBhbmQgdGhlbiBjbG9zZSB0aGUgcG9wLXVwIGxheWVyIFxuICAgICAgLy8gdG8gYXZvaWQgdGhlIHByb2JsZW0gb2Ygb3BlbmluZyB0aGUgcG9wLXVwIGxheWVyIGFnYWluIHdoZW4gdGhlIGZvY3VzIHJldHVybnMgdG8gdGhlIHRyaWdnZXIgaW4gdGhlIGNhc2Ugb2YgaG92ZXIgYW5kIGZvY3VzXG4gICAgICB0aGlzLmZvY3VzVHJpZ2dlcigpO1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICAgIHRoaXMuX2FkYXB0ZXIubm90aWZ5RXNjS2V5ZG93bihldmVudCk7XG4gIH1cbiAgX2hhbmRsZUNvbnRhaW5lclRhYktleURvd24oZm9jdXNhYmxlRWxlbWVudHMsIGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudFNjcm9sbFxuICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuX2FkYXB0ZXIuZ2V0QWN0aXZlRWxlbWVudCgpO1xuICAgIGNvbnN0IGlzTGFzdEN1cnJlbnRGb2N1cyA9IGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDFdID09PSBhY3RpdmVFbGVtZW50O1xuICAgIGlmIChpc0xhc3RDdXJyZW50Rm9jdXMpIHtcbiAgICAgIGZvY3VzYWJsZUVsZW1lbnRzWzBdLmZvY3VzKHtcbiAgICAgICAgcHJldmVudFNjcm9sbFxuICAgICAgfSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50IGJyb3dzZXIgZGVmYXVsdCB0YWIgbW92ZSBiZWhhdmlvclxuICAgIH1cbiAgfVxuICBfaGFuZGxlQ29udGFpbmVyU2hpZnRUYWJLZXlEb3duKGZvY3VzYWJsZUVsZW1lbnRzLCBldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZXZlbnRTY3JvbGxcbiAgICB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9hZGFwdGVyLmdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICBjb25zdCBpc0ZpcnN0Q3VycmVudEZvY3VzID0gZm9jdXNhYmxlRWxlbWVudHNbMF0gPT09IGFjdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGlzRmlyc3RDdXJyZW50Rm9jdXMpIHtcbiAgICAgIGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKHtcbiAgICAgICAgcHJldmVudFNjcm9sbFxuICAgICAgfSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50IGJyb3dzZXIgZGVmYXVsdCB0YWIgbW92ZSBiZWhhdmlvclxuICAgIH1cbiAgfVxuICBfaGFuZGxlVHJpZ2dlckFycm93RG93bktleWRvd24oZm9jdXNhYmxlRWxlbWVudHMsIGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudFNjcm9sbFxuICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgZm9jdXNhYmxlRWxlbWVudHNbMF0uZm9jdXMoe1xuICAgICAgcHJldmVudFNjcm9sbFxuICAgIH0pO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnQgYnJvd3NlciBkZWZhdWx0IHNjcm9sbCBiZWhhdmlvclxuICB9XG4gIF9oYW5kbGVUcmlnZ2VyQXJyb3dVcEtleWRvd24oZm9jdXNhYmxlRWxlbWVudHMsIGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudFNjcm9sbFxuICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV0uZm9jdXMoe1xuICAgICAgcHJldmVudFNjcm9sbFxuICAgIH0pO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnQgYnJvd3NlciBkZWZhdWx0IHNjcm9sbCBiZWhhdmlvclxuICB9XG59IiwgImltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUHJldmVudChldmVudCkge1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW50YWJsZUNoYXJhY3RlcihzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5sZW5ndGggPT09IDEgJiYgc3RyaW5nLm1hdGNoKC9cXFMvKTtcbn1cbi8vIHNldCBmb2N1cyB0byB0aGUgdGFyZ2V0IGl0ZW0gaW4gaXRlbSBsaXN0XG5leHBvcnQgZnVuY3Rpb24gc2V0Rm9jdXNUb0l0ZW0oaXRlbU5vZGVzLCB0YXJnZXRJdGVtKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbU5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGl0ZW1Ob2Rlc1tpXSA9PT0gdGFyZ2V0SXRlbSkge1xuICAgICAgaXRlbU5vZGVzW2ldLnRhYkluZGV4ID0gMDtcbiAgICAgIGl0ZW1Ob2Rlc1tpXS5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtTm9kZXNbaV0udGFiSW5kZXggPSAtMTtcbiAgICB9XG4gIH1cbn1cbi8vIHNldCBmb2N1cyB0byB0aGUgZmlyc3QgaXRlbSBpbiBpdGVtIGxpc3RcbmV4cG9ydCBmdW5jdGlvbiBzZXRGb2N1c1RvRmlyc3RJdGVtKGl0ZW1Ob2Rlcykge1xuICBpdGVtTm9kZXMubGVuZ3RoID4gMCAmJiBzZXRGb2N1c1RvSXRlbShpdGVtTm9kZXMsIGl0ZW1Ob2Rlc1swXSk7XG59XG4vLyBzZXQgZm9jdXMgdG8gdGhlIGxhc3QgaXRlbSBpbiBpdGVtIGxpc3RcbmV4cG9ydCBmdW5jdGlvbiBzZXRGb2N1c1RvTGFzdEl0ZW0oaXRlbU5vZGVzKSB7XG4gIGl0ZW1Ob2Rlcy5sZW5ndGggPiAwICYmIHNldEZvY3VzVG9JdGVtKGl0ZW1Ob2RlcywgaXRlbU5vZGVzW2l0ZW1Ob2Rlcy5sZW5ndGggLSAxXSk7XG59XG4vLyBzZXQgZm9jdXMgdG8gdGhlIHByZXZpb3VzIGl0ZW0gaW4gaXRlbSBsaXN0XG5leHBvcnQgZnVuY3Rpb24gc2V0Rm9jdXNUb1ByZXZpb3VzTWVudUl0ZW0oaXRlbU5vZGVzLCBjdXJyZW50SXRlbSkge1xuICBsZXQgbmV3TWVudUl0ZW0sIGluZGV4O1xuICBpZiAoaXRlbU5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoY3VycmVudEl0ZW0gPT09IGl0ZW1Ob2Rlc1swXSkge1xuICAgICAgbmV3TWVudUl0ZW0gPSBpdGVtTm9kZXNbaXRlbU5vZGVzLmxlbmd0aCAtIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCA9IGl0ZW1Ob2Rlcy5pbmRleE9mKGN1cnJlbnRJdGVtKTtcbiAgICAgIG5ld01lbnVJdGVtID0gaXRlbU5vZGVzW2luZGV4IC0gMV07XG4gICAgfVxuICAgIHNldEZvY3VzVG9JdGVtKGl0ZW1Ob2RlcywgbmV3TWVudUl0ZW0pO1xuICB9XG59XG4vLyBzZXQgZm9jdXMgdG8gdGhlIG5leHQgaXRlbSBpbiBpdGVtIGxpc3RcbmV4cG9ydCBmdW5jdGlvbiBzZXRGb2N1c1RvTmV4dE1lbnVpdGVtKGl0ZW1Ob2RlcywgY3VycmVudEl0ZW0pIHtcbiAgbGV0IG5ld01lbnVJdGVtLCBpbmRleDtcbiAgaWYgKGl0ZW1Ob2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKGN1cnJlbnRJdGVtID09PSBpdGVtTm9kZXNbaXRlbU5vZGVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBuZXdNZW51SXRlbSA9IGl0ZW1Ob2Rlc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXggPSBpdGVtTm9kZXMuaW5kZXhPZihjdXJyZW50SXRlbSk7XG4gICAgICBuZXdNZW51SXRlbSA9IGl0ZW1Ob2Rlc1tpbmRleCArIDFdO1xuICAgIH1cbiAgICBzZXRGb2N1c1RvSXRlbShpdGVtTm9kZXMsIG5ld01lbnVJdGVtKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbmRleEJ5Q2hhcmFjdGVyKGl0ZW1MaXN0LCBjdXJJdGVtLCBmaXJzdENoYXJMaXN0LCBjaGFyKSB7XG4gIGxldCBzdGFydCwgaW5kZXg7XG4gIGlmICghaXRlbUxpc3QgfHwgIWZpcnN0Q2hhckxpc3QgfHwgIWNoYXIgfHwgY2hhci5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGNoYXIgPSBjaGFyLnRvTG93ZXJDYXNlKCk7XG4gIC8vIEdldCBzdGFydCBpbmRleCBmb3Igc2VhcmNoIGJhc2VkIG9uIHBvc2l0aW9uIG9mIGN1cnJlbnRJdGVtXG4gIHN0YXJ0ID0gaXRlbUxpc3QuaW5kZXhPZihjdXJJdGVtKSArIDE7XG4gIGlmIChzdGFydCA+PSBpdGVtTGlzdC5sZW5ndGgpIHtcbiAgICBzdGFydCA9IDA7XG4gIH1cbiAgLy8gQ2hlY2sgcmVtYWluaW5nIG1lbnUgaXRlbXMgaW4gdGhlIG1lbnVcbiAgaW5kZXggPSBmaXJzdENoYXJMaXN0LmluZGV4T2YoY2hhciwgc3RhcnQpO1xuICAvLyBJZiBub3QgZm91bmQgaW4gcmVtYWluaW5nIG1lbnUgaXRlbXMsIGNoZWNrIGZyb20gYmVnaW5uaW5nXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBpbmRleCA9IGZpcnN0Q2hhckxpc3QuaW5kZXhPZihjaGFyLCAwKTtcbiAgfVxuICByZXR1cm4gaW5kZXggPj0gMCA/IGluZGV4IDogLTE7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5jZXN0b3JOb2RlQnlSb2xlKGN1ckVsZW1lbnQsIHJvbGUpIHtcbiAgaWYgKCFjdXJFbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgd2hpbGUgKGN1ckVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBfZ2V0KGN1ckVsZW1lbnQucGFyZW50RWxlbWVudCwgJ2F0dHJpYnV0ZXMucm9sZS52YWx1ZScsICcnKSAhPT0gcm9sZSkge1xuICAgIGN1ckVsZW1lbnQgPSBjdXJFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGN1ckVsZW1lbnQucGFyZW50RWxlbWVudDtcbn1cbi8vIEFjY29yZGluZyB0byB0aGUgSWQsIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YS1wb3B1cGlkIGVsZW1lbnRcbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW51QnV0dG9uKGZvY3VzYWJsZUVsZSwgSWQpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb2N1c2FibGVFbGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXJBcmlEZXNjcmliZWRieSA9IGZvY3VzYWJsZUVsZVtpXS5hdHRyaWJ1dGVzWydkYXRhLXBvcHVwaWQnXTtcbiAgICBpZiAoY3VyQXJpRGVzY3JpYmVkYnkgJiYgY3VyQXJpRGVzY3JpYmVkYnkudmFsdWUgPT09IElkKSB7XG4gICAgICByZXR1cm4gZm9jdXNhYmxlRWxlW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10b29sdGlwYFxufTtcbmNvbnN0IHN0cmluZ3MgPSB7XG4gIFBPU0lUSU9OX1NFVDogWyd0b3AnLCAndG9wTGVmdCcsICd0b3BSaWdodCcsICdsZWZ0JywgJ2xlZnRUb3AnLCAnbGVmdEJvdHRvbScsICdyaWdodCcsICdyaWdodFRvcCcsICdyaWdodEJvdHRvbScsICdib3R0b20nLCAnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsICdsZWZ0VG9wT3ZlcicsICdyaWdodFRvcE92ZXInLCAnbGVmdEJvdHRvbU92ZXInLCAncmlnaHRCb3R0b21PdmVyJ10sXG4gIFRSSUdHRVJfU0VUOiBbJ2hvdmVyJywgJ2ZvY3VzJywgJ2NsaWNrJywgJ2N1c3RvbScsICdjb250ZXh0TWVudSddLFxuICBTVEFUVVNfRElTQUJMRUQ6ICdkaXNhYmxlZCcsXG4gIFNUQVRVU19MT0FESU5HOiAnbG9hZGluZydcbn07XG5jb25zdCBudW1iZXJzID0ge1xuICBBUlJPV19CT1VORElORzoge1xuICAgIG9mZnNldFg6IDAsXG4gICAgb2Zmc2V0WTogMixcbiAgICB3aWR0aDogMjQsXG4gICAgaGVpZ2h0OiA3XG4gIH0sXG4gIERFRkFVTFRfWl9JTkRFWDogMTA2MCxcbiAgTU9VU0VfRU5URVJfREVMQVk6IDUwLFxuICBNT1VTRV9MRUFWRV9ERUxBWTogNTAsXG4gIFNQQUNJTkc6IDgsXG4gIE1BUkdJTjogMFxufTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MsIG51bWJlcnMgfTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VXVpZChwcmVmaXgpIHtcbiAgcmV0dXJuIGAke3ByZWZpeH0tJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX0tJHtNYXRoLnJhbmRvbSgpfWA7XG59XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvY3JlYXRlLWd1aWQtdXVpZC1pbi1qYXZhc2NyaXB0XG5mdW5jdGlvbiBnZXRVdWlkdjQoKSB7XG4gIHZhciBfYSwgX2I7XG4gIHRyeSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAoX2IgPSAoX2EgPSBjcnlwdG8gPT09IG51bGwgfHwgY3J5cHRvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjcnlwdG8ucmFuZG9tVVVJRCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY3J5cHRvKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogU3RyaW5nKDFlNyArIC0xZTMgKyAtNGUzICsgLThlMyArIC0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLCBjID0+IChOdW1iZXIoYykgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+IE51bWJlcihjKSAvIDQpLnRvU3RyaW5nKDE2KSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBnZXRVdWlkKCdzZW1pJyk7XG4gIH1cbn1cbi8qKlxuICogR2V0IGEgcmFuZG9tIGlkIHdpdGggcHJlZml4LCBpdCBub3Qgc3RyaWN0bHkgZ3VhcmFudGVlIGlkIHVuaXF1ZW5lc3NcbiAqXG4gKiBOb3RlOiB0aGUgcmV0dXJuIHZhbHVlIG9mIGdldFV1aWQgaXMgdG9vIGxvbmcsIHdlIG5lZWQgYSBzaG9ydCBvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogZ2V0VXVpZFNob3J0KHsgcHJlZml4OiAnc2VtaScgfSkgPT4gJ3NlbWktNDZkaW56YydcbiAqIGdldFV1aWRTaG9ydCh7IHByZWZpeDogJycgfSkgPT4gJzBlZXIyaTAnXG4gKiBnZXRVdWlkU2hvcnQoeyBwcmVmaXg6ICdzZW1pJywgbGVuZ3RoOiA0IH0pID0+ICdzZW1pLThqdHMnXG4gKi9cbmZ1bmN0aW9uIGdldFV1aWRTaG9ydCgpIHtcbiAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICBjb25zdCB7XG4gICAgcHJlZml4ID0gJycsXG4gICAgbGVuZ3RoID0gN1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2hhcmFjdGVycyA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonO1xuICBjb25zdCB0b3RhbCA9IGNoYXJhY3RlcnMubGVuZ3RoO1xuICBsZXQgcmFuZG9tSWQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRvdGFsKTtcbiAgICByYW5kb21JZCArPSBjaGFyYWN0ZXJzLmNoYXJBdChyYW5kb20pO1xuICB9XG4gIHJldHVybiBwcmVmaXggPyBgJHtwcmVmaXh9LSR7cmFuZG9tSWR9YCA6IHJhbmRvbUlkO1xufVxuZXhwb3J0IHsgZ2V0VXVpZCwgZ2V0VXVpZHY0LCBnZXRVdWlkU2hvcnQgfTsiLCAiLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzMxOTk5NTkvaG93LXRvLWRldGVjdC1hLXJlYWN0LWNvbXBvbmVudC12cy1hLXJlYWN0LWVsZW1lbnRcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZG9tJztcbmZ1bmN0aW9uIGlzQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiB0eXBlb2YgY29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmIEJvb2xlYW4oY29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb25hbENvbXBvbmVudChDb21wb25lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiZcbiAgLy8gY2FuIGJlIHZhcmlvdXMgdGhpbmdzXG4gICEoQ29tcG9uZW50LnByb3RvdHlwZSAmJiBDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgLy8gbmF0aXZlIGFycm93cyBkb24ndCBoYXZlIHByb3RvdHlwZXNcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzUmVhY3RDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgfHwgaXNGdW5jdGlvbmFsQ29tcG9uZW50KGNvbXBvbmVudCk7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpO1xufVxuZnVuY3Rpb24gaXNDb21wb3NpdGVUeXBlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBpc0VsZW1lbnQoZWxlbWVudCkgJiYgdHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzRW1wdHlDaGlsZHJlbihjaGlsZHJlbikge1xuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAwO1xufVxuZXhwb3J0IHsgaXNDbGFzc0NvbXBvbmVudCwgaXNGdW5jdGlvbmFsQ29tcG9uZW50LCBpc1JlYWN0Q29tcG9uZW50LCBpc0VsZW1lbnQsXG4vLyBpc0RPTVR5cGVFbGVtZW50LFxuaXNIVE1MRWxlbWVudCwgaXNDb21wb3NpdGVUeXBlRWxlbWVudCwgaXNFbXB0eUNoaWxkcmVuIH07IiwgImltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgX3NldCBmcm9tIFwibG9kYXNoL3NldFwiO1xuaW1wb3J0IF9jbG9uZURlZXBXaXRoIGZyb20gXCJsb2Rhc2gvY2xvbmVEZWVwV2l0aFwiO1xudmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvd2FybmluZyc7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZG9tJztcbmltcG9ydCBzZW1pR2xvYmFsIGZyb20gXCIuL3NlbWktZ2xvYmFsXCI7XG4vKipcbiAqIHN0b3AgcHJvcGFnYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Lk1vdXNlRXZlbnQ8SFRNTEVsZW1lbnQ+fSBlIFJlYWN0IG1vdXNlIGV2ZW50IG9iamVjdFxuICogQHBhcmFtIHtib29sZWFufSBub0ltbWVkaWF0ZSBTa2lwIHN0b3BwaW5nIGltbWVkaWF0ZSBwcm9wYWdhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGUsIG5vSW1tZWRpYXRlKSB7XG4gIGlmIChlICYmIHR5cGVvZiBlLnN0b3BQcm9wYWdhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgaWYgKCFub0ltbWVkaWF0ZSAmJiBlLm5hdGl2ZUV2ZW50ICYmIHR5cGVvZiBlLm5hdGl2ZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGUubmF0aXZlRXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgcmV0dXJuIF9jbG9uZURlZXBXaXRoKHZhbHVlLCB2ID0+IHtcbiAgICBpZiAodHlwZW9mIGN1c3RvbWl6ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBjdXN0b21pemVyKHYpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicgfHwgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KHYpKSB7XG4gICAgICByZXR1cm4gdjtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgRXJyb3JdJykge1xuICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIC8vIGl0IGlzIHRyaWNreVxuICAgIC8vIHdoZW4gYXJyYXkgbGVuZ3RoIGJleW9uZCBtYXggbGVuZ3RoLCBhcnJheS5sZW5ndGggd2lsbCBiZSAwXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2KTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXdBcnJheSA9IFtdO1xuICAgICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBfc2V0KG5ld0FycmF5LCBrZXksIHZba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpbnRlcm5hbC1pc3N1ZXM6ODg3XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgd2FybmluZyhfZ2V0KHByb2Nlc3MsICdlbnYuTk9ERV9FTlYnKSAhPT0gJ3Byb2R1Y3Rpb24nLCBgW1NlbWldIFlvdSBtYXkgdXNlIGFuIG91dC1vZi1ib3VuZHMgYXJyYXkuIEluIHNvbWUgY2FzZXMsIHlvdXIgcHJvZ3JhbSBtYXkgbm90IGJlaGF2ZSBhcyBleHBlY3RlZC5cbiAgICAgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIGFycmF5IGlzIDQyOTQ5NjcyOTUuXG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBjaGVjayB3aGV0aGVyIHRoZSBhcnJheSBzdWJzY3JpcHQgaW4geW91ciBkYXRhIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIEpTIGFycmF5IHN1YnNjcmlwdGApO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9KTtcbn1cbi8qKlxuICogcmVnaXN0ZXIgbWF0Y2hGbiBhbmQgdW5NYXRjaEZuIGNhbGxiYWNrIHdoaWxlIG1lZGlhIHF1ZXJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVkaWEgbWVkaWEgc3RyaW5nXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW0gcGFyYW0gb2JqZWN0XG4gKiBAcmV0dXJucyBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJNZWRpYVF1ZXJ5ID0gKG1lZGlhLCBfcmVmKSA9PiB7XG4gIGxldCB7XG4gICAgbWF0Y2gsXG4gICAgdW5tYXRjaCxcbiAgICBjYWxsSW5Jbml0ID0gdHJ1ZVxuICB9ID0gX3JlZjtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgbWVkaWFRdWVyeUxpc3QgPSB3aW5kb3cubWF0Y2hNZWRpYShtZWRpYSk7XG4gICAgZnVuY3Rpb24gaGFuZGxlck1lZGlhQ2hhbmdlKGUpIHtcbiAgICAgIGlmIChlLm1hdGNoZXMpIHtcbiAgICAgICAgbWF0Y2ggJiYgbWF0Y2goZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bm1hdGNoICYmIHVubWF0Y2goZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNhbGxJbkluaXQgJiYgaGFuZGxlck1lZGlhQ2hhbmdlKG1lZGlhUXVlcnlMaXN0KTtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1lZGlhUXVlcnlMaXN0LCAnYWRkRXZlbnRMaXN0ZW5lcicpKSB7XG4gICAgICBtZWRpYVF1ZXJ5TGlzdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVyTWVkaWFDaGFuZ2UpO1xuICAgICAgcmV0dXJuICgpID0+IG1lZGlhUXVlcnlMaXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZXJNZWRpYUNoYW5nZSk7XG4gICAgfVxuICAgIG1lZGlhUXVlcnlMaXN0LmFkZExpc3RlbmVyKGhhbmRsZXJNZWRpYUNoYW5nZSk7XG4gICAgcmV0dXJuICgpID0+IG1lZGlhUXVlcnlMaXN0LnJlbW92ZUxpc3RlbmVyKGhhbmRsZXJNZWRpYUNoYW5nZSk7XG4gIH1cbiAgcmV0dXJuICgpID0+IHVuZGVmaW5lZDtcbn07XG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSBpbmNvbWluZyBlbGVtZW50IGlzIGEgYnVpbHQtaW4gaWNvblxuICogQHBhcmFtIGljb24gXHU1MTQzXHU3RDIwXG4gKiBAcmV0dXJucyBib29sZWFuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NlbWlJY29uID0gaWNvbiA9PiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoaWNvbikgJiYgX2dldChpY29uLnR5cGUsICdlbGVtZW50VHlwZScpID09PSAnSWNvbic7XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudCgpIHtcbiAgcmV0dXJuIGRvY3VtZW50ID8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA6IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlQ29udGFpbnNGb2N1cyhub2RlKSB7XG4gIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KCk7XG4gIHJldHVybiBhY3RpdmVFbGVtZW50ID09PSBub2RlIHx8IG5vZGUuY29udGFpbnMoYWN0aXZlRWxlbWVudCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMobm9kZSkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZm9jdXNhYmxlU2VsZWN0b3JzTGlzdCA9IFtcImlucHV0Om5vdChbZGlzYWJsZWRdKTpub3QoW3RhYmluZGV4PSctMSddKVwiLCBcInRleHRhcmVhOm5vdChbZGlzYWJsZWRdKTpub3QoW3RhYmluZGV4PSctMSddKVwiLCBcImJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6bm90KFt0YWJpbmRleD0nLTEnXSlcIiwgXCJhW2hyZWZdOm5vdChbdGFiaW5kZXg9Jy0xJ10pXCIsIFwic2VsZWN0Om5vdChbZGlzYWJsZWRdKTpub3QoW3RhYmluZGV4PSctMSddKVwiLCBcImFyZWFbaHJlZl06bm90KFt0YWJpbmRleD0nLTEnXSlcIiwgXCJpZnJhbWU6bm90KFt0YWJpbmRleD0nLTEnXSlcIiwgXCJvYmplY3Q6bm90KFt0YWJpbmRleD0nLTEnXSlcIiwgXCIqW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PSctMSddKVwiLCBcIipbY29udGVudGVkaXRhYmxlXTpub3QoW3RhYmluZGV4PSctMSddKVwiXTtcbiAgY29uc3QgZm9jdXNhYmxlU2VsZWN0b3JzU3RyID0gZm9jdXNhYmxlU2VsZWN0b3JzTGlzdC5qb2luKCcsJyk7XG4gIC8vIHdlIGFyZSBub3QgZmlsdGVyZWQgZWxlbWVudHMgd2hpY2ggYXJlIGludmlzaWJsZVxuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IEFycmF5LmZyb20obm9kZS5xdWVyeVNlbGVjdG9yQWxsKGZvY3VzYWJsZVNlbGVjdG9yc1N0cikpO1xuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHM7XG59XG5leHBvcnQgZnVuY3Rpb24gcnVuQWZ0ZXJUaWNrcyhmdW5jLCBudW1iZXJPZlRpY2tzKSB7XG4gIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgaWYgKG51bWJlck9mVGlja3MgPT09IDApIHtcbiAgICAgIHlpZWxkIGZ1bmMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgIHlpZWxkIHJ1bkFmdGVyVGlja3MoZnVuYywgbnVtYmVyT2ZUaWNrcyAtIDEpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSksIDApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxiYXJXaWR0aCgpIHtcbiAgaWYgKGdsb2JhbFRoaXMgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGdsb2JhbFRoaXMpID09PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0UHJvcHNGcm9tR2xvYmFsQ29uZmlnKGNvbXBvbmVudE5hbWUpIHtcbiAgbGV0IHNlbWlEZWZhdWx0UHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBjb25zdCBnZXRGcm9tR2xvYmFsQ29uZmlnID0gKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuICgoX2IgPSAoX2EgPSBzZW1pR2xvYmFsID09PSBudWxsIHx8IHNlbWlHbG9iYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbWlHbG9iYWwuY29uZmlnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3ZlcnJpZGVEZWZhdWx0UHJvcHMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYltjb21wb25lbnROYW1lXSkgfHwge307XG4gIH07XG4gIHJldHVybiBuZXcgUHJveHkoT2JqZWN0LmFzc2lnbih7fSwgc2VtaURlZmF1bHRQcm9wcyksIHtcbiAgICBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgICBjb25zdCBkZWZhdWx0UHJvcHNGcm9tR2xvYmFsID0gZ2V0RnJvbUdsb2JhbENvbmZpZygpO1xuICAgICAgaWYgKGtleSBpbiBkZWZhdWx0UHJvcHNGcm9tR2xvYmFsKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0UHJvcHNGcm9tR2xvYmFsW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKTtcbiAgICB9LFxuICAgIHNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcik7XG4gICAgfSxcbiAgICBvd25LZXlzKCkge1xuICAgICAgY29uc3QgZGVmYXVsdFByb3BzRnJvbUdsb2JhbCA9IGdldEZyb21HbG9iYWxDb25maWcoKTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLlJlZmxlY3Qub3duS2V5cyhzZW1pRGVmYXVsdFByb3BzKSwgLi4uT2JqZWN0LmtleXMoZGVmYXVsdFByb3BzRnJvbUdsb2JhbCldKSk7XG4gICAgfSxcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRQcm9wc0Zyb21HbG9iYWwgPSBnZXRGcm9tR2xvYmFsQ29uZmlnKCk7XG4gICAgICBpZiAoa2V5IGluIGRlZmF1bHRQcm9wc0Zyb21HbG9iYWwpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRQcm9wc0Zyb21HbG9iYWwsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59IiwgImNsYXNzIFNlbWlHbG9iYWwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHt9O1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBuZXcgU2VtaUdsb2JhbCgpOyIsICJpbXBvcnQgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IEJBU0VfQ0xBU1NfUFJFRklYIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvYmFzZS9jb25zdGFudHMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENvbmZpZ0NvbnRleHQgZnJvbSAnLi4vY29uZmlnUHJvdmlkZXIvY29udGV4dCc7XG5pbXBvcnQgJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL19wb3J0YWwvcG9ydGFsLmNzcyc7XG5jb25zdCBkZWZhdWx0R2V0Q29udGFpbmVyID0gKCkgPT4gZG9jdW1lbnQuYm9keTtcbmNsYXNzIFBvcnRhbCBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcztcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuaW5pdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBsZXQgY2F0Y2hFcnJvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICB2YXIgX2EsIF9iO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFfdGhpcy5lbCB8fCAhKChfYSA9IF90aGlzLnN0YXRlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGFpbmVyKSB8fCAhQXJyYXkuZnJvbShfdGhpcy5zdGF0ZS5jb250YWluZXIuY2hpbGROb2RlcykuaW5jbHVkZXMoX3RoaXMuZWwpKSB7XG4gICAgICAgICAgX3RoaXMuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBjb25zdCBnZXRDb250YWluZXIgPSBfdGhpcy5wcm9wcy5nZXRQb3B1cENvbnRhaW5lciB8fCBjb250ZXh0LmdldFBvcHVwQ29udGFpbmVyIHx8IGRlZmF1bHRHZXRDb250YWluZXI7XG4gICAgICAgICAgY29uc3QgcG9ydGFsQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgICAgcG9ydGFsQ29udGFpbmVyLmFwcGVuZENoaWxkKF90aGlzLmVsKTtcbiAgICAgICAgICBfdGhpcy5hZGRTdHlsZShfdGhpcy5wcm9wcy5zdHlsZSk7XG4gICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoX3RoaXMucHJvcHMucHJlZml4Q2xzLCBjb250ZXh0LCBfdGhpcy5wcm9wcy5jbGFzc05hbWUpO1xuICAgICAgICAgIGNvbnRhaW5lciA9IHBvcnRhbENvbnRhaW5lcjtcbiAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghY2F0Y2hFcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAoX2IgPSBfdGhpcy5zdGF0ZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNvbnRhaW5lcjtcbiAgICB9O1xuICAgIHRoaXMuYWRkU3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgaWYgKF90aGlzLmVsKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlKSkge1xuICAgICAgICAgIF90aGlzLmVsLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmFkZENsYXNzID0gZnVuY3Rpb24gKHByZWZpeENscykge1xuICAgICAgbGV0IGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IF90aGlzLmNvbnRleHQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRpcmVjdGlvblxuICAgICAgfSA9IGNvbnRleHQ7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgY2xhc3NOYW1lcyA9IG5ldyBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGNsYXNzTmFtZXNbX2tleSAtIDJdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xzID0gY2xhc3NuYW1lcyhwcmVmaXhDbHMsIC4uLmNsYXNzTmFtZXMsIHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgIH0pO1xuICAgICAgaWYgKF90aGlzLmVsKSB7XG4gICAgICAgIF90aGlzLmVsLmNsYXNzTmFtZSA9IGNscztcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBjb250YWluZXI6IHRoaXMuaW5pdENvbnRhaW5lcihjb250ZXh0LCB0cnVlKVxuICAgIH07XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5pbml0Q29udGFpbmVyKHRoaXMuY29udGV4dCk7XG4gICAgaWYgKGNvbnRhaW5lciAhPT0gdGhpcy5zdGF0ZS5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjb250YWluZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgLy8gdmlzaWJsZSBjYWxsYmFja1xuICAgIGNvbnN0IHtcbiAgICAgIGRpZFVwZGF0ZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChkaWRVcGRhdGUpIHtcbiAgICAgIGRpZFVwZGF0ZShwcmV2UHJvcHMpO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXJcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5lbCk7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdGF0ZSxcbiAgICAgIHByb3BzXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKHN0YXRlLmNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9jcmVhdGVQb3J0YWwocHJvcHMuY2hpbGRyZW4sIHRoaXMuZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuUG9ydGFsLmNvbnRleHRUeXBlID0gQ29uZmlnQ29udGV4dDtcblBvcnRhbC5kZWZhdWx0UHJvcHMgPSB7XG4gIC8vIGdldFBvcHVwQ29udGFpbmVyOiAoKSA9PiBkb2N1bWVudC5ib2R5LFxuICBwcmVmaXhDbHM6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS1wb3J0YWxgXG59O1xuUG9ydGFsLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBwcmVmaXhDbHM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGdldFBvcHVwQ29udGFpbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBkaWRVcGRhdGU6IFByb3BUeXBlcy5mdW5jXG59O1xuZXhwb3J0IGRlZmF1bHQgUG9ydGFsOyIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgQ29uZmlnQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IENvbmZpZ0NvbnRleHQ7IiwgInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgVHJpYW5nbGVBcnJvdyA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgICAgY2xhc3NOYW1lLFxuICAgICAgc3R5bGVcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBPYmplY3QuYXNzaWduKHtcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIHdpZHRoOiBcIjI0XCIsXG4gICAgaGVpZ2h0OiBcIjdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCA3XCIsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTI0IDBWMUMyMCAxIDE4LjUgMiAxNi41IDRDMTQuNSA2IDE0IDcgMTIgN0MxMCA3IDkuNSA2IDcuNSA0QzUuNSAyIDQgMSAwIDFWMEgyNFpcIlxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVHJpYW5nbGVBcnJvdzsiLCAidmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBUcmlhbmdsZUFycm93VmVydGljYWwgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wiY2xhc3NOYW1lXCIsIFwic3R5bGVcIl0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCByZXN0UHJvcHMsIHtcbiAgICB3aWR0aDogXCI3XCIsXG4gICAgaGVpZ2h0OiBcIjI0XCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTAgMEwxIDBDMSA0LCAyIDUuNSwgNCA3LjVTNywxMCA3LDEyUzYgMTQuNSwgNCAxNi41UzEsMjAgMSwyNEwwIDI0TDAgMHpcIlxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVHJpYW5nbGVBcnJvd1ZlcnRpY2FsOyIsICJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuZXhwb3J0IGRlZmF1bHQgUHJvcFR5cGVzLnNoYXBlKHtcbiAgb2Zmc2V0WDogUHJvcFR5cGVzLm51bWJlcixcbiAgb2Zmc2V0WTogUHJvcFR5cGVzLm51bWJlcixcbiAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlclxufSk7IiwgImltcG9ydCBfaXNFcXVhbCBmcm9tIFwibG9kYXNoL2lzRXF1YWxcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5jbGFzcyBDU1NBbmltYXRpb24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZUFuaW1hdGlvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgdmFyIF9hLCBfYjtcbiAgICAgIChfYiA9IChfYSA9IHRoaXMucHJvcHMpLm9uQW5pbWF0aW9uU3RhcnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKTtcbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlQW5pbWF0aW9uRW5kID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGN1cnJlbnRDbGFzc05hbWU6IHRoaXMucHJvcHMuZW5kQ2xhc3NOYW1lLFxuICAgICAgICBleHRyYVN0eWxlOiB7XG4gICAgICAgICAgYW5pbWF0aW9uRmlsbE1vZGU6IHRoaXMucHJvcHMuZmlsbE1vZGVcbiAgICAgICAgfSxcbiAgICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXG4gICAgICB9LCAoKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIChfYiA9IChfYSA9IHRoaXMucHJvcHMpLm9uQW5pbWF0aW9uRW5kKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgY3VycmVudENsYXNzTmFtZTogdGhpcy5wcm9wcy5zdGFydENsYXNzTmFtZSxcbiAgICAgIGV4dHJhU3R5bGU6IHtcbiAgICAgICAgYW5pbWF0aW9uRmlsbE1vZGU6IHRoaXMucHJvcHMuZmlsbE1vZGVcbiAgICAgIH0sXG4gICAgICBpc0FuaW1hdGluZzogdHJ1ZVxuICAgIH07XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIFRoZSBwdXJwb3NlIGlzIHRvIHNoaWVsZCB0aGUgaW1wYWN0IG9mIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIGFuaW1hdGlvbiBvbiB0aGUgb3RoZXIgc2VtaSBjb21wb25lbnQgbGlmZSBjeWNsZS5cbiAgICAvLyBJbiBvcmRlciB0byBtYWtlIHRoZSBjb21wb25lbnQgc2lkZSBkbyBub3QgbmVlZCB0byBtYW51YWxseSBjYWxsIHRoZSBuZXh0IGxpZmUgY3ljbGUgZnVuY3Rpb24gd2hlbiB0aGVyZSBpcyBubyBhbmltYXRpb24sXG4gICAgLy8gc28gd2hlbiB0aGVyZSBpcyBubyBhbmltYXRpb24gLCBpdCBpcyBsb2dpY2FsbHkgKGFuZCBvbmx5IGxvZ2ljYWxseSkgcmVnYXJkZWQgYXMgYW4gYW5pbWF0aW9uIHdpdGggYSBkdXJhdGlvbiBvZiAwLlxuICAgIChfYiA9IChfYSA9IHRoaXMucHJvcHMpLm9uQW5pbWF0aW9uU3RhcnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKTtcbiAgICBpZiAoIXRoaXMucHJvcHMubW90aW9uKSB7XG4gICAgICAoX2QgPSAoX2MgPSB0aGlzLnByb3BzKS5vbkFuaW1hdGlvbkVuZCkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNhbGwoX2MsIGZhbHNlKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0FuaW1hdGluZzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIHNuYXBzaG90KSB7XG4gICAgY29uc3QgY2hhbmdlZEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BzKS5maWx0ZXIoa2V5ID0+ICFfaXNFcXVhbCh0aGlzLnByb3BzW2tleV0sIHByZXZQcm9wc1trZXldKSk7XG4gICAgaWYgKGNoYW5nZWRLZXlzLmluY2x1ZGVzKFwiYW5pbWF0aW9uU3RhdGVcIikpIHt9XG4gICAgaWYgKGNoYW5nZWRLZXlzLmluY2x1ZGVzKFwic3RhcnRDbGFzc05hbWVcIikgfHwgY2hhbmdlZEtleXMuaW5jbHVkZXMoJ3JlcGxheUtleScpIHx8IGNoYW5nZWRLZXlzLmluY2x1ZGVzKFwibW90aW9uXCIpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY3VycmVudENsYXNzTmFtZTogdGhpcy5wcm9wcy5zdGFydENsYXNzTmFtZSxcbiAgICAgICAgZXh0cmFTdHlsZToge1xuICAgICAgICAgIGFuaW1hdGlvbkZpbGxNb2RlOiB0aGlzLnByb3BzLmZpbGxNb2RlXG4gICAgICAgIH0sXG4gICAgICAgIGlzQW5pbWF0aW5nOiB0cnVlXG4gICAgICB9LCAoKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgKF9iID0gKF9hID0gdGhpcy5wcm9wcykub25BbmltYXRpb25TdGFydCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EpO1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMubW90aW9uKSB7XG4gICAgICAgICAgKF9kID0gKF9jID0gdGhpcy5wcm9wcykub25BbmltYXRpb25FbmQpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5jYWxsKF9jLCB0aGlzLnN0YXRlLmlzQW5pbWF0aW5nKTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzQW5pbWF0aW5nOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAodGhpcy5wcm9wcy5tb3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuKHtcbiAgICAgICAgYW5pbWF0aW9uQ2xhc3NOYW1lOiAoX2EgPSB0aGlzLnN0YXRlLmN1cnJlbnRDbGFzc05hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCIsXG4gICAgICAgIGFuaW1hdGlvblN0eWxlOiB0aGlzLnN0YXRlLmV4dHJhU3R5bGUsXG4gICAgICAgIGFuaW1hdGlvbkV2ZW50c05lZWRCaW5kOiB7XG4gICAgICAgICAgb25BbmltYXRpb25TdGFydDogdGhpcy5oYW5kbGVBbmltYXRpb25TdGFydCxcbiAgICAgICAgICBvbkFuaW1hdGlvbkVuZDogdGhpcy5oYW5kbGVBbmltYXRpb25FbmRcbiAgICAgICAgfSxcbiAgICAgICAgaXNBbmltYXRpbmc6IHRoaXMuc3RhdGUuaXNBbmltYXRpbmdcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbih7XG4gICAgICAgIGFuaW1hdGlvbkNsYXNzTmFtZTogXCJcIixcbiAgICAgICAgYW5pbWF0aW9uU3R5bGU6IHt9LFxuICAgICAgICBhbmltYXRpb25FdmVudHNOZWVkQmluZDoge30sXG4gICAgICAgIGlzQW5pbWF0aW5nOiB0aGlzLnN0YXRlLmlzQW5pbWF0aW5nXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbkNTU0FuaW1hdGlvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIG1vdGlvbjogdHJ1ZSxcbiAgcmVwbGF5S2V5OiBcIlwiXG59O1xuLy8gY29uc3QgbWVyZ2VBbmltYXRpb25GdW5jdGlvbiA9IChldmVudEhhbmRsZUZ1bmN0aW9uczogQW5pbWF0aW9uRXZlbnRzTmVlZEJpbmRbXSkgPT4ge1xuLy8gICAgIC8vbWVyZ2UgZnVuY3Rpb24gaW4gb2JqZWN0c1xuLy8gICAgIGNvbnN0IG1lcmdlZEZ1bmN0aW9uID0ge307XG4vLyAgICAgZXZlbnRIYW5kbGVGdW5jdGlvbnMuZm9yRWFjaChldmVudEhhbmRsZUZ1bmN0aW9uID0+IHtcbi8vICAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRIYW5kbGVGdW5jdGlvbikuZm9yRWFjaChrZXkgPT4ge1xuLy8gICAgICAgICAgICAgaWYgKG1lcmdlZEZ1bmN0aW9uW2tleV0pIHtcbi8vICAgICAgICAgICAgICAgICBjb25zdCBvbGRGdW5jdGlvbiA9IG1lcmdlZEZ1bmN0aW9uW2tleV07XG4vLyAgICAgICAgICAgICAgICAgbWVyZ2VkRnVuY3Rpb25ba2V5XSA9IChlKSA9PiB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlRnVuY3Rpb25ba2V5XShlKTtcbi8vICAgICAgICAgICAgICAgICAgICAgb2xkRnVuY3Rpb24oZSk7XG4vLyAgICAgICAgICAgICAgICAgfTtcbi8vICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgbWVyZ2VkRnVuY3Rpb25ba2V5XSA9IGV2ZW50SGFuZGxlRnVuY3Rpb25ba2V5XTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfSk7XG4vLyAgICAgfSk7XG4vLyAgICAgcmV0dXJuIG1lcmdlZEZ1bmN0aW9uO1xuLy8gfTtcbi8vIGV4cG9ydCB7IG1lcmdlQW5pbWF0aW9uRnVuY3Rpb24gfTtcbmV4cG9ydCBkZWZhdWx0IENTU0FuaW1hdGlvbjsiLCAiLyoqXG4gKiBubyBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7fSIsICJpbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgTG9jYWxlQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IENvbmZpZ0NvbnRleHQgZnJvbSAnLi4vY29uZmlnUHJvdmlkZXIvY29udGV4dCc7XG5pbXBvcnQgRGVmYXVsdExvY2FsZSBmcm9tICcuL3NvdXJjZS96aF9DTic7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2NhbGVDb25zdW1lciBleHRlbmRzIENvbXBvbmVudCB7XG4gIHJlbmRlckNoaWxkcmVuKGxvY2FsZURhdGEsIGNoaWxkcmVuKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tcG9uZW50TmFtZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCBsb2NhbGUgPSBsb2NhbGVEYXRhO1xuICAgIGlmICghKGxvY2FsZURhdGEgPT09IG51bGwgfHwgbG9jYWxlRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlRGF0YS5jb2RlKSkge1xuICAgICAgbG9jYWxlID0gRGVmYXVsdExvY2FsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZGF0ZUZuc0xvY2FsZSBpcyB1c2VkIHRvIGZvcm1hdCB0aGUgZGF0ZSBpbnRvIGEgbG9jYWwgZGF0ZVxuICAgICAqIGV4YW1wbGU6XG4gICAgICogIGltcG9ydCB7IHpoQ04gfSBmcm9tIFwiZGF0ZS1mbnMvbG9jYWxlXCI7XG4gICAgICogIGZvcm1hdChuZXcgRGF0ZShcIjIwMjEtMDQtMjlcIiksIFwieXl5eS1NTS1kZCBFRUVFXCIpXG4gICAgICogICAgICA9PiAnMjAyMS0wNC0yOSBUaHVyc2RheScgKFx1OUVEOFx1OEJBNCBsb2NhbGUgXHU0RTNBIGVuLVVTKVxuICAgICAqICBmb3JtYXQobmV3IERhdGUoJzIwMjEtMDQtMjknKSwgXCJ5eXl5LU1NLWRkIEVFRUVcIiwgeyBsb2NhbGU6IHpoQ04gfSlcbiAgICAgKiAgICAgID0+ICcyMDIxLTA0LTI5IFx1NjYxRlx1NjcxRlx1NTZEQidcbiAgICAgKi9cbiAgICBjb25zdCBkZWZhdWx0Rm5zTG9jYWxlID0gX2dldChEZWZhdWx0TG9jYWxlLCAnZGF0ZUZuc0xvY2FsZScpO1xuICAgIGNvbnN0IGRhdGVGbnNMb2NhbGUgPSBfZ2V0KGxvY2FsZSwgJ2RhdGVGbnNMb2NhbGUnLCBkZWZhdWx0Rm5zTG9jYWxlKTtcbiAgICBjb25zdCBjdXJyZW5jeSA9IF9nZXQobG9jYWxlLCAnY3VycmVuY3knKTtcbiAgICByZXR1cm4gY2hpbGRyZW4obG9jYWxlW2NvbXBvbmVudE5hbWVdLCBsb2NhbGUuY29kZSwgZGF0ZUZuc0xvY2FsZSwgY3VycmVuY3kpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGlsZHJlblxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBfcmVmID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGxvY2FsZVxuICAgICAgfSA9IF9yZWY7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYWxlQ29udGV4dC5Db25zdW1lciwgbnVsbCwgbG9jYWxlRGF0YSA9PiB0aGlzLnJlbmRlckNoaWxkcmVuKGxvY2FsZSB8fCBsb2NhbGVEYXRhLCBjaGlsZHJlbikpO1xuICAgIH0pO1xuICB9XG59XG5Mb2NhbGVDb25zdW1lci5wcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudE5hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnlcbn07XG5Mb2NhbGVDb25zdW1lci5kZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudE5hbWU6ICcnXG59OyIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgTG9jYWxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgTG9jYWxlQ29udGV4dDsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAvLyBUT0RPOiBSZW1vdmUgU3RyaW5nKClcbiAgICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgdmFyIGZvcm1hdCA9IGFyZ3MuZm9ybWF0c1t3aWR0aF0gfHwgYXJncy5mb3JtYXRzW2FyZ3MuZGVmYXVsdFdpZHRoXTtcbiAgICByZXR1cm4gZm9ybWF0O1xuICB9O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKGRpcnR5SW5kZXgsIG9wdGlvbnMpIHtcbiAgICB2YXIgY29udGV4dCA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwICYmIG9wdGlvbnMuY29udGV4dCA/IFN0cmluZyhvcHRpb25zLmNvbnRleHQpIDogJ3N0YW5kYWxvbmUnO1xuICAgIHZhciB2YWx1ZXNBcnJheTtcbiAgICBpZiAoY29udGV4dCA9PT0gJ2Zvcm1hdHRpbmcnICYmIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlcykge1xuICAgICAgdmFyIGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIHZhciB3aWR0aCA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwICYmIG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBkZWZhdWx0V2lkdGg7XG4gICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1t3aWR0aF0gfHwgYXJncy5mb3JtYXR0aW5nVmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICB2YXIgX3dpZHRoID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgJiYgb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLnZhbHVlc1tfd2lkdGhdIHx8IGFyZ3MudmFsdWVzW19kZWZhdWx0V2lkdGhdO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sgPyBhcmdzLmFyZ3VtZW50Q2FsbGJhY2soZGlydHlJbmRleCkgOiBkaXJ0eUluZGV4O1xuICAgIC8vIEB0cy1pZ25vcmU6IEZvciBzb21lIHJlYXNvbiBUeXBlU2NyaXB0IGp1c3QgZG9uJ3Qgd2FudCB0byBtYXRjaCBpdCwgbm8gbWF0dGVyIGhvdyBoYXJkIHdlIHRyeS4gSSBjaGFsbGVuZ2UgeW91IHRvIHRyeSB0byByZW1vdmUgaXQhXG4gICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4XTtcbiAgfTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRNYXRjaEZuKGFyZ3MpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aDtcbiAgICB2YXIgbWF0Y2hQYXR0ZXJuID0gd2lkdGggJiYgYXJncy5tYXRjaFBhdHRlcm5zW3dpZHRoXSB8fCBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgdmFyIG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKG1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG4gICAgdmFyIHBhcnNlUGF0dGVybnMgPSB3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdIHx8IGFyZ3MucGFyc2VQYXR0ZXJuc1thcmdzLmRlZmF1bHRQYXJzZVdpZHRoXTtcbiAgICB2YXIga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKSA/IGZpbmRJbmRleChwYXJzZVBhdHRlcm5zLCBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKTtcbiAgICB9KSA6IGZpbmRLZXkocGFyc2VQYXR0ZXJucywgZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZyk7XG4gICAgfSk7XG4gICAgdmFyIHZhbHVlO1xuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG4gICAgdmFyIHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICByZXN0OiByZXN0XG4gICAgfTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBwcmVkaWNhdGUob2JqZWN0W2tleV0pKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgZm9yICh2YXIga2V5ID0gMDsga2V5IDwgYXJyYXkubGVuZ3RoOyBrZXkrKykge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlba2V5XSkpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pO1xuICAgIGlmICghbWF0Y2hSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIHZhciBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG4gICAgdmFyIHBhcnNlUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MucGFyc2VQYXR0ZXJuKTtcbiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2socGFyc2VSZXN1bHRbMF0pIDogcGFyc2VSZXN1bHRbMF07XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG4gICAgdmFyIHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICByZXN0OiByZXN0XG4gICAgfTtcbiAgfTtcbn0iLCAiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn1cbmV4cG9ydCB7IF90eXBlb2YgYXMgZGVmYXVsdCB9OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0ludGVnZXIoZGlydHlOdW1iZXIpIHtcbiAgaWYgKGRpcnR5TnVtYmVyID09PSBudWxsIHx8IGRpcnR5TnVtYmVyID09PSB0cnVlIHx8IGRpcnR5TnVtYmVyID09PSBmYWxzZSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cbiAgdmFyIG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVtYmVyIDwgMCA/IE1hdGguY2VpbChudW1iZXIpIDogTWF0aC5mbG9vcihudW1iZXIpO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1aXJlZEFyZ3MocmVxdWlyZWQsIGFyZ3MpIHtcbiAgaWYgKGFyZ3MubGVuZ3RoIDwgcmVxdWlyZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHJlcXVpcmVkICsgJyBhcmd1bWVudCcgKyAocmVxdWlyZWQgPiAxID8gJ3MnIDogJycpICsgJyByZXF1aXJlZCwgYnV0IG9ubHkgJyArIGFyZ3MubGVuZ3RoICsgJyBwcmVzZW50Jyk7XG4gIH1cbn0iLCAiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgdG9EYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdHMgY2xvbmUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBpdCBpcyB0cmVhdGVkIGFzIGEgdGltZXN0YW1wLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGFyZ3VtZW50IC0gdGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpO1xuXG4gIC8vIENsb25lIHRoZSBkYXRlXG4gIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIERhdGUgfHwgX3R5cGVvZihhcmd1bWVudCkgPT09ICdvYmplY3QnICYmIGFyZ1N0ciA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgLy8gUHJldmVudCB0aGUgZGF0ZSB0byBsb3NlIHRoZSBtaWxsaXNlY29uZHMgd2hlbiBwYXNzZWQgdG8gbmV3IERhdGUoKSBpbiBJRTEwXG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50LmdldFRpbWUoKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnbnVtYmVyJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IE51bWJlcl0nKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycgfHwgYXJnU3RyID09PSAnW29iamVjdCBTdHJpbmddJykgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFwiU3RhcnRpbmcgd2l0aCB2Mi4wLjAtYmV0YS4xIGRhdGUtZm5zIGRvZXNuJ3QgYWNjZXB0IHN0cmluZ3MgYXMgZGF0ZSBhcmd1bWVudHMuIFBsZWFzZSB1c2UgYHBhcnNlSVNPYCB0byBwYXJzZSBzdHJpbmdzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNzdHJpbmctYXJndW1lbnRzXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihuZXcgRXJyb3IoKS5zdGFjayk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG59IiwgInZhciBkZWZhdWx0T3B0aW9ucyA9IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59IiwgImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uLy4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4uL2RlZmF1bHRPcHRpb25zL2luZGV4LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydE9mVVRDV2VlayhkaXJ0eURhdGUsIG9wdGlvbnMpIHtcbiAgdmFyIF9yZWYsIF9yZWYyLCBfcmVmMywgX29wdGlvbnMkd2Vla1N0YXJ0c09uLCBfb3B0aW9ucyRsb2NhbGUsIF9vcHRpb25zJGxvY2FsZSRvcHRpbywgX2RlZmF1bHRPcHRpb25zJGxvY2FsLCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwyO1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgdmFyIHdlZWtTdGFydHNPbiA9IHRvSW50ZWdlcigoX3JlZiA9IChfcmVmMiA9IChfcmVmMyA9IChfb3B0aW9ucyR3ZWVrU3RhcnRzT24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyR3ZWVrU3RhcnRzT24gIT09IHZvaWQgMCA/IF9vcHRpb25zJHdlZWtTdGFydHNPbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUkb3B0aW8gPSBfb3B0aW9ucyRsb2NhbGUub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlJG9wdGlvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUkb3B0aW8ud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfcmVmMyAhPT0gdm9pZCAwID8gX3JlZjMgOiBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWYyICE9PSB2b2lkIDAgPyBfcmVmMiA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPSBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPSBfZGVmYXVsdE9wdGlvbnMkbG9jYWwub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsMi53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiAwKTtcblxuICAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDAgYW5kIDYgX2FuZF8gaXMgbm90IE5hTlxuICBpZiAoISh3ZWVrU3RhcnRzT24gPj0gMCAmJiB3ZWVrU3RhcnRzT24gPD0gNikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignd2Vla1N0YXJ0c09uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2IGluY2x1c2l2ZWx5Jyk7XG4gIH1cbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcbiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpIC0gZGlmZik7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsICJpbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWsvaW5kZXguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2FtZVVUQ1dlZWsoZGlydHlEYXRlTGVmdCwgZGlydHlEYXRlUmlnaHQsIG9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlTGVmdFN0YXJ0T2ZXZWVrID0gc3RhcnRPZlVUQ1dlZWsoZGlydHlEYXRlTGVmdCwgb3B0aW9ucyk7XG4gIHZhciBkYXRlUmlnaHRTdGFydE9mV2VlayA9IHN0YXJ0T2ZVVENXZWVrKGRpcnR5RGF0ZVJpZ2h0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGRhdGVMZWZ0U3RhcnRPZldlZWsuZ2V0VGltZSgpID09PSBkYXRlUmlnaHRTdGFydE9mV2Vlay5nZXRUaW1lKCk7XG59IiwgInZhciBmb3JtYXREaXN0YW5jZUxvY2FsZSA9IHtcbiAgbGVzc1RoYW5YU2Vjb25kczoge1xuICAgIG9uZTogJ1x1NEUwRFx1NTIzMCAxIFx1NzlEMicsXG4gICAgb3RoZXI6ICdcdTRFMERcdTUyMzAge3tjb3VudH19IFx1NzlEMidcbiAgfSxcbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6ICcxIFx1NzlEMicsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gXHU3OUQyJ1xuICB9LFxuICBoYWxmQU1pbnV0ZTogJ1x1NTM0QVx1NTIwNlx1OTQ5RicsXG4gIGxlc3NUaGFuWE1pbnV0ZXM6IHtcbiAgICBvbmU6ICdcdTRFMERcdTUyMzAgMSBcdTUyMDZcdTk0OUYnLFxuICAgIG90aGVyOiAnXHU0RTBEXHU1MjMwIHt7Y291bnR9fSBcdTUyMDZcdTk0OUYnXG4gIH0sXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiAnMSBcdTUyMDZcdTk0OUYnLFxuICAgIG90aGVyOiAne3tjb3VudH19IFx1NTIwNlx1OTQ5RidcbiAgfSxcbiAgeEhvdXJzOiB7XG4gICAgb25lOiAnMSBcdTVDMEZcdTY1RjYnLFxuICAgIG90aGVyOiAne3tjb3VudH19IFx1NUMwRlx1NjVGNidcbiAgfSxcbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6ICdcdTU5MjdcdTdFQTYgMSBcdTVDMEZcdTY1RjYnLFxuICAgIG90aGVyOiAnXHU1OTI3XHU3RUE2IHt7Y291bnR9fSBcdTVDMEZcdTY1RjYnXG4gIH0sXG4gIHhEYXlzOiB7XG4gICAgb25lOiAnMSBcdTU5MjknLFxuICAgIG90aGVyOiAne3tjb3VudH19IFx1NTkyOSdcbiAgfSxcbiAgYWJvdXRYV2Vla3M6IHtcbiAgICBvbmU6ICdcdTU5MjdcdTdFQTYgMSBcdTRFMkFcdTY2MUZcdTY3MUYnLFxuICAgIG90aGVyOiAnXHU1OTI3XHU3RUE2IHt7Y291bnR9fSBcdTRFMkFcdTY2MUZcdTY3MUYnXG4gIH0sXG4gIHhXZWVrczoge1xuICAgIG9uZTogJzEgXHU0RTJBXHU2NjFGXHU2NzFGJyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBcdTRFMkFcdTY2MUZcdTY3MUYnXG4gIH0sXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogJ1x1NTkyN1x1N0VBNiAxIFx1NEUyQVx1NjcwOCcsXG4gICAgb3RoZXI6ICdcdTU5MjdcdTdFQTYge3tjb3VudH19IFx1NEUyQVx1NjcwOCdcbiAgfSxcbiAgeE1vbnRoczoge1xuICAgIG9uZTogJzEgXHU0RTJBXHU2NzA4JyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBcdTRFMkFcdTY3MDgnXG4gIH0sXG4gIGFib3V0WFllYXJzOiB7XG4gICAgb25lOiAnXHU1OTI3XHU3RUE2IDEgXHU1RTc0JyxcbiAgICBvdGhlcjogJ1x1NTkyN1x1N0VBNiB7e2NvdW50fX0gXHU1RTc0J1xuICB9LFxuICB4WWVhcnM6IHtcbiAgICBvbmU6ICcxIFx1NUU3NCcsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gXHU1RTc0J1xuICB9LFxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiAnXHU4RDg1XHU4RkM3IDEgXHU1RTc0JyxcbiAgICBvdGhlcjogJ1x1OEQ4NVx1OEZDNyB7e2NvdW50fX0gXHU1RTc0J1xuICB9LFxuICBhbG1vc3RYWWVhcnM6IHtcbiAgICBvbmU6ICdcdTVDMDZcdThGRDEgMSBcdTVFNzQnLFxuICAgIG90aGVyOiAnXHU1QzA2XHU4RkQxIHt7Y291bnR9fSBcdTVFNzQnXG4gIH1cbn07XG52YXIgZm9ybWF0RGlzdGFuY2UgPSBmdW5jdGlvbiBmb3JtYXREaXN0YW5jZSh0b2tlbiwgY291bnQsIG9wdGlvbnMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgdmFyIHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlO1xuICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vbmU7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vdGhlci5yZXBsYWNlKCd7e2NvdW50fX0nLCBTdHJpbmcoY291bnQpKTtcbiAgfVxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgJiYgb3B0aW9ucy5hZGRTdWZmaXgpIHtcbiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAnXHU1MTg1JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArICdcdTUyNEQnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCBkZWZhdWx0IGZvcm1hdERpc3RhbmNlOyIsICJpbXBvcnQgYnVpbGRGb3JtYXRMb25nRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4vaW5kZXguanNcIjtcbnZhciBkYXRlRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ5J1x1NUU3NCdNJ1x1NjcwOCdkJ1x1NjVFNScgRUVFRVwiLFxuICBsb25nOiBcInknXHU1RTc0J00nXHU2NzA4J2QnXHU2NUU1J1wiLFxuICBtZWRpdW06ICd5eXl5LU1NLWRkJyxcbiAgc2hvcnQ6ICd5eS1NTS1kZCdcbn07XG52YXIgdGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6ICd6enp6IGEgaDptbTpzcycsXG4gIGxvbmc6ICd6IGEgaDptbTpzcycsXG4gIG1lZGl1bTogJ2EgaDptbTpzcycsXG4gIHNob3J0OiAnYSBoOm1tJ1xufTtcbnZhciBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6ICd7e2RhdGV9fSB7e3RpbWV9fScsXG4gIGxvbmc6ICd7e2RhdGV9fSB7e3RpbWV9fScsXG4gIG1lZGl1bTogJ3t7ZGF0ZX19IHt7dGltZX19JyxcbiAgc2hvcnQ6ICd7e2RhdGV9fSB7e3RpbWV9fSdcbn07XG52YXIgZm9ybWF0TG9uZyA9IHtcbiAgZGF0ZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IGRhdGVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogJ2Z1bGwnXG4gIH0pLFxuICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiAnZnVsbCdcbiAgfSksXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogJ2Z1bGwnXG4gIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybWF0TG9uZzsiLCAiaW1wb3J0IGlzU2FtZVVUQ1dlZWsgZnJvbSBcIi4uLy4uLy4uLy4uL19saWIvaXNTYW1lVVRDV2Vlay9pbmRleC5qc1wiO1xuZnVuY3Rpb24gY2hlY2tXZWVrKGRhdGUsIGJhc2VEYXRlLCBvcHRpb25zKSB7XG4gIHZhciBiYXNlRm9ybWF0ID0gJ2VlZWUgcCc7XG4gIGlmIChpc1NhbWVVVENXZWVrKGRhdGUsIGJhc2VEYXRlLCBvcHRpb25zKSkge1xuICAgIHJldHVybiBiYXNlRm9ybWF0OyAvLyBpbiBzYW1lIHdlZWtcbiAgfSBlbHNlIGlmIChkYXRlLmdldFRpbWUoKSA+IGJhc2VEYXRlLmdldFRpbWUoKSkge1xuICAgIHJldHVybiBcIidcdTRFMEJcdTRFMkEnXCIgKyBiYXNlRm9ybWF0OyAvLyBpbiBuZXh0IHdlZWtcbiAgfVxuXG4gIHJldHVybiBcIidcdTRFMEFcdTRFMkEnXCIgKyBiYXNlRm9ybWF0OyAvLyBpbiBsYXN0IHdlZWtcbn1cblxudmFyIGZvcm1hdFJlbGF0aXZlTG9jYWxlID0ge1xuICBsYXN0V2VlazogY2hlY2tXZWVrLFxuICAvLyBkYXlzIGJlZm9yZSB5ZXN0ZXJkYXksIG1heWJlIGluIHRoaXMgd2VlayBvciBsYXN0IHdlZWtcbiAgeWVzdGVyZGF5OiBcIidcdTY2MjhcdTU5MjknIHBcIixcbiAgdG9kYXk6IFwiJ1x1NEVDQVx1NTkyOScgcFwiLFxuICB0b21vcnJvdzogXCInXHU2NjBFXHU1OTI5JyBwXCIsXG4gIG5leHRXZWVrOiBjaGVja1dlZWssXG4gIC8vIGRheXMgYWZ0ZXIgdG9tb3Jyb3csIG1heWJlIGluIHRoaXMgd2VlayBvciBuZXh0IHdlZWtcbiAgb3RoZXI6ICdQUCBwJ1xufTtcbnZhciBmb3JtYXRSZWxhdGl2ZSA9IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlKHRva2VuLCBkYXRlLCBiYXNlRGF0ZSwgb3B0aW9ucykge1xuICB2YXIgZm9ybWF0ID0gZm9ybWF0UmVsYXRpdmVMb2NhbGVbdG9rZW5dO1xuICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgYmFzZURhdGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBmb3JtYXQ7XG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybWF0UmVsYXRpdmU7IiwgImltcG9ydCBidWlsZExvY2FsaXplRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuL2luZGV4LmpzXCI7XG52YXIgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnXHU1MjREJywgJ1x1NTE2Q1x1NTE0MyddLFxuICBhYmJyZXZpYXRlZDogWydcdTUyNEQnLCAnXHU1MTZDXHU1MTQzJ10sXG4gIHdpZGU6IFsnXHU1MTZDXHU1MTQzXHU1MjREJywgJ1x1NTE2Q1x1NTE0MyddXG59O1xudmFyIHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogWycxJywgJzInLCAnMycsICc0J10sXG4gIGFiYnJldmlhdGVkOiBbJ1x1N0IyQ1x1NEUwMFx1NUI2MycsICdcdTdCMkNcdTRFOENcdTVCNjMnLCAnXHU3QjJDXHU0RTA5XHU1QjYzJywgJ1x1N0IyQ1x1NTZEQlx1NUI2MyddLFxuICB3aWRlOiBbJ1x1N0IyQ1x1NEUwMFx1NUI2M1x1NUVBNicsICdcdTdCMkNcdTRFOENcdTVCNjNcdTVFQTYnLCAnXHU3QjJDXHU0RTA5XHU1QjYzXHU1RUE2JywgJ1x1N0IyQ1x1NTZEQlx1NUI2M1x1NUVBNiddXG59O1xudmFyIG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnXHU0RTAwJywgJ1x1NEU4QycsICdcdTRFMDknLCAnXHU1NkRCJywgJ1x1NEU5NCcsICdcdTUxNkQnLCAnXHU0RTAzJywgJ1x1NTE2QicsICdcdTRFNUQnLCAnXHU1MzQxJywgJ1x1NTM0MVx1NEUwMCcsICdcdTUzNDFcdTRFOEMnXSxcbiAgYWJicmV2aWF0ZWQ6IFsnMVx1NjcwOCcsICcyXHU2NzA4JywgJzNcdTY3MDgnLCAnNFx1NjcwOCcsICc1XHU2NzA4JywgJzZcdTY3MDgnLCAnN1x1NjcwOCcsICc4XHU2NzA4JywgJzlcdTY3MDgnLCAnMTBcdTY3MDgnLCAnMTFcdTY3MDgnLCAnMTJcdTY3MDgnXSxcbiAgd2lkZTogWydcdTRFMDBcdTY3MDgnLCAnXHU0RThDXHU2NzA4JywgJ1x1NEUwOVx1NjcwOCcsICdcdTU2REJcdTY3MDgnLCAnXHU0RTk0XHU2NzA4JywgJ1x1NTE2RFx1NjcwOCcsICdcdTRFMDNcdTY3MDgnLCAnXHU1MTZCXHU2NzA4JywgJ1x1NEU1RFx1NjcwOCcsICdcdTUzNDFcdTY3MDgnLCAnXHU1MzQxXHU0RTAwXHU2NzA4JywgJ1x1NTM0MVx1NEU4Q1x1NjcwOCddXG59O1xudmFyIGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbJ1x1NjVFNScsICdcdTRFMDAnLCAnXHU0RThDJywgJ1x1NEUwOScsICdcdTU2REInLCAnXHU0RTk0JywgJ1x1NTE2RCddLFxuICBzaG9ydDogWydcdTY1RTUnLCAnXHU0RTAwJywgJ1x1NEU4QycsICdcdTRFMDknLCAnXHU1NkRCJywgJ1x1NEU5NCcsICdcdTUxNkQnXSxcbiAgYWJicmV2aWF0ZWQ6IFsnXHU1NDY4XHU2NUU1JywgJ1x1NTQ2OFx1NEUwMCcsICdcdTU0NjhcdTRFOEMnLCAnXHU1NDY4XHU0RTA5JywgJ1x1NTQ2OFx1NTZEQicsICdcdTU0NjhcdTRFOTQnLCAnXHU1NDY4XHU1MTZEJ10sXG4gIHdpZGU6IFsnXHU2NjFGXHU2NzFGXHU2NUU1JywgJ1x1NjYxRlx1NjcxRlx1NEUwMCcsICdcdTY2MUZcdTY3MUZcdTRFOEMnLCAnXHU2NjFGXHU2NzFGXHU0RTA5JywgJ1x1NjYxRlx1NjcxRlx1NTZEQicsICdcdTY2MUZcdTY3MUZcdTRFOTQnLCAnXHU2NjFGXHU2NzFGXHU1MTZEJ11cbn07XG52YXIgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogJ1x1NEUwQScsXG4gICAgcG06ICdcdTRFMEInLFxuICAgIG1pZG5pZ2h0OiAnXHU1MUNDXHU2NjY4JyxcbiAgICBub29uOiAnXHU1MzQ4JyxcbiAgICBtb3JuaW5nOiAnXHU2NUU5JyxcbiAgICBhZnRlcm5vb246ICdcdTRFMEJcdTUzNDgnLFxuICAgIGV2ZW5pbmc6ICdcdTY2NUEnLFxuICAgIG5pZ2h0OiAnXHU1OTFDJ1xuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiAnXHU0RTBBXHU1MzQ4JyxcbiAgICBwbTogJ1x1NEUwQlx1NTM0OCcsXG4gICAgbWlkbmlnaHQ6ICdcdTUxQ0NcdTY2NjgnLFxuICAgIG5vb246ICdcdTRFMkRcdTUzNDgnLFxuICAgIG1vcm5pbmc6ICdcdTY1RTlcdTY2NjgnLFxuICAgIGFmdGVybm9vbjogJ1x1NEUyRFx1NTM0OCcsXG4gICAgZXZlbmluZzogJ1x1NjY1QVx1NEUwQScsXG4gICAgbmlnaHQ6ICdcdTU5MUNcdTk1RjQnXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogJ1x1NEUwQVx1NTM0OCcsXG4gICAgcG06ICdcdTRFMEJcdTUzNDgnLFxuICAgIG1pZG5pZ2h0OiAnXHU1MUNDXHU2NjY4JyxcbiAgICBub29uOiAnXHU0RTJEXHU1MzQ4JyxcbiAgICBtb3JuaW5nOiAnXHU2NUU5XHU2NjY4JyxcbiAgICBhZnRlcm5vb246ICdcdTRFMkRcdTUzNDgnLFxuICAgIGV2ZW5pbmc6ICdcdTY2NUFcdTRFMEEnLFxuICAgIG5pZ2h0OiAnXHU1OTFDXHU5NUY0J1xuICB9XG59O1xudmFyIGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiAnXHU0RTBBJyxcbiAgICBwbTogJ1x1NEUwQicsXG4gICAgbWlkbmlnaHQ6ICdcdTUxQ0NcdTY2NjgnLFxuICAgIG5vb246ICdcdTUzNDgnLFxuICAgIG1vcm5pbmc6ICdcdTY1RTknLFxuICAgIGFmdGVybm9vbjogJ1x1NEUwQlx1NTM0OCcsXG4gICAgZXZlbmluZzogJ1x1NjY1QScsXG4gICAgbmlnaHQ6ICdcdTU5MUMnXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06ICdcdTRFMEFcdTUzNDgnLFxuICAgIHBtOiAnXHU0RTBCXHU1MzQ4JyxcbiAgICBtaWRuaWdodDogJ1x1NTFDQ1x1NjY2OCcsXG4gICAgbm9vbjogJ1x1NEUyRFx1NTM0OCcsXG4gICAgbW9ybmluZzogJ1x1NjVFOVx1NjY2OCcsXG4gICAgYWZ0ZXJub29uOiAnXHU0RTJEXHU1MzQ4JyxcbiAgICBldmVuaW5nOiAnXHU2NjVBXHU0RTBBJyxcbiAgICBuaWdodDogJ1x1NTkxQ1x1OTVGNCdcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiAnXHU0RTBBXHU1MzQ4JyxcbiAgICBwbTogJ1x1NEUwQlx1NTM0OCcsXG4gICAgbWlkbmlnaHQ6ICdcdTUxQ0NcdTY2NjgnLFxuICAgIG5vb246ICdcdTRFMkRcdTUzNDgnLFxuICAgIG1vcm5pbmc6ICdcdTY1RTlcdTY2NjgnLFxuICAgIGFmdGVybm9vbjogJ1x1NEUyRFx1NTM0OCcsXG4gICAgZXZlbmluZzogJ1x1NjY1QVx1NEUwQScsXG4gICAgbmlnaHQ6ICdcdTU5MUNcdTk1RjQnXG4gIH1cbn07XG52YXIgb3JkaW5hbE51bWJlciA9IGZ1bmN0aW9uIG9yZGluYWxOdW1iZXIoZGlydHlOdW1iZXIsIG9wdGlvbnMpIHtcbiAgdmFyIG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG4gIHN3aXRjaCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnVuaXQpIHtcbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKSArICdcdTY1RTUnO1xuICAgIGNhc2UgJ2hvdXInOlxuICAgICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpICsgJ1x1NjVGNic7XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKSArICdcdTUyMDYnO1xuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkgKyAnXHU3OUQyJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdcdTdCMkMgJyArIG51bWJlci50b1N0cmluZygpO1xuICB9XG59O1xudmFyIGxvY2FsaXplID0ge1xuICBvcmRpbmFsTnVtYmVyOiBvcmRpbmFsTnVtYmVyLFxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiAnd2lkZSdcbiAgfSksXG4gIHF1YXJ0ZXI6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBxdWFydGVyVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnLFxuICAgIGFyZ3VtZW50Q2FsbGJhY2s6IGZ1bmN0aW9uIGFyZ3VtZW50Q2FsbGJhY2socXVhcnRlcikge1xuICAgICAgcmV0dXJuIHF1YXJ0ZXIgLSAxO1xuICAgIH1cbiAgfSksXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiAnd2lkZSdcbiAgfSksXG4gIGRheTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJ1xuICB9KSxcbiAgZGF5UGVyaW9kOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogJ3dpZGUnXG4gIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxpemU7IiwgImltcG9ydCBidWlsZE1hdGNoRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRNYXRjaEZuL2luZGV4LmpzXCI7XG5pbXBvcnQgYnVpbGRNYXRjaFBhdHRlcm5GbiBmcm9tIFwiLi4vLi4vLi4vX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuL2luZGV4LmpzXCI7XG52YXIgbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9eKFx1N0IyQ1xccyopP1xcZCsoXHU2NUU1fFx1NjVGNnxcdTUyMDZ8XHU3OUQyKT8vaTtcbnZhciBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL1xcZCsvaTtcbnZhciBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKFx1NTI0RCkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKFx1NTI0RCkvaSxcbiAgd2lkZTogL14oXHU1MTZDXHU1MTQzXHU1MjREfFx1NTE2Q1x1NTE0MykvaVxufTtcbnZhciBwYXJzZUVyYVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXihcdTUyNEQpL2ksIC9eKFx1NTE2Q1x1NTE0MykvaV1cbn07XG52YXIgbWF0Y2hRdWFydGVyUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bMTIzNF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eXHU3QjJDW1x1NEUwMFx1NEU4Q1x1NEUwOVx1NTZEQl1cdTUyM0IvaSxcbiAgd2lkZTogL15cdTdCMkNbXHU0RTAwXHU0RThDXHU0RTA5XHU1NkRCXVx1NTIzQlx1OTQ5Ri9pXG59O1xudmFyIHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvKDF8XHU0RTAwKS9pLCAvKDJ8XHU0RThDKS9pLCAvKDN8XHU0RTA5KS9pLCAvKDR8XHU1NkRCKS9pXVxufTtcbnZhciBtYXRjaE1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oXHU0RTAwfFx1NEU4Q3xcdTRFMDl8XHU1NkRCfFx1NEU5NHxcdTUxNkR8XHU0RTAzfFx1NTE2QnxcdTRFNUR8XHU1MzQxW1x1NEU4Q1x1NEUwMF0pL2ksXG4gIGFiYnJldmlhdGVkOiAvXihcdTRFMDB8XHU0RThDfFx1NEUwOXxcdTU2REJ8XHU0RTk0fFx1NTE2RHxcdTRFMDN8XHU1MTZCfFx1NEU1RHxcdTUzNDFbXHU0RThDXHU0RTAwXXxcXGR8MVsxMl0pXHU2NzA4L2ksXG4gIHdpZGU6IC9eKFx1NEUwMHxcdTRFOEN8XHU0RTA5fFx1NTZEQnxcdTRFOTR8XHU1MTZEfFx1NEUwM3xcdTUxNkJ8XHU0RTVEfFx1NTM0MVtcdTRFOENcdTRFMDBdKVx1NjcwOC9pXG59O1xudmFyIHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15cdTRFMDAvaSwgL15cdTRFOEMvaSwgL15cdTRFMDkvaSwgL15cdTU2REIvaSwgL15cdTRFOTQvaSwgL15cdTUxNkQvaSwgL15cdTRFMDMvaSwgL15cdTUxNkIvaSwgL15cdTRFNUQvaSwgL15cdTUzNDEoPyEoXHU0RTAwfFx1NEU4QykpL2ksIC9eXHU1MzQxXHU0RTAwL2ksIC9eXHU1MzQxXHU0RThDL2ldLFxuICBhbnk6IFsvXlx1NEUwMHwxL2ksIC9eXHU0RThDfDIvaSwgL15cdTRFMDl8My9pLCAvXlx1NTZEQnw0L2ksIC9eXHU0RTk0fDUvaSwgL15cdTUxNkR8Ni9pLCAvXlx1NEUwM3w3L2ksIC9eXHU1MTZCfDgvaSwgL15cdTRFNUR8OS9pLCAvXlx1NTM0MSg/IShcdTRFMDB8XHU0RThDKSl8MTAvaSwgL15cdTUzNDFcdTRFMDB8MTEvaSwgL15cdTUzNDFcdTRFOEN8MTIvaV1cbn07XG52YXIgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltcdTRFMDBcdTRFOENcdTRFMDlcdTU2REJcdTRFOTRcdTUxNkRcdTY1RTVdL2ksXG4gIHNob3J0OiAvXltcdTRFMDBcdTRFOENcdTRFMDlcdTU2REJcdTRFOTRcdTUxNkRcdTY1RTVdL2ksXG4gIGFiYnJldmlhdGVkOiAvXlx1NTQ2OFtcdTRFMDBcdTRFOENcdTRFMDlcdTU2REJcdTRFOTRcdTUxNkRcdTY1RTVdL2ksXG4gIHdpZGU6IC9eXHU2NjFGXHU2NzFGW1x1NEUwMFx1NEU4Q1x1NEUwOVx1NTZEQlx1NEU5NFx1NTE2RFx1NjVFNV0vaVxufTtcbnZhciBwYXJzZURheVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXHU2NUU1L2ksIC9cdTRFMDAvaSwgL1x1NEU4Qy9pLCAvXHU0RTA5L2ksIC9cdTU2REIvaSwgL1x1NEU5NC9pLCAvXHU1MTZEL2ldXG59O1xudmFyIG1hdGNoRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIGFueTogL14oXHU0RTBBXHU1MzQ4P3xcdTRFMEJcdTUzNDg/fFx1NTM0OFx1NTkxQ3xbXHU0RTJEXHU2QjYzXVx1NTM0OHxcdTY1RTlcdTRFMEE/fFx1NEUwQlx1NTM0OHxcdTY2NUFcdTRFMEE/fFx1NTFDQ1x1NjY2OHwpL2lcbn07XG52YXIgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eXHU0RTBBXHU1MzQ4Py9pLFxuICAgIHBtOiAvXlx1NEUwQlx1NTM0OD8vaSxcbiAgICBtaWRuaWdodDogL15cdTUzNDhcdTU5MUMvaSxcbiAgICBub29uOiAvXltcdTRFMkRcdTZCNjNdXHU1MzQ4L2ksXG4gICAgbW9ybmluZzogL15cdTY1RTlcdTRFMEEvaSxcbiAgICBhZnRlcm5vb246IC9eXHU0RTBCXHU1MzQ4L2ksXG4gICAgZXZlbmluZzogL15cdTY2NUFcdTRFMEE/L2ksXG4gICAgbmlnaHQ6IC9eXHU1MUNDXHU2NjY4L2lcbiAgfVxufTtcbnZhciBtYXRjaCA9IHtcbiAgb3JkaW5hbE51bWJlcjogYnVpbGRNYXRjaFBhdHRlcm5Gbih7XG4gICAgbWF0Y2hQYXR0ZXJuOiBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICB2YWx1ZUNhbGxiYWNrOiBmdW5jdGlvbiB2YWx1ZUNhbGxiYWNrKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH0pLFxuICBlcmE6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknXG4gIH0pLFxuICBxdWFydGVyOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnd2lkZScsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknLFxuICAgIHZhbHVlQ2FsbGJhY2s6IGZ1bmN0aW9uIHZhbHVlQ2FsbGJhY2soaW5kZXgpIHtcbiAgICAgIHJldHVybiBpbmRleCArIDE7XG4gICAgfVxuICB9KSxcbiAgbW9udGg6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnd2lkZScsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICd3aWRlJyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgZGF5UGVyaW9kOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICdhbnknLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknXG4gIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgbWF0Y2g7IiwgImltcG9ydCBmb3JtYXREaXN0YW5jZSBmcm9tIFwiLi9fbGliL2Zvcm1hdERpc3RhbmNlL2luZGV4LmpzXCI7XG5pbXBvcnQgZm9ybWF0TG9uZyBmcm9tIFwiLi9fbGliL2Zvcm1hdExvbmcvaW5kZXguanNcIjtcbmltcG9ydCBmb3JtYXRSZWxhdGl2ZSBmcm9tIFwiLi9fbGliL2Zvcm1hdFJlbGF0aXZlL2luZGV4LmpzXCI7XG5pbXBvcnQgbG9jYWxpemUgZnJvbSBcIi4vX2xpYi9sb2NhbGl6ZS9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoIGZyb20gXCIuL19saWIvbWF0Y2gvaW5kZXguanNcIjtcbi8qKlxuICogQHR5cGUge0xvY2FsZX1cbiAqIEBjYXRlZ29yeSBMb2NhbGVzXG4gKiBAc3VtbWFyeSBDaGluZXNlIFNpbXBsaWZpZWQgbG9jYWxlLlxuICogQGxhbmd1YWdlIENoaW5lc2UgU2ltcGxpZmllZFxuICogQGlzby02MzktMiB6aG9cbiAqIEBhdXRob3IgQ2hhbmd5dSBHZW5nIFtAS2luZ01hcmlvXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vS2luZ01hcmlvfVxuICogQGF1dGhvciBTb25nIFNodW95dW4gW0BmbmxjdHJsXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZm5sY3RybH1cbiAqIEBhdXRob3Igc2FicmluYU0gW0BzYWJyaW5hbWlhb117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3NhYnJpbmFtaWFvfVxuICogQGF1dGhvciBDYXJuZXkgV3UgW0BjdWJpY3dvcmtde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jdWJpY3dvcmt9XG4gKiBAYXV0aG9yIFRlcnJlbmNlIExhbSBbQHNreXVwbGFtXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc2t5dXBsYW19XG4gKi9cbnZhciBsb2NhbGUgPSB7XG4gIGNvZGU6ICd6aC1DTicsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMSAvKiBNb25kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwgImltcG9ydCB7IHpoQ04gfSBmcm9tICdkYXRlLWZucy9sb2NhbGUnO1xuY29uc3QgbG9jYWwgPSB7XG4gIGNvZGU6ICd6aC1DTicsXG4gIGN1cnJlbmN5OiAnQ05ZJyxcbiAgZGF0ZUZuc0xvY2FsZTogemhDTixcbiAgUGFnaW5hdGlvbjoge1xuICAgIHBhZ2VTaXplOiAnXHU2QkNGXHU5ODc1XHU2NzYxXHU2NTcwXHVGRjFBJHtwYWdlU2l6ZX0nLFxuICAgIHRvdGFsOiAnXHU2MDNCXHU5ODc1XHU2NTcwXHVGRjFBJHt0b3RhbH0nLFxuICAgIGp1bXBUbzogJ1x1OERGM1x1ODFGMycsXG4gICAgcGFnZTogJ1x1OTg3NSdcbiAgfSxcbiAgTW9kYWw6IHtcbiAgICBjb25maXJtOiAnXHU3ODZFXHU1QjlBJyxcbiAgICBjYW5jZWw6ICdcdTUzRDZcdTZEODgnXG4gIH0sXG4gIFRhYnM6IHtcbiAgICBtb3JlOiBcIlx1NjZGNFx1NTkxQVwiXG4gIH0sXG4gIFRpbWVQaWNrZXI6IHtcbiAgICBwbGFjZWhvbGRlcjoge1xuICAgICAgdGltZTogJ1x1OEJGN1x1OTAwOVx1NjJFOVx1NjVGNlx1OTVGNCcsXG4gICAgICB0aW1lUmFuZ2U6ICdcdThCRjdcdTkwMDlcdTYyRTlcdTY1RjZcdTk1RjRcdTgzMDNcdTU2RjQnXG4gICAgfSxcbiAgICBiZWdpbjogJ1x1NUYwMFx1NTlDQlx1NjVGNlx1OTVGNCcsXG4gICAgZW5kOiAnXHU3RUQzXHU2NzVGXHU2NUY2XHU5NUY0JyxcbiAgICBob3VyOiAnXHU2NUY2JyxcbiAgICBtaW51dGU6ICdcdTUyMDYnLFxuICAgIHNlY29uZDogJ1x1NzlEMicsXG4gICAgQU06ICdcdTRFMEFcdTUzNDgnLFxuICAgIFBNOiAnXHU0RTBCXHU1MzQ4J1xuICB9LFxuICBEYXRlUGlja2VyOiB7XG4gICAgcGxhY2Vob2xkZXI6IHtcbiAgICAgIGRhdGU6ICdcdThCRjdcdTkwMDlcdTYyRTlcdTY1RTVcdTY3MUYnLFxuICAgICAgZGF0ZVRpbWU6ICdcdThCRjdcdTkwMDlcdTYyRTlcdTY1RTVcdTY3MUZcdTUzQ0FcdTY1RjZcdTk1RjQnLFxuICAgICAgZGF0ZVJhbmdlOiBbJ1x1NUYwMFx1NTlDQlx1NjVFNVx1NjcxRicsICdcdTdFRDNcdTY3NUZcdTY1RTVcdTY3MUYnXSxcbiAgICAgIGRhdGVUaW1lUmFuZ2U6IFsnXHU1RjAwXHU1OUNCXHU2NUU1XHU2NzFGJywgJ1x1N0VEM1x1Njc1Rlx1NjVFNVx1NjcxRiddLFxuICAgICAgbW9udGhSYW5nZTogWydcdTVGMDBcdTU5Q0JcdTY3MDhcdTRFRkQnLCAnXHU3RUQzXHU2NzVGXHU2NzA4XHU0RUZEJ11cbiAgICB9LFxuICAgIHByZXNldHM6ICdcdTVGRUJcdTYzNzdcdTkwMDlcdTYyRTknLFxuICAgIGZvb3Rlcjoge1xuICAgICAgY29uZmlybTogJ1x1Nzg2RVx1NUI5QScsXG4gICAgICBjYW5jZWw6ICdcdTUzRDZcdTZEODgnXG4gICAgfSxcbiAgICBzZWxlY3REYXRlOiAnXHU4RkQ0XHU1NkRFXHU5MDA5XHU2MkU5XHU2NUU1XHU2NzFGJyxcbiAgICBzZWxlY3RUaW1lOiAnXHU5MDA5XHU2MkU5XHU2NUY2XHU5NUY0JyxcbiAgICB5ZWFyOiAnXHU1RTc0JyxcbiAgICBtb250aDogJ1x1NjcwOCcsXG4gICAgZGF5OiAnXHU2NUU1JyxcbiAgICBtb250aFRleHQ6ICcke3llYXJ9XHU1RTc0ICR7bW9udGh9JyxcbiAgICBtb250aHM6IHtcbiAgICAgIDE6ICcxXHU2NzA4JyxcbiAgICAgIDI6ICcyXHU2NzA4JyxcbiAgICAgIDM6ICczXHU2NzA4JyxcbiAgICAgIDQ6ICc0XHU2NzA4JyxcbiAgICAgIDU6ICc1XHU2NzA4JyxcbiAgICAgIDY6ICc2XHU2NzA4JyxcbiAgICAgIDc6ICc3XHU2NzA4JyxcbiAgICAgIDg6ICc4XHU2NzA4JyxcbiAgICAgIDk6ICc5XHU2NzA4JyxcbiAgICAgIDEwOiAnMTBcdTY3MDgnLFxuICAgICAgMTE6ICcxMVx1NjcwOCcsXG4gICAgICAxMjogJzEyXHU2NzA4J1xuICAgIH0sXG4gICAgLy8gdGltZXBpY2tlciBzY3JvbGx3aGVlbFx1OTFDQ1x1NTNFQVx1OTcwMFx1ODk4MVx1NUM1NVx1NzkzQVsxXHUzMDAxMlx1MjAyNlx1MjAyNl1cdUZGMENcdTYyNDBcdTRFRTVcdThGRDlcdTkxQ0NcdTc2ODRmdWxsTW9udGhzXHU2ODM5XHU2MzZFVUlcdTVCOUFcdTUyMzZcdTRFODZcbiAgICBmdWxsTW9udGhzOiB7XG4gICAgICAxOiAnMScsXG4gICAgICAyOiAnMicsXG4gICAgICAzOiAnMycsXG4gICAgICA0OiAnNCcsXG4gICAgICA1OiAnNScsXG4gICAgICA2OiAnNicsXG4gICAgICA3OiAnNycsXG4gICAgICA4OiAnOCcsXG4gICAgICA5OiAnOScsXG4gICAgICAxMDogJzEwJyxcbiAgICAgIDExOiAnMTEnLFxuICAgICAgMTI6ICcxMidcbiAgICB9LFxuICAgIHdlZWtzOiB7XG4gICAgICBNb246ICdcdTRFMDAnLFxuICAgICAgVHVlOiAnXHU0RThDJyxcbiAgICAgIFdlZDogJ1x1NEUwOScsXG4gICAgICBUaHU6ICdcdTU2REInLFxuICAgICAgRnJpOiAnXHU0RTk0JyxcbiAgICAgIFNhdDogJ1x1NTE2RCcsXG4gICAgICBTdW46ICdcdTY1RTUnXG4gICAgfSxcbiAgICBsb2NhbGVGb3JtYXRUb2tlbjoge1xuICAgICAgRk9STUFUX1NXSVRDSF9EQVRFOiAneXl5eS1NTS1kZCdcbiAgICB9XG4gIH0sXG4gIE5hdmlnYXRpb246IHtcbiAgICBjb2xsYXBzZVRleHQ6ICdcdTY1MzZcdThENzdcdTRGQTdcdThGQjlcdTY4MEYnLFxuICAgIGV4cGFuZFRleHQ6ICdcdTVDNTVcdTVGMDBcdTRGQTdcdThGQjlcdTY4MEYnXG4gIH0sXG4gIFBvcGNvbmZpcm06IHtcbiAgICBjb25maXJtOiAnXHU3ODZFXHU1QjlBJyxcbiAgICBjYW5jZWw6ICdcdTUzRDZcdTZEODgnXG4gIH0sXG4gIFRhYmxlOiB7XG4gICAgZW1wdHlUZXh0OiAnXHU2NjgyXHU2NUUwXHU2NTcwXHU2MzZFJyxcbiAgICBwYWdlVGV4dDogJ1x1NjYzRVx1NzkzQVx1N0IyQyAke2N1cnJlbnRTdGFydH0gXHU2NzYxLVx1N0IyQyAke2N1cnJlbnRFbmR9IFx1Njc2MVx1RkYwQ1x1NTE3MSAke3RvdGFsfSBcdTY3NjEnLFxuICAgIGRlc2NlbmQ6ICdcdTcwQjlcdTUxRkJcdTk2NERcdTVFOEYnLFxuICAgIGFzY2VuZDogJ1x1NzBCOVx1NTFGQlx1NTM0N1x1NUU4RicsXG4gICAgY2FuY2VsU29ydDogJ1x1NTNENlx1NkQ4OFx1NjM5Mlx1NUU4RidcbiAgfSxcbiAgU2VsZWN0OiB7XG4gICAgZW1wdHlUZXh0OiAnXHU2NjgyXHU2NUUwXHU2NTcwXHU2MzZFJyxcbiAgICBjcmVhdGVUZXh0OiAnXHU1MjFCXHU1RUZBJ1xuICB9LFxuICBDYXNjYWRlcjoge1xuICAgIGVtcHR5VGV4dDogJ1x1NjY4Mlx1NjVFMFx1NjU3MFx1NjM2RSdcbiAgfSxcbiAgVHJlZToge1xuICAgIGVtcHR5VGV4dDogJ1x1NjY4Mlx1NjVFMFx1NjU3MFx1NjM2RScsXG4gICAgc2VhcmNoUGxhY2Vob2xkZXI6ICdcdTY0MUNcdTdEMjInXG4gIH0sXG4gIExpc3Q6IHtcbiAgICBlbXB0eVRleHQ6ICdcdTY2ODJcdTY1RTBcdTY1NzBcdTYzNkUnXG4gIH0sXG4gIENhbGVuZGFyOiB7XG4gICAgYWxsRGF5OiAnXHU1MTY4XHU1OTI5JyxcbiAgICBBTTogJ1x1NEUwQVx1NTM0OCR7dGltZX1cdTY1RjYnLFxuICAgIFBNOiAnXHU0RTBCXHU1MzQ4JHt0aW1lfVx1NjVGNicsXG4gICAgZGF0ZXN0cmluZzogJ1x1NjVFNScsXG4gICAgcmVtYWluaW5nOiAnXHU4RkQ4XHU2NzA5JHtyZW1haW5lZH1cdTk4NzknXG4gIH0sXG4gIFVwbG9hZDoge1xuICAgIG1haW5UZXh0OiAnXHU3MEI5XHU1MUZCXHU0RTBBXHU0RjIwXHU2NTg3XHU0RUY2XHU2MjE2XHU2MkQ2XHU2MkZEXHU2NTg3XHU0RUY2XHU1MjMwXHU4RkQ5XHU5MUNDJyxcbiAgICBpbGxlZ2FsVGlwczogJ1x1NEUwRFx1NjUyRlx1NjMwMVx1NkI2NFx1N0M3Qlx1NTc4Qlx1NjU4N1x1NEVGNicsXG4gICAgbGVnYWxUaXBzOiAnXHU2NzdFXHU2MjRCXHU1RjAwXHU1OUNCXHU0RTBBXHU0RjIwJyxcbiAgICByZXRyeTogJ1x1OTFDRFx1OEJENScsXG4gICAgcmVwbGFjZTogJ1x1NjZGRlx1NjM2Mlx1NjU4N1x1NEVGNicsXG4gICAgY2xlYXI6ICdcdTZFMDVcdTdBN0EnLFxuICAgIHNlbGVjdGVkRmlsZXM6ICdcdTVERjJcdTkwMDlcdTYyRTlcdTY1ODdcdTRFRjYnLFxuICAgIGlsbGVnYWxTaXplOiAnXHU2NTg3XHU0RUY2XHU1QzNBXHU1QkY4XHU0RTBEXHU1NDA4XHU2Q0Q1JyxcbiAgICBmYWlsOiAnXHU0RTBBXHU0RjIwXHU1OTMxXHU4RDI1J1xuICB9LFxuICBUcmVlU2VsZWN0OiB7XG4gICAgc2VhcmNoUGxhY2Vob2xkZXI6ICdcdTY0MUNcdTdEMjInXG4gIH0sXG4gIFR5cG9ncmFwaHk6IHtcbiAgICBjb3B5OiAnXHU1OTBEXHU1MjM2JyxcbiAgICBjb3BpZWQ6ICdcdTU5MERcdTUyMzZcdTYyMTBcdTUyOUYnLFxuICAgIGV4cGFuZDogJ1x1NUM1NVx1NUYwMCcsXG4gICAgY29sbGFwc2U6ICdcdTY1MzZcdThENzcnXG4gIH0sXG4gIFRyYW5zZmVyOiB7XG4gICAgZW1wdHlMZWZ0OiAnXHU2NjgyXHU2NUUwXHU2NTcwXHU2MzZFJyxcbiAgICBlbXB0eVNlYXJjaDogJ1x1NjVFMFx1NjQxQ1x1N0QyMlx1N0VEM1x1Njc5QycsXG4gICAgZW1wdHlSaWdodDogJ1x1NjY4Mlx1NjVFMFx1NTE4NVx1NUJCOVx1RkYwQ1x1NTNFRlx1NEVDRVx1NURFNlx1NEZBN1x1NTJGRVx1OTAwOScsXG4gICAgcGxhY2Vob2xkZXI6ICdcdTY0MUNcdTdEMjInLFxuICAgIGNsZWFyOiAnXHU2RTA1XHU3QTdBJyxcbiAgICBzZWxlY3RBbGw6ICdcdTUxNjhcdTkwMDknLFxuICAgIGNsZWFyU2VsZWN0QWxsOiAnXHU1M0Q2XHU2RDg4XHU1MTY4XHU5MDA5JyxcbiAgICB0b3RhbDogJ1x1NjAzQlx1NEUyQVx1NjU3MFx1RkYxQSR7dG90YWx9JyxcbiAgICBzZWxlY3RlZDogJ1x1NURGMlx1OTAwOVx1NEUyQVx1NjU3MFx1RkYxQSR7dG90YWx9J1xuICB9LFxuICBGb3JtOiB7XG4gICAgb3B0aW9uYWw6ICdcdUZGMDhcdTUzRUZcdTkwMDlcdUZGMDknXG4gIH0sXG4gIEltYWdlOiB7XG4gICAgcHJldmlldzogJ1x1OTg4NFx1ODlDOCcsXG4gICAgbG9hZGluZzogJ1x1NTJBMFx1OEY3RFx1NEUyRCcsXG4gICAgbG9hZEVycm9yOiAnXHU1MkEwXHU4RjdEXHU1OTMxXHU4RDI1JyxcbiAgICBwcmV2VGlwOiAnXHU0RTBBXHU0RTAwXHU1RjIwJyxcbiAgICBuZXh0VGlwOiAnXHU0RTBCXHU0RTAwXHU1RjIwJyxcbiAgICB6b29tSW5UaXA6ICdcdTY1M0VcdTU5MjcnLFxuICAgIHpvb21PdXRUaXA6ICdcdTdGMjlcdTVDMEYnLFxuICAgIHJvdGF0ZVRpcDogJ1x1NjVDQlx1OEY2QycsXG4gICAgZG93bmxvYWRUaXA6ICdcdTRFMEJcdThGN0QnLFxuICAgIGFkYXB0aXZlVGlwOiAnXHU5MDAyXHU1RTk0XHU5ODc1XHU5NzYyJyxcbiAgICBvcmlnaW5UaXA6ICdcdTUzOUZcdTU5Q0JcdTVDM0FcdTVCRjgnXG4gIH0sXG4gIENoYXQ6IHtcbiAgICBkZWxldGVDb25maXJtOiAnXHU3ODZFXHU4QkE0XHU1MjIwXHU5NjY0XHU4QkU1XHU0RjFBXHU4QkREXHU1NDE3XHVGRjFGJyxcbiAgICBjbGVhckNvbnRleHQ6ICdcdTRFMEFcdTRFMEJcdTY1ODdcdTVERjJcdTZFMDVcdTk2NjQnLFxuICAgIGNvcHlTdWNjZXNzOiAnXHU1OTBEXHU1MjM2XHU2MjEwXHU1MjlGJyxcbiAgICBzdG9wOiAnXHU1MDVDXHU2QjYyJyxcbiAgICBjb3B5OiAnXHU1OTBEXHU1MjM2JyxcbiAgICBjb3BpZWQ6ICdcdTU5MERcdTUyMzZcdTYyMTBcdTUyOUYnLFxuICAgIGRyb3BBcmVhVGV4dDogJ1x1NUMwNlx1NjU4N1x1NEVGNlx1NjUzRVx1NTIzMFx1OEZEOVx1OTFDQydcbiAgfSxcbiAgVXNlckd1aWRlOiB7XG4gICAgc2tpcDogJ1x1OERGM1x1OEZDNycsXG4gICAgbmV4dDogJ1x1NEUwQlx1NEUwMFx1NkI2NScsXG4gICAgcHJldjogJ1x1NEUwQVx1NEUwMFx1NkI2NScsXG4gICAgZmluaXNoOiAnXHU1QjhDXHU2MjEwJ1xuICB9LFxuICBJbnB1dE51bWJlcjoge30sXG4gIEpzb25WaWV3ZXI6IHtcbiAgICBzZWFyY2g6ICdcdTY3RTVcdTYyN0UnLFxuICAgIHJlcGxhY2U6ICdcdTY2RkZcdTYzNjInLFxuICAgIHJlcGxhY2VBbGw6ICdcdTUxNjhcdTkwRThcdTY2RkZcdTYzNjInXG4gIH0sXG4gIFZpZGVvUGxheWVyOiB7XG4gICAgcmF0ZUNoYW5nZTogJ1x1NTIwN1x1NjM2Mlx1OTAxRlx1NzM4N1x1ODFGMyAke3JhdGV9JyxcbiAgICBxdWFsaXR5Q2hhbmdlOiAnXHU1MjA3XHU2MzYyXHU2RTA1XHU2NjcwXHU1RUE2XHU4MUYzJHtxdWFsaXR5fScsXG4gICAgcm91dGVDaGFuZ2U6ICdcdTUyMDdcdTYzNjJcdTdFQkZcdThERUZcdTgxRjMke3JvdXRlfScsXG4gICAgbWlycm9yOiAnXHU5NTVDXHU1MENGJyxcbiAgICBjYW5jZWxNaXJyb3I6ICdcdTUzRDZcdTZEODhcdTk1NUNcdTUwQ0YnLFxuICAgIGxvYWRpbmc6ICdcdTUyQTBcdThGN0RcdTRFMkQuLi4nLFxuICAgIHN0YWxsOiAnXHU1MkEwXHU4RjdEXHU1OTMxXHU4RDI1JyxcbiAgICBub1Jlc291cmNlOiAnXHU2NjgyXHU2NUUwXHU4RDQ0XHU2RTkwJyxcbiAgICB2aWRlb0Vycm9yOiAnXHU4OUM2XHU5ODkxXHU1MkEwXHU4RjdEXHU5NTE5XHU4QkVGJ1xuICB9XG59O1xuLy8gXHU0RTJEXHU2NTg3XG5leHBvcnQgZGVmYXVsdCBsb2NhbDsiLCAidmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCQVNFX0NMQVNTX1BSRUZJWCB9IGZyb20gJy4uL2Vudic7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICcuLi9zdHlsZXMvaWNvbnMuY3NzJztcbmNvbnN0IEljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgICBzdmcsXG4gICAgICBzcGluID0gZmFsc2UsXG4gICAgICByb3RhdGUsXG4gICAgICBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHByZWZpeENscyA9IEJBU0VfQ0xBU1NfUFJFRklYLFxuICAgICAgdHlwZSxcbiAgICAgIHNpemUgPSAnZGVmYXVsdCdcbiAgICB9ID0gcHJvcHMsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJzdmdcIiwgXCJzcGluXCIsIFwicm90YXRlXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJwcmVmaXhDbHNcIiwgXCJ0eXBlXCIsIFwic2l6ZVwiXSk7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbHMoYCR7cHJlZml4Q2xzfS1pY29uYCwge1xuICAgIFtgJHtwcmVmaXhDbHN9LWljb24tZXh0cmEtc21hbGxgXTogc2l6ZSA9PT0gJ2V4dHJhLXNtYWxsJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1pY29uLXNtYWxsYF06IHNpemUgPT09ICdzbWFsbCcsXG4gICAgW2Ake3ByZWZpeENsc30taWNvbi1kZWZhdWx0YF06IHNpemUgPT09ICdkZWZhdWx0JyxcbiAgICBbYCR7cHJlZml4Q2xzfS1pY29uLWxhcmdlYF06IHNpemUgPT09ICdsYXJnZScsXG4gICAgW2Ake3ByZWZpeENsc30taWNvbi1leHRyYS1sYXJnZWBdOiBzaXplID09PSAnZXh0cmEtbGFyZ2UnLFxuICAgIFtgJHtwcmVmaXhDbHN9LWljb24tc3Bpbm5pbmdgXTogc3BpbiA9PT0gdHJ1ZSxcbiAgICBbYCR7cHJlZml4Q2xzfS1pY29uLSR7dHlwZX1gXTogQm9vbGVhbih0eXBlKVxuICB9LCBjbGFzc05hbWUpO1xuICBjb25zdCBvdXRlclN0eWxlID0ge307XG4gIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihyb3RhdGUpKSB7XG4gICAgb3V0ZXJTdHlsZS50cmFuc2Zvcm0gPSBgcm90YXRlKCR7cm90YXRlfWRlZylgO1xuICB9XG4gIE9iamVjdC5hc3NpZ24ob3V0ZXJTdHlsZSwgc3R5bGUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIE9iamVjdC5hc3NpZ24oe1xuICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgcmVmOiByZWYsXG4gICAgXCJhcmlhLWxhYmVsXCI6IHR5cGUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgIHN0eWxlOiBvdXRlclN0eWxlXG4gIH0sIHJlc3RQcm9wcyksIHN2Zyk7XG59KTtcbi8vIEB0cy1pZ25vcmUgdXNlZCB0byBqdWRnZSB3aGV0aGVyIGl0IGlzIGEgc2VtaS1pY29uIGluIHNlbWktdWlcbi8vIGN1c3RvbSBpY29uIGNhc2Vcbkljb24uZWxlbWVudFR5cGUgPSAnSWNvbic7XG5jb25zdCBjb252ZXJ0SWNvbiA9IChTdmcsIGljb25UeXBlKSA9PiB7XG4gIGNvbnN0IElubmVySWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uLCBPYmplY3QuYXNzaWduKHtcbiAgICBzdmc6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN2ZyksXG4gICAgdHlwZTogaWNvblR5cGUsXG4gICAgcmVmOiByZWZcbiAgfSwgcHJvcHMpKSk7XG4gIC8vIEB0cy1pZ25vcmUgdXNlZCB0byBqdWRnZSB3aGV0aGVyIGl0IGlzIGEgc2VtaS1pY29uIGluIHNlbWktdWkgXG4gIC8vIGJ1aWx0aW4gaWNvbiBjYXNlXG4gIElubmVySWNvbi5lbGVtZW50VHlwZSA9ICdJY29uJztcbiAgcmV0dXJuIElubmVySWNvbjtcbn07XG5leHBvcnQgeyBjb252ZXJ0SWNvbiB9O1xuZXhwb3J0IGRlZmF1bHQgSWNvbjsiLCAiZXhwb3J0IGNvbnN0IEJBU0VfQ0xBU1NfUFJFRklYID0gJ3NlbWknOyIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb252ZXJ0SWNvbiB9IGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbic7XG5mdW5jdGlvbiBTdmdDb21wb25lbnQocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIE9iamVjdC5hc3NpZ24oe1xuICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogXCIxZW1cIixcbiAgICBoZWlnaHQ6IFwiMWVtXCIsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgcHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNC4wOCA3LjZhMS41IDEuNSAwIDAgMSAyLjEyIDBsNS42NiA1LjY1IDUuNjYtNS42NWExLjUgMS41IDAgMSAxIDIuMTIgMi4xMmwtNi43MiA2LjcyYTEuNSAxLjUgMCAwIDEtMi4xMiAwTDQuMDggOS43MmExLjUgMS41IDAgMCAxIDAtMi4xMlpcIixcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiXG4gIH0pKTtcbn1cbmNvbnN0IEljb25Db21wb25lbnQgPSBjb252ZXJ0SWNvbihTdmdDb21wb25lbnQsICdjaGV2cm9uX2Rvd24nKTtcbmV4cG9ydCBkZWZhdWx0IEljb25Db21wb25lbnQ7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbnZlcnRJY29uIH0gZnJvbSAnLi4vY29tcG9uZW50cy9JY29uJztcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiBcIjFlbVwiLFxuICAgIGhlaWdodDogXCIxZW1cIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNi4yOCA0LjI0YTEuNSAxLjUgMCAwIDEgMCAyLjEybC01LjY2IDUuNjYgNS42NiA1LjY1YTEuNSAxLjUgMCAxIDEtMi4xMiAyLjEzbC02LjcyLTYuNzJhMS41IDEuNSAwIDAgMSAwLTIuMTJsNi43Mi02LjcyYTEuNSAxLjUgMCAwIDEgMi4xMiAwWlwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCJcbiAgfSkpO1xufVxuY29uc3QgSWNvbkNvbXBvbmVudCA9IGNvbnZlcnRJY29uKFN2Z0NvbXBvbmVudCwgJ2NoZXZyb25fbGVmdCcpO1xuZXhwb3J0IGRlZmF1bHQgSWNvbkNvbXBvbmVudDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29udmVydEljb24gfSBmcm9tICcuLi9jb21wb25lbnRzL0ljb24nO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IFwiMWVtXCIsXG4gICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgIGZvY3VzYWJsZTogZmFsc2UsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTcuNDQgMTkuOGExLjUgMS41IDAgMCAxIDAtMi4xM2w1LjY2LTUuNjUtNS42Ni01LjY2YTEuNSAxLjUgMCAxIDEgMi4xMi0yLjEybDYuNzIgNi43MmExLjUgMS41IDAgMCAxIDAgMi4xMkw5LjU2IDE5LjhhMS41IDEuNSAwIDAgMS0yLjEyIDBaXCIsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIlxuICB9KSk7XG59XG5jb25zdCBJY29uQ29tcG9uZW50ID0gY29udmVydEljb24oU3ZnQ29tcG9uZW50LCAnY2hldnJvbl9yaWdodCcpO1xuZXhwb3J0IGRlZmF1bHQgSWNvbkNvbXBvbmVudDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29udmVydEljb24gfSBmcm9tICcuLi9jb21wb25lbnRzL0ljb24nO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IFwiMWVtXCIsXG4gICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgIGZvY3VzYWJsZTogZmFsc2UsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNy42NiAxOS43OGExLjUgMS41IDAgMCAwIDIuMTItMi4xMkwxNC4xMiAxMmw1LjY2LTUuNjZhMS41IDEuNSAwIDAgMC0yLjEyLTIuMTJMMTIgOS44OCA2LjM0IDQuMjJhMS41IDEuNSAwIDEgMC0yLjEyIDIuMTJMOS44OCAxMmwtNS42NiA1LjY2YTEuNSAxLjUgMCAwIDAgMi4xMiAyLjEyTDEyIDE0LjEybDUuNjYgNS42NlpcIixcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiXG4gIH0pKTtcbn1cbmNvbnN0IEljb25Db21wb25lbnQgPSBjb252ZXJ0SWNvbihTdmdDb21wb25lbnQsICdjbG9zZScpO1xuZXhwb3J0IGRlZmF1bHQgSWNvbkNvbXBvbmVudDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29udmVydEljb24gfSBmcm9tICcuLi9jb21wb25lbnRzL0ljb24nO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IFwiMWVtXCIsXG4gICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgIGZvY3VzYWJsZTogZmFsc2UsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03IDRjMC0xLjEuOS0yIDItMmgxMWEyIDIgMCAwIDEgMiAydjExYTIgMiAwIDAgMS0yIDJoLTFWOGMwLTItMS0zLTMtM0g3VjRaXCIsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01IDdhMiAyIDAgMCAwLTIgMnYxMGMwIDEuMS45IDIgMiAyaDEwYTIgMiAwIDAgMCAyLTJWOWEyIDIgMCAwIDAtMi0ySDVaXCIsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIlxuICB9KSk7XG59XG5jb25zdCBJY29uQ29tcG9uZW50ID0gY29udmVydEljb24oU3ZnQ29tcG9uZW50LCAnY29weScpO1xuZXhwb3J0IGRlZmF1bHQgSWNvbkNvbXBvbmVudDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29udmVydEljb24gfSBmcm9tICcuLi9jb21wb25lbnRzL0ljb24nO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IFwiMWVtXCIsXG4gICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgIGZvY3VzYWJsZTogZmFsc2UsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTkuMzggMmExIDEgMCAwIDAtLjkuNTVMNy4wMiA1LjVIM2ExIDEgMCAwIDAtMSAxdjFhMSAxIDAgMCAwIDEgMWgxOGExIDEgMCAwIDAgMS0xdi0xYTEgMSAwIDAgMC0xLTFoLTRMMTUuNSAyLjU1YTEgMSAwIDAgMC0uOS0uNTVIOS4zOVptNS40OCAzLjUtLjcyLTEuMjVhLjUuNSAwIDAgMC0uNDMtLjI1aC0zLjQyYS41LjUgMCAwIDAtLjQzLjI1TDkuMTQgNS41aDUuNzJabTMuODYgNC41SDUuMjhhMSAxIDAgMCAwLS45NyAxLjI0bDIuMTIgOC40OUEzIDMgMCAwIDAgOS4zNCAyMmg1LjMyYTMgMyAwIDAgMCAyLjktMi4yN2wyLjEzLTguNDlhMSAxIDAgMCAwLS45Ny0xLjI0WlwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCJcbiAgfSkpO1xufVxuY29uc3QgSWNvbkNvbXBvbmVudCA9IGNvbnZlcnRJY29uKFN2Z0NvbXBvbmVudCwgJ2RlbGV0ZScpO1xuZXhwb3J0IGRlZmF1bHQgSWNvbkNvbXBvbmVudDsiLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29udmVydEljb24gfSBmcm9tICcuLi9jb21wb25lbnRzL0ljb24nO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IFwiMWVtXCIsXG4gICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgIGZvY3VzYWJsZTogZmFsc2UsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEyLjk0IDIuOTRhNS43NCA1Ljc0IDAgMSAxIDguMTIgOC4xMmwtMi42NyAyLjY3YTcuMDUgNy4wNSAwIDAgMC0uNC0zLjg1bC45NS0uOTRhMi43NCAyLjc0IDAgMSAwLTMuODgtMy44OGwtNCA0YTIuNzQgMi43NCAwIDAgMCAuOSA0LjQ4bC0yLjIgMi4yYTUuNzcgNS43NyAwIDAgMS0uODItOC44bDQtNFptLTEwIDEwIDIuNjctMi42N2E3LjA0IDcuMDQgMCAwIDAgLjQgMy44NWwtLjk1Ljk0YTIuNzQgMi43NCAwIDEgMCAzLjg4IDMuODhsNC00YTIuNzQgMi43NCAwIDAgMC0uNTctNC4zMWwyLjE2LTIuMTZhNS43NCA1Ljc0IDAgMCAxIC41MyA4LjZsLTQgNGE1Ljc0IDUuNzQgMCAwIDEtOC4xMi04LjEzWlwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCJcbiAgfSkpO1xufVxuY29uc3QgSWNvbkNvbXBvbmVudCA9IGNvbnZlcnRJY29uKFN2Z0NvbXBvbmVudCwgJ2xpbmsnKTtcbmV4cG9ydCBkZWZhdWx0IEljb25Db21wb25lbnQ7IiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbnZlcnRJY29uIH0gZnJvbSAnLi4vY29tcG9uZW50cy9JY29uJztcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiBcIjFlbVwiLFxuICAgIGhlaWdodDogXCIxZW1cIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0yMS4zNSA0LjI3Yy42OC40Ny44NiAxLjQuMzggMi4wOGwtMTAgMTQuNWExLjUgMS41IDAgMCAxLTIuMzMuMTdsLTYuNS03YTEuNSAxLjUgMCAwIDEgMi4yLTIuMDRsNS4yMyA1LjYzIDguOTQtMTIuOTZhMS41IDEuNSAwIDAgMSAyLjA4LS4zOFpcIixcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiXG4gIH0pKTtcbn1cbmNvbnN0IEljb25Db21wb25lbnQgPSBjb252ZXJ0SWNvbihTdmdDb21wb25lbnQsICd0aWNrJyk7XG5leHBvcnQgZGVmYXVsdCBJY29uQ29tcG9uZW50OyIsICJpbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IHsgRU5URVJfS0VZIH0gZnJvbSAnLi9rZXlDb2RlJztcbmZ1bmN0aW9uIGlzRW50ZXJQcmVzcyhlKSB7XG4gIHJldHVybiBfZ2V0KGUsICdrZXknKSA9PT0gRU5URVJfS0VZID8gdHJ1ZSA6IGZhbHNlO1xufVxuZXhwb3J0IGRlZmF1bHQgaXNFbnRlclByZXNzOyIsICIvKipcbiAqIEBpZ25vcmVcbiAqIHNvbWUga2V5LWNvZGVzIGRlZmluaXRpb24gYW5kIHV0aWxzIGZyb20gY2xvc3VyZS1saWJyYXJ5XG4gKi9cbmNvbnN0IGtleUNvZGUgPSB7XG4gIC8qKlxuICAgKiBNQUNfRU5URVJcbiAgICovXG4gIE1BQ19FTlRFUjogMyxcbiAgLyoqXG4gICAqIEJBQ0tTUEFDRVxuICAgKi9cbiAgQkFDS1NQQUNFOiA4LFxuICAvKipcbiAgICogVEFCXG4gICAqL1xuICBUQUI6IDksXG4gIC8qKlxuICAgKiBOVU1MT0NLIG9uIEZGL1NhZmFyaSBNYWNcbiAgICovXG4gIE5VTV9DRU5URVI6IDEyLFxuICAvKipcbiAgICogRU5URVJcbiAgICovXG4gIEVOVEVSOiAxMyxcbiAgLyoqXG4gICAqIFNISUZUXG4gICAqL1xuICBTSElGVDogMTYsXG4gIC8qKlxuICAgKiBDVFJMXG4gICAqL1xuICBDVFJMOiAxNyxcbiAgLyoqXG4gICAqIEFMVFxuICAgKi9cbiAgQUxUOiAxOCxcbiAgLyoqXG4gICAqIFBBVVNFXG4gICAqL1xuICBQQVVTRTogMTksXG4gIC8qKlxuICAgKiBDQVBTX0xPQ0tcbiAgICovXG4gIENBUFNfTE9DSzogMjAsXG4gIC8qKlxuICAgKiBFU0NcbiAgICovXG4gIEVTQzogMjcsXG4gIC8qKlxuICAgKiBTUEFDRVxuICAgKi9cbiAgU1BBQ0U6IDMyLFxuICAvKipcbiAgICogUEFHRV9VUFxuICAgKi9cbiAgUEFHRV9VUDogMzMsXG4gIC8qKlxuICAgKiBQQUdFX0RPV05cbiAgICovXG4gIFBBR0VfRE9XTjogMzQsXG4gIC8qKlxuICAgKiBFTkRcbiAgICovXG4gIEVORDogMzUsXG4gIC8qKlxuICAgKiBIT01FXG4gICAqL1xuICBIT01FOiAzNixcbiAgLyoqXG4gICAqIExFRlRcbiAgICovXG4gIExFRlQ6IDM3LFxuICAvKipcbiAgICogVVBcbiAgICovXG4gIFVQOiAzOCxcbiAgLyoqXG4gICAqIFJJR0hUXG4gICAqL1xuICBSSUdIVDogMzksXG4gIC8qKlxuICAgKiBET1dOXG4gICAqL1xuICBET1dOOiA0MCxcbiAgLyoqXG4gICAqIFBSSU5UX1NDUkVFTlxuICAgKi9cbiAgUFJJTlRfU0NSRUVOOiA0NCxcbiAgLyoqXG4gICAqIElOU0VSVFxuICAgKi9cbiAgSU5TRVJUOiA0NSxcbiAgLyoqXG4gICAqIERFTEVURVxuICAgKi9cbiAgREVMRVRFOiA0NixcbiAgLyoqXG4gICAqIFpFUk9cbiAgICovXG4gIFpFUk86IDQ4LFxuICAvKipcbiAgICogT05FXG4gICAqL1xuICBPTkU6IDQ5LFxuICAvKipcbiAgICogVFdPXG4gICAqL1xuICBUV086IDUwLFxuICAvKipcbiAgICogVEhSRUVcbiAgICovXG4gIFRIUkVFOiA1MSxcbiAgLyoqXG4gICAqIEZPVVJcbiAgICovXG4gIEZPVVI6IDUyLFxuICAvKipcbiAgICogRklWRVxuICAgKi9cbiAgRklWRTogNTMsXG4gIC8qKlxuICAgKiBTSVhcbiAgICovXG4gIFNJWDogNTQsXG4gIC8qKlxuICAgKiBTRVZFTlxuICAgKi9cbiAgU0VWRU46IDU1LFxuICAvKipcbiAgICogRUlHSFRcbiAgICovXG4gIEVJR0hUOiA1NixcbiAgLyoqXG4gICAqIE5JTkVcbiAgICovXG4gIE5JTkU6IDU3LFxuICAvKipcbiAgICogUVVFU1RJT05fTUFSS1xuICAgKi9cbiAgUVVFU1RJT05fTUFSSzogNjMsXG4gIC8qKlxuICAgKiBBXG4gICAqL1xuICBBOiA2NSxcbiAgLyoqXG4gICAqIEJcbiAgICovXG4gIEI6IDY2LFxuICAvKipcbiAgICogQ1xuICAgKi9cbiAgQzogNjcsXG4gIC8qKlxuICAgKiBEXG4gICAqL1xuICBEOiA2OCxcbiAgLyoqXG4gICAqIEVcbiAgICovXG4gIEU6IDY5LFxuICAvKipcbiAgICogRlxuICAgKi9cbiAgRjogNzAsXG4gIC8qKlxuICAgKiBHXG4gICAqL1xuICBHOiA3MSxcbiAgLyoqXG4gICAqIEhcbiAgICovXG4gIEg6IDcyLFxuICAvKipcbiAgICogSVxuICAgKi9cbiAgSTogNzMsXG4gIC8qKlxuICAgKiBKXG4gICAqL1xuICBKOiA3NCxcbiAgLyoqXG4gICAqIEtcbiAgICovXG4gIEs6IDc1LFxuICAvKipcbiAgICogTFxuICAgKi9cbiAgTDogNzYsXG4gIC8qKlxuICAgKiBNXG4gICAqL1xuICBNOiA3NyxcbiAgLyoqXG4gICAqIE5cbiAgICovXG4gIE46IDc4LFxuICAvKipcbiAgICogT1xuICAgKi9cbiAgTzogNzksXG4gIC8qKlxuICAgKiBQXG4gICAqL1xuICBQOiA4MCxcbiAgLyoqXG4gICAqIFFcbiAgICovXG4gIFE6IDgxLFxuICAvKipcbiAgICogUlxuICAgKi9cbiAgUjogODIsXG4gIC8qKlxuICAgKiBTXG4gICAqL1xuICBTOiA4MyxcbiAgLyoqXG4gICAqIFRcbiAgICovXG4gIFQ6IDg0LFxuICAvKipcbiAgICogVVxuICAgKi9cbiAgVTogODUsXG4gIC8qKlxuICAgKiBWXG4gICAqL1xuICBWOiA4NixcbiAgLyoqXG4gICAqIFdcbiAgICovXG4gIFc6IDg3LFxuICAvKipcbiAgICogWFxuICAgKi9cbiAgWDogODgsXG4gIC8qKlxuICAgKiBZXG4gICAqL1xuICBZOiA4OSxcbiAgLyoqXG4gICAqIFpcbiAgICovXG4gIFo6IDkwLFxuICAvKipcbiAgICogTUVUQVxuICAgKi9cbiAgTUVUQTogOTEsXG4gIC8qKlxuICAgKiBXSU5fS0VZX1JJR0hUXG4gICAqL1xuICBXSU5fS0VZX1JJR0hUOiA5MixcbiAgLyoqXG4gICAqIENPTlRFWFRfTUVOVVxuICAgKi9cbiAgQ09OVEVYVF9NRU5VOiA5MyxcbiAgLyoqXG4gICAqIE5VTV9aRVJPXG4gICAqL1xuICBOVU1fWkVSTzogOTYsXG4gIC8qKlxuICAgKiBOVU1fT05FXG4gICAqL1xuICBOVU1fT05FOiA5NyxcbiAgLyoqXG4gICAqIE5VTV9UV09cbiAgICovXG4gIE5VTV9UV086IDk4LFxuICAvKipcbiAgICogTlVNX1RIUkVFXG4gICAqL1xuICBOVU1fVEhSRUU6IDk5LFxuICAvKipcbiAgICogTlVNX0ZPVVJcbiAgICovXG4gIE5VTV9GT1VSOiAxMDAsXG4gIC8qKlxuICAgKiBOVU1fRklWRVxuICAgKi9cbiAgTlVNX0ZJVkU6IDEwMSxcbiAgLyoqXG4gICAqIE5VTV9TSVhcbiAgICovXG4gIE5VTV9TSVg6IDEwMixcbiAgLyoqXG4gICAqIE5VTV9TRVZFTlxuICAgKi9cbiAgTlVNX1NFVkVOOiAxMDMsXG4gIC8qKlxuICAgKiBOVU1fRUlHSFRcbiAgICovXG4gIE5VTV9FSUdIVDogMTA0LFxuICAvKipcbiAgICogTlVNX05JTkVcbiAgICovXG4gIE5VTV9OSU5FOiAxMDUsXG4gIC8qKlxuICAgKiBOVU1fTVVMVElQTFlcbiAgICovXG4gIE5VTV9NVUxUSVBMWTogMTA2LFxuICAvKipcbiAgICogTlVNX1BMVVNcbiAgICovXG4gIE5VTV9QTFVTOiAxMDcsXG4gIC8qKlxuICAgKiBOVU1fTUlOVVNcbiAgICovXG4gIE5VTV9NSU5VUzogMTA5LFxuICAvKipcbiAgICogTlVNX1BFUklPRFxuICAgKi9cbiAgTlVNX1BFUklPRDogMTEwLFxuICAvKipcbiAgICogTlVNX0RJVklTSU9OXG4gICAqL1xuICBOVU1fRElWSVNJT046IDExMSxcbiAgLyoqXG4gICAqIEYxXG4gICAqL1xuICBGMTogMTEyLFxuICAvKipcbiAgICogRjJcbiAgICovXG4gIEYyOiAxMTMsXG4gIC8qKlxuICAgKiBGM1xuICAgKi9cbiAgRjM6IDExNCxcbiAgLyoqXG4gICAqIEY0XG4gICAqL1xuICBGNDogMTE1LFxuICAvKipcbiAgICogRjVcbiAgICovXG4gIEY1OiAxMTYsXG4gIC8qKlxuICAgKiBGNlxuICAgKi9cbiAgRjY6IDExNyxcbiAgLyoqXG4gICAqIEY3XG4gICAqL1xuICBGNzogMTE4LFxuICAvKipcbiAgICogRjhcbiAgICovXG4gIEY4OiAxMTksXG4gIC8qKlxuICAgKiBGOVxuICAgKi9cbiAgRjk6IDEyMCxcbiAgLyoqXG4gICAqIEYxMFxuICAgKi9cbiAgRjEwOiAxMjEsXG4gIC8qKlxuICAgKiBGMTFcbiAgICovXG4gIEYxMTogMTIyLFxuICAvKipcbiAgICogRjEyXG4gICAqL1xuICBGMTI6IDEyMyxcbiAgLyoqXG4gICAqIE5VTUxPQ0tcbiAgICovXG4gIE5VTUxPQ0s6IDE0NCxcbiAgLyoqXG4gICAqIFNFTUlDT0xPTlxuICAgKi9cbiAgU0VNSUNPTE9OOiAxODYsXG4gIC8qKlxuICAgKiBEQVNIXG4gICAqL1xuICBEQVNIOiAxODksXG4gIC8qKlxuICAgKiBFUVVBTFNcbiAgICovXG4gIEVRVUFMUzogMTg3LFxuICAvKipcbiAgICogQ09NTUFcbiAgICovXG4gIENPTU1BOiAxODgsXG4gIC8qKlxuICAgKiBQRVJJT0RcbiAgICovXG4gIFBFUklPRDogMTkwLFxuICAvKipcbiAgICogU0xBU0hcbiAgICovXG4gIFNMQVNIOiAxOTEsXG4gIC8qKlxuICAgKiBBUE9TVFJPUEhFXG4gICAqL1xuICBBUE9TVFJPUEhFOiAxOTIsXG4gIC8qKlxuICAgKiBTSU5HTEVfUVVPVEVcbiAgICovXG4gIFNJTkdMRV9RVU9URTogMjIyLFxuICAvKipcbiAgICogT1BFTl9TUVVBUkVfQlJBQ0tFVFxuICAgKi9cbiAgT1BFTl9TUVVBUkVfQlJBQ0tFVDogMjE5LFxuICAvKipcbiAgICogQkFDS1NMQVNIXG4gICAqL1xuICBCQUNLU0xBU0g6IDIyMCxcbiAgLyoqXG4gICAqIENMT1NFX1NRVUFSRV9CUkFDS0VUXG4gICAqL1xuICBDTE9TRV9TUVVBUkVfQlJBQ0tFVDogMjIxLFxuICAvKipcbiAgICogV0lOX0tFWVxuICAgKi9cbiAgV0lOX0tFWTogMjI0LFxuICAvKipcbiAgICogTUFDX0ZGX01FVEFcbiAgICovXG4gIE1BQ19GRl9NRVRBOiAyMjQsXG4gIC8qKlxuICAgKiBXSU5fSU1FXG4gICAqL1xuICBXSU5fSU1FOiAyMjlcbn07XG5leHBvcnQgY29uc3QgRU5URVJfS0VZID0gJ0VudGVyJztcbmV4cG9ydCBjb25zdCBUQUJfS0VZID0gJ1RhYic7XG5leHBvcnQgY29uc3QgRVNDX0tFWSA9ICdFc2NhcGUnO1xuZXhwb3J0IGRlZmF1bHQga2V5Q29kZTsiLCAiaW1wb3J0IF9ub29wIGZyb20gXCJsb2Rhc2gvbm9vcFwiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQ29uZmlnQ29udGV4dCBmcm9tICcuLi9jb25maWdQcm92aWRlci9jb250ZXh0JztcbmltcG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MsIG51bWJlcnMgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9wb3BvdmVyL2NvbnN0YW50cyc7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuLi90b29sdGlwL2luZGV4JztcbmltcG9ydCBBcnJvdyBmcm9tICcuL0Fycm93JztcbmltcG9ydCAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvcG9wb3Zlci9wb3BvdmVyLmNzcyc7XG5pbXBvcnQgaXNOdWxsT3JVbmRlZmluZWQgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvaXNOdWxsT3JVbmRlZmluZWQnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFByb3BzRnJvbUdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9fdXRpbHNcIjtcbmNvbnN0IHBvc2l0aW9uU2V0ID0gc3RyaW5ncy5QT1NJVElPTl9TRVQ7XG5jb25zdCB0cmlnZ2VyU2V0ID0gc3RyaW5ncy5UUklHR0VSX1NFVDtcbmNsYXNzIFBvcG92ZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgLyoqXG4gICAgICogZm9jdXMgb24gdG9vbHRpcCB0cmlnZ2VyXG4gICAgICovXG4gICAgdGhpcy5mb2N1c1RyaWdnZXIgPSAoKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICAoX2EgPSB0aGlzLnRvb2x0aXBSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzVHJpZ2dlcigpO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJQb3BDYXJkID0gX3JlZiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpbml0aWFsRm9jdXNSZWZcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb250ZW50LFxuICAgICAgICBjb250ZW50Q2xhc3NOYW1lLFxuICAgICAgICBwcmVmaXhDbHNcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge1xuICAgICAgICBkaXJlY3Rpb25cbiAgICAgIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICBjb25zdCBwb3BDYXJkQ2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNvbnRlbnRDbGFzc05hbWUsIHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tcnRsYF06IGRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY29udGVudE5vZGUgPSB0aGlzLnJlbmRlckNvbnRlbnROb2RlKHtcbiAgICAgICAgaW5pdGlhbEZvY3VzUmVmLFxuICAgICAgICBjb250ZW50XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogcG9wQ2FyZENsc1xuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tY29udGVudGBcbiAgICAgIH0sIGNvbnRlbnROb2RlKSk7XG4gICAgfTtcbiAgICB0aGlzLnJlbmRlckNvbnRlbnROb2RlID0gcHJvcHMgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpbml0aWFsRm9jdXNSZWYsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0gPSBwcm9wcztcbiAgICAgIGNvbnN0IGNvbnRlbnRQcm9wcyA9IHtcbiAgICAgICAgaW5pdGlhbEZvY3VzUmVmXG4gICAgICB9O1xuICAgICAgcmV0dXJuICFfaXNGdW5jdGlvbihjb250ZW50KSA/IGNvbnRlbnQgOiBjb250ZW50KGNvbnRlbnRQcm9wcyk7XG4gICAgfTtcbiAgICB0aGlzLnRvb2x0aXBSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF9hID0gdGhpcy5wcm9wcyxcbiAgICAgIHtcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHByZWZpeENscyxcbiAgICAgICAgc2hvd0Fycm93LFxuICAgICAgICBhcnJvd1N0eWxlID0ge30sXG4gICAgICAgIGFycm93Qm91bmRpbmcsXG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgdHJpZ2dlclxuICAgICAgfSA9IF9hLFxuICAgICAgYXR0ciA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIiwgXCJwcmVmaXhDbHNcIiwgXCJzaG93QXJyb3dcIiwgXCJhcnJvd1N0eWxlXCIsIFwiYXJyb3dCb3VuZGluZ1wiLCBcInBvc2l0aW9uXCIsIFwic3R5bGVcIiwgXCJ0cmlnZ2VyXCJdKTtcbiAgICBsZXQge1xuICAgICAgc3BhY2luZ1xuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGFycm93UHJvcHMgPSB7XG4gICAgICBwb3NpdGlvbixcbiAgICAgIGNsYXNzTmFtZTogJycsXG4gICAgICBwb3BTdHlsZTogc3R5bGUsXG4gICAgICBhcnJvd1N0eWxlXG4gICAgfTtcbiAgICBjb25zdCBhcnJvdyA9IHNob3dBcnJvdyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFycm93LCBPYmplY3QuYXNzaWduKHt9LCBhcnJvd1Byb3BzKSkgOiBmYWxzZTtcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoc3BhY2luZykpIHtcbiAgICAgIHNwYWNpbmcgPSBzaG93QXJyb3cgPyBudW1iZXJzLlNQQUNJTkdfV0lUSF9BUlJPVyA6IG51bWJlcnMuU1BBQ0lORztcbiAgICB9XG4gICAgY29uc3Qgcm9sZSA9IHRyaWdnZXIgPT09ICdjbGljaycgfHwgdHJpZ2dlciA9PT0gJ2N1c3RvbScgPyAnZGlhbG9nJyA6ICd0b29sdGlwJztcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBndWFyZEZvY3VzOiB0cnVlLFxuICAgICAgcmVmOiB0aGlzLnRvb2x0aXBSZWZcbiAgICB9LCBhdHRyLCB7XG4gICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgY29udGVudDogdGhpcy5yZW5kZXJQb3BDYXJkLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBzcGFjaW5nOiBzcGFjaW5nLFxuICAgICAgc2hvd0Fycm93OiBhcnJvdyxcbiAgICAgIGFycm93Qm91bmRpbmc6IGFycm93Qm91bmRpbmcsXG4gICAgICByb2xlOiByb2xlXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxufVxuUG9wb3Zlci5jb250ZXh0VHlwZSA9IENvbmZpZ0NvbnRleHQ7XG5Qb3BvdmVyLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBjb250ZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubm9kZSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIGF1dG9BZGp1c3RPdmVyZmxvdzogUHJvcFR5cGVzLmJvb2wsXG4gIG1vdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIHBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2YocG9zaXRpb25TZXQpLFxuICAvLyBnZXRQb3B1cENvbnRhaW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBtb3VzZUVudGVyRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gIG1vdXNlTGVhdmVEZWxheTogUHJvcFR5cGVzLm51bWJlcixcbiAgdHJpZ2dlcjogUHJvcFR5cGVzLm9uZU9mKHRyaWdnZXJTZXQpLmlzUmVxdWlyZWQsXG4gIGNvbnRlbnRDbGFzc05hbWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5hcnJheV0pLFxuICBvblZpc2libGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBvbkNsaWNrT3V0U2lkZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBzcGFjaW5nOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIHpJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgc2hvd0Fycm93OiBQcm9wVHlwZXMuYm9vbCxcbiAgYXJyb3dTdHlsZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBib3JkZXJDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgYm9yZGVyT3BhY2l0eTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pXG4gIH0pLFxuICBhcnJvd1BvaW50QXRDZW50ZXI6IFByb3BUeXBlcy5ib29sLFxuICBhcnJvd0JvdW5kaW5nOiBQcm9wVHlwZXMub2JqZWN0LFxuICBwcmVmaXhDbHM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGd1YXJkRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlQXJyb3dLZXlEb3duOiBQcm9wVHlwZXMuYm9vbFxufTtcblBvcG92ZXIuX19TZW1pQ29tcG9uZW50TmFtZV9fID0gXCJQb3BvdmVyXCI7XG5Qb3BvdmVyLmRlZmF1bHRQcm9wcyA9IGdldERlZmF1bHRQcm9wc0Zyb21HbG9iYWxDb25maWcoUG9wb3Zlci5fX1NlbWlDb21wb25lbnROYW1lX18sIHtcbiAgYXJyb3dCb3VuZGluZzogbnVtYmVycy5BUlJPV19CT1VORElORyxcbiAgc2hvd0Fycm93OiBmYWxzZSxcbiAgYXV0b0FkanVzdE92ZXJmbG93OiB0cnVlLFxuICB6SW5kZXg6IG51bWJlcnMuREVGQVVMVF9aX0lOREVYLFxuICBtb3Rpb246IHRydWUsXG4gIHRyaWdnZXI6ICdob3ZlcicsXG4gIGNhbmNlbFRleHQ6ICdObycsXG4gIG9rVGV4dDogJ1llcycsXG4gIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgcHJlZml4Q2xzOiBjc3NDbGFzc2VzLlBSRUZJWCxcbiAgb25DbGlja091dFNpZGU6IF9ub29wLFxuICBvbkVzY0tleURvd246IF9ub29wLFxuICBjbG9zZU9uRXNjOiB0cnVlLFxuICByZXR1cm5Gb2N1c09uQ2xvc2U6IHRydWUsXG4gIGd1YXJkRm9jdXM6IHRydWUsXG4gIGRpc2FibGVGb2N1c0xpc3RlbmVyOiB0cnVlXG59KTtcbmV4cG9ydCBkZWZhdWx0IFBvcG92ZXI7IiwgImltcG9ydCB7IG51bWJlcnMgYXMgdG9vbHRpcE51bWJlcnMgfSBmcm9tICcuLi90b29sdGlwL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBCQVNFX0NMQVNTX1BSRUZJWCB9IGZyb20gJy4uL2Jhc2UvY29uc3RhbnRzJztcbmNvbnN0IGNzc0NsYXNzZXMgPSB7XG4gIFBSRUZJWDogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXBvcG92ZXJgLFxuICBBUlJPVzogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXBvcG92ZXItaWNvbi1hcnJvd2Bcbn07XG5jb25zdCBzdHJpbmdzID0ge1xuICBQT1NJVElPTl9TRVQ6IFsndG9wJywgJ3RvcExlZnQnLCAndG9wUmlnaHQnLCAnbGVmdCcsICdsZWZ0VG9wJywgJ2xlZnRCb3R0b20nLCAncmlnaHQnLCAncmlnaHRUb3AnLCAncmlnaHRCb3R0b20nLCAnYm90dG9tJywgJ2JvdHRvbUxlZnQnLCAnYm90dG9tUmlnaHQnLCAnbGVmdFRvcE92ZXInLCAncmlnaHRUb3BPdmVyJ10sXG4gIFRSSUdHRVJfU0VUOiBbJ2hvdmVyJywgJ2ZvY3VzJywgJ2NsaWNrJywgJ2N1c3RvbScsICdjb250ZXh0TWVudSddLFxuICBERUZBVUxUX0FSUk9XX1NUWUxFOiB7XG4gICAgYm9yZGVyT3BhY2l0eTogJzEnLFxuICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLXNlbWktY29sb3ItYmctMyknLFxuICAgIC8vIGJvcmRlckNvbG9yOiAndmFyKC0tc2VtaS1jb2xvci1zaGFkb3cpJyxcbiAgICBib3JkZXJDb2xvcjogJ3ZhcigtLXNlbWktY29sb3ItYm9yZGVyKSdcbiAgfVxufTtcbmNvbnN0IG51bWJlcnMgPSB7XG4gIEFSUk9XX0JPVU5ESU5HOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRvb2x0aXBOdW1iZXJzLkFSUk9XX0JPVU5ESU5HKSwge1xuICAgIG9mZnNldFk6IDYsXG4gICAgb2Zmc2V0WDogMCxcbiAgICBoZWlnaHQ6IDhcbiAgfSksXG4gIFNQQUNJTkc6IDQsXG4gIFNQQUNJTkdfV0lUSF9BUlJPVzogMTAsXG4gIERFRkFVTFRfWl9JTkRFWDogMTAzMFxufTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MsIG51bWJlcnMgfTsiLCAiaW1wb3J0IF9nZXQgZnJvbSBcImxvZGFzaC9nZXRcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgbnVtYmVycywgY3NzQ2xhc3NlcyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3BvcG92ZXIvY29uc3RhbnRzJztcbmNvbnN0IEFycm93ID0gZnVuY3Rpb24gKCkge1xuICBsZXQgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICBjb25zdCB7XG4gICAgICBwb3NpdGlvbiA9ICcnLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgYXJyb3dTdHlsZSxcbiAgICAgIHBvcFN0eWxlXG4gICAgfSA9IHByb3BzLFxuICAgIHJlc3QgPSBfX3Jlc3QocHJvcHMsIFtcInBvc2l0aW9uXCIsIFwiY2xhc3NOYW1lXCIsIFwiYXJyb3dTdHlsZVwiLCBcInBvcFN0eWxlXCJdKTtcbiAgY29uc3QgaXNWZXJ0aWNhbCA9IHBvc2l0aW9uLmluZGV4T2YoJ3RvcCcpID09PSAwIHx8IHBvc2l0aW9uLmluZGV4T2YoJ2JvdHRvbScpID09PSAwO1xuICBjb25zdCBjbHMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgY3NzQ2xhc3Nlcy5BUlJPVyk7XG4gIGNvbnN0IGJvcmRlck9wYWNpdHkgPSBfZ2V0KGFycm93U3R5bGUsICdib3JkZXJPcGFjaXR5Jyk7XG4gIGNvbnN0IGJnQ29sb3IgPSBfZ2V0KGFycm93U3R5bGUsICdiYWNrZ3JvdW5kQ29sb3InLCBfZ2V0KHBvcFN0eWxlLCAnYmFja2dyb3VuZENvbG9yJykpO1xuICBjb25zdCBib3JkZXJDb2xvciA9IF9nZXQoYXJyb3dTdHlsZSwgJ2JvcmRlckNvbG9yJywgX2dldChwb3BTdHlsZSwgJ2JvcmRlckNvbG9yJykpO1xuICBjb25zdCB3cmFwUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3QpLCB7XG4gICAgd2lkdGg6IG51bWJlcnMuQVJST1dfQk9VTkRJTkcud2lkdGgsXG4gICAgaGVpZ2h0OiBudW1iZXJzLkFSUk9XX0JPVU5ESU5HLmhlaWdodCxcbiAgICB4bWxuczogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyxcbiAgICBjbGFzc05hbWU6IGNsc1xuICB9KTtcbiAgcmV0dXJuIGlzVmVydGljYWwgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgT2JqZWN0LmFzc2lnbih7fSwgd3JhcFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0wIDAuNUwwIDEuNUM0IDEuNSwgNS41IDMsIDcuNSA1UzEwLDggMTIsOFMxNC41IDcsIDE2LjUgNVMyMCwxLjUgMjQsMS41TDI0IDAuNUwwIDAuNXpcIixcbiAgICBzdHlsZToge1xuICAgICAgZmlsbDogYm9yZGVyQ29sb3IsXG4gICAgICBvcGFjaXR5OiBib3JkZXJPcGFjaXR5XG4gICAgfVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0wIDBMMCAxQzQgMSwgNS41IDIsIDcuNSA0UzEwLDcgMTIsN1MxNC41ICA2LCAxNi41IDRTMjAsMSAyNCwxTDI0IDBMMCAwelwiLFxuICAgIHN0eWxlOiB7XG4gICAgICBmaWxsOiBiZ0NvbG9yXG4gICAgfVxuICB9KSkpIDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIE9iamVjdC5hc3NpZ24oe30sIHdyYXBQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMC41IDBMMS41IDBDMS41IDQsIDMgNS41LCA1IDcuNVM4LDEwIDgsMTJTNyAxNC41LCA1IDE2LjVTMS41LDIwIDEuNSwyNEwwLjUgMjRMMC41IDB6XCIsXG4gICAgc3R5bGU6IHtcbiAgICAgIGZpbGw6IGJvcmRlckNvbG9yLFxuICAgICAgb3BhY2l0eTogYm9yZGVyT3BhY2l0eVxuICAgIH1cbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMCAwTDEgMEMxIDQsIDIgNS41LCA0IDcuNVM3LDEwIDcsMTJTNiAxNC41LCA0IDE2LjVTMSwyMCAxLDI0TDAgMjRMMCAwelwiLFxuICAgIHN0eWxlOiB7XG4gICAgICBmaWxsOiBiZ0NvbG9yXG4gICAgfVxuICB9KSkpO1xufTtcbkFycm93LnByb3BUeXBlcyA9IHtcbiAgcG9zaXRpb246IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgYXJyb3dTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgcG9wU3R5bGU6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5leHBvcnQgZGVmYXVsdCBBcnJvdzsiLCAiaW1wb3J0IF9vbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xuLyoqXG4gKiBUaGUgbG9naWMgb2YgSlMgZm9yIHRleHQgdHJ1bmNhdGlvbiBpcyByZWZlcmVuY2VkIGZyb20gYW50ZCB0eXBvZ3JhcGh5XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvdHlwb2dyYXBoeS91dGlsLnRzeFxuICpcbiAqIEZvciBtb3JlIHRoaW5raW5nIGFuZCBhbmFseXNpcyBhYm91dCB0aGlzIGZ1bmN0aW9uLCBwbGVhc2UgcmVmZXIgdG8gRmVpc2h1IGRvY3VtZW50XG4gKiBodHRwczovL2J5dGVkYW5jZS5mZWlzaHUuY24vZG9jcy9kb2NjbnFvdmpqeW9LbTJVNU8xM2JqMzBhVGhcbiAqL1xubGV0IGVsbGlwc2lzQ29udGFpbmVyO1xuZnVuY3Rpb24gcHhUb051bWJlcih2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXlxcZCooXFwuXFxkKik/Lyk7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFswXSkgOiAwO1xufVxuZnVuY3Rpb24gc3R5bGVUb1N0cmluZyhzdHlsZSkge1xuICAvLyBUaGVyZSBhcmUgc29tZSBkaWZmZXJlbnQgYmVoYXZpb3IgYmV0d2VlbiBGaXJlZm94ICYgQ2hyb21lLlxuICAvLyBXZSBoYXZlIHRvIGhhbmRsZSB0aGlzIG91cnNlbGYuXG4gIGNvbnN0IHN0eWxlTmFtZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoc3R5bGUpO1xuICByZXR1cm4gc3R5bGVOYW1lcy5tYXAobmFtZSA9PiBgJHtuYW1lfTogJHtzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpfTtgKS5qb2luKCcnKTtcbn1cbmNvbnN0IGdldFJlbmRlclRleHQgPSBmdW5jdGlvbiAob3JpZ2luRWxlLCByb3dzKSB7XG4gIGxldCBjb250ZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnJztcbiAgbGV0IGZpeGVkQ29udGVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogdW5kZWZpbmVkO1xuICBsZXQgZWxsaXBzaXNTdHIgPSBhcmd1bWVudHMubGVuZ3RoID4gNCA/IGFyZ3VtZW50c1s0XSA6IHVuZGVmaW5lZDtcbiAgbGV0IHN1ZmZpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ID8gYXJndW1lbnRzWzVdIDogdW5kZWZpbmVkO1xuICBsZXQgZWxsaXBzaXNQb3MgPSBhcmd1bWVudHMubGVuZ3RoID4gNiA/IGFyZ3VtZW50c1s2XSA6IHVuZGVmaW5lZDtcbiAgbGV0IGlzU3Ryb25nID0gYXJndW1lbnRzLmxlbmd0aCA+IDcgPyBhcmd1bWVudHNbN10gOiB1bmRlZmluZWQ7XG4gIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBpZiAoIWVsbGlwc2lzQ29udGFpbmVyKSB7XG4gICAgZWxsaXBzaXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGxpcHNpc0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsbGlwc2lzQ29udGFpbmVyKTtcbiAgfVxuICAvLyBHZXQgb3JpZ2luIHN0eWxlXG4gIGNvbnN0IG9yaWdpblN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUob3JpZ2luRWxlKTtcbiAgY29uc3Qgb3JpZ2luQ1NTID0gc3R5bGVUb1N0cmluZyhvcmlnaW5TdHlsZSk7XG4gIGNvbnN0IGxpbmVIZWlnaHQgPSBweFRvTnVtYmVyKG9yaWdpblN0eWxlLmxpbmVIZWlnaHQpO1xuICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLnJvdW5kKGxpbmVIZWlnaHQgKiAocm93cyArIDEpICsgcHhUb051bWJlcihvcmlnaW5TdHlsZS5wYWRkaW5nVG9wKSArIHB4VG9OdW1iZXIob3JpZ2luU3R5bGUucGFkZGluZ0JvdHRvbSkpO1xuICAvLyBTZXQgc2hhZG93XG4gIGVsbGlwc2lzQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBvcmlnaW5DU1MpO1xuICBlbGxpcHNpc0NvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XG4gIC8vIFx1NUY1MyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSBcdTVGOTdcdTUyMzBcdTc2ODQgd2lkdGggXHU1MDNDXHU0RTNBIGF1dG8gXHU2NUY2XHVGRjBDXHU5MDFBXHU4RkM3IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBcdTVGOTdcdTUyMzBcdTUxQzZcdTc4NkVcdTVCQkRcdTVFQTZcbiAgLy8gV2hlbiB0aGUgd2lkdGggdmFsdWUgb2J0YWluZWQgYnkgd2luZG93LmdldENvbXB1dGVkU3R5bGUgaXMgYXV0bywgZ2V0IHRoZSBleGFjdCB3aWR0aCB0aHJvdWdoIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICBpZiAob3JpZ2luU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSA9PT0gJ2F1dG8nICYmIG9yaWdpbkVsZS5vZmZzZXRXaWR0aCkge1xuICAgIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7b3JpZ2luRWxlLm9mZnNldFdpZHRofXB4YDtcbiAgfVxuICBlbGxpcHNpc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLnRvcCA9ICctOTk5OTk5cHgnO1xuICBlbGxpcHNpc0NvbnRhaW5lci5zdHlsZS56SW5kZXggPSAnLTEwMDAnO1xuICBpc1N0cm9uZyAmJiAoZWxsaXBzaXNDb250YWluZXIuc3R5bGUuZm9udFdlaWdodCA9ICc2MDAnKTtcbiAgLy8gY2xlYW4gdXAgY3NzIG92ZXJmbG93XG4gIGVsbGlwc2lzQ29udGFpbmVyLnN0eWxlLnRleHRPdmVyZmxvdyA9ICdjbGlwJztcbiAgZWxsaXBzaXNDb250YWluZXIuc3R5bGUud2Via2l0TGluZUNsYW1wID0gJ25vbmUnO1xuICAvLyBDbGVhciBjb250YWluZXIgY29udGVudFxuICBlbGxpcHNpc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgLy8gQ2hlY2sgaWYgZWxsaXBzaXMgaW4gbWVhc3VyZSBkaXYgaXMgZW5vdWdoIGZvciBjb250ZW50XG4gIGZ1bmN0aW9uIGluUmFuZ2UoKSB7XG4gICAgLy8gSWYgY29udGVudCBkb2VzIG5vdCB3cmFwIGR1ZSB0byBsaW5lIGJyZWFrIHN0cmF0ZWd5LCB3aWR0aCBzaG91bGQgYmUganVkZ2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGl0J3MgaW4gcmFuZ2VcbiAgICBjb25zdCB3aWR0aEluUmFuZ2UgPSBlbGxpcHNpc0NvbnRhaW5lci5zY3JvbGxXaWR0aCA8PSBlbGxpcHNpc0NvbnRhaW5lci5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHRJblJhbmdlID0gZWxsaXBzaXNDb250YWluZXIuc2Nyb2xsSGVpZ2h0IDwgbWF4SGVpZ2h0O1xuICAgIHJldHVybiByb3dzID09PSAxID8gd2lkdGhJblJhbmdlICYmIGhlaWdodEluUmFuZ2UgOiBoZWlnaHRJblJhbmdlO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRmluZCBtYXRjaCBlbGxpcHNpcyBjb250ZW50ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ3JlYXRlIG9yaWdpbiBjb250ZW50IGhvbGRlclxuICBjb25zdCBlbGxpcHNpc0NvbnRlbnRIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCk7XG4gIGVsbGlwc2lzQ29udGVudEhvbGRlci5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7XG4gIGlmIChzdWZmaXgubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGVsbGlwc2lzVGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdWZmaXgpO1xuICAgIGVsbGlwc2lzQ29udGVudEhvbGRlci5hcHBlbmRDaGlsZChlbGxpcHNpc1RleHROb2RlKTtcbiAgfVxuICBlbGxpcHNpc0NvbnRhaW5lci5hcHBlbmRDaGlsZChlbGxpcHNpc0NvbnRlbnRIb2xkZXIpO1xuICAvLyBFeHBhbmQgbm9kZSBuZWVkcyB0byBiZSBhZGRlZCBvbmx5IHdoZW4gdGV4dCBuZWVkVHJ1bmNhdGVkXG4gIE9iamVjdC52YWx1ZXMoX29taXQoZml4ZWRDb250ZW50LCAnZXhwYW5kJykpLm1hcChub2RlID0+IG5vZGUgJiYgZWxsaXBzaXNDb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZS5jbG9uZU5vZGUodHJ1ZSkpKTtcbiAgZnVuY3Rpb24gYXBwZW5kRXhwYW5kTm9kZSgpIHtcbiAgICBlbGxpcHNpc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBlbGxpcHNpc0NvbnRhaW5lci5hcHBlbmRDaGlsZChlbGxpcHNpc0NvbnRlbnRIb2xkZXIpO1xuICAgIE9iamVjdC52YWx1ZXMoZml4ZWRDb250ZW50KS5tYXAobm9kZSA9PiBub2RlICYmIGVsbGlwc2lzQ29udGFpbmVyLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0Q3VycmVudFRleHQodGV4dCwgcG9zKSB7XG4gICAgY29uc3QgZW5kID0gdGV4dC5sZW5ndGg7XG4gICAgaWYgKCFwb3MpIHtcbiAgICAgIHJldHVybiBlbGxpcHNpc1N0cjtcbiAgICB9XG4gICAgaWYgKGVsbGlwc2lzUG9zID09PSAnZW5kJykge1xuICAgICAgcmV0dXJuIHRleHQuc2xpY2UoMCwgcG9zKSArIGVsbGlwc2lzU3RyO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCBwb3MpICsgZWxsaXBzaXNTdHIgKyB0ZXh0LnNsaWNlKGVuZCAtIHBvcywgZW5kKTtcbiAgfVxuICAvLyBHZXQgbWF4aW11bSB0ZXh0XG4gIGZ1bmN0aW9uIG1lYXN1cmVUZXh0KHRleHROb2RlLCBmdWxsVGV4dCkge1xuICAgIGxldCBzdGFydExvYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMDtcbiAgICBsZXQgZW5kTG9jID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmdWxsVGV4dC5sZW5ndGg7XG4gICAgbGV0IGxhc3RTdWNjZXNzTG9jID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAwO1xuICAgIGNvbnN0IG1pZExvYyA9IE1hdGguZmxvb3IoKHN0YXJ0TG9jICsgZW5kTG9jKSAvIDIpO1xuICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gZ2V0Q3VycmVudFRleHQoZnVsbFRleHQsIG1pZExvYyk7XG4gICAgdGV4dE5vZGUudGV4dENvbnRlbnQgPSBjdXJyZW50VGV4dDtcbiAgICAvLyBjb25zb2xlLmxvZygnY2FsY3VsYXRpbmcuLi4uJywgY3VycmVudFRleHQpO1xuICAgIGlmIChzdGFydExvYyA+PSBlbmRMb2MgLSAxICYmIGVuZExvYyA+IDApIHtcbiAgICAgIC8vIExvb3Agd2hlbiBzdGVwIGlzIHNtYWxsXG4gICAgICBmb3IgKGxldCBzdGVwID0gZW5kTG9jOyBzdGVwID49IHN0YXJ0TG9jOyBzdGVwIC09IDEpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0ZXBUZXh0ID0gZ2V0Q3VycmVudFRleHQoZnVsbFRleHQsIHN0ZXApO1xuICAgICAgICB0ZXh0Tm9kZS50ZXh0Q29udGVudCA9IGN1cnJlbnRTdGVwVGV4dDtcbiAgICAgICAgaWYgKGluUmFuZ2UoKSkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50U3RlcFRleHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuZExvYyA9PT0gMCkge1xuICAgICAgcmV0dXJuIGVsbGlwc2lzU3RyO1xuICAgIH1cbiAgICBpZiAoaW5SYW5nZSgpKSB7XG4gICAgICByZXR1cm4gbWVhc3VyZVRleHQodGV4dE5vZGUsIGZ1bGxUZXh0LCBtaWRMb2MsIGVuZExvYywgbWlkTG9jKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lYXN1cmVUZXh0KHRleHROb2RlLCBmdWxsVGV4dCwgc3RhcnRMb2MsIG1pZExvYywgbGFzdFN1Y2Nlc3NMb2MpO1xuICB9XG4gIGxldCByZXNUZXh0ID0gY29udGVudDtcbiAgLy8gRmlyc3QganVkZ2Ugd2hldGhlciB0aGUgdG90YWwgbGVuZ3RoIG9mIGZ1bGxUZXh0LCBwbHVzIHN1ZmZpeCAocG9zc2libGUpXG4gIC8vIGFuZCBjb3BpZWQgaWNvbiAocG9zc2libGUpIG1lZXRzIGV4cGVjdGF0aW9uc1x1RkYxRiBcbiAgLy8gSWYgaXQgZG9lcyBub3QgbWVldCBleHBlY3RhdGlvbnMsIGFkZCBhbiBleHBhbmQgYnV0dG9uIHRvIGZpbmQgdGhlIGxhcmdlc3QgIGNvbnRlbnQgdGhhdCBtZWV0cyBzaXplIGxpbWl0XG4gIC8vIFx1OTk5Nlx1NTE0OFx1NTIyNFx1NjVBRFx1NjAzQlx1NjU4N1x1NjcyQ1x1OTU3Rlx1NUVBNlx1RkYwQ1x1NTJBMFx1NEUwQVx1NTNFRlx1ODBGRFx1NjcwOVx1NzY4NCBzdWZmaXhcdUZGMENcdTU5MERcdTUyMzZcdTYzMDlcdTk0QUVcdTk1N0ZcdTVFQTZcdUZGMENcdTc3MEJcdTdFRDNcdTY3OUNcdTY2MkZcdTU0MjZcdTdCMjZcdTU0MDhcdTk4ODRcdTY3MUZcbiAgLy8gXHU1OTgyXHU2NzlDXHU0RTBEXHU3QjI2XHU1NDA4XHU5ODg0XHU2NzFGXHVGRjBDXHU1MjE5XHU1MThEXHU1MkEwXHU0RTBBXHU1QzU1XHU1RjAwXHU2MzA5XHU5NEFFXHVGRjBDXHU2MjdFXHU2NzAwXHU1OTI3XHU3QjI2XHU1NDA4XHU1QzNBXHU1QkY4XHU3Njg0XHU1MTg1XHU1QkI5XG4gIGlmICghaW5SYW5nZSgpKSB7XG4gICAgYXBwZW5kRXhwYW5kTm9kZSgpO1xuICAgIHJlc1RleHQgPSBtZWFzdXJlVGV4dCh0ZXh0Tm9kZSwgY29udGVudCwgMCwgZWxsaXBzaXNQb3MgPT09ICdtaWRkbGUnID8gTWF0aC5mbG9vcihjb250ZW50Lmxlbmd0aCAvIDIpIDogY29udGVudC5sZW5ndGgpO1xuICB9XG4gIGVsbGlwc2lzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICByZXR1cm4gcmVzVGV4dDtcbn07XG5leHBvcnQgZGVmYXVsdCBnZXRSZW5kZXJUZXh0OyIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgU2l6ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCgnbm9ybWFsJyk7XG5leHBvcnQgZGVmYXVsdCBTaXplQ29udGV4dDsiLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZpbmRET01Ob2RlIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuLi9fYmFzZS9iYXNlQ29tcG9uZW50JztcbmV4cG9ydCB2YXIgT2JzZXJ2ZXJQcm9wZXJ0eTtcbihmdW5jdGlvbiAoT2JzZXJ2ZXJQcm9wZXJ0eSkge1xuICBPYnNlcnZlclByb3BlcnR5W1wiV2lkdGhcIl0gPSBcIndpZHRoXCI7XG4gIE9ic2VydmVyUHJvcGVydHlbXCJIZWlnaHRcIl0gPSBcImhlaWdodFwiO1xuICBPYnNlcnZlclByb3BlcnR5W1wiQWxsXCJdID0gXCJhbGxcIjtcbn0pKE9ic2VydmVyUHJvcGVydHkgfHwgKE9ic2VydmVyUHJvcGVydHkgPSB7fSkpO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhY3RSZXNpemVPYnNlcnZlciBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHZhciBfdGhpcztcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuZm9ybWVyUHJvcGVydHlWYWx1ZSA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmdldEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyB1c2luZyBmaW5kRE9NTm9kZSBmb3IgdHdvIHJlYXNvbnM6XG4gICAgICAgIC8vIDEuIGNsb25pbmcgdG8gaW5zZXJ0IGEgcmVmIGlzIHVud2llbGR5IGFuZCBub3QgcGVyZm9ybWFudC5cbiAgICAgICAgLy8gMi4gZW5zdXJlIHRoYXQgd2UgcmVzb2x2ZSB0byBhbiBhY3R1YWwgRE9NIG5vZGUgKGluc3RlYWQgb2YgYW55IEpTWCByZWYgaW5zdGFuY2UpLlxuICAgICAgICByZXR1cm4gZmluZERPTU5vZGUodGhpcy5jaGlsZE5vZGUgfHwgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBzd2FsbG93IGVycm9yIGlmIGZpbmRET01Ob2RlIGlzIHJ1biBvbiB1bm1vdW50ZWQgY29tcG9uZW50LlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlUmVzaXplRXZlbnRUcmlnZ2VyZWQgPSBlbnRyaWVzID0+IHtcbiAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgIGlmICh0aGlzLnByb3BzLm9ic2VydmVyUHJvcGVydHkgPT09IE9ic2VydmVyUHJvcGVydHkuQWxsKSB7XG4gICAgICAgIChfYiA9IChfYSA9IHRoaXMucHJvcHMpLm9uUmVzaXplKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZW50cmllcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmaW5hbEVudHJpZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZm9ybWVyUHJvcGVydHlWYWx1ZS5oYXMoZW50cnkudGFyZ2V0KSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LmNvbnRlbnRSZWN0W3RoaXMucHJvcHMub2JzZXJ2ZXJQcm9wZXJ0eV0gIT09IHRoaXMuZm9ybWVyUHJvcGVydHlWYWx1ZS5nZXQoZW50cnkudGFyZ2V0KSkge1xuICAgICAgICAgICAgICB0aGlzLmZvcm1lclByb3BlcnR5VmFsdWUuc2V0KGVudHJ5LnRhcmdldCwgZW50cnkuY29udGVudFJlY3RbdGhpcy5wcm9wcy5vYnNlcnZlclByb3BlcnR5XSk7XG4gICAgICAgICAgICAgIGZpbmFsRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb3JtZXJQcm9wZXJ0eVZhbHVlLnNldChlbnRyeS50YXJnZXQsIGVudHJ5LmNvbnRlbnRSZWN0W3RoaXMucHJvcHMub2JzZXJ2ZXJQcm9wZXJ0eV0pO1xuICAgICAgICAgICAgZmluYWxFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmluYWxFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAoX2QgPSAoX2MgPSB0aGlzLnByb3BzKS5vblJlc2l6ZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNhbGwoX2MsIGZpbmFsRW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub2JzZXJ2ZUVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgZm9yY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgICAgY29uc3QgZWxlbWVudCA9IF90aGlzLmdldEVsZW1lbnQoKTtcbiAgICAgIGlmICghX3RoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgX3RoaXMub2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoX3RoaXMuaGFuZGxlUmVzaXplRXZlbnRUcmlnZ2VyZWQpO1xuICAgICAgfVxuICAgICAgaWYgKCEoZWxlbWVudCAmJiBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHtcbiAgICAgICAgLy8gc3RvcCBldmVyeXRoaW5nIGlmIG5vdCBkZWZpbmVkXG4gICAgICAgIF90aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnQgPT09IF90aGlzLmVsZW1lbnQgJiYgIWZvcmNlKSB7XG4gICAgICAgIC8vIGFib3J0IGlmIGdpdmVuIHNhbWUgZWxlbWVudCAtLSBub3RoaW5nIHRvIHVwZGF0ZSAodW5sZXNzIGZvcmNlZClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2xlYXIgb2JzZXJ2ZXIgbGlzdCBpZiBuZXcgZWxlbWVudFxuICAgICAgICBfdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIC8vIHJlbWVtYmVyIGVsZW1lbnQgcmVmZXJlbmNlIGZvciBuZXh0IHRpbWVcbiAgICAgICAgX3RoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgICAvLyBvYnNlcnZlciBjYWxsYmFjayBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IHdoZW4gb2JzZXJ2aW5nIG5ldyBlbGVtZW50c1xuICAgICAgX3RoaXMub2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50KTtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vYnNlcnZlUGFyZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSAmJiBlbGVtZW50LnBhcmVudE5vZGUub3duZXJEb2N1bWVudCAmJiBlbGVtZW50LnBhcmVudE5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBlbGVtZW50LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBlbGVtZW50LnBhcmVudE5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5IVE1MRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5fcGFyZW50Tm9kZSA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgX3RoaXMub2JzZXJ2ZXIub2JzZXJ2ZShfdGhpcy5fcGFyZW50Tm9kZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm1lcmdlUmVmID0gKHJlZiwgbm9kZSkgPT4ge1xuICAgICAgdGhpcy5jaGlsZE5vZGUgPSBub2RlO1xuICAgICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVmKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJiByZWYgJiYgJ2N1cnJlbnQnIGluIHJlZikge1xuICAgICAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoZ2xvYmFsVGhpc1snUmVzaXplT2JzZXJ2ZXInXSkge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcih0aGlzLmhhbmRsZVJlc2l6ZUV2ZW50VHJpZ2dlcmVkKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF9hO1xuICAgIChfYSA9IHRoaXMub2JzZXJ2ZUVsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHRoaXMpO1xuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB2YXIgX2E7XG4gICAgKF9hID0gdGhpcy5vYnNlcnZlRWxlbWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcywgdGhpcy5wcm9wcy5vYnNlcnZlUGFyZW50ICE9PSBwcmV2UHJvcHMub2JzZXJ2ZVBhcmVudCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG51bGw7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hpbGQgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlZlxuICAgIH0gPSBjaGlsZDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgcmVmOiBub2RlID0+IHRoaXMubWVyZ2VSZWYocmVmLCBub2RlKVxuICAgIH0pO1xuICB9XG59XG5SZWFjdFJlc2l6ZU9ic2VydmVyLnByb3BUeXBlcyA9IHtcbiAgb25SZXNpemU6IFByb3BUeXBlcy5mdW5jLFxuICBvYnNlcnZlUGFyZW50OiBQcm9wVHlwZXMuYm9vbCxcbiAgb2JzZXJ2ZXJQcm9wZXJ0eTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZGVsYXlUaWNrOiBQcm9wVHlwZXMubnVtYmVyXG59O1xuUmVhY3RSZXNpemVPYnNlcnZlci5kZWZhdWx0UHJvcHMgPSB7XG4gIG9uUmVzaXplOiAoKSA9PiB7fSxcbiAgb2JzZXJ2ZVBhcmVudDogZmFsc2UsXG4gIG9ic2VydmVyUHJvcGVydHk6IFwiYWxsXCIsXG4gIGRlbGF5VGljazogMFxufTsiLCAidmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IHN0cmluZ3MgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy90eXBvZ3JhcGh5L2NvbnN0YW50cyc7XG5pbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGl0bGUgZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF9hID0gdGhpcy5wcm9wcyxcbiAgICAgIHtcbiAgICAgICAgaGVhZGluZ1xuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wiaGVhZGluZ1wiXSk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gc3RyaW5ncy5IRUFESU5HLmluZGV4T2YoaGVhZGluZykgIT09IC0xID8gYGgke2hlYWRpbmd9YCA6ICdoMSc7XG4gICAgLy8gUGFzc2luZyBoZWFkaW5ncyB0byBzdXBwb3J0IGN1c3RvbSBjb21wb25lbnRzXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhc2UsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICBoZWFkaW5nOiBjb21wb25lbnRcbiAgICB9LCByZXN0KSk7XG4gIH1cbn1cblRpdGxlLnByb3BUeXBlcyA9IHtcbiAgY29weWFibGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5ib29sXSksXG4gIGRlbGV0ZTogUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgLy8gZWRpdGFibGU6IFByb3BUeXBlcy5ib29sLFxuICBlbGxpcHNpczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgbWFyazogUHJvcFR5cGVzLmJvb2wsXG4gIGxpbms6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5ib29sXSksXG4gIHVuZGVybGluZTogUHJvcFR5cGVzLmJvb2wsXG4gIHN0cm9uZzogUHJvcFR5cGVzLmJvb2wsXG4gIHR5cGU6IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLlRZUEUpLFxuICBoZWFkaW5nOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5IRUFESU5HKSxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuICB3ZWlnaHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vbmVPZihzdHJpbmdzLldFSUdIVCksIFByb3BUeXBlcy5udW1iZXJdKVxufTtcblRpdGxlLmRlZmF1bHRQcm9wcyA9IHtcbiAgY29weWFibGU6IGZhbHNlLFxuICBkZWxldGU6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIC8vIGVkaXRhYmxlOiBmYWxzZSxcbiAgZWxsaXBzaXM6IGZhbHNlLFxuICBtYXJrOiBmYWxzZSxcbiAgdW5kZXJsaW5lOiBmYWxzZSxcbiAgc3Ryb25nOiBmYWxzZSxcbiAgbGluazogZmFsc2UsXG4gIHR5cGU6ICdwcmltYXJ5JyxcbiAgaGVhZGluZzogMSxcbiAgc3R5bGU6IHt9LFxuICBjbGFzc05hbWU6ICcnXG59OyIsICJpbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgc3RyaW5ncywgY3NzQ2xhc3NlcyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3R5cG9ncmFwaHkvY29uc3RhbnRzJztcbmltcG9ydCBCYXNlIGZyb20gJy4vYmFzZSc7XG5jb25zdCBwcmVmaXhDbHMgPSBjc3NDbGFzc2VzLlBSRUZJWDtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcmFncmFwaCBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2xhc3NOYW1lXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgcGFyYWdyYXBoQ2xzID0gY2xzKGNsYXNzTmFtZSwgYCR7cHJlZml4Q2xzfS1wYXJhZ3JhcGhgKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZSwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjb21wb25lbnQ6ICdwJ1xuICAgIH0sIHRoaXMucHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogcGFyYWdyYXBoQ2xzXG4gICAgfSkpO1xuICB9XG59XG5QYXJhZ3JhcGgucHJvcFR5cGVzID0ge1xuICBjb3B5YWJsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgZGVsZXRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAvLyBlZGl0YWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIGVsbGlwc2lzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuYm9vbF0pLFxuICBtYXJrOiBQcm9wVHlwZXMuYm9vbCxcbiAgbGluazogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgdW5kZXJsaW5lOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3Ryb25nOiBQcm9wVHlwZXMuYm9vbCxcbiAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuVFlQRSksXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLlNJWkUpLFxuICBzcGFjaW5nOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5TUEFDSU5HKSxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuUGFyYWdyYXBoLmRlZmF1bHRQcm9wcyA9IHtcbiAgY29weWFibGU6IGZhbHNlLFxuICBkZWxldGU6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIC8vIGVkaXRhYmxlOiBmYWxzZSxcbiAgZWxsaXBzaXM6IGZhbHNlLFxuICBtYXJrOiBmYWxzZSxcbiAgdW5kZXJsaW5lOiBmYWxzZSxcbiAgc3Ryb25nOiBmYWxzZSxcbiAgbGluazogZmFsc2UsXG4gIHR5cGU6ICdwcmltYXJ5JyxcbiAgc2l6ZTogJ25vcm1hbCcsXG4gIHNwYWNpbmc6ICdub3JtYWwnLFxuICBzdHlsZToge30sXG4gIGNsYXNzTmFtZTogJydcbn07IiwgImltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IHN0cmluZ3MgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy90eXBvZ3JhcGh5L2NvbnN0YW50cyc7XG5pbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IEZvcm1hdE51bWVyYWwgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdHlwb2dyYXBoeS9mb3JtYXROdW1lcmFsJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE51bWVyYWwgZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcbiAgLy8gVHJhdmVyc2UgdGhlIGVudGlyZSB2aXJ0dWFsIERPTSB1c2luZyBhIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCBhbGdvcml0aG0sIHRoZW4gZm9ybWF0IGVhY2ggcGllY2UuIChpbiByZWFjdClcbiAgZm9ybWF0Tm9kZURGUyhub2RlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICBub2RlID0gW25vZGVdO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIHRoZSBwcm9wZXJ0eSBpcyByZWFkLW9ubHksIGFuIG9iamVjdCBpcyByZXR1cm5lZCBmb3Igb3ZlcndyaXRpbmcgcmF0aGVyIHRoYW4gZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvYmplY3QncyBjb250ZW50cy5cbiAgICBub2RlID0gbm9kZS5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBGb3JtYXR0aW5nIHRoZSBkaWdpdGFsIGNvbnRlbnQgb2Ygbm9kZXMuXG4gICAgICAgIHJldHVybiBuZXcgRm9ybWF0TnVtZXJhbChTdHJpbmcoaXRlbSksIHRoaXMucHJvcHMucnVsZSwgdGhpcy5wcm9wcy5wcmVjaXNpb24sIHRoaXMucHJvcHMudHJ1bmNhdGUsIHRoaXMucHJvcHMucGFyc2VyKS5mb3JtYXQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXROb2RlREZTKGl0ZW0oKSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICdjaGlsZHJlbicgaW4gaXRlbVsncHJvcHMnXSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpdGVtKSwge1xuICAgICAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGl0ZW1bJ3Byb3BzJ10pLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogdGhpcy5mb3JtYXROb2RlREZTKGl0ZW1bJ3Byb3BzJ11bJ2NoaWxkcmVuJ10pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgICByZXR1cm4gbm9kZS5sZW5ndGggPT09IDEgPyBub2RlWzBdIDogbm9kZTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgLy8gRGVlcCBjb3B5IGFuZCByZW1vdmUgcHJvcHMgdGhhdCBhcmUgbm90IG5lZWRlZCBieSB0aGUgQmFzZSBjb21wb25lbnQuXG4gICAgY29uc3QgYmFzZVByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcyk7XG4gICAgZGVsZXRlIGJhc2VQcm9wcy5ydWxlO1xuICAgIGRlbGV0ZSBiYXNlUHJvcHMucGFyc2VyO1xuICAgIC8vIEVhY2ggcGllY2Ugb2YgY29udGVudCBpbiB0aGUgdmlydHVhbCBET00gaXMgZm9ybWF0dGVkIGJ5IHRoZSBgZm9ybWF0TnVtZXJhbGAgZnVuY3Rpb24uXG4gICAgYmFzZVByb3BzLmNoaWxkcmVuID0gdGhpcy5mb3JtYXROb2RlREZTKHRoaXMucHJvcHMuY2hpbGRyZW4pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGNvbXBvbmVudDogJ3NwYW4nXG4gICAgfSwgYmFzZVByb3BzKSk7XG4gIH1cbn1cbk51bWVyYWwucHJvcFR5cGVzID0ge1xuICBydWxlOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5SVUxFKSxcbiAgcHJlY2lzaW9uOiBQcm9wVHlwZXMubnVtYmVyLFxuICB0cnVuY2F0ZTogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuVFJVTkNBVEUpLFxuICBwYXJzZXI6IFByb3BUeXBlcy5mdW5jLFxuICBjb3B5YWJsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgZGVsZXRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICBpY29uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubm9kZSwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICBtYXJrOiBQcm9wVHlwZXMuYm9vbCxcbiAgdW5kZXJsaW5lOiBQcm9wVHlwZXMuYm9vbCxcbiAgbGluazogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgc3Ryb25nOiBQcm9wVHlwZXMuYm9vbCxcbiAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuVFlQRSksXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLlNJWkUpLFxuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjb2RlOiBQcm9wVHlwZXMuYm9vbCxcbiAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuTnVtZXJhbC5kZWZhdWx0UHJvcHMgPSB7XG4gIHJ1bGU6ICd0ZXh0JyxcbiAgcHJlY2lzaW9uOiAwLFxuICB0cnVuY2F0ZTogJ3JvdW5kJyxcbiAgcGFyc2VyOiB1bmRlZmluZWQsXG4gIGNvcHlhYmxlOiBmYWxzZSxcbiAgZGVsZXRlOiBmYWxzZSxcbiAgaWNvbjogJycsXG4gIG1hcms6IGZhbHNlLFxuICB1bmRlcmxpbmU6IGZhbHNlLFxuICBzdHJvbmc6IGZhbHNlLFxuICBsaW5rOiBmYWxzZSxcbiAgdHlwZTogJ3ByaW1hcnknLFxuICBzdHlsZToge30sXG4gIHNpemU6ICdub3JtYWwnLFxuICBjbGFzc05hbWU6ICcnXG59OyIsICJleHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXROdW1lcmFsIHtcbiAgY29uc3RydWN0b3IoY29udGVudCwgcnVsZSwgcHJlY2lzaW9uLCB0cnVuY2F0ZSwgcGFyc2VyKSB7XG4gICAgLy8gQSBjb2xsZWN0aW9uIG9mIG1ldGhvZHMgZm9yIGZvcm1hdHRpbmcgbnVtYmVyczsgIE1ldGhvZHMga2V5OiBSdWxlIChzdHJpbmdzLlJVTEUpOyAgTm90IGluY2x1ZGVkOiAndGV4dCcgJiAnbnVtYmVycydcbiAgICB0aGlzLnJ1bGVNZXRob2RzID0ge1xuICAgICAgJ2J5dGVzLWRlY2ltYWwnOiB2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKHZhbHVlID49IDEwMDApIHtcbiAgICAgICAgICB2YWx1ZSAvPSAxMDAwO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7dGhpcy50cnVuY2F0ZVByZWNpc2lvbih2YWx1ZSl9ICR7dW5pdHNbaV19YDtcbiAgICAgIH0sXG4gICAgICAnYnl0ZXMtYmluYXJ5JzogdmFsdWUgPT4ge1xuICAgICAgICBjb25zdCB1bml0cyA9IFsnQicsICdLaUInLCAnTWlCJywgJ0dpQicsICdUaUInLCAnUGlCJywgJ0VpQicsICdaaUInLCAnWWlCJ107XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKHZhbHVlID49IDEwMjQpIHtcbiAgICAgICAgICB2YWx1ZSAvPSAxMDI0O1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7dGhpcy50cnVuY2F0ZVByZWNpc2lvbih2YWx1ZSl9ICR7dW5pdHNbaV19YDtcbiAgICAgIH0sXG4gICAgICBwZXJjZW50YWdlczogdmFsdWUgPT4ge1xuICAgICAgICAvLyBUaGUgcnVsZXMgaGVyZSBoYXZlIGJlZW4gbW9kaWZpZWQgaW4gdmVyc2lvbiB2Mi4zMC4wXG4gICAgICAgIHJldHVybiBgJHt0aGlzLnRydW5jYXRlUHJlY2lzaW9uKHZhbHVlICogMTAwKX0lYDtcbiAgICAgIH0sXG4gICAgICBleHBvbmVudGlhbDogdmFsdWUgPT4ge1xuICAgICAgICBjb25zdCB2RXhwb25lbnRpYWwgPSB2YWx1ZS50b0V4cG9uZW50aWFsKHRoaXMucHJlY2lzaW9uICsgMik7XG4gICAgICAgIGNvbnN0IHZBcnIgPSB2RXhwb25lbnRpYWwuc3BsaXQoJ2UnKTtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMudHJ1bmNhdGVQcmVjaXNpb24oTnVtYmVyKHZBcnJbMF0pKX1lJHt2QXJyWzFdfWA7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBBIGNvbGxlY3Rpb24gb2YgbWV0aG9kcyBmb3IgdHJ1bmNhdGluZyBudW1iZXJzOyBNZXRob2RzIGtleTogVHJ1bmNhdGUgKHN0cmluZ3MuVHJ1bmNhdGUpO1xuICAgIHRoaXMudHJ1bmNhdGVNZXRob2RzID0ge1xuICAgICAgY2VpbDogTWF0aC5jZWlsLFxuICAgICAgZmxvb3I6IE1hdGguZmxvb3IsXG4gICAgICByb3VuZDogTWF0aC5yb3VuZFxuICAgIH07XG4gICAgdGhpcy5pc0RpeVBhcnNlciA9IHR5cGVvZiBwYXJzZXIgIT09ICd1bmRlZmluZWQnO1xuICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgdGhpcy5ydWxlID0gcnVsZTtcbiAgICB0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvbjtcbiAgICB0aGlzLnRydW5jYXRlID0gdHJ1bmNhdGU7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gIH1cbiAgLy8gRm9ybWF0dGluZyBudW1iZXJzIHdpdGhpbiBhIHN0cmluZy5cbiAgZm9ybWF0KCkge1xuICAgIC8vIEV4ZWN1dGVkIHdoZW4gYSBjdXN0b20gbWV0aG9kIGV4aXN0c1xuICAgIGlmICh0aGlzLmlzRGl5UGFyc2VyKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZXIodGhpcy5jb250ZW50KTtcbiAgICB9XG4gICAgLy8gIFdoZW4gdGhlIGBydWxlYCBpcyBgdGV4dGAsIG9ubHkgdGhlIGB0cnVuY2F0ZVByZWNpc2lvbmAgbWV0aG9kIGlzIGV4ZWN1dGVkIGZvciBudW1lcmljIHByb2Nlc3NpbmcuXG4gICAgaWYgKHRoaXMucnVsZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gZXh0cmFjdE51bWJlcnModGhpcy5jb250ZW50KS5tYXAoaXRlbSA9PiBjaGVja0lzTnVtZXJhbChpdGVtKSA/IHRoaXMudHJ1bmNhdGVQcmVjaXNpb24oaXRlbSkgOiBpdGVtKS5qb2luKCcnKTtcbiAgICB9XG4gICAgLy8gU2VwYXJhdGUgZXh0cmFjdGlvbiBvZiBudW1iZXJzIHdoZW4gYHJ1bGVgIGlzIGBudW1iZXJzYC5cbiAgICBpZiAodGhpcy5ydWxlID09PSAnbnVtYmVycycpIHtcbiAgICAgIHJldHVybiBleHRyYWN0TnVtYmVycyh0aGlzLmNvbnRlbnQpLmZpbHRlcihpdGVtID0+IGNoZWNrSXNOdW1lcmFsKGl0ZW0pKS5tYXAoaXRlbSA9PiB0aGlzLnRydW5jYXRlUHJlY2lzaW9uKGl0ZW0pKS5qb2luKCcsJyk7XG4gICAgfVxuICAgIC8vIFJ1biBmb3JtYXR0aW5nIG1ldGhvZHMgdGhhdCBleGlzdC5cbiAgICByZXR1cm4gZXh0cmFjdE51bWJlcnModGhpcy5jb250ZW50KS5tYXAoaXRlbSA9PiBjaGVja0lzTnVtZXJhbChpdGVtKSA/IHRoaXMucnVsZU1ldGhvZHNbdGhpcy5ydWxlXShOdW1iZXIoaXRlbSkpIDogaXRlbSkuam9pbignJyk7XG4gIH1cbiAgdHJ1bmNhdGVQcmVjaXNpb24oY29udGVudCkge1xuICAgIC8vIFRydW5jYXRpb24gYW5kIHNlbGVjdGlvbiBvZiByb3VuZGluZyBtZXRob2RzIGZvciBwcm9jZXNzaW5nLiBmdW5jdGlvbiBmcm9tOiB0cnVuY2F0ZU1ldGhvZHNcbiAgICBjb25zdCBjVHJ1bmNhdGVkID0gdGhpcy50cnVuY2F0ZU1ldGhvZHNbdGhpcy50cnVuY2F0ZV0oTnVtYmVyKGNvbnRlbnQpICogTWF0aC5wb3coMTAsIHRoaXMucHJlY2lzaW9uKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5wcmVjaXNpb24pO1xuICAgIGNvbnN0IGNBcnIgPSBjVHJ1bmNhdGVkLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgICAvLyBpcyBhbiBpbnRlZ2VyIHRoZW4gdGhlIGVuZCBudW1iZXIgaXMgbm9ybWFsaXNlZFxuICAgIGlmIChjQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNUcnVuY2F0ZWQudG9GaXhlZCh0aGlzLnByZWNpc2lvbik7XG4gICAgfVxuICAgIGNvbnN0IGNUTGVuZ3RoID0gY0FyclsxXS5sZW5ndGg7XG4gICAgLy8gRmlsbCBpbiBhbnkgbWlzc2luZyBgMGAgYXQgdGhlIGVuZC5cbiAgICBpZiAoY1RMZW5ndGggPCB0aGlzLnByZWNpc2lvbikge1xuICAgICAgcmV0dXJuIGAke2NBcnJbMF19LiR7Y0FyclsxXX0keycwJy5yZXBlYXQodGhpcy5wcmVjaXNpb24gLSBjVExlbmd0aCl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNUcnVuY2F0ZWQudG9TdHJpbmcoKTtcbiAgfVxufVxuLy8gU2VwYXJhdGUgbnVtYmVycyBmcm9tIHN0cmluZ3MsIHRoZSBgLWAgc3ltYm9sIGlzIGEgbnVtZXJpYyBwcmVmaXggbm90IGFsbG93ZWQgb24gaXRzIG93bi5cbmZ1bmN0aW9uIGV4dHJhY3ROdW1iZXJzKGNvbnRlbnQpIHtcbiAgY29uc3QgcmVnID0gLygtP1swLTldKlxcLj9bMC05XSsoW2VFXS0/WzAtOV0rKT8pfChbXi1cXGRcXC5dKykvZztcbiAgcmV0dXJuIGNvbnRlbnQubWF0Y2gocmVnKSB8fCBbXTtcbn1cbmZ1bmN0aW9uIGNoZWNrSXNOdW1lcmFsKHN0cikge1xuICByZXR1cm4gIShpc05hTihOdW1iZXIoc3RyKSkgfHwgc3RyLnJlcGxhY2UoL1xccysvZywgJycpID09PSAnJyk7XG59IiwgImltcG9ydCBCYXNlVHlwb2dyYXBoeSBmcm9tICcuL3R5cG9ncmFwaHknO1xuaW1wb3J0IFRleHQgZnJvbSAnLi90ZXh0JztcbmltcG9ydCBUaXRsZSBmcm9tICcuL3RpdGxlJztcbmltcG9ydCBQYXJhZ3JhcGggZnJvbSAnLi9wYXJhZ3JhcGgnO1xuaW1wb3J0IE51bWVyYWwgZnJvbSAnLi9udW1lcmFsJztcbmNvbnN0IFR5cG9ncmFwaHkgPSBCYXNlVHlwb2dyYXBoeTtcblR5cG9ncmFwaHkuVGV4dCA9IFRleHQ7XG5UeXBvZ3JhcGh5LlRpdGxlID0gVGl0bGU7XG5UeXBvZ3JhcGh5LlBhcmFncmFwaCA9IFBhcmFncmFwaDtcblR5cG9ncmFwaHkuTnVtZXJhbCA9IE51bWVyYWw7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZSc7XG5leHBvcnQgZGVmYXVsdCBUeXBvZ3JhcGh5OyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vX2Jhc2UvYmFzZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzIGFzIGNzcywgc3RyaW5ncyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3NwaW4vY29uc3RhbnRzJztcbmltcG9ydCBTcGluRm91bmRhdGlvbiBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9zcGluL2ZvdW5kYXRpb24nO1xuaW1wb3J0IFNwaW5JY29uIGZyb20gJy4vaWNvbic7XG5pbXBvcnQgJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3NwaW4vc3Bpbi5jc3MnO1xuY29uc3QgcHJlZml4Q2xzID0gY3NzLlBSRUZJWDtcbmNsYXNzIFNwaW4gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5mb3VuZGF0aW9uID0gbmV3IFNwaW5Gb3VuZGF0aW9uKHRoaXMuYWRhcHRlcik7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRlbGF5OiBwcm9wcy5kZWxheSxcbiAgICAgIGxvYWRpbmc6IHRydWVcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLmRlbGF5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2FkaW5nOiBwcm9wcy5zcGlubmluZ1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnNwaW5uaW5nID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVsYXk6IDAsXG4gICAgICAgIGxvYWRpbmc6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXk6IHByb3BzLmRlbGF5XG4gICAgfTtcbiAgfVxuICBnZXQgYWRhcHRlcigpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdXBlci5hZGFwdGVyKSwge1xuICAgICAgc2V0TG9hZGluZzogdmFsdWUgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBsb2FkaW5nOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmZvdW5kYXRpb24uZGVzdHJveSgpO1xuICB9XG4gIHJlbmRlclNwaW4oKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW5kaWNhdG9yLFxuICAgICAgdGlwXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge1xuICAgICAgbG9hZGluZ1xuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIHJldHVybiBsb2FkaW5nID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LXdyYXBwZXJgXG4gICAgfSwgaW5kaWNhdG9yID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1hbmltYXRlYCxcbiAgICAgIFwieC1zZW1pLXByb3BcIjogXCJpbmRpY2F0b3JcIlxuICAgIH0sIGluZGljYXRvcikpIDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNwaW5JY29uLCBudWxsKSksIHRpcCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIFwieC1zZW1pLXByb3BcIjogXCJ0aXBcIlxuICAgIH0sIHRpcCkgOiBudWxsKSA6IG51bGw7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZm91bmRhdGlvbi51cGRhdGVMb2FkaW5nSWZOZWVkRGVsYXkoKTtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgd3JhcHBlckNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRTdHlsZSxcbiAgICAgICAgc2l6ZVxuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIiwgXCJzdHlsZVwiLCBcIndyYXBwZXJDbGFzc05hbWVcIiwgXCJjaGlsZFN0eWxlXCIsIFwic2l6ZVwiXSk7XG4gICAgY29uc3Qge1xuICAgICAgbG9hZGluZ1xuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHNwaW5DbHMgPSBjbHMocHJlZml4Q2xzLCB3cmFwcGVyQ2xhc3NOYW1lLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS0ke3NpemV9YF06IHNpemUsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1ibG9ja2BdOiBjaGlsZHJlbixcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWhpZGRlbmBdOiAhbG9hZGluZ1xuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGNsYXNzTmFtZTogc3BpbkNscyxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIHRoaXMuZ2V0RGF0YUF0dHIocmVzdCkpLCB0aGlzLnJlbmRlclNwaW4oKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWNoaWxkcmVuYCxcbiAgICAgIHN0eWxlOiBjaGlsZFN0eWxlLFxuICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImNoaWxkcmVuXCJcbiAgICB9LCBjaGlsZHJlbikpO1xuICB9XG59XG5TcGluLnByb3BUeXBlcyA9IHtcbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuU0laRSksXG4gIHNwaW5uaW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBpbmRpY2F0b3I6IFByb3BUeXBlcy5ub2RlLFxuICBkZWxheTogUHJvcFR5cGVzLm51bWJlcixcbiAgdGlwOiBQcm9wVHlwZXMubm9kZSxcbiAgd3JhcHBlckNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2hpbGRTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5TcGluLmRlZmF1bHRQcm9wcyA9IHtcbiAgc2l6ZTogJ21pZGRsZScsXG4gIHNwaW5uaW5nOiB0cnVlLFxuICBjaGlsZHJlbjogbnVsbCxcbiAgaW5kaWNhdG9yOiBudWxsLFxuICBkZWxheTogMFxufTtcbmV4cG9ydCBkZWZhdWx0IFNwaW47IiwgImltcG9ydCB7IEJBU0VfQ0xBU1NfUFJFRklYIH0gZnJvbSAnLi4vYmFzZS9jb25zdGFudHMnO1xuY29uc3QgUFJFRklYID0gYCR7QkFTRV9DTEFTU19QUkVGSVh9LXNwaW5gO1xuY29uc3QgY3NzQ2xhc3NlcyA9IHtcbiAgUFJFRklYXG59O1xuY29uc3Qgc3RyaW5ncyA9IHtcbiAgU0laRTogWydzbWFsbCcsICdtaWRkbGUnLCAnbGFyZ2UnXVxufTtcbmNvbnN0IG51bWJlcnMgPSB7fTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MsIG51bWJlcnMgfTsiLCAiaW1wb3J0IEJhc2VGb3VuZGF0aW9uIGZyb20gJy4uL2Jhc2UvZm91bmRhdGlvbic7XG5jbGFzcyBTcGluRm91bmRhdGlvbiBleHRlbmRzIEJhc2VGb3VuZGF0aW9uIHtcbiAgc3RhdGljIGdldCBzcGluRGVmYXVsdEFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFByb3A6ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgIHNldExvYWRpbmc6IHZhbCA9PiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXIpIHtcbiAgICBzdXBlcihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIFNwaW5Gb3VuZGF0aW9uLnNwaW5EZWZhdWx0QWRhcHRlciksIGFkYXB0ZXIpKTtcbiAgfVxuICB1cGRhdGVMb2FkaW5nSWZOZWVkRGVsYXkoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc3Bpbm5pbmc6IHByb3BzU3Bpbm5pbmcsXG4gICAgICBkZWxheTogcHJvcHNEZWxheVxuICAgIH0gPSB0aGlzLl9hZGFwdGVyLmdldFByb3BzKCk7XG4gICAgY29uc3Qge1xuICAgICAgZGVsYXlcbiAgICB9ID0gdGhpcy5fYWRhcHRlci5nZXRTdGF0ZXMoKTtcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2VsZi5fYWRhcHRlci5zZXRTdGF0ZSh7XG4gICAgICAgICAgbG9hZGluZzogcHJvcHNTcGlubmluZyxcbiAgICAgICAgICBkZWxheTogMFxuICAgICAgICB9KTtcbiAgICAgIH0sIHByb3BzRGVsYXkpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl90aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFNwaW5Gb3VuZGF0aW9uOyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc051bGxPclVuZGVmaW5lZCBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy9pc051bGxPclVuZGVmaW5lZCc7XG5sZXQgX2lkID0gLTE7XG5mdW5jdGlvbiBJY29uKCkge1xuICBsZXQgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICBjb25zdCB7XG4gICAgICBpZDogcHJvcHNJZCxcbiAgICAgIGNsYXNzTmFtZVxuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJpZFwiLCBcImNsYXNzTmFtZVwiXSk7XG4gIGxldCBfcHJvcHNJZCA9IHByb3BzSWQ7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZChfcHJvcHNJZCkpIHtcbiAgICBfaWQrKztcbiAgICBfcHJvcHNJZCA9IF9pZDtcbiAgfVxuICBjb25zdCBpZCA9IGBsaW5lYXJHcmFkaWVudC0ke19wcm9wc0lkfWA7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBPYmplY3QuYXNzaWduKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgd2lkdGg6IFwiNDhcIixcbiAgICBoZWlnaHQ6IFwiNDhcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAzNiAzNlwiLFxuICAgIHZlcnNpb246IFwiMS4xXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgXCJkYXRhLWljb25cIjogXCJzcGluXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpbmVhckdyYWRpZW50XCIsIHtcbiAgICB4MTogXCIwJVwiLFxuICAgIHkxOiBcIjEwMCVcIixcbiAgICB4MjogXCIxMDAlXCIsXG4gICAgeTI6IFwiMTAwJVwiLFxuICAgIGlkOiBpZFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN0b3BcIiwge1xuICAgIHN0b3BDb2xvcjogXCJjdXJyZW50Q29sb3JcIixcbiAgICBzdG9wT3BhY2l0eTogXCIwXCIsXG4gICAgb2Zmc2V0OiBcIjAlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3RvcFwiLCB7XG4gICAgc3RvcENvbG9yOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIHN0b3BPcGFjaXR5OiBcIjAuNTBcIixcbiAgICBvZmZzZXQ6IFwiMzkuOTQzMDY5OCVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdG9wXCIsIHtcbiAgICBzdG9wQ29sb3I6IFwiY3VycmVudENvbG9yXCIsXG4gICAgb2Zmc2V0OiBcIjEwMCVcIlxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIHN0cm9rZTogXCJub25lXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMVwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIGZpbGxPcGFjaXR5OiBcIjAuMDFcIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICB4OiBcIjBcIixcbiAgICB5OiBcIjBcIixcbiAgICB3aWR0aDogXCIzNlwiLFxuICAgIGhlaWdodDogXCIzNlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTM0LDE4IEMzNCw5LjE2MzQ0NCAyNi44MzY1NTYsMiAxOCwyIEMxMS42NTk3MjMzLDIgNi4xODA3ODgwNSw1LjY4Nzg0MTM1IDMuNTkxMjIzMjUsMTEuMDM1NDk1MVwiLFxuICAgIHN0cm9rZTogYHVybCgjJHtpZH0pYCxcbiAgICBzdHJva2VXaWR0aDogXCI0XCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiXG4gIH0pKSk7XG59XG5leHBvcnQgZGVmYXVsdCBJY29uOyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2F2YXRhci9jb25zdGFudHMnO1xuaW1wb3J0IEF2YXRhckZvdW5kYXRpb24gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvYXZhdGFyL2ZvdW5kYXRpb24nO1xuaW1wb3J0ICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9hdmF0YXIvYXZhdGFyLmNzcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZnVuY3Rpb24nO1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vX2Jhc2UvYmFzZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBoYW5kbGVQcmV2ZW50IH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvYTExeSc7XG5pbXBvcnQgeyBnZXREZWZhdWx0UHJvcHNGcm9tR2xvYmFsQ29uZmlnIH0gZnJvbSBcIi4uL191dGlsc1wiO1xuaW1wb3J0IFRvcFNsb3RTdmcgZnJvbSBcIi4vVG9wU2xvdFN2Z1wiO1xuY29uc3Qgc2l6ZVNldCA9IHN0cmluZ3MuU0laRTtcbmNvbnN0IHNoYXBlU2V0ID0gc3RyaW5ncy5TSEFQRTtcbmNvbnN0IGNvbG9yU2V0ID0gc3RyaW5ncy5DT0xPUjtcbmNvbnN0IHByZWZpeENscyA9IGNzc0NsYXNzZXMuUFJFRklYO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXZhdGFyIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlRm9jdXNWaXNpYmxlID0gZXZlbnQgPT4ge1xuICAgICAgdGhpcy5mb3VuZGF0aW9uLmhhbmRsZUZvY3VzVmlzaWJsZShldmVudCk7XG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZUJsdXIgPSBldmVudCA9PiB7XG4gICAgICB0aGlzLmZvdW5kYXRpb24uaGFuZGxlQmx1cigpO1xuICAgIH07XG4gICAgdGhpcy5nZXRDb250ZW50ID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgb25DbGljayxcbiAgICAgICAgaW1nQXR0cixcbiAgICAgICAgc3JjLFxuICAgICAgICBzcmNTZXQsXG4gICAgICAgIGFsdFxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlzSW1nRXhpc3RcbiAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgbGV0IGNvbnRlbnQgPSBjaGlsZHJlbjtcbiAgICAgIGNvbnN0IGNsaWNrYWJsZSA9IG9uQ2xpY2sgIT09IG5vb3A7XG4gICAgICBjb25zdCBpc0ltZyA9IHNyYyAmJiBpc0ltZ0V4aXN0O1xuICAgICAgY29uc3QgYTExeUZvY3VzUHJvcHMgPSB7XG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICBvbktleURvd246IHRoaXMuaGFuZGxlS2V5RG93bixcbiAgICAgICAgb25Gb2N1czogdGhpcy5oYW5kbGVGb2N1c1Zpc2libGUsXG4gICAgICAgIG9uQmx1cjogdGhpcy5oYW5kbGVCbHVyXG4gICAgICB9O1xuICAgICAgaWYgKGlzSW1nKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsQWx0ID0gY2xpY2thYmxlID8gYGNsaWNrYWJsZSBBdmF0YXI6ICR7YWx0fWAgOiBhbHQ7XG4gICAgICAgIGNvbnN0IGltZ0Jhc2ljUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIHNyYyxcbiAgICAgICAgICBzcmNTZXQsXG4gICAgICAgICAgb25FcnJvcjogdGhpcy5oYW5kbGVFcnJvclxuICAgICAgICB9LCBpbWdBdHRyKSwge1xuICAgICAgICAgIGNsYXNzTmFtZTogY2xzKHtcbiAgICAgICAgICAgIFtgJHtwcmVmaXhDbHN9LW5vLWZvY3VzLXZpc2libGVgXTogY2xpY2thYmxlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGltZ1Byb3BzID0gY2xpY2thYmxlID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbWdCYXNpY1Byb3BzKSwgYTExeUZvY3VzUHJvcHMpIDogaW1nQmFzaWNQcm9wcztcbiAgICAgICAgY29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIGFsdDogZmluYWxBbHRcbiAgICAgICAgfSwgaW1nUHJvcHMpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCB0ZW1wQWx0ID0gYWx0ICE9PSBudWxsICYmIGFsdCAhPT0gdm9pZCAwID8gYWx0IDogY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGZpbmFsQWx0ID0gY2xpY2thYmxlID8gYGNsaWNrYWJsZSBBdmF0YXI6ICR7dGVtcEFsdH1gIDogdGVtcEFsdDtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgcm9sZTogJ2ltZycsXG4gICAgICAgICAgJ2FyaWEtbGFiZWwnOiBmaW5hbEFsdCxcbiAgICAgICAgICBjbGFzc05hbWU6IGNscyhgJHtwcmVmaXhDbHN9LWxhYmVsYCwge1xuICAgICAgICAgICAgW2Ake3ByZWZpeENsc30tbm8tZm9jdXMtdmlzaWJsZWBdOiBjbGlja2FibGVcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaW5hbFByb3BzID0gY2xpY2thYmxlID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIGExMXlGb2N1c1Byb3BzKSA6IHByb3BzO1xuICAgICAgICBjb25zdCBzdHJpbmdTdHlsZSA9IHtcbiAgICAgICAgICB0cmFuc2Zvcm06IGBzY2FsZSgke3RoaXMuc3RhdGUuc2NhbGV9KWBcbiAgICAgICAgfTtcbiAgICAgICAgY29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWNvbnRlbnRgLFxuICAgICAgICAgIHN0eWxlOiBzdHJpbmdTdHlsZVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgT2JqZWN0LmFzc2lnbih7fSwgZmluYWxQcm9wcywge1xuICAgICAgICAgIFwieC1zZW1pLXByb3BcIjogXCJjaGlsZHJlblwiXG4gICAgICAgIH0pLCBjaGlsZHJlbikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfTtcbiAgICB0aGlzLnJlbmRlckJvdHRvbVNsb3QgPSAoKSA9PiB7XG4gICAgICB2YXIgX2EsIF9iO1xuICAgICAgaWYgKCF0aGlzLnByb3BzLmJvdHRvbVNsb3QpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wcm9wcy5ib3R0b21TbG90LnJlbmRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5ib3R0b21TbG90LnJlbmRlcigpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVuZGVyQ29udGVudCA9IChfYSA9IHRoaXMucHJvcHMuYm90dG9tU2xvdC5yZW5kZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICgpID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBzdHlsZSA9IHt9O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3R0b21TbG90LmJnQ29sb3IpIHtcbiAgICAgICAgICBzdHlsZVsnYmFja2dyb3VuZENvbG9yJ10gPSB0aGlzLnByb3BzLmJvdHRvbVNsb3QuYmdDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3R0b21TbG90LnRleHRDb2xvcikge1xuICAgICAgICAgIHN0eWxlWydjb2xvciddID0gdGhpcy5wcm9wcy5ib3R0b21TbG90LnRleHRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjbHMoYCR7cHJlZml4Q2xzfS1ib3R0b21fc2xvdC1zaGFwZV8ke3RoaXMucHJvcHMuYm90dG9tU2xvdC5zaGFwZX1gLCBgJHtwcmVmaXhDbHN9LWJvdHRvbV9zbG90LXNoYXBlXyR7dGhpcy5wcm9wcy5ib3R0b21TbG90LnNoYXBlfS0ke3RoaXMucHJvcHMuc2l6ZX1gLCAoX2EgPSB0aGlzLnByb3BzLmJvdHRvbVNsb3QuY2xhc3NOYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcIlwiKVxuICAgICAgICB9LCB0aGlzLnByb3BzLmJvdHRvbVNsb3QudGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbHMoW2Ake3ByZWZpeENsc30tYm90dG9tX3Nsb3RgXSksXG4gICAgICAgIHN0eWxlOiAoX2IgPSB0aGlzLnByb3BzLmJvdHRvbVNsb3Quc3R5bGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9XG4gICAgICB9LCByZW5kZXJDb250ZW50KCkpO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJUb3BTbG90ID0gKCkgPT4ge1xuICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgaWYgKCF0aGlzLnByb3BzLnRvcFNsb3QpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wcm9wcy50b3BTbG90LnJlbmRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy50b3BTbG90LnJlbmRlcigpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dFN0eWxlID0ge307XG4gICAgICBpZiAodGhpcy5wcm9wcy50b3BTbG90LnRleHRDb2xvcikge1xuICAgICAgICB0ZXh0U3R5bGVbJ2NvbG9yJ10gPSB0aGlzLnByb3BzLnRvcFNsb3QudGV4dENvbG9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IChfYSA9IHRoaXMucHJvcHMudG9wU2xvdC5zdHlsZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30sXG4gICAgICAgIGNsYXNzTmFtZTogY2xzKFtgJHtwcmVmaXhDbHN9LXRvcF9zbG90LXdyYXBwZXJgLCAoX2IgPSB0aGlzLnByb3BzLnRvcFNsb3QuY2xhc3NOYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiLCB7XG4gICAgICAgICAgW2Ake3ByZWZpeENsc30tYW5pbWF0ZWRgXTogdGhpcy5wcm9wcy5jb250ZW50TW90aW9uXG4gICAgICAgIH1dKVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNscyhbYCR7cHJlZml4Q2xzfS10b3Bfc2xvdC1iZ2AsIGAke3ByZWZpeENsc30tdG9wX3Nsb3QtYmctJHt0aGlzLnByb3BzLnNpemV9YF0pXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xzKFtgJHtwcmVmaXhDbHN9LXRvcF9zbG90LWJnLXN2Z2AsIGAke3ByZWZpeENsc30tdG9wX3Nsb3QtYmctc3ZnLSR7dGhpcy5wcm9wcy5zaXplfWBdKVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9wU2xvdFN2Zywge1xuICAgICAgICBncmFkaWVudFN0YXJ0OiAoX2MgPSB0aGlzLnByb3BzLnRvcFNsb3QuZ3JhZGllbnRTdGFydCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCIsXG4gICAgICAgIGdyYWRpZW50RW5kOiAoX2QgPSB0aGlzLnByb3BzLnRvcFNsb3QuZ3JhZGllbnRFbmQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gICAgICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xzKFtgJHtwcmVmaXhDbHN9LXRvcF9zbG90YF0pXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiB0ZXh0U3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZTogY2xzKFtgJHtwcmVmaXhDbHN9LXRvcF9zbG90LWNvbnRlbnRgLCBgJHtwcmVmaXhDbHN9LXRvcF9zbG90LWNvbnRlbnQtJHt0aGlzLnByb3BzLnNpemV9YF0pXG4gICAgICB9LCB0aGlzLnByb3BzLnRvcFNsb3QudGV4dCkpKTtcbiAgICB9O1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0ltZ0V4aXN0OiB0cnVlLFxuICAgICAgaG92ZXJDb250ZW50OiAnJyxcbiAgICAgIGZvY3VzVmlzaWJsZTogZmFsc2UsXG4gICAgICBzY2FsZTogMVxuICAgIH07XG4gICAgdGhpcy5vbkVudGVyID0gdGhpcy5vbkVudGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkxlYXZlID0gdGhpcy5vbkxlYXZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVFcnJvciA9IHRoaXMuaGFuZGxlRXJyb3IuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZUtleURvd24gPSB0aGlzLmhhbmRsZUtleURvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldENvbnRlbnQgPSB0aGlzLmdldENvbnRlbnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLmF2YXRhclJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgfVxuICBnZXQgYWRhcHRlcigpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdXBlci5hZGFwdGVyKSwge1xuICAgICAgbm90aWZ5SW1nU3RhdGU6IGlzSW1nRXhpc3QgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc0ltZ0V4aXN0XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG5vdGlmeUVudGVyOiBlID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGhvdmVyTWFza1xuICAgICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgaG92ZXJDb250ZW50ID0gaG92ZXJNYXNrO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBob3ZlckNvbnRlbnRcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG9uTW91c2VFbnRlclxuICAgICAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICAgIG9uTW91c2VFbnRlciAmJiBvbk1vdXNlRW50ZXIoZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG5vdGlmeUxlYXZlOiBlID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaG92ZXJDb250ZW50OiAnJ1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgb25Nb3VzZUxlYXZlXG4gICAgICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgICAgb25Nb3VzZUxlYXZlICYmIG9uTW91c2VMZWF2ZShlKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgc2V0Rm9jdXNWaXNpYmxlOiBmb2N1c1Zpc2libGUgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBmb2N1c1Zpc2libGVcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgc2V0U2NhbGU6IHNjYWxlID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2NhbGVcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZ2V0QXZhdGFyTm9kZTogKCkgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLmF2YXRhclJlZikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmN1cnJlbnQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5mb3VuZGF0aW9uID0gbmV3IEF2YXRhckZvdW5kYXRpb24odGhpcy5hZGFwdGVyKTtcbiAgICB0aGlzLmZvdW5kYXRpb24uaW5pdCgpO1xuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zcmMgJiYgdGhpcy5wcm9wcy5zcmMgIT09IHByZXZQcm9wcy5zcmMpIHtcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKDAsIDApO1xuICAgICAgaW1hZ2Uuc3JjID0gdGhpcy5wcm9wcy5zcmM7XG4gICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlzSW1nRXhpc3Q6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNJbWdFeGlzdDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgaW1hZ2Uub25hYm9ydCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNJbWdFeGlzdDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuY2hpbGRyZW4gPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wcm9wcy5jaGlsZHJlbiAhPT0gcHJldlByb3BzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmZvdW5kYXRpb24uY2hhbmdlU2NhbGUoKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKTtcbiAgfVxuICBvbkVudGVyKGUpIHtcbiAgICB0aGlzLmZvdW5kYXRpb24uaGFuZGxlRW50ZXIoZSk7XG4gIH1cbiAgb25MZWF2ZShlKSB7XG4gICAgdGhpcy5mb3VuZGF0aW9uLmhhbmRsZUxlYXZlKGUpO1xuICB9XG4gIGhhbmRsZUVycm9yKCkge1xuICAgIHRoaXMuZm91bmRhdGlvbi5oYW5kbGVJbWdMb2FkRXJyb3IoKTtcbiAgfVxuICBoYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgb25DbGlja1xuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgb25DbGljayhldmVudCk7XG4gICAgICAgIGhhbmRsZVByZXZlbnQoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGV2ZW50LnRhcmdldC5ibHVyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgX2IgPSB0aGlzLnByb3BzLFxuICAgICAge1xuICAgICAgICBzaGFwZSxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHNpemUsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIGhvdmVyTWFzayxcbiAgICAgICAgb25DbGljayxcbiAgICAgICAgaW1nQXR0cixcbiAgICAgICAgc3JjLFxuICAgICAgICBzcmNTZXQsXG4gICAgICAgIHN0eWxlLFxuICAgICAgICBhbHQsXG4gICAgICAgIGdhcCxcbiAgICAgICAgYm90dG9tU2xvdCxcbiAgICAgICAgdG9wU2xvdCxcbiAgICAgICAgYm9yZGVyLFxuICAgICAgICBjb250ZW50TW90aW9uXG4gICAgICB9ID0gX2IsXG4gICAgICBvdGhlcnMgPSBfX3Jlc3QoX2IsIFtcInNoYXBlXCIsIFwiY2hpbGRyZW5cIiwgXCJzaXplXCIsIFwiY29sb3JcIiwgXCJjbGFzc05hbWVcIiwgXCJob3Zlck1hc2tcIiwgXCJvbkNsaWNrXCIsIFwiaW1nQXR0clwiLCBcInNyY1wiLCBcInNyY1NldFwiLCBcInN0eWxlXCIsIFwiYWx0XCIsIFwiZ2FwXCIsIFwiYm90dG9tU2xvdFwiLCBcInRvcFNsb3RcIiwgXCJib3JkZXJcIiwgXCJjb250ZW50TW90aW9uXCJdKTtcbiAgICBjb25zdCB7XG4gICAgICBpc0ltZ0V4aXN0LFxuICAgICAgaG92ZXJDb250ZW50LFxuICAgICAgZm9jdXNWaXNpYmxlXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgbGV0IGN1c3RvbVN0eWxlID0ge307XG4gICAgaWYgKCFzdHJpbmdzLlNJWkUuaW5jbHVkZXMoc2l6ZSkpIHtcbiAgICAgIGN1c3RvbVN0eWxlID0ge1xuICAgICAgICB3aWR0aDogc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBzaXplXG4gICAgICB9O1xuICAgIH1cbiAgICBjdXN0b21TdHlsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3VzdG9tU3R5bGUpLCBzdHlsZSk7XG4gICAgY29uc3Qgc2hvdWxkV3JhcCA9IGJvdHRvbVNsb3QgfHwgdG9wU2xvdCB8fCBib3JkZXI7XG4gICAgY29uc3QgbW91c2VFdmVudCA9IHtcbiAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICBvbk1vdXNlRW50ZXI6IHRoaXMub25FbnRlcixcbiAgICAgIG9uTW91c2VMZWF2ZTogdGhpcy5vbkxlYXZlXG4gICAgfTtcbiAgICBjb25zdCBpc0ltZyA9IHNyYyAmJiBpc0ltZ0V4aXN0O1xuICAgIGNvbnN0IGF2YXRhckNscyA9IGNscyhwcmVmaXhDbHMsIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LSR7c2hhcGV9YF06IHNoYXBlLFxuICAgICAgW2Ake3ByZWZpeENsc30tJHtzaXplfWBdOiBzaXplLFxuICAgICAgW2Ake3ByZWZpeENsc30tJHtjb2xvcn1gXTogY29sb3IgJiYgIWlzSW1nLFxuICAgICAgW2Ake3ByZWZpeENsc30taW1nYF06IGlzSW1nLFxuICAgICAgW2Ake3ByZWZpeENsc30tZm9jdXNgXTogZm9jdXNWaXNpYmxlLFxuICAgICAgW2Ake3ByZWZpeENsc30tYW5pbWF0ZWRgXTogY29udGVudE1vdGlvblxuICAgIH0sIGNsYXNzTmFtZSk7XG4gICAgY29uc3QgaG92ZXJSZW5kZXIgPSBob3ZlckNvbnRlbnQgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWhvdmVyYCxcbiAgICAgIFwieC1zZW1pLXByb3BcIjogXCJob3ZlckNvbnRlbnRcIlxuICAgIH0sIGhvdmVyQ29udGVudCkpIDogbnVsbDtcbiAgICBsZXQgYXZhdGFyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIE9iamVjdC5hc3NpZ24oe30sIG90aGVycywge1xuICAgICAgc3R5bGU6IHNob3VsZFdyYXAgPyB7fSA6IGN1c3RvbVN0eWxlLFxuICAgICAgY2xhc3NOYW1lOiBhdmF0YXJDbHNcbiAgICB9LCBzaG91bGRXcmFwID8ge30gOiBtb3VzZUV2ZW50LCB7XG4gICAgICByb2xlOiAnbGlzdGl0ZW0nLFxuICAgICAgcmVmOiB0aGlzLmF2YXRhclJlZlxuICAgIH0pLCB0aGlzLmdldENvbnRlbnQoKSwgaG92ZXJSZW5kZXIpO1xuICAgIGlmIChib3JkZXIpIHtcbiAgICAgIGNvbnN0IGJvcmRlclN0eWxlID0ge307XG4gICAgICBpZiAodHlwZW9mIGJvcmRlciA9PT0gJ29iamVjdCcgJiYgKGJvcmRlciA9PT0gbnVsbCB8fCBib3JkZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJvcmRlci5jb2xvcikpIHtcbiAgICAgICAgYm9yZGVyU3R5bGVbJ2JvcmRlckNvbG9yJ10gPSBib3JkZXIgPT09IG51bGwgfHwgYm9yZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBib3JkZXIuY29sb3I7XG4gICAgICB9XG4gICAgICBhdmF0YXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiXG4gICAgICAgIH0sIGN1c3RvbVN0eWxlKVxuICAgICAgfSwgYXZhdGFyLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBzdHlsZTogYm9yZGVyU3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZTogY2xzKFtgJHtwcmVmaXhDbHN9LWFkZGl0aW9uYWxCb3JkZXJgLCBgJHtwcmVmaXhDbHN9LWFkZGl0aW9uYWxCb3JkZXItJHtzaXplfWAsIHtcbiAgICAgICAgICBbYCR7cHJlZml4Q2xzfS0ke3NoYXBlfWBdOiBzaGFwZVxuICAgICAgICB9XSlcbiAgICAgIH0pLCB0eXBlb2YgdGhpcy5wcm9wcy5ib3JkZXIgPT09ICdvYmplY3QnICYmIHRoaXMucHJvcHMuYm9yZGVyLm1vdGlvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBzdHlsZTogYm9yZGVyU3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZTogY2xzKFtgJHtwcmVmaXhDbHN9LWFkZGl0aW9uYWxCb3JkZXJgLCBgJHtwcmVmaXhDbHN9LWFkZGl0aW9uYWxCb3JkZXItJHtzaXplfWAsIHtcbiAgICAgICAgICBbYCR7cHJlZml4Q2xzfS0ke3NoYXBlfWBdOiBzaGFwZSxcbiAgICAgICAgICBbYCR7cHJlZml4Q2xzfS1hZGRpdGlvbmFsQm9yZGVyLWFuaW1hdGVkYF06IHR5cGVvZiB0aGlzLnByb3BzLmJvcmRlciA9PT0gJ29iamVjdCcgJiYgKChfYSA9IHRoaXMucHJvcHMuYm9yZGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubW90aW9uKVxuICAgICAgICB9XSlcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFdyYXApIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGNsYXNzTmFtZTogY2xzKFtgJHtwcmVmaXhDbHN9LXdyYXBwZXJgXSksXG4gICAgICAgIHN0eWxlOiBjdXN0b21TdHlsZVxuICAgICAgfSwgbW91c2VFdmVudCksIGF2YXRhciwgdG9wU2xvdCAmJiBbXCJleHRyYS1zbWFsbFwiLCBcInNtYWxsXCIsIFwiZGVmYXVsdFwiLCBcIm1lZGl1bVwiLCBcImxhcmdlXCIsIFwiZXh0cmEtbGFyZ2VcIl0uaW5jbHVkZXMoc2l6ZSkgJiYgc2hhcGUgPT09IFwiY2lyY2xlXCIgJiYgdGhpcy5yZW5kZXJUb3BTbG90KCksIGJvdHRvbVNsb3QgJiYgW1wiZXh0cmEtc21hbGxcIiwgXCJzbWFsbFwiLCBcImRlZmF1bHRcIiwgXCJtZWRpdW1cIiwgXCJsYXJnZVwiLCBcImV4dHJhLWxhcmdlXCJdLmluY2x1ZGVzKHNpemUpICYmIHRoaXMucmVuZGVyQm90dG9tU2xvdCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF2YXRhcjtcbiAgICB9XG4gIH1cbn1cbkF2YXRhci5fX1NlbWlDb21wb25lbnROYW1lX18gPSBcIkF2YXRhclwiO1xuQXZhdGFyLmRlZmF1bHRQcm9wcyA9IGdldERlZmF1bHRQcm9wc0Zyb21HbG9iYWxDb25maWcoQXZhdGFyLl9fU2VtaUNvbXBvbmVudE5hbWVfXywge1xuICBzaXplOiAnbWVkaXVtJyxcbiAgY29sb3I6ICdncmV5JyxcbiAgc2hhcGU6ICdjaXJjbGUnLFxuICBnYXA6IDMsXG4gIG9uQ2xpY2s6IG5vb3AsXG4gIG9uTW91c2VFbnRlcjogbm9vcCxcbiAgb25Nb3VzZUxlYXZlOiBub29wXG59KTtcbkF2YXRhci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihjb2xvclNldCksXG4gIHNoYXBlOiBQcm9wVHlwZXMub25lT2Yoc2hhcGVTZXQpLFxuICBzaXplOiBQcm9wVHlwZXMub25lT2Yoc2l6ZVNldCksXG4gIGhvdmVyTWFzazogUHJvcFR5cGVzLm5vZGUsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGdhcDogUHJvcFR5cGVzLm51bWJlcixcbiAgaW1nQXR0cjogUHJvcFR5cGVzLm9iamVjdCxcbiAgc3JjOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBzcmNTZXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGFsdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25FcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlTGVhdmU6IFByb3BUeXBlcy5mdW5jLFxuICBib3R0b21TbG90OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHJlbmRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc2hhcGU6IFByb3BUeXBlcy5vbmVPZihbJ2NpcmNsZScsICdzcXVhcmUnXSksXG4gICAgdGV4dDogUHJvcFR5cGVzLm5vZGUsXG4gICAgYmdDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0ZXh0Q29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0XG4gIH0pLFxuICB0b3BTbG90OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHJlbmRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZ3JhZGllbnRTdGFydDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBncmFkaWVudEVuZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0ZXh0OiBQcm9wVHlwZXMubm9kZSxcbiAgICB0ZXh0Q29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0XG4gIH0pLFxuICBib3JkZXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zaGFwZSh7XG4gICAgY29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgbW90aW9uOiBQcm9wVHlwZXMuYm9vbFxuICB9KSwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgY29udGVudE1vdGlvbjogUHJvcFR5cGVzLmJvb2xcbn07XG5BdmF0YXIuZWxlbWVudFR5cGUgPSAnQXZhdGFyJzsiLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS1hdmF0YXJgXG59O1xuY29uc3Qgc3RyaW5ncyA9IHtcbiAgU0hBUEU6IFsnY2lyY2xlJywgJ3NxdWFyZSddLFxuICBTSVpFOiBbJ2V4dHJhLWV4dHJhLXNtYWxsJywgJ2V4dHJhLXNtYWxsJywgJ3NtYWxsJywgJ2RlZmF1bHQnLCAnbWVkaXVtJywgJ2xhcmdlJywgJ2V4dHJhLWxhcmdlJ10sXG4gIENPTE9SOiBbJ2dyZXknLCAncmVkJywgJ3BpbmsnLCAncHVycGxlJywgJ3Zpb2xldCcsICdpbmRpZ28nLCAnYmx1ZScsICdsaWdodC1ibHVlJywgJ2N5YW4nLCAndGVhbCcsICdncmVlbicsICdsaWdodC1ncmVlbicsICdsaW1lJywgJ3llbGxvdycsICdhbWJlcicsICdvcmFuZ2UnLCAnd2hpdGUnXSxcbiAgT1ZFUkxBUF9GUk9NOiBbJ3N0YXJ0JywgJ2VuZCddXG59O1xuZXhwb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9OyIsICJpbXBvcnQgQmFzZUZvdW5kYXRpb24gZnJvbSAnLi4vYmFzZS9mb3VuZGF0aW9uJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL3V0aWxzL3dhcm5pbmcnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXZhdGFyRm91bmRhdGlvbiBleHRlbmRzIEJhc2VGb3VuZGF0aW9uIHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGFkYXB0ZXIpKTtcbiAgICB0aGlzLmhhbmRsZUZvY3VzVmlzaWJsZSA9IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdGFyZ2V0XG4gICAgICB9ID0gZXZlbnQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGFyZ2V0Lm1hdGNoZXMoJzpmb2N1cy12aXNpYmxlJykpIHtcbiAgICAgICAgICB0aGlzLl9hZGFwdGVyLnNldEZvY3VzVmlzaWJsZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgd2FybmluZyh0cnVlLCAnV2FybmluZzogW1NlbWkgQXZhdGFyXSBUaGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZvY3VzLXZpc2libGUnKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlQmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2FkYXB0ZXIuc2V0Rm9jdXNWaXNpYmxlKGZhbHNlKTtcbiAgICB9O1xuICAgIHRoaXMuY2hhbmdlU2NhbGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGdhcFxuICAgICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9hZGFwdGVyLmdldEF2YXRhck5vZGUoKTtcbiAgICAgIGNvbnN0IHN0cmluZ05vZGUgPSBub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgIGNvbnN0IFtub2RlV2lkdGgsIHN0cmluZ05vZGVXaWR0aF0gPSBbKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS5vZmZzZXRXaWR0aCkgfHwgMCwgKHN0cmluZ05vZGUgPT09IG51bGwgfHwgc3RyaW5nTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RyaW5nTm9kZS5vZmZzZXRXaWR0aCkgfHwgMF07XG4gICAgICBpZiAobm9kZVdpZHRoICE9PSAwICYmIHN0cmluZ05vZGVXaWR0aCAhPT0gMCAmJiBnYXAgKiAyIDwgbm9kZVdpZHRoKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gbm9kZVdpZHRoIC0gZ2FwICogMiA+IHN0cmluZ05vZGVXaWR0aCA/IDEgOiAobm9kZVdpZHRoIC0gZ2FwICogMikgLyBzdHJpbmdOb2RlV2lkdGg7XG4gICAgICAgIHRoaXMuX2FkYXB0ZXIuc2V0U2NhbGUoc2NhbGUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgaW5pdCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGlsZHJlblxuICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5jaGFuZ2VTY2FsZSgpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge31cbiAgaGFuZGxlSW1nTG9hZEVycm9yKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9uRXJyb3JcbiAgICB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgIGNvbnN0IGVycm9yRmxhZyA9IG9uRXJyb3IgPyBvbkVycm9yKCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGVycm9yRmxhZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX2FkYXB0ZXIubm90aWZ5SW1nU3RhdGUoZmFsc2UpO1xuICAgIH1cbiAgfVxuICBoYW5kbGVFbnRlcihlKSB7XG4gICAgdGhpcy5fYWRhcHRlci5ub3RpZnlFbnRlcihlKTtcbiAgfVxuICBoYW5kbGVMZWF2ZShlKSB7XG4gICAgdGhpcy5fYWRhcHRlci5ub3RpZnlMZWF2ZShlKTtcbiAgfVxufSIsICJpbXBvcnQgeyBnZXRVdWlkU2hvcnQgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy91dWlkJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBUb3BTbG90U3ZnID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZ3JhZGllbnRTdGFydCxcbiAgICBncmFkaWVudEVuZFxuICB9ID0gX3JlZjtcbiAgY29uc3QgaWQgPSBnZXRVdWlkU2hvcnQoKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiBcIjUxXCIsXG4gICAgaGVpZ2h0OiBcIjUyXCIsXG4gICAgdmlld0JveDogXCIwIDAgNTEgNTJcIixcbiAgICBmaWxsOiBcIm5vbmVcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIGZpbHRlcjogXCJ1cmwoI2ZpbHRlcjBfZF82XzIpXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00MC40OTE4IDQ2LjU1OTJDNDQuNjc5NSA0My4xNzYgNDYuMjYxIDM0LjEzMzMgNDcuNTMwMSAyNS42MTQxQzQ5LjU4NTQgMTEuODE2OCAzOS42NjYyIDEgMjUuODA5NyAxQzExLjI4NTcgMSAzIDExLjQyNzkgMyAyNS4zNTE4QzMgMzMuNzg2NiA2LjI5MzYxIDQzLjg5NDcgMTAuNDYwMiA0Ni41NTkyQzEyLjU4NjggNDcuOTE5MiAxMi41ODY4IDQ3LjkwNTEgMjUuODA5NyA0Ny45MTkyQzM4LjM2NTEgNDcuOTI4MiAzOC41MzUyIDQ4LjE0IDQwLjQ5MTggNDYuNTU5MlpcIixcbiAgICBmaWxsOiBgdXJsKCMke2lkfSlgXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtcbiAgICBpZDogXCJmaWx0ZXIwX2RfNl8yXCIsXG4gICAgeDogXCIwLjc4OTIxNVwiLFxuICAgIHk6IFwiMC40NDczMDRcIixcbiAgICB3aWR0aDogXCI0OS4yMjE2XCIsXG4gICAgaGVpZ2h0OiBcIjUxLjM1NDlcIixcbiAgICBmaWx0ZXJVbml0czogXCJ1c2VyU3BhY2VPblVzZVwiLFxuICAgIGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6IFwic1JHQlwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVGbG9vZFwiLCB7XG4gICAgZmxvb2RPcGFjaXR5OiBcIjBcIixcbiAgICByZXN1bHQ6IFwiQmFja2dyb3VuZEltYWdlRml4XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVDb2xvck1hdHJpeFwiLCB7XG4gICAgaW46IFwiU291cmNlQWxwaGFcIixcbiAgICB0eXBlOiBcIm1hdHJpeFwiLFxuICAgIHZhbHVlczogXCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiLFxuICAgIHJlc3VsdDogXCJoYXJkQWxwaGFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZU9mZnNldFwiLCB7XG4gICAgZHk6IFwiMS42NTgwOVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImZlR2F1c3NpYW5CbHVyXCIsIHtcbiAgICBzdGREZXZpYXRpb246IFwiMS4xMDUzOVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImZlQ29sb3JNYXRyaXhcIiwge1xuICAgIHR5cGU6IFwibWF0cml4XCIsXG4gICAgdmFsdWVzOiBcIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMyAwXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVCbGVuZFwiLCB7XG4gICAgbW9kZTogXCJub3JtYWxcIixcbiAgICBpbjI6IFwiQmFja2dyb3VuZEltYWdlRml4XCIsXG4gICAgcmVzdWx0OiBcImVmZmVjdDFfZHJvcFNoYWRvd182XzJcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZUJsZW5kXCIsIHtcbiAgICBtb2RlOiBcIm5vcm1hbFwiLFxuICAgIGluOiBcIlNvdXJjZUdyYXBoaWNcIixcbiAgICBpbjI6IFwiZWZmZWN0MV9kcm9wU2hhZG93XzZfMlwiLFxuICAgIHJlc3VsdDogXCJzaGFwZVwiXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lYXJHcmFkaWVudFwiLCB7XG4gICAgaWQ6IGlkLFxuICAgIHgxOiBcIjE3LjY3MVwiLFxuICAgIHkxOiBcIjMxLjczOTJcIixcbiAgICB4MjogXCIxNy42NzFcIixcbiAgICB5MjogXCI0Ny45MzMzXCIsXG4gICAgZ3JhZGllbnRVbml0czogXCJ1c2VyU3BhY2VPblVzZVwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3RvcFwiLCB7XG4gICAgc3RvcENvbG9yOiBncmFkaWVudFN0YXJ0XG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN0b3BcIiwge1xuICAgIG9mZnNldDogXCIxXCIsXG4gICAgc3RvcENvbG9yOiBncmFkaWVudEVuZFxuICB9KSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBUb3BTbG90U3ZnOyIsICJpbXBvcnQgX25vb3AgZnJvbSBcImxvZGFzaC9ub29wXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzLCBzdHJpbmdzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvYnV0dG9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBzdHJpbmdzIGFzIGljb25TdHJpbmdzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvaWNvbnMvY29uc3RhbnRzJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vYnV0dG9uL0J1dHRvbic7XG5pbXBvcnQgU3Bpbkljb24gZnJvbSAnLi4vc3Bpbi9pY29uJztcbmltcG9ydCAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvYnV0dG9uL2ljb25CdXR0b24uY3NzJztcbmNvbnN0IGljb25TaXplcyA9IGljb25TdHJpbmdzLlNJWkU7XG4vLyBUT0RPOiBhZGQgYSBidXR0b25Hcm91cCBjb21wb25lbnRcbi8vIFRPRE86IGljb24gY29uZmlndXJhdGlvblxuY2xhc3MgSWNvbkJ1dHRvbiBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3QgX2EgPSB0aGlzLnByb3BzLFxuICAgICAge1xuICAgICAgICBjaGlsZHJlbjogb3JpZ2luQ2hpbGRyZW4sXG4gICAgICAgIGljb25Qb3NpdGlvbixcbiAgICAgICAgaWNvblNpemUsXG4gICAgICAgIGljb25TdHlsZSxcbiAgICAgICAgc3R5bGU6IG9yaWdpblN0eWxlLFxuICAgICAgICBpY29uLFxuICAgICAgICBub0hvcml6b250YWxQYWRkaW5nLFxuICAgICAgICB0aGVtZSxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBwcmVmaXhDbHMsXG4gICAgICAgIGxvYWRpbmdcbiAgICAgIH0gPSBfYSxcbiAgICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCIsIFwiaWNvblBvc2l0aW9uXCIsIFwiaWNvblNpemVcIiwgXCJpY29uU3R5bGVcIiwgXCJzdHlsZVwiLCBcImljb25cIiwgXCJub0hvcml6b250YWxQYWRkaW5nXCIsIFwidGhlbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJwcmVmaXhDbHNcIiwgXCJsb2FkaW5nXCJdKTtcbiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIG9yaWdpblN0eWxlKTtcbiAgICAvLyBUT0RPOiByZXZpZXcgY2hlY2tcbiAgICBpZiAoQXJyYXkuaXNBcnJheShub0hvcml6b250YWxQYWRkaW5nKSkge1xuICAgICAgbm9Ib3Jpem9udGFsUGFkZGluZy5pbmNsdWRlcygnbGVmdCcpICYmIChzdHlsZS5wYWRkaW5nTGVmdCA9IDApO1xuICAgICAgbm9Ib3Jpem9udGFsUGFkZGluZy5pbmNsdWRlcygncmlnaHQnKSAmJiAoc3R5bGUucGFkZGluZ1JpZ2h0ID0gMCk7XG4gICAgfSBlbHNlIGlmIChub0hvcml6b250YWxQYWRkaW5nID09PSB0cnVlKSB7XG4gICAgICBzdHlsZS5wYWRkaW5nTGVmdCA9IDA7XG4gICAgICBzdHlsZS5wYWRkaW5nUmlnaHQgPSAwO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG5vSG9yaXpvbnRhbFBhZGRpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBub0hvcml6b250YWxQYWRkaW5nID09PSAnbGVmdCcgJiYgKHN0eWxlLnBhZGRpbmdMZWZ0ID0gMCk7XG4gICAgICBub0hvcml6b250YWxQYWRkaW5nID09PSAncmlnaHQnICYmIChzdHlsZS5wYWRkaW5nUmlnaHQgPSAwKTtcbiAgICB9XG4gICAgbGV0IGZpbmFsQ2hpbGRyZW4gPSBudWxsO1xuICAgIGxldCBJY29uRWxlbSA9IG51bGw7XG4gICAgaWYgKGxvYWRpbmcgJiYgIW90aGVyUHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgIEljb25FbGVtID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3Bpbkljb24sIG51bGwpO1xuICAgIH0gZWxzZSBpZiAoLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGljb24pKSB7XG4gICAgICBJY29uRWxlbSA9IGljb247XG4gICAgfVxuICAgIGNvbnN0IGJ0blRleHRDbHMgPSBjbGFzc05hbWVzKHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWNvbnRlbnQtbGVmdGBdOiBpY29uUG9zaXRpb24gPT09ICdyaWdodCcsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1jb250ZW50LXJpZ2h0YF06IGljb25Qb3NpdGlvbiA9PT0gJ2xlZnQnXG4gICAgfSk7XG4gICAgY29uc3QgeFNlbWlQcm9wID0gdGhpcy5wcm9wc1sneC1zZW1pLWNoaWxkcmVuLWFsaWFzJ10gfHwgJ2NoaWxkcmVuJztcbiAgICBjb25zdCBjaGlsZHJlbiA9IG9yaWdpbkNoaWxkcmVuICE9IG51bGwgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBidG5UZXh0Q2xzLFxuICAgICAgXCJ4LXNlbWktcHJvcFwiOiB4U2VtaVByb3BcbiAgICB9LCBvcmlnaW5DaGlsZHJlbikgOiBudWxsO1xuICAgIGlmIChpY29uUG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgZmluYWxDaGlsZHJlbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBJY29uRWxlbSwgY2hpbGRyZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbENoaWxkcmVuID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuLCBJY29uRWxlbSk7XG4gICAgfVxuICAgIGNvbnN0IGljb25CdG5DbHMgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYCR7cHJlZml4Q2xzfS13aXRoLWljb25gLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS13aXRoLWljb24tb25seWBdOiBjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuID09PSAnJyxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWxvYWRpbmdgXTogbG9hZGluZ1xuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIE9iamVjdC5hc3NpZ24oe30sIG90aGVyUHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogaWNvbkJ0bkNscyxcbiAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0pLCBmaW5hbENoaWxkcmVuKTtcbiAgfVxufVxuSWNvbkJ1dHRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGljb25Qb3NpdGlvbjogc3RyaW5ncy5ERUZBVUxUX0lDT05fUE9TSVRJT04sXG4gIHByZWZpeENsczogY3NzQ2xhc3Nlcy5QUkVGSVgsXG4gIGxvYWRpbmc6IGZhbHNlLFxuICBub0hvcml6b250YWxQYWRkaW5nOiBmYWxzZSxcbiAgb25Nb3VzZUVudGVyOiBfbm9vcCxcbiAgb25Nb3VzZUxlYXZlOiBfbm9vcFxufTtcbkljb25CdXR0b24uZWxlbWVudFR5cGUgPSBcIkljb25CdXR0b25cIjtcbkljb25CdXR0b24ucHJvcFR5cGVzID0ge1xuICBpY29uU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBsb2FkaW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgcHJlZml4Q2xzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBpY29uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubm9kZV0pLFxuICBpY29uU2l6ZTogUHJvcFR5cGVzLm9uZU9mKGljb25TaXplcyksXG4gIG5vSG9yaXpvbnRhbFBhZGRpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXldKSxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICB0aGVtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgaWNvblBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5pY29uUG9zaXRpb25zKSxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBvbk1vdXNlRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlTGVhdmU6IFByb3BUeXBlcy5mdW5jXG59O1xuZXhwb3J0IGRlZmF1bHQgSWNvbkJ1dHRvbjsiLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS1idXR0b25gXG59O1xuY29uc3Qgc3RyaW5ncyA9IHtcbiAgc2l6ZXM6IFsnZGVmYXVsdCcsICdzbWFsbCcsICdsYXJnZSddLFxuICBpY29uUG9zaXRpb25zOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgaHRtbFR5cGVzOiBbJ2J1dHRvbicsICdyZXNldCcsICdzdWJtaXQnXSxcbiAgYnRuVHlwZXM6IFsncHJpbWFyeScsICdzZWNvbmRhcnknLCAndGVydGlhcnknLCAnd2FybmluZycsICdkYW5nZXInXSxcbiAgdGhlbWVzOiBbJ3NvbGlkJywgJ2JvcmRlcmxlc3MnLCAnbGlnaHQnLCAnb3V0bGluZSddLFxuICBERUZBVUxUX0lDT05fU0laRTogJ2RlZmF1bHQnLFxuICBERUZBVUxUX0lDT05fUE9TSVRJT046ICdsZWZ0J1xufTtcbmNvbnN0IG51bWJlcnMgPSB7fTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MsIG51bWJlcnMgfTsiLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS1pY29uYFxufTtcbmNvbnN0IHN0cmluZ3MgPSB7XG4gIFNJWkU6IFsnZXh0cmEtc21hbGwnLCAnc21hbGwnLCAnZGVmYXVsdCcsICdsYXJnZScsICdleHRyYS1sYXJnZScsICdjdXN0b20nXSxcbiAgLy8gdXNlIGluIHN2ZyB4aHJlZi4gTm8gbmVlZCB0byByZXNwb25kIHRvIHRoZSBjaGFuZ2Ugb2YgcHJlZml4Q2xzLCBhbHdheXMgY29uc3RhbnRcbiAgSUNPTl9QUkVGSVg6ICdzZW1pLWljb24tJ1xufTtcbmNvbnN0IG51bWJlcnMgPSB7fTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MsIG51bWJlcnMgfTsiLCAiaW1wb3J0IF9vbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2J1dHRvbi9jb25zdGFudHMnO1xuaW1wb3J0ICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9idXR0b24vYnV0dG9uLmNzcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZnVuY3Rpb24nO1xuaW1wb3J0IGNscyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuY29uc3QgYnRuU2l6ZXMgPSBzdHJpbmdzLnNpemVzO1xuY29uc3Qge1xuICBodG1sVHlwZXMsXG4gIGJ0blR5cGVzXG59ID0gc3RyaW5ncztcbi8vIFRPRE86IGljb24gY29uZmlndXJhdGlvblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnV0dG9uIGV4dGVuZHMgUHVyZUNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBibG9jayxcbiAgICAgICAgaHRtbFR5cGUsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIGNpcmNsZSxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIHNpemUsXG4gICAgICAgIHRoZW1lLFxuICAgICAgICB0eXBlLFxuICAgICAgICBwcmVmaXhDbHMsXG4gICAgICAgIGljb25Qb3NpdGlvblxuICAgICAgfSA9IF9hLFxuICAgICAgYXR0ciA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIiwgXCJibG9ja1wiLCBcImh0bWxUeXBlXCIsIFwibG9hZGluZ1wiLCBcImNpcmNsZVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiZGlzYWJsZWRcIiwgXCJzaXplXCIsIFwidGhlbWVcIiwgXCJ0eXBlXCIsIFwicHJlZml4Q2xzXCIsIFwiaWNvblBvc2l0aW9uXCJdKTtcbiAgICBjb25zdCBiYXNlUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgZGlzYWJsZWRcbiAgICB9LCBfb21pdChhdHRyLCBbJ3gtc2VtaS1jaGlsZHJlbi1hbGlhcyddKSksIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIHtcbiAgICAgICAgW2Ake3ByZWZpeENsc30tJHt0eXBlfWBdOiAhZGlzYWJsZWQgJiYgdHlwZSxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tZGlzYWJsZWRgXTogZGlzYWJsZWQsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXNpemUtbGFyZ2VgXTogc2l6ZSA9PT0gJ2xhcmdlJyxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tc2l6ZS1zbWFsbGBdOiBzaXplID09PSAnc21hbGwnLFxuICAgICAgICAvLyBbYCR7cHJlZml4Q2xzfS1sb2FkaW5nYF06IGxvYWRpbmcsXG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LWxpZ2h0YF06IHRoZW1lID09PSAnbGlnaHQnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1ibG9ja2BdOiBibG9jayxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tY2lyY2xlYF06IGNpcmNsZSxcbiAgICAgICAgW2Ake3ByZWZpeENsc30tYm9yZGVybGVzc2BdOiB0aGVtZSA9PT0gJ2JvcmRlcmxlc3MnLFxuICAgICAgICBbYCR7cHJlZml4Q2xzfS1vdXRsaW5lYF06IHRoZW1lID09PSBcIm91dGxpbmVcIixcbiAgICAgICAgW2Ake3ByZWZpeENsc30tJHt0eXBlfS1kaXNhYmxlZGBdOiBkaXNhYmxlZCAmJiB0eXBlXG4gICAgICB9LCBjbGFzc05hbWUpLFxuICAgICAgdHlwZTogaHRtbFR5cGUsXG4gICAgICAnYXJpYS1kaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgfSk7XG4gICAgY29uc3QgeFNlbWlQcm9wcyA9IHt9O1xuICAgIGlmICghKGNsYXNzTmFtZSAmJiBjbGFzc05hbWUuaW5jbHVkZXMoJy13aXRoLWljb24nKSkpIHtcbiAgICAgIHhTZW1pUHJvcHNbJ3gtc2VtaS1wcm9wJ10gPSB0aGlzLnByb3BzWyd4LXNlbWktY2hpbGRyZW4tYWxpYXMnXSB8fCAnY2hpbGRyZW4nO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgT2JqZWN0LmFzc2lnbih7fSwgYmFzZVByb3BzLCB7XG4gICAgICBvbkNsaWNrOiB0aGlzLnByb3BzLm9uQ2xpY2ssXG4gICAgICBvbk1vdXNlRG93bjogdGhpcy5wcm9wcy5vbk1vdXNlRG93bixcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6IGNscyhgJHtwcmVmaXhDbHN9LWNvbnRlbnRgLCB0aGlzLnByb3BzLmNvbnRlbnRDbGFzc05hbWUpLFxuICAgICAgb25DbGljazogZSA9PiBkaXNhYmxlZCAmJiBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfSwgeFNlbWlQcm9wcyksIGNoaWxkcmVuKSk7XG4gIH1cbn1cbkJ1dHRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgc2l6ZTogJ2RlZmF1bHQnLFxuICB0eXBlOiAncHJpbWFyeScsXG4gIHRoZW1lOiAnbGlnaHQnLFxuICBibG9jazogZmFsc2UsXG4gIGh0bWxUeXBlOiAnYnV0dG9uJyxcbiAgb25Nb3VzZURvd246IG5vb3AsXG4gIG9uQ2xpY2s6IG5vb3AsXG4gIG9uTW91c2VFbnRlcjogbm9vcCxcbiAgb25Nb3VzZUxlYXZlOiBub29wLFxuICBwcmVmaXhDbHM6IGNzc0NsYXNzZXMuUFJFRklYXG59O1xuQnV0dG9uLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIHByZWZpeENsczogUHJvcFR5cGVzLnN0cmluZyxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihidG5TaXplcyksXG4gIHR5cGU6IFByb3BUeXBlcy5vbmVPZihidG5UeXBlcyksXG4gIGJsb2NrOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VEb3duOiBQcm9wVHlwZXMuZnVuYyxcbiAgY2lyY2xlOiBQcm9wVHlwZXMuYm9vbCxcbiAgbG9hZGluZzogUHJvcFR5cGVzLmJvb2wsXG4gIGh0bWxUeXBlOiBQcm9wVHlwZXMub25lT2YoaHRtbFR5cGVzKSxcbiAgdGhlbWU6IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLnRoZW1lcyksXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25Nb3VzZUVudGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZUxlYXZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgJ2FyaWEtbGFiZWwnOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjb250ZW50Q2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59OyIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJhc2VCdXR0b24gZnJvbSAnLi9CdXR0b24nO1xuaW1wb3J0IEljb25CdXR0b24gZnJvbSAnLi4vaWNvbkJ1dHRvbic7XG5pbXBvcnQgeyBnZXREZWZhdWx0UHJvcHNGcm9tR2xvYmFsQ29uZmlnIH0gZnJvbSBcIi4uL191dGlsc1wiO1xuY2xhc3MgQnV0dG9uIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMpO1xuICAgIGNvbnN0IGhhc0ljb24gPSBCb29sZWFuKHByb3BzLmljb24pO1xuICAgIGNvbnN0IGlzTG9hZGluZyA9IEJvb2xlYW4ocHJvcHMubG9hZGluZyk7XG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IEJvb2xlYW4ocHJvcHMuZGlzYWJsZWQpO1xuICAgIGlmIChoYXNJY29uIHx8IGlzTG9hZGluZyAmJiAhaXNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlQnV0dG9uLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcykpO1xuICAgIH1cbiAgfVxufVxuQnV0dG9uLl9fU2VtaUNvbXBvbmVudE5hbWVfXyA9IFwiQnV0dG9uXCI7XG5CdXR0b24ucHJvcFR5cGVzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBCYXNlQnV0dG9uLnByb3BUeXBlcyksIEljb25CdXR0b24ucHJvcFR5cGVzKTtcbkJ1dHRvbi5kZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJvcHNGcm9tR2xvYmFsQ29uZmlnKEJ1dHRvbi5fX1NlbWlDb21wb25lbnROYW1lX18pO1xuQnV0dG9uLmVsZW1lbnRUeXBlID0gJ0J1dHRvbic7XG5leHBvcnQgZGVmYXVsdCBCdXR0b247IiwgImltcG9ydCBfaXNTdHJpbmcgZnJvbSBcImxvZGFzaC9pc1N0cmluZ1wiO1xuaW1wb3J0IF9vbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9jYXJkL2NvbnN0YW50cyc7XG5pbXBvcnQgJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2NhcmQvY2FyZC5jc3MnO1xuaW1wb3J0IE1ldGEgZnJvbSAnLi9tZXRhJztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgU2tlbGV0b24gZnJvbSAnLi4vc2tlbGV0b24nO1xuaW1wb3J0IFR5cG9ncmFwaHkgZnJvbSAnLi4vdHlwb2dyYXBoeSc7XG5pbXBvcnQgU3BhY2UgZnJvbSAnLi4vc3BhY2UnO1xuY29uc3QgcHJlZml4Y2xzID0gY3NzQ2xhc3Nlcy5QUkVGSVg7XG5jbGFzcyBDYXJkIGV4dGVuZHMgUHVyZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy5yZW5kZXJIZWFkZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBoZWFkZXJFeHRyYUNvbnRlbnQsXG4gICAgICAgIGhlYWRlcixcbiAgICAgICAgaGVhZGVyTGluZSxcbiAgICAgICAgaGVhZGVyU3R5bGVcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgaGVhZGVyQ2xzID0gY2xzKGAke3ByZWZpeGNsc30taGVhZGVyYCwge1xuICAgICAgICBbYCR7cHJlZml4Y2xzfS1oZWFkZXItYm9yZGVyZWRgXTogQm9vbGVhbihoZWFkZXJMaW5lKVxuICAgICAgfSk7XG4gICAgICBjb25zdCBoZWFkZXJXcmFwcGVyQ2xzID0gY2xzKGAke3ByZWZpeGNsc30taGVhZGVyLXdyYXBwZXJgKTtcbiAgICAgIGNvbnN0IHRpdGxlQ2xzID0gY2xzKGAke3ByZWZpeGNsc30taGVhZGVyLXdyYXBwZXItdGl0bGVgLCB7XG4gICAgICAgIFtgJHtwcmVmaXhjbHN9LWhlYWRlci13cmFwcGVyLXNwYWNpbmdgXTogQm9vbGVhbihoZWFkZXJFeHRyYUNvbnRlbnQpXG4gICAgICB9KTtcbiAgICAgIGlmIChoZWFkZXIgfHwgaGVhZGVyRXh0cmFDb250ZW50IHx8IHRpdGxlKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgc3R5bGU6IGhlYWRlclN0eWxlLFxuICAgICAgICAgIGNsYXNzTmFtZTogaGVhZGVyQ2xzXG4gICAgICAgIH0sIGhlYWRlciB8fCAoXG4gICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgLy8gUHJpb3JpdHkgb2YgaGVhZGVyIG92ZXIgdGl0bGUgYW5kIGhlYWRlckV4dHJhQ29udGVudFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGhlYWRlcldyYXBwZXJDbHNcbiAgICAgICAgfSwgaGVhZGVyRXh0cmFDb250ZW50ICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhjbHN9LWhlYWRlci13cmFwcGVyLWV4dHJhYCxcbiAgICAgICAgICBcIngtc2VtaS1wcm9wXCI6IFwiaGVhZGVyRXh0cmFDb250ZW50XCJcbiAgICAgICAgfSwgaGVhZGVyRXh0cmFDb250ZW50KSksIHRpdGxlICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiB0aXRsZUNsc1xuICAgICAgICB9LCBfaXNTdHJpbmcodGl0bGUpID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFR5cG9ncmFwaHkuVGl0bGUsIHtcbiAgICAgICAgICBoZWFkaW5nOiA2LFxuICAgICAgICAgIGVsbGlwc2lzOiB7XG4gICAgICAgICAgICBzaG93VG9vbHRpcDogdHJ1ZSxcbiAgICAgICAgICAgIHJvd3M6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwieC1zZW1pLXByb3BcIjogXCJ0aXRsZVwiXG4gICAgICAgIH0sIHRpdGxlKSkgOiB0aXRsZSkpKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICB0aGlzLnJlbmRlckNvdmVyID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb3ZlclxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBjb3ZlckNscyA9IGNscyhgJHtwcmVmaXhjbHN9LWNvdmVyYCk7XG4gICAgICByZXR1cm4gY292ZXIgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjb3ZlckNscyxcbiAgICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImNvdmVyXCJcbiAgICAgIH0sIGNvdmVyKSk7XG4gICAgfTtcbiAgICB0aGlzLnJlbmRlckJvZHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGJvZHlTdHlsZSxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIGFjdGlvbnMsXG4gICAgICAgIGxvYWRpbmdcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgYm9keUNscyA9IGNscyhgJHtwcmVmaXhjbHN9LWJvZHlgKTtcbiAgICAgIGNvbnN0IGFjdGlvbnNDbHMgPSBjbHMoYCR7cHJlZml4Y2xzfS1ib2R5LWFjdGlvbnNgKTtcbiAgICAgIGNvbnN0IGFjdGlvbnNJdGVtQ2xzID0gY2xzKGAke3ByZWZpeGNsc30tYm9keS1hY3Rpb25zLWl0ZW1gKTtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2tlbGV0b24uVGl0bGUsIG51bGwpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJyXCIsIG51bGwpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTa2VsZXRvbi5QYXJhZ3JhcGgsIHtcbiAgICAgICAgcm93czogM1xuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IGJvZHlTdHlsZSxcbiAgICAgICAgY2xhc3NOYW1lOiBib2R5Q2xzXG4gICAgICB9LCBjaGlsZHJlbiAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2tlbGV0b24sIHtcbiAgICAgICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyLFxuICAgICAgICBsb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgIH0sIGNoaWxkcmVuKSksIEFycmF5LmlzQXJyYXkoYWN0aW9ucykgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBhY3Rpb25zQ2xzXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTcGFjZSwge1xuICAgICAgICBzcGFjaW5nOiAxMlxuICAgICAgfSwgYWN0aW9ucy5tYXAoKGl0ZW0sIGlkeCkgPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAga2V5OiBpZHgsXG4gICAgICAgIGNsYXNzTmFtZTogYWN0aW9uc0l0ZW1DbHMsXG4gICAgICAgIFwieC1zZW1pLXByb3BcIjogYGFjdGlvbnMuJHtpZHh9YFxuICAgICAgfSwgaXRlbSkpKSkpKSk7XG4gICAgfTtcbiAgICB0aGlzLnJlbmRlckZvb3RlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZm9vdGVyLFxuICAgICAgICBmb290ZXJMaW5lLFxuICAgICAgICBmb290ZXJTdHlsZVxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBmb290ZXJDbHMgPSBjbHMoYCR7cHJlZml4Y2xzfS1mb290ZXJgLCB7XG4gICAgICAgIFtgJHtwcmVmaXhjbHN9LWZvb3Rlci1ib3JkZXJlZGBdOiBmb290ZXJMaW5lXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmb290ZXIgJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IGZvb3RlclN0eWxlLFxuICAgICAgICBjbGFzc05hbWU6IGZvb3RlckNscyxcbiAgICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImZvb3RlclwiXG4gICAgICB9LCBmb290ZXIpKTtcbiAgICB9O1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIGJvcmRlcmVkLFxuICAgICAgICBzaGFkb3dzLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICB9ID0gX2EsXG4gICAgICBvdGhlclByb3BzID0gX19yZXN0KF9hLCBbXCJib3JkZXJlZFwiLCBcInNoYWRvd3NcIiwgXCJzdHlsZVwiLCBcImNsYXNzTmFtZVwiXSk7XG4gICAgY29uc3Qgb3RoZXJzID0gX29taXQob3RoZXJQcm9wcywgWydhY3Rpb25zJywgJ2JvZHlTdHlsZScsICdjb3ZlcicsICdoZWFkZXJFeHRyYUNvbnRlbnQnLCAnZm9vdGVyJywgJ2Zvb3RlckxpbmUnLCAnZm9vdGVyU3R5bGUnLCAnaGVhZGVyJywgJ2hlYWRlckxpbmUnLCAnaGVhZGVyU3R5bGUnLCAnbG9hZGluZycsICd0aXRsZSddKTtcbiAgICBjb25zdCBjYXJkQ2xzID0gY2xzKHByZWZpeGNscywgY2xhc3NOYW1lLCB7XG4gICAgICBbYCR7cHJlZml4Y2xzfS1ib3JkZXJlZGBdOiBib3JkZXJlZCxcbiAgICAgIFtgJHtwcmVmaXhjbHN9LXNoYWRvd3NgXTogc2hhZG93cyxcbiAgICAgIFtgJHtwcmVmaXhjbHN9LXNoYWRvd3MtJHtzaGFkb3dzfWBdOiBzaGFkb3dzXG4gICAgfSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIG90aGVycywge1xuICAgICAgXCJhcmlhLWJ1c3lcIjogdGhpcy5wcm9wcy5sb2FkaW5nLFxuICAgICAgY2xhc3NOYW1lOiBjYXJkQ2xzLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSksIHRoaXMucmVuZGVySGVhZGVyKCksIHRoaXMucmVuZGVyQ292ZXIoKSwgdGhpcy5yZW5kZXJCb2R5KCksIHRoaXMucmVuZGVyRm9vdGVyKCkpO1xuICB9XG59XG5DYXJkLk1ldGEgPSBNZXRhO1xuQ2FyZC5wcm9wVHlwZXMgPSB7XG4gIGFjdGlvbnM6IFByb3BUeXBlcy5hcnJheSxcbiAgYm9keVN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBib3JkZXJlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjb3ZlcjogUHJvcFR5cGVzLm5vZGUsXG4gIGZvb3RlcjogUHJvcFR5cGVzLm5vZGUsXG4gIGZvb3RlckxpbmU6IFByb3BUeXBlcy5ib29sLFxuICBmb290ZXJTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgaGVhZGVyOiBQcm9wVHlwZXMubm9kZSxcbiAgaGVhZGVyRXh0cmFDb250ZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgaGVhZGVyTGluZTogUHJvcFR5cGVzLmJvb2wsXG4gIGhlYWRlclN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBsb2FkaW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2hhZG93czogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuU0hBRE9XUyksXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICB0aXRsZTogUHJvcFR5cGVzLm5vZGUsXG4gICdhcmlhLWxhYmVsJzogUHJvcFR5cGVzLnN0cmluZ1xufTtcbkNhcmQuZGVmYXVsdFByb3BzID0ge1xuICBib3JkZXJlZDogdHJ1ZSxcbiAgZm9vdGVyTGluZTogZmFsc2UsXG4gIGhlYWRlckxpbmU6IHRydWUsXG4gIGxvYWRpbmc6IGZhbHNlXG59O1xuZXhwb3J0IGRlZmF1bHQgQ2FyZDsiLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS1jYXJkYFxufTtcbmNvbnN0IHN0cmluZ3MgPSB7XG4gIFNIQURPV1M6IFsnaG92ZXInLCAnYWx3YXlzJ10sXG4gIFRZUEU6IFsnZ3JpZCddXG59O1xuZXhwb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9OyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3NlcyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2NhcmQvY29uc3RhbnRzJztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5jb25zdCBwcmVmaXhjbHMgPSBjc3NDbGFzc2VzLlBSRUZJWDtcbmNsYXNzIE1ldGEgZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF9hID0gdGhpcy5wcm9wcyxcbiAgICAgIHtcbiAgICAgICAgYXZhdGFyLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgdGl0bGVcbiAgICAgIH0gPSBfYSxcbiAgICAgIG90aGVycyA9IF9fcmVzdChfYSwgW1wiYXZhdGFyXCIsIFwiY2xhc3NOYW1lXCIsIFwiZGVzY3JpcHRpb25cIiwgXCJzdHlsZVwiLCBcInRpdGxlXCJdKTtcbiAgICBjb25zdCBtZXRhQ2xzID0gY2xzKGAke3ByZWZpeGNsc30tbWV0YWAsIGNsYXNzTmFtZSk7XG4gICAgY29uc3QgYXZhdGFyTm9kZSA9IGF2YXRhciAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhjbHN9LW1ldGEtYXZhdGFyYFxuICAgIH0sIGF2YXRhcikpO1xuICAgIGNvbnN0IHRpdGxlTm9kZSA9IHRpdGxlICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeGNsc30tbWV0YS13cmFwcGVyLXRpdGxlYFxuICAgIH0sIHRpdGxlKSk7XG4gICAgY29uc3QgZGVzY3JpcHRpb25Ob2RlID0gZGVzY3JpcHRpb24gJiYgKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Y2xzfS1tZXRhLXdyYXBwZXItZGVzY3JpcHRpb25gXG4gICAgfSwgZGVzY3JpcHRpb24pKTtcbiAgICBjb25zdCB3cmFwcGVyID0gdGl0bGUgfHwgZGVzY3JpcHRpb24gPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhjbHN9LW1ldGEtd3JhcHBlcmBcbiAgICB9LCB0aXRsZU5vZGUsIGRlc2NyaXB0aW9uTm9kZSkpIDogbnVsbDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7fSwgb3RoZXJzLCB7XG4gICAgICBjbGFzc05hbWU6IG1ldGFDbHMsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9KSwgYXZhdGFyTm9kZSwgd3JhcHBlcik7XG4gIH1cbn1cbk1ldGEucHJvcFR5cGVzID0ge1xuICBhdmF0YXI6IFByb3BUeXBlcy5ub2RlLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBQcm9wVHlwZXMubm9kZSxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHRpdGxlOiBQcm9wVHlwZXMubm9kZVxufTtcbmV4cG9ydCBkZWZhdWx0IE1ldGE7IiwgInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3NlcyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3NrZWxldG9uL2NvbnN0YW50cyc7XG5pbXBvcnQgJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3NrZWxldG9uL3NrZWxldG9uLmNzcyc7XG5pbXBvcnQgeyBBdmF0YXIsIEltYWdlLCBUaXRsZSwgQnV0dG9uLCBQYXJhZ3JhcGggfSBmcm9tICcuL2l0ZW0nO1xuY29uc3QgcHJlZml4Q2xzID0gY3NzQ2xhc3Nlcy5QUkVGSVg7XG5jbGFzcyBTa2VsZXRvbiBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3QgX2EgPSB0aGlzLnByb3BzLFxuICAgICAge1xuICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgYWN0aXZlLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBzdHlsZVxuICAgICAgfSA9IF9hLFxuICAgICAgb3RoZXJzID0gX19yZXN0KF9hLCBbXCJwbGFjZWhvbGRlclwiLCBcImFjdGl2ZVwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwibG9hZGluZ1wiLCBcInN0eWxlXCJdKTtcbiAgICBjb25zdCBza0NscyA9IGNscyhwcmVmaXhDbHMsIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWFjdGl2ZWBdOiBCb29sZWFuKGFjdGl2ZSlcbiAgICB9LCBjbGFzc05hbWUpO1xuICAgIGxldCBjb250ZW50O1xuICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICBjb250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGNsYXNzTmFtZTogc2tDbHMsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgb3RoZXJzLCB7XG4gICAgICAgIFwieC1zZW1pLXByb3BcIjogXCJwbGFjZWhvbGRlclwiXG4gICAgICB9KSwgcGxhY2Vob2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50ID0gY2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG59XG5Ta2VsZXRvbi5BdmF0YXIgPSBBdmF0YXI7XG5Ta2VsZXRvbi5UaXRsZSA9IFRpdGxlO1xuU2tlbGV0b24uQnV0dG9uID0gQnV0dG9uO1xuU2tlbGV0b24uUGFyYWdyYXBoID0gUGFyYWdyYXBoO1xuU2tlbGV0b24uSW1hZ2UgPSBJbWFnZTtcblNrZWxldG9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgbG9hZGluZzogdHJ1ZVxufTtcblNrZWxldG9uLnByb3BUeXBlcyA9IHtcbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcbiAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5ub2RlLFxuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsb2FkaW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlXG59O1xuZXhwb3J0IGRlZmF1bHQgU2tlbGV0b247IiwgImltcG9ydCB7IEJBU0VfQ0xBU1NfUFJFRklYIH0gZnJvbSAnLi4vYmFzZS9jb25zdGFudHMnO1xuY29uc3QgY3NzQ2xhc3NlcyA9IHtcbiAgUFJFRklYOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tc2tlbGV0b25gXG59O1xuY29uc3Qgc3RyaW5ncyA9IHt9O1xuZXhwb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9OyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNzc0NsYXNzZXMgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9za2VsZXRvbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgc3RyaW5ncyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2F2YXRhci9jb25zdGFudHMnO1xuaW1wb3J0ICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9za2VsZXRvbi9za2VsZXRvbi5jc3MnO1xuY29uc3Qgc2l6ZVNldCA9IHN0cmluZ3MuU0laRTtcbmNvbnN0IHNoYXBlU2V0ID0gc3RyaW5ncy5TSEFQRTtcbmNvbnN0IGdlbmVyYXRvciA9IHR5cGUgPT4gQmFzaWNDb21wb25lbnQgPT4gcHJvcHMgPT4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzaWNDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe1xuICB0eXBlOiB0eXBlXG59LCBwcm9wcykpO1xuY2xhc3MgR2VuZXJpYyBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3QgX2EgPSB0aGlzLnByb3BzLFxuICAgICAge1xuICAgICAgICBwcmVmaXhDbHMsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgc2hhcGVcbiAgICAgIH0gPSBfYSxcbiAgICAgIG90aGVycyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwidHlwZVwiLCBcInNpemVcIiwgXCJzaGFwZVwiXSk7XG4gICAgY29uc3QgY2xhc3NTdHJpbmcgPSBjbHMoY2xhc3NOYW1lLCBgJHtwcmVmaXhDbHN9LSR7dHlwZX1gLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS0ke3R5cGV9LSR7c2l6ZX1gXTogdHlwZS50b1VwcGVyQ2FzZSgpID09PSAnQVZBVEFSJ1xuICAgIH0sIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LSR7dHlwZX0tJHtzaGFwZX1gXTogdHlwZS50b1VwcGVyQ2FzZSgpID09PSAnQVZBVEFSJ1xuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2JywgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nXG4gICAgfSwgb3RoZXJzKSk7XG4gIH1cbn1cbkdlbmVyaWMucHJvcFR5cGVzID0ge1xuICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBwcmVmaXhDbHM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihzaXplU2V0KSxcbiAgc2hhcGU6IFByb3BUeXBlcy5vbmVPZihzaGFwZVNldClcbn07XG5HZW5lcmljLmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJlZml4Q2xzOiBjc3NDbGFzc2VzLlBSRUZJWCxcbiAgc2l6ZTogJ21lZGl1bScsXG4gIHNoYXBlOiAnY2lyY2xlJ1xufTtcbmV4cG9ydCBjb25zdCBBdmF0YXIgPSBnZW5lcmF0b3IoJ2F2YXRhcicpKEdlbmVyaWMpO1xuZXhwb3J0IGNvbnN0IEltYWdlID0gZ2VuZXJhdG9yKCdpbWFnZScpKEdlbmVyaWMpO1xuZXhwb3J0IGNvbnN0IFRpdGxlID0gZ2VuZXJhdG9yKCd0aXRsZScpKEdlbmVyaWMpO1xuZXhwb3J0IGNvbnN0IEJ1dHRvbiA9IGdlbmVyYXRvcignYnV0dG9uJykoR2VuZXJpYyk7XG5leHBvcnQgY2xhc3MgUGFyYWdyYXBoIGV4dGVuZHMgUHVyZUNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBwcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICAgIHJvd3NcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBjbGFzc1N0cmluZyA9IGNscyhjbGFzc05hbWUsIGAke3ByZWZpeENsc30tcGFyYWdyYXBoYCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIFsuLi5BcnJheShyb3dzKV0ubWFwKChlLCBpKSA9PiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICBrZXk6IGlcbiAgICB9KSkpKTtcbiAgfVxufVxuUGFyYWdyYXBoLnByb3BUeXBlcyA9IHtcbiAgcm93czogUHJvcFR5cGVzLm51bWJlcixcbiAgcHJlZml4Q2xzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuUGFyYWdyYXBoLmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJlZml4Q2xzOiBjc3NDbGFzc2VzLlBSRUZJWCxcbiAgcm93czogNFxufTsiLCAiaW1wb3J0IF9pc051bWJlciBmcm9tIFwibG9kYXNoL2lzTnVtYmVyXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcImxvZGFzaC9pc0FycmF5XCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCJsb2Rhc2gvaXNTdHJpbmdcIjtcbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBzdHJpbmdzLCBjc3NDbGFzc2VzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvc3BhY2UvY29uc3RhbnRzJztcbmltcG9ydCAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvc3BhY2Uvc3BhY2UuY3NzJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBnZXREYXRhQXR0ciBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy9nZXREYXRhQXR0cic7XG5jb25zdCBwcmVmaXhDbHMgPSBjc3NDbGFzc2VzLlBSRUZJWDtcbmNsYXNzIFNwYWNlIGV4dGVuZHMgUHVyZUNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGlsZHJlbiA9IG51bGwsXG4gICAgICBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHNwYWNpbmcsXG4gICAgICB3cmFwLFxuICAgICAgYWxpZ24sXG4gICAgICB2ZXJ0aWNhbFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGlzV3JhcCA9IHdyYXAgJiYgdmVydGljYWwgPyBmYWxzZSA6IHdyYXA7XG4gICAgY29uc3QgcmVhbFN0eWxlID0gT2JqZWN0LmFzc2lnbih7fSwgc3R5bGUpO1xuICAgIGxldCBzcGFjaW5nSG9yaXpvbnRhbFR5cGUgPSAnJztcbiAgICBsZXQgc3BhY2luZ1ZlcnRpY2FsVHlwZSA9ICcnO1xuICAgIGlmIChfaXNTdHJpbmcoc3BhY2luZykpIHtcbiAgICAgIHNwYWNpbmdIb3Jpem9udGFsVHlwZSA9IHNwYWNpbmc7XG4gICAgICBzcGFjaW5nVmVydGljYWxUeXBlID0gc3BhY2luZztcbiAgICB9IGVsc2UgaWYgKF9pc051bWJlcihzcGFjaW5nKSkge1xuICAgICAgcmVhbFN0eWxlLnJvd0dhcCA9IHNwYWNpbmc7XG4gICAgICByZWFsU3R5bGUuY29sdW1uR2FwID0gc3BhY2luZztcbiAgICB9IGVsc2UgaWYgKF9pc0FycmF5KHNwYWNpbmcpKSB7XG4gICAgICBpZiAoX2lzU3RyaW5nKHNwYWNpbmdbMF0pKSB7XG4gICAgICAgIHNwYWNpbmdIb3Jpem9udGFsVHlwZSA9IHNwYWNpbmdbMF07XG4gICAgICB9IGVsc2UgaWYgKF9pc051bWJlcihzcGFjaW5nWzBdKSkge1xuICAgICAgICByZWFsU3R5bGUuY29sdW1uR2FwID0gYCR7c3BhY2luZ1swXX1weGA7XG4gICAgICB9XG4gICAgICBpZiAoX2lzU3RyaW5nKHNwYWNpbmdbMV0pKSB7XG4gICAgICAgIHNwYWNpbmdWZXJ0aWNhbFR5cGUgPSBzcGFjaW5nWzFdO1xuICAgICAgfSBlbHNlIGlmIChfaXNOdW1iZXIoc3BhY2luZ1sxXSkpIHtcbiAgICAgICAgcmVhbFN0eWxlLnJvd0dhcCA9IGAke3NwYWNpbmdbMV19cHhgO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWVzID0gY2xzKHByZWZpeENscywgY2xhc3NOYW1lLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1hbGlnbi0ke2FsaWdufWBdOiBhbGlnbixcbiAgICAgIFtgJHtwcmVmaXhDbHN9LXZlcnRpY2FsYF06IHZlcnRpY2FsLFxuICAgICAgW2Ake3ByZWZpeENsc30taG9yaXpvbnRhbGBdOiAhdmVydGljYWwsXG4gICAgICBbYCR7cHJlZml4Q2xzfS13cmFwYF06IGlzV3JhcCxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LXRpZ2h0LWhvcml6b250YWxgXTogc3BhY2luZ0hvcml6b250YWxUeXBlID09PSBzdHJpbmdzLlNQQUNJTkdfVElHSFQsXG4gICAgICBbYCR7cHJlZml4Q2xzfS10aWdodC12ZXJ0aWNhbGBdOiBzcGFjaW5nVmVydGljYWxUeXBlID09PSBzdHJpbmdzLlNQQUNJTkdfVElHSFQsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1tZWRpdW0taG9yaXpvbnRhbGBdOiBzcGFjaW5nSG9yaXpvbnRhbFR5cGUgPT09IHN0cmluZ3MuU1BBQ0lOR19NRURJVU0sXG4gICAgICBbYCR7cHJlZml4Q2xzfS1tZWRpdW0tdmVydGljYWxgXTogc3BhY2luZ1ZlcnRpY2FsVHlwZSA9PT0gc3RyaW5ncy5TUEFDSU5HX01FRElVTSxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWxvb3NlLWhvcml6b250YWxgXTogc3BhY2luZ0hvcml6b250YWxUeXBlID09PSBzdHJpbmdzLlNQQUNJTkdfTE9PU0UsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1sb29zZS12ZXJ0aWNhbGBdOiBzcGFjaW5nVmVydGljYWxUeXBlID09PSBzdHJpbmdzLlNQQUNJTkdfTE9PU0VcbiAgICB9KTtcbiAgICBjb25zdCBjaGlsZHJlbk5vZGVzID0gZmxhdHRlbihjaGlsZHJlbik7XG4gICAgY29uc3QgZGF0YUF0dHJpYnV0ZXMgPSBnZXREYXRhQXR0cih0aGlzLnByb3BzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7fSwgZGF0YUF0dHJpYnV0ZXMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyxcbiAgICAgIHN0eWxlOiByZWFsU3R5bGUsXG4gICAgICBcIngtc2VtaS1wcm9wXCI6IFwiY2hpbGRyZW5cIlxuICAgIH0pLCBjaGlsZHJlbk5vZGVzKTtcbiAgfVxufVxuU3BhY2UucHJvcFR5cGVzID0ge1xuICB3cmFwOiBQcm9wVHlwZXMuYm9vbCxcbiAgYWxpZ246IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLkFMSUdOX1NFVCksXG4gIHZlcnRpY2FsOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3BhY2luZzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmFycmF5XSksXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcblNwYWNlLmRlZmF1bHRQcm9wcyA9IHtcbiAgdmVydGljYWw6IGZhbHNlLFxuICB3cmFwOiBmYWxzZSxcbiAgc3BhY2luZzogJ3RpZ2h0JyxcbiAgYWxpZ246ICdjZW50ZXInXG59O1xuZXhwb3J0IGRlZmF1bHQgU3BhY2U7IiwgImltcG9ydCB7IEJBU0VfQ0xBU1NfUFJFRklYIH0gZnJvbSAnLi4vYmFzZS9jb25zdGFudHMnO1xuY29uc3QgY3NzQ2xhc3NlcyA9IHtcbiAgUFJFRklYOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tc3BhY2VgXG59O1xuY29uc3Qgc3RyaW5ncyA9IHtcbiAgQUxJR05fU0VUOiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnYmFzZWxpbmUnXSxcbiAgU1BBQ0lOR19MT09TRTogJ2xvb3NlJyxcbiAgU1BBQ0lOR19NRURJVU06ICdtZWRpdW0nLFxuICBTUEFDSU5HX1RJR0hUOiAndGlnaHQnXG59O1xuZXhwb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9OyIsICJpbXBvcnQgUmVhY3QsIHsgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5jb25zdCBSRUFDVF9GUkFHTUVOVF9UWVBFID0gJ1N5bWJvbChyZWFjdC5mcmFnbWVudCknO1xuLyoqXG4gKiBGbGF0dGVuIHRoZSBjaGlsZHJlbiBhbmQgcmV0dXJuIHRoZSBwcm9jZXNzZWQgZGF0YVxuICovXG5leHBvcnQgY29uc3QgZmxhdHRlbiA9IGNoaWxkcmVuID0+IHtcbiAgbGV0IHJlcyA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICByZXMgPSByZXMuY29uY2F0KGZsYXR0ZW4oY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChjaGlsZCkgJiYgY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLnRvU3RyaW5nKCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgY2hpbGQucHJvcHMpIHtcbiAgICAgIHJlcyA9IHJlcy5jb25jYXQoZmxhdHRlbihjaGlsZC5wcm9wcy5jaGlsZHJlbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlcztcbn07IiwgImV4cG9ydCBpbnRlcmZhY2UgQ2FjaGUge1xuICBoYXM6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuO1xuICBzZXQ6IChrZXk6IGFueSwgdmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgZ2V0OiAoa2V5OiBhbnkpID0+IGFueTtcbn1cblxuY29uc3QgeyB0b1N0cmluZzogdG9TdHJpbmdGdW5jdGlvbiB9ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuY29uc3QgeyBjcmVhdGUgfSA9IE9iamVjdDtcbmNvbnN0IHsgdG9TdHJpbmc6IHRvU3RyaW5nT2JqZWN0IH0gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2MgRmFsbGJhY2sgY2FjaGUgZm9yIHdoZW4gV2Vha01hcCBpcyBub3QgbmF0aXZlbHkgc3VwcG9ydGVkXG4gKi9cbmNsYXNzIExlZ2FjeUNhY2hlIHtcbiAgcHJpdmF0ZSBfa2V5czogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBfdmFsdWVzOiBhbnlbXSA9IFtdO1xuXG4gIGhhcyhrZXk6IGFueSkge1xuICAgIHJldHVybiAhIX50aGlzLl9rZXlzLmluZGV4T2Yoa2V5KTtcbiAgfVxuXG4gIGdldChrZXk6IGFueSkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXNbdGhpcy5fa2V5cy5pbmRleE9mKGtleSldO1xuICB9XG5cbiAgc2V0KGtleTogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgdGhpcy5fdmFsdWVzLnB1c2godmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlTGVnYWN5KCk6IENhY2hlIHtcbiAgcmV0dXJuIG5ldyBMZWdhY3lDYWNoZSgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDYWNoZU1vZGVybigpOiBDYWNoZSB7XG4gIHJldHVybiBuZXcgV2Vha01hcCgpO1xufVxuXG4vKipcbiAqIEdldCBhIG5ldyBjYWNoZSBvYmplY3QgdG8gcHJldmVudCBjaXJjdWxhciByZWZlcmVuY2VzLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQ2FjaGUgPVxuICB0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCcgPyBjcmVhdGVDYWNoZU1vZGVybiA6IGNyZWF0ZUNhY2hlTGVnYWN5O1xuXG4vKipcbiAqIEdldCBhbiBlbXB0eSB2ZXJzaW9uIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBwcm90b3R5cGUgaXQgaGFzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xlYW5DbG9uZShwcm90b3R5cGU6IGFueSk6IGFueSB7XG4gIGlmICghcHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIGNvbnN0IENvbnN0cnVjdG9yID0gcHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG4gIGlmIChDb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgcmV0dXJuIHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSA/IHt9IDogY3JlYXRlKHByb3RvdHlwZSk7XG4gIH1cblxuICBpZiAoXG4gICAgQ29uc3RydWN0b3IgJiZcbiAgICB+dG9TdHJpbmdGdW5jdGlvbi5jYWxsKENvbnN0cnVjdG9yKS5pbmRleE9mKCdbbmF0aXZlIGNvZGVdJylcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlKHByb3RvdHlwZSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlZ0V4cEZsYWdzTGVnYWN5KHJlZ0V4cDogUmVnRXhwKTogc3RyaW5nIHtcbiAgbGV0IGZsYWdzID0gJyc7XG5cbiAgaWYgKHJlZ0V4cC5nbG9iYWwpIHtcbiAgICBmbGFncyArPSAnZyc7XG4gIH1cblxuICBpZiAocmVnRXhwLmlnbm9yZUNhc2UpIHtcbiAgICBmbGFncyArPSAnaSc7XG4gIH1cblxuICBpZiAocmVnRXhwLm11bHRpbGluZSkge1xuICAgIGZsYWdzICs9ICdtJztcbiAgfVxuXG4gIGlmIChyZWdFeHAudW5pY29kZSkge1xuICAgIGZsYWdzICs9ICd1JztcbiAgfVxuXG4gIGlmIChyZWdFeHAuc3RpY2t5KSB7XG4gICAgZmxhZ3MgKz0gJ3knO1xuICB9XG5cbiAgcmV0dXJuIGZsYWdzO1xufVxuXG5mdW5jdGlvbiBnZXRSZWdFeHBGbGFnc01vZGVybihyZWdFeHA6IFJlZ0V4cCk6IHN0cmluZyB7XG4gIHJldHVybiByZWdFeHAuZmxhZ3M7XG59XG5cbi8qKlxuICogR2V0IHRoZSBmbGFncyB0byBhcHBseSB0byB0aGUgY29waWVkIHJlZ2V4cC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlZ0V4cEZsYWdzID1cbiAgL3Rlc3QvZy5mbGFncyA9PT0gJ2cnID8gZ2V0UmVnRXhwRmxhZ3NNb2Rlcm4gOiBnZXRSZWdFeHBGbGFnc0xlZ2FjeTtcblxuZnVuY3Rpb24gZ2V0VGFnTGVnYWN5KHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICBjb25zdCB0eXBlID0gdG9TdHJpbmdPYmplY3QuY2FsbCh2YWx1ZSk7XG5cbiAgcmV0dXJuIHR5cGUuc3Vic3RyaW5nKDgsIHR5cGUubGVuZ3RoIC0gMSk7XG59XG5cbmZ1bmN0aW9uIGdldFRhZ01vZGVybih2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgZ2V0VGFnTGVnYWN5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHRhZyBvZiB0aGUgdmFsdWUgcGFzc2VkLCBzbyB0aGF0IHRoZSBjb3JyZWN0IGNvcGllciBjYW4gYmUgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFRhZyA9XG4gIHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnID8gZ2V0VGFnTW9kZXJuIDogZ2V0VGFnTGVnYWN5O1xuIiwgImltcG9ydCB7IGdldENsZWFuQ2xvbmUsIGdldFJlZ0V4cEZsYWdzIH0gZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCB0eXBlIHsgQ2FjaGUgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxDb3BpZXI8VmFsdWU+ID0gKHZhbHVlOiBWYWx1ZSwgc3RhdGU6IFN0YXRlKSA9PiBWYWx1ZTtcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZSB7XG4gIENvbnN0cnVjdG9yOiBhbnk7XG4gIGNhY2hlOiBDYWNoZTtcbiAgY29waWVyOiBJbnRlcm5hbENvcGllcjxhbnk+O1xuICBwcm90b3R5cGU6IGFueTtcbn1cblxuY29uc3Qge1xuICBkZWZpbmVQcm9wZXJ0eSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG59ID0gT2JqZWN0O1xuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSwgcHJvcGVydHlJc0VudW1lcmFibGUgfSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbmNvbnN0IFNVUFBPUlRTX1NZTUJPTCA9IHR5cGVvZiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbic7XG5cbmZ1bmN0aW9uIGdldFN0cmljdFByb3BlcnRpZXNNb2Rlcm4ob2JqZWN0OiBhbnkpOiBBcnJheTxzdHJpbmcgfCBzeW1ib2w+IHtcbiAgcmV0dXJuIChnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkgYXMgQXJyYXk8c3RyaW5nIHwgc3ltYm9sPikuY29uY2F0KFxuICAgIGdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpXG4gICk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJpdGVzIHVzZWQgd2hlbiBjb3B5aW5nIG9iamVjdHMgc3RyaWN0bHkuIFRoaXMgaW5jbHVkZXMgYm90aCBrZXlzIGFuZCBzeW1ib2xzLlxuICovXG5jb25zdCBnZXRTdHJpY3RQcm9wZXJ0aWVzID0gU1VQUE9SVFNfU1lNQk9MXG4gID8gZ2V0U3RyaWN0UHJvcGVydGllc01vZGVyblxuICA6IGdldE93blByb3BlcnR5TmFtZXM7XG5cbi8qKlxuICogU3RyaWNsdHkgY29weSBhbGwgcHJvcGVydGllcyBjb250YWluZWQgb24gdGhlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY29weU93blByb3BlcnRpZXNTdHJpY3Q8VmFsdWU+KFxuICB2YWx1ZTogVmFsdWUsXG4gIGNsb25lOiBWYWx1ZSxcbiAgc3RhdGU6IFN0YXRlXG4pOiBWYWx1ZSB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBnZXRTdHJpY3RQcm9wZXJ0aWVzKHZhbHVlKTtcblxuICBmb3IgKFxuICAgIGxldCBpbmRleCA9IDAsIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoLCBwcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgICBpbmRleCA8IGxlbmd0aDtcbiAgICArK2luZGV4XG4gICkge1xuICAgIHByb3BlcnR5ID0gcHJvcGVydGllc1tpbmRleF07XG5cbiAgICBpZiAocHJvcGVydHkgPT09ICdjYWxsZWUnIHx8IHByb3BlcnR5ID09PSAnY2FsbGVyJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwgcHJvcGVydHkpO1xuXG4gICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAvLyBJbiBleHRyYSBlZGdlIGNhc2VzIHdoZXJlIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaXZlZCwgZmFsbCBiYWNrIHRvXG4gICAgICAvLyB0aGUgbG9vc2UgYXNzaWdubWVudC5cbiAgICAgIChjbG9uZSBhcyBhbnkpW3Byb3BlcnR5XSA9IHN0YXRlLmNvcGllcigodmFsdWUgYXMgYW55KVtwcm9wZXJ0eV0sIHN0YXRlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgY2xvbmUgdGhlIHZhbHVlIGlmIGFjdHVhbGx5IGEgdmFsdWUsIG5vdCBhIGdldHRlciAvIHNldHRlci5cbiAgICBpZiAoIWRlc2NyaXB0b3IuZ2V0ICYmICFkZXNjcmlwdG9yLnNldCkge1xuICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IHN0YXRlLmNvcGllcihkZXNjcmlwdG9yLnZhbHVlLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGNsb25lLCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFRlZSBhYm92ZSBjYW4gZmFpbCBvbiBub2RlIGluIGVkZ2UgY2FzZXMsIHNvIGZhbGwgYmFjayB0byB0aGUgbG9vc2UgYXNzaWdubWVudC5cbiAgICAgIChjbG9uZSBhcyBhbnkpW3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG4vKipcbiAqIERlZXBseSBjb3B5IHRoZSBpbmRleGVkIHZhbHVlcyBpbiB0aGUgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5QXJyYXlMb29zZShhcnJheTogYW55W10sIHN0YXRlOiBTdGF0ZSkge1xuICBjb25zdCBjbG9uZSA9IG5ldyBzdGF0ZS5Db25zdHJ1Y3RvcigpO1xuXG4gIC8vIHNldCBpbiB0aGUgY2FjaGUgaW1tZWRpYXRlbHkgdG8gYmUgYWJsZSB0byByZXVzZSB0aGUgb2JqZWN0IHJlY3Vyc2l2ZWx5XG4gIHN0YXRlLmNhY2hlLnNldChhcnJheSwgY2xvbmUpO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgKytpbmRleCkge1xuICAgIGNsb25lW2luZGV4XSA9IHN0YXRlLmNvcGllcihhcnJheVtpbmRleF0sIHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cblxuLyoqXG4gKiBEZWVwbHkgY29weSB0aGUgaW5kZXhlZCB2YWx1ZXMgaW4gdGhlIGFycmF5LCBhcyB3ZWxsIGFzIGFueSBjdXN0b20gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlBcnJheVN0cmljdDxWYWx1ZSBleHRlbmRzIGFueVtdPihcbiAgYXJyYXk6IFZhbHVlLFxuICBzdGF0ZTogU3RhdGVcbikge1xuICBjb25zdCBjbG9uZSA9IG5ldyBzdGF0ZS5Db25zdHJ1Y3RvcigpIGFzIFZhbHVlO1xuXG4gIC8vIHNldCBpbiB0aGUgY2FjaGUgaW1tZWRpYXRlbHkgdG8gYmUgYWJsZSB0byByZXVzZSB0aGUgb2JqZWN0IHJlY3Vyc2l2ZWx5XG4gIHN0YXRlLmNhY2hlLnNldChhcnJheSwgY2xvbmUpO1xuXG4gIHJldHVybiBjb3B5T3duUHJvcGVydGllc1N0cmljdChhcnJheSwgY2xvbmUsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgQXJyYXlCdWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5QXJyYXlCdWZmZXI8VmFsdWUgZXh0ZW5kcyBBcnJheUJ1ZmZlcj4oXG4gIGFycmF5QnVmZmVyOiBWYWx1ZSxcbiAgX3N0YXRlOiBTdGF0ZVxuKTogVmFsdWUge1xuICByZXR1cm4gYXJyYXlCdWZmZXIuc2xpY2UoMCkgYXMgVmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IEJsb2Igd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weUJsb2I8VmFsdWUgZXh0ZW5kcyBCbG9iPihcbiAgYmxvYjogVmFsdWUsXG4gIF9zdGF0ZTogU3RhdGVcbik6IFZhbHVlIHtcbiAgcmV0dXJuIGJsb2Iuc2xpY2UoMCwgYmxvYi5zaXplLCBibG9iLnR5cGUpIGFzIFZhbHVlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBEYXRhVmlldyB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5RGF0YVZpZXc8VmFsdWUgZXh0ZW5kcyBEYXRhVmlldz4oXG4gIGRhdGFWaWV3OiBWYWx1ZSxcbiAgc3RhdGU6IFN0YXRlXG4pOiBWYWx1ZSB7XG4gIHJldHVybiBuZXcgc3RhdGUuQ29uc3RydWN0b3IoY29weUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlciwgc3RhdGUpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgRGF0ZSBiYXNlZCBvbiB0aGUgdGltZSBvZiB0aGUgb3JpZ2luYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5RGF0ZTxWYWx1ZSBleHRlbmRzIERhdGU+KGRhdGU6IFZhbHVlLCBzdGF0ZTogU3RhdGUpOiBWYWx1ZSB7XG4gIHJldHVybiBuZXcgc3RhdGUuQ29uc3RydWN0b3IoZGF0ZS5nZXRUaW1lKCkpO1xufVxuXG4vKipcbiAqIERlZXBseSBjb3B5IHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weU1hcExvb3NlPFZhbHVlIGV4dGVuZHMgTWFwPGFueSwgYW55Pj4oXG4gIG1hcDogVmFsdWUsXG4gIHN0YXRlOiBTdGF0ZVxuKTogVmFsdWUge1xuICBjb25zdCBjbG9uZSA9IG5ldyBzdGF0ZS5Db25zdHJ1Y3RvcigpIGFzIFZhbHVlO1xuXG4gIC8vIHNldCBpbiB0aGUgY2FjaGUgaW1tZWRpYXRlbHkgdG8gYmUgYWJsZSB0byByZXVzZSB0aGUgb2JqZWN0IHJlY3Vyc2l2ZWx5XG4gIHN0YXRlLmNhY2hlLnNldChtYXAsIGNsb25lKTtcblxuICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGNsb25lLnNldChrZXksIHN0YXRlLmNvcGllcih2YWx1ZSwgc3RhdGUpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG4vKipcbiAqIERlZXBseSBjb3B5IHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsLCBhcyB3ZWxsIGFzIGFueSBjdXN0b20gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlNYXBTdHJpY3Q8VmFsdWUgZXh0ZW5kcyBNYXA8YW55LCBhbnk+PihcbiAgbWFwOiBWYWx1ZSxcbiAgc3RhdGU6IFN0YXRlXG4pIHtcbiAgcmV0dXJuIGNvcHlPd25Qcm9wZXJ0aWVzU3RyaWN0KG1hcCwgY29weU1hcExvb3NlKG1hcCwgc3RhdGUpLCBzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNvcHlPYmplY3RMb29zZUxlZ2FjeTxWYWx1ZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBvYmplY3Q6IFZhbHVlLFxuICBzdGF0ZTogU3RhdGVcbik6IFZhbHVlIHtcbiAgY29uc3QgY2xvbmU6IGFueSA9IGdldENsZWFuQ2xvbmUoc3RhdGUucHJvdG90eXBlKTtcblxuICAvLyBzZXQgaW4gdGhlIGNhY2hlIGltbWVkaWF0ZWx5IHRvIGJlIGFibGUgdG8gcmV1c2UgdGhlIG9iamVjdCByZWN1cnNpdmVseVxuICBzdGF0ZS5jYWNoZS5zZXQob2JqZWN0LCBjbG9uZSk7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICBjbG9uZVtrZXldID0gc3RhdGUuY29waWVyKG9iamVjdFtrZXldLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG5mdW5jdGlvbiBjb3B5T2JqZWN0TG9vc2VNb2Rlcm48VmFsdWUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqZWN0OiBWYWx1ZSxcbiAgc3RhdGU6IFN0YXRlXG4pOiBWYWx1ZSB7XG4gIGNvbnN0IGNsb25lID0gZ2V0Q2xlYW5DbG9uZShzdGF0ZS5wcm90b3R5cGUpO1xuXG4gIC8vIHNldCBpbiB0aGUgY2FjaGUgaW1tZWRpYXRlbHkgdG8gYmUgYWJsZSB0byByZXVzZSB0aGUgb2JqZWN0IHJlY3Vyc2l2ZWx5XG4gIHN0YXRlLmNhY2hlLnNldChvYmplY3QsIGNsb25lKTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgIGNsb25lW2tleV0gPSBzdGF0ZS5jb3BpZXIob2JqZWN0W2tleV0sIHN0YXRlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG5cbiAgZm9yIChcbiAgICBsZXQgaW5kZXggPSAwLCBsZW5ndGggPSBzeW1ib2xzLmxlbmd0aCwgc3ltYm9sO1xuICAgIGluZGV4IDwgbGVuZ3RoO1xuICAgICsraW5kZXhcbiAgKSB7XG4gICAgc3ltYm9sID0gc3ltYm9sc1tpbmRleF07XG5cbiAgICBpZiAocHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCkpIHtcbiAgICAgIGNsb25lW3N5bWJvbF0gPSBzdGF0ZS5jb3BpZXIoKG9iamVjdCBhcyBhbnkpW3N5bWJvbF0sIHN0YXRlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2xvbmU7XG59XG5cbi8qKlxuICogRGVlcGx5IGNvcHkgdGhlIHByb3BlcnRpZXMgKGtleXMgYW5kIHN5bWJvbHMpIGFuZCB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsLlxuICovXG5leHBvcnQgY29uc3QgY29weU9iamVjdExvb3NlID0gU1VQUE9SVFNfU1lNQk9MXG4gID8gY29weU9iamVjdExvb3NlTW9kZXJuXG4gIDogY29weU9iamVjdExvb3NlTGVnYWN5O1xuXG4vKipcbiAqIERlZXBseSBjb3B5IHRoZSBwcm9wZXJ0aWVzIChrZXlzIGFuZCBzeW1ib2xzKSBhbmQgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbCwgYXMgd2VsbFxuICogYXMgYW55IGhpZGRlbiBvciBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weU9iamVjdFN0cmljdDxWYWx1ZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBvYmplY3Q6IFZhbHVlLFxuICBzdGF0ZTogU3RhdGVcbik6IFZhbHVlIHtcbiAgY29uc3QgY2xvbmUgPSBnZXRDbGVhbkNsb25lKHN0YXRlLnByb3RvdHlwZSk7XG5cbiAgLy8gc2V0IGluIHRoZSBjYWNoZSBpbW1lZGlhdGVseSB0byBiZSBhYmxlIHRvIHJldXNlIHRoZSBvYmplY3QgcmVjdXJzaXZlbHlcbiAgc3RhdGUuY2FjaGUuc2V0KG9iamVjdCwgY2xvbmUpO1xuXG4gIHJldHVybiBjb3B5T3duUHJvcGVydGllc1N0cmljdChvYmplY3QsIGNsb25lLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHByaW1pdGl2ZSB3cmFwcGVyIGZyb20gdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlQcmltaXRpdmVXcmFwcGVyPFxuICAvLyBTcGVjaWZpY2FsbHkgdXNlIHRoZSBvYmplY3QgY29uc3RydWN0b3IgdHlwZXNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgVmFsdWUgZXh0ZW5kcyBCb29sZWFuIHwgTnVtYmVyIHwgU3RyaW5nXG4+KHByaW1pdGl2ZU9iamVjdDogVmFsdWUsIHN0YXRlOiBTdGF0ZSk6IFZhbHVlIHtcbiAgcmV0dXJuIG5ldyBzdGF0ZS5Db25zdHJ1Y3RvcihwcmltaXRpdmVPYmplY3QudmFsdWVPZigpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgUmVnRXhwIGJhc2VkIG9uIHRoZSB2YWx1ZSBhbmQgZmxhZ3Mgb2YgdGhlIG9yaWdpbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVJlZ0V4cDxWYWx1ZSBleHRlbmRzIFJlZ0V4cD4oXG4gIHJlZ0V4cDogVmFsdWUsXG4gIHN0YXRlOiBTdGF0ZVxuKTogVmFsdWUge1xuICBjb25zdCBjbG9uZSA9IG5ldyBzdGF0ZS5Db25zdHJ1Y3RvcihcbiAgICByZWdFeHAuc291cmNlLFxuICAgIGdldFJlZ0V4cEZsYWdzKHJlZ0V4cClcbiAgKSBhcyBWYWx1ZTtcblxuICBjbG9uZS5sYXN0SW5kZXggPSByZWdFeHAubGFzdEluZGV4O1xuXG4gIHJldHVybiBjbG9uZTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIChhbiBpZGVudGl0eSBmdW5jdGlvbikuXG4gKlxuICogQG5vdGVcbiAqIFRIaXMgaXMgdXNlZCBmb3Igb2JqZWN0cyB0aGF0IGNhbm5vdCBiZSBjb3BpZWQsIHN1Y2ggYXMgV2Vha01hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlTZWxmPFZhbHVlPih2YWx1ZTogVmFsdWUsIF9zdGF0ZTogU3RhdGUpOiBWYWx1ZSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBEZWVwbHkgY29weSB0aGUgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlTZXRMb29zZTxWYWx1ZSBleHRlbmRzIFNldDxhbnk+PihcbiAgc2V0OiBWYWx1ZSxcbiAgc3RhdGU6IFN0YXRlXG4pOiBWYWx1ZSB7XG4gIGNvbnN0IGNsb25lID0gbmV3IHN0YXRlLkNvbnN0cnVjdG9yKCkgYXMgVmFsdWU7XG5cbiAgLy8gc2V0IGluIHRoZSBjYWNoZSBpbW1lZGlhdGVseSB0byBiZSBhYmxlIHRvIHJldXNlIHRoZSBvYmplY3QgcmVjdXJzaXZlbHlcbiAgc3RhdGUuY2FjaGUuc2V0KHNldCwgY2xvbmUpO1xuXG4gIHNldC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgIGNsb25lLmFkZChzdGF0ZS5jb3BpZXIodmFsdWUsIHN0YXRlKSk7XG4gIH0pO1xuXG4gIHJldHVybiBjbG9uZTtcbn1cblxuLyoqXG4gKiBEZWVwbHkgY29weSB0aGUgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbCwgYXMgd2VsbCBhcyBhbnkgY3VzdG9tIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5U2V0U3RyaWN0PFZhbHVlIGV4dGVuZHMgU2V0PGFueT4+KFxuICBzZXQ6IFZhbHVlLFxuICBzdGF0ZTogU3RhdGVcbik6IFZhbHVlIHtcbiAgcmV0dXJuIGNvcHlPd25Qcm9wZXJ0aWVzU3RyaWN0KHNldCwgY29weVNldExvb3NlKHNldCwgc3RhdGUpLCBzdGF0ZSk7XG59XG4iLCAiaW1wb3J0IHtcbiAgY29weUFycmF5QnVmZmVyLFxuICBjb3B5QXJyYXlMb29zZSxcbiAgY29weUFycmF5U3RyaWN0LFxuICBjb3B5QmxvYixcbiAgY29weURhdGFWaWV3LFxuICBjb3B5RGF0ZSxcbiAgY29weU1hcExvb3NlLFxuICBjb3B5TWFwU3RyaWN0LFxuICBjb3B5T2JqZWN0TG9vc2UsXG4gIGNvcHlPYmplY3RTdHJpY3QsXG4gIGNvcHlQcmltaXRpdmVXcmFwcGVyLFxuICBjb3B5UmVnRXhwLFxuICBjb3B5U2VsZixcbiAgY29weVNldExvb3NlLFxuICBjb3B5U2V0U3RyaWN0LFxufSBmcm9tICcuL2NvcGllcic7XG5pbXBvcnQgeyBjcmVhdGVDYWNoZSwgZ2V0VGFnIH0gZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxDb3BpZXIsIFN0YXRlIH0gZnJvbSAnLi9jb3BpZXInO1xuXG5leHBvcnQgdHlwZSB7IFN0YXRlIH0gZnJvbSAnLi9jb3BpZXInO1xuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBhc3NpZ24gfSA9IE9iamVjdDtcbmNvbnN0IGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8ICgob2JqKSA9PiBvYmouX19wcm90b19fKVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUNvcGllck9wdGlvbnMge1xuICBhcnJheT86IEludGVybmFsQ29waWVyPGFueVtdPjtcbiAgYXJyYXlCdWZmZXI/OiBJbnRlcm5hbENvcGllcjxBcnJheUJ1ZmZlcj47XG4gIGJsb2I/OiBJbnRlcm5hbENvcGllcjxCbG9iPjtcbiAgZGF0YVZpZXc/OiBJbnRlcm5hbENvcGllcjxEYXRhVmlldz47XG4gIGRhdGU/OiBJbnRlcm5hbENvcGllcjxEYXRlPjtcbiAgZXJyb3I/OiBJbnRlcm5hbENvcGllcjxhbnk+O1xuICBtYXA/OiBJbnRlcm5hbENvcGllcjxNYXA8YW55LCBhbnk+PjtcbiAgb2JqZWN0PzogSW50ZXJuYWxDb3BpZXI8UmVjb3JkPHN0cmluZywgYW55Pj47XG4gIHJlZ0V4cD86IEludGVybmFsQ29waWVyPFJlZ0V4cD47XG4gIHNldD86IEludGVybmFsQ29waWVyPFNldDxhbnk+Pjtcbn1cblxuY29uc3QgREVGQVVMVF9MT09TRV9PUFRJT05TOiBSZXF1aXJlZDxDcmVhdGVDb3BpZXJPcHRpb25zPiA9IHtcbiAgYXJyYXk6IGNvcHlBcnJheUxvb3NlLFxuICBhcnJheUJ1ZmZlcjogY29weUFycmF5QnVmZmVyLFxuICBibG9iOiBjb3B5QmxvYixcbiAgZGF0YVZpZXc6IGNvcHlEYXRhVmlldyxcbiAgZGF0ZTogY29weURhdGUsXG4gIGVycm9yOiBjb3B5U2VsZixcbiAgbWFwOiBjb3B5TWFwTG9vc2UsXG4gIG9iamVjdDogY29weU9iamVjdExvb3NlLFxuICByZWdFeHA6IGNvcHlSZWdFeHAsXG4gIHNldDogY29weVNldExvb3NlLFxufTtcbmNvbnN0IERFRkFVTFRfU1RSSUNUX09QVElPTlM6IFJlcXVpcmVkPENyZWF0ZUNvcGllck9wdGlvbnM+ID0gYXNzaWduKFxuICB7fSxcbiAgREVGQVVMVF9MT09TRV9PUFRJT05TLFxuICB7XG4gICAgYXJyYXk6IGNvcHlBcnJheVN0cmljdCxcbiAgICBtYXA6IGNvcHlNYXBTdHJpY3QsXG4gICAgb2JqZWN0OiBjb3B5T2JqZWN0U3RyaWN0LFxuICAgIHNldDogY29weVNldFN0cmljdCxcbiAgfVxuKTtcblxuLyoqXG4gKiBHZXQgdGhlIGNvcGllcnMgdXNlZCBmb3IgZWFjaCBzcGVjaWZpYyBvYmplY3QgdGFnLlxuICovXG5mdW5jdGlvbiBnZXRUYWdTcGVjaWZpY0NvcGllcnMoXG4gIG9wdGlvbnM6IFJlcXVpcmVkPENyZWF0ZUNvcGllck9wdGlvbnM+XG4pOiBSZWNvcmQ8c3RyaW5nLCBJbnRlcm5hbENvcGllcjxhbnk+PiB7XG4gIHJldHVybiB7XG4gICAgQXJndW1lbnRzOiBvcHRpb25zLm9iamVjdCxcbiAgICBBcnJheTogb3B0aW9ucy5hcnJheSxcbiAgICBBcnJheUJ1ZmZlcjogb3B0aW9ucy5hcnJheUJ1ZmZlcixcbiAgICBCbG9iOiBvcHRpb25zLmJsb2IsXG4gICAgQm9vbGVhbjogY29weVByaW1pdGl2ZVdyYXBwZXIsXG4gICAgRGF0YVZpZXc6IG9wdGlvbnMuZGF0YVZpZXcsXG4gICAgRGF0ZTogb3B0aW9ucy5kYXRlLFxuICAgIEVycm9yOiBvcHRpb25zLmVycm9yLFxuICAgIEZsb2F0MzJBcnJheTogb3B0aW9ucy5hcnJheUJ1ZmZlcixcbiAgICBGbG9hdDY0QXJyYXk6IG9wdGlvbnMuYXJyYXlCdWZmZXIsXG4gICAgSW50OEFycmF5OiBvcHRpb25zLmFycmF5QnVmZmVyLFxuICAgIEludDE2QXJyYXk6IG9wdGlvbnMuYXJyYXlCdWZmZXIsXG4gICAgSW50MzJBcnJheTogb3B0aW9ucy5hcnJheUJ1ZmZlcixcbiAgICBNYXA6IG9wdGlvbnMubWFwLFxuICAgIE51bWJlcjogY29weVByaW1pdGl2ZVdyYXBwZXIsXG4gICAgT2JqZWN0OiBvcHRpb25zLm9iamVjdCxcbiAgICBQcm9taXNlOiBjb3B5U2VsZixcbiAgICBSZWdFeHA6IG9wdGlvbnMucmVnRXhwLFxuICAgIFNldDogb3B0aW9ucy5zZXQsXG4gICAgU3RyaW5nOiBjb3B5UHJpbWl0aXZlV3JhcHBlcixcbiAgICBXZWFrTWFwOiBjb3B5U2VsZixcbiAgICBXZWFrU2V0OiBjb3B5U2VsZixcbiAgICBVaW50OEFycmF5OiBvcHRpb25zLmFycmF5QnVmZmVyLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiBvcHRpb25zLmFycmF5QnVmZmVyLFxuICAgIFVpbnQxNkFycmF5OiBvcHRpb25zLmFycmF5QnVmZmVyLFxuICAgIFVpbnQzMkFycmF5OiBvcHRpb25zLmFycmF5QnVmZmVyLFxuICAgIFVpbnQ2NEFycmF5OiBvcHRpb25zLmFycmF5QnVmZmVyLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGN1c3RvbSBjb3BpZXIgYmFzZWQgb24gdGhlIG9iamVjdC1zcGVjaWZpYyBjb3B5IG1ldGhvZHMgcGFzc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29waWVyKG9wdGlvbnM6IENyZWF0ZUNvcGllck9wdGlvbnMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZE9wdGlvbnMgPSBhc3NpZ24oe30sIERFRkFVTFRfTE9PU0VfT1BUSU9OUywgb3B0aW9ucyk7XG4gIGNvbnN0IHRhZ1NwZWNpZmljQ29waWVycyA9IGdldFRhZ1NwZWNpZmljQ29waWVycyhub3JtYWxpemVkT3B0aW9ucyk7XG4gIGNvbnN0IHsgQXJyYXk6IGFycmF5LCBPYmplY3Q6IG9iamVjdCB9ID0gdGFnU3BlY2lmaWNDb3BpZXJzO1xuXG4gIGZ1bmN0aW9uIGNvcGllcih2YWx1ZTogYW55LCBzdGF0ZTogU3RhdGUpOiBhbnkge1xuICAgIHN0YXRlLnByb3RvdHlwZSA9IHN0YXRlLkNvbnN0cnVjdG9yID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmNhY2hlLmhhcyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5jYWNoZS5nZXQodmFsdWUpO1xuICAgIH1cblxuICAgIHN0YXRlLnByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgICBzdGF0ZS5Db25zdHJ1Y3RvciA9IHN0YXRlLnByb3RvdHlwZSAmJiBzdGF0ZS5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbiAgICAvLyBwbGFpbiBvYmplY3RzXG4gICAgaWYgKCFzdGF0ZS5Db25zdHJ1Y3RvciB8fCBzdGF0ZS5Db25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0KHZhbHVlLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gYXJyYXlzXG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gYXJyYXkodmFsdWUsIHN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWdTcGVjaWZpY0NvcGllciA9IHRhZ1NwZWNpZmljQ29waWVyc1tnZXRUYWcodmFsdWUpXTtcblxuICAgIGlmICh0YWdTcGVjaWZpY0NvcGllcikge1xuICAgICAgcmV0dXJuIHRhZ1NwZWNpZmljQ29waWVyKHZhbHVlLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBvYmplY3QodmFsdWUsIHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBjb3B5PFZhbHVlPih2YWx1ZTogVmFsdWUpOiBWYWx1ZSB7XG4gICAgcmV0dXJuIGNvcGllcih2YWx1ZSwge1xuICAgICAgQ29uc3RydWN0b3I6IHVuZGVmaW5lZCxcbiAgICAgIGNhY2hlOiBjcmVhdGVDYWNoZSgpLFxuICAgICAgY29waWVyLFxuICAgICAgcHJvdG90eXBlOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY3VzdG9tIGNvcGllciBiYXNlZCBvbiB0aGUgb2JqZWN0LXNwZWNpZmljIGNvcHkgbWV0aG9kcyBwYXNzZWQsIGRlZmF1bHRpbmcgdG8gdGhlXG4gKiBzYW1lIGludGVybmFscyBhcyBgY29weVN0cmljdGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJpY3RDb3BpZXIob3B0aW9uczogQ3JlYXRlQ29waWVyT3B0aW9ucykge1xuICByZXR1cm4gY3JlYXRlQ29waWVyKGFzc2lnbih7fSwgREVGQVVMVF9TVFJJQ1RfT1BUSU9OUywgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIENvcHkgYW4gdmFsdWUgZGVlcGx5IGFzIG11Y2ggYXMgcG9zc2libGUsIHdoZXJlIHN0cmljdCByZWNyZWF0aW9uIG9mIG9iamVjdCBwcm9wZXJ0aWVzXG4gKiBhcmUgbWFpbnRhaW5lZC4gQWxsIHByb3BlcnRpZXMgKGluY2x1ZGluZyBub24tZW51bWVyYWJsZSBvbmVzKSBhcmUgY29waWVkIHdpdGggdGhlaXJcbiAqIG9yaWdpbmFsIHByb3BlcnR5IGRlc2NyaXB0b3JzIG9uIGJvdGggb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgY29weVN0cmljdCA9IGNyZWF0ZVN0cmljdENvcGllcih7fSk7XG5cbi8qKlxuICogQ29weSBhbiB2YWx1ZSBkZWVwbHkgYXMgbXVjaCBhcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ29waWVyKHt9KTtcbiIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvZW1wdHkvY29uc3RhbnRzJztcbmltcG9ydCAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvZW1wdHkvZW1wdHkuY3NzJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJy4uL3R5cG9ncmFwaHknO1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vX2Jhc2UvYmFzZUNvbXBvbmVudCc7XG5jb25zdCBwcmVmaXhDbHMgPSBjc3NDbGFzc2VzLlBSRUZJWDtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtcHR5IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMub2JzZXJ2ZSA9IG11dGF0aW9uc0xpc3QgPT4ge1xuICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XG4gICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycgJiYgbXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ3RoZW1lLW1vZGUnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMudXBkYXRlTW9kZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuYm9keS5nZXRBdHRyaWJ1dGUoJ3RoZW1lLW1vZGUnKTtcbiAgICAgIGlmICh2YWwgIT09IHRoaXMuc3RhdGUubW9kZSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBtb2RlOiB2YWxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbW9kZTogbnVsbFxuICAgIH07XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZGFya01vZGVJbWFnZSkge1xuICAgICAgdGhpcy5ib2R5ID0gd2luZG93LmRvY3VtZW50LmJvZHk7XG4gICAgICB0aGlzLnVwZGF0ZU1vZGUoKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgY2hpbGRMaXN0OiBmYWxzZSxcbiAgICAgICAgc3VidHJlZTogZmFsc2VcbiAgICAgIH07XG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5vYnNlcnZlKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmJvZHksIGNvbmZpZyk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMub2JzZXJ2ZXIgJiYgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF9hID0gdGhpcy5wcm9wcyxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIHN0eWxlLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgaW1hZ2VTdHlsZSxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIGxheW91dCxcbiAgICAgICAgZGFya01vZGVJbWFnZVxuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wiY2xhc3NOYW1lXCIsIFwiaW1hZ2VcIiwgXCJkZXNjcmlwdGlvblwiLCBcInN0eWxlXCIsIFwidGl0bGVcIiwgXCJpbWFnZVN0eWxlXCIsIFwiY2hpbGRyZW5cIiwgXCJsYXlvdXRcIiwgXCJkYXJrTW9kZUltYWdlXCJdKTtcbiAgICBjb25zdCBhbHQgPSB0eXBlb2YgZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnID8gZGVzY3JpcHRpb24gOiAnZW1wdHknO1xuICAgIGNvbnN0IGltZ1NyYyA9IHRoaXMuc3RhdGUubW9kZSA9PT0gJ2RhcmsnICYmIGRhcmtNb2RlSW1hZ2UgPyBkYXJrTW9kZUltYWdlIDogaW1hZ2U7XG4gICAgbGV0IGltYWdlTm9kZSA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBpbWdTcmMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpbWFnZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgIGFsdDogYWx0LFxuICAgICAgICBzcmM6IGltZ1NyY1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbWdTcmMgJiYgJ2lkJyBpbiBpbWdTcmMpIHtcbiAgICAgIGltYWdlTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1c2VcIiwge1xuICAgICAgICB4bGlua0hyZWY6IGAjJHtpbWdTcmMuaWR9YFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbWFnZU5vZGUgPSBpbWdTcmM7XG4gICAgfVxuICAgIGNvbnN0IHdyYXBwZXJDbHMgPSBjbHMoY2xhc3NOYW1lLCBwcmVmaXhDbHMsIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LSR7bGF5b3V0fWBdOiBsYXlvdXRcbiAgICB9KTtcbiAgICBjb25zdCB0aXRsZVByb3BzID0gaW1hZ2VOb2RlID8ge1xuICAgICAgaGVhZGluZzogNFxuICAgIH0gOiB7XG4gICAgICBoZWFkaW5nOiA2LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZm9udFdlaWdodDogNDAwXG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6IHdyYXBwZXJDbHMsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCB0aGlzLmdldERhdGFBdHRyKHJlc3QpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWltYWdlYCxcbiAgICAgIHN0eWxlOiBpbWFnZVN0eWxlLFxuICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImltYWdlLGRhcmtNb2RlSW1hZ2VcIlxuICAgIH0sIGltYWdlTm9kZSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1jb250ZW50YFxuICAgIH0sIHRpdGxlID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFR5cG9ncmFwaHkuVGl0bGUsIE9iamVjdC5hc3NpZ24oe30sIHRpdGxlUHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS10aXRsZWAsXG4gICAgICBcIngtc2VtaS1wcm9wXCI6IFwidGl0bGVcIlxuICAgIH0pLCB0aXRsZSkpIDogbnVsbCwgZGVzY3JpcHRpb24gPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWRlc2NyaXB0aW9uYCxcbiAgICAgIFwieC1zZW1pLXByb3BcIjogXCJkZXNjcmlwdGlvblwiXG4gICAgfSwgZGVzY3JpcHRpb24pKSA6IG51bGwsIGNoaWxkcmVuID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1mb290ZXJgLFxuICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImNoaWxkcmVuXCJcbiAgICB9LCBjaGlsZHJlbikpIDogbnVsbCkpO1xuICB9XG59XG5FbXB0eS5kZWZhdWx0UHJvcHMgPSB7XG4gIGxheW91dDogJ3ZlcnRpY2FsJ1xufTsiLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS1lbXB0eWBcbn07XG5jb25zdCBzdHJpbmdzID0ge1xuICBMQVlPVVQ6IFsndmVydGljYWwnLCAnaG9yaXpvbnRhbCddXG59O1xuZXhwb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9OyIsICJpbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IF9ub29wIGZyb20gXCJsb2Rhc2gvbm9vcFwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzLCBzdHJpbmdzLCBudW1iZXJzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvZHJvcGRvd24vY29uc3RhbnRzJztcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4uL19iYXNlL2Jhc2VDb21wb25lbnQnO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi4vdG9vbHRpcC9pbmRleCc7XG5pbXBvcnQgeyBudW1iZXJzIGFzIHRvb2x0aXBOdW1iZXJzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdG9vbHRpcC9jb25zdGFudHMnO1xuaW1wb3J0IEZvdW5kYXRpb24gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvZHJvcGRvd24vZm91bmRhdGlvbic7XG5pbXBvcnQgRHJvcGRvd25NZW51IGZyb20gJy4vZHJvcGRvd25NZW51JztcbmltcG9ydCBEcm9wZG93bkl0ZW0gZnJvbSAnLi9kcm9wZG93bkl0ZW0nO1xuaW1wb3J0IERyb3Bkb3duRGl2aWRlciBmcm9tICcuL2Ryb3Bkb3duRGl2aWRlcic7XG5pbXBvcnQgRHJvcGRvd25UaXRsZSBmcm9tICcuL2Ryb3Bkb3duVGl0bGUnO1xuaW1wb3J0IERyb3Bkb3duQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0ICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9kcm9wZG93bi9kcm9wZG93bi5jc3MnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFByb3BzRnJvbUdsb2JhbENvbmZpZyB9IGZyb20gXCIuLi9fdXRpbHNcIjtcbmNvbnN0IHBvc2l0aW9uU2V0ID0gc3RyaW5ncy5QT1NJVElPTl9TRVQ7XG5jb25zdCB0cmlnZ2VyU2V0ID0gc3RyaW5ncy5UUklHR0VSX1NFVDtcbmNsYXNzIERyb3Bkb3duIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlVmlzaWJsZUNoYW5nZSA9IHZpc2libGUgPT4gdGhpcy5mb3VuZGF0aW9uLmhhbmRsZVZpc2libGVDaGFuZ2UodmlzaWJsZSk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHBvcFZpc2libGU6IHByb3BzLnZpc2libGVcbiAgICB9O1xuICAgIHRoaXMuZm91bmRhdGlvbiA9IG5ldyBGb3VuZGF0aW9uKHRoaXMuYWRhcHRlcik7XG4gICAgdGhpcy50b29sdGlwUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG4gIGdldCBhZGFwdGVyKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmFkYXB0ZXIpLCB7XG4gICAgICBzZXRQb3BWaXNpYmxlOiBwb3BWaXNpYmxlID0+IHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBwb3BWaXNpYmxlXG4gICAgICB9KSxcbiAgICAgIG5vdGlmeVZpc2libGVDaGFuZ2U6IHZpc2libGUgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5wcm9wcykub25WaXNpYmxlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgdmlzaWJsZSk7XG4gICAgICB9LFxuICAgICAgZ2V0UG9wdXBJZDogKCkgPT4gdGhpcy50b29sdGlwUmVmLmN1cnJlbnQuZ2V0UG9wdXBJZCgpXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyQ29udGVudCgpIHtcbiAgICBjb25zdCB7XG4gICAgICByZW5kZXIsXG4gICAgICBtZW51LFxuICAgICAgY29udGVudENsYXNzTmFtZSxcbiAgICAgIHN0eWxlLFxuICAgICAgc2hvd1RpY2ssXG4gICAgICBwcmVmaXhDbHMsXG4gICAgICB0cmlnZ2VyXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gY2xhc3NuYW1lcyhwcmVmaXhDbHMsIGNvbnRlbnRDbGFzc05hbWUpO1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsID0gMFxuICAgIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgY29uc3QgY29udGV4dFZhbHVlID0ge1xuICAgICAgc2hvd1RpY2ssXG4gICAgICBsZXZlbDogbGV2ZWwgKyAxLFxuICAgICAgdHJpZ2dlclxuICAgIH07XG4gICAgbGV0IGNvbnRlbnQgPSBudWxsO1xuICAgIGlmICgvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQocmVuZGVyKSkge1xuICAgICAgY29udGVudCA9IHJlbmRlcjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWVudSkpIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLnJlbmRlck1lbnUoKTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyb3Bkb3duQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWNvbnRlbnRgLFxuICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcInJlbmRlclwiXG4gICAgfSwgY29udGVudCkpKTtcbiAgfVxuICByZW5kZXJNZW51KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lbnVcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBjb250ZW50ID0gbWVudS5tYXAoKG0sIGluZGV4KSA9PiB7XG4gICAgICBzd2l0Y2ggKG0ubm9kZSkge1xuICAgICAgICBjYXNlICd0aXRsZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgbm9kZVxuICAgICAgICAgICAgICB9ID0gbSxcbiAgICAgICAgICAgICAgcmVzdCA9IF9fcmVzdChtLCBbXCJuYW1lXCIsIFwibm9kZVwiXSk7XG4gICAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd24uVGl0bGUsIE9iamVjdC5hc3NpZ24oe30sIHJlc3QsIHtcbiAgICAgICAgICAgICAga2V5OiBub2RlICsgbmFtZSArIGluZGV4XG4gICAgICAgICAgICB9KSwgbmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdpdGVtJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgIH0gPSBtLFxuICAgICAgICAgICAgICByZXN0ID0gX19yZXN0KG0sIFtcIm5vZGVcIiwgXCJuYW1lXCJdKTtcbiAgICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEcm9wZG93bi5JdGVtLCBPYmplY3QuYXNzaWduKHt9LCByZXN0LCB7XG4gICAgICAgICAgICAgIGtleTogbm9kZSArIG5hbWUgKyBpbmRleFxuICAgICAgICAgICAgfSksIG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGl2aWRlcic6XG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyb3Bkb3duLkRpdmlkZXIsIHtcbiAgICAgICAgICAgICAga2V5OiBtLm5vZGUgKyBpbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEcm9wZG93bi5NZW51LCBudWxsLCBjb250ZW50KTtcbiAgfVxuICByZW5kZXJQb3BDYXJkKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlcixcbiAgICAgIGNvbnRlbnRDbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICAgIHNob3dUaWNrLFxuICAgICAgcHJlZml4Q2xzXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gY2xhc3NuYW1lcyhwcmVmaXhDbHMsIGNvbnRlbnRDbGFzc05hbWUpO1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsID0gMFxuICAgIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgY29uc3QgY29udGV4dFZhbHVlID0ge1xuICAgICAgc2hvd1RpY2ssXG4gICAgICBsZXZlbDogbGV2ZWwgKyAxXG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tY29udGVudGBcbiAgICB9LCByZW5kZXIpKSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF9hID0gdGhpcy5wcm9wcyxcbiAgICAgIHtcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgICB0cmlnZ2VyLFxuICAgICAgICBvblZpc2libGVDaGFuZ2UsXG4gICAgICAgIHpJbmRleCxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBtb3Rpb24sXG4gICAgICAgIG1hcmdpbixcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIHByZWZpeENsc1xuICAgICAgfSA9IF9hLFxuICAgICAgYXR0ciA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIiwgXCJwb3NpdGlvblwiLCBcInRyaWdnZXJcIiwgXCJvblZpc2libGVDaGFuZ2VcIiwgXCJ6SW5kZXhcIiwgXCJjbGFzc05hbWVcIiwgXCJtb3Rpb25cIiwgXCJtYXJnaW5cIiwgXCJzdHlsZVwiLCBcInByZWZpeENsc1wiXSk7XG4gICAgbGV0IHtcbiAgICAgIHNwYWNpbmdcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7XG4gICAgICBsZXZlbFxuICAgIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgY29uc3Qge1xuICAgICAgcG9wVmlzaWJsZVxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHBvcCA9IHRoaXMucmVuZGVyQ29udGVudCgpO1xuICAgIGlmIChsZXZlbCA+IDApIHtcbiAgICAgIHNwYWNpbmcgPSB0eXBlb2Ygc3BhY2luZyA9PT0gJ251bWJlcicgPyBzcGFjaW5nIDogbnVtYmVycy5ORVNURURfU1BBQ0lORztcbiAgICB9IGVsc2UgaWYgKHNwYWNpbmcgPT09IG51bGwgfHwgdHlwZW9mIHNwYWNpbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzcGFjaW5nID0gbnVtYmVycy5TUEFDSU5HO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICB6SW5kZXg6IHpJbmRleCxcbiAgICAgIG1vdGlvbjogbW90aW9uLFxuICAgICAgbWFyZ2luOiBtYXJnaW4sXG4gICAgICBjb250ZW50OiBwb3AsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3BhY2luZzogc3BhY2luZyxcbiAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICBvblZpc2libGVDaGFuZ2U6IHRoaXMuaGFuZGxlVmlzaWJsZUNoYW5nZSxcbiAgICAgIHNob3dBcnJvdzogZmFsc2UsXG4gICAgICByZXR1cm5Gb2N1c09uQ2xvc2U6IHRydWUsXG4gICAgICByZWY6IHRoaXMudG9vbHRpcFJlZlxuICAgIH0sIGF0dHIpLCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoX2dldChjaGlsZHJlbiwgJ3Byb3BzLmNsYXNzTmFtZScpLCB7XG4gICAgICAgIFtgJHtwcmVmaXhDbHN9LXNob3dpbmdgXTogcG9wVmlzaWJsZVxuICAgICAgfSksXG4gICAgICAnYXJpYS1oYXNwb3B1cCc6IHRydWUsXG4gICAgICAnYXJpYS1leHBhbmRlZCc6IHBvcFZpc2libGUsXG4gICAgICBvbktleURvd246IGUgPT4ge1xuICAgICAgICB0aGlzLmZvdW5kYXRpb24uaGFuZGxlS2V5RG93bihlKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5LZXlEb3duID0gX2dldChjaGlsZHJlbiwgJ3Byb3BzLm9uS2V5RG93bicpO1xuICAgICAgICBjaGlsZHJlbktleURvd24gJiYgY2hpbGRyZW5LZXlEb3duKGUpO1xuICAgICAgfVxuICAgIH0pIDogY2hpbGRyZW4pO1xuICB9XG59XG5Ecm9wZG93bi5NZW51ID0gRHJvcGRvd25NZW51O1xuRHJvcGRvd24uSXRlbSA9IERyb3Bkb3duSXRlbTtcbkRyb3Bkb3duLkRpdmlkZXIgPSBEcm9wZG93bkRpdmlkZXI7XG5Ecm9wZG93bi5UaXRsZSA9IERyb3Bkb3duVGl0bGU7XG5Ecm9wZG93bi5jb250ZXh0VHlwZSA9IERyb3Bkb3duQ29udGV4dDtcbkRyb3Bkb3duLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBjb250ZW50Q2xhc3NOYW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXldKSxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBnZXRQb3B1cENvbnRhaW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBtb3VzZUVudGVyRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gIG1vdXNlTGVhdmVEZWxheTogUHJvcFR5cGVzLm51bWJlcixcbiAgbWVudTogUHJvcFR5cGVzLmFycmF5LFxuICBtb3Rpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBvblZpc2libGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBwcmVmaXhDbHM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2YocG9zaXRpb25TZXQpLFxuICByZVBvc0tleTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICByZW5kZXI6IFByb3BUeXBlcy5ub2RlLFxuICBzcGFjaW5nOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIHNob3dUaWNrOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHRyaWdnZXI6IFByb3BUeXBlcy5vbmVPZih0cmlnZ2VyU2V0KSxcbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIHpJbmRleDogUHJvcFR5cGVzLm51bWJlclxufTtcbkRyb3Bkb3duLl9fU2VtaUNvbXBvbmVudE5hbWVfXyA9IFwiRHJvcGRvd25cIjtcbkRyb3Bkb3duLmRlZmF1bHRQcm9wcyA9IGdldERlZmF1bHRQcm9wc0Zyb21HbG9iYWxDb25maWcoRHJvcGRvd24uX19TZW1pQ29tcG9uZW50TmFtZV9fLCB7XG4gIG9uVmlzaWJsZUNoYW5nZTogX25vb3AsXG4gIHByZWZpeENsczogY3NzQ2xhc3Nlcy5QUkVGSVgsXG4gIHpJbmRleDogdG9vbHRpcE51bWJlcnMuREVGQVVMVF9aX0lOREVYLFxuICBtb3Rpb246IHRydWUsXG4gIHRyaWdnZXI6ICdob3ZlcicsXG4gIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgbW91c2VMZWF2ZURlbGF5OiBzdHJpbmdzLkRFRkFVTFRfTEVBVkVfREVMQVksXG4gIHNob3dUaWNrOiBmYWxzZSxcbiAgY2xvc2VPbkVzYzogdHJ1ZSxcbiAgb25Fc2NLZXlEb3duOiBfbm9vcFxufSk7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bjsiLCAiaW1wb3J0IHsgc3RyaW5ncyBhcyB0b29sdGlwU3RyaW5ncyB9IGZyb20gJy4uL3Rvb2x0aXAvY29uc3RhbnRzJztcbmltcG9ydCB7IEJBU0VfQ0xBU1NfUFJFRklYIH0gZnJvbSAnLi4vYmFzZS9jb25zdGFudHMnO1xuY29uc3QgY3NzQ2xhc3NlcyA9IHtcbiAgUFJFRklYOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tZHJvcGRvd25gLFxuICBTRUxFQ1RFRDogYCR7QkFTRV9DTEFTU19QUkVGSVh9LWRyb3Bkb3duLWl0ZW0tc2VsZWN0ZWRgLFxuICBESVNBQkxFRDogYCR7QkFTRV9DTEFTU19QUkVGSVh9LWRyb3Bkb3duLWl0ZW0tZGlzYWJsZWRgXG59O1xuY29uc3Qgc3RyaW5ncyA9IHtcbiAgUE9TSVRJT05fU0VUOiB0b29sdGlwU3RyaW5ncy5QT1NJVElPTl9TRVQsXG4gIFRSSUdHRVJfU0VUOiBbJ2hvdmVyJywgJ2ZvY3VzJywgJ2NsaWNrJywgJ2N1c3RvbScsICdjb250ZXh0TWVudSddLFxuICBERUZBVUxUX0xFQVZFX0RFTEFZOiAxMDAsXG4gIElURU1fVFlQRTogWydwcmltYXJ5JywgJ3NlY29uZGFyeScsICd0ZXJ0aWFyeScsICd3YXJuaW5nJywgJ2RhbmdlciddXG59O1xuY29uc3QgbnVtYmVycyA9IHtcbiAgU1BBQ0lORzogNCxcbiAgTkVTVEVEX1NQQUNJTkc6IDJcbn07XG5leHBvcnQgeyBjc3NDbGFzc2VzLCBzdHJpbmdzLCBudW1iZXJzIH07IiwgImltcG9ydCBCYXNlRm91bmRhdGlvbiBmcm9tICcuLi9iYXNlL2ZvdW5kYXRpb24nO1xuaW1wb3J0IHsgaGFuZGxlUHJldmVudCwgc2V0Rm9jdXNUb0ZpcnN0SXRlbSwgc2V0Rm9jdXNUb0xhc3RJdGVtIH0gZnJvbSAnLi4vdXRpbHMvYTExeSc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcm9wZG93bkZvdW5kYXRpb24gZXh0ZW5kcyBCYXNlRm91bmRhdGlvbiB7XG4gIGhhbmRsZVZpc2libGVDaGFuZ2UodmlzaWJsZSkge1xuICAgIHRoaXMuX2FkYXB0ZXIuc2V0UG9wVmlzaWJsZSh2aXNpYmxlKTtcbiAgICB0aGlzLl9hZGFwdGVyLm5vdGlmeVZpc2libGVDaGFuZ2UodmlzaWJsZSk7XG4gICAgY29uc3Qge1xuICAgICAgdHJpZ2dlclxuICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgaWYgKHZpc2libGUgJiYgdHJpZ2dlciA9PT0gXCJjbGlja1wiKSB7XG4gICAgICBjb25zdCBwb3B1cElkID0gdGhpcy5fYWRhcHRlci5nZXRQb3B1cElkKCk7XG4gICAgICB0aGlzLnNldEZvY3VzVG9GaXJzdE1lbnVJdGVtKHBvcHVwSWQpO1xuICAgIH1cbiAgfVxuICBnZXRNZW51SXRlbU5vZGVzKGlkKSB7XG4gICAgY29uc3QgbWVudVdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgLy8gaWYgaGFzIGRyb3Bkb3duIGl0ZW0sIHRoZSBpdGVtIG11c3Qgd3JhcHBlZCBieSBsaVxuICAgIHJldHVybiBtZW51V3JhcHBlciA/IEFycmF5LmZyb20obWVudVdyYXBwZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpJykpLmZpbHRlcihpdGVtID0+IGl0ZW0uYXJpYURpc2FibGVkID09PSBcImZhbHNlXCIpIDogbnVsbDtcbiAgfVxuICBzZXRGb2N1c1RvRmlyc3RNZW51SXRlbShpZCkge1xuICAgIGNvbnN0IG1lbnVJdGVtTm9kZXMgPSB0aGlzLmdldE1lbnVJdGVtTm9kZXMoaWQpO1xuICAgIG1lbnVJdGVtTm9kZXMgJiYgc2V0Rm9jdXNUb0ZpcnN0SXRlbShtZW51SXRlbU5vZGVzKTtcbiAgfVxuICBzZXRGb2N1c1RvTGFzdE1lbnVJdGVtKGlkKSB7XG4gICAgY29uc3QgbWVudUl0ZW1Ob2RlcyA9IHRoaXMuZ2V0TWVudUl0ZW1Ob2RlcyhpZCk7XG4gICAgbWVudUl0ZW1Ob2RlcyAmJiBzZXRGb2N1c1RvTGFzdEl0ZW0obWVudUl0ZW1Ob2Rlcyk7XG4gIH1cbiAgaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgaWQgPSAoX2IgPSAoX2EgPSBldmVudC50YXJnZXQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hdHRyaWJ1dGVzWydkYXRhLXBvcHVwaWQnXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZhbHVlO1xuICAgIGNvbnN0IHtcbiAgICAgIHZpc2libGVcbiAgICB9ID0gdGhpcy5fYWRhcHRlci5nZXRTdGF0ZXMoKTtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGV2ZW50LnRhcmdldC5jbGljaygpO1xuICAgICAgICAvLyB1c2VyIG1heSB1c2UgaW5wdXQgdG8gYmUgdGhlIHRyaWdnZXIgYW5kIGJpbmQgc29tZSBrZXkgZXZlbnQgb24gaXQsIHNvIGRvIG5vdCBzdG9wcHJvcGFnYXRpb25cbiAgICAgICAgLy8gaGFuZGxlUHJldmVudChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgdGhpcy5zZXRGb2N1c1RvRmlyc3RNZW51SXRlbShpZCk7XG4gICAgICAgIHZpc2libGUgJiYgaGFuZGxlUHJldmVudChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHRoaXMuc2V0Rm9jdXNUb0xhc3RNZW51SXRlbShpZCk7XG4gICAgICAgIHZpc2libGUgJiYgaGFuZGxlUHJldmVudChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59IiwgInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3NlcyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2Ryb3Bkb3duL2NvbnN0YW50cyc7XG5pbXBvcnQgRm91bmRhdGlvbiBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9kcm9wZG93bi9tZW51Rm91bmRhdGlvbic7XG5pbXBvcnQgRHJvcGRvd25Db250ZXh0IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuLi9fYmFzZS9iYXNlQ29tcG9uZW50JztcbmNvbnN0IHByZWZpeENscyA9IGNzc0NsYXNzZXMuUFJFRklYO1xuY2xhc3MgRHJvcGRvd25NZW51IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuZm91bmRhdGlvbiA9IG5ldyBGb3VuZGF0aW9uKHRoaXMuYWRhcHRlcik7XG4gIH1cbiAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmFkYXB0ZXIpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHN0eWxlXG4gICAgICB9ID0gX2EsXG4gICAgICByZXN0ID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCJdKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIHJvbGU6IFwibWVudVwiLFxuICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIlxuICAgIH0sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyhgJHtwcmVmaXhDbHN9LW1lbnVgLCBjbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgb25LZXlEb3duOiBlID0+IHRoaXMuZm91bmRhdGlvbi5vbk1lbnVLZXlkb3duKGUpXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxufVxuRHJvcGRvd25NZW51LnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuRHJvcGRvd25NZW51LmNvbnRleHRUeXBlID0gRHJvcGRvd25Db250ZXh0O1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25NZW51OyIsICJpbXBvcnQgQmFzZUZvdW5kYXRpb24gZnJvbSAnLi4vYmFzZS9mb3VuZGF0aW9uJztcbmltcG9ydCB7IGhhbmRsZVByZXZlbnQsIGlzUHJpbnRhYmxlQ2hhcmFjdGVyLCBmaW5kSW5kZXhCeUNoYXJhY3RlciwgZ2V0QW5jZXN0b3JOb2RlQnlSb2xlLCBnZXRNZW51QnV0dG9uLCBzZXRGb2N1c1RvSXRlbSwgc2V0Rm9jdXNUb05leHRNZW51aXRlbSwgc2V0Rm9jdXNUb1ByZXZpb3VzTWVudUl0ZW0gfSBmcm9tICcuLi91dGlscy9hMTF5JztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyb3Bkb3duTWVudUZvdW5kYXRpb24gZXh0ZW5kcyBCYXNlRm91bmRhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy5tZW51SXRlbU5vZGVzID0gbnVsbDtcbiAgICB0aGlzLmZpcnN0Q2hhcnMgPSBbXTtcbiAgfVxuICBoYW5kbGVFc2NhcGUobWVudSkge1xuICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLl9hZGFwdGVyLmdldENvbnRleHQoJ3RyaWdnZXInKTtcbiAgICBpZiAodHJpZ2dlciA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIGNvbnN0IG1lbnVCdXR0b24gPSBtZW51ICYmIGdldE1lbnVCdXR0b24oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtcG9wdXBpZF1gKSwgbWVudS5pZCk7XG4gICAgICBtZW51QnV0dG9uLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIHNldEZvY3VzQnlGaXJzdENoYXJhY3RlcihjdXJJdGVtLCBjaGFyKSB7XG4gICAgY29uc3QgaW5kZXggPSBmaW5kSW5kZXhCeUNoYXJhY3Rlcih0aGlzLm1lbnVJdGVtTm9kZXMsIGN1ckl0ZW0sIHRoaXMuZmlyc3RDaGFycywgY2hhcik7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHNldEZvY3VzVG9JdGVtKHRoaXMubWVudUl0ZW1Ob2RlcywgdGhpcy5tZW51SXRlbU5vZGVzW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIG9uTWVudUtleWRvd24oZXZlbnQpIHtcbiAgICBjb25zdCBtZW51ID0gZ2V0QW5jZXN0b3JOb2RlQnlSb2xlKGV2ZW50LnRhcmdldCwgJ3Rvb2x0aXAnKTtcbiAgICBpZiAoIXRoaXMubWVudUl0ZW1Ob2Rlcykge1xuICAgICAgdGhpcy5tZW51SXRlbU5vZGVzID0gWy4uLmV2ZW50LnRhcmdldC5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpXS5maWx0ZXIoaXRlbSA9PiBpdGVtLmFyaWFEaXNhYmxlZCAhPT0gXCJ0cnVlXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5maXJzdENoYXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5tZW51SXRlbU5vZGVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gdGhlIG1lbnVJdGVtTm9kZXMgY2FuIGJlIGFuIGNvbXBvbmVudCBhbmQgbm90IGV4aXQgdGV4dENvbnRlbnRcbiAgICAgICAgdGhpcy5maXJzdENoYXJzLnB1c2goKF9hID0gaXRlbS50ZXh0Q29udGVudC50cmltKClbMF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBnZXQgdGhlIGN1cnJlbnRseSBmb2N1c2VkIG1lbnUgaXRlbVxuICAgIGNvbnN0IGN1ckl0ZW0gPSB0aGlzLm1lbnVJdGVtTm9kZXMuZmluZChpdGVtID0+IGl0ZW0udGFiSW5kZXggPT09IDApO1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICcgJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsaWNrKCk7XG4gICAgICAgIC8vIHVzZXIgbWF5IHVzZSBpbnB1dCB0byBiZSB0aGUgdHJpZ2dlciBhbmQgYmluZCBzb21lIGtleSBldmVudCBvbiBpdCwgc28gZG8gbm90IHN0b3Bwcm9wYWdhdGlvblxuICAgICAgICAvLyBoYW5kbGVQcmV2ZW50KGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLmhhbmRsZUVzY2FwZShtZW51KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgc2V0Rm9jdXNUb1ByZXZpb3VzTWVudUl0ZW0odGhpcy5tZW51SXRlbU5vZGVzLCBjdXJJdGVtKTtcbiAgICAgICAgaGFuZGxlUHJldmVudChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgc2V0Rm9jdXNUb05leHRNZW51aXRlbSh0aGlzLm1lbnVJdGVtTm9kZXMsIGN1ckl0ZW0pO1xuICAgICAgICBoYW5kbGVQcmV2ZW50KGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaXNQcmludGFibGVDaGFyYWN0ZXIoZXZlbnQua2V5KSkge1xuICAgICAgICAgIHRoaXMuc2V0Rm9jdXNCeUZpcnN0Q2hhcmFjdGVyKGN1ckl0ZW0sIGV2ZW50LmtleSk7XG4gICAgICAgICAgLy8gaXQgY2FuIGJlIGFuIGlucHV0IG9uIERyb3Bkb3duLCBoYW5kbGVQcmV2ZW50IG1heSBhZmZlY3QgdGhlIGlucHV0IG9mIHRoZSBjb21wb25lbnRcbiAgICAgICAgICAvLyBoYW5kbGVQcmV2ZW50KGV2ZW50KTsgXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59IiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBEcm9wZG93bkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGxldmVsOiAwXG59KTtcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duQ29udGV4dDsiLCAiaW1wb3J0IF9ub29wIGZyb20gXCJsb2Rhc2gvbm9vcFwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3NlcyBhcyBjc3MsIHN0cmluZ3MgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9kcm9wZG93bi9jb25zdGFudHMnO1xuaW1wb3J0IERyb3Bkb3duQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vX2Jhc2UvYmFzZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBJY29uVGljayB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWljb25zJztcbmNvbnN0IHByZWZpeENscyA9IGNzcy5QUkVGSVg7XG5jbGFzcyBEcm9wZG93bkl0ZW0gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBmb3J3YXJkUmVmLFxuICAgICAgc3R5bGUsXG4gICAgICB0eXBlLFxuICAgICAgYWN0aXZlLFxuICAgICAgaWNvbixcbiAgICAgIG9uS2V5RG93bixcbiAgICAgIHNob3dUaWNrLFxuICAgICAgaG92ZXJcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7XG4gICAgICBzaG93VGljazogY29udGV4dFNob3dUaWNrXG4gICAgfSA9IHRoaXMuY29udGV4dDtcbiAgICBjb25zdCByZWFsU2hvd1RpY2sgPSBjb250ZXh0U2hvd1RpY2sgIT09IG51bGwgJiYgY29udGV4dFNob3dUaWNrICE9PSB2b2lkIDAgPyBjb250ZXh0U2hvd1RpY2sgOiBzaG93VGljaztcbiAgICBjb25zdCBpdGVtY2xhc3MgPSBjbHMoY2xhc3NOYW1lLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1pdGVtYF06IHRydWUsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1pdGVtLWRpc2FibGVkYF06IGRpc2FibGVkLFxuICAgICAgW2Ake3ByZWZpeENsc30taXRlbS1ob3ZlcmBdOiBob3ZlcixcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWl0ZW0td2l0aFRpY2tgXTogcmVhbFNob3dUaWNrLFxuICAgICAgW2Ake3ByZWZpeENsc30taXRlbS0ke3R5cGV9YF06IHR5cGUsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1pdGVtLWFjdGl2ZWBdOiBhY3RpdmVcbiAgICB9KTtcbiAgICBjb25zdCBldmVudHMgPSB7fTtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICBbJ29uQ2xpY2snLCAnb25Nb3VzZUVudGVyJywgJ29uTW91c2VMZWF2ZScsICdvbkNvbnRleHRNZW51J10uZm9yRWFjaChldmVudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBpc0luQW5vdGhlckRyb3Bkb3duID0gdGhpcy5jb250ZXh0LmxldmVsICE9PSAxO1xuICAgICAgICBpZiAoaXNJbkFub3RoZXJEcm9wZG93biAmJiBldmVudE5hbWUgPT09IFwib25DbGlja1wiKSB7XG4gICAgICAgICAgZXZlbnRzW1wib25Nb3VzZURvd25cIl0gPSBlID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgICAgKF9iID0gKF9hID0gdGhpcy5wcm9wcylbZXZlbnROYW1lXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXZlbnRzW2V2ZW50TmFtZV0gPSB0aGlzLnByb3BzW2V2ZW50TmFtZV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgdGljayA9IG51bGw7XG4gICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICBjYXNlIHJlYWxTaG93VGljayAmJiBhY3RpdmU6XG4gICAgICAgIHRpY2sgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uVGljaywgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSByZWFsU2hvd1RpY2sgJiYgIWFjdGl2ZTpcbiAgICAgICAgdGljayA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25UaWNrLCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aWNrID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCBpY29uQ29udGVudCA9IG51bGw7XG4gICAgaWYgKGljb24pIHtcbiAgICAgIGljb25Db250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taXRlbS1pY29uYFxuICAgICAgfSwgaWNvbik7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgcm9sZTogXCJtZW51aXRlbVwiLFxuICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IGRpc2FibGVkXG4gICAgfSwgZXZlbnRzLCB7XG4gICAgICBvbktleURvd246IG9uS2V5RG93bixcbiAgICAgIHJlZjogcmVmID0+IGZvcndhcmRSZWYocmVmKSxcbiAgICAgIGNsYXNzTmFtZTogaXRlbWNsYXNzLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSwgdGhpcy5nZXREYXRhQXR0cih0aGlzLnByb3BzKSksIHRpY2ssIGljb25Db250ZW50LCBjaGlsZHJlbik7XG4gIH1cbn1cbkRyb3Bkb3duSXRlbS5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubm9kZV0pLFxuICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIHNlbGVjdGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VFbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VMZWF2ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ29udGV4dE1lbnU6IFByb3BUeXBlcy5mdW5jLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBmb3J3YXJkUmVmOiBQcm9wVHlwZXMuZnVuYyxcbiAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuSVRFTV9UWVBFKSxcbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcbiAgaWNvbjogUHJvcFR5cGVzLm5vZGVcbn07XG5Ecm9wZG93bkl0ZW0uY29udGV4dFR5cGUgPSBEcm9wZG93bkNvbnRleHQ7XG5Ecm9wZG93bkl0ZW0uZGVmYXVsdFByb3BzID0ge1xuICBkaXNhYmxlZDogZmFsc2UsXG4gIGRpdmlkZWQ6IGZhbHNlLFxuICBzZWxlY3RlZDogZmFsc2UsXG4gIG9uTW91c2VFbnRlcjogX25vb3AsXG4gIG9uTW91c2VMZWF2ZTogX25vb3AsXG4gIGZvcndhcmRSZWY6IF9ub29wXG59O1xuRHJvcGRvd25JdGVtLmVsZW1lbnRUeXBlID0gJ0Ryb3Bkb3duLkl0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25JdGVtOyIsICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3NlcyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2Ryb3Bkb3duL2NvbnN0YW50cyc7XG5jb25zdCBwcmVmaXhDbHMgPSBjc3NDbGFzc2VzLlBSRUZJWDtcbmNvbnN0IERyb3Bkb3duRGl2aWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgY29uc3Qge1xuICAgIHN0eWxlLFxuICAgIGNsYXNzTmFtZVxuICB9ID0gcHJvcHM7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKGAke3ByZWZpeENsc30tZGl2aWRlcmAsIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pO1xufTtcbkRyb3Bkb3duRGl2aWRlci5wcm9wVHlwZXMgPSB7XG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkRpdmlkZXI7IiwgImltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNzc0NsYXNzZXMgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9kcm9wZG93bi9jb25zdGFudHMnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmNvbnN0IHByZWZpeENscyA9IGNzc0NsYXNzZXMuUFJFRklYO1xuY2xhc3MgRHJvcGRvd25UaXRsZSBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2xhc3NOYW1lLFxuICAgICAgc3R5bGUsXG4gICAgICBjaGlsZHJlblxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtcbiAgICAgIHNob3dUaWNrXG4gICAgfSA9IHRoaXMuY29udGV4dDtcbiAgICBjb25zdCB0aXRsZUNscyA9IGNscyh7XG4gICAgICBbYCR7cHJlZml4Q2xzfS10aXRsZWBdOiB0cnVlLFxuICAgICAgW2Ake3ByZWZpeENsc30tdGl0bGUtd2l0aFRpY2tgXTogc2hvd1RpY2tcbiAgICB9LCBjbGFzc05hbWUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IHRpdGxlQ2xzLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSwgY2hpbGRyZW4pO1xuICB9XG59XG5Ecm9wZG93blRpdGxlLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuRHJvcGRvd25UaXRsZS5jb250ZXh0VHlwZSA9IERyb3Bkb3duQ29udGV4dDtcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duVGl0bGU7IiwgInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG4vKipcbiAqIEltcGxlbWVudGF0aW9uIHJlZmVyZW5jZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvZ3JpZC9yb3cudHN4XG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvZ3JpZC9jb25zdGFudHMnO1xuaW1wb3J0ICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9ncmlkL2dyaWQuY3NzJztcbmltcG9ydCB7IHJlZ2lzdGVyTWVkaWFRdWVyeSB9IGZyb20gJy4uL191dGlscyc7XG5jb25zdCByZXNwb25zaXZlQXJyYXkgPSBbJ3h4bCcsICd4bCcsICdsZycsICdtZCcsICdzbScsICd4cyddO1xuZXhwb3J0IGNvbnN0IFJvd0NvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnN0IHJlc3BvbnNpdmVNYXAgPSB7XG4gIHhzOiAnKG1heC13aWR0aDogNTc1cHgpJyxcbiAgc206ICcobWluLXdpZHRoOiA1NzZweCknLFxuICBtZDogJyhtaW4td2lkdGg6IDc2OHB4KScsXG4gIGxnOiAnKG1pbi13aWR0aDogOTkycHgpJyxcbiAgeGw6ICcobWluLXdpZHRoOiAxMjAwcHgpJyxcbiAgeHhsOiAnKG1pbi13aWR0aDogMTYwMHB4KSdcbn07XG5jbGFzcyBSb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHhzOiB0cnVlLFxuICAgICAgICBzbTogdHJ1ZSxcbiAgICAgICAgbWQ6IHRydWUsXG4gICAgICAgIGxnOiB0cnVlLFxuICAgICAgICB4bDogdHJ1ZSxcbiAgICAgICAgeHhsOiB0cnVlXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnVuUmVnaXN0ZXJzID0gW107XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy51blJlZ2lzdGVycyA9IE9iamVjdC5rZXlzKHJlc3BvbnNpdmVNYXApLm1hcChzY3JlZW4gPT4gcmVnaXN0ZXJNZWRpYVF1ZXJ5KHJlc3BvbnNpdmVNYXBbc2NyZWVuXSwge1xuICAgICAgbWF0Y2g6ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmd1dHRlciAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShwcmV2U3RhdGUgPT4gKHtcbiAgICAgICAgICBzY3JlZW5zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZTdGF0ZS5zY3JlZW5zKSwge1xuICAgICAgICAgICAgW3NjcmVlbl06IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9KSk7XG4gICAgICB9LFxuICAgICAgdW5tYXRjaDogKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuZ3V0dGVyICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFN0YXRlKHByZXZTdGF0ZSA9PiAoe1xuICAgICAgICAgIHNjcmVlbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldlN0YXRlLnNjcmVlbnMpLCB7XG4gICAgICAgICAgICBbc2NyZWVuXTogZmFsc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMudW5SZWdpc3RlcnMuZm9yRWFjaCh1blJlZ2lzdGVyID0+IHVuUmVnaXN0ZXIoKSk7XG4gIH1cbiAgZ2V0R3V0dGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGd1dHRlciA9IDBcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCByZXN1bHRzID0gWzAsIDBdO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRHdXR0ZXIgPSBBcnJheS5pc0FycmF5KGd1dHRlcikgPyBndXR0ZXIuc2xpY2UoMCwgMikgOiBbZ3V0dGVyLCAwXTtcbiAgICBub3JtYWxpemVkR3V0dGVyLmZvckVhY2goKGcsIGluZGV4KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2l2ZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgYnJlYWtwb2ludCA9IHJlc3BvbnNpdmVBcnJheVtpXTtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zY3JlZW5zW2JyZWFrcG9pbnRdICYmIGdbYnJlYWtwb2ludF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBnW2JyZWFrcG9pbnRdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGcgfHwgMDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgX2EgPSB0aGlzLnByb3BzLFxuICAgICAge1xuICAgICAgICBwcmVmaXhDbHMsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGp1c3RpZnksXG4gICAgICAgIGFsaWduLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHN0eWxlLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgfSA9IF9hLFxuICAgICAgb3RoZXJzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJ0eXBlXCIsIFwianVzdGlmeVwiLCBcImFsaWduXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJjaGlsZHJlblwiXSk7XG4gICAgY29uc3QgZ3V0dGVycyA9IHRoaXMuZ2V0R3V0dGVyKCk7XG4gICAgY29uc3QgcHJlZml4ID0gYCR7cHJlZml4Q2xzfS1yb3dgO1xuICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc25hbWVzKHtcbiAgICAgIFtwcmVmaXhdOiB0eXBlICE9PSAnZmxleCcsXG4gICAgICBbYCR7cHJlZml4fS0ke3R5cGV9YF06IHR5cGUsXG4gICAgICBbYCR7cHJlZml4fS0ke3R5cGV9LSR7anVzdGlmeX1gXTogdHlwZSAmJiBqdXN0aWZ5LFxuICAgICAgW2Ake3ByZWZpeH0tJHt0eXBlfS0ke2FsaWdufWBdOiB0eXBlICYmIGFsaWduXG4gICAgfSwgY2xhc3NOYW1lKTtcbiAgICBjb25zdCByb3dTdHlsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBndXR0ZXJzWzBdID4gMCA/IHtcbiAgICAgIG1hcmdpbkxlZnQ6IGd1dHRlcnNbMF0gLyAtMixcbiAgICAgIG1hcmdpblJpZ2h0OiBndXR0ZXJzWzBdIC8gLTJcbiAgICB9IDoge30pLCBndXR0ZXJzWzFdID4gMCA/IHtcbiAgICAgIG1hcmdpblRvcDogZ3V0dGVyc1sxXSAvIC0yLFxuICAgICAgbWFyZ2luQm90dG9tOiBndXR0ZXJzWzFdIC8gLTJcbiAgICB9IDoge30pLCBzdHlsZSk7XG4gICAgY29uc3Qgb3RoZXJQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG90aGVycyk7XG4gICAgZGVsZXRlIG90aGVyUHJvcHMuZ3V0dGVyO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3dDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBndXR0ZXJzXG4gICAgICB9XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7fSwgb3RoZXJQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgc3R5bGU6IHJvd1N0eWxlLFxuICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImNoaWxkcmVuXCJcbiAgICB9KSwgY2hpbGRyZW4pKTtcbiAgfVxufVxuUm93LnByb3BUeXBlcyA9IHtcbiAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKFsnZmxleCddKSxcbiAgYWxpZ246IFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdtaWRkbGUnLCAnYm90dG9tJ10pLFxuICBqdXN0aWZ5OiBQcm9wVHlwZXMub25lT2YoWydzdGFydCcsICdlbmQnLCAnY2VudGVyJywgJ3NwYWNlLWFyb3VuZCcsICdzcGFjZS1iZXR3ZWVuJ10pLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gIGd1dHRlcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmFycmF5XSksXG4gIHByZWZpeENsczogUHJvcFR5cGVzLnN0cmluZ1xufTtcblJvdy5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogY3NzQ2xhc3Nlcy5QUkVGSVhcbn07XG5Sb3cuUm93Q29udGV4dCA9IHtcbiAgZ3V0dGVyczogUHJvcFR5cGVzLmFueVxufTtcbmV4cG9ydCBkZWZhdWx0IFJvdzsiLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IGAke0JBU0VfQ0xBU1NfUFJFRklYfWBcbn07XG5leHBvcnQgeyBjc3NDbGFzc2VzIH07IiwgInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG4vKipcbiAqIEltcGxlbWVudGF0aW9uIHJlZmVyZW5jZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvZ3JpZC9jb2wudHN4XG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgUm93Q29udGV4dCB9IGZyb20gJy4vcm93JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3NlcyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2dyaWQvY29uc3RhbnRzJztcbmNvbnN0IG9iamVjdE9yTnVtYmVyID0gUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLm51bWJlcl0pO1xuY2xhc3MgQ29sIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3BzXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qge1xuICAgICAgICBwcmVmaXhDbHMsXG4gICAgICAgIHNwYW4sXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIHB1c2gsXG4gICAgICAgIHB1bGwsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIH0gPSBwcm9wcyxcbiAgICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwic3BhblwiLCBcIm9yZGVyXCIsIFwib2Zmc2V0XCIsIFwicHVzaFwiLCBcInB1bGxcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiXSk7XG4gICAgbGV0IHNpemVDbGFzc09iaiA9IHt9O1xuICAgIGNvbnN0IHByZWZpeCA9IGAke3ByZWZpeENsc30tY29sYDtcbiAgICBbJ3hzJywgJ3NtJywgJ21kJywgJ2xnJywgJ3hsJywgJ3h4bCddLmZvckVhY2goc2l6ZSA9PiB7XG4gICAgICBsZXQgc2l6ZVByb3BzID0ge307XG4gICAgICBpZiAodHlwZW9mIHByb3BzW3NpemVdID09PSAnbnVtYmVyJykge1xuICAgICAgICBzaXplUHJvcHMuc3BhbiA9IHByb3BzW3NpemVdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvcHNbc2l6ZV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHNpemVQcm9wcyA9IHByb3BzW3NpemVdIHx8IHt9O1xuICAgICAgfVxuICAgICAgZGVsZXRlIG90aGVyc1tzaXplXTtcbiAgICAgIHNpemVDbGFzc09iaiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2l6ZUNsYXNzT2JqKSwge1xuICAgICAgICBbYCR7cHJlZml4fS0ke3NpemV9LSR7c2l6ZVByb3BzLnNwYW59YF06IHNpemVQcm9wcy5zcGFuICE9PSB1bmRlZmluZWQsXG4gICAgICAgIFtgJHtwcmVmaXh9LSR7c2l6ZX0tb3JkZXItJHtzaXplUHJvcHMub3JkZXJ9YF06IHNpemVQcm9wcy5vcmRlciB8fCBzaXplUHJvcHMub3JkZXIgPT09IDAsXG4gICAgICAgIFtgJHtwcmVmaXh9LSR7c2l6ZX0tb2Zmc2V0LSR7c2l6ZVByb3BzLm9mZnNldH1gXTogc2l6ZVByb3BzLm9mZnNldCB8fCBzaXplUHJvcHMub2Zmc2V0ID09PSAwLFxuICAgICAgICBbYCR7cHJlZml4fS0ke3NpemV9LXB1c2gtJHtzaXplUHJvcHMucHVzaH1gXTogc2l6ZVByb3BzLnB1c2ggfHwgc2l6ZVByb3BzLnB1c2ggPT09IDAsXG4gICAgICAgIFtgJHtwcmVmaXh9LSR7c2l6ZX0tcHVsbC0ke3NpemVQcm9wcy5wdWxsfWBdOiBzaXplUHJvcHMucHVsbCB8fCBzaXplUHJvcHMucHVsbCA9PT0gMFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzbmFtZXMocHJlZml4LCB7XG4gICAgICBbYCR7cHJlZml4fS0ke3NwYW59YF06IHNwYW4gIT09IHVuZGVmaW5lZCxcbiAgICAgIFtgJHtwcmVmaXh9LW9yZGVyLSR7b3JkZXJ9YF06IG9yZGVyLFxuICAgICAgW2Ake3ByZWZpeH0tb2Zmc2V0LSR7b2Zmc2V0fWBdOiBvZmZzZXQsXG4gICAgICBbYCR7cHJlZml4fS1wdXNoLSR7cHVzaH1gXTogcHVzaCxcbiAgICAgIFtgJHtwcmVmaXh9LXB1bGwtJHtwdWxsfWBdOiBwdWxsXG4gICAgfSwgY2xhc3NOYW1lLCBzaXplQ2xhc3NPYmopO1xuICAgIGxldCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSBvdGhlcnM7XG4gICAgbGV0IGd1dHRlcnM7XG4gICAgdHJ5IHtcbiAgICAgIGd1dHRlcnMgPSB0aGlzLmNvbnRleHQuZ3V0dGVycztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwbGVhc2UgbWFrZSBzdXJlIDxDb2w+IGluc2lkZSA8Um93PicpO1xuICAgIH1cbiAgICBzdHlsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBndXR0ZXJzWzBdID4gMCA/IHtcbiAgICAgIHBhZGRpbmdMZWZ0OiBndXR0ZXJzWzBdIC8gMixcbiAgICAgIHBhZGRpbmdSaWdodDogZ3V0dGVyc1swXSAvIDJcbiAgICB9IDoge30pLCBndXR0ZXJzWzFdID4gMCA/IHtcbiAgICAgIHBhZGRpbmdUb3A6IGd1dHRlcnNbMV0gLyAyLFxuICAgICAgcGFkZGluZ0JvdHRvbTogZ3V0dGVyc1sxXSAvIDJcbiAgICB9IDoge30pLCBzdHlsZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIG90aGVycywge1xuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImNoaWxkcmVuXCJcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9XG59XG5Db2wuY29udGV4dFR5cGUgPSBSb3dDb250ZXh0O1xuQ29sLnByb3BUeXBlcyA9IHtcbiAgc3BhbjogUHJvcFR5cGVzLm51bWJlcixcbiAgb3JkZXI6IFByb3BUeXBlcy5udW1iZXIsXG4gIG9mZnNldDogUHJvcFR5cGVzLm51bWJlcixcbiAgcHVzaDogUHJvcFR5cGVzLm51bWJlcixcbiAgcHVsbDogUHJvcFR5cGVzLm51bWJlcixcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gIHhzOiBvYmplY3RPck51bWJlcixcbiAgc206IG9iamVjdE9yTnVtYmVyLFxuICBtZDogb2JqZWN0T3JOdW1iZXIsXG4gIGxnOiBvYmplY3RPck51bWJlcixcbiAgeGw6IG9iamVjdE9yTnVtYmVyLFxuICB4eGw6IG9iamVjdE9yTnVtYmVyLFxuICBwcmVmaXhDbHM6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5Db2wuZGVmYXVsdFByb3BzID0ge1xuICBwcmVmaXhDbHM6IGNzc0NsYXNzZXMuUFJFRklYXG59O1xuZXhwb3J0IGRlZmF1bHQgQ29sOyIsICJ2YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3NlcyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL2xheW91dC9jb25zdGFudHMnO1xuaW1wb3J0ICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9sYXlvdXQvbGF5b3V0LmNzcyc7XG5pbXBvcnQgTGF5b3V0Q29udGV4dCBmcm9tICcuL2xheW91dC1jb250ZXh0JztcbmltcG9ydCBTaWRlciBmcm9tICcuL1NpZGVyJztcbmNvbnN0IGh0bWxUYWcgPSB7XG4gIEhlYWRlcjogJ2hlYWRlcicsXG4gIEZvb3RlcjogJ2Zvb3RlcicsXG4gIENvbnRlbnQ6ICdtYWluJyxcbiAgTGF5b3V0OiAnc2VjdGlvbidcbn07XG5mdW5jdGlvbiBnZW5lcmF0b3IodHlwZSkge1xuICBjb25zdCB0YWdOYW1lID0gaHRtbFRhZ1t0eXBlXTtcbiAgY29uc3QgdHlwZU5hbWUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBCYXNpY0NvbXBvbmVudCA9PiBjbGFzcyBBZGFwdGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhc2ljQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcm9sZTogdGhpcy5wcm9wcy5yb2xlLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogdGhpcy5wcm9wc1snYXJpYS1sYWJlbCddLFxuICAgICAgICB0eXBlOiB0eXBlTmFtZSxcbiAgICAgICAgdGFnTmFtZTogdGFnTmFtZVxuICAgICAgfSwgdGhpcy5wcm9wcykpO1xuICAgIH1cbiAgfTtcbn1cbmNsYXNzIEJhc2ljIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIHByZWZpeENscyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgdGFnTmFtZVxuICAgICAgfSA9IF9hLFxuICAgICAgb3RoZXJzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJ0eXBlXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJ0YWdOYW1lXCJdKTtcbiAgICBjb25zdCBjbGFzc1N0cmluZyA9IGNscyhjbGFzc05hbWUsIGAke3ByZWZpeENsc30tJHt0eXBlfWApO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgICB9LCBvdGhlcnMpLCBjaGlsZHJlbik7XG4gIH1cbn1cbkJhc2ljLnByb3BUeXBlcyA9IHtcbiAgcHJlZml4Q2xzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuQmFzaWMuZGVmYXVsdFByb3BzID0ge1xuICBwcmVmaXhDbHM6IGNzc0NsYXNzZXMuUFJFRklYXG59O1xuY29uc3QgSGVhZGVyID0gZ2VuZXJhdG9yKCdIZWFkZXInKShCYXNpYyk7XG5jb25zdCBGb290ZXIgPSBnZW5lcmF0b3IoJ0Zvb3RlcicpKEJhc2ljKTtcbmNvbnN0IENvbnRlbnQgPSBnZW5lcmF0b3IoJ0NvbnRlbnQnKShCYXNpYyk7XG5jbGFzcyBMYXlvdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2lkZXJzOiBbXVxuICAgIH07XG4gIH1cbiAgZ2V0U2lkZXJIb29rKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhZGRTaWRlcjogaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHN0YXRlID0+ICh7XG4gICAgICAgICAgc2lkZXJzOiBbLi4uc3RhdGUuc2lkZXJzLCBpZF1cbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZVNpZGVyOiBpZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoc3RhdGUgPT4gKHtcbiAgICAgICAgICBzaWRlcnM6IHN0YXRlLnNpZGVycy5maWx0ZXIoY3VyciA9PiBjdXJyICE9PSBpZClcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF9hID0gdGhpcy5wcm9wcyxcbiAgICAgIHtcbiAgICAgICAgcHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBoYXNTaWRlcixcbiAgICAgICAgdGFnTmFtZVxuICAgICAgfSA9IF9hLFxuICAgICAgb3RoZXJzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcImhhc1NpZGVyXCIsIFwidGFnTmFtZVwiXSk7XG4gICAgY29uc3Qge1xuICAgICAgc2lkZXJzXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgY2xhc3NTdHJpbmcgPSBjbHMoY2xhc3NOYW1lLCBwcmVmaXhDbHMsIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWhhcy1zaWRlcmBdOiB0eXBlb2YgaGFzU2lkZXIgPT09ICdib29sZWFuJyAmJiBoYXNTaWRlciB8fCBzaWRlcnMubGVuZ3RoID4gMCB8fCBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKS5zb21lKGNoaWxkID0+IHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkgJiYgY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLmVsZW1lbnRUeXBlID09PSBcIkxheW91dC5TaWRlclwiO1xuICAgICAgfSlcbiAgICB9KTtcbiAgICBjb25zdCBUYWcgPSB0YWdOYW1lO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYXlvdXRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBzaWRlckhvb2s6IHRoaXMuZ2V0U2lkZXJIb29rKClcbiAgICAgIH1cbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWcsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZ1xuICAgIH0sIG90aGVycyksIGNoaWxkcmVuKSk7XG4gIH1cbn1cbkxheW91dC5wcm9wVHlwZXMgPSB7XG4gIHByZWZpeENsczogUHJvcFR5cGVzLnN0cmluZyxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcbkxheW91dC5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogY3NzQ2xhc3Nlcy5QUkVGSVgsXG4gIHRhZ05hbWU6ICdzZWN0aW9uJ1xufTtcbkxheW91dC5IZWFkZXIgPSBIZWFkZXI7XG5MYXlvdXQuRm9vdGVyID0gRm9vdGVyO1xuTGF5b3V0LkNvbnRlbnQgPSBDb250ZW50O1xuTGF5b3V0LlNpZGVyID0gU2lkZXI7XG5leHBvcnQgeyBMYXlvdXQgfTtcbmV4cG9ydCBkZWZhdWx0IExheW91dDsiLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS1sYXlvdXRgXG59O1xuY29uc3Qgc3RyaW5ncyA9IHtcbiAgQlJFQUtQT0lOVDogWyd4cycsICdzbScsICdtZCcsICdsZycsICd4bCcsICd4eGwnXVxufTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MgfTsiLCAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy9mdW5jdGlvbic7XG5jb25zdCBMYXlvdXRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBzaWRlckhvb2s6IHtcbiAgICBhZGRTaWRlcjogbm9vcCxcbiAgICByZW1vdmVTaWRlcjogbm9vcFxuICB9XG59KTtcbmV4cG9ydCBkZWZhdWx0IExheW91dENvbnRleHQ7IiwgInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzLCBzdHJpbmdzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvbGF5b3V0L2NvbnN0YW50cyc7XG5pbXBvcnQgZ2V0RGF0YUF0dHIgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZ2V0RGF0YUF0dHInO1xuaW1wb3J0IExheW91dENvbnRleHQgZnJvbSAnLi9sYXlvdXQtY29udGV4dCc7XG5pbXBvcnQgeyByZWdpc3Rlck1lZGlhUXVlcnkgfSBmcm9tICcuLi9fdXRpbHMnO1xuY29uc3QgcmVzcG9uc2l2ZU1hcCA9IHtcbiAgeHM6ICcobWF4LXdpZHRoOiA1NzVweCknLFxuICBzbTogJyhtaW4td2lkdGg6IDU3NnB4KScsXG4gIG1kOiAnKG1pbi13aWR0aDogNzY4cHgpJyxcbiAgbGc6ICcobWluLXdpZHRoOiA5OTJweCknLFxuICB4bDogJyhtaW4td2lkdGg6IDEyMDBweCknLFxuICB4eGw6ICcobWluLXdpZHRoOiAxNjAwcHgpJ1xufTtcbmNvbnN0IGdlbmVyYXRlSWQgPSAoKCkgPT4ge1xuICBsZXQgaSA9IDA7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaSArPSAxO1xuICAgIHJldHVybiBgJHtjc3NDbGFzc2VzLlBSRUZJWH0tc2lkZXItJHtpfWA7XG4gIH07XG59KSgpO1xuY29uc3QgYnB0ID0gc3RyaW5ncy5CUkVBS1BPSU5UO1xuY2xhc3MgU2lkZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy51blJlZ2lzdGVycyA9IFtdO1xuICAgIHRoaXMudW5pcXVlSWQgPSAnJztcbiAgICB0aGlzLnVuaXF1ZUlkID0gZ2VuZXJhdGVJZCgpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGJyZWFrcG9pbnRcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBtYXRjaEJwdCA9IE9iamVjdC5rZXlzKHJlc3BvbnNpdmVNYXApLmZpbHRlcihpdGVtID0+IGJyZWFrcG9pbnQgJiYgYnJlYWtwb2ludC5pbmRleE9mKGl0ZW0pICE9PSAtMSk7XG4gICAgY29uc3QgdW5SZWdpc3RlcnMgPSBtYXRjaEJwdC5tYXAoc2NyZWVuID0+IHJlZ2lzdGVyTWVkaWFRdWVyeShyZXNwb25zaXZlTWFwW3NjcmVlbl0sIHtcbiAgICAgIG1hdGNoOiAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzcG9uc2l2ZUhhbmRsZXIoc2NyZWVuLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICB1bm1hdGNoOiAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzcG9uc2l2ZUhhbmRsZXIoc2NyZWVuLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIHRoaXMudW5SZWdpc3RlcnMgPSB1blJlZ2lzdGVycztcbiAgICBpZiAodGhpcy5jb250ZXh0LnNpZGVySG9vaykge1xuICAgICAgdGhpcy5jb250ZXh0LnNpZGVySG9vay5hZGRTaWRlcih0aGlzLnVuaXF1ZUlkKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy51blJlZ2lzdGVycy5mb3JFYWNoKHVuUmVnaXN0ZXIgPT4gdW5SZWdpc3RlcigpKTtcbiAgICBpZiAodGhpcy5jb250ZXh0LnNpZGVySG9vaykge1xuICAgICAgdGhpcy5jb250ZXh0LnNpZGVySG9vay5yZW1vdmVTaWRlcih0aGlzLnVuaXF1ZUlkKTtcbiAgICB9XG4gIH1cbiAgcmVzcG9uc2l2ZUhhbmRsZXIoc2NyZWVuLCBtYXRjaGVzKSB7XG4gICAgY29uc3Qge1xuICAgICAgb25CcmVha3BvaW50XG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKG9uQnJlYWtwb2ludCkge1xuICAgICAgb25CcmVha3BvaW50KHNjcmVlbiwgbWF0Y2hlcyk7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIHByZWZpeENscyxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBfYSxcbiAgICAgIG90aGVycyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJzdHlsZVwiXSk7XG4gICAgY29uc3QgY2xhc3NTdHJpbmcgPSBjbHMoY2xhc3NOYW1lLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1zaWRlcmBdOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYXNpZGVcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgICAgXCJhcmlhLWxhYmVsXCI6IHRoaXMucHJvcHNbJ2FyaWEtbGFiZWwnXSxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIGdldERhdGFBdHRyKG90aGVycykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tc2lkZXItY2hpbGRyZW5gXG4gICAgfSwgY2hpbGRyZW4pKTtcbiAgfVxufVxuU2lkZXIucHJvcFR5cGVzID0ge1xuICBwcmVmaXhDbHM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGJyZWFrcG9pbnQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZihicHQpKSxcbiAgb25CcmVha3BvaW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgJ2FyaWEtbGFiZWwnOiBQcm9wVHlwZXMuc3RyaW5nLFxuICByb2xlOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuU2lkZXIuZGVmYXVsdFByb3BzID0ge1xuICBwcmVmaXhDbHM6IGNzc0NsYXNzZXMuUFJFRklYXG59O1xuU2lkZXIuY29udGV4dFR5cGUgPSBMYXlvdXRDb250ZXh0O1xuU2lkZXIuZWxlbWVudFR5cGUgPSBcIkxheW91dC5TaWRlclwiO1xuZXhwb3J0IGRlZmF1bHQgU2lkZXI7IiwgImltcG9ydCBfbm9vcCBmcm9tIFwibG9kYXNoL25vb3BcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzLCBzdHJpbmdzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvbGlzdC9jb25zdGFudHMnO1xuaW1wb3J0ICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9saXN0L2xpc3QuY3NzJztcbmltcG9ydCBMb2NhbGVDb25zdW1lciBmcm9tICcuLi9sb2NhbGUvbG9jYWxlQ29uc3VtZXInO1xuaW1wb3J0IExpc3RJdGVtIGZyb20gJy4vaXRlbSc7XG5pbXBvcnQgeyBSb3cgfSBmcm9tICcuLi9ncmlkJztcbmltcG9ydCBTcGluIGZyb20gJy4uL3NwaW4nO1xuaW1wb3J0IExpc3RDb250ZXh0IGZyb20gJy4vbGlzdC1jb250ZXh0JztcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4uL19iYXNlL2Jhc2VDb21wb25lbnQnO1xuY29uc3QgcHJlZml4Q2xzID0gY3NzQ2xhc3Nlcy5QUkVGSVg7XG5jbGFzcyBMaXN0IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy5yZW5kZXJFbXB0eSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZW1wdHlDb250ZW50XG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmIChlbXB0eUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGAke2Nzc0NsYXNzZXMuUFJFRklYfS1lbXB0eWAsXG4gICAgICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImVtcHR5Q29udGVudFwiXG4gICAgICAgIH0sIGVtcHR5Q29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYWxlQ29uc3VtZXIsIHtcbiAgICAgICAgICBjb21wb25lbnROYW1lOiBcIkxpc3RcIlxuICAgICAgICB9LCBsb2NhbGUgPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGAke2Nzc0NsYXNzZXMuUFJFRklYfS1lbXB0eWBcbiAgICAgICAgfSwgbG9jYWxlLmVtcHR5VGV4dCkpKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHdyYXBDaGlsZHJlbihjaGlsZHJlbkxpc3QsIGNoaWxkcmVuKSB7XG4gICAgY29uc3Qge1xuICAgICAgZ3JpZFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChncmlkKSB7XG4gICAgICBjb25zdCByb3dQcm9wcyA9IHt9O1xuICAgICAgWydhbGlnbicsICdndXR0ZXInLCAnanVzdGlmeScsICd0eXBlJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGdyaWQpIHtcbiAgICAgICAgICByb3dQcm9wc1trZXldID0gZ3JpZFtrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3csIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICB0eXBlOiBcImZsZXhcIlxuICAgICAgfSwgcm93UHJvcHMpLCBjaGlsZHJlbkxpc3QgPyBjaGlsZHJlbkxpc3QgOiBudWxsLCBjaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1pdGVtc2BcbiAgICB9LCBjaGlsZHJlbkxpc3QgPyBjaGlsZHJlbkxpc3QgOiBudWxsLCBjaGlsZHJlbik7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IF9hID0gdGhpcy5wcm9wcyxcbiAgICAgIHtcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgaGVhZGVyLFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBvblJpZ2h0Q2xpY2ssXG4gICAgICAgIG9uQ2xpY2ssXG4gICAgICAgIGZvb3RlcixcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBncmlkLFxuICAgICAgICBzaXplLFxuICAgICAgICBzcGxpdCxcbiAgICAgICAgbG9hZE1vcmUsXG4gICAgICAgIGJvcmRlcmVkLFxuICAgICAgICBkYXRhU291cmNlLFxuICAgICAgICByZW5kZXJJdGVtLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wic3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJoZWFkZXJcIiwgXCJsb2FkaW5nXCIsIFwib25SaWdodENsaWNrXCIsIFwib25DbGlja1wiLCBcImZvb3RlclwiLCBcImxheW91dFwiLCBcImdyaWRcIiwgXCJzaXplXCIsIFwic3BsaXRcIiwgXCJsb2FkTW9yZVwiLCBcImJvcmRlcmVkXCIsIFwiZGF0YVNvdXJjZVwiLCBcInJlbmRlckl0ZW1cIiwgXCJjaGlsZHJlblwiXSk7XG4gICAgY29uc3Qgd3JhcHBlckNscyA9IGNscyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwge1xuICAgICAgW2Ake3ByZWZpeENsc30tZmxleGBdOiBsYXlvdXQgPT09ICdob3Jpem9udGFsJyxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LSR7c2l6ZX1gXTogc2l6ZSxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LWdyaWRgXTogZ3JpZCxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LXNwbGl0YF06IHNwbGl0LFxuICAgICAgW2Ake3ByZWZpeENsc30tYm9yZGVyZWRgXTogYm9yZGVyZWRcbiAgICB9KTtcbiAgICBsZXQgY2hpbGRyZW5MaXN0O1xuICAgIGlmIChkYXRhU291cmNlICYmIGRhdGFTb3VyY2UubGVuZ3RoKSB7XG4gICAgICBjaGlsZHJlbkxpc3QgPSBbXTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gcmVuZGVySXRlbSA/IGRhdGFTb3VyY2UubWFwKChpdGVtLCBpbmRleCkgPT4gcmVuZGVySXRlbShpdGVtLCBpbmRleCkpIDogW107XG4gICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGl0ZW1zLCAoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1LZXkgPSBjaGlsZC5rZXkgfHwgYGxpc3QtaXRlbS0ke2luZGV4fWA7XG4gICAgICAgIGNoaWxkcmVuTGlzdC5wdXNoKC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICBrZXk6IGl0ZW1LZXlcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuTGlzdCA9IHRoaXMucmVuZGVyRW1wdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY2xhc3NOYW1lOiB3cmFwcGVyQ2xzLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSwgdGhpcy5nZXREYXRhQXR0cihyZXN0KSksIGhlYWRlciA/ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke2Nzc0NsYXNzZXMuUFJFRklYfS1oZWFkZXJgLFxuICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImhlYWRlclwiXG4gICAgfSwgaGVhZGVyKSkgOiBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaXN0Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZ3JpZCxcbiAgICAgICAgb25SaWdodENsaWNrLFxuICAgICAgICBvbkNsaWNrXG4gICAgICB9XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3Bpbiwge1xuICAgICAgc3Bpbm5pbmc6IGxvYWRpbmcsXG4gICAgICBzaXplOiBcImxhcmdlXCJcbiAgICB9LCB0aGlzLndyYXBDaGlsZHJlbihjaGlsZHJlbkxpc3QsIGNoaWxkcmVuKSkpLCBmb290ZXIgPyAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBgJHtjc3NDbGFzc2VzLlBSRUZJWH0tZm9vdGVyYCxcbiAgICAgIFwieC1zZW1pLXByb3BcIjogXCJmb290ZXJcIlxuICAgIH0sIGZvb3RlcikpIDogbnVsbCwgbG9hZE1vcmUgPyBsb2FkTW9yZSA6IG51bGwpO1xuICB9XG59XG5MaXN0Lkl0ZW0gPSBMaXN0SXRlbTtcbkxpc3QucHJvcFR5cGVzID0ge1xuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBib3JkZXJlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGZvb3RlcjogUHJvcFR5cGVzLm5vZGUsXG4gIGhlYWRlcjogUHJvcFR5cGVzLm5vZGUsXG4gIGxheW91dDogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuTEFZT1VUKSxcbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKHN0cmluZ3MuU0laRSksXG4gIHNwbGl0OiBQcm9wVHlwZXMuYm9vbCxcbiAgZW1wdHlDb250ZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgZGF0YVNvdXJjZTogUHJvcFR5cGVzLmFycmF5LFxuICByZW5kZXJJdGVtOiBQcm9wVHlwZXMuZnVuYyxcbiAgZ3JpZDogUHJvcFR5cGVzLm9iamVjdCxcbiAgbG9hZGluZzogUHJvcFR5cGVzLmJvb2wsXG4gIGxvYWRNb3JlOiBQcm9wVHlwZXMubm9kZSxcbiAgb25SaWdodENsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmNcbn07XG5MaXN0LmRlZmF1bHRQcm9wcyA9IHtcbiAgYm9yZGVyZWQ6IGZhbHNlLFxuICBzcGxpdDogdHJ1ZSxcbiAgbG9hZGluZzogZmFsc2UsXG4gIGxheW91dDogJ3ZlcnRpY2FsJyxcbiAgc2l6ZTogJ2RlZmF1bHQnLFxuICBvblJpZ2h0Q2xpY2s6IF9ub29wLFxuICBvbkNsaWNrOiBfbm9vcFxufTtcbmV4cG9ydCBkZWZhdWx0IExpc3Q7IiwgImltcG9ydCB7IEJBU0VfQ0xBU1NfUFJFRklYIH0gZnJvbSAnLi4vYmFzZS9jb25zdGFudHMnO1xuY29uc3QgY3NzQ2xhc3NlcyA9IHtcbiAgUFJFRklYOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tbGlzdGBcbn07XG5jb25zdCBzdHJpbmdzID0ge1xuICBTSVpFOiBbJ2xhcmdlJywgJ3NtYWxsJywgJ2RlZmF1bHQnXSxcbiAgTEFZT1VUOiBbJ3ZlcnRpY2FsJywgJ2hvcml6b250YWwnXSxcbiAgQUxJR046IFsnZmxleC1zdGFydCcsICdmbGV4LWVuZCcsICdjZW50ZXInLCAnYmFzZWxpbmUnLCAnc3RyZXRjaCddXG59O1xuZXhwb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9OyIsICJpbXBvcnQgX25vb3AgZnJvbSBcImxvZGFzaC9ub29wXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9saXN0L2NvbnN0YW50cyc7XG5pbXBvcnQgZ2V0RGF0YUF0dHIgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZ2V0RGF0YUF0dHInO1xuaW1wb3J0IHsgQ29sIH0gZnJvbSAnLi4vZ3JpZCc7XG5pbXBvcnQgTGlzdENvbnRleHQgZnJvbSAnLi9saXN0LWNvbnRleHQnO1xuY29uc3QgcHJlZml4Q2xzID0gY3NzQ2xhc3Nlcy5QUkVGSVg7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0SXRlbSBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICB3cmFwV2l0aEdyaWQoY29udGVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGdyaWRcbiAgICB9ID0gdGhpcy5jb250ZXh0O1xuICAgIGNvbnN0IHtcbiAgICAgICAgZ3V0dGVyLFxuICAgICAgICBqdXN0aWZ5LFxuICAgICAgICB0eXBlLFxuICAgICAgICBhbGlnblxuICAgICAgfSA9IGdyaWQsXG4gICAgICByZXN0ID0gX19yZXN0KGdyaWQsIFtcImd1dHRlclwiLCBcImp1c3RpZnlcIiwgXCJ0eXBlXCIsIFwiYWxpZ25cIl0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb2wsIE9iamVjdC5hc3NpZ24oe30sIHJlc3QpLCBjb250ZW50KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgX2EgPSB0aGlzLnByb3BzLFxuICAgICAge1xuICAgICAgICBoZWFkZXIsXG4gICAgICAgIG1haW4sXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIGV4dHJhLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgYWxpZ24sXG4gICAgICAgIG9uQ2xpY2ssXG4gICAgICAgIG9uUmlnaHRDbGljayxcbiAgICAgICAgb25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmVcbiAgICAgIH0gPSBfYSxcbiAgICAgIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImhlYWRlclwiLCBcIm1haW5cIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImV4dHJhXCIsIFwiY2hpbGRyZW5cIiwgXCJhbGlnblwiLCBcIm9uQ2xpY2tcIiwgXCJvblJpZ2h0Q2xpY2tcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJvbk1vdXNlTGVhdmVcIl0pO1xuICAgIGNvbnN0IHtcbiAgICAgIG9uUmlnaHRDbGljazogY29udGV4dE9uUmlnaHRDbGljayxcbiAgICAgIG9uQ2xpY2s6IGNvbnRleHRPbkNsaWNrLFxuICAgICAgZ3JpZDogY29udGV4dEdyaWRcbiAgICB9ID0gdGhpcy5jb250ZXh0O1xuICAgIGNvbnN0IGhhbmRsZUNvbnRleHRNZW51ID0gb25SaWdodENsaWNrID8gb25SaWdodENsaWNrIDogY29udGV4dE9uUmlnaHRDbGljaztcbiAgICBjb25zdCBoYW5kbGVDbGljayA9IG9uQ2xpY2sgPyBvbkNsaWNrIDogY29udGV4dE9uQ2xpY2s7XG4gICAgY29uc3QgaXRlbUNscyA9IGNscyhgJHtwcmVmaXhDbHN9LWl0ZW1gLCBjbGFzc05hbWUpO1xuICAgIGNvbnN0IGJvZHlDbHMgPSBjbHMoYCR7cHJlZml4Q2xzfS1pdGVtLWJvZHlgLCB7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1pdGVtLWJvZHktJHthbGlnbn1gXTogYWxpZ25cbiAgICB9KTtcbiAgICBsZXQgYm9keTtcbiAgICBpZiAoaGVhZGVyIHx8IG1haW4pIHtcbiAgICAgIGJvZHkgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYm9keUNsc1xuICAgICAgfSwgaGVhZGVyID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taXRlbS1ib2R5LWhlYWRlcmBcbiAgICAgIH0sIGhlYWRlcikgOiBudWxsLCBtYWluID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30taXRlbS1ib2R5LW1haW5gXG4gICAgICB9LCBtYWluKSA6IG51bGwpO1xuICAgIH1cbiAgICBsZXQgY29udGVudCA9XG4gICAgLyojX19QVVJFX18qL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzLCBqc3gtYTExeS9uby1ub25pbnRlcmFjdGl2ZS1lbGVtZW50LWludGVyYWN0aW9uc1xuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGNsYXNzTmFtZTogaXRlbUNscyxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICAgb25Db250ZXh0TWVudTogaGFuZGxlQ29udGV4dE1lbnUsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlXG4gICAgfSwgZ2V0RGF0YUF0dHIocmVzdCkpLCBib2R5ID8gYm9keSA6IG51bGwsIGNoaWxkcmVuLCBleHRyYSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1pdGVtLWV4dHJhYFxuICAgIH0sIGV4dHJhKSA6IG51bGwpO1xuICAgIGlmICh0aGlzLmNvbnRleHQgJiYgY29udGV4dEdyaWQpIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLndyYXBXaXRoR3JpZChjb250ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbn1cbkxpc3RJdGVtLmNvbnRleHRUeXBlID0gTGlzdENvbnRleHQ7XG5MaXN0SXRlbS5wcm9wVHlwZXMgPSB7XG4gIGV4dHJhOiBQcm9wVHlwZXMubm9kZSxcbiAgaGVhZGVyOiBQcm9wVHlwZXMubm9kZSxcbiAgbWFpbjogUHJvcFR5cGVzLm5vZGUsXG4gIGFsaWduOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5BTElHTiksXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uUmlnaHRDbGljazogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VFbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VMZWF2ZTogUHJvcFR5cGVzLmZ1bmNcbn07XG5MaXN0SXRlbS5kZWZhdWx0UHJvcHMgPSB7XG4gIGFsaWduOiAnZmxleC1zdGFydCcsXG4gIG9uTW91c2VFbnRlcjogX25vb3AsXG4gIG9uTW91c2VMZWF2ZTogX25vb3Bcbn07IiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBMaXN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgTGlzdENvbnRleHQ7IiwgImltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX2lzRXF1YWwgZnJvbSBcImxvZGFzaC9pc0VxdWFsXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4uL19iYXNlL2Jhc2VDb21wb25lbnQnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MsIG51bWJlcnMgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9vdmVyZmxvd0xpc3QvY29uc3RhbnRzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICcuLi9yZXNpemVPYnNlcnZlcic7XG5pbXBvcnQgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgZnJvbSAnLi9pbnRlcnNlY3Rpb25PYnNlcnZlcic7XG5pbXBvcnQgT3ZlcmZsb3dMaXN0Rm91bmRhdGlvbiBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy9vdmVyZmxvd0xpc3QvZm91bmRhdGlvbic7XG5pbXBvcnQgJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL292ZXJmbG93TGlzdC9vdmVyZmxvd0xpc3QuY3NzJztcbmltcG9ydCB7IGdldERlZmF1bHRQcm9wc0Zyb21HbG9iYWxDb25maWcgfSBmcm9tICcuLi9fdXRpbHMnO1xuaW1wb3J0IGNvcHkgZnJvbSAnZmFzdC1jb3B5JztcbmNvbnN0IHByZWZpeENscyA9IGNzc0NsYXNzZXMuUFJFRklYO1xuY29uc3QgQm91bmRhcnkgPSBzdHJpbmdzLkJPVU5EQVJZX01BUDtcbmNvbnN0IE92ZXJmbG93RGlyZWN0aW9uID0gc3RyaW5ncy5PVkVSRkxPV19ESVI7XG5jb25zdCBSZW5kZXJNb2RlID0gc3RyaW5ncy5NT0RFX01BUDtcbi8vIHJlZmVyZW5jZSB0byBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvYmx1ZXByaW50L2Jsb2IvMWFhNzE2MDUvcGFja2FnZXMvY29yZS9zcmMvY29tcG9uZW50cy9vdmVyZmxvdy1saXN0L292ZXJmbG93TGlzdC50c3gjTDM0XG5jbGFzcyBPdmVyZmxvd0xpc3QgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIF90aGlzID0gdGhpcztcbiAgICB0aGlzLnNjcm9sbGVyID0gbnVsbDtcbiAgICB0aGlzLnNwYWNlciA9IG51bGw7XG4gICAgdGhpcy5pc1Njcm9sbE1vZGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlbmRlck1vZGVcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgcmV0dXJuIHJlbmRlck1vZGUgPT09IFJlbmRlck1vZGUuU0NST0xMO1xuICAgIH07XG4gICAgdGhpcy5yZXNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgZW50cmllcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IChfYSA9IGVudHJpZXNbMF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YXJnZXQuY2xpZW50V2lkdGg7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGNvbnRhaW5lcldpZHRoLFxuICAgICAgICBvdmVyZmxvd1N0YXR1czogJ2NhbGN1bGF0aW5nJ1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJlaW50ZXJzZWN0ID0gZW50cmllcyA9PiB7XG4gICAgICB0aGlzLmZvdW5kYXRpb24uaGFuZGxlSW50ZXJzZWN0KGVudHJpZXMpO1xuICAgIH07XG4gICAgdGhpcy5tZXJnZVJlZiA9IChyZWYsIG5vZGUsIGtleSkgPT4ge1xuICAgICAgdGhpcy5pdGVtUmVmc1trZXldID0gbm9kZTtcbiAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlZihub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlZiA9PT0gJ29iamVjdCcgJiYgcmVmICYmICdjdXJyZW50JyBpbiByZWYpIHtcbiAgICAgICAgcmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5yZW5kZXJPdmVyZmxvdyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0gdGhpcy5mb3VuZGF0aW9uLmdldE92ZXJmbG93SXRlbSgpO1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMub3ZlcmZsb3dSZW5kZXJlcihvdmVyZmxvdyk7XG4gICAgfTtcbiAgICB0aGlzLmdldEl0ZW1LZXkgPSAoaXRlbSwgZGVmYXVsdEtleSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpdGVtS2V5XG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmIChfaXNGdW5jdGlvbihpdGVtS2V5KSkge1xuICAgICAgICByZXR1cm4gaXRlbUtleShpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfZ2V0KGl0ZW0sIGl0ZW1LZXkgfHwgJ2tleScsIGRlZmF1bHRLZXkpO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJJdGVtTGlzdCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICB3cmFwcGVyQ2xhc3NOYW1lLFxuICAgICAgICB3cmFwcGVyU3R5bGUsXG4gICAgICAgIHN0eWxlLFxuICAgICAgICB2aXNpYmxlSXRlbVJlbmRlcmVyLFxuICAgICAgICByZW5kZXJNb2RlLFxuICAgICAgICBjb2xsYXBzZUZyb21cbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge1xuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBvdmVyZmxvd1N0YXR1c1xuICAgICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBsZXQgb3ZlcmZsb3cgPSB0aGlzLnJlbmRlck92ZXJmbG93KCk7XG4gICAgICBpZiAoIXRoaXMuaXNTY3JvbGxNb2RlKCkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3ZlcmZsb3cpKSB7XG4gICAgICAgICAgb3ZlcmZsb3cgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgb3ZlcmZsb3cpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQob3ZlcmZsb3cpKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KG92ZXJmbG93KTtcbiAgICAgICAgICBvdmVyZmxvdyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgICAgICAgICBvblJlc2l6ZTogX3JlZiA9PiB7XG4gICAgICAgICAgICAgIGxldCBbZW50cnldID0gX3JlZjtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dXaWR0aDogZW50cnkudGFyZ2V0LmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgICAgIG92ZXJmbG93U3RhdHVzOiAnY2FsY3VsYXRpbmcnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1vdmVyZmxvd2BcbiAgICAgICAgICB9LCBjaGlsZCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lciA9IHJlbmRlck1vZGUgPT09IFJlbmRlck1vZGUuU0NST0xMID8gKCgpID0+IHtcbiAgICAgICAgY29uc3QgbGlzdCA9IFsvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbHMod3JhcHBlckNsYXNzTmFtZSwgYCR7cHJlZml4Q2xzfS1zY3JvbGwtd3JhcHBlcmApLFxuICAgICAgICAgIHJlZjogcmVmID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsZXIgPSByZWY7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbih7fSwgd3JhcHBlclN0eWxlKSxcbiAgICAgICAgICBrZXk6IGAke3ByZWZpeENsc30tc2Nyb2xsLXdyYXBwZXJgXG4gICAgICAgIH0sIHZpc2libGUubWFwKHZpc2libGVJdGVtUmVuZGVyZXIpLm1hcChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmb3J3YXJkUmVmLFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgfSA9IGl0ZW07XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoaXRlbSwge1xuICAgICAgICAgICAgcmVmOiBub2RlID0+IHRoaXMubWVyZ2VSZWYoZm9yd2FyZFJlZiwgbm9kZSwga2V5KSxcbiAgICAgICAgICAgICdkYXRhLXNjcm9sbGtleSc6IGAke2tleX1gLFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKV07XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm92ZXJmbG93UmVuZGVyRGlyZWN0aW9uID09PSBcImJvdGhcIikge1xuICAgICAgICAgIGxpc3QudW5zaGlmdChvdmVyZmxvd1swXSk7XG4gICAgICAgICAgbGlzdC5wdXNoKG92ZXJmbG93WzFdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLm92ZXJmbG93UmVuZGVyRGlyZWN0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICBsaXN0LnVuc2hpZnQob3ZlcmZsb3dbMV0pO1xuICAgICAgICAgIGxpc3QudW5zaGlmdChvdmVyZmxvd1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGlzdC5wdXNoKG92ZXJmbG93WzBdKTtcbiAgICAgICAgICBsaXN0LnB1c2gob3ZlcmZsb3dbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgfSkoKSA6IFtjb2xsYXBzZUZyb20gPT09IEJvdW5kYXJ5LlNUQVJUID8gb3ZlcmZsb3cgOiBudWxsLCB2aXNpYmxlLm1hcCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBrZXlcbiAgICAgICAgfSA9IGl0ZW07XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB2aXNpYmxlSXRlbVJlbmRlcmVyKGl0ZW0sIGlkeCk7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgICAgICAga2V5OiBrZXkgIT09IG51bGwgJiYga2V5ICE9PSB2b2lkIDAgPyBrZXkgOiBpZHgsXG4gICAgICAgICAgb25SZXNpemU6IF9yZWYyID0+IHtcbiAgICAgICAgICAgIGxldCBbZW50cnldID0gX3JlZjI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vbkl0ZW1SZXNpemUoZW50cnksIGl0ZW0sIGlkeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAga2V5OiBrZXkgIT09IG51bGwgJiYga2V5ICE9PSB2b2lkIDAgPyBrZXkgOiBpZHgsXG4gICAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWl0ZW1gXG4gICAgICAgIH0sIGNoaWxkKSk7XG4gICAgICB9KSwgY29sbGFwc2VGcm9tID09PSBCb3VuZGFyeS5FTkQgPyBvdmVyZmxvdyA6IG51bGxdO1xuICAgICAgY29uc3QgbGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xzKGAke3ByZWZpeENsc31gLCBjbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSksIHJlbmRlck1vZGUgPT09IFJlbmRlck1vZGUuQ09MTEFQU0UgPyB7XG4gICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICB2aXNpYmlsaXR5OiBvdmVyZmxvd1N0YXR1cyA9PT0gXCJjYWxjdWxhdGluZ1wiID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiXG4gICAgICAgIH0gOiBudWxsKVxuICAgICAgfSwgLi4uaW5uZXIpO1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfTtcbiAgICB0aGlzLm9uSXRlbVJlc2l6ZSA9IChlbnRyeSwgaXRlbSwgaWR4KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEl0ZW1LZXkoaXRlbSwgaWR4KTtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5pdGVtU2l6ZU1hcC5nZXQoa2V5KTtcbiAgICAgIGlmICghd2lkdGgpIHtcbiAgICAgICAgdGhpcy5pdGVtU2l6ZU1hcC5zZXQoa2V5LCBlbnRyeS50YXJnZXQuY2xpZW50V2lkdGgpO1xuICAgICAgfSBlbHNlIGlmICh3aWR0aCAhPT0gZW50cnkudGFyZ2V0LmNsaWVudFdpZHRoKSB7XG4gICAgICAgIC8vIFx1NjdEMFx1NEUyQWl0ZW1cdTUzRDFcdTc1MUZyZXNpemVcdTU0MEVcdUZGMENcdTkxQ0RcdTY1QjBcdThCQTFcdTdCOTdcbiAgICAgICAgdGhpcy5pdGVtU2l6ZU1hcC5zZXQoa2V5LCBlbnRyeS50YXJnZXQuY2xpZW50V2lkdGgpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBvdmVyZmxvd1N0YXR1czogJ2NhbGN1bGF0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWF4Q291bnRcbiAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgLy8gXHU1REYyXHU3RUNGXHU2MzA5XHU3MTY3XHU2NzAwXHU1OTI3XHU1MDNDbWF4Q291bnRcdTZFMzJcdTY3RDNcdTVCOENcdTZCRDVcdUZGMENcdTg5RTZcdTUzRDFcdTc3MUZcdTZCNjNcdTc2ODRcdTZFMzJcdTY3RDNcbiAgICAgIC8vIEFscmVhZHkgcmVuZGVyZWQgbWF4Q291bnQgaXRlbXMsIHRyaWdnZXIgdGhlIHJlYWwgcmVuZGVyaW5nXG4gICAgICBpZiAodGhpcy5pdGVtU2l6ZU1hcC5zaXplID09PSBtYXhDb3VudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBvdmVyZmxvd1N0YXR1czogJ2NhbGN1bGF0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkaXJlY3Rpb246IE92ZXJmbG93RGlyZWN0aW9uLkdST1csXG4gICAgICBsYXN0T3ZlcmZsb3dDb3VudDogMCxcbiAgICAgIG92ZXJmbG93OiBbXSxcbiAgICAgIHZpc2libGU6IFtdLFxuICAgICAgY29udGFpbmVyV2lkdGg6IDAsXG4gICAgICB2aXNpYmxlU3RhdGU6IG5ldyBNYXAoKSxcbiAgICAgIGl0ZW1TaXplTWFwOiBuZXcgTWFwKCksXG4gICAgICBvdmVyZmxvd1N0YXR1czogXCJjYWxjdWxhdGluZ1wiLFxuICAgICAgcGl2b3Q6IC0xLFxuICAgICAgb3ZlcmZsb3dXaWR0aDogMCxcbiAgICAgIG1heENvdW50OiAwXG4gICAgfTtcbiAgICB0aGlzLmZvdW5kYXRpb24gPSBuZXcgT3ZlcmZsb3dMaXN0Rm91bmRhdGlvbih0aGlzLmFkYXB0ZXIpO1xuICAgIHRoaXMucHJldmlvdXNXaWR0aHMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5pdGVtUmVmcyA9IHt9O1xuICAgIHRoaXMuaXRlbVNpemVNYXAgPSBuZXcgTWFwKCk7XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgcHJldlN0YXRlKSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJldlByb3BzXG4gICAgfSA9IHByZXZTdGF0ZTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHt9O1xuICAgIG5ld1N0YXRlLnByZXZQcm9wcyA9IHByb3BzO1xuICAgIGNvbnN0IG5lZWRVcGRhdGUgPSBuYW1lID0+IHtcbiAgICAgIHJldHVybiAhcHJldlByb3BzICYmIG5hbWUgaW4gcHJvcHMgfHwgcHJldlByb3BzICYmICFfaXNFcXVhbChwcmV2UHJvcHNbbmFtZV0sIHByb3BzW25hbWVdKTtcbiAgICB9O1xuICAgIGlmIChuZWVkVXBkYXRlKCdpdGVtcycpIHx8IG5lZWRVcGRhdGUoJ3N0eWxlJykpIHtcbiAgICAgIC8vIHJlc2V0IHZpc2libGUgc3RhdGUgaWYgdGhlIGFib3ZlIHByb3BzIGNoYW5nZS5cbiAgICAgIG5ld1N0YXRlLmRpcmVjdGlvbiA9IE92ZXJmbG93RGlyZWN0aW9uLkdST1c7XG4gICAgICBuZXdTdGF0ZS5sYXN0T3ZlcmZsb3dDb3VudCA9IDA7XG4gICAgICBuZXdTdGF0ZS5tYXhDb3VudCA9IDA7XG4gICAgICBpZiAocHJvcHMucmVuZGVyTW9kZSA9PT0gUmVuZGVyTW9kZS5TQ1JPTEwpIHtcbiAgICAgICAgbmV3U3RhdGUudmlzaWJsZSA9IHByb3BzLml0ZW1zO1xuICAgICAgICBuZXdTdGF0ZS5vdmVyZmxvdyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1heENvdW50ID0gcHJvcHMuaXRlbXMubGVuZ3RoO1xuICAgICAgICBpZiAoTWF0aC5mbG9vcihwcmV2U3RhdGUuY29udGFpbmVyV2lkdGggLyBudW1iZXJzLk1JTklNVU1fSFRNTF9FTEVNRU5UX1dJRFRIKSAhPT0gMCkge1xuICAgICAgICAgIG1heENvdW50ID0gTWF0aC5taW4obWF4Q291bnQsIE1hdGguZmxvb3IocHJldlN0YXRlLmNvbnRhaW5lcldpZHRoIC8gbnVtYmVycy5NSU5JTVVNX0hUTUxfRUxFTUVOVF9XSURUSCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQ29sbGFwc2VGcm9tU3RhcnQgPSBwcm9wcy5jb2xsYXBzZUZyb20gPT09IEJvdW5kYXJ5LlNUQVJUO1xuICAgICAgICBjb25zdCB2aXNpYmxlID0gaXNDb2xsYXBzZUZyb21TdGFydCA/IGNvcHkocHJvcHMuaXRlbXMpLnJldmVyc2UoKS5zbGljZSgwLCBtYXhDb3VudCkgOiBwcm9wcy5pdGVtcy5zbGljZSgwLCBtYXhDb3VudCk7XG4gICAgICAgIGNvbnN0IG92ZXJmbG93ID0gaXNDb2xsYXBzZUZyb21TdGFydCA/IGNvcHkocHJvcHMuaXRlbXMpLnJldmVyc2UoKS5zbGljZShtYXhDb3VudCkgOiBwcm9wcy5pdGVtcy5zbGljZShtYXhDb3VudCk7XG4gICAgICAgIG5ld1N0YXRlLnZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICBuZXdTdGF0ZS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICBuZXdTdGF0ZS5tYXhDb3VudCA9IG1heENvdW50O1xuICAgICAgfVxuICAgICAgbmV3U3RhdGUucGl2b3QgPSAtMTtcbiAgICAgIG5ld1N0YXRlLm92ZXJmbG93U3RhdHVzID0gXCJjYWxjdWxhdGluZ1wiO1xuICAgIH1cbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH1cbiAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuYWRhcHRlciksIHtcbiAgICAgIHVwZGF0ZVZpc2libGVTdGF0ZTogdmlzaWJsZVN0YXRlID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdmlzaWJsZVN0YXRlXG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgIChfYiA9IChfYSA9IHRoaXMucHJvcHMpLm9uVmlzaWJsZVN0YXRlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgdmlzaWJsZVN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdXBkYXRlU3RhdGVzOiBzdGF0ZXMgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlcykpO1xuICAgICAgfSxcbiAgICAgIG5vdGlmeUludGVyc2VjdDogcmVzID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkludGVyc2VjdCAmJiB0aGlzLnByb3BzLm9uSW50ZXJzZWN0KHJlcyk7XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbVNpemVNYXA6ICgpID0+IHRoaXMuaXRlbVNpemVNYXBcbiAgICB9KTtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICBjb25zdCBwcmV2SXRlbXNLZXlzID0gcHJldlByb3BzLml0ZW1zLm1hcChpdGVtID0+IGl0ZW0ua2V5KTtcbiAgICBjb25zdCBub3dJdGVtc0tleXMgPSB0aGlzLnByb3BzLml0ZW1zLm1hcChpdGVtID0+IGl0ZW0ua2V5KTtcbiAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0byB1cGRhdGUgYnkgY29tcGFyaW5nIGtleSB2YWx1ZXNcbiAgICBpZiAoIV9pc0VxdWFsKHByZXZJdGVtc0tleXMsIG5vd0l0ZW1zS2V5cykpIHtcbiAgICAgIHRoaXMuaXRlbVJlZnMgPSB7fTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB2aXNpYmxlU3RhdGU6IG5ldyBNYXAoKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIG92ZXJmbG93LFxuICAgICAgY29udGFpbmVyV2lkdGgsXG4gICAgICB2aXNpYmxlLFxuICAgICAgb3ZlcmZsb3dTdGF0dXNcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAodGhpcy5pc1Njcm9sbE1vZGUoKSB8fCBvdmVyZmxvd1N0YXR1cyAhPT0gXCJjYWxjdWxhdGluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm91bmRhdGlvbi5oYW5kbGVDb2xsYXBzZU92ZXJmbG93KCk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLnJlbmRlckl0ZW1MaXN0KCk7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyTW9kZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChyZW5kZXJNb2RlID09PSBSZW5kZXJNb2RlLlNDUk9MTCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEludGVyc2VjdGlvbk9ic2VydmVyLCB7XG4gICAgICAgIG9uSW50ZXJzZWN0OiB0aGlzLnJlaW50ZXJzZWN0LFxuICAgICAgICByb290OiB0aGlzLnNjcm9sbGVyLFxuICAgICAgICB0aHJlc2hvbGQ6IHRoaXMucHJvcHMudGhyZXNob2xkLFxuICAgICAgICBpdGVtczogdGhpcy5pdGVtUmVmc1xuICAgICAgfSwgbGlzdCk7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgICAgb25SZXNpemU6IHRoaXMucmVzaXplXG4gICAgfSwgbGlzdCk7XG4gIH1cbn1cbk92ZXJmbG93TGlzdC5fX1NlbWlDb21wb25lbnROYW1lX18gPSBcIk92ZXJmbG93TGlzdFwiO1xuT3ZlcmZsb3dMaXN0LmRlZmF1bHRQcm9wcyA9IGdldERlZmF1bHRQcm9wc0Zyb21HbG9iYWxDb25maWcoT3ZlcmZsb3dMaXN0Ll9fU2VtaUNvbXBvbmVudE5hbWVfXywge1xuICBjb2xsYXBzZUZyb206ICdlbmQnLFxuICBtaW5WaXNpYmxlSXRlbXM6IDAsXG4gIG92ZXJmbG93UmVuZGVyZXI6ICgpID0+IG51bGwsXG4gIHJlbmRlck1vZGU6ICdjb2xsYXBzZScsXG4gIHRocmVzaG9sZDogMC43NSxcbiAgdmlzaWJsZUl0ZW1SZW5kZXJlcjogKCkgPT4gbnVsbCxcbiAgb25PdmVyZmxvdzogKCkgPT4gbnVsbCxcbiAgb3ZlcmZsb3dSZW5kZXJEaXJlY3Rpb246IFwiYm90aFwiXG59KTtcbk92ZXJmbG93TGlzdC5wcm9wVHlwZXMgPSB7XG4gIC8vIGlmIHJlbmRlciBpbiBzY3JvbGwgbW9kZSwga2V5IGlzIHJlcXVpcmVkIGluIGl0ZW1zXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29sbGFwc2VGcm9tOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5CT1VOREFSWV9TRVQpLFxuICBkaXJlY3Rpb246IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLlBPU0lUSU9OX1NFVCksXG4gIGl0ZW1zOiBQcm9wVHlwZXMuYXJyYXksXG4gIG1pblZpc2libGVJdGVtczogUHJvcFR5cGVzLm51bWJlcixcbiAgb25JbnRlcnNlY3Q6IFByb3BUeXBlcy5mdW5jLFxuICBvbk92ZXJmbG93OiBQcm9wVHlwZXMuZnVuYyxcbiAgb3ZlcmZsb3dSZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIHJlbmRlck1vZGU6IFByb3BUeXBlcy5vbmVPZihzdHJpbmdzLk1PREVfU0VUKSxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHRocmVzaG9sZDogUHJvcFR5cGVzLm51bWJlcixcbiAgdmlzaWJsZUl0ZW1SZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIHdyYXBwZXJDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHdyYXBwZXJTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY29sbGFwc2VNYXNrOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvdmVyZmxvd1JlbmRlckRpcmVjdGlvbjogUHJvcFR5cGVzLnN0cmluZ1xufTtcbmV4cG9ydCBkZWZhdWx0IE92ZXJmbG93TGlzdDsiLCAiaW1wb3J0IHsgQkFTRV9DTEFTU19QUkVGSVggfSBmcm9tICcuLi9iYXNlL2NvbnN0YW50cyc7XG5jb25zdCBjc3NDbGFzc2VzID0ge1xuICBQUkVGSVg6IEJBU0VfQ0xBU1NfUFJFRklYICsgJy1vdmVyZmxvdy1saXN0J1xufTtcbmNvbnN0IE1PREVfTUFQID0ge1xuICBDT0xMQVBTRTogJ2NvbGxhcHNlJyxcbiAgU0NST0xMOiAnc2Nyb2xsJ1xufTtcbmNvbnN0IEJPVU5EQVJZX01BUCA9IHtcbiAgU1RBUlQ6ICdzdGFydCcsXG4gIEVORDogJ2VuZCdcbn07XG5jb25zdCBPVkVSRkxPV19ESVIgPSB7XG4gIE5PTkU6IDAsXG4gIEdST1c6IDEsXG4gIFNIUklOSzogMlxufTtcbmNvbnN0IHN0cmluZ3MgPSB7XG4gIEJPVU5EQVJZX1NFVDogT2JqZWN0LnZhbHVlcyhCT1VOREFSWV9NQVApLFxuICBQT1NJVElPTl9TRVQ6IFsndmVydGljYWwnLCAnaG9yaXpvbnRhbCddLFxuICBNT0RFX1NFVDogT2JqZWN0LnZhbHVlcyhNT0RFX01BUCksXG4gIE1PREVfTUFQLFxuICBCT1VOREFSWV9NQVAsXG4gIE9WRVJGTE9XX0RJUlxufTtcbmNvbnN0IG51bWJlcnMgPSB7XG4gIE1JTklNVU1fSFRNTF9FTEVNRU5UX1dJRFRIOiA0XG59O1xuZXhwb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncywgbnVtYmVycyB9OyIsICJpbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgX2lzRXF1YWwgZnJvbSBcImxvZGFzaC9pc0VxdWFsXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuLi9fYmFzZS9yZWFjdFV0aWxzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlYWN0SW50ZXJzZWN0aW9uT2JzZXJ2ZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaXRlbXNcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLmNhY2hlZEtleXMgPSBPYmplY3Qua2V5cyhpdGVtcyk7XG4gICAgY29uc3Qge1xuICAgICAgcm9vdCxcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIHJvb3RNYXJnaW4sXG4gICAgICBvcHRpb24sXG4gICAgICBvbkludGVyc2VjdFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIob25JbnRlcnNlY3QsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgcm9vdCxcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIHJvb3RNYXJnaW5cbiAgICB9LCBvcHRpb24pKTtcbiAgICB0aGlzLm9ic2VydmVFbGVtZW50KCk7XG4gIH1cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1zXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgaXRlbUtleXMgPSBPYmplY3Qua2V5cyhpdGVtcyk7XG4gICAgaWYgKCFfaXNFcXVhbCh0aGlzLmNhY2hlZEtleXMsIGl0ZW1LZXlzKSkge1xuICAgICAgdGhpcy5vYnNlcnZlRWxlbWVudCh0cnVlKTtcbiAgICAgIHRoaXMuY2FjaGVkS2V5cyA9IGl0ZW1LZXlzO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgb2JzZXJ2ZUVsZW1lbnQoKSB7XG4gICAgbGV0IGZvcmNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBjb25zdCB7XG4gICAgICBpdGVtc1xuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChfaXNFbXB0eShpdGVtcykpIHtcbiAgICAgIC8vIHN0b3AgZXZlcnl0aGluZyBpZiBub3QgZGVmaW5lZFxuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmb3JjZSkge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIC8vIG9ic2VydmVyIGNhbGxiYWNrIGlzIGludm9rZWQgaW1tZWRpYXRlbHkgd2hlbiBvYnNlcnZpbmcgbmV3IGVsZW1lbnRzXG4gICAgT2JqZWN0LmtleXMoaXRlbXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBpdGVtc1trZXldO1xuICAgICAgaWYgKCEobm9kZSAmJiBpc0hUTUxFbGVtZW50KG5vZGUpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUobm9kZSk7XG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoaWxkcmVuXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG59XG5SZWFjdEludGVyc2VjdGlvbk9ic2VydmVyLnByb3BUeXBlcyA9IHtcbiAgb25JbnRlcnNlY3Q6IFByb3BUeXBlcy5mdW5jLFxuICBvcHRpb246IFByb3BUeXBlcy5vYmplY3QsXG4gIHJvb3Q6IFByb3BUeXBlcy5hbnksXG4gIHRocmVzaG9sZDogUHJvcFR5cGVzLm51bWJlcixcbiAgcm9vdE1hcmdpbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgaXRlbXM6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5SZWFjdEludGVyc2VjdGlvbk9ic2VydmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgb25JbnRlcnNlY3Q6ICgpID0+IHVuZGVmaW5lZCxcbiAgdGhyZXNob2xkOiAwLjc1LFxuICByb290TWFyZ2luOiAnMHB4JyxcbiAgb3B0aW9uOiB7fSxcbiAgaXRlbXM6IHt9XG59OyIsICJpbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IEJhc2VGb3VuZGF0aW9uIGZyb20gJy4uL2Jhc2UvZm91bmRhdGlvbic7XG5pbXBvcnQgeyBzdHJpbmdzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IGNvcHkgZnJvbSAnZmFzdC1jb3B5JztcbmNvbnN0IEJvdW5kYXJ5ID0gc3RyaW5ncy5CT1VOREFSWV9NQVA7XG5jb25zdCBPdmVyZmxvd0RpcmVjdGlvbiA9IHN0cmluZ3MuT1ZFUkZMT1dfRElSO1xuY2xhc3MgT3ZlcmZsb3dMaXN0Rm91bmRhdGlvbiBleHRlbmRzIEJhc2VGb3VuZGF0aW9uIHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGFkYXB0ZXIpKTtcbiAgICB0aGlzLnByZXZpb3VzWSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzU2Nyb2xsTW9kZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVuZGVyTW9kZVxuICAgICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICAgIHJldHVybiByZW5kZXJNb2RlID09PSAnc2Nyb2xsJztcbiAgICB9O1xuICAgIHRoaXMuZ2V0UmV2ZXJzZWRJdGVtcyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaXRlbXNcbiAgICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgICByZXR1cm4gY29weShpdGVtcykucmV2ZXJzZSgpO1xuICAgIH07XG4gIH1cbiAgZ2V0T3ZlcmZsb3dJdGVtKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1zXG4gICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBjb25zdCB7XG4gICAgICB2aXNpYmxlU3RhdGUsXG4gICAgICBvdmVyZmxvd1xuICAgIH0gPSB0aGlzLmdldFN0YXRlcygpO1xuICAgIGlmICghdGhpcy5pc1Njcm9sbE1vZGUoKSkge1xuICAgICAgcmV0dXJuIG92ZXJmbG93O1xuICAgIH1cbiAgICBjb25zdCB2aXNpYmxlU3RhdGVBcnIgPSBpdGVtcy5tYXAoX3JlZiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBrZXlcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgcmV0dXJuIEJvb2xlYW4odmlzaWJsZVN0YXRlLmdldChrZXkpKTtcbiAgICB9KTtcbiAgICBjb25zdCB2aXNpYmxlU3RhcnQgPSB2aXNpYmxlU3RhdGVBcnIuaW5kZXhPZih0cnVlKTtcbiAgICBjb25zdCB2aXNpYmxlRW5kID0gdmlzaWJsZVN0YXRlQXJyLmxhc3RJbmRleE9mKHRydWUpO1xuICAgIGNvbnN0IG92ZXJmbG93TGlzdCA9IFtdO1xuICAgIG92ZXJmbG93TGlzdFswXSA9IHZpc2libGVTdGFydCA+PSAwID8gaXRlbXMuc2xpY2UoMCwgdmlzaWJsZVN0YXJ0KSA6IFtdO1xuICAgIG92ZXJmbG93TGlzdFsxXSA9IHZpc2libGVFbmQgPj0gMCA/IGl0ZW1zLnNsaWNlKHZpc2libGVFbmQgKyAxLCBpdGVtcy5sZW5ndGgpIDogaXRlbXMuc2xpY2UoKTtcbiAgICByZXR1cm4gb3ZlcmZsb3dMaXN0O1xuICB9XG4gIGhhbmRsZUludGVyc2VjdChlbnRyaWVzKSB7XG4gICAgY29uc3QgdmlzaWJsZVN0YXRlID0gY29weSh0aGlzLmdldFN0YXRlKCd2aXNpYmxlU3RhdGUnKSk7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1LZXkgPSBfZ2V0KGVudHJ5LCAndGFyZ2V0LmRhdGFzZXQuc2Nyb2xsa2V5Jyk7XG4gICAgICBjb25zdCB2aXNpYmxlID0gZW50cnkuaXNJbnRlcnNlY3Rpbmc7XG4gICAgICByZXNbaXRlbUtleV0gPSBlbnRyeTtcbiAgICAgIHZpc2libGVTdGF0ZS5zZXQoaXRlbUtleSwgdmlzaWJsZSk7XG4gICAgfSk7XG4gICAgbGV0IHNvbWVJdGVtVmlzaWJsZSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmlzaWJsZVN0YXRlLnZhbHVlcygpKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgc29tZUl0ZW1WaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFueSBpdGVtIGlzIHZpc2libGUsIGluZGljYXRpbmcgdGhhdCB0aGUgTGlzdCBpcyB2aXNpYmxlXG4gICAgY29uc3Qgd2hvbGVMaXN0VmlzaWJsZSA9IHNvbWVJdGVtVmlzaWJsZTtcbiAgICAvLyBJZiBzY3JvbGxpbmcgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiBtYWtlcyB0aGUgTGlzdCBpbnZpc2libGUsIG5vIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuIFxuICAgIC8vIElmIHRoaXMucHJldmlvdXNZIGlzIHVuZGVmaW5lZCwgaXQgbWVhbnMgdGhhdCB0aGUgTGlzdCBpcyBtb3VudGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgd2lsbCBub3QgYmUgcHJvY2Vzc2VkLlxuICAgIGNvbnN0IFtlbnRyeTFdID0gZW50cmllcztcbiAgICBjb25zdCBjdXJyZW50WSA9IGVudHJ5MS5ib3VuZGluZ0NsaWVudFJlY3QueTtcbiAgICBpZiAoIXdob2xlTGlzdFZpc2libGUgJiYgdGhpcy5wcmV2aW91c1kgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50WSAhPT0gdGhpcy5wcmV2aW91c1kpIHtcbiAgICAgIHRoaXMucHJldmlvdXNZID0gY3VycmVudFk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJldmlvdXNZID0gY3VycmVudFk7XG4gICAgdGhpcy5fYWRhcHRlci51cGRhdGVWaXNpYmxlU3RhdGUodmlzaWJsZVN0YXRlKTtcbiAgICB0aGlzLl9hZGFwdGVyLm5vdGlmeUludGVyc2VjdChyZXMpO1xuICB9XG4gIGhhbmRsZUNvbGxhcHNlT3ZlcmZsb3coKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWluVmlzaWJsZUl0ZW1zLFxuICAgICAgY29sbGFwc2VGcm9tXG4gICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBjb25zdCB7XG4gICAgICBvdmVyZmxvd1dpZHRoLFxuICAgICAgY29udGFpbmVyV2lkdGgsXG4gICAgICBwaXZvdDogc3RhdGVQaXZvdCxcbiAgICAgIG92ZXJmbG93U3RhdHVzXG4gICAgfSA9IHRoaXMuZ2V0U3RhdGVzKCk7XG4gICAgY29uc3Qge1xuICAgICAgaXRlbXMsXG4gICAgICBvbk92ZXJmbG93XG4gICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBsZXQgaXRlbVdpZHRocyA9IG92ZXJmbG93V2lkdGgsXG4gICAgICBfcGl2b3QgPSAwO1xuICAgIGxldCBvdmVyZmxvd2VkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBzaXplIG9mIHRoaXMuX2FkYXB0ZXIuZ2V0SXRlbVNpemVNYXAoKS52YWx1ZXMoKSkge1xuICAgICAgaXRlbVdpZHRocyArPSBzaXplO1xuICAgICAgLy8gXHU4OUU2XHU1M0Qxb3ZlcmZsb3dcbiAgICAgIGlmIChpdGVtV2lkdGhzID4gY29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgb3ZlcmZsb3dlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gXHU5ODdBXHU1MjI5XHU5MDREXHU1Mzg2XHU1QjhDXHU2NTc0XHU0RTJBXHU1MjE3XHU4ODY4XHVGRjBDXHU4QkY0XHU2NjBFXHU0RTBEXHU1QjU4XHU1NzI4b3ZlcmZsb3dcdUZGMENcdTc2RjRcdTYzQTVcdTZFMzJcdTY3RDNcdTUxNjhcdTkwRThcbiAgICAgIGlmIChfcGl2b3QgPT09IGl0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5fYWRhcHRlci51cGRhdGVTdGF0ZXMoe1xuICAgICAgICAgIG92ZXJmbG93U3RhdHVzOiBcIm5vcm1hbFwiLFxuICAgICAgICAgIHBpdm90OiBpdGVtcy5sZW5ndGggLSAxLFxuICAgICAgICAgIHZpc2libGU6IGl0ZW1zLFxuICAgICAgICAgIG92ZXJmbG93OiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBfcGl2b3QrKztcbiAgICB9XG4gICAgaWYgKG92ZXJmbG93ZWQpIHtcbiAgICAgIGNvbnN0IHBpdm90ID0gTWF0aC5tYXgobWluVmlzaWJsZUl0ZW1zLCBfcGl2b3QpO1xuICAgICAgY29uc3QgaXNDb2xsYXBzZUZyb21TdGFydCA9IGNvbGxhcHNlRnJvbSA9PT0gQm91bmRhcnkuU1RBUlQ7XG4gICAgICBjb25zdCB2aXNpYmxlID0gaXNDb2xsYXBzZUZyb21TdGFydCA/IHRoaXMuZ2V0UmV2ZXJzZWRJdGVtcygpLnNsaWNlKDAsIHBpdm90KS5yZXZlcnNlKCkgOiBpdGVtcy5zbGljZSgwLCBwaXZvdCk7XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGlzQ29sbGFwc2VGcm9tU3RhcnQgPyB0aGlzLmdldFJldmVyc2VkSXRlbXMoKS5zbGljZShwaXZvdCkucmV2ZXJzZSgpIDogaXRlbXMuc2xpY2UocGl2b3QpO1xuICAgICAgdGhpcy5fYWRhcHRlci51cGRhdGVTdGF0ZXMoe1xuICAgICAgICBvdmVyZmxvd1N0YXR1czogXCJvdmVyZmxvd2VkXCIsXG4gICAgICAgIHBpdm90OiBwaXZvdCxcbiAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgb3ZlcmZsb3dcbiAgICAgIH0pO1xuICAgICAgLy8gdHJpZ2dlciBvbk92ZXJmbG93XG4gICAgICBpZiAoc3RhdGVQaXZvdCAhPT0gcGl2b3QpIHtcbiAgICAgICAgb25PdmVyZmxvdyhvdmVyZmxvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5leHBvcnQgZGVmYXVsdCBPdmVyZmxvd0xpc3RGb3VuZGF0aW9uOyIsICJpbXBvcnQgX3BpY2sgZnJvbSBcImxvZGFzaC9waWNrXCI7XG5pbXBvcnQgX2lzRXF1YWwgZnJvbSBcImxvZGFzaC9pc0VxdWFsXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiwgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNzc0NsYXNzZXMsIHN0cmluZ3MgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy90YWJzL2NvbnN0YW50cyc7XG5pbXBvcnQgaXNOdWxsT3JVbmRlZmluZWQgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvaXNOdWxsT3JVbmRlZmluZWQnO1xuaW1wb3J0IFRhYnNGb3VuZGF0aW9uIGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3RhYnMvZm91bmRhdGlvbic7XG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuLi9fYmFzZS9iYXNlQ29tcG9uZW50JztcbmltcG9ydCAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdGFicy90YWJzLmNzcyc7XG5pbXBvcnQgVGFiQmFyIGZyb20gJy4vVGFiQmFyJztcbmltcG9ydCBUYWJQYW5lIGZyb20gJy4vVGFiUGFuZSc7XG5pbXBvcnQgVGFiSXRlbSBmcm9tICcuL1RhYkl0ZW0nO1xuaW1wb3J0IFRhYnNDb250ZXh0IGZyb20gJy4vdGFicy1jb250ZXh0JztcbmltcG9ydCB7IGdldERlZmF1bHRQcm9wc0Zyb21HbG9iYWxDb25maWcgfSBmcm9tIFwiLi4vX3V0aWxzXCI7XG5jb25zdCBwYW5lUGlja0tleXMgPSBbJ2NsYXNzTmFtZScsICdzdHlsZScsICdkaXNhYmxlZCcsICdpdGVtS2V5JywgJ3RhYicsICdpY29uJ107XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZSc7XG5jbGFzcyBUYWJzIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc2V0Q29udGVudFJlZiA9IHJlZiA9PiB7XG4gICAgICB0aGlzLmNvbnRlbnRSZWYgPSB7XG4gICAgICAgIGN1cnJlbnQ6IHJlZlxuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMuZ2V0UGFuZXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHRhYkxpc3QsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhYkxpc3QpICYmIHRhYkxpc3QubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0YWJMaXN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLm1hcChjaGlsZHJlbiwgY2hpbGQgPT4ge1xuICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB0YWIsXG4gICAgICAgICAgICBpY29uLFxuICAgICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgICBpdGVtS2V5LFxuICAgICAgICAgICAgY2xvc2FibGVcbiAgICAgICAgICB9ID0gY2hpbGQucHJvcHM7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRhYixcbiAgICAgICAgICAgIGljb24sXG4gICAgICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgICAgIGl0ZW1LZXksXG4gICAgICAgICAgICBjbG9zYWJsZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5vblRhYkNsaWNrID0gKGFjdGl2ZUtleSwgZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuZm91bmRhdGlvbi5oYW5kbGVUYWJDbGljayhhY3RpdmVLZXksIGV2ZW50KTtcbiAgICB9O1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhpcy5yZVBvc0NoaWxkcmVuID0gKGNoaWxkcmVuLCBhY3RpdmVLZXkpID0+IHtcbiAgICAgIGNvbnN0IG5ld0NoaWxkcmVuID0gW107XG4gICAgICBjb25zdCBmYWx0dGVuQ2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaCguLi5mYWx0dGVuQ2hpbGRyZW4uZmlsdGVyKGNoaWxkID0+IGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLml0ZW1LZXkgPT09IGFjdGl2ZUtleSkpO1xuICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKC4uLmZhbHR0ZW5DaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gY2hpbGQucHJvcHMgJiYgY2hpbGQucHJvcHMuaXRlbUtleSAhPT0gYWN0aXZlS2V5KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3Q2hpbGRyZW47XG4gICAgfTtcbiAgICB0aGlzLmdldEFjdGl2ZUl0ZW0gPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjdGl2ZUtleVxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0YWJMaXN0XG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmICh0YWJMaXN0IHx8ICFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikuZmlsdGVyKHBhbmUgPT4ge1xuICAgICAgICBpZiAoLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KHBhbmUpICYmIHBhbmUudHlwZSAmJiBwYW5lLnR5cGUuaXNUYWJQYW5lKSB7XG4gICAgICAgICAgcmV0dXJuIHBhbmUucHJvcHMuaXRlbUtleSA9PT0gYWN0aXZlS2V5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLmRlbGV0ZVRhYkl0ZW0gPSAodGFiS2V5LCBldmVudCkgPT4ge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLmZvdW5kYXRpb24uaGFuZGxlVGFiRGVsZXRlKHRhYktleSk7XG4gICAgfTtcbiAgICB0aGlzLmZvdW5kYXRpb24gPSBuZXcgVGFic0ZvdW5kYXRpb24odGhpcy5hZGFwdGVyKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aXZlS2V5OiB0aGlzLmZvdW5kYXRpb24uZ2V0RGVmYXVsdEFjdGl2ZUtleSgpLFxuICAgICAgcGFuZXM6IHRoaXMuZ2V0UGFuZXMoKSxcbiAgICAgIHByZXZBY3RpdmVLZXk6IG51bGwsXG4gICAgICBmb3JjZURpc2FibGVNb3Rpb246IGZhbHNlXG4gICAgfTtcbiAgICB0aGlzLmNvbnRlbnRSZWYgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG4gICAgdGhpcy5jb250ZW50SGVpZ2h0ID0gJ2F1dG8nO1xuICB9XG4gIGdldCBhZGFwdGVyKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmFkYXB0ZXIpLCB7XG4gICAgICBjb2xsZWN0UGFuZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBwYW5lcyA9IHRoaXMuZ2V0UGFuZXMoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcGFuZXNcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgY29sbGVjdEFjdGl2ZUtleTogKCkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdGFiTGlzdCxcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICBhY3RpdmVLZXk6IHByb3BzQWN0aXZlS2V5XG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBpZiAodHlwZW9mIHByb3BzQWN0aXZlS2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgYWN0aXZlS2V5XG4gICAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCBwYW5lcyA9IHRoaXMuZ2V0UGFuZXMoKTtcbiAgICAgICAgaWYgKHBhbmVzLmZpbmRJbmRleChwID0+IHAuaXRlbUtleSA9PT0gYWN0aXZlS2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICBpZiAocGFuZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGFjdGl2ZUtleTogcGFuZXNbMF0uaXRlbUtleVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBhY3RpdmVLZXk6ICcnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBub3RpZnlUYWJDbGljazogKGFjdGl2ZUtleSwgZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vblRhYkNsaWNrKGFjdGl2ZUtleSwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIG5vdGlmeUNoYW5nZTogYWN0aXZlS2V5ID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShhY3RpdmVLZXkpO1xuICAgICAgfSxcbiAgICAgIHNldE5ld0FjdGl2ZUtleTogYWN0aXZlS2V5ID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgYWN0aXZlS2V5XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGdldERlZmF1bHRBY3RpdmVLZXlGcm9tQ2hpbGRyZW46ICgpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHRhYkxpc3QsXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBhY3RpdmVLZXkgPSAnJztcbiAgICAgICAgY29uc3QgbGlzdCA9IHRhYkxpc3QgPyB0YWJMaXN0IDogUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikubWFwKGNoaWxkID0+IC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChjaGlsZCkgPyBjaGlsZC5wcm9wcyA6IG51bGwpO1xuICAgICAgICBsaXN0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0gJiYgIWFjdGl2ZUtleSAmJiAhaXRlbS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgYWN0aXZlS2V5ID0gaXRlbS5pdGVtS2V5O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhY3RpdmVLZXk7XG4gICAgICB9LFxuICAgICAgbm90aWZ5VGFiRGVsZXRlOiB0YWJLZXkgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uVGFiQ2xvc2UgJiYgdGhpcy5wcm9wcy5vblRhYkNsb3NlKHRhYktleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICBjb25zdCBzdGF0ZXMgPSB7fTtcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHByb3BzLmFjdGl2ZUtleSkgJiYgcHJvcHMuYWN0aXZlS2V5ICE9PSBzdGF0ZS5hY3RpdmVLZXkpIHtcbiAgICAgIHN0YXRlLnByZXZBY3RpdmVLZXkgPSBzdGF0ZS5hY3RpdmVLZXk7XG4gICAgICBzdGF0ZXMuYWN0aXZlS2V5ID0gcHJvcHMuYWN0aXZlS2V5O1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGVzO1xuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIC8vIFBhbmVzIHN0YXRlIGFjdHMgb24gdGFiIGJhciwgbm8gbmVlZCB0byBjb21wYXJlIFRhYlBhbmUgY2hpbGRyZW5cbiAgICBjb25zdCBwcmV2Q2hpbGRyZW5Qcm9wcyA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJldlByb3BzLmNoaWxkcmVuKS5tYXAoY2hpbGQgPT4gX3BpY2soLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KGNoaWxkKSA/IGNoaWxkLnByb3BzIDogbnVsbCwgcGFuZVBpY2tLZXlzKSk7XG4gICAgY29uc3Qgbm93Q2hpbGRyZW5Qcm9wcyA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkodGhpcy5wcm9wcy5jaGlsZHJlbikubWFwKGNoaWxkID0+IF9waWNrKC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChjaGlsZCkgPyBjaGlsZC5wcm9wcyA6IG51bGwsIHBhbmVQaWNrS2V5cykpO1xuICAgIGNvbnN0IGlzVGFiTGlzdFR5cGUgPSB0aGlzLnByb3BzLnRhYkxpc3QgfHwgcHJldlByb3BzLnRhYkxpc3Q7XG4gICAgaWYgKCFfaXNFcXVhbCh0aGlzLnByb3BzLnRhYkxpc3QsIHByZXZQcm9wcy50YWJMaXN0KSkge1xuICAgICAgdGhpcy5mb3VuZGF0aW9uLmhhbmRsZVRhYkxpc3RDaGFuZ2UoKTtcbiAgICB9XG4gICAgaWYgKHByZXZTdGF0ZS5hY3RpdmVLZXkgIT09IHRoaXMuc3RhdGUuYWN0aXZlS2V5ICYmIHByZXZTdGF0ZS5hY3RpdmVLZXkgIT09IHRoaXMuc3RhdGUucHJldkFjdGl2ZUtleSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZBY3RpdmVLZXk6IHByZXZTdGF0ZS5hY3RpdmVLZXlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocHJldlByb3BzLmFjdGl2ZUtleSAhPT0gdGhpcy5wcm9wcy5hY3RpdmVLZXkpIHtcbiAgICAgIGNvbnN0IG5ld0FkZGVkUGFuZWxJdGVtS2V5ID0gKCgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldkl0ZW1LZXlzID0gbmV3IFNldChwcmV2Q2hpbGRyZW5Qcm9wcy5tYXAocCA9PiBwLml0ZW1LZXkpKTtcbiAgICAgICAgcmV0dXJuIG5vd0NoaWxkcmVuUHJvcHMubWFwKHAgPT4gcC5pdGVtS2V5KS5maWx0ZXIoaXRlbUtleSA9PiAhcHJldkl0ZW1LZXlzLmhhcyhpdGVtS2V5KSk7XG4gICAgICB9KSgpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvcmNlRGlzYWJsZU1vdGlvbjogbmV3QWRkZWRQYW5lbEl0ZW1LZXkuaW5jbHVkZXModGhpcy5wcm9wcy5hY3RpdmVLZXkpXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gY2hpbGRyZW5cdTUzRDhcdTUzMTZcdUZGMEN0YWJMaXN0XHU2NUI5XHU1RjBGXHU0RjdGXHU3NTI4XHU2NUY2XHVGRjBDXHU1NTY1XHU0RTVGXHU0RTBEXHU3NTI4XHU1MDVBXG4gICAgLy8gY2hpbGRyZW5cdTUzRDhcdTUzMTZcdUZGMENcdTk3NUV0YWJMaXN0XHU2NUI5XHU1RjBGXHU0RjdGXHU3NTI4XHVGRjBDXHU5NzAwXHU4OTgxXHU5MUNEXHU2NUIwXHU1M0Q2YWN0aXZlS2V5XHUzMDAyVGFiUGFuZVx1NTNFRlx1ODBGRFx1NjYyRlx1NUYwMlx1NkI2NVx1NjZGNFx1NjVCMFx1NzY4NFx1RkYwQ1x1ODJFNVx1NEUwRFx1OTFDRFx1NjVCMFx1NTNENlx1RkYwQ1x1NjcyQVx1OEJCRWFjdGl2ZUtleVx1NjVGNlx1RkYwQ1x1N0IyQ1x1NEUwMFx1NEUyQVx1NEUwRFx1NEYxQVx1ODFFQVx1NTJBOFx1NkZDMFx1NkQzQlxuICAgIC8vIGNoaWxkcmVuIGNoYW5nZWQ6IGRvIG5vdGhpbmcgaW4gdGFiTGlzdCBjYXNlXG4gICAgLy8gY2hpbGRyZW4gY2hhbmdlZDogcmVjYWxjIGFjdGl2ZUtleS4gVGFiUGFuZSBjb3VsZCBiZSB1cGRhdGVkIGFzeW5jLiBJZiBub3QgcmVjYWxjIHRoZSBmaXJzdCBwYW5lbCB3aWxsIG5vdCBiZSBhY3RpdmF0ZWRcbiAgICBpZiAoIV9pc0VxdWFsKHByZXZDaGlsZHJlblByb3BzLCBub3dDaGlsZHJlblByb3BzKSAmJiAhaXNUYWJMaXN0VHlwZSkge1xuICAgICAgdGhpcy5mb3VuZGF0aW9uLmhhbmRsZVRhYlBhbmVzQ2hhbmdlKCk7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIGNvbGxhcHNpYmxlLFxuICAgICAgICBjb250ZW50U3R5bGUsXG4gICAgICAgIGtlZXBET00sXG4gICAgICAgIGxhenlSZW5kZXIsXG4gICAgICAgIHJlbmRlclRhYkJhcixcbiAgICAgICAgc2hvd1Jlc3RJbkRyb3Bkb3duLFxuICAgICAgICBzaXplLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgdGFiQmFyQ2xhc3NOYW1lLFxuICAgICAgICB0YWJCYXJFeHRyYUNvbnRlbnQsXG4gICAgICAgIHRhYkJhclN0eWxlLFxuICAgICAgICB0YWJQYW5lTW90aW9uLFxuICAgICAgICB0YWJQb3NpdGlvbixcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbW9yZSxcbiAgICAgICAgb25WaXNpYmxlVGFic0NoYW5nZSxcbiAgICAgICAgdmlzaWJsZVRhYnNTdHlsZSxcbiAgICAgICAgYXJyb3dQb3NpdGlvbixcbiAgICAgICAgcmVuZGVyQXJyb3csXG4gICAgICAgIGRyb3Bkb3duUHJvcHNcbiAgICAgIH0gPSBfYSxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xsYXBzaWJsZVwiLCBcImNvbnRlbnRTdHlsZVwiLCBcImtlZXBET01cIiwgXCJsYXp5UmVuZGVyXCIsIFwicmVuZGVyVGFiQmFyXCIsIFwic2hvd1Jlc3RJbkRyb3Bkb3duXCIsIFwic2l6ZVwiLCBcInN0eWxlXCIsIFwidGFiQmFyQ2xhc3NOYW1lXCIsIFwidGFiQmFyRXh0cmFDb250ZW50XCIsIFwidGFiQmFyU3R5bGVcIiwgXCJ0YWJQYW5lTW90aW9uXCIsIFwidGFiUG9zaXRpb25cIiwgXCJ0eXBlXCIsIFwibW9yZVwiLCBcIm9uVmlzaWJsZVRhYnNDaGFuZ2VcIiwgXCJ2aXNpYmxlVGFic1N0eWxlXCIsIFwiYXJyb3dQb3NpdGlvblwiLCBcInJlbmRlckFycm93XCIsIFwiZHJvcGRvd25Qcm9wc1wiXSk7XG4gICAgY29uc3Qge1xuICAgICAgcGFuZXMsXG4gICAgICBhY3RpdmVLZXlcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB0YWJXcmFwcGVyQ2xzID0gY2xzKGNsYXNzTmFtZSwge1xuICAgICAgW2Nzc0NsYXNzZXMuVEFCU106IHRydWUsXG4gICAgICBbYCR7Y3NzQ2xhc3Nlcy5UQUJTfS0ke3RhYlBvc2l0aW9ufWBdOiB0YWJQb3NpdGlvblxuICAgIH0pO1xuICAgIGNvbnN0IHRhYkNvbnRlbnRDbHMgPSBjbHMoe1xuICAgICAgW2Nzc0NsYXNzZXMuVEFCU19DT05URU5UXTogdHJ1ZSxcbiAgICAgIFtgJHtjc3NDbGFzc2VzLlRBQlNfQ09OVEVOVH0tJHt0YWJQb3NpdGlvbn1gXTogdGFiUG9zaXRpb25cbiAgICB9KTtcbiAgICBjb25zdCB0YWJCYXJQcm9wcyA9IHtcbiAgICAgIGFjdGl2ZUtleSxcbiAgICAgIGNsYXNzTmFtZTogdGFiQmFyQ2xhc3NOYW1lLFxuICAgICAgY29sbGFwc2libGUsXG4gICAgICBsaXN0OiBwYW5lcyxcbiAgICAgIG9uVGFiQ2xpY2s6IHRoaXMub25UYWJDbGljayxcbiAgICAgIHNob3dSZXN0SW5Ecm9wZG93bixcbiAgICAgIHNpemUsXG4gICAgICBzdHlsZTogdGFiQmFyU3R5bGUsXG4gICAgICB0YWJCYXJFeHRyYUNvbnRlbnQsXG4gICAgICB0YWJQb3NpdGlvbixcbiAgICAgIHR5cGUsXG4gICAgICBkZWxldGVUYWJJdGVtOiB0aGlzLmRlbGV0ZVRhYkl0ZW0sXG4gICAgICBoYW5kbGVLZXlEb3duOiB0aGlzLmZvdW5kYXRpb24uaGFuZGxlS2V5RG93bixcbiAgICAgIG1vcmUsXG4gICAgICBvblZpc2libGVUYWJzQ2hhbmdlLFxuICAgICAgdmlzaWJsZVRhYnNTdHlsZSxcbiAgICAgIGFycm93UG9zaXRpb24sXG4gICAgICByZW5kZXJBcnJvdyxcbiAgICAgIGRyb3Bkb3duUHJvcHNcbiAgICB9O1xuICAgIGNvbnN0IHRhYkJhciA9IHJlbmRlclRhYkJhciA/IHJlbmRlclRhYkJhcih0YWJCYXJQcm9wcywgVGFiQmFyKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhciwgT2JqZWN0LmFzc2lnbih7fSwgdGFiQmFyUHJvcHMpKTtcbiAgICBjb25zdCBjb250ZW50ID0ga2VlcERPTSA/IGNoaWxkcmVuIDogdGhpcy5nZXRBY3RpdmVJdGVtKCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY2xhc3NOYW1lOiB0YWJXcmFwcGVyQ2xzLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSwgdGhpcy5nZXREYXRhQXR0cihyZXN0UHJvcHMpKSwgdGFiQmFyLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJzQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgYWN0aXZlS2V5LFxuICAgICAgICBsYXp5UmVuZGVyLFxuICAgICAgICBwYW5lcyxcbiAgICAgICAgdGFiUGFuZU1vdGlvbixcbiAgICAgICAgdGFiUG9zaXRpb24sXG4gICAgICAgIHByZXZBY3RpdmVLZXk6IHRoaXMuc3RhdGUucHJldkFjdGl2ZUtleSxcbiAgICAgICAgZm9yY2VEaXNhYmxlTW90aW9uOiB0aGlzLnN0YXRlLmZvcmNlRGlzYWJsZU1vdGlvblxuICAgICAgfVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogdGhpcy5zZXRDb250ZW50UmVmLFxuICAgICAgY2xhc3NOYW1lOiB0YWJDb250ZW50Q2xzLFxuICAgICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oe30sIGNvbnRlbnRTdHlsZSlcbiAgICB9LCBjb250ZW50KSkpO1xuICB9XG59XG5UYWJzLlRhYlBhbmUgPSBUYWJQYW5lO1xuVGFicy5UYWJJdGVtID0gVGFiSXRlbTtcblRhYnMucHJvcFR5cGVzID0ge1xuICBhY3RpdmVLZXk6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29sbGFwc2libGU6IFByb3BUeXBlcy5ib29sLFxuICBjb250ZW50U3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3RdKSxcbiAgZGVmYXVsdEFjdGl2ZUtleTogUHJvcFR5cGVzLnN0cmluZyxcbiAga2VlcERPTTogUHJvcFR5cGVzLmJvb2wsXG4gIGxhenlSZW5kZXI6IFByb3BUeXBlcy5ib29sLFxuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uVGFiQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICByZW5kZXJUYWJCYXI6IFByb3BUeXBlcy5mdW5jLFxuICBzaG93UmVzdEluRHJvcGRvd246IFByb3BUeXBlcy5ib29sLFxuICBzaXplOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5TSVpFKSxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHRhYkJhckNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgdGFiQmFyRXh0cmFDb250ZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgdGFiQmFyU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHRhYkxpc3Q6IFByb3BUeXBlcy5hcnJheSxcbiAgdGFiUGFuZU1vdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIHRhYlBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5QT1NJVElPTl9NQVApLFxuICB0eXBlOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5UWVBFX01BUCksXG4gIG9uVGFiQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuICBwcmV2ZW50U2Nyb2xsOiBQcm9wVHlwZXMuYm9vbCxcbiAgbW9yZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBhcnJvd1Bvc2l0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuICByZW5kZXJBcnJvdzogUHJvcFR5cGVzLmZ1bmMsXG4gIGRyb3Bkb3duUHJvcHM6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5UYWJzLl9fU2VtaUNvbXBvbmVudE5hbWVfXyA9IFwiVGFic1wiO1xuVGFicy5kZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJvcHNGcm9tR2xvYmFsQ29uZmlnKFRhYnMuX19TZW1pQ29tcG9uZW50TmFtZV9fLCB7XG4gIGNoaWxkcmVuOiBbXSxcbiAgY29sbGFwc2libGU6IGZhbHNlLFxuICBrZWVwRE9NOiB0cnVlLFxuICBsYXp5UmVuZGVyOiBmYWxzZSxcbiAgb25DaGFuZ2U6ICgpID0+IHVuZGVmaW5lZCxcbiAgb25UYWJDbGljazogKCkgPT4gdW5kZWZpbmVkLFxuICBzaXplOiAnbGFyZ2UnLFxuICB0YWJQYW5lTW90aW9uOiB0cnVlLFxuICB0YWJQb3NpdGlvbjogJ3RvcCcsXG4gIHR5cGU6ICdsaW5lJyxcbiAgb25UYWJDbG9zZTogKCkgPT4gdW5kZWZpbmVkLFxuICBzaG93UmVzdEluRHJvcGRvd246IHRydWUsXG4gIGFycm93UG9zaXRpb246IFwiYm90aFwiXG59KTtcbmV4cG9ydCBkZWZhdWx0IFRhYnM7IiwgImltcG9ydCB7IEJBU0VfQ0xBU1NfUFJFRklYIH0gZnJvbSAnLi4vYmFzZS9jb25zdGFudHMnO1xuY29uc3QgY3NzQ2xhc3NlcyA9IHtcbiAgVEFCUzogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXRhYnNgLFxuICBUQUJTX0JBUjogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXRhYnMtYmFyYCxcbiAgVEFCU19CQVJfTElORTogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXRhYnMtYmFyLWxpbmVgLFxuICBUQUJTX0JBUl9DQVJEOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tdGFicy1iYXItY2FyZGAsXG4gIFRBQlNfQkFSX0JVVFRPTjogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXRhYnMtYmFyLWJ1dHRvbmAsXG4gIFRBQlNfQkFSX1NMQVNIOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tdGFicy1iYXItc2xhc2hgLFxuICBUQUJTX0JBUl9FWFRSQTogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXRhYnMtYmFyLWV4dHJhYCxcbiAgVEFCU19UQUI6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLXRhYmAsXG4gIFRBQlNfVEFCX0FDVElWRTogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXRhYnMtdGFiLWFjdGl2ZWAsXG4gIFRBQlNfVEFCX0RJU0FCTEVEOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tdGFicy10YWItZGlzYWJsZWRgLFxuICBUQUJTX0NPTlRFTlQ6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLWNvbnRlbnRgLFxuICBUQUJTX0NPTlRFTlRfQU5JTUFURUQ6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLWNvbnRlbnQtYW5pbWF0ZWRgLFxuICBUQUJTX0NPTlRFTlRfTk9fQU5JTUFURUQ6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLWNvbnRlbnQtbm8tYW5pbWF0ZWRgLFxuICBUQUJTX1BBTkU6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLXBhbmVgLFxuICBUQUJTX1BBTkVfSU5BQ1RJVkU6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLXBhbmUtaW5hY3RpdmVgLFxuICBUQUJTX1BBTkVfQUNUSVZFOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tdGFicy1wYW5lLWFjdGl2ZWAsXG4gIFRBQlNfUEFORV9NT1RJT05fT1ZFUkxBWTogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXRhYnMtcGFuZS1tb3Rpb24tb3ZlcmxheWAsXG4gIFRBQlNfUEFORV9BTklNQVRJTkc6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLXBhbmUtYW5pbWF0aW5nYCxcbiAgXCJUQUJTX1BBTkVfQU5JTUFURV9MRUZUX1NIT1dcIjogYCR7QkFTRV9DTEFTU19QUkVGSVh9LXRhYnMtcGFuZS1hbmltYXRlLWxlZnRTaG93YCxcbiAgXCJUQUJTX1BBTkVfQU5JTUFURV9SSUdIVF9TSE9XXCI6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLXBhbmUtYW5pbWF0ZS1yaWdodFNob3dgLFxuICBcIlRBQlNfUEFORV9BTklNQVRFX1RPUF9TSE9XXCI6IGAke0JBU0VfQ0xBU1NfUFJFRklYfS10YWJzLXBhbmUtYW5pbWF0ZS10b3BTaG93YCxcbiAgXCJUQUJTX1BBTkVfQU5JTUFURV9CT1RUT01fU0hPV1wiOiBgJHtCQVNFX0NMQVNTX1BSRUZJWH0tdGFicy1wYW5lLWFuaW1hdGUtYm90dG9tU2hvd2Bcbn07XG5jb25zdCBudW1iZXJzID0ge1xuICBERUZBVUxUX0FDVElWRV9LRVk6IDFcbn07XG5jb25zdCBzdHJpbmdzID0ge1xuICBUWVBFX01BUDogWydsaW5lJywgJ2NhcmQnLCAnYnV0dG9uJywgJ3NsYXNoJ10sXG4gIFNJWkU6IFsnc21hbGwnLCAnbWVkaXVtJywgJ2xhcmdlJ10sXG4gIFBPU0lUSU9OX01BUDogWyd0b3AnLCAnbGVmdCddXG59O1xuZXhwb3J0IHsgY3NzQ2xhc3NlcywgbnVtYmVycywgc3RyaW5ncyB9OyIsICJpbXBvcnQgX25vb3AgZnJvbSBcImxvZGFzaC9ub29wXCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IEJhc2VGb3VuZGF0aW9uIGZyb20gJy4uL2Jhc2UvZm91bmRhdGlvbic7XG5jbGFzcyBUYWJzRm91bmRhdGlvbiBleHRlbmRzIEJhc2VGb3VuZGF0aW9uIHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcikge1xuICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe30sIGFkYXB0ZXIpKTtcbiAgICB0aGlzLmRlc3Ryb3kgPSBfbm9vcDtcbiAgICB0aGlzLmhhbmRsZVByZXZlbnQgPSBldmVudCA9PiB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZUtleURvd24gPSAoZXZlbnQsIGl0ZW1LZXksIGNsb3NhYmxlKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHByZXZlbnRTY3JvbGxcbiAgICAgIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgICBjb25zdCB0YWJzID0gWy4uLmV2ZW50LnRhcmdldC5wYXJlbnROb2RlLmNoaWxkTm9kZXNdLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIF9nZXQoaXRlbSwgJ2F0dHJpYnV0ZXMuZGF0YS10YWJrZXkudmFsdWUnLCAnJykuaW5jbHVkZXMoJ3NlbWlUYWInKSAmJiBfZ2V0KGl0ZW0sICdhdHRyaWJ1dGVzLmFyaWEtZGlzYWJsZWQudmFsdWUnLCAnJykgIT09IFwidHJ1ZVwiO1xuICAgICAgfSk7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd1JpZ2h0XCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgICB0aGlzLmRldGVybWluZU9yaWVudGF0aW9uKGV2ZW50LCB0YWJzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkJhY2tzcGFjZVwiOlxuICAgICAgICBjYXNlIFwiRGVsZXRlXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVEZWxldGVLZXlEb3duKGV2ZW50LCB0YWJzLCBpdGVtS2V5LCBjbG9zYWJsZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICBjYXNlIFwiIFwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlVGFiQ2xpY2soaXRlbUtleSwgZXZlbnQpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlUHJldmVudChldmVudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgdGFic1swXS5mb2N1cyh7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsXG4gICAgICAgICAgfSk7IC8vIGZvY3VzIGZpcnN0IHRhYlxuICAgICAgICAgIHRoaXMuaGFuZGxlUHJldmVudChldmVudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJFbmRcIjpcbiAgICAgICAgICB0YWJzW3RhYnMubGVuZ3RoIC0gMV0uZm9jdXMoe1xuICAgICAgICAgICAgcHJldmVudFNjcm9sbFxuICAgICAgICAgIH0pOyAvLyBmb2N1cyBsYXN0IHRhYlxuICAgICAgICAgIHRoaXMuaGFuZGxlUHJldmVudChldmVudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBpbml0KCkge1xuICAgIHRoaXMuX2FkYXB0ZXIuY29sbGVjdFBhbmUoKTtcbiAgfVxuICBfbm90aWZ5Q2hhbmdlKGFjdGl2ZUtleSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFjdGl2ZUtleTogc3RhdGVBY3RpdmVLZXlcbiAgICB9ID0gdGhpcy5nZXRTdGF0ZXMoKTtcbiAgICBpZiAoc3RhdGVBY3RpdmVLZXkgIT09IGFjdGl2ZUtleSkge1xuICAgICAgdGhpcy5fYWRhcHRlci5ub3RpZnlDaGFuZ2UoYWN0aXZlS2V5KTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlVGFiQ2xpY2soYWN0aXZlS2V5LCBldmVudCkge1xuICAgIGNvbnN0IGlzQ29udHJvbGxlZENvbXBvbmVudCA9IHRoaXMuX2lzSW5Qcm9wcygnYWN0aXZlS2V5Jyk7XG4gICAgaWYgKGlzQ29udHJvbGxlZENvbXBvbmVudCkge1xuICAgICAgdGhpcy5fbm90aWZ5Q2hhbmdlKGFjdGl2ZUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25vdGlmeUNoYW5nZShhY3RpdmVLZXkpO1xuICAgICAgdGhpcy5oYW5kbGVOZXdBY3RpdmVLZXkoYWN0aXZlS2V5KTtcbiAgICB9XG4gICAgdGhpcy5fYWRhcHRlci5ub3RpZnlUYWJDbGljayhhY3RpdmVLZXksIGV2ZW50KTtcbiAgfVxuICBoYW5kbGVOZXdBY3RpdmVLZXkoYWN0aXZlS2V5KSB7XG4gICAgY29uc3Qge1xuICAgICAgYWN0aXZlS2V5OiBzdGF0ZUFjdGl2ZUtleVxuICAgIH0gPSB0aGlzLmdldFN0YXRlcygpO1xuICAgIGlmIChzdGF0ZUFjdGl2ZUtleSAhPT0gYWN0aXZlS2V5KSB7XG4gICAgICB0aGlzLl9hZGFwdGVyLnNldE5ld0FjdGl2ZUtleShhY3RpdmVLZXkpO1xuICAgIH1cbiAgfVxuICBnZXREZWZhdWx0QWN0aXZlS2V5KCkge1xuICAgIGxldCBhY3RpdmVLZXk7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKCk7XG4gICAgaWYgKCdhY3RpdmVLZXknIGluIHByb3BzKSB7XG4gICAgICBhY3RpdmVLZXkgPSBwcm9wcy5hY3RpdmVLZXk7XG4gICAgfSBlbHNlIGlmICgnZGVmYXVsdEFjdGl2ZUtleScgaW4gcHJvcHMpIHtcbiAgICAgIGFjdGl2ZUtleSA9IHByb3BzLmRlZmF1bHRBY3RpdmVLZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGl2ZUtleSA9IHRoaXMuX2FkYXB0ZXIuZ2V0RGVmYXVsdEFjdGl2ZUtleUZyb21DaGlsZHJlbigpO1xuICAgIH1cbiAgICByZXR1cm4gYWN0aXZlS2V5O1xuICB9XG4gIGhhbmRsZVRhYkxpc3RDaGFuZ2UoKSB7XG4gICAgdGhpcy5fYWRhcHRlci5jb2xsZWN0UGFuZSgpO1xuICB9XG4gIGhhbmRsZVRhYlBhbmVzQ2hhbmdlKCkge1xuICAgIHRoaXMuX2FkYXB0ZXIuY29sbGVjdFBhbmUoKTtcbiAgICB0aGlzLl9hZGFwdGVyLmNvbGxlY3RBY3RpdmVLZXkoKTtcbiAgfVxuICBoYW5kbGVUYWJEZWxldGUodGFiS2V5KSB7XG4gICAgdGhpcy5fYWRhcHRlci5ub3RpZnlUYWJEZWxldGUodGFiS2V5KTtcbiAgfVxuICBkZXRlcm1pbmVPcmllbnRhdGlvbihldmVudCwgdGFicykge1xuICAgIGNvbnN0IHtcbiAgICAgIHRhYlBvc2l0aW9uXG4gICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGFiUG9zaXRpb24gPT09ICdsZWZ0JztcbiAgICBpZiAoaXNWZXJ0aWNhbCkge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1VwXCIgfHwgZXZlbnQua2V5ID09PSBcIkFycm93RG93blwiKSB7XG4gICAgICAgIHRoaXMuc3dpdGNoVGFiT25BcnJvd1ByZXNzKGV2ZW50LCB0YWJzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVQcmV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0xlZnRcIiB8fCBldmVudC5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSB7XG4gICAgICAgIHRoaXMuc3dpdGNoVGFiT25BcnJvd1ByZXNzKGV2ZW50LCB0YWJzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVQcmV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaGFuZGxlRGVsZXRlS2V5RG93bihldmVudCwgdGFicywgaXRlbUtleSwgY2xvc2FibGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBwcmV2ZW50U2Nyb2xsXG4gICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBpZiAoY2xvc2FibGUpIHtcbiAgICAgIHRoaXMuaGFuZGxlVGFiRGVsZXRlKGl0ZW1LZXkpO1xuICAgICAgY29uc3QgaW5kZXggPSB0YWJzLmluZGV4T2YoZXZlbnQudGFyZ2V0KTtcbiAgICAgIC8vIE1vdmUgZm9jdXMgdG8gbmV4dCBlbGVtZW50IGFmdGVyIGRlbGV0aW9uXG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyB0aGUgbGFzdCByZW1vdmFibGUgdGFiLCBmb2N1cyB0byBpdHMgcHJldmlvdXMgdGFiXG4gICAgICBpZiAodGFicy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGFic1tpbmRleCArIDEgPj0gdGFicy5sZW5ndGggPyBpbmRleCAtIDEgOiBpbmRleCArIDFdLmZvY3VzKHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzd2l0Y2hUYWJPbkFycm93UHJlc3MoZXZlbnQsIHRhYnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBwcmV2ZW50U2Nyb2xsXG4gICAgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBjb25zdCBpbmRleCA9IHRhYnMuaW5kZXhPZihldmVudC50YXJnZXQpO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHtcbiAgICAgIFwiQXJyb3dMZWZ0XCI6IC0xLFxuICAgICAgXCJBcnJvd1VwXCI6IC0xLFxuICAgICAgXCJBcnJvd1JpZ2h0XCI6IDEsXG4gICAgICBcIkFycm93RG93blwiOiAxXG4gICAgfTtcbiAgICBpZiAoZGlyZWN0aW9uW2V2ZW50LmtleV0pIHtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0YWJzW2luZGV4ICsgZGlyZWN0aW9uW2V2ZW50LmtleV1dKSB7XG4gICAgICAgICAgdGFic1tpbmRleCArIGRpcmVjdGlvbltldmVudC5rZXldXS5mb2N1cyh7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93TGVmdFwiIHx8IGV2ZW50LmtleSA9PT0gXCJBcnJvd1VwXCIpIHtcbiAgICAgICAgICB0YWJzW3RhYnMubGVuZ3RoIC0gMV0uZm9jdXMoe1xuICAgICAgICAgICAgcHJldmVudFNjcm9sbFxuICAgICAgICAgIH0pOyAvLyBmb2N1cyBsYXN0IHRhYlxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIgfHwgZXZlbnQua2V5ID09IFwiQXJyb3dEb3duXCIpIHtcbiAgICAgICAgICB0YWJzWzBdLmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGxcbiAgICAgICAgICB9KTsgLy8gZm9jdXMgZmlyc3QgdGFiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFRhYnNGb3VuZGF0aW9uOyIsICJpbXBvcnQgX3BpY2sgZnJvbSBcImxvZGFzaC9waWNrXCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgY3NzQ2xhc3Nlcywgc3RyaW5ncyB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWZvdW5kYXRpb24vbGliL2VzL3RhYnMvY29uc3RhbnRzJztcbmltcG9ydCBnZXREYXRhQXR0ciBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy9nZXREYXRhQXR0cic7XG5pbXBvcnQgT3ZlcmZsb3dMaXN0IGZyb20gJy4uL292ZXJmbG93TGlzdCc7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi4vZHJvcGRvd24nO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuLi9idXR0b24nO1xuaW1wb3J0IHsgSWNvbkNoZXZyb25SaWdodCwgSWNvbkNoZXZyb25MZWZ0LCBJY29uQ2hldnJvbkRvd24gfSBmcm9tICdAZG91eWluZmUvc2VtaS1pY29ucyc7XG5pbXBvcnQgeyBnZXRVdWlkdjQgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy91dGlscy91dWlkJztcbmltcG9ydCBUYWJJdGVtIGZyb20gJy4vVGFiSXRlbSc7XG5pbXBvcnQgTG9jYWxlQ29uc3VtZXIgZnJvbSBcIi4uL2xvY2FsZS9sb2NhbGVDb25zdW1lclwiO1xuY2xhc3MgVGFiQmFyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIF90aGlzID0gdGhpcztcbiAgICB0aGlzLmhhbmRsZUl0ZW1DbGljayA9IChpdGVtS2V5LCBlKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLm9uVGFiQ2xpY2soaXRlbUtleSwgZSk7XG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZUtleURvd24gPSAoZXZlbnQsIGl0ZW1LZXksIGNsb3NhYmxlKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmhhbmRsZUtleURvd24oZXZlbnQsIGl0ZW1LZXksIGNsb3NhYmxlKTtcbiAgICB9O1xuICAgIHRoaXMucmVuZGVyVGFiSXRlbSA9IHBhbmVsID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZGVsZXRlVGFiSXRlbSxcbiAgICAgICAgaGFuZGxlS2V5RG93bixcbiAgICAgICAgdGFiUG9zaXRpb25cbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuX2lzQWN0aXZlKHBhbmVsLml0ZW1LZXkpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYkl0ZW0sIE9iamVjdC5hc3NpZ24oe30sIF9waWNrKHBhbmVsLCBbJ2Rpc2FibGVkJywgJ2ljb24nLCAnaXRlbUtleScsICd0YWInLCAnY2xvc2FibGUnXSksIHtcbiAgICAgICAga2V5OiB0aGlzLl9nZXRCYXJJdGVtS2V5QnlJdGVtS2V5KHBhbmVsLml0ZW1LZXkpLFxuICAgICAgICBzZWxlY3RlZDogaXNTZWxlY3RlZCxcbiAgICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFiUG9zaXRpb246IHRhYlBvc2l0aW9uLFxuICAgICAgICBoYW5kbGVLZXlEb3duOiBoYW5kbGVLZXlEb3duLFxuICAgICAgICBkZWxldGVUYWJJdGVtOiBkZWxldGVUYWJJdGVtLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUl0ZW1DbGlja1xuICAgICAgfSkpO1xuICAgIH07XG4gICAgdGhpcy5zY3JvbGxUYWJJdGVtSW50b1ZpZXdCeUtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGxldCBsb2dpY2FsUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICduZWFyZXN0JztcbiAgICAgIGNvbnN0IHRhYkl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS11dWlkPVwiJHtfdGhpcy5zdGF0ZS51dWlkfVwiXSAuJHtjc3NDbGFzc2VzLlRBQlNfVEFCfVtkYXRhLXNjcm9sbGtleT1cIiR7a2V5fVwiXWApO1xuICAgICAgdGFiSXRlbSA9PT0gbnVsbCB8fCB0YWJJdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YWJJdGVtLnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICBibG9jazogbG9naWNhbFBvc2l0aW9uLFxuICAgICAgICBpbmxpbmU6IGxvZ2ljYWxQb3NpdGlvblxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnNjcm9sbEFjdGl2ZVRhYkl0ZW1JbnRvVmlldyA9IGxvZ2ljYWxQb3NpdGlvbiA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLl9nZXRCYXJJdGVtS2V5QnlJdGVtS2V5KHRoaXMucHJvcHMuYWN0aXZlS2V5KTtcbiAgICAgIHRoaXMuc2Nyb2xsVGFiSXRlbUludG9WaWV3QnlLZXkoa2V5LCBsb2dpY2FsUG9zaXRpb24pO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJUYWJDb21wb25lbnRzID0gbGlzdCA9PiBsaXN0Lm1hcChwYW5lbCA9PiB0aGlzLnJlbmRlclRhYkl0ZW0ocGFuZWwpKTtcbiAgICB0aGlzLmhhbmRsZUFycm93Q2xpY2sgPSAoaXRlbXMsIHBvcykgPT4ge1xuICAgICAgY29uc3QgbGFzdEl0ZW0gPSBwb3MgPT09ICdzdGFydCcgPyBpdGVtcy5wb3AoKSA6IGl0ZW1zLnNoaWZ0KCk7XG4gICAgICBpZiAoIWxhc3RJdGVtKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuX2dldEJhckl0ZW1LZXlCeUl0ZW1LZXkobGFzdEl0ZW0uaXRlbUtleSk7XG4gICAgICB0aGlzLnNjcm9sbFRhYkl0ZW1JbnRvVmlld0J5S2V5KGtleSk7XG4gICAgfTtcbiAgICB0aGlzLnJlbmRlckNvbGxhcHNlID0gKGl0ZW1zLCBpY29uLCBwb3MpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGNvbnN0IGFycm93Q2xzID0gY2xzKHtcbiAgICAgICAgW2Ake2Nzc0NsYXNzZXMuVEFCU19CQVJ9LWFycm93LSR7cG9zfWBdOiBwb3MsXG4gICAgICAgIFtgJHtjc3NDbGFzc2VzLlRBQlNfQkFSfS1hcnJvd2BdOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGlmIChfaXNFbXB0eShpdGVtcykpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICByb2xlOiBcInByZXNlbnRhdGlvblwiLFxuICAgICAgICAgIGNsYXNzTmFtZTogYXJyb3dDbHNcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7XG4gICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgaWNvbjogaWNvbixcbiAgICAgICAgICB0aGVtZTogXCJib3JkZXJsZXNzXCJcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBkcm9wZG93bkNsYXNzTmFtZSxcbiAgICAgICAgZHJvcGRvd25TdHlsZSxcbiAgICAgICAgc2hvd1Jlc3RJbkRyb3Bkb3duLFxuICAgICAgICBkcm9wZG93blByb3BzXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVQb3NLZXlcbiAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3QgZGlzYWJsZWQgPSAhaXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgbWVudSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyb3Bkb3duLk1lbnUsIG51bGwsIGl0ZW1zLm1hcChwYW5lbCA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBpY29uOiBpLFxuICAgICAgICAgIHRhYixcbiAgICAgICAgICBpdGVtS2V5XG4gICAgICAgIH0gPSBwYW5lbDtcbiAgICAgICAgY29uc3QgcGFuZWxJY29uID0gaSA/IHRoaXMucmVuZGVySWNvbihwYW5lbC5pY29uKSA6IG51bGw7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEcm9wZG93bi5JdGVtLCB7XG4gICAgICAgICAga2V5OiBpdGVtS2V5LFxuICAgICAgICAgIG9uQ2xpY2s6IGUgPT4gdGhpcy5oYW5kbGVJdGVtQ2xpY2soaXRlbUtleSwgZSksXG4gICAgICAgICAgYWN0aXZlOiB0aGlzLl9pc0FjdGl2ZShpdGVtS2V5KVxuICAgICAgICB9LCBwYW5lbEljb24sIHRhYik7XG4gICAgICB9KSk7XG4gICAgICBjb25zdCBidXR0b24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gICAgICAgIGNsYXNzTmFtZTogYXJyb3dDbHMsXG4gICAgICAgIG9uQ2xpY2s6IGUgPT4gdGhpcy5oYW5kbGVBcnJvd0NsaWNrKGl0ZW1zLCBwb3MpXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIHtcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICBpY29uOiBpY29uLFxuICAgICAgICB0aGVtZTogXCJib3JkZXJsZXNzXCJcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGRyb3Bkb3duQ2xzID0gY2xzKGRyb3Bkb3duQ2xhc3NOYW1lLCB7XG4gICAgICAgIFtgJHtjc3NDbGFzc2VzLlRBQlNfQkFSfS1kcm9wZG93bmBdOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGN1c3RvbURyb3Bkb3duUHJvcHMgPSAoX2EgPSBkcm9wZG93blByb3BzID09PSBudWxsIHx8IGRyb3Bkb3duUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRyb3Bkb3duUHJvcHNbcG9zXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3dSZXN0SW5Ecm9wZG93biA/ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEcm9wZG93biwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGNsYXNzTmFtZTogZHJvcGRvd25DbHMsXG4gICAgICAgIGNsaWNrVG9IaWRlOiB0cnVlLFxuICAgICAgICBjbGlja1RyaWdnZXJUb0hpZGU6IHRydWUsXG4gICAgICAgIGtleTogYCR7cmVQb3NLZXl9LSR7cG9zfWAsXG4gICAgICAgIHBvc2l0aW9uOiBwb3MgPT09ICdzdGFydCcgPyAnYm90dG9tTGVmdCcgOiAnYm90dG9tUmlnaHQnLFxuICAgICAgICByZW5kZXI6IGRpc2FibGVkID8gbnVsbCA6IG1lbnUsXG4gICAgICAgIHNob3dUaWNrOiB0cnVlLFxuICAgICAgICBzdHlsZTogZHJvcGRvd25TdHlsZSxcbiAgICAgICAgdHJpZ2dlcjogJ2hvdmVyJyxcbiAgICAgICAgZGlzYWJsZUZvY3VzTGlzdGVuZXIgLy8gcHJldmVudCB0aGUgcGFuZWwgZnJvbSBwb3BwaW5nIHVwIGFnYWluIGFmdGVyIGNsaWNraW5nXG4gICAgICAgIDogdHJ1ZVxuICAgICAgfSwgY3VzdG9tRHJvcGRvd25Qcm9wcyksIGJ1dHRvbikpIDogYnV0dG9uKTtcbiAgICB9O1xuICAgIHRoaXMucmVuZGVyT3ZlcmZsb3cgPSBpdGVtcyA9PiBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwb3MgPSBpbmRleCA9PT0gMCA/ICdzdGFydCcgOiAnZW5kJztcbiAgICAgIGNvbnN0IGljb24gPSBpbmRleCA9PT0gMCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25DaGV2cm9uTGVmdCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQ2hldnJvblJpZ2h0LCBudWxsKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93Tm9kZSA9IHRoaXMucmVuZGVyQ29sbGFwc2UoaXRlbSwgaWNvbiwgcG9zKTtcbiAgICAgIGlmICh0aGlzLnByb3BzLnJlbmRlckFycm93KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnJlbmRlckFycm93KGl0ZW0sIHBvcywgKCkgPT4gdGhpcy5oYW5kbGVBcnJvd0NsaWNrKGl0ZW0sIHBvcyksIG92ZXJmbG93Tm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3ZlcmZsb3dOb2RlO1xuICAgIH0pO1xuICAgIHRoaXMucmVuZGVyQ29sbGFwc2VkVGFiID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBsaXN0XG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHJlbmRlcmVkTGlzdCA9IGxpc3QubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaXRlbUtleVxuICAgICAgICB9ID0gaXRlbTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIGtleTogdGhpcy5fZ2V0QmFySXRlbUtleUJ5SXRlbUtleShpdGVtS2V5KSxcbiAgICAgICAgICBhY3RpdmU6IHRoaXMuX2lzQWN0aXZlKGl0ZW1LZXkpXG4gICAgICAgIH0sIGl0ZW0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3ZlcmZsb3dMaXN0LCB7XG4gICAgICAgIGl0ZW1zOiByZW5kZXJlZExpc3QsXG4gICAgICAgIG92ZXJmbG93UmVuZGVyRGlyZWN0aW9uOiB0aGlzLnByb3BzLmFycm93UG9zaXRpb24sXG4gICAgICAgIHdyYXBwZXJTdHlsZTogdGhpcy5wcm9wcy52aXNpYmxlVGFic1N0eWxlLFxuICAgICAgICBvdmVyZmxvd1JlbmRlcmVyOiB0aGlzLnJlbmRlck92ZXJmbG93LFxuICAgICAgICByZW5kZXJNb2RlOiBcInNjcm9sbFwiLFxuICAgICAgICBjbGFzc05hbWU6IGAke2Nzc0NsYXNzZXMuVEFCU19CQVJ9LW92ZXJmbG93LWxpc3RgLFxuICAgICAgICB2aXNpYmxlSXRlbVJlbmRlcmVyOiB0aGlzLnJlbmRlclRhYkl0ZW0sXG4gICAgICAgIG9uVmlzaWJsZVN0YXRlQ2hhbmdlOiB2aXNpYmxlTWFwID0+IHtcbiAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgIGNvbnN0IHZpc2libGVNYXBXaXRoSXRlbUtleSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB2aXNpYmxlTWFwLmZvckVhY2goKHYsIGspID0+IHtcbiAgICAgICAgICAgIHZpc2libGVNYXBXaXRoSXRlbUtleS5zZXQodGhpcy5fZ2V0SXRlbUtleUJ5QmFySXRlbUtleShrKSwgdik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKF9iID0gKF9hID0gdGhpcy5wcm9wcykub25WaXNpYmxlVGFic0NoYW5nZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIHZpc2libGVNYXBXaXRoSXRlbUtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJXaXRoTW9yZVRyaWdnZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxpc3QsXG4gICAgICAgIG1vcmVcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgbGV0IHRhYkVsZW1lbnRzID0gW107XG4gICAgICBsZXQgbW9yZVRyaWdnZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xzKHtcbiAgICAgICAgICBbYCR7Y3NzQ2xhc3Nlcy5UQUJTX0JBUn0tbW9yZS10cmlnZ2VyYF06IHRydWUsXG4gICAgICAgICAgW2Ake2Nzc0NsYXNzZXMuVEFCU19CQVJ9LW1vcmUtdHJpZ2dlci0ke3RoaXMucHJvcHMudHlwZX1gXTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYWxlQ29uc3VtZXIsIHtcbiAgICAgICAgY29tcG9uZW50TmFtZTogXCJUYWJzXCJcbiAgICAgIH0sIChsb2NhbGUsIGxvY2FsZUNvZGUpID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7Y3NzQ2xhc3Nlcy5UQUJTX0JBUn0tbW9yZS10cmlnZ2VyLWNvbnRlbnRgXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCBsb2NhbGUubW9yZSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25DaGV2cm9uRG93biwge1xuICAgICAgICBjbGFzc05hbWU6IGAke2Nzc0NsYXNzZXMuVEFCU19CQVJ9LW1vcmUtdHJpZ2dlci1jb250ZW50LWljb25gXG4gICAgICB9KSkpKSk7XG4gICAgICBsZXQga2VlcENvdW50O1xuICAgICAgaWYgKHR5cGVvZiBtb3JlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGtlZXBDb3VudCA9IGxpc3QubGVuZ3RoIC0gTWF0aC5taW4obW9yZSwgbGlzdC5sZW5ndGgpO1xuICAgICAgICB0YWJFbGVtZW50cyA9IGxpc3Quc2xpY2UoMCwga2VlcENvdW50KS5tYXAocGFuZWwgPT4gdGhpcy5yZW5kZXJUYWJJdGVtKHBhbmVsKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb3JlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBrZWVwQ291bnQgPSBsaXN0Lmxlbmd0aCAtIE1hdGgubWluKG1vcmUuY291bnQsIGxpc3QubGVuZ3RoKTtcbiAgICAgICAgdGFiRWxlbWVudHMgPSBsaXN0LnNsaWNlKDAsIGtlZXBDb3VudCkubWFwKHBhbmVsID0+IHRoaXMucmVuZGVyVGFiSXRlbShwYW5lbCkpO1xuICAgICAgICBpZiAobW9yZS5yZW5kZXIpIHtcbiAgICAgICAgICBtb3JlVHJpZ2dlciA9IG1vcmUucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobW9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIltTZW1pIFRhYnNdOiBpbnZhbGlkIHRhYiBwcm9wcyBmb3JtYXQ6IG1vcmVcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRhYkVsZW1lbnRzLCB0aGlzLnJlbmRlck1vcmVEcm9wZG93bihsaXN0LnNsaWNlKGtlZXBDb3VudCksIG1vcmUgPT09IG51bGwgfHwgbW9yZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbW9yZVsnZHJvcGRvd25Qcm9wcyddLCBtb3JlVHJpZ2dlcikpO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJNb3JlRHJvcGRvd24gPSAocGFuZWxzLCBkcm9wRG93blByb3BzLCB0cmlnZ2VyKSA9PiB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd24sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICB0cmlnZ2VyOiAnaG92ZXInLFxuICAgICAgICBzaG93VGljazogdHJ1ZSxcbiAgICAgICAgcG9zaXRpb246ICdib3R0b21MZWZ0JyxcbiAgICAgICAgY2xhc3NOYW1lOiBgJHtjc3NDbGFzc2VzLlRBQlNfQkFSfS1tb3JlLWRyb3Bkb3duLSR7dGhpcy5wcm9wcy50eXBlfWAsXG4gICAgICAgIGNsaWNrVG9IaWRlOiB0cnVlLFxuICAgICAgICBtZW51OiBwYW5lbHMubWFwKHBhbmVsID0+ICh7XG4gICAgICAgICAgbm9kZTogJ2l0ZW0nLFxuICAgICAgICAgIG5hbWU6IHBhbmVsLnRhYixcbiAgICAgICAgICBpY29uOiBwYW5lbC5pY29uLFxuICAgICAgICAgIG9uQ2xpY2s6IGUgPT4gdGhpcy5wcm9wcy5vblRhYkNsaWNrKHBhbmVsLml0ZW1LZXksIGUpLFxuICAgICAgICAgIGFjdGl2ZTogdGhpcy5wcm9wcy5hY3RpdmVLZXkgPT09IHBhbmVsLml0ZW1LZXlcbiAgICAgICAgfSkpXG4gICAgICB9LCBkcm9wRG93blByb3BzKSwgdHJpZ2dlcik7XG4gICAgfTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGtleSA9PiBrZXkgPT09IHRoaXMucHJvcHMuYWN0aXZlS2V5O1xuICAgIHRoaXMuX2dldEJhckl0ZW1LZXlCeUl0ZW1LZXkgPSBrZXkgPT4gYCR7a2V5fS1iYXJgO1xuICAgIHRoaXMuX2dldEl0ZW1LZXlCeUJhckl0ZW1LZXkgPSBrZXkgPT4ga2V5LnJlcGxhY2UoLy1iYXIkLywgXCJcIik7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGVuZEluZDogcHJvcHMubGlzdC5sZW5ndGgsXG4gICAgICByZVBvc0tleTogMCxcbiAgICAgIHN0YXJ0SW5kOiAwLFxuICAgICAgdXVpZDogJycsXG4gICAgICBjdXJyZW50VmlzaWJsZUl0ZW1zOiBbXVxuICAgIH07XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB1dWlkOiBnZXRVdWlkdjQoKVxuICAgIH0sICgpID0+IHtcbiAgICAgIC8vIFBlcmZvcm0gdGhlIHNjcm9sbCBpbiB0aGUgc2V0U3RhdGUgY2FsbGJhY2sgdG8gZW5zdXJlIHRoZSB1dWlkIGlzIHVwZGF0ZWQgdG8gdGhlIERPTVxuICAgICAgaWYgKHRoaXMucHJvcHMuY29sbGFwc2libGUpIHtcbiAgICAgICAgLy8gQWRkIGEgc21hbGwgZGVsYXkgdG8gZW5zdXJlIHRoZSBET00gaXMgZnVsbHkgcmVuZGVyZWRcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNjcm9sbEFjdGl2ZVRhYkl0ZW1JbnRvVmlldygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgaWYgKHByZXZQcm9wcy5hY3RpdmVLZXkgIT09IHRoaXMucHJvcHMuYWN0aXZlS2V5KSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICB0aGlzLnNjcm9sbEFjdGl2ZVRhYkl0ZW1JbnRvVmlldygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZW5kZXJJY29uKGljb24pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGljb24pO1xuICB9XG4gIHJlbmRlckV4dHJhKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRhYkJhckV4dHJhQ29udGVudCxcbiAgICAgIHR5cGUsXG4gICAgICBzaXplXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgdGFiQmFyRXh0cmFDb250ZW50RGVmYXVsdFN0eWxlID0ge1xuICAgICAgZmxvYXQ6ICdyaWdodCdcbiAgICB9O1xuICAgIGNvbnN0IHRhYkJhckV4dHJhQ29udGVudFN0eWxlID0gdGFiQmFyRXh0cmFDb250ZW50ICYmIHRhYkJhckV4dHJhQ29udGVudC5wcm9wcyA/IHRhYkJhckV4dHJhQ29udGVudC5wcm9wcy5zdHlsZSA6IHt9O1xuICAgIGNvbnN0IGV4dHJhQ2xzID0gY2xzKGNzc0NsYXNzZXMuVEFCU19CQVJfRVhUUkEsIHtcbiAgICAgIFtgJHtjc3NDbGFzc2VzLlRBQlNfQkFSfS0ke3R5cGV9LWV4dHJhYF06IHR5cGUsXG4gICAgICBbYCR7Y3NzQ2xhc3Nlcy5UQUJTX0JBUn0tJHt0eXBlfS1leHRyYS0ke3NpemV9YF06IHNpemVcbiAgICB9KTtcbiAgICBpZiAodGFiQmFyRXh0cmFDb250ZW50KSB7XG4gICAgICBjb25zdCB0YWJCYXJTdHlsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFiQmFyRXh0cmFDb250ZW50RGVmYXVsdFN0eWxlKSwgdGFiQmFyRXh0cmFDb250ZW50U3R5bGUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBleHRyYUNscyxcbiAgICAgICAgc3R5bGU6IHRhYkJhclN0eWxlLFxuICAgICAgICBcIngtc2VtaS1wcm9wXCI6IFwidGFiQmFyRXh0cmFDb250ZW50XCJcbiAgICAgIH0sIHRhYkJhckV4dHJhQ29udGVudCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBfYSA9IHRoaXMucHJvcHMsXG4gICAgICB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHN0eWxlLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIGxpc3QsXG4gICAgICAgIHRhYlBvc2l0aW9uLFxuICAgICAgICBtb3JlLFxuICAgICAgICBjb2xsYXBzaWJsZVxuICAgICAgfSA9IF9hLFxuICAgICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJ0eXBlXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJsaXN0XCIsIFwidGFiUG9zaXRpb25cIiwgXCJtb3JlXCIsIFwiY29sbGFwc2libGVcIl0pO1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbHMoY2xhc3NOYW1lLCB7XG4gICAgICBbY3NzQ2xhc3Nlcy5UQUJTX0JBUl06IHRydWUsXG4gICAgICBbY3NzQ2xhc3Nlcy5UQUJTX0JBUl9MSU5FXTogdHlwZSA9PT0gJ2xpbmUnLFxuICAgICAgW2Nzc0NsYXNzZXMuVEFCU19CQVJfQ0FSRF06IHR5cGUgPT09ICdjYXJkJyxcbiAgICAgIFtjc3NDbGFzc2VzLlRBQlNfQkFSX0JVVFRPTl06IHR5cGUgPT09ICdidXR0b24nLFxuICAgICAgW2Nzc0NsYXNzZXMuVEFCU19CQVJfU0xBU0hdOiB0eXBlID09PSAnc2xhc2gnLFxuICAgICAgW2Ake2Nzc0NsYXNzZXMuVEFCU19CQVJ9LSR7dGFiUG9zaXRpb259YF06IHRhYlBvc2l0aW9uLFxuICAgICAgW2Ake2Nzc0NsYXNzZXMuVEFCU19CQVJ9LWNvbGxhcHNlYF06IGNvbGxhcHNpYmxlXG4gICAgfSk7XG4gICAgY29uc3QgZXh0cmEgPSB0aGlzLnJlbmRlckV4dHJhKCk7XG4gICAgY29uc3QgY29udGVudHMgPSBjb2xsYXBzaWJsZSA/IHRoaXMucmVuZGVyQ29sbGFwc2VkVGFiKCkgOiBtb3JlID8gdGhpcy5yZW5kZXJXaXRoTW9yZVRyaWdnZXIoKSA6IHRoaXMucmVuZGVyVGFiQ29tcG9uZW50cyhsaXN0KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICByb2xlOiBcInRhYmxpc3RcIixcbiAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB0YWJQb3NpdGlvbiA9PT0gXCJsZWZ0XCIgPyBcInZlcnRpY2FsXCIgOiBcImhvcml6b250YWxcIixcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIGdldERhdGFBdHRyKHJlc3RQcm9wcyksIHtcbiAgICAgIFwiZGF0YS11dWlkXCI6IHRoaXMuc3RhdGUudXVpZFxuICAgIH0pLCBjb250ZW50cywgZXh0cmEpO1xuICB9XG59XG5UYWJCYXIucHJvcFR5cGVzID0ge1xuICBhY3RpdmVLZXk6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29sbGFwc2libGU6IFByb3BUeXBlcy5ib29sLFxuICBsaXN0OiBQcm9wVHlwZXMuYXJyYXksXG4gIG9uVGFiQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICBzaXplOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5TSVpFKSxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHRhYkJhckV4dHJhQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG4gIHRhYlBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5QT1NJVElPTl9NQVApLFxuICB0eXBlOiBQcm9wVHlwZXMub25lT2Yoc3RyaW5ncy5UWVBFX01BUCksXG4gIGNsb3NhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgZGVsZXRlVGFiSXRlbTogUHJvcFR5cGVzLmZ1bmMsXG4gIG1vcmU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5vYmplY3RdKVxufTtcbmV4cG9ydCBkZWZhdWx0IFRhYkJhcjsiLCAidmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBjc3NDbGFzc2VzIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdGFicy9jb25zdGFudHMnO1xuaW1wb3J0IHsgSWNvbkNsb3NlIH0gZnJvbSAnQGRvdXlpbmZlL3NlbWktaWNvbnMnO1xuY29uc3QgVGFiSXRlbSA9IChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAgIHRhYixcbiAgICAgIHNpemUsXG4gICAgICB0eXBlLFxuICAgICAgaWNvbixcbiAgICAgIHNlbGVjdGVkLFxuICAgICAgY2xvc2FibGUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGl0ZW1LZXksXG4gICAgICBkZWxldGVUYWJJdGVtLFxuICAgICAgdGFiUG9zaXRpb24sXG4gICAgICBoYW5kbGVLZXlEb3duLFxuICAgICAgb25DbGlja1xuICAgIH0gPSBwcm9wcyxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInRhYlwiLCBcInNpemVcIiwgXCJ0eXBlXCIsIFwiaWNvblwiLCBcInNlbGVjdGVkXCIsIFwiY2xvc2FibGVcIiwgXCJkaXNhYmxlZFwiLCBcIml0ZW1LZXlcIiwgXCJkZWxldGVUYWJJdGVtXCIsIFwidGFiUG9zaXRpb25cIiwgXCJoYW5kbGVLZXlEb3duXCIsIFwib25DbGlja1wiXSk7XG4gIGNvbnN0IGNsb3NhYmxlSWNvbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBjbG9zYWJsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25DbG9zZSwge1xuICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiQ2xvc2VcIixcbiAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICBjbGFzc05hbWU6IGAke2Nzc0NsYXNzZXMuVEFCU19UQUJ9LWljb24tY2xvc2VgLFxuICAgICAgb25DbGljazogZSA9PiBkZWxldGVUYWJJdGVtKGl0ZW1LZXksIGUpXG4gICAgfSkgOiBudWxsO1xuICB9LCBbdHlwZSwgY2xvc2FibGUsIGRlbGV0ZVRhYkl0ZW0sIGl0ZW1LZXldKTtcbiAgY29uc3QgcmVuZGVySWNvbiA9IHVzZUNhbGxiYWNrKGljb24gPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtjc3NDbGFzc2VzLlRBQlNfQkFSfS1pY29uYFxuICB9LCBpY29uKSksIFtdKTtcbiAgY29uc3QgaGFuZGxlS2V5RG93bkluSXRlbSA9IHVzZUNhbGxiYWNrKGV2ZW50ID0+IHtcbiAgICBoYW5kbGVLZXlEb3duICYmIGhhbmRsZUtleURvd24oZXZlbnQsIGl0ZW1LZXksIGNsb3NhYmxlKTtcbiAgfSwgW2hhbmRsZUtleURvd24sIGl0ZW1LZXksIGNsb3NhYmxlXSk7XG4gIGNvbnN0IGhhbmRsZUl0ZW1DbGljayA9IHVzZUNhbGxiYWNrKGUgPT4ge1xuICAgICFkaXNhYmxlZCAmJiBvbkNsaWNrICYmIG9uQ2xpY2soaXRlbUtleSwgZSk7XG4gIH0sIFtpdGVtS2V5LCBkaXNhYmxlZCwgb25DbGlja10pO1xuICBjb25zdCBwYW5lbEljb24gPSBpY29uID8gcmVuZGVySWNvbihpY29uKSA6IG51bGw7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IGNscyhjc3NDbGFzc2VzLlRBQlNfVEFCLCBgJHtjc3NDbGFzc2VzLlRBQlNfVEFCfS0ke3R5cGV9YCwgYCR7Y3NzQ2xhc3Nlcy5UQUJTX1RBQn0tJHt0YWJQb3NpdGlvbn1gLCBgJHtjc3NDbGFzc2VzLlRBQlNfVEFCfS1zaW5nbGVgLCB7XG4gICAgW2Nzc0NsYXNzZXMuVEFCU19UQUJfQUNUSVZFXTogc2VsZWN0ZWQsXG4gICAgW2Nzc0NsYXNzZXMuVEFCU19UQUJfRElTQUJMRURdOiBkaXNhYmxlZCxcbiAgICBbYCR7Y3NzQ2xhc3Nlcy5UQUJTX1RBQn0tc21hbGxgXTogc2l6ZSA9PT0gJ3NtYWxsJyxcbiAgICBbYCR7Y3NzQ2xhc3Nlcy5UQUJTX1RBQn0tbWVkaXVtYF06IHNpemUgPT09ICdtZWRpdW0nXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgcm9sZTogXCJ0YWJcIixcbiAgICBpZDogYHNlbWlUYWIke2l0ZW1LZXl9YCxcbiAgICBcImRhdGEtdGFia2V5XCI6IGBzZW1pVGFiJHtpdGVtS2V5fWAsXG4gICAgXCJhcmlhLWNvbnRyb2xzXCI6IGBzZW1pVGFiUGFuZWwke2l0ZW1LZXl9YCxcbiAgICBcImFyaWEtZGlzYWJsZWRcIjogZGlzYWJsZWQgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBzZWxlY3RlZCA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgdGFiSW5kZXg6IHNlbGVjdGVkID8gMCA6IC0xLFxuICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93bkluSXRlbSxcbiAgICBvbkNsaWNrOiBoYW5kbGVJdGVtQ2xpY2ssXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgcmVmOiByZWZcbiAgfSksIHBhbmVsSWNvbiwgdGFiLCBjbG9zYWJsZUljb24pO1xufTtcbi8vIFdoeSBpcyBmb3J3YXJkUmVmIG5lZWRlZCBoZXJlXHVGRjFGXG4vLyBCZWNhdXNlIFRhYkl0ZW0gbmVlZHMgdG8gYmUgdXNlZCBpbiBPdmVyZmxvd0xpc3QgXHVGRjA4d2hlbiB0YWJzJyB0eXBlIGlzIGNvbGxhcHNpYmxlKSwgXG4vLyBPdmVyZmxvd0xpc3Qgd2lsbCBwYXNzIHJlZiB0byB0aGUgb3V0ZXJtb3N0IGRpdiBET00gbm9kZSBvZiBUYWJJdGVtXG5jb25zdCBGb3J3YXJkVGFiSXRlbSA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKFRhYkl0ZW0pO1xuLy8gQHRzLWlnbm9yZSBcbkZvcndhcmRUYWJJdGVtLmVsZW1lbnRUeXBlID0gJ1RhYnMuVGFiSXRlbSc7XG5leHBvcnQgZGVmYXVsdCBGb3J3YXJkVGFiSXRlbTsiLCAidmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVSZWYsIFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNscyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGNzc0NsYXNzZXMgfSBmcm9tICdAZG91eWluZmUvc2VtaS1mb3VuZGF0aW9uL2xpYi9lcy90YWJzL2NvbnN0YW50cyc7XG5pbXBvcnQgZ2V0RGF0YUF0dHIgZnJvbSAnQGRvdXlpbmZlL3NlbWktZm91bmRhdGlvbi9saWIvZXMvdXRpbHMvZ2V0RGF0YUF0dHInO1xuaW1wb3J0IFRhYnNDb250ZXh0IGZyb20gJy4vdGFicy1jb250ZXh0JztcbmltcG9ydCBDU1NBbmltYXRpb24gZnJvbSBcIi4uL19jc3NBbmltYXRpb25cIjtcbmNsYXNzIFRhYlBhbmUgZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLnJlZiA9IC8qI19fUFVSRV9fKi9jcmVhdGVSZWYoKTtcbiAgICAvLyBnZXQgZGlyZWN0aW9uIGZyb20gY3VycmVudCBpdGVtIGtleSB0byBhY3RpdmVLZXlcbiAgICB0aGlzLmdldERpcmVjdGlvbiA9IChhY3RpdmVLZXksIGl0ZW1LZXksIHBhbmVzLCBsYXN0QWN0aXZlS2V5KSA9PiB7XG4gICAgICBpZiAoaXRlbUtleSAhPT0gbnVsbCAmJiBhY3RpdmVLZXkgIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShwYW5lcykgJiYgcGFuZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gcGFuZXMuZmluZEluZGV4KHBhbmUgPT4gcGFuZS5pdGVtS2V5ID09PSBhY3RpdmVLZXkpO1xuICAgICAgICBjb25zdCBpdGVtSW5kZXggPSBwYW5lcy5maW5kSW5kZXgocGFuZSA9PiBwYW5lLml0ZW1LZXkgPT09IGl0ZW1LZXkpO1xuICAgICAgICBjb25zdCBsYXN0QWN0aXZlSW5kZXggPSBwYW5lcy5maW5kSW5kZXgocGFuZSA9PiBwYW5lLml0ZW1LZXkgPT09IGxhc3RBY3RpdmVLZXkpO1xuICAgICAgICBpZiAoYWN0aXZlSW5kZXggPT09IGl0ZW1JbmRleCkge1xuICAgICAgICAgIHJldHVybiBsYXN0QWN0aXZlSW5kZXggPiBhY3RpdmVJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaXRlbUluZGV4IDwgYWN0aXZlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuc2hvdWxkUmVuZGVyID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpdGVtS2V5XG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWN0aXZlS2V5LFxuICAgICAgICBsYXp5UmVuZGVyXG4gICAgICB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgY29uc3QgYWN0aXZlID0gYWN0aXZlS2V5ID09PSBpdGVtS2V5O1xuICAgICAgdGhpcy5fYWN0aXZlID0gdGhpcy5fYWN0aXZlIHx8IGFjdGl2ZTtcbiAgICAgIHJldHVybiBsYXp5UmVuZGVyID8gdGhpcy5fYWN0aXZlIDogdHJ1ZTtcbiAgICB9O1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICB0YWJQYW5lTW90aW9uOiBtb3Rpb24sXG4gICAgICB0YWJQb3NpdGlvbixcbiAgICAgIHByZXZBY3RpdmVLZXlcbiAgICB9ID0gdGhpcy5jb250ZXh0O1xuICAgIGNvbnN0IF9hID0gdGhpcy5wcm9wcyxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIGl0ZW1LZXksXG4gICAgICAgIHRhYkluZGV4XG4gICAgICB9ID0gX2EsXG4gICAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY2hpbGRyZW5cIiwgXCJpdGVtS2V5XCIsIFwidGFiSW5kZXhcIl0pO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuY29udGV4dC5hY3RpdmVLZXkgPT09IGl0ZW1LZXk7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNscyhjbGFzc05hbWUsIHtcbiAgICAgIFtjc3NDbGFzc2VzLlRBQlNfUEFORV9JTkFDVElWRV06ICFhY3RpdmUsXG4gICAgICBbY3NzQ2xhc3Nlcy5UQUJTX1BBTkVfQUNUSVZFXTogYWN0aXZlLFxuICAgICAgW2Nzc0NsYXNzZXMuVEFCU19QQU5FXTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHNob3VsZFJlbmRlciA9IHRoaXMuc2hvdWxkUmVuZGVyKCk7XG4gICAgY29uc3Qgc3RhcnRDbGFzc05hbWUgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24odGhpcy5jb250ZXh0LmFjdGl2ZUtleSwgaXRlbUtleSwgdGhpcy5jb250ZXh0LnBhbmVzLCBwcmV2QWN0aXZlS2V5KTtcbiAgICAgIGlmICh0YWJQb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICAgIHJldHVybiBjc3NDbGFzc2VzLlRBQlNfUEFORV9BTklNQVRFX1JJR0hUX1NIT1c7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNzc0NsYXNzZXMuVEFCU19QQU5FX0FOSU1BVEVfTEVGVF9TSE9XO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGNzc0NsYXNzZXMuVEFCU19QQU5FX0FOSU1BVEVfQk9UVE9NX1NIT1c7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNzc0NsYXNzZXMuVEFCU19QQU5FX0FOSU1BVEVfVE9QX1NIT1c7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGNvbnN0IGlzQWN0aXZhdGVkQmVjYXVzZU90aGVyVGFiUGFuZVJlbW92ZWQgPSAhdGhpcy5jb250ZXh0LnBhbmVzLmZpbmQodGFiUGFuZSA9PiB0YWJQYW5lLml0ZW1LZXkgPT09IHByZXZBY3RpdmVLZXkpO1xuICAgIGNvbnN0IGhhc01vdGlvbiA9IG1vdGlvbiAmJiBhY3RpdmUgJiYgIWlzQWN0aXZhdGVkQmVjYXVzZU90aGVyVGFiUGFuZVJlbW92ZWQgJiYgIXRoaXMuY29udGV4dC5mb3JjZURpc2FibGVNb3Rpb247XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIHJvbGU6IFwidGFicGFuZWxcIixcbiAgICAgIGlkOiBgc2VtaVRhYlBhbmVsJHtpdGVtS2V5fWAsXG4gICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBgc2VtaVRhYiR7aXRlbUtleX1gLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgXCJhcmlhLWhpZGRlblwiOiBhY3RpdmUgPyAnZmFsc2UnIDogJ3RydWUnLFxuICAgICAgdGFiSW5kZXg6IHRhYkluZGV4ID8gdGFiSW5kZXggOiAwXG4gICAgfSwgZ2V0RGF0YUF0dHIocmVzdFByb3BzKSwge1xuICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImNoaWxkcmVuXCJcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTQW5pbWF0aW9uLCB7XG4gICAgICBtb3Rpb246IGhhc01vdGlvbixcbiAgICAgIGFuaW1hdGlvblN0YXRlOiBhY3RpdmUgPyBcImVudGVyXCIgOiBcImxlYXZlXCIsXG4gICAgICBzdGFydENsYXNzTmFtZTogc3RhcnRDbGFzc05hbWVcbiAgICB9LCBfcmVmID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGFuaW1hdGlvbkNsYXNzTmFtZSxcbiAgICAgICAgYW5pbWF0aW9uRXZlbnRzTmVlZEJpbmRcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjbGFzc05hbWU6IGNscyhjc3NDbGFzc2VzLlRBQlNfUEFORV9NT1RJT05fT1ZFUkxBWSwgYW5pbWF0aW9uQ2xhc3NOYW1lKSxcbiAgICAgICAgXCJ4LXNlbWktcHJvcFwiOiBcImNoaWxkcmVuXCJcbiAgICAgIH0sIGFuaW1hdGlvbkV2ZW50c05lZWRCaW5kKSwgc2hvdWxkUmVuZGVyID8gY2hpbGRyZW4gOiBudWxsKTtcbiAgICB9KSk7XG4gIH1cbn1cblRhYlBhbmUuaXNUYWJQYW5lID0gdHJ1ZTtcblRhYlBhbmUuY29udGV4dFR5cGUgPSBUYWJzQ29udGV4dDtcblRhYlBhbmUucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgaXRlbUtleTogUHJvcFR5cGVzLnN0cmluZyxcbiAgdGFiOiBQcm9wVHlwZXMubm9kZSxcbiAgaWNvbjogUHJvcFR5cGVzLm5vZGUsXG4gIGNsb3NhYmxlOiBQcm9wVHlwZXMuYm9vbFxufTtcbmV4cG9ydCBkZWZhdWx0IFRhYlBhbmU7IiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBUYWJzQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IFRhYnNDb250ZXh0OyIsICJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19zcHJlYWRWYWx1ZXMoe1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgdmlld0JveDogXCIwIDAgMjAwIDIwMFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgcHJvcHMpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGN4OiAxNzUuNDI2LFxuICAgIGN5OiA5MC40NTcyLFxuICAgIHJ4OiAxNi41NjE4LFxuICAgIHJ5OiA2Ny4wMTA5LFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIGZpbGxPcGFjaXR5OiAwLjJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNzkuMDEgMjUuMDJjLTcuNDIgNi42My0xMi45NyAzMy40LTEyLjk3IDY1LjQ0IDAgMzIuMDIgNS41NSA1OC44IDEyLjk3IDY1LjQzYTUuNCA1LjQgMCAwIDEtMy41OCAxLjU4Yy05LjE1IDAtMTYuNTctMzAtMTYuNTctNjcuMDEgMC0zNy4wMSA3LjQyLTY3LjAyIDE2LjU2LTY3LjAyYTUuNCA1LjQgMCAwIDEgMy42IDEuNThaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMi42NiAzNi42NGMxLjY3LTUuOTEgNy4yNi05LjYxIDEyLjctMTIuMTUgMS44NSAyLjk3IDQuMyA1Ljk0IDcuMDkgNyAzLjE2IDEuMiA2LjEtMS42MiA2LjQ3LTQuMjkuMi0xLjMxLTEuMS00LjE1LTIuMDQtNS4yOC0uOTMtMS4xMi0yLjQtMS45Mi00LjQzLTIuMThhMTQuNCAxNC40IDAgMCAwLTcuMDkgMS4xYy0xLjYyLTMtMi41NC02LjYtMi4zNy0xMC4xNGwtMS4zOC0uMWMtLjE4IDMuODIuNzggNy42MyAyLjQ0IDEwLjgyLTUuNjMgMi43Mi0xMC45IDguMzQtMTIuNyAxNC43MWwxLjMxLjVaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCIsXG4gICAgZmlsbE9wYWNpdHk6IDAuMlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTIwLjcgMjMuOTNjLTMuNzEgMi40Ni02Ljc1IDUuOTQtNy45OCA5LjY0bC0xLjMtLjQzYzEuMzQtNC4wOCA0LjYzLTcuNzggOC41My0xMC4zNmEyNC43NyAyNC43NyAwIDAgMSA0LjE2LTIuMjIgMTYuMTkgMTYuMTkgMCAwIDEtMi40NC05LjIzbDEuMzguMDdjLS4xNyAzLjA0Ljc1IDYuMSAyLjM3IDguNjdhMTYuNjEgMTYuNjEgMCAwIDEgNy4wOS0uOTRjMi4wMy4yMiAzLjUuOSA0LjQzIDEuODdhMy44IDMuOCAwIDAgMSAxLjA4IDMuMjhjLS4zOCAyLjI5LTIuODMgMy45Mi01Ljk5IDIuOWExNC43IDE0LjcgMCAwIDEtNy4xNC01LjQ1IDIzLjI4IDIzLjI4IDAgMCAwLTQuMTggMi4yWm01LjU1LTIuNjhhMTMuMiAxMy4yIDAgMCAwIDYuMiA0LjYyYzIuNS44IDQtLjUgNC4yMS0xLjgxYTIuNDIgMi40MiAwIDAgMC0uNzEtMi4xYy0uNjUtLjY3LTEuNzgtMS4yNi0zLjYtMS40Ni0xLjktLjItNCAuMDctNi4xLjc1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3NC4zIDUzLjc2YTExLjI0IDExLjI0IDAgMCAxLTIuNzUgMTUuNjYgMTEuMjQgMTEuMjQgMCAwIDEtMTUuNy0yLjUzIDExLjI0IDExLjI0IDAgMCAxIDIuNzYtMTUuNjYgMTEuMjQgMTEuMjQgMCAwIDEgMTUuNyAyLjUzWlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgY3g6IDE3NC41ODQsXG4gICAgY3k6IDU4Ljk4MTgsXG4gICAgcng6IDAuODI2NDU0LFxuICAgIHJ5OiAwLjk2NDE5MyxcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTE1NC4xOCA2NC44OGMzLjM1LS4xMSA2LjkzLTEuNDQgOS4zOC01LjA3bDEuMzItMS45NmMyLjM1LTMuNTQgMy4wOS00LjY1IDQuNzUtNC42NS41IDAgMS4wNy4xIDEuNy4yMiAxLjA4LjIxIDIuMy40NCAzLjQ2LjE2bC0uMDgtLjExYTExLjc0IDExLjc0IDAgMCAwLTE2LjM5LTIuNjUgMTEuOCAxMS44IDAgMCAwLTQuMTQgMTQuMDZaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTY2LjQ4IDU3LjYyYTIuMzcgMi4zNyAwIDEgMS0zLjg3IDIuNzUgMi4zNyAyLjM3IDAgMCAxIDMuODctMi43NVpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNjYuMjkgMjcuOTJjMi4yNCAwIDMuOTktMS43NiAzLjk5LTMuODYgMC0yLjEtMS43NS0zLjg2LTQtMy44Ni0yLjIzIDAtMy45OSAxLjc2LTMuOTkgMy44NiAwIDIuMSAxLjc2IDMuODYgNCAzLjg2Wm0wIDEuMzdhNS4zIDUuMyAwIDAgMCA1LjM3LTUuMjMgNS4zIDUuMyAwIDAgMC01LjM3LTUuMjMgNS4zIDUuMyAwIDAgMC01LjM4IDUuMjMgNS4zIDUuMyAwIDAgMCA1LjM4IDUuMjNaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMjguMjcgNDUuNGMyLjI0IDAgNC0xLjc2IDQtMy44NSAwLTIuMS0xLjc2LTMuODYtNC0zLjg2cy00IDEuNzYtNCAzLjg2YzAgMi4xIDEuNzYgMy44NSA0IDMuODVabTAgMS4zOGE1LjMgNS4zIDAgMCAwIDUuMzctNS4yMyA1LjMgNS4zIDAgMCAwLTUuMzctNS4yNCA1LjMgNS4zIDAgMCAwLTUuMzcgNS4yNCA1LjMgNS4zIDAgMCAwIDUuMzcgNS4yM1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02NC42IDY1Ljk1IDU1IDQ4LjM4bDIzLjkzIDcuMTJMNjQuNiA2NS45NVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIixcbiAgICBmaWxsT3BhY2l0eTogMC4yXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtNTguMDggNDguMzggMTguMTYgNS41Mi0xMC40MiA3LjI3LS43OS0xLjEzIDguMS01LjY1LTE1LjQ1LTQuNy40LTEuMzFaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMDMuNjUgMzcuMTVjLTEuNDEgMS41Ny02LjU1IDcuMS03LjgyIDguMzcgMy4wMS0zLjE3IDEuNDItNi44LS43NC03LjQ0bC0uNjEtLjE3Yy0yLjQxLS42OS02LjQyLTEuODItNC40My00LjkgMi4xNy0zLjM1LjgzLTUuOTUtMy4xNy03LjQgMS40My0xLjc0IDcuNzYtOC44NSA4LjMzLTguNjNoLjAybC4yMi0uNmMyLjA4Ljc1IDMuNjIgMS44NSA0LjMgMy4zNS42OSAxLjUzLjM4IDMuMjctLjc4IDUuMDctLjQ3LjcyLS40OCAxLjItLjM3IDEuNTIuMTIuMzUuNDQuNzEgMS4wMSAxLjA2Ljk1LjU4IDIuMjYuOTUgMy4zNiAxLjI3bC42NS4xOGMyLjg3Ljg2IDMuODQgNC43OC4wMyA4LjMyWm0tOC4yIDguNzRaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCIsXG4gICAgZmlsbE9wYWNpdHk6IDAuMlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEwMy4yOSAzNi43NmMzLjItMi45NyAxLjU0LTYuMTUtLjEtNi42NGwtLjU2LS4xNmMtMS4xLS4zMS0yLjY0LS43NS0zLjc3LTEuNDQtLjY5LS40Mi0xLjMzLTEtMS42LTEuOC0uMjgtLjg0LS4xLTEuNzUuNTItMi43IDEtMS41NiAxLjExLTIuOC42OC0zLjc2LS40Ni0xLTEuNTktMS45My0zLjUtMi42MmwuNDYtMS4zYzIuMDcuNzUgMy42MiAxLjg2IDQuMyAzLjM1LjY5IDEuNTQuMzggMy4yOC0uNzkgNS4wNy0uNDYuNzItLjQ4IDEuMi0uMzcgMS41Mi4xMi4zNi40NS43MiAxLjAyIDEuMDYuOTUuNTkgMi4yNi45NiAzLjM2IDEuMjdsLjY1LjE5YzIuODcuODUgNC40NSA1LjQzLjY0IDguOTdsLS45NC0xWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNDAuNTcgNjAuNGMtLjA1IDEuNi0xLjIgOC4wMi0xLjMyIDkuMzguMi0zLjMzLTIuNS00LjY2LTQuMDgtMy45N2wtLjQ0LjJjLTEuNzQuNzgtNC42NCAyLjA5LTQuOTktLjY4LS4zOC0zLjAyLTIuNDQtMy44Ny01LjQ3LTIuNzUtLjAzLTEuNzIgMS4wNC05LjY0IDEuNDktOS44aC4wMWwtLjE3LS40NmMxLjU4LS41OCAzLjAyLS43IDQuMTQtLjE2IDEuMTYuNTYgMS44NCAxLjcyIDIuMDQgMy4zNC4wOC42NS4zMS45My41MyAxLjA3LjI1LjE1LjYxLjIgMS4xMS4xMi44NC0uMTMgMS43OS0uNTYgMi41OC0uOTJsLjQ4LS4yYzIuMDgtLjkxIDQuNTguODkgNC4xIDQuODNabS0xLjM2IDkuNzhaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCIsXG4gICAgZmlsbE9wYWNpdHk6IDAuMlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTQwLjE3IDYwLjM1Yy40MS0zLjMtMi4xMi00LjM0LTMuMzEtMy44M2wtLjQxLjE5Yy0uOC4zNS0xLjkuODYtMi45IDEuMDEtLjYxLjEtMS4yNy4wNy0xLjgyLS4yNi0uNTgtLjM1LS45Mi0uOTctMS4wMy0xLjgzLS4xNy0xLjQtLjcyLTIuMTgtMS40NS0yLjUyLS43NS0uMzctMS44Ni0uMzUtMy4zMi4ybC0uMzctMWMxLjU4LS41NyAzLjAyLS42OSA0LjE1LS4xNSAxLjE2LjU1IDEuODMgMS43MiAyLjAzIDMuMzQuMDkuNjUuMzEuOTMuNTMgMS4wNi4yNS4xNS42Mi4yIDEuMTEuMTIuODUtLjEzIDEuOC0uNTUgMi41OS0uOWwuNDctLjIyYzIuMDktLjkgNS4yNi45OCA0Ljc3IDQuOTJsLTEuMDQtLjEzWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE2NS44MyAzMy42N2MtLjY0IDMuNTcgMS40IDUuMjcgNS4yNCA1LjA4LTEuNjcgMS4wNC04LjggNS4yNi0xMC4wMiA1LjQyLTEuNTIuMi01LjMxLS45NC01LjA2LTMuODMuMjUtMi45LS4wNS00LjE3LTIuNjktNC4wMy0yLjYzLjE1LTMuNzUgMS4yNC01LjUyLS45NS0xLjc2LTIuMi0yLjE1LTIuNzktLjktNS4xOCAxLTEuOTEgOC4xOS01LjA5IDkuOS01LjM5LTEuNzggMy45Ni45NCA2LjY0IDMuMDUgNi40IDIuMTItLjIyIDYuNjQtMS4wOCA2IDIuNDhaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCIsXG4gICAgZmlsbE9wYWNpdHk6IDAuMlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTE0Ny4zNCAzMC41OGMtMS42MyAzLjU4Ljg2IDUuNiAyLjM0IDUuNDRsLjUzLS4wN2MxLjAyLS4xMiAyLjQ4LS4zIDMuNjgtLjEyLjcyLjEyIDEuNDguMzcgMiAuOTcuNTUuNjIuNzIgMS40Ny41NCAyLjUtLjMgMS42NC4wNCAyLjY5LjcyIDMuMzIuNzIuNjYgMS45NyAxLjA0IDMuODEuOTRsLjA3IDEuMzhjLTIgLjEtMy43LS4yOC00LjgxLTEuMzEtMS4xNC0xLjA2LTEuNS0yLjY1LTEuMTUtNC41OC4xNC0uNzUtLjAyLTEuMTMtLjItMS4zNC0uMjItLjI0LS42LS40Mi0xLjE5LS41MS0xLS4xNi0yLjIgMC0zLjI0LjExbC0uNjEuMDhjLTIuNzYuMy01LjcyLTMuMDQtMy43NS03LjM4bDEuMjYuNTdaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzIuNCA5OS43Yy4xNyAyLjYzLS45NyA0LjA1LTMuNDIgMy42Ni0yLjQ2LS40LTEuODEgMi42OS0xLjYzIDQuMTQuMTggMS40NS0xLjYyIDMuMzQtNC4zNiAyLjE2bC40Ny0xMC45MmMxLjM0LjUgMS40LjggMy41NC0uNDkgMi4xMy0xLjI5Ljc1LTQuODMgMS4yNC01LjYyLjUtLjggMS4wNS4wMiAzLjA5LS4zNS43Ny0uMTUgMS4xOC0uNzIgMS4zOC0xLjM5bC4wNy0yLjE3Yy4xLjU1LjE1IDEuNDMtLjA3IDIuMTdsLS4zMSA4LjhaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCIsXG4gICAgZmlsbE9wYWNpdHk6IDAuMlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTIzLjY1IDk4LjAxYzIuMzUgMS4wMiAzLjUtLjYzIDMuNC0xLjQ1bC0uMDUtLjM1Yy0uMS0uNy0uMjQtMS43My0uMTMtMi41OS4wNy0uNTIuMjUtMS4xLjctMS41Mi41LS40NCAxLjE1LS41NiAxLjktLjQ0IDEuMDguMTcgMS43MS0uMDcgMi4wNy0uNDcuNC0uNDQuNjMtMS4yMy41NS0yLjQ3bDEuMzctLjA5Yy4xIDEuNC0uMTQgMi42NC0uOSAzLjQ4LS43Ny44Ni0xLjk0IDEuMTMtMy4zMS45LS40OC0uMDctLjY2LjA0LS43NC4xMS0uMTEuMS0uMjIuMy0uMjcuNjktLjEuNjUuMDIgMS40NC4xMiAyLjE1bC4wNS40M2MuMjcgMi4xLTIuMiA0LjI0LTUuMzEgMi44OWwuNTUtMS4yN1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDkuNiA2Mi4xOGMzLjU0IDMuNTQgNi43MyA4LjU1IDYuODcgMTQuMDggMCAzLjEtLjE1IDcuNC0xLjYgMTMuMzctLjY2IDYuNzMtMi4wMyAyMC40My0yLjI4IDIxLjM3bDEyLjE4LjJjLjM0LTEuMTcgMi44Mi0xMS42MyAzLjgzLTE0LjExYTkuNSA5LjUgMCAwIDEgMS42MS0yLjg1Yy42Mi0uNzEgMS40LS45OSAyLjEyLTEuMzIuOC0uMzQgMS43NC0uNDYgMi45LS4zNGwuNTYuMDhjMS4wMy4xOCAyLjA0LjU0IDIuOSAxLjEzYTUuOSA1LjkgMCAwIDEgMi41IDQuNWMuNjYgNi42LjIgMTMuNzMtLjI4IDIwLjM3di4wM2MtLjE0IDEuOTYtLjg0IDExLjY0LTQuNjcgMTQuOS0yLjI0IDEuODgtMTQuNzUgMi4zNC0yNi40MyAyLjM2bC0yLjQ2IDIyLjg4YzQuNDgtLjIzIDEyLjcyIDEuNDMgMTUuMTQgOC41NSAyLjQxIDcuMTItNC4yMSA3LjYtMTEuMDYgNy44OC01LjQ4LjIxLTE5LjUuMDktMjUuNTUgMC01LjM3IDQuNjItMTMuMTcgNy40NC0yNC4wNyA3LjEzLTE5LjU1LS41Ni02MC45NS00LjQtNjEuOS00LjEgMS4wOC44MSAzLjIzIDIuNzUgMy4yIDQuMDItLjAzIDEuNTgtMi40IDIuOC0xMS4xNyAyLjktOC43Ni4xLTE0LjM0LTIuNTItMTQuMTYtNy4wMS4wNC0uOTcuMzItMi4zOS43OC00LjEtNS4yOC0uNjYtMTEuNDktLjUyLTEwLjQzLTguMSAxLjcyLTEyLjMxIDE1Ljg4LTI5LjYyIDE5LjgzLTMyLjAyIDMuOTUtMi40IDExLjUtMS44IDE2Ljc3LTEuMTEtMy4yOS01LjA2LTUuNi0xMS44Ny00LjMzLTIwLjYuNjUtNC40MyAyLjc1LTkuODEgNy4wMi0xNS40MmE4Mi4zIDgyLjMgMCAwIDEgMy42Ny00LjQ1YzEwLjI4LTExLjY3IDI1LjgyLTIzLjc5IDM1LjUtMzEuMDcgNS44OS00LjQzIDE0Ljc5LTcuODUgMTkuODctOS4xNyAxOC42MS00Ljg1IDMzLjAyLS45NiA0My4xNCAxMC4wMlpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDYuNTIgMTEwLjk0Yy0zLjcxIDYuNzMtNC45IDcuMzQtNi4zIDcuMTMtMS40LS4yLTIuMTQtNC42Ni44NC02LjI5IDEuMDktLjYgMi45NC0uODQgNS40Ni0uODRabTAgMGM0LjUyLTguOCA2Ljk5LTE1Ljc4IDguMzQtMjEuMzFtLTguMzQgMjEuMzFjMS41NiAwIDMuNzUuMDMgNi4wNy4wNm0tMjIuNjMgMjQuNjhjLTcuODctLjE2LTIxLjc0LjQtMjcuNzMtOS4zNS0xLjIyLTItMS45NS00LjA0LTIuMjctNi4xNm0zMCAxNS41MWMzLjYgNC42IDcuNzQgMTQuMjMgNC4zMSAyNi4xNS0xLjUyIDUuMjctNC4xMyA5Ljc2LTguMzkgMTMuNDNtNC4wOC0zOS41OGMzLjMyLjA3IDExLjM2LjI5IDE5Ljg1LjI3bS00MC45NS00Ni41Yy01LjI3IDEzLjAyLTEwLjEzIDIyLjQ5LTguOSAzMC43Mm0wIDBjLTEuMy0uNi0xMS43MS0uOTgtMTcuNzQgMS4zNC00LjktMS4zNC0zMS4yNC0xMy4yMi0zMS4xMy0yOS4xbS0xMS4xNyA4NS44OGMuOTQtLjMgNDIuMzQgMy41NCA2MS44OSA0LjEgMTAuOS4zMSAxOC43LTIuNTEgMjQuMDctNy4xM20tODUuOTYgMy4wM2E4NC40OCA4NC40OCAwIDAgMS02Ljg4LTEuNTZtNi44OCAxLjU2YzEuMDcuODEgMy4yMiAyLjc1IDMuMTkgNC4wMi0uMDMgMS41OC0yLjQgMi44LTExLjE3IDIuOS04Ljc2LjEtMTQuMzQtMi41Mi0xNC4xNi03LjAxLjA0LS45Ny4zMi0yLjM5Ljc4LTQuMW0zNC40MS0zMi40OWMtMi40Ni0uMDYtOS44Ni0uNzgtMTQuODgtLjI3LTEuMy4xNC01LjQ4IDEuMjUtMTAuMTMgOS42YTEyMC40MiAxMjAuNDIgMCAwIDAtOS40IDIzLjE1bTM0LjQxLTMyLjQ4YzIuNDYuMDcgMjIuNDkgMS41OSAyNS45OSA0LjQxIDMuNSAyLjgzLTIuOTMgMy42Ny03Ljg1IDIuOS00LjkxLS43OC0xMS40Ny0xLjcyLTE4LjE0LTcuM1ptMCAwYTM1LjM0IDM1LjM0IDAgMCAxLTguMjQtOC43NE01MS4xIDkyLjRhODIuMzMgODIuMzMgMCAwIDAtMy42NyA0LjQ1Yy00LjI3IDUuNi02LjM3IDExLTcuMDIgMTUuNDItMS4yOCA4LjczIDEuMDQgMTUuNTQgNC4zMyAyMC42TTUxLjEgOTIuNGMxMC4yOC0xMS42NyAyNS44Mi0yMy43OSAzNS41LTMxLjA3IDUuODktNC40MyAxNC43OS03Ljg1IDE5Ljg3LTkuMTcgMTguNjEtNC44NSAzMy4wMi0uOTYgNDMuMTQgMTAuMDIgMy41NCAzLjU0IDYuNzMgOC41NSA2Ljg3IDE0LjA4IDAgMy4xLS4xNSA3LjQtMS42IDEzLjM3TTQ0LjcyIDEzMi44N2MtNS4yNy0uNy0xMi44Mi0xLjMtMTYuNzcgMS4xQzI0LjAxIDEzNi4zOSA5Ljg1IDE1My43IDguMTMgMTY2Yy0xLjA2IDcuNTkgNS4xNSA3LjQ1IDEwLjQzIDguMW0xMzYuMy04NC40NmMtLjY1IDYuNzMtMi4wMiAyMC40My0yLjI3IDIxLjM3bTAgMCAxMi4xOC4yYy4zNC0xLjE3IDIuODItMTEuNjMgMy44My0xNC4xMWE5LjUgOS41IDAgMCAxIDEuNjEtMi44NWMuNjItLjcxIDEuNC0uOTkgMi4xMi0xLjMybS0yMi41MiA0My4wM2MxMS42OC0uMDIgMjQuMi0uNDggMjYuNDMtMi4zNyAzLjg1LTMuMjcgNC41My0xMy4wMiA0LjY3LTE0LjkyLjQ3LTYuNjQuOTQtMTMuNzYuMjgtMjAuMzhhNS45IDUuOSAwIDAgMC0yLjUtNC40OW0tMjguODggNDIuMTYtMi40NiAyMi44OGM0LjQ4LS4yMyAxMi43MiAxLjQzIDE1LjE0IDguNTUgMi40MSA3LjEyLTQuMjEgNy42LTExLjA2IDcuODgtNS40OC4yMS0xOS41LjA5LTI1LjU1IDBtMjMuMzUtOS4yNWMyLjIuMSA1LjY0LjcgNy44NCAzLjg3IDEuMTcgMS43LjUyIDMuMjgtLjYyIDMuOTUtMSAuNTgtMi4zOC4zOC0yLjk2LjE0LTEuNDQtLjU3LTQuODctMS4xLTYuMjItLjg3LTEuMzQuMjItMy4xOSAxLjU4LTQuOTggMS41OC0xLjc5IDAtMy44My0uNjctNC45LTIuMW00MS4zLTc4Ljc5Yy0xLjI4LjU2LTIuMDYgMi43LTIuMzQgNC4zMi0uMjcgMS42My0xLjIzIDcuOTUtMS4zMiA5LjQ4bTMuNjYtMTMuOGE3LjI3IDcuMjcgMCAwIDAtMi45LTEuMTNtMCAwYTguOTIgOC45MiAwIDAgMC0uNTctLjA4IDUuNzIgNS43MiAwIDAgMC0yLjkuMzRtMy40Ny0uMjZjLTEuMTUuNC0yLjE0IDIuNDctMi41NyAzLjgyLS40MiAxLjM2LS45NiAzLjEzLTIuMjIgMTAuMjRtMS4zMy0xMy44Yy0xLjcgMS45Ny0zLjIgNi40LTQuNSAxMy4xXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00NC41MyAxNDEuMjljLS43LS43NC0yLjU5LTctMi42Ny04Ljc3bDIuNjcuMjNjMS45IDMuNTggNi40IDcuMzcgOC40MyA4LjgyLTIuMi0uMS02Ljk1LS4yOC04LjQzLS4yOFpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMzUuMyAxNzUuNDRjLTIuNTctMS4wNC0zLjItNC43Ni0zLTguNy0uODkgMi43OS00LjEgNi44OS02LjQ5IDguN2g5LjVaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTIxLjcxIDE0MC44Yy04Ljk5LTIuMDQtMTQuOTItNi44LTE3LjU3LTExLjY3YTMzLjQgMzMuNCAwIDAgMCA1LjkzIDMuOGM2Ljg2IDMuMTcgMTguMTYgMi44MSAyMC4wNSAyLjgxIDEuMjMgMS40NiAyLjg4IDQuODQgMy41MiA2LjMtMS4xIDAtNi4yMS4wNi0xMS45My0xLjI0WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pKTtcbn1cbnZhciBJbGx1c3RyYXRpb25Db25zdHJ1Y3Rpb25EYXJrX2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25Db25zdHJ1Y3Rpb25EYXJrX2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsICJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19zcHJlYWRWYWx1ZXMoe1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgdmlld0JveDogXCIwIDAgMjAwIDIwMFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgcHJvcHMpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGN4OiAxNzUuNDI2LFxuICAgIGN5OiA5MC40NTc3LFxuICAgIHJ4OiAxNi41NjE4LFxuICAgIHJ5OiA2Ny4wMTA5LFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5LWxpZ2h0LWRlZmF1bHQpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNzkuMDEgMjUuMDJjLTcuNDIgNi42My0xMi45NyAzMy40LTEyLjk3IDY1LjQ0IDAgMzIuMDIgNS41NSA1OC44IDEyLjk3IDY1LjQzYTUuNCA1LjQgMCAwIDEtMy41OCAxLjU4Yy05LjE1IDAtMTYuNTctMzAtMTYuNTctNjcuMDEgMC0zNy4wMSA3LjQyLTY3LjAyIDE2LjU3LTY3LjAyYTUuNCA1LjQgMCAwIDEgMy41OCAxLjU4WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTIuNjYgMzYuNjRjMS42Ny01LjkxIDcuMjYtOS42MSAxMi43LTEyLjE1IDEuODUgMi45NyA0LjMgNS45NCA3LjA5IDcgMy4xNiAxLjIgNi4xLTEuNjIgNi40Ny00LjI5LjItMS4zMS0xLjEtNC4xNS0yLjA0LTUuMjgtLjkzLTEuMTItMi40LTEuOTItNC40My0yLjE4YTE0LjQgMTQuNCAwIDAgMC03LjA5IDEuMWMtMS42Mi0zLTIuNTQtNi42LTIuMzctMTAuMTRsLTEuMzgtLjFjLS4xOCAzLjgyLjc4IDcuNjMgMi40NCAxMC44Mi01LjYzIDIuNzItMTAuOSA4LjM0LTEyLjcgMTQuNzFsMS4zMS41WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5LWxpZ2h0LWhvdmVyKVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMjAuNyAyMy45M2MtMy43MSAyLjQ2LTYuNzUgNS45NC03Ljk4IDkuNjRsLTEuMy0uNDNjMS4zNC00LjA4IDQuNjMtNy43OCA4LjUzLTEwLjM2YTI0Ljc3IDI0Ljc3IDAgMCAxIDQuMTYtMi4yMiAxNi4xOSAxNi4xOSAwIDAgMS0yLjQ0LTkuMjNsMS4zOC4wOGMtLjE3IDMuMDMuNzUgNi4xIDIuMzcgOC42NmExNi42MSAxNi42MSAwIDAgMSA3LjA5LS45NGMyLjAzLjIyIDMuNS45IDQuNDMgMS44N2EzLjggMy44IDAgMCAxIDEuMDggMy4yOGMtLjM4IDIuMjktMi44MyAzLjkyLTUuOTkgMi45YTE0LjcgMTQuNyAwIDAgMS03LjE0LTUuNDUgMjMuMjggMjMuMjggMCAwIDAtNC4xOCAyLjJabTUuNTUtMi42OGExMy4yIDEzLjIgMCAwIDAgNi4yIDQuNjJjMi41LjggNC0uNSA0LjIxLTEuODFhMi40MiAyLjQyIDAgMCAwLS43MS0yLjFjLS42NS0uNjctMS43OC0xLjI2LTMuNi0xLjQ2LTEuOS0uMi00IC4wOC02LjEuNzVaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTc0LjMgNTMuNzZhMTEuMjQgMTEuMjQgMCAwIDEtMi43NSAxNS42NiAxMS4yNCAxMS4yNCAwIDAgMS0xNS43LTIuNTMgMTEuMjQgMTEuMjQgMCAwIDEgMi43Ni0xNS42NiAxMS4yNCAxMS4yNCAwIDAgMSAxNS43IDIuNTNaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNTQuMTggNjQuODhjMy4zNS0uMTEgNi45My0xLjQ0IDkuMzgtNS4wN2wxLjMyLTEuOTZjMi4zNS0zLjU0IDMuMS00LjY1IDQuNzUtNC42NS41IDAgMS4wNy4xIDEuNy4yMiAxLjA4LjIxIDIuMy40NCAzLjQ2LjE2bC0uMDgtLjExYTExLjc0IDExLjc0IDAgMCAwLTE2LjM5LTIuNjUgMTEuOCAxMS44IDAgMCAwLTQuMTQgMTQuMDZaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgY3g6IDE3NC41ODQsXG4gICAgY3k6IDU4Ljk4MTgsXG4gICAgcng6IDAuODI2NDU0LFxuICAgIHJ5OiAwLjk2NDE5MyxcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNjYuNDggNTcuNjJhMi4zNyAyLjM3IDAgMSAxLTMuODcgMi43NSAyLjM3IDIuMzcgMCAwIDEgMy44Ny0yLjc1WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNjYuMjkgMjcuOTJjMi4yNCAwIDMuOTktMS43NiAzLjk5LTMuODYgMC0yLjEtMS43NS0zLjg2LTQtMy44Ni0yLjIzIDAtMy45OSAxLjc2LTMuOTkgMy44NiAwIDIuMSAxLjc2IDMuODYgNCAzLjg2Wm0wIDEuMzhhNS4zIDUuMyAwIDAgMCA1LjM3LTUuMjQgNS4zIDUuMyAwIDAgMC01LjM3LTUuMjMgNS4zIDUuMyAwIDAgMC01LjM4IDUuMjMgNS4zIDUuMyAwIDAgMCA1LjM4IDUuMjRaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMjguMjcgNDUuNGMyLjI0IDAgNC0xLjc2IDQtMy44NSAwLTIuMS0xLjc2LTMuODYtNC0zLjg2cy00IDEuNzYtNCAzLjg2YzAgMi4xIDEuNzYgMy44NSA0IDMuODVabTAgMS4zOGE1LjMgNS4zIDAgMCAwIDUuMzctNS4yMyA1LjMgNS4zIDAgMCAwLTUuMzctNS4yNCA1LjMgNS4zIDAgMCAwLTUuMzcgNS4yNCA1LjMgNS4zIDAgMCAwIDUuMzcgNS4yM1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02NC42IDY1Ljk1IDU1IDQ4LjM4bDIzLjkzIDcuMTJMNjQuNiA2NS45NVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeS1saWdodC1ob3ZlcilcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwibTU4LjA4IDQ4LjM4IDE4LjE2IDUuNTItMTAuNDIgNy4yNy0uNzktMS4xMyA4LjEtNS42NS0xNS40NS00LjcuNC0xLjMxWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTAzLjY1IDM3LjE1Yy0xLjQxIDEuNTctNi41NSA3LjEtNy44MiA4LjM3IDMuMDEtMy4xNyAxLjQyLTYuOC0uNzQtNy40NGwtLjYxLS4xN2MtMi40MS0uNjktNi40Mi0xLjgyLTQuNDMtNC45IDIuMTctMy4zNS44My01Ljk1LTMuMTctNy40IDEuNDMtMS43NCA3Ljc2LTguODUgOC4zMy04LjYzaC4wMmwuMjItLjZjMi4wOC43NSAzLjYyIDEuODUgNC4zIDMuMzUuNjkgMS41My4zOCAzLjI3LS43OCA1LjA3LS40Ny43Mi0uNDggMS4yLS4zNyAxLjUyLjEyLjM1LjQ0LjcxIDEuMDEgMS4wNi45NS41OCAyLjI2Ljk1IDMuMzYgMS4yN2wuNjUuMThjMi44Ny44NiAzLjg0IDQuNzguMDMgOC4zMlptLTguMiA4Ljc0WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5LWxpZ2h0LWhvdmVyKVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTAzLjI5IDM2Ljc2YzMuMi0yLjk3IDEuNTQtNi4xNS0uMS02LjY0bC0uNTYtLjE2Yy0xLjEtLjMxLTIuNjQtLjc1LTMuNzctMS40NC0uNjktLjQyLTEuMzMtMS0xLjYtMS44LS4yOC0uODQtLjEtMS43NS41Mi0yLjcgMS0xLjU2IDEuMTEtMi44LjY4LTMuNzYtLjQ2LTEtMS41OS0xLjkzLTMuNS0yLjYybC40Ni0xLjNjMi4wNy43NSAzLjYyIDEuODYgNC4zIDMuMzUuNjkgMS41NC4zOCAzLjI4LS43OSA1LjA3LS40Ni43Mi0uNDggMS4yLS4zNyAxLjUyLjEyLjM2LjQ1LjcyIDEuMDIgMS4wNi45NS41OSAyLjI2Ljk2IDMuMzYgMS4yN2wuNjUuMTljMi44Ny44NSA0LjQ1IDUuNDMuNjQgOC45N2wtLjk0LTFaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk00MC41NyA2MC40Yy0uMDUgMS42LTEuMiA4LjAyLTEuMzIgOS4zOC4yLTMuMzMtMi41LTQuNjYtNC4wOC0zLjk3bC0uNDQuMmMtMS43NC43OC00LjY0IDIuMDktNC45OC0uNjgtLjM5LTMuMDItMi40NC0zLjg3LTUuNDgtMi43NS0uMDMtMS43MiAxLjA0LTkuNjQgMS40OS05LjhoLjAxbC0uMTctLjQ2YzEuNTgtLjU4IDMuMDItLjcgNC4xNC0uMTYgMS4xNi41NiAxLjg0IDEuNzIgMi4wNCAzLjM0LjA4LjY1LjMxLjkzLjUzIDEuMDcuMjUuMTUuNjEuMiAxLjExLjEyLjg0LS4xMyAxLjgtLjU2IDIuNTktLjkxbC40Ny0uMjFjMi4wOC0uOTEgNC41OC44OSA0LjEgNC44M1ptLTEuMzUgOS43OFpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeS1saWdodC1ob3ZlcilcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTQwLjE3IDYwLjM1Yy40MS0zLjMtMi4xMi00LjM0LTMuMzEtMy44M2wtLjQxLjE5Yy0uOC4zNS0xLjkuODYtMi45IDEuMDEtLjYxLjEtMS4yNy4wNy0xLjgyLS4yNi0uNTgtLjM1LS45Mi0uOTctMS4wMy0xLjgzLS4xNy0xLjQtLjcyLTIuMTgtMS40NC0yLjUyLS43Ni0uMzYtMS44Ny0uMzUtMy4zMy4ybC0uMzctMWMxLjU4LS41NyAzLjAyLS42OSA0LjE1LS4xNSAxLjE2LjU1IDEuODMgMS43MiAyLjAzIDMuMzQuMDkuNjUuMzEuOTMuNTMgMS4wNi4yNS4xNS42Mi4yIDEuMTIuMTIuODQtLjEyIDEuNzgtLjU1IDIuNTgtLjlsLjQ3LS4yMmMyLjA5LS45IDUuMjYuOTggNC43OCA0LjkybC0xLjA1LS4xM1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNjUuODMgMzMuNjdjLS42NCAzLjU3IDEuNCA1LjI3IDUuMjQgNS4wOC0xLjY3IDEuMDQtOC44IDUuMjYtMTAuMDIgNS40Mi0xLjUyLjItNS4zLS45NC01LjA2LTMuODMuMjUtMi45LS4wNS00LjE3LTIuNjktNC4wMy0yLjYzLjE1LTMuNzUgMS4yNC01LjUyLS45NS0xLjc2LTIuMi0yLjE1LTIuNzktLjktNS4xOCAxLTEuOTEgOC4xOS01LjA5IDkuOS01LjM5LTEuNzggMy45Ni45NCA2LjY0IDMuMDUgNi40IDIuMTItLjIyIDYuNjQtMS4wOCA2IDIuNDhaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnktbGlnaHQtaG92ZXIpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNDcuMzQgMzAuNThjLTEuNjIgMy41OC44NiA1LjYgMi4zNCA1LjQ0bC41My0uMDdhMTQuNCAxNC40IDAgMCAxIDMuNjgtLjExYy43Mi4xIDEuNDguMzYgMiAuOTYuNTUuNjIuNzIgMS40Ny41NCAyLjUtLjMgMS42NC4wNCAyLjY5LjcyIDMuMzIuNzIuNjYgMS45NyAxLjA0IDMuODEuOTRsLjA3IDEuMzhjLTIgLjEtMy43LS4yOC00LjgxLTEuMzEtMS4xNC0xLjA2LTEuNS0yLjY1LTEuMTUtNC41Ny4xNC0uNzYtLjAyLTEuMTQtLjItMS4zNS0uMjItLjI0LS42LS40Mi0xLjE5LS41MS0xLS4xNi0yLjIgMC0zLjI0LjEybC0uNjEuMDdjLTIuNzYuMy01LjcyLTMuMDQtMy43NS03LjM4bDEuMjYuNTdaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzIuNCA5OS43Yy4xNyAyLjYzLS45NyA0LjA1LTMuNDIgMy42Ni0yLjQ2LS40LTEuODEgMi42OS0xLjYzIDQuMTQuMTggMS40NS0xLjYyIDMuMzQtNC4zNiAyLjE2bC40Ny0xMC45MmMxLjM0LjUgMS40LjggMy41NC0uNDkgMi4xMy0xLjI5Ljc1LTQuODMgMS4yNC01LjYyLjUtLjggMS4wNS4wMiAzLjA5LS4zNS43Ny0uMTUgMS4xOC0uNzIgMS4zOC0xLjM5bC4wNy0yLjE3Yy4xLjU1LjE1IDEuNDMtLjA3IDIuMTdsLS4zMSA4LjhaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnktbGlnaHQtaG92ZXIpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0yMy42NSA5OC4wMWMyLjM1IDEuMDIgMy41LS42MyAzLjQtMS40NWwtLjA1LS4zNWMtLjEtLjctLjI0LTEuNzMtLjEzLTIuNTkuMDctLjUyLjI1LTEuMS43LTEuNTIuNS0uNDQgMS4xNS0uNTYgMS45LS40NCAxLjA4LjE3IDEuNzEtLjA3IDIuMDctLjQ3LjQtLjQ0LjYzLTEuMjMuNTUtMi40N2wxLjM3LS4wOWMuMSAxLjQtLjE0IDIuNjQtLjkgMy40OC0uNzcuODYtMS45NCAxLjEzLTMuMzEuOS0uNDgtLjA3LS42Ni4wNC0uNzQuMTEtLjExLjEtLjIyLjMtLjI3LjY5LS4xLjY1LjAyIDEuNDQuMTIgMi4xNWwuMDUuNDNjLjI3IDIuMS0yLjIgNC4yNC01LjMxIDIuODlsLjU1LTEuMjdaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ5LjYgNjIuMThjMy41NCAzLjU0IDYuNzMgOC41NSA2Ljg3IDE0LjA4IDAgMy4xLS4xNSA3LjQtMS42IDEzLjM3LS42NiA2LjczLTIuMDMgMjAuNDMtMi4yOCAyMS4zN2wxMi4xOC4yYy4zNC0xLjE3IDIuODItMTEuNjIgMy44My0xNC4xMWE5LjUgOS41IDAgMCAxIDEuNjEtMi44NWMuNjMtLjcxIDEuNC0uOTkgMi4xMi0xLjMyLjgtLjM0IDEuNzQtLjQ2IDIuOS0uMzRsLjU2LjA4YzEuMDMuMTggMi4wNC41NCAyLjkgMS4xM2E1LjkgNS45IDAgMCAxIDIuNSA0LjVjLjY2IDYuNi4yIDEzLjczLS4yOCAyMC4zN3YuMDNjLS4xNCAxLjk2LS44NCAxMS42NC00LjY3IDE0LjktMi4yNCAxLjg4LTE0Ljc1IDIuMzQtMjYuNDMgMi4zNmwtMi40NiAyMi44OGM0LjQ4LS4yMyAxMi43MiAxLjQzIDE1LjE0IDguNTUgMi40MSA3LjEyLTQuMjEgNy42LTExLjA2IDcuODgtNS40OC4yMS0xOS41LjA5LTI1LjU1IDAtNS4zNyA0LjYyLTEzLjE3IDcuNDQtMjQuMDcgNy4xMy0xOS41NS0uNTYtNjAuOTUtNC40LTYxLjktNC4xIDEuMDguODIgMy4yMyAyLjc1IDMuMiA0LjAyLS4wMyAxLjU4LTIuNCAyLjgtMTEuMTcgMi45LTguNzYuMS0xNC4zNC0yLjUyLTE0LjE2LTcuMDEuMDQtLjk3LjMyLTIuMzkuNzgtNC4xLTUuMjgtLjY2LTExLjQ5LS41Mi0xMC40My04LjEgMS43Mi0xMi4zMSAxNS44OC0yOS42MiAxOS44My0zMi4wMiAzLjk1LTIuNCAxMS41LTEuOCAxNi43Ny0xLjExLTMuMjgtNS4wNi01LjYtMTEuODctNC4zMy0yMC42LjY1LTQuNDMgMi43NS05LjgxIDcuMDItMTUuNDJhODIuMjQgODIuMjQgMCAwIDEgMy42Ny00LjQ1YzEwLjI4LTExLjY3IDI1LjgyLTIzLjc5IDM1LjUtMzEuMDcgNS44OS00LjQzIDE0Ljc5LTcuODQgMTkuODctOS4xNyAxOC42MS00Ljg1IDMzLjAyLS45NiA0My4xNCAxMC4wMlpcIixcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ2LjUyIDExMC45NGMtMy43MSA2LjczLTQuOSA3LjM0LTYuMyA3LjEzLTEuNC0uMi0yLjE0LTQuNjYuODQtNi4yOSAxLjA5LS42IDIuOTQtLjg0IDUuNDYtLjg0Wm0wIDBjNC41Mi04LjggNi45OS0xNS43NyA4LjM0LTIxLjMxbS04LjM0IDIxLjMxYzEuNTYgMCAzLjc1LjAzIDYuMDcuMDZtLTIyLjYzIDI0LjY4Yy03Ljg3LS4xNi0yMS43NC40LTI3LjczLTkuMzVhMTYuMiAxNi4yIDAgMCAxLTIuMjctNi4xNm0zMCAxNS41MWMzLjYgNC42IDcuNzQgMTQuMjMgNC4zMSAyNi4xNS0xLjUyIDUuMjctNC4xMyA5Ljc2LTguMzkgMTMuNDNtNC4wOC0zOS41OGMzLjMyLjA3IDExLjM2LjI5IDE5Ljg1LjI3bS00MC45NS00Ni41Yy01LjI3IDEzLjAyLTEwLjEzIDIyLjQ5LTguOSAzMC43Mm0wIDBjLTEuMy0uNi0xMS43MS0uOTgtMTcuNzQgMS4zNC00LjktMS4zNC0zMS4yNC0xMy4yMi0zMS4xMy0yOS4xTTM5LjkyIDE3OC4zYy45NC0uMzIgNDIuMzQgMy41MyA2MS44OSA0LjA5IDEwLjkuMzEgMTguNy0yLjUxIDI0LjA3LTcuMTNtLTg1Ljk2IDMuMDRhODQuMiA4NC4yIDAgMCAxLTYuODgtMS41N202Ljg4IDEuNTdjMS4wNy44IDMuMjIgMi43NCAzLjE5IDQtLjAzIDEuNTktMi40IDIuODEtMTEuMTcgMi45MS04Ljc2LjEtMTQuMzQtMi41Mi0xNC4xNi03LjAxLjA0LS45Ny4zMi0yLjM5Ljc4LTQuMW0zNC40MS0zMi40OWMtMi40Ni0uMDYtOS44Ni0uNzgtMTQuODgtLjI3LTEuMy4xNC01LjQ4IDEuMjUtMTAuMTMgOS42YTEyMC40NCAxMjAuNDQgMCAwIDAtOS40IDIzLjE1bTM0LjQxLTMyLjQ4YzIuNDYuMDcgMjIuNDkgMS41OSAyNS45OSA0LjQxIDMuNSAyLjgzLTIuOTMgMy42Ny03Ljg1IDIuOS00LjkxLS43OC0xMS40Ny0xLjcyLTE4LjE0LTcuM1ptMCAwYTM1LjMyIDM1LjMyIDAgMCAxLTguMjQtOC43NE01MS4xIDkyLjRhODIuMjQgODIuMjQgMCAwIDAtMy42NyA0LjQ1Yy00LjI3IDUuNi02LjM3IDExLTcuMDIgMTUuNDItMS4yOCA4LjczIDEuMDUgMTUuNTQgNC4zMyAyMC42TTUxLjEgOTIuNGMxMC4yOC0xMS42NyAyNS44Mi0yMy43OSAzNS41LTMxLjA3IDUuODktNC40MyAxNC43OS03Ljg0IDE5Ljg3LTkuMTcgMTguNjEtNC44NSAzMy4wMi0uOTYgNDMuMTQgMTAuMDIgMy41NCAzLjU0IDYuNzMgOC41NSA2Ljg3IDE0LjA4IDAgMy4xLS4xNSA3LjQtMS42IDEzLjM3TTQ0LjcyIDEzMi44N2MtNS4yNy0uNy0xMi44Mi0xLjMtMTYuNzcgMS4xQzI0LjAxIDEzNi4zOSA5Ljg1IDE1My43IDguMTMgMTY2Yy0xLjA2IDcuNTkgNS4xNSA3LjQ1IDEwLjQzIDguMW0xMzYuMy04NC40NmMtLjY1IDYuNzMtMi4wMiAyMC40My0yLjI3IDIxLjM3bTAgMCAxMi4xOC4yYy4zNC0xLjE3IDIuODItMTEuNjIgMy44My0xNC4xMWE5LjUgOS41IDAgMCAxIDEuNjEtMi44NWMuNjMtLjcxIDEuNC0uOTkgMi4xMi0xLjMybS0yMi41MiA0My4wM2MxMS42OC0uMDIgMjQuMi0uNDggMjYuNDMtMi4zNyAzLjg1LTMuMjYgNC41My0xMy4wMiA0LjY3LTE0LjkyLjQ3LTYuNjQuOTQtMTMuNzYuMjgtMjAuMzhhNS45IDUuOSAwIDAgMC0yLjUtNC40OW0tMjguODggNDIuMTYtMi40NiAyMi44OGM0LjQ4LS4yMyAxMi43MiAxLjQzIDE1LjE0IDguNTUgMi40MSA3LjEyLTQuMjEgNy42LTExLjA2IDcuODgtNS40OC4yMS0xOS41LjA5LTI1LjU1IDBtMjMuMzUtOS4yNWMyLjIuMSA1LjY0LjcgNy44NCAzLjg4IDEuMTcgMS43LjUyIDMuMjctLjYyIDMuOTQtMSAuNTgtMi4zOC4zOC0yLjk2LjE0LTEuNDQtLjU3LTQuODctMS4xLTYuMjItLjg3LTEuMzQuMjItMy4xOSAxLjU4LTQuOTggMS41OC0xLjc5IDAtMy44My0uNjctNC45LTIuMW00MS4zLTc4Ljc5Yy0xLjI4LjU2LTIuMDYgMi43LTIuMzQgNC4zMi0uMjcgMS42My0xLjIzIDcuOTUtMS4zMiA5LjQ4bTMuNjYtMTMuOGE3LjI4IDcuMjggMCAwIDAtMi45LTEuMTNtMCAwYTkuMiA5LjIgMCAwIDAtLjU3LS4wOCA1LjczIDUuNzMgMCAwIDAtMi45LjM0bTMuNDctLjI2Yy0xLjE1LjQtMi4xNCAyLjQ3LTIuNTcgMy44Mi0uNDIgMS4zNi0uOTYgMy4xNC0yLjIyIDEwLjI0bTEuMzMtMTMuOGMtMS43IDEuOTctMy4yIDYuNC00LjUgMTMuMVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNDQuNTMgMTQxLjI5Yy0uNy0uNzQtMi41OS03LTIuNjctOC43N2wyLjY3LjIzYzEuOSAzLjU4IDYuNCA3LjM3IDguNDMgOC44Mi0yLjItLjEtNi45NS0uMjgtOC40My0uMjhaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTM1LjMgMTc1LjQ0Yy0yLjU3LTEuMDQtMy4yLTQuNzYtMy04LjctLjg5IDIuNzktNC4xIDYuODktNi40OSA4LjdoOS41WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEyMS43MSAxNDAuOGMtOC45OS0yLjA0LTE0LjkyLTYuOC0xNy41Ny0xMS42Ny40Ni4zOSAzLjI4IDIuNTcgNS45MyAzLjggNi44NiAzLjE3IDE4LjE2IDIuOCAyMC4wNSAyLjggMS4yMyAxLjQ3IDIuODggNC44NSAzLjUyIDYuMy0xLjEgMC02LjIxLjA2LTExLjkzLTEuMjNaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSkpO1xufVxudmFyIElsbHVzdHJhdGlvbkNvbnN0cnVjdGlvbl9kZWZhdWx0ID0gU3ZnQ29tcG9uZW50O1xuZXhwb3J0IHtcbiAgSWxsdXN0cmF0aW9uQ29uc3RydWN0aW9uX2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsICJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19zcHJlYWRWYWx1ZXMoe1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgdmlld0JveDogXCIwIDAgMjAwIDIwMFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgcHJvcHMpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc0LjcgNzguNmMyMC43OC02LjMyIDU3LjU1LTEyLjI2IDcxLjgxLTkuODYgNC4yMS43IDguMTIgMS45OCAxMS4zNiAzLjQyLS41MS0xLjY5LS45NS0zLjUtMS4zOC01LjNsLS4wNC0uMThjLTEuMDMtNC4yNy0yLjA1LTguNDQtMy45NS0xMC41NS00LjgtNS4zMi42Ny0xMC4xMi42Ny0xMC4xMmwuOTMtMTAuNTNjMTMuMDIgNC44MiAyMS42NSAxNC45MiAyNyAyNS4wOCA0LjU3IDguNjcgNi43NSAxNy4zNyA3LjI1IDIyLjg5IDEuMDYgMTItOC4xOCAxOC44Ni0xOS4yIDE4Ljg2LTkuNzQgMC0xOC4zNi0xLjY0LTI0LjgxLTMuMS42NCAyLjE4IDUuNDQgMTkuMTggNy41MyAzMi42NmwtNDYuMTUuNTgtNy41OC0xNC42OC00LjY2LTEyLjI2Yy0xOS40NiA3LjQ2LTUwLjc3IDE5LjAyLTY0LjkgMTguNDQtMTAuMzUtLjQyLTE1LjY4LTE1LjY4LTE3LjQ0LTI4LjdhNzEuNTUgNzEuNTUgMCAwIDEtLjY3LTkuNGMwLTUuNjQuMy0xMi4xOCAyLjIyLTE3Ljg5Ljc0LTIuMjEgMS43My00LjMgMy4wNC02LjE3YTE4LjEgMTguMSAwIDAgMSA0LjYtNC41OWMwIDQtMS4wMiAxMy41NCAyLjggMTQuMTIgNS4wNi43OCAxMC40LTkuMDggMTMuODUtNy4wNiAzLjg3IDIuMjctMS42NSAxNi4zNC0xLjMzIDE3LjIuMjcuNy41MyAxLjQuNzYgMi4wN2E0OC45OSA0OC45OSAwIDAgMSAyLjI1IDguNTVDNDYuNTkgODcuNTYgNjAgODMuMDYgNzQuNjkgNzguNlpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xODEuMSA2MC41NmM0LjU3IDguNjcgNi43NSAxNy4zNyA3LjI1IDIyLjg5IDEuMDYgMTItOC4xOCAxOC44Ni0xOS4yIDE4Ljg2LTkuNzQgMC0xOC4zNi0xLjY0LTI0LjgxLTMuMW0zNi43Ny0zOC42NWMtNS4zNi0xMC4xNi0xMy45OS0yMC4yNi0yNy0yNS4wOGwtLjk0IDEwLjUzcy01LjQ2IDQuOC0uNjcgMTAuMTJjMS45IDIuMTEgMi45MiA2LjI4IDMuOTUgMTAuNTVtMjQuNjYtNi4xMmMtNi0uMzctMTguMzIuOC0yNC42NiA2LjEybTAgMGMxLjU3IDYuNTMgMy4xNSAxMy4zIDcuOTEgMTMuMyA3LjIgMC0zLjYtOC44NC0xNy44NS0xMS4yNC0xNC4yNS0yLjQtNTEuMDMgMy41NC03MS44MiA5Ljg2LTIwLjc4IDYuMzItMzkuMDQgMTIuNzEtNDIuNzcgMTkuMS0zLjYzIDYuMjMgMTMuMjQgMTAuOTIgNC40OS0xNC4xN20wIDBjLS4yMy0uNjctLjQ5LTEuMzYtLjc2LTIuMDgtLjMyLS44NSA1LjItMTQuOTIgMS4zMy0xNy4xOS0zLjQ1LTIuMDItOC44IDcuODQtMTMuODUgNy4wNi0zLjgyLS41OC0yLjgtMTAuMTItMi44LTE0LjEyYTE4LjEgMTguMSAwIDAgMC00LjYgNC42TTM2LjQgODMuNTJjLTcuMjcgMS41OC0yMS45MiA4LjEtMjUuMjcgMTEuNzNtMCAwYTcxLjU1IDcxLjU1IDAgMCAxLS42Ny05LjQxYzAtNS42NC4zLTEyLjE4IDIuMjItMTcuODltLTEuNTUgMjcuM2MxLjc2IDEzIDcuMDkgMjguMjcgMTcuNDUgMjguNyAxNC4xMi41NyA0NS40My0xMC45OSA2NC44OS0xOC40NWw0LjY2IDEyLjI2IDcuNTggMTQuNjggNDYuMTUtLjU4Yy0yLjA5LTEzLjQ4LTYuODktMzAuNDgtNy41My0zMi42N00xNS43MyA2MS44Yy0uOTggMy0xLjA4IDUuNS4xOSA3LjhtLS4yLTcuOGEyNC4wOCAyNC4wOCAwIDAgMC0zLjAzIDYuMTZtMCAwYTUuNDMgNS40MyAwIDAgMCAxLjI1IDQuMjJtMTMwLjQgMjcuMDJjLS45LTMuMDgtMy4xMi05Ljk1LTQuNzYtMTIuNzZcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTU2Ljg5IDE1LjY2LTIuMDQgMjcuOTYgMi41NyAyOC4xYy03LjUxLTMuMDctMTMuMzItNC4zNC0yNy4yNS0zLjM2LTExLjk0LjgzLTMxLjc1IDMuOTUtNDYuMjMgNy42Mi0xNi42NiA0LjI3LTM3LjgxIDExLjY0LTQ1LjIxIDE1LjktLjc3LTQuNjQtMi45Mi0xMC4xNS0yLjkyLTEwLjE1LS4wNy0uNyAyLjYzLTguMzIgMi43My0xMy4wNi4wOC0zLjA4LS45MS00LjQ1LTIuMzMtNC43NWEzLjQ3IDMuNDcgMCAwIDAtMi4wNS4zNWMtLjYzLjMyLS44Ni40OC0xLjM4Ljg0LTEuMzQuOTgtMi4zOCAyLjAyLTMuOTUgMy4zNGExNy4xNCAxNy4xNCAwIDAgMS0zLjA0IDIuMTcgNC42IDQuNiAwIDAgMS0yLjg5LjYzYy0uNjMtLjEtMS4yMS0uNDctMS43MS0xLjU4bC0uMDctLjg5Yy0uNS01Ljc5LTIuNy0yMC4xMi0yLjctMzQuOTEgMC03Ljc0IDEuNjEtMTAuMDQgMi43LTExLjU5bC4xMy0uMThjMy44NS01LjUzIDEzLjY3LTYuNzUgMjMuMTItNi45NiAyLjUtLjE0IDUuMi0uMiA4LjEtLjE3bC4xMS4xNUg1My4xNWwtLjUyLjA3IDE4LjMyIDI1LjQ5LTMuNjIgMTQuMDggMTAuMiAxNS45OC0yLjg0LTE2LjQ5IDEwLTExLjk5LTMuNS0yNy43czguNzgtLjUgMTkuNDctMS43N2MxMC42OS0xLjI4IDE4LjQ3LTEuOSAyOS40Mi0xLjgzIDEuNjQuMDEgMy40LjEgNS4yMy4yMiA5LjY0LjY1IDE4LjU1IDIuNTYgMjEuNDYgNC40bC4xMy4wOWgtLjAxWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIGZpbGxPcGFjaXR5OiAwLjJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQzIDI3LjkxYTEuMzggMS4zOCAwIDAgMSAxLjc3LS44NWMuNS4xNy45OC40MSAxLjQ0LjcxYTEuMzggMS4zOCAwIDAgMS0xLjUzIDIuMzFjLS4yNi0uMTctLjUzLS4zLS44Mi0uNGExLjM4IDEuMzggMCAwIDEtLjg1LTEuNzdaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQwLjY1IDI4LjEyYy4yMS43NC0uMjEgMS41LS45NSAxLjcxLS4zNi4xLS43My4yMy0xLjExLjM3YTEuMzggMS4zOCAwIDEgMS0uOTUtMi42Yy40My0uMTYuODctLjMgMS4zLS40My43NC0uMiAxLjUuMjIgMS43MS45NVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMzQuNzQgMzAuNGMuMzcuNjcuMTQgMS41MS0uNTMgMS44OWwtMS4wNy42MmExLjM4IDEuMzggMCAxIDEtMS40MS0yLjM4bDEuMTItLjY1YTEuMzggMS4zOCAwIDAgMSAxLjg5LjUyWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTk3Ljg2IDMxLjQzaC43NmExLjM4IDEuMzggMCAxIDEtLjA2IDIuNzdoLS41MmE2LjcgNi43IDAgMCAwLS41Ny4xIDEuMzggMS4zOCAwIDEgMS0uNjQtMi42OGMuMzMtLjA4LjY0LS4xNC45NC0uMThsLjA5LS4wMVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDcuNzggMzEuNzVjLjczLS4yMyAxLjUuMTkgMS43Mi45Mi4xMy40Mi4yNS44OC4zNSAxLjM1YTEuMzggMS4zOCAwIDAgMS0yLjcuNThjLS4xLS40LS4xOS0uNzgtLjMtMS4xMy0uMjItLjczLjItMS41LjkzLTEuNzJaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAyLjI3IDMzLjEzYy4xOS0uNzUuOTQtMS4yIDEuNjgtMS4wMS40NS4xMS44OS4yMyAxLjMuMzdhMS4zOCAxLjM4IDAgMCAxLS44NCAyLjYzYy0uMzYtLjExLS43My0uMjItMS4xMy0uMzJhMS4zOCAxLjM4IDAgMCAxLTEtMS42N1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjkuMyAzMy42OGMuNDIuNjQuMjUgMS41LS40IDEuOTJsLS41Mi4zNC0uNTMuMzZhMS4zOCAxLjM4IDAgMCAxLTEuNTMtMi4zMWwuMzItLjIxLjIxLS4xNC4zLS4yLjIzLS4xNWMuNjQtLjQyIDEuNS0uMjUgMS45Mi4zOVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDguMjUgMzUuMjJjLjM2LS42NyAxLjItLjkyIDEuODgtLjU1YTI0Ni41IDI0Ni41IDAgMCAxIDEuMTEuNjEgMS4zOCAxLjM4IDAgMCAxLTEuMzMgMi40M2wtLjUtLjI4aC0uMDFsLS42LS4zNGExLjM4IDEuMzggMCAwIDEtLjU1LTEuODdaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTIuODMgMzUuNzdjLjc2LS4wMSAxLjQuNiAxLjQgMS4zNi4wMS4xNi4wMy4zNC4wNy41NGExLjM4IDEuMzggMCAxIDEtMi43LjU4IDUuNjIgNS42MiAwIDAgMS0uMTMtMS4wN2MtLjAxLS43Ni42LTEuNCAxLjM2LTEuNFpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjQgMzcuMmMuMzEuNyAwIDEuNTEtLjcgMS44MmE2LjA3IDYuMDcgMCAwIDEtMS40NC40NSAxLjM4IDEuMzggMCAxIDEtLjY3LTIuNjhsLjU4LS4xNmMuMS0uMDMuMjQtLjA3LjQyLS4xNS43LS4zIDEuNTEuMDIgMS44Mi43MlpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTMuOSAzOC4xNGMuMTUtLjc1Ljg5LTEuMjIgMS42My0xLjA3LjM1LjA4LjcyLjE0IDEuMS4xN2ExLjM4IDEuMzggMCAwIDEtLjI2IDIuNzZjLS40OS0uMDUtLjk2LS4xMi0xLjQxLS4yMmExLjM4IDEuMzggMCAwIDEtMS4wNy0xLjY0WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0OC45OCAzNy45NWMuNzYtLjAxIDEuNC42IDEuNCAxLjM2YTM4LjQ1IDM4LjQ1IDAgMCAxIDAgMS40MiAxLjM4IDEuMzggMCAwIDEtMi43Ny0uMDggMjQuMjggMjQuMjggMCAwIDAgMC0xLjNjMC0uNzYuNi0xLjM5IDEuMzctMS40WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0OC42IDQ0Ljg4Yy43NS4xNiAxLjIyLjkgMS4wNiAxLjY1LS4xLjQ3LS4yMi45NC0uMzQgMS40MWExLjM4IDEuMzggMCAxIDEtMi42OC0uN2MuMTItLjQzLjIyLS44Ny4zMS0xLjMuMTctLjc1LjktMS4yMiAxLjY1LTEuMDZaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ2LjY5IDUxLjZjLjcuMzEgMSAxLjEzLjcgMS44My0uMi40NC0uNDEuODgtLjYzIDEuMzFhMS4zOCAxLjM4IDAgMCAxLTIuNDgtMS4yNGMuMi0uNC40LS44LjU4LTEuMi4zMS0uNyAxLjEzLTEuMDEgMS44My0uN1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00MS42NyA1NS40NWMuMDcuNzYtLjUgMS40NC0xLjI1IDEuNS0uNDMuMDQtLjg2LjEtMS4yNi4xOWExLjM4IDEuMzggMCAwIDEtLjU0LTIuNzJjLjUtLjEgMS4wMi0uMTcgMS41NS0uMjIuNzYtLjA3IDEuNDMuNSAxLjUgMS4yNVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00NC41OCA1NS43OGMuMjItLjczIDEtMS4xNSAxLjcyLS45M2wuNzQuMjNhMS4zOCAxLjM4IDAgMSAxLS45IDIuNjJsLS42Mi0uMmExLjM4IDEuMzggMCAwIDEtLjk0LTEuNzJaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTEuOSA1Ni45Yy4wNS43Ni0uNTIgMS40MS0xLjI5IDEuNDYtLjQ0LjAzLS44OS4wNy0xLjMyLjEyYTEuMzggMS4zOCAwIDAgMS0uMzEtMi43NWMuNDgtLjA1Ljk2LS4xIDEuNDUtLjEzLjc3LS4wNSAxLjQyLjUzIDEuNDcgMS4zWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTk0LjcyIDU2Ljk1Yy4wNy0uNzYuNzQtMS4zMyAxLjUtMS4yNmwxLjQzLjE0YTEuMzggMS4zOCAwIDEgMS0uMzIgMi43NWMtLjQ1LS4wNS0uOS0uMS0xLjM1LS4xM2ExLjM4IDEuMzggMCAwIDEtMS4yNi0xLjVaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAxLjY0IDU3LjgzYy4xNi0uNzUuOS0xLjIyIDEuNjQtMS4wN2wxLjM5LjNhMS4zOCAxLjM4IDAgMSAxLS42MiAyLjdsLTEuMzQtLjI5YTEuMzggMS4zOCAwIDAgMS0xLjA3LTEuNjRaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzQuODUgNTcuMjZjLjQ4LjYuMzkgMS40Ni0uMiAxLjk0LS4zMy4yNy0uNjMuNTUtLjkuODRhMS4zOCAxLjM4IDAgMCAxLTIuMDMtMS44OWMuMzYtLjM5Ljc2LS43NiAxLjE4LTEuMS42LS40OCAxLjQ2LS4zOSAxLjk1LjJaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNODUgNTcuOWMuMjkuNzEtLjA2IDEuNTEtLjc4IDEuOGExNS44IDE1LjggMCAwIDAtMS4yNi41NCAxLjM4IDEuMzggMCAxIDEtMS4xNS0yLjUyIDc0LjEgNzQuMSAwIDAgMSAxLjQtLjZjLjcxLS4yOCAxLjUyLjA3IDEuOC43OFpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDMuNCA1Ny43NmMuNjEuNDcuNzIgMS4zNC4yNiAxLjk0LS4zLjQtLjYyLjc4LS45NCAxLjE1YTEuMzggMS4zOCAwIDAgMS0yLjA5LTEuODEgMjQgMjQgMCAwIDAgLjg0LTEuMDNjLjQ3LS42IDEuMzMtLjcxIDEuOTQtLjI1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwOC40MyA1OS40NmMuMjItLjc0Ljk5LTEuMTUgMS43Mi0uOTNsMS4zNS40YTEuMzggMS4zOCAwIDEgMS0uODIgMi42NWwtMS4zMi0uNGExLjM4IDEuMzggMCAwIDEtLjkzLTEuNzJaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTE1LjA4IDYxLjU4YTEuMzggMS4zOCAwIDAgMSAxLjc3LS44M2wxLjMyLjVhMS4zOCAxLjM4IDAgMCAxLS45NyAyLjU4bC0xLjMtLjQ4YTEuMzggMS4zOCAwIDAgMS0uODItMS43N1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMzguNjcgNjIuODljLjQyLjY0LjI1IDEuNS0uNCAxLjkyLS40MS4yNy0uODUuNTQtMS4yOS43OGExLjM4IDEuMzggMCAwIDEtMS4zMi0yLjQzYy4zNy0uMi43My0uNDMgMS4xLS42Ni42My0uNDIgMS40OS0uMjUgMS45MS4zOVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zMC41IDYyLjc4Yy43Ny4wNyAxLjMzLjc0IDEuMjYgMS41bC0uMDMuNTkuMDEuNzUtMS42IDEuNGExLjM4IDEuMzggMCAwIDEtMS4xNi0xLjMybC0uMDItLjgzYzAtLjI4LjAyLS41Ni4wNC0uODQuMDctLjc2Ljc1LTEuMzIgMS41LTEuMjVaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTIxLjYgNjQuMDdjLjMtLjcgMS4xLTEuMDQgMS44LS43NWExMzUuNjggMTM1LjY4IDAgMCAxIDEuMjYuNTIgMS4zOCAxLjM4IDAgMSAxLS45NyAyLjU5IDE5LjYyIDE5LjYyIDAgMCAxLTEuMzUtLjU1Yy0uNy0uMy0xLjA0LTEuMS0uNzQtMS44MVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03Mi4xMSA2NC45NGMuNDguNi40IDEuNDctLjIgMS45NS0uMzguMy0uNzQuNjEtMS4wOS45MkExLjM4IDEuMzggMCAxIDEgNjkgNjUuNzNjLjM3LS4zMy43Ni0uNjYgMS4xNy0uOTkuNTktLjQ4IDEuNDYtLjQgMS45NC4yWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEzMi40IDY1LjkyYy4wOS43Ni0uNDYgMS40NC0xLjIyIDEuNTMtLjUuMDUtMS4wMi4wOC0xLjUzLjA5YTEuMzggMS4zOCAwIDEgMS0uMDItMi43N2MuNDIgMCAuODQtLjAzIDEuMjUtLjA3Ljc2LS4wOSAxLjQ0LjQ2IDEuNTMgMS4yMlpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02Ni42NiA2OS45Yy41Ny41Mi42IDEuNC4wOSAxLjk2bC0uNzMuOC0uMDIuMDItLjE2LjE4LS4wOC4wOWExLjM4IDEuMzggMCAwIDEtMi4wNS0xLjg2bC4yNS0uMjguNzUtLjgyYy41MS0uNTYgMS4zOS0uNiAxLjk1LS4wOVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02MS42IDc1LjI4Yy40NS42MS4zMSAxLjQ4LS4zIDEuOTMtLjQ0LjMxLS44OC42MS0xLjM2Ljg5YTEuMzggMS4zOCAwIDEgMS0xLjQtMi40Yy40LS4yMi43Ny0uNDYgMS4xMi0uNzNhMS4zOCAxLjM4IDAgMCAxIDEuOTQuM1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zNy42NyA3NS45N2MuNDIuMTkuODYuMzYgMS4zNS41M2ExLjM4IDEuMzggMCAwIDEtLjg5IDIuNjJjLS41Ni0uMTktMS4xLS40LTEuNi0uNjNsLjcyLTIuNjNjLjE0LjAxLjI4LjA1LjQyLjExWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTU1LjA1IDc4LjU3Yy4xMi43NS0uNCAxLjQ2LTEuMTUgMS41OC0uNS4wOC0xIC4xNS0xLjU0LjJhMS4zOCAxLjM4IDAgMCAxLS4yOC0yLjc1Yy40OS0uMDUuOTUtLjExIDEuMzktLjE4Ljc1LS4xMiAxLjQ2LjQgMS41OCAxLjE1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQzLjQgNzguODdjLjA2LS43Ni43My0xLjMzIDEuNDktMS4yN2EzOC40MyAzOC40MyAwIDAgMCAxLjUuMSAxLjM4IDEuMzggMCAxIDEtLjEyIDIuNzYgNjIuOTQgNjIuOTQgMCAwIDEtMS42LS4xIDEuMzggMS4zOCAwIDAgMS0xLjI3LTEuNVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBjbGlwUGF0aDogXCJ1cmwoI2NsaXBfZmFpbHVyZV9kYXJrXzQ2XzI3KVwiXG4gIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0zMC45IDQ2Ljg3YTEzLjQ1IDEzLjQ1IDAgMCAxIDkuMzctMTYuNTMgMTMuNDUgMTMuNDUgMCAwIDEgMTYuNTIgOS4zOWMyLjY0IDkuNTYtNC43NyAyOS4yNy01LjE0IDI5LjlhLjc1Ljc1IDAgMCAxLS45OS4yN2MtLjY0LS4zNC0xNy4xMS0xMy40Ny0xOS43Ni0yMy4wM1ptMTQuMzYgMS41NGE2LjEgNi4xIDAgMCAxLTMuMjUtMTEuNzUgNi4xIDYuMSAwIDAgMSAzLjI1IDExLjc1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pKSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDIuMzEgMTAwLjY5Yy0yLjggMS41NS01LjYzIDIuODUtOS4zNiA0LjU4bDEuNDggMy45MmMyLjE0LS45NiA2LjE2LTYuMDMgNy44OC04LjVaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMjEgNjMuMDRjOC44NSAyLjEgMTIuNDMtNi41IDEzLjEyLTguNzcuNjgtMi4yNy01LjYtMTEuODYtOC0xMS4yLS4xMy4wNS0uMy4wOS0uNDcuMTNsLS4xOC4wNS0xLjM3LjM3Yy0zLjY0IDEuMDMtOS45MyAzLjItMTAuOTggNy42My0xLjMgNS40NiAyLjQgMTAuNDkgNy44OCAxMS43OVpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMzQuNSA2NC43M2MtLjQzLjQ3LTEuMi43NC0yLjMzLjczYTEyLjcgMTIuNyAwIDAgMS00LjA2LS44NiAzMS4yNSAzMS4yNSAwIDAgMS05Ljk0LTYuMjJjLTMuMjUtMi45Ny01Ljk3LTUuOC03LjU5LTguNDItMS42MS0yLjYxLTIuMDUtNC44OS0uOTgtNi44NGEzLjcgMy43IDAgMCAxIDIuMTEtMS44NiA0LjUzIDQuNTMgMCAwIDEgMi45LjE1YzIuMTYuNzYgNC41NyAyLjgzIDYuNDggNi4wMSAzLjQgNS42NCA2Ljg5IDguMjQgOS43IDEwLjMzLjQ5LjM2Ljk1LjcgMS4zOCAxLjA0YTcuMyA3LjMgMCAwIDEgMi42MSAzLjQ4Yy4zNCAxLjEuMTYgMS45Ny0uMjggMi40NlpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcIm1hc2tcIiwge1xuICAgIGlkOiBcIm1hc2tfZmFpbHVyZV9kYXJrXzEzMF81MjdcIixcbiAgICBcIm1hc2stdHlwZVwiOiBcImFscGhhXCIsXG4gICAgbWFza1VuaXRzOiBcInVzZXJTcGFjZU9uVXNlXCIsXG4gICAgeDogMTAxLFxuICAgIHk6IDQ3LFxuICAgIHdpZHRoOiAzMCxcbiAgICBoZWlnaHQ6IDIyXG4gIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTMwLjUzIDYyLjFjLS41LTMuMy05LjUyLTE0Ljc1LTE2LjA4LTE1LjAzbC0xMi42OCA0LjUyIDYuNDcgMTQuMTYgMTcuMjUgMy4wN2MxLjg0LTEuMTQgNS40My00LjA3IDUuMDQtNi43MlpcIixcbiAgICBmaWxsOiBcIiNDNEM0QzRcIlxuICB9KSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgbWFzazogXCJ1cmwoI21hc2tfZmFpbHVyZV9kYXJrXzEzMF81MjcpXCJcbiAgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjcuMiA2My42MmE5Ljc0IDkuNzQgMCAwIDEtMTMuNzYuNSA5Ljc0IDkuNzQgMCAwIDEtLjMyLTEzLjc4IDkuNzQgOS43NCAwIDAgMSAxMy43Ny0uNDkgOS43NCA5Ljc0IDAgMCAxIC4zMiAxMy43N1pcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTE2Ljc5IDQ3LjM1LS4wMi4zN2MyLjg2LjUgOC41NyAyLjU5IDguNTggNi44NyAwIDUuMzYtNy40NCA5LjM0LTE0LjQ3IDMuNDYtLjM0LS4yOC0uNjYtLjUzLS45NS0uNzRhMTAuMDkgMTAuMDkgMCAwIDAgMy4xNyA3LjE3IDEwLjI0IDEwLjI0IDAgMCAwIDE0LjQ3LS41MiAxMC4yNCAxMC4yNCAwIDAgMC0uMzQtMTQuNDcgMTAuMTYgMTAuMTYgMCAwIDAtMTAuNDQtMi4xNFpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTkuMzQgNTVhLjc5Ljc5IDAgMSAwLTEuMS0xLjEyLjc5Ljc5IDAgMCAwIDEuMSAxLjEyWlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTE5Ljk4IDUwLjcyYy4yMS0uMDkuNDUuMDEuNTQuMjJhNy44NiA3Ljg2IDAgMCAwIDEuODQgMi42NS40MS40MSAwIDAgMS0uNTUuNjIgOC42NyA4LjY3IDAgMCAxLTIuMDUtMi45NS40MS40MSAwIDAgMSAuMjItLjU0WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExNC44NSA1Mi40YS43OS43OSAwIDEgMC0xLjEtMS4xMS43OS43OSAwIDAgMCAxLjEgMS4xMlpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtYXNrXCIsIHtcbiAgICBpZDogXCJwYXRoLTE1LWluc2lkZS0xXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgcng6IDIuOTc4MTgsXG4gICAgcnk6IDIuOTc4MTgsXG4gICAgdHJhbnNmb3JtOiBcIm1hdHJpeCgwLjcyNzY5NiAwLjY4NTkgLTAuNjg1OTAzIDAuNzI3NjkzIDEyOC40MzUgNjAuMDUwOClcIlxuICB9KSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgcng6IDIuOTc4MTgsXG4gICAgcnk6IDIuOTc4MTgsXG4gICAgdHJhbnNmb3JtOiBcIm1hdHJpeCgwLjcyNzY5NiAwLjY4NTkgLTAuNjg1OTAzIDAuNzI3NjkzIDEyOC40MzUgNjAuMDUwOClcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0xMjguNDIgNjAuMDQuMDEtLjAxYS4wMy4wMyAwIDAgMSAuMDIgMGwtNC4xMiA0LjM3YTUuOTggNS45OCAwIDAgMCA4LjQ1LS4yNWwtNC4zNi00LjExWm0uMDMgMHYuMDJsLTQuMzctNC4xMWE1Ljk4IDUuOTggMCAwIDAgLjI1IDguNDVsNC4xMi00LjM3Wm0wIC4wM2gtLjAzbDQuMTItNC4zN2E1Ljk4IDUuOTggMCAwIDAtOC40Ni4yNWw0LjM3IDQuMTJabS0uMDMgMHYtLjAzbDQuMzcgNC4xMWE1Ljk4IDUuOTggMCAwIDAtLjI1LTguNDVsLTQuMTIgNC4zN1pcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIixcbiAgICBtYXNrOiBcInVybCgjcGF0aC0xNS1pbnNpZGUtMSlcIlxuICB9KSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ1LjYzIDQwLjE5YzEuMzctMi43NSAxMi43NSAyLjM1IDE2LjE0IDYuNzggMy4zOCA0LjQzIDEuNDggMTAuNzQtMS45IDkuNjgtNi42OS0yLjEyLTcuNTYtNi43LTcuOTQtOS40OC0xLjItMS44NS03LjY3LTQuMjQtNi4zLTYuOThaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0xNTguOTUgNDEuNTYgNi42NCAyLjUyIDEuNjYgMTIuNDctOC4zIDEuOTgtMy40Ny0xMi4wMyAzLjQ3LTQuOTRaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTY3LjMgMTUxLjk0YzUuMTkgMS42NiAyMy4zNSAzNS41NyAxOS4wNSAzNS41Ny0xMy44NiAwLTM0LjUuNTMtNzEuNDIuNTMtMTUuNjMgMC0xNy45LTUuMTYtMTEuNzktMjIuMDhhMzUzLjIzIDM1My4yMyAwIDAgMSA2LjE0LTE1Ljc2bDMyLjUgMS4yNmMtLjQzIDEuNTMtLjkxIDMuMDctMS4zOCA0LjRhMjYuODIgMjYuODIgMCAwIDEgOC43My0xLjQ3YzUuMjcgMCA3LjA0IDEuNCAxMS43NyAwIDIuMTMtLjYyIDQuOC0yLjk3IDYuNC0yLjQ1WlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0MC40IDE1NS44N2MuNDctMS4zNC45NS0yLjg4IDEuMzgtNC40bC0zMi41LTEuMjdhMzUzLjIzIDM1My4yMyAwIDAgMC02LjE0IDE1Ljc2Yy02LjEgMTYuOTItMy44NCAyMi4wOCAxMS43OSAyMi4wOCAzNi45MyAwIDU3LjU2LS41MyA3MS40Mi0uNTMgNC4zIDAtMTMuODYtMzMuOTEtMTkuMDYtMzUuNTctMS42LS41Mi00LjI2IDEuODMtNi40IDIuNDUtNC43MiAxLjQtNi41IDAtMTEuNzYgMC0zLjA4IDAtNi4wNi41NS04LjcyIDEuNDhabTAgMGEyNi42NyAyNi42NyAwIDAgMS00LjQ0IDguMzhjLTEuNyAyLjIyLTMuOTkgNC40My01LjQzIDQuMzMtMS40NC0uMS0xLjQyLTMuMTggMC01LjY2IDEuOTctMy40NCA2LjQ1LTUuODcgOS44OC03LjA1WlwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ5LjI1IDEzMS43czMuMzYgMTkuNDYtMTIuMzQgMjEuMDRjLTExLjUzIDEuMTUtNDAuNzctNC41NS01My43Ni03Ljc5IDQuNzIgMTIuODIgOS42MSAzOS44NiA3IDQyLjE2LTMuMzMgMi45My00Ny41NSAxLjc2LTU1Ljk2IDAtOC40Mi0xLjc1IDEzLjgyLTExLjQ2IDE1LjQ1LTE0LjY2IDIuOTktNS44NC01LjQ4LTIxLjE4LTUuNzUtNDUuNDUtLjI3LTI0LjI3IDE4LjE4LTI0Ljg2IDM0LjQ3LTIxLjY0IDEzLjAyIDIuNTcgNDEuNjMgMTguMzMgNTIuNTYgMjYuODZsMTguMzMtLjUyWlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQxLjUgMTUzLjg3Yy0zLjExIDIuNTUtMjcuNzIgNS0zNS41OCAzLjUzbDIuNzUtNi44YzIwLjIzIDIuODUgMjguMDggMy4zNCAzMy40NiAxLjE2bC0uNjMgMi4xMVpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjYuMDIgMTQyLjdjLTMuMS0yLjk5LTUtNy41LTQuMTYtMTIuMzVcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTMwLjYgOTUuNjVjLTkuMDMtMTAuOTgtMTguOTctMTkuNzQtMjUuNS0yNC41NmwxLjYzLTIuMjJjNi43IDQuOTUgMTYuODEgMTMuODYgMjYgMjUuMDIgOS4xOCAxMS4xNiAxNy41NCAyNC42NyAyMC41OSAzOC44M2wtMi43LjU5Yy0yLjkxLTEzLjU2LTEwLjk3LTI2LjY3LTIwLjAyLTM3LjY2WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTE0OS4xMiAxMDcuMDktMTYuMzYgMTMuMiAyMi4yNyAxNy44IDguODctMTkuMTljLS4xNC0zLjkzLTIuMzQtNS4zNC01LjgzLTQuNjZsLTMuMTItMi41Yy4wOC0zLjUtMi4xOC01LjY0LTUuODMtNC42NVpcIixcbiAgICBmaWxsOiBcIiM2QjcwNzVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0xNDguMjQgMTI4LjYyIDkuNDUtMTQuMzQtMi45MS0yLjMzLTEwLjk0IDEzLjA3IDQuNCAzLjZaXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTE0My42NyAxMjcuOThhNi45MyA2LjkzIDAgMSAxLTEwLjgyLTguNjYgNi45MyA2LjkzIDAgMCAxIDEwLjgyIDguNjZabTEyLjI4IDkuODJhNi45MyA2LjkzIDAgMSAxLTEwLjgyLTguNjUgNi45MyA2LjkzIDAgMCAxIDEwLjgyIDguNjVaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIm0xMzMuNDMgMTIzLjQ2IDkuMjEtMS44LjMyIDEuNjEtOS4yIDEuODEtLjMzLTEuNjJaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIm0xNDUuNSAxMzMuMTEgOS4yMS0xLjguMzIgMS42Mi05LjIgMS44LS4zMy0xLjYyWlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiLCB7XG4gICAgaWQ6IFwiY2xpcF9mYWlsdXJlX2RhcmtfNDZfMjdcIlxuICB9LCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHdpZHRoOiA0NC40MDA0LFxuICAgIGhlaWdodDogNDQuNDYyNyxcbiAgICBmaWxsOiBcIndoaXRlXCIsXG4gICAgdHJhbnNmb3JtOiBcIm1hdHJpeCgwLjk2Mzk2NSAtMC4yNjYwMjggMC4yNjYxOTggMC45NjM5MTggMTguNDIxNCAzNC42MjIxKVwiXG4gIH0pKSkpO1xufVxudmFyIElsbHVzdHJhdGlvbkZhaWx1cmVEYXJrX2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25GYWlsdXJlRGFya19kZWZhdWx0IGFzIGRlZmF1bHRcbn07XG4iLCAidmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fcHJvcElzRW51bSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4ga2V5IGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZSB9KSA6IG9ialtrZXldID0gdmFsdWU7XG52YXIgX19zcHJlYWRWYWx1ZXMgPSAoYSwgYikgPT4ge1xuICBmb3IgKHZhciBwcm9wIGluIGIgfHwgKGIgPSB7fSkpXG4gICAgaWYgKF9faGFzT3duUHJvcC5jYWxsKGIsIHByb3ApKVxuICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICBpZiAoX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoYikpIHtcbiAgICAgIGlmIChfX3Byb3BJc0VudW0uY2FsbChiLCBwcm9wKSlcbiAgICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICAgIH1cbiAgcmV0dXJuIGE7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiBTdmdDb21wb25lbnQocHJvcHMpIHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9fc3ByZWFkVmFsdWVzKHtcbiAgICB3aWR0aDogMjAwLFxuICAgIGhlaWdodDogMjAwLFxuICAgIHZpZXdCb3g6IFwiMCAwIDIwMCAyMDBcIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGZvY3VzYWJsZTogZmFsc2UsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIHByb3BzKSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB3aWR0aDogMjAwLFxuICAgIGhlaWdodDogMjAwLFxuICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03NC43IDc4LjZjMjAuNzgtNi4zMiA1Ny41NS0xMi4yNiA3MS44MS05Ljg2IDQuMjEuNyA4LjEyIDEuOTggMTEuMzYgMy40Mi0uNTEtMS42OS0uOTUtMy41LTEuMzgtNS4zbC0uMDQtLjE4Yy0xLjAzLTQuMjctMi4wNS04LjQ0LTMuOTUtMTAuNTUtNC44LTUuMzIuNjctMTAuMTIuNjctMTAuMTJsLjkzLTEwLjUzYzEzLjAyIDQuODIgMjEuNjUgMTQuOTIgMjcgMjUuMDggNC41NyA4LjY3IDYuNzUgMTcuMzcgNy4yNSAyMi44OSAxLjA2IDEyLTguMTggMTguODYtMTkuMiAxOC44Ni05Ljc0IDAtMTguMzYtMS42NC0yNC44MS0zLjEuNjQgMi4xOCA1LjQ0IDE5LjE4IDcuNTMgMzIuNjZsLTQ2LjE1LjU4LTcuNTgtMTQuNjgtNC42Ni0xMi4yNmMtMTkuNDYgNy40Ni01MC43NyAxOS4wMi02NC45IDE4LjQ0LTEwLjM1LS40Mi0xNS42OC0xNS42OC0xNy40NC0yOC43YTcxLjU1IDcxLjU1IDAgMCAxLS42Ny05LjRjMC01LjY0LjMtMTIuMTggMi4yMi0xNy44OS43NC0yLjIxIDEuNzMtNC4zIDMuMDQtNi4xN2ExOC4xIDE4LjEgMCAwIDEgNC42LTQuNTljMCA0LTEuMDIgMTMuNTQgMi44IDE0LjEyIDUuMDYuNzggMTAuNC05LjA4IDEzLjg1LTcuMDYgMy44NyAyLjI3LTEuNjUgMTYuMzQtMS4zMyAxNy4yLjI3LjcuNTMgMS40Ljc2IDIuMDdhNDguOTkgNDguOTkgMCAwIDEgMi4yNSA4LjU1QzQ2LjU5IDg3LjU2IDYwIDgzLjA2IDc0LjY5IDc4LjZaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE4MS4xIDYwLjU2YzQuNTcgOC42NyA2Ljc1IDE3LjM3IDcuMjUgMjIuODkgMS4wNiAxMi04LjE4IDE4Ljg2LTE5LjIgMTguODYtOS43NCAwLTE4LjM2LTEuNjQtMjQuODEtMy4xbTM2Ljc3LTM4LjY1Yy01LjM2LTEwLjE2LTEzLjk5LTIwLjI2LTI3LTI1LjA4bC0uOTQgMTAuNTNzLTUuNDYgNC44LS42NyAxMC4xMmMxLjkgMi4xMSAyLjkyIDYuMjggMy45NSAxMC41NW0yNC42Ni02LjEyYy02LS4zNy0xOC4zMi44LTI0LjY2IDYuMTJtMCAwYzEuNTcgNi41MyAzLjE1IDEzLjMgNy45MSAxMy4zIDcuMiAwLTMuNi04Ljg0LTE3Ljg1LTExLjI0LTE0LjI1LTIuNC01MS4wMyAzLjU0LTcxLjgyIDkuODYtMjAuNzggNi4zMi0zOS4wNCAxMi43MS00Mi43NyAxOS4xLTMuNjMgNi4yMyAxMy4yNCAxMC45MiA0LjQ5LTE0LjE3bTAgMGMtLjIzLS42Ny0uNDktMS4zNi0uNzYtMi4wOC0uMzItLjg1IDUuMi0xNC45MiAxLjMzLTE3LjE5LTMuNDUtMi4wMi04LjggNy44NC0xMy44NSA3LjA2LTMuODItLjU4LTIuOC0xMC4xMi0yLjgtMTQuMTJhMTguMSAxOC4xIDAgMCAwLTQuNiA0LjZNMzYuNCA4My41MmMtNy4yNyAxLjU4LTIxLjkyIDguMS0yNS4yNyAxMS43M20wIDBhNzEuNTUgNzEuNTUgMCAwIDEtLjY3LTkuNDFjMC01LjY0LjMtMTIuMTggMi4yMi0xNy44OW0tMS41NSAyNy4zYzEuNzYgMTMgNy4wOSAyOC4yNyAxNy40NSAyOC43IDE0LjEyLjU3IDQ1LjQzLTEwLjk5IDY0Ljg5LTE4LjQ1bDQuNjYgMTIuMjYgNy41OCAxNC42OCA0Ni4xNS0uNThjLTIuMDktMTMuNDgtNi44OS0zMC40OC03LjUzLTMyLjY3TTE1LjczIDYxLjhjLS45OCAzLTEuMDggNS41LjE5IDcuOG0tLjItNy44YTI0LjA4IDI0LjA4IDAgMCAwLTMuMDMgNi4xNm0wIDBhNS40MyA1LjQzIDAgMCAwIDEuMjUgNC4yMm0xMzAuNCAyNy4wMmMtLjktMy4wOC0zLjEyLTkuOTUtNC43Ni0xMi43NlwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIm0xNTYuODkgMTUuNjYtMi4wNCAyNy45NiAyLjU3IDI4LjFjLTcuNTEtMy4wNy0xMy4zMi00LjM0LTI3LjI1LTMuMzYtMTEuOTQuODMtMzEuNzUgMy45NS00Ni4yMyA3LjYyLTE2LjY2IDQuMjctMzcuODEgMTEuNjQtNDUuMjEgMTUuOS0uNzctNC42NC0yLjkyLTEwLjE1LTIuOTItMTAuMTUtLjA3LS43IDIuNjMtOC4zMiAyLjczLTEzLjA2LjA4LTMuMDgtLjkxLTQuNDUtMi4zMy00Ljc1YTMuNDcgMy40NyAwIDAgMC0yLjA1LjM1Yy0uNjMuMzItLjg2LjQ4LTEuMzguODQtMS4zNC45OC0yLjM4IDIuMDItMy45NSAzLjM0YTE3LjE0IDE3LjE0IDAgMCAxLTMuMDQgMi4xNyA0LjYgNC42IDAgMCAxLTIuODkuNjNjLS42My0uMS0xLjIxLS40Ny0xLjcxLTEuNThsLS4wNy0uODljLS41LTUuNzktMi43LTIwLjEyLTIuNy0zNC45MSAwLTcuNzQgMS42MS0xMC4wNCAyLjctMTEuNTlsLjEzLS4xOGMzLjg1LTUuNTMgMTMuNjctNi43NSAyMy4xMi02Ljk2IDIuNS0uMTQgNS4yLS4yIDguMS0uMTdsLjExLjE1SDUzLjE1bC0uNTIuMDcgMTguMzIgMjUuNDktMy42MiAxNC4wOCAxMC4yIDE1Ljk4LTIuODQtMTYuNDkgMTAtMTEuOTktMy41LTI3LjdzOC43OC0uNSAxOS40Ny0xLjc3YzEwLjY5LTEuMjggMTguNDctMS45IDI5LjQyLTEuODMgMS42NC4wMSAzLjQuMSA1LjIzLjIyIDkuNjQuNjUgMTguNTUgMi41NiAyMS40NiA0LjRsLjEzLjA5aC0uMDFaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnktbGlnaHQtZGVmYXVsdClcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDMgMjcuOTFhMS4zOCAxLjM4IDAgMCAxIDEuNzctLjg1Yy41LjE4Ljk4LjQxIDEuNDQuNzFhMS4zOCAxLjM4IDAgMCAxLTEuNTMgMi4zMWMtLjI2LS4xNy0uNTMtLjMtLjgyLS40YTEuMzggMS4zOCAwIDAgMS0uODUtMS43N1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDAuNjUgMjguMTJjLjIxLjc0LS4yMSAxLjUtLjk1IDEuNzItLjM2LjEtLjczLjIyLTEuMTEuMzZhMS4zOCAxLjM4IDAgMSAxLS45NS0yLjZjLjQzLS4xNi44Ny0uMyAxLjMtLjQzLjc0LS4yIDEuNS4yMiAxLjcxLjk1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEzNC43NCAzMC40Yy4zNy42Ny4xNCAxLjUxLS41MyAxLjg5bC0xLjA3LjYyYTEuMzggMS4zOCAwIDEgMS0xLjQxLTIuMzhsMS4xMi0uNjVhMS4zOCAxLjM4IDAgMCAxIDEuODkuNTJaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTcuODYgMzEuNDNoLjc2YTEuMzggMS4zOCAwIDEgMS0uMDYgMi43N2gtLjUyYTYuNyA2LjcgMCAwIDAtLjU3LjEgMS4zOCAxLjM4IDAgMCAxLS42NC0yLjY4Yy4zMy0uMDguNjQtLjE0Ljk0LS4xOGwuMDktLjAxWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0Ny43OCAzMS43NWMuNzMtLjIzIDEuNS4xOSAxLjcyLjkyLjEzLjQzLjI1Ljg4LjM1IDEuMzVhMS4zOCAxLjM4IDAgMCAxLTIuNy41OGMtLjEtLjQtLjE5LS43OC0uMy0xLjEzLS4yMi0uNzMuMi0xLjUuOTMtMS43MlpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDIuMjcgMzMuMTNjLjE5LS43NS45NC0xLjIgMS42OC0xLjAxLjQ1LjExLjg5LjIzIDEuMy4zN2ExLjM4IDEuMzggMCAwIDEtLjg0IDIuNjNjLS4zNi0uMTEtLjczLS4yMi0xLjEzLS4zMmExLjM4IDEuMzggMCAwIDEtMS0xLjY3WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEyOS4zIDMzLjY4Yy40Mi42NC4yNSAxLjUtLjQgMS45MmwtLjUyLjM0LS41My4zNmExLjM4IDEuMzggMCAwIDEtMS41My0yLjMxbC4zMi0uMjEuMjEtLjE0LjMtLjIuMjMtLjE1Yy42NC0uNDIgMS41LS4yNSAxLjkyLjM5WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwOC4yNSAzNS4yMmMuMzYtLjY3IDEuMi0uOTIgMS44OC0uNTVhMjQ2LjUgMjQ2LjUgMCAwIDEgMS4xMS42MSAxLjM4IDEuMzggMCAwIDEtMS4zMyAyLjQzbC0uNS0uMjhoLS4wMWwtLjYtLjM0YTEuMzggMS4zOCAwIDAgMS0uNTUtMS44N1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05Mi44MyAzNS43N2MuNzYtLjAxIDEuNC42IDEuNCAxLjM2LjAxLjE2LjAzLjM0LjA3LjU1YTEuMzggMS4zOCAwIDEgMS0yLjcuNTggNS42MiA1LjYyIDAgMCAxLS4xMy0xLjA4Yy0uMDEtLjc2LjYtMS40IDEuMzYtMS40WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEyNCAzNy4yYy4zMS43IDAgMS41MS0uNyAxLjgyYTYuMDcgNi4wNyAwIDAgMS0xLjQ0LjQ1IDEuMzggMS4zOCAwIDEgMS0uNjctMi42OGwuNTgtLjE2Yy4xLS4wMy4yNC0uMDcuNDItLjE1LjctLjMgMS41MS4wMiAxLjgyLjcyWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExMy45IDM4LjE0Yy4xNS0uNzUuODktMS4yMiAxLjYzLTEuMDYuMzUuMDcuNzIuMTMgMS4xLjE2YTEuMzggMS4zOCAwIDAgMS0uMjYgMi43NmMtLjQ5LS4wNS0uOTYtLjEyLTEuNDEtLjIyYTEuMzggMS4zOCAwIDAgMS0xLjA3LTEuNjRaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ4Ljk4IDM3Ljk1Yy43Ni0uMDEgMS40LjYgMS40IDEuMzZhMzguNDUgMzguNDUgMCAwIDEgMCAxLjQyIDEuMzggMS4zOCAwIDAgMS0yLjc3LS4wOCAyNC4yOCAyNC4yOCAwIDAgMCAwLTEuM2MwLS43Ni42LTEuMzkgMS4zNy0xLjRaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ4LjYgNDQuODhjLjc1LjE2IDEuMjIuOSAxLjA2IDEuNjUtLjEuNDctLjIyLjk0LS4zNCAxLjQxYTEuMzggMS4zOCAwIDEgMS0yLjY4LS43Yy4xMi0uNDMuMjItLjg3LjMxLTEuMy4xNy0uNzUuOS0xLjIyIDEuNjUtMS4wNlpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDYuNjkgNTEuNmMuNy4zMSAxIDEuMTMuNyAxLjgzLS4yLjQ0LS40MS44OC0uNjMgMS4zMWExLjM4IDEuMzggMCAwIDEtMi40OC0xLjI0Yy4yLS40LjQtLjguNTgtMS4yLjMxLS43IDEuMTMtMS4wMSAxLjgzLS43WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQxLjY3IDU1LjQ1Yy4wNy43Ny0uNSAxLjQ0LTEuMjUgMS41LS40My4wNC0uODYuMS0xLjI2LjE5YTEuMzggMS4zOCAwIDEgMS0uNTQtMi43MmMuNS0uMSAxLjAyLS4xNyAxLjU1LS4yMi43Ni0uMDcgMS40My41IDEuNSAxLjI1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQ0LjU4IDU1Ljc4Yy4yMi0uNzMgMS0xLjE1IDEuNzItLjkzbC43NC4yM2ExLjM4IDEuMzggMCAxIDEtLjkgMi42MmwtLjYyLS4yYTEuMzggMS4zOCAwIDAgMS0uOTQtMS43MlpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05MS45IDU2LjljLjA1Ljc2LS41MiAxLjQyLTEuMjkgMS40Ny0uNDQuMDItLjg5LjA2LTEuMzIuMTFhMS4zOCAxLjM4IDAgMCAxLS4zMS0yLjc1Yy40OC0uMDUuOTYtLjEgMS40NS0uMTMuNzctLjA1IDEuNDIuNTMgMS40NyAxLjNaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTQuNzIgNTYuOTVjLjA3LS43Ni43NC0xLjMzIDEuNS0xLjI2bDEuNDMuMTRhMS4zOCAxLjM4IDAgMCAxLS4zMiAyLjc1Yy0uNDUtLjA1LS45LS4xLTEuMzUtLjEzYTEuMzggMS4zOCAwIDAgMS0xLjI2LTEuNVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDEuNjQgNTcuODNjLjE2LS43NS45LTEuMjIgMS42NC0xLjA3bDEuMzkuMzFhMS4zOCAxLjM4IDAgMSAxLS42MiAyLjdsLTEuMzQtLjNhMS4zOCAxLjM4IDAgMCAxLTEuMDctMS42NFpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zNC44NSA1Ny4yNmMuNDguNi4zOSAxLjQ2LS4yIDEuOTQtLjMzLjI3LS42My41NS0uOS44NGExLjM4IDEuMzggMCAwIDEtMi4wMy0xLjg5Yy4zNi0uMzkuNzYtLjc1IDEuMTgtMS4xLjYtLjQ4IDEuNDYtLjM5IDEuOTUuMlpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04NSA1Ny45Yy4yOS43MS0uMDYgMS41MS0uNzggMS44YTE1LjggMTUuOCAwIDAgMC0xLjI2LjU0IDEuMzggMS4zOCAwIDEgMS0xLjE1LTIuNTIgNzEuNjQgNzEuNjQgMCAwIDEgMS40LS42Yy43MS0uMjggMS41Mi4wNyAxLjguNzhaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQzLjQgNTcuNzZjLjYxLjQ3LjcyIDEuMzQuMjYgMS45NS0uMy4zOS0uNjIuNzctLjk0IDEuMTRhMS4zOCAxLjM4IDAgMCAxLTIuMDktMS44MSAyNCAyNCAwIDAgMCAuODQtMS4wM2MuNDctLjYgMS4zMy0uNzEgMS45NC0uMjVaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA4LjQzIDU5LjQ2Yy4yMi0uNzQuOTktMS4xNSAxLjcyLS45M2wxLjM1LjQxYTEuMzggMS4zOCAwIDEgMS0uODIgMi42NGwtMS4zMi0uNGExLjM4IDEuMzggMCAwIDEtLjkzLTEuNzJaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTE1LjA4IDYxLjU4YTEuMzggMS4zOCAwIDAgMSAxLjc3LS44MmwxLjMyLjQ4YTEuMzggMS4zOCAwIDAgMS0uOTcgMi42Yy0uNDMtLjE3LS44Ny0uMzMtMS4zLS40OGExLjM4IDEuMzggMCAwIDEtLjgyLTEuNzhaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTM4LjY3IDYyLjg5Yy40Mi42NC4yNSAxLjUtLjQgMS45Mi0uNDEuMjctLjg1LjU0LTEuMjkuNzhhMS4zOCAxLjM4IDAgMCAxLTEuMzItMi40M2MuMzctLjIuNzMtLjQzIDEuMS0uNjYuNjMtLjQyIDEuNDktLjI1IDEuOTEuMzlaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzAuNSA2Mi43OGMuNzcuMDcgMS4zMy43NCAxLjI2IDEuNWwtLjAzLjU5LjAxLjc1LTEuNiAxLjRhMS4zOCAxLjM4IDAgMCAxLTEuMTYtMS4zMmwtLjAyLS44M2MwLS4yOC4wMi0uNTYuMDQtLjg0LjA3LS43Ni43NS0xLjMyIDEuNS0xLjI1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEyMS42IDY0LjA3Yy4zLS43IDEuMS0xLjA0IDEuOC0uNzVhMTQ2LjggMTQ2LjggMCAwIDEgMS4yNi41MiAxLjM4IDEuMzggMCAxIDEtLjk3IDIuNTkgMTkuNjIgMTkuNjIgMCAwIDEtMS4zNS0uNTVjLS43LS4zLTEuMDQtMS4xLS43NC0xLjgxWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTcyLjExIDY0Ljk0Yy40OC42LjQgMS40Ny0uMiAxLjk1LS4zOC4zLS43NC42Mi0xLjA5LjkyQTEuMzggMS4zOCAwIDEgMSA2OSA2NS43M2MuMzctLjMzLjc2LS42NiAxLjE3LS45OS41OS0uNDggMS40Ni0uMzkgMS45NC4yWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEzMi40IDY1LjkyYy4wOS43Ni0uNDYgMS40NC0xLjIyIDEuNTMtLjUuMDUtMS4wMi4wOC0xLjUzLjA5YTEuMzggMS4zOCAwIDEgMS0uMDItMi43N2MuNDIgMCAuODQtLjAzIDEuMjUtLjA3Ljc2LS4wOSAxLjQ0LjQ2IDEuNTMgMS4yMlpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02Ni42NiA2OS45Yy41Ny41Mi42IDEuNC4wOSAxLjk2bC0uNzMuOC0uMDIuMDItLjE2LjE4LS4wOC4wOWExLjM4IDEuMzggMCAwIDEtMi4wNS0xLjg2bC4yNS0uMjguNzUtLjgyYy41MS0uNTYgMS4zOS0uNiAxLjk1LS4wOVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02MS42IDc1LjI4Yy40NS42MS4zMSAxLjQ4LS4zIDEuOTMtLjQ0LjMxLS44OC42MS0xLjM2Ljg5YTEuMzggMS4zOCAwIDEgMS0xLjQtMi40Yy40LS4yMi43Ny0uNDYgMS4xMi0uNzJhMS4zOCAxLjM4IDAgMCAxIDEuOTQuM1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zNy42NyA3NS45N2MuNDIuMTkuODYuMzcgMS4zNS41M2ExLjM4IDEuMzggMCAwIDEtLjg5IDIuNjJjLS41Ni0uMTktMS4xLS40LTEuNi0uNjNsLjcyLTIuNjNjLjE0LjAxLjI4LjA1LjQyLjExWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTU1LjA1IDc4LjU3Yy4xMi43NS0uNCAxLjQ2LTEuMTUgMS41OC0uNS4wOC0xIC4xNS0xLjU0LjJhMS4zOCAxLjM4IDAgMSAxLS4yOC0yLjc1Yy40OS0uMDUuOTUtLjExIDEuMzktLjE4Ljc1LS4xMiAxLjQ2LjQgMS41OCAxLjE1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQzLjQgNzguODdjLjA2LS43Ni43My0xLjMzIDEuNDktMS4yN2EzOC40MyAzOC40MyAwIDAgMCAxLjUuMSAxLjM4IDEuMzggMCAxIDEtLjEyIDIuNzYgNjIuOTQgNjIuOTQgMCAwIDEtMS42LS4xIDEuMzggMS4zOCAwIDAgMS0xLjI3LTEuNDlaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgY2xpcFBhdGg6IFwidXJsKCNjbGlwX2ZhaWx1cmVfOTZfMzlfNjUpXCJcbiAgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTMwLjkgNDYuODdhMTMuNDUgMTMuNDUgMCAwIDEgOS4zNy0xNi41MyAxMy40NiAxMy40NiAwIDAgMSAxNi41MiA5LjM5YzIuNjQgOS41Ni00Ljc2IDI5LjI3LTUuMTQgMjkuOWEuNzUuNzUgMCAwIDEtLjk5LjI3Yy0uNjQtLjM0LTE3LjExLTEzLjQ3LTE5Ljc2LTIzLjAzWm0xNC4zNiAxLjU0YTYuMSA2LjEgMCAwIDEtMy4yNS0xMS43NSA2LjEgNi4xIDAgMCAxIDMuMjUgMTEuNzVaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSkpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwMi4zMSAxMDAuNjljLTIuOCAxLjU1LTUuNjMgMi44NS05LjM2IDQuNThsMS40OCAzLjkyYzIuMTQtLjk2IDYuMTYtNi4wMyA3Ljg4LTguNVpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEyMSA2My4wNGM4Ljg1IDIuMSAxMi40My02LjUgMTMuMTItOC43Ny42OC0yLjI3LTUuNi0xMS44Ni04LTExLjJsLS40Mi4xMi0uMjMuMDZjLTMuMS44Mi0xMS4xNSAyLjk0LTEyLjM1IDgtMS4zIDUuNDYgMi40IDEwLjQ5IDcuODggMTEuNzlaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTM0LjUgNjQuNzNjLS40My40Ny0xLjIuNzQtMi4zMy43M2ExMi43IDEyLjcgMCAwIDEtNC4wNi0uODYgMzEuMjUgMzEuMjUgMCAwIDEtOS45NC02LjIyYy0zLjI1LTIuOTctNS45Ny01LjgtNy41OS04LjQyLTEuNjEtMi42MS0yLjA1LTQuODgtLjk4LTYuODRhMy43IDMuNyAwIDAgMSAyLjExLTEuODYgNC41MyA0LjUzIDAgMCAxIDIuOS4xNWMyLjE2Ljc2IDQuNTcgMi44MyA2LjQ4IDYuMDIgMy40IDUuNjMgNi44OSA4LjIzIDkuNyAxMC4zMy40OS4zNS45NS43IDEuMzggMS4wM2E3LjI5IDcuMjkgMCAwIDEgMi42MSAzLjQ4Yy4zNCAxLjEuMTYgMS45Ny0uMjggMi40NlpcIixcbiAgICBmaWxsOiBcIndoaXRlXCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtYXNrXCIsIHtcbiAgICBpZDogXCJtYXNrX2ZhaWx1cmVfMTMwXzUyNlwiLFxuICAgIFwibWFzay10eXBlXCI6IFwiYWxwaGFcIixcbiAgICBtYXNrVW5pdHM6IFwidXNlclNwYWNlT25Vc2VcIixcbiAgICB4OiA5OCxcbiAgICB5OiA0NCxcbiAgICB3aWR0aDogMzYsXG4gICAgaGVpZ2h0OiAyN1xuICB9LCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEzMC41MyA2Mi4xYy0uNS0zLjMtOS41Mi0xNC43NS0xNi4wOC0xNS4wM2wtMTIuNjggNC41MiA2LjQ3IDE0LjE2IDE3LjI1IDMuMDdjMS44NC0xLjE0IDUuNDMtNC4wNyA1LjA0LTYuNzJaXCIsXG4gICAgZmlsbDogXCIjQzRDNEM0XCJcbiAgfSkpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIG1hc2s6IFwidXJsKCNtYXNrX2ZhaWx1cmVfMTMwXzUyNilcIlxuICB9LCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEyNy4yIDYzLjYyYTkuNzQgOS43NCAwIDAgMS0xMy43Ni41IDkuNzQgOS43NCAwIDAgMS0uMzItMTMuNzcgOS43NCA5Ljc0IDAgMCAxIDEzLjc3LS41IDkuNzQgOS43NCAwIDAgMSAuMzIgMTMuNzdaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIm0xMTYuNzkgNDcuMzUtLjAyLjM3YzIuODYuNSA4LjU3IDIuNTkgOC41OCA2Ljg3IDAgNS4zNi03LjQ0IDkuMzQtMTQuNDcgMy40Ni0uMzQtLjI4LS42Ni0uNTMtLjk1LS43NGExMC4wOSAxMC4wOSAwIDAgMCAzLjE3IDcuMTcgMTAuMjQgMTAuMjQgMCAwIDAgMTQuNDctLjUyIDEwLjI0IDEwLjI0IDAgMCAwLS4zNC0xNC40NyAxMC4xNiAxMC4xNiAwIDAgMC0xMC40NC0yLjE0WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExOS4zNCA1NWEuNzkuNzkgMCAxIDAtMS4xLTEuMTIuNzkuNzkgMCAwIDAgMS4xIDEuMTJaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMTkuOTggNTAuNzJjLjIxLS4wOS40NS4wMS41NC4yMmE3Ljg3IDcuODcgMCAwIDAgMS44NCAyLjY1LjQxLjQxIDAgMSAxLS41NS42MiA4LjY3IDguNjcgMCAwIDEtMi4wNS0yLjk1LjQxLjQxIDAgMCAxIC4yMi0uNTRaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTE0Ljg1IDUyLjRhLjc5Ljc5IDAgMSAwLTEuMS0xLjEuNzkuNzkgMCAwIDAgMS4xIDEuMVpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtYXNrXCIsIHtcbiAgICBpZDogXCJwYXRoLTE4LWluc2lkZS0xXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgcng6IDIuOTc4MTgsXG4gICAgcnk6IDIuOTc4MTgsXG4gICAgdHJhbnNmb3JtOiBcIm1hdHJpeCgwLjcyNzY5NiAwLjY4NTkgLTAuNjg1OTAzIDAuNzI3NjkzIDEyOC40MzUgNjAuMDUwOClcIlxuICB9KSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgcng6IDIuOTc4MTgsXG4gICAgcnk6IDIuOTc4MTgsXG4gICAgdHJhbnNmb3JtOiBcIm1hdHJpeCgwLjcyNzY5NiAwLjY4NTkgLTAuNjg1OTAzIDAuNzI3NjkzIDEyOC40MzUgNjAuMDUwOClcIixcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJtMTI4LjQyIDYwLjA0LjAxLS4wMWEuMDMuMDMgMCAwIDEgLjAyIDBsLTQuMTIgNC4zN2E1Ljk4IDUuOTggMCAwIDAgOC40NS0uMjVsLTQuMzYtNC4xMVptLjAzIDB2LjAybC00LjM3LTQuMTFhNS45OCA1Ljk4IDAgMCAwIC4yNSA4LjQ1bDQuMTItNC4zN1ptMCAuMDNoLS4wMWEuMDMuMDMgMCAwIDEtLjAyIDBsNC4xMi00LjM3YTUuOTggNS45OCAwIDAgMC04LjQ2LjI1bDQuMzcgNC4xMlptLS4wMyAwdi0uMDNsNC4zNyA0LjExYTUuOTggNS45OCAwIDAgMC0uMjUtOC40NWwtNC4xMiA0LjM3WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiLFxuICAgIG1hc2s6IFwidXJsKCNwYXRoLTE4LWluc2lkZS0xKVwiXG4gIH0pKSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDUuNjMgNDAuMTljMS4zNy0yLjc1IDEyLjc1IDIuMzUgMTYuMTQgNi43OCAzLjM4IDQuNDMgMS40OCAxMC43NC0xLjkgOS42OC02LjY5LTIuMTItNy41Ni02LjctNy45NC05LjQ4LTEuMi0xLjg1LTcuNjctNC4yNC02LjMtNi45OFpcIixcbiAgICBmaWxsOiBcIndoaXRlXCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0xNTguOTUgNDEuNTYgNi42NCAyLjUyIDEuNjYgMTIuNDctOC4zIDEuOTgtMy40Ny0xMi4wMyAzLjQ3LTQuOTRaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE2Ny4zIDE1MS45NGM1LjE5IDEuNjYgMjMuMzUgMzUuNTcgMTkuMDUgMzUuNTctMTMuODYgMC0zNC41LjUzLTcxLjQyLjUzLTE1LjYzIDAtMTcuOS01LjE2LTExLjc5LTIyLjA4YTM1My4yMyAzNTMuMjMgMCAwIDEgNi4xNC0xNS43NmwzMi41IDEuMjZjLS40MyAxLjUzLS45MSAzLjA3LTEuMzggNC40YTI2LjgyIDI2LjgyIDAgMCAxIDguNzMtMS40N2M1LjI3IDAgNy4wNCAxLjQgMTEuNzcgMCAyLjEzLS42MiA0LjgtMi45NyA2LjQtMi40NVpcIixcbiAgICBmaWxsOiBcIndoaXRlXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0MC40IDE1NS44N2MuNDctMS4zNC45NS0yLjg4IDEuMzgtNC40bC0zMi41LTEuMjdhMzUzLjIzIDM1My4yMyAwIDAgMC02LjE0IDE1Ljc2Yy02LjEgMTYuOTItMy44NCAyMi4wOCAxMS43OSAyMi4wOCAzNi45MyAwIDU3LjU2LS41MyA3MS40Mi0uNTMgNC4zIDAtMTMuODYtMzMuOTEtMTkuMDYtMzUuNTctMS42LS41Mi00LjI2IDEuODMtNi40IDIuNDUtNC43MiAxLjQtNi41IDAtMTEuNzYgMC0zLjA4IDAtNi4wNi41NS04LjcyIDEuNDhabTAgMGEyNi42NyAyNi42NyAwIDAgMS00LjQ0IDguMzhjLTEuNyAyLjIyLTMuOTkgNC40My01LjQzIDQuMzMtMS40NC0uMS0xLjQyLTMuMTggMC01LjY2IDEuOTctMy40NCA2LjQ1LTUuODcgOS44OC03LjA1WlwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0OS4yNSAxMzEuN3MzLjM2IDE5LjQ2LTEyLjM0IDIxLjA0Yy0xMS41MyAxLjE1LTQwLjc3LTQuNTUtNTMuNzYtNy43OSA0LjcyIDEyLjgyIDkuNjEgMzkuODYgNyA0Mi4xNi0zLjMzIDIuOTMtNDcuNTUgMS43Ni01NS45NiAwLTguNDItMS43NSAxMy44Mi0xMS40NiAxNS40NS0xNC42NiAyLjk5LTUuODQtNS40OC0yMS4xOC01Ljc1LTQ1LjQ1LS4yNy0yNC4yNyAxOC4xOC0yNC44NiAzNC40Ny0yMS42NCAxMy4wMiAyLjU3IDQxLjYzIDE4LjMzIDUyLjU2IDI2Ljg2bDE4LjMzLS41MlpcIixcbiAgICBmaWxsOiBcIndoaXRlXCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDEuNSAxNTMuODdjLTMuMTEgMi41NS0yNy43MiA1LTM1LjU4IDMuNTNsMi43NS02LjhjMjAuMjMgMi44NSAyOC4wOCAzLjM0IDMzLjQ2IDEuMTZsLS42MyAyLjExWlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiLFxuICAgIGNsYXNzTmFtZTogXCJfX3dlYi1pbnNwZWN0b3ItaGlkZS1zaG9ydGN1dF9fXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQxLjUgMTUzLjg3Yy0zLjExIDIuNTUtMjcuNzIgNS0zNS41OCAzLjUzbDIuNzUtNi44YzIwLjIzIDIuODUgMjguMDggMy4zNCAzMy40NiAxLjE2bC0uNjMgMi4xMVpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjYuMDIgMTQyLjdjLTMuMS0yLjk5LTQuOTktNy41LTQuMTYtMTIuMzVcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTMwLjYgOTUuNjVjLTkuMDMtMTAuOTgtMTguOTctMTkuNzQtMjUuNS0yNC41NmwxLjYzLTIuMjJjNi43IDQuOTUgMTYuODEgMTMuODYgMjYgMjUuMDIgOS4xOCAxMS4xNiAxNy41NCAyNC42NyAyMC41OSAzOC44M2wtMi43LjU5Yy0yLjkxLTEzLjU2LTEwLjk3LTI2LjY3LTIwLjAyLTM3LjY2WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTE0OS4xMiAxMDcuMDktMTYuMzYgMTMuMiAyMi4yNyAxNy44IDguODctMTkuMTljLS4xNC0zLjkzLTIuMzQtNS4zNC01LjgzLTQuNjZsLTMuMTItMi41Yy4wOC0zLjUtMi4xOC01LjY0LTUuODMtNC42NVpcIixcbiAgICBmaWxsOiBcIiNFNkU4RUFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0xNDguMjQgMTI4LjYyIDkuNDUtMTQuMzQtMi45MS0yLjMzLTEwLjk0IDEzLjA3IDQuNCAzLjZaXCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTE0My42NyAxMjcuOThhNi45MyA2LjkzIDAgMSAxLTEwLjgyLTguNjUgNi45MyA2LjkzIDAgMCAxIDEwLjgyIDguNjVabTEyLjI4IDkuODJhNi45MyA2LjkzIDAgMSAxLTEwLjgyLTguNjYgNi45MyA2LjkzIDAgMCAxIDEwLjgyIDguNjZaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIm0xMzMuNDMgMTIzLjQ2IDkuMjEtMS44LjMyIDEuNjEtOS4yIDEuODEtLjMzLTEuNjJaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTQ1LjUgMTMzLjExIDkuMjEtMS44LjMyIDEuNjItOS4yIDEuOC0uMzMtMS42MlpcIixcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIsIHtcbiAgICBpZDogXCJjbGlwX2ZhaWx1cmVfOTZfMzlfNjVcIlxuICB9LCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHdpZHRoOiA0NC40MDA0LFxuICAgIGhlaWdodDogNDQuNDYyNyxcbiAgICB0cmFuc2Zvcm06IFwibWF0cml4KDAuOTYzOTY1IC0wLjI2NjAyOCAwLjI2NjE5OCAwLjk2MzkxOCAxOC40MjE0IDM0LjYyMjEpXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pKSkpO1xufVxudmFyIElsbHVzdHJhdGlvbkZhaWx1cmVfZGVmYXVsdCA9IFN2Z0NvbXBvbmVudDtcbmV4cG9ydCB7XG4gIElsbHVzdHJhdGlvbkZhaWx1cmVfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwgInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX3NwcmVhZFZhbHVlcyh7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB2aWV3Qm94OiBcIjAgMCAyMDAgMjAwXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk05My42MiAyMS4xNWMtNy41NCAwLTE0LjcgMS42NS0yMS4xMiA0LjYxYTM3LjgzIDM3LjgzIDAgMCAwLTU1Ljk0IDQ4LjMgNDEuOTQgNDEuOTQgMCAwIDAgMjguMzggNzIuODFoLjE5YTY3LjUzIDY3LjUzIDAgMCAwIDExNC42MyAyNC42OWwxLjQyLjAyYTM2LjE4IDM2LjE4IDAgMCAwIDE2LjItNjguNTQgMzQuMTMgMzQuMTMgMCAwIDAtMzYuNDctNDkuMjYgNTAuNiA1MC42IDAgMCAwLTQ3LjI5LTMyLjYzWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIGZpbGxPcGFjaXR5OiAwLjJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzIgMzMuNzJjMy4yLTggNy44My0xMi4xNyAxMC41LTE0IDEuMzItMSAxNC0xMS41IDQxLTEzLjUgMjcuNDMtMi4wMyAzMS41IDEwLjUgMzIuNSAxOHMtMTAuNSAyMS41LTE0IDIzLjVjMy41IDMgMjMgMjQgMjggMzAuNXMzNy41IDI5IDM4IDMzLjVjMy0yIDQtMSA1IDIgLjUtMyA0LjUtMy41IDUgMCA1LTUuNSA1LTIgNiAwIDMtMy41IDYuNSAyIDMgN3MtMyAxMS41LTMgMTVjMCAxLjE2LS4xIDMuNC0uNTMgNS45My0yLjA2LTEuNDQtNy43Ny0yLjEzLTEwLjQ3IDMuODMtNC4wOS0xLjg1LTcuNi0uMjYtMTAgNC4yNC0xLS42Ny0zLjctMy4xLTYuNS03LjUtMy41LTUuNS0xNy0yMy0yOS41LTM1cy0xOS41LTE2LTE3LTkuNSAyNSAzNCAyNyAzNi41YzItMS4yIDMuMTcuNSAzLjUgMS41LjUtMi4zMyAyLjMtNi40IDUuNS00IDMuMiAyLjQgMSA3LS41IDktLjE3IDIuODMtLjQgOSAwIDExIC4xNi43OS42NiAyLjAzIDEuMTQgMy40OGE5LjU0IDkuNTQgMCAwIDAtMS4xNCAyLjljLTEuNzItLjYxLTUuMy0uNjYtOC44OCAxLjM3LTEuMDQtMi45Ny0zLjg2LTUuNTktOC41LTUuODItNC42NSAwLTcuMiAyLjY3LTguOCA1LjQ4LS42OC0xLjY0LTMuMS0zLjAyLTQuNjUtMy4zNyAyLjU5LTguOC0xLjUtMTMuNDktMi44NS0xNC45Mi0uOC0uODMtNS40Ny01LjEyLTEwLjc4LTUuMTItNC4xMy01Ljg0LTkuNTItMTMuMTgtMTIuNTQtMTYuNS00LTQuNC0xNC0yMS44My0xOC41LTMwLS41LjY3LTEuNiAyLjUtMiA0LjUtLjIgMS0xLjAzIDMuNC0zLjA0IDUuOTEtMy4wOCAzLjgzLTE2LjQ5LTIuMTMtMjcuMDUtMi40My0xMC4yNC0uMy03Ljk3LTIuNjgtMTMuNDYtLjY3LTIuOTMtNC40OC00LjYyLTEwLjEtNS40NS0xNi4zMS0yLTE1IDEyLTI3IDE1LTMwLS40LTItLjE3LTUuMTcgMC02LjUtLjY3IDEuMzMtMi4yIDQtMyA0LTEgMC0zLTQgMS0xNFpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00Ni42MiA3MC4zNUMzNi44IDU5LjQzIDI3LjY3IDYwLjA0IDI0LjM0IDYxLjdjMi43My02LjgyIDIwLjkyLTIwLjQ3IDI3LjI5LTIyLjI5IDUuMTItMS40NiAxMy42NC00LjEgMTYuMzctNy4yOCAyLjczLTMuMTggMTEuODMtOS4xIDE5LjU2LTEyLjI4IDEwLTIuNzIgMTguNjUuNDYgMjYuODMgMTAuOTItNC41NSAxMS44My0xMCAxNS0xMi4yOCAxNy4yOCAyLjczIDEuMzcgMTEuODMgMTAuNDYgMjAuOTIgMjIuMjktMzEuMzgtNC4xLTQ3LjMgMzEuODQtNDguMiAyOC42NS0uOTItMy4xOC01LTcuNzMtNS0xMCAwLTIuMjggMy4xNy01LjkyIDcuNzItMTEuMzcgNC41NS01LjQ2IDExLjgzLTcuMjggMTQuMS04LjE5IDIuMjgtLjkxIDQuMS0xLjM2IDQuNTUtMy4xOC4zNi0xLjQ2LTEuNTItMi4xMy0yLjczLTIuMjggMS4wNi0uMTUgMy4xOS0xIDMuMTktMy4xOCAwLTIuMTMtMi40Ni0xLjU1LTMuNTYtMS4zOGE5Ljk3IDkuOTcgMCAwIDAgMCAwYy41OC0uMTUgMi40LTEuNjYgMS43NC0zLjYzLS40Ni0xLjM2LTIuNDMtMS41MS0zLjY0LTEuMzYuNzYtLjMgMS43My0xLjkxIDEuMzYtNC4xLS4zNi0yLjE4LTMuOTQtMi41Ny01LjkxLTIuMjcgMS42Ny0xLjA2IDMuNzMtMy40NS40NS00LjU1LTQuMDktMS4zNi0xNS4xIDIuNDItMjUuMDEgMTAuMDEtNy43MyA1LjkxLTExLjIyIDExLjk4LTExLjgzIDE1LjAxLS42LS40NS0yLjE4LS43My0zLjY0IDEuODJaXCIsXG4gICAgZmlsbDogXCIjODg4RDkyXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTEzIDE1LjIySDUzLjVsLTcuNSAyLjUtNCAzIDI5LjUgNS41IDE2LjUtNi41czkuNS0yLjUgMTcgMi41IDkuNSA4LjUgOS41IDguNWwxLjUtNi0zLTkuNVpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03Ny40IDI0Ljg1Yy00LjE2IDIuMzMtOC40MiA1LjM5LTEwLjk0IDkuMjQtMy45OC42My05LjMzIDIuMzgtMTUuMDUgNS4xNS0yLjg4IDUuNC0zLjc3IDExLjg4LTUuMzQgMTEuMjUtLjctLjI3LS44Ni0xLjgtLjc4LTMuNTMtMS4wNCA0LjYtMi41NSA4LjI1LTMuNTUgNS4yNi0uNS0xLjUyLS4xNS00LjcuMzctNy42OGwtLjE3LjEyYy0uOTggNi4xNi0xLjcgMTMuMDgtMy42NiA3LjU2YTEyLjg5IDEyLjg5IDAgMCAxLS42Mi00LjUxbC0xLjEuODZjLS42IDIuODYtMS4yMiA0LjM5LTIuMTcgMS45MmE2LjU1IDYuNTUgMCAwIDEtLjA0LS4wOSA1Ny44OCA1Ny44OCAwIDAgMC0xMC40NyAxMS43NWMtMTAuODEgMTYuNC0yLjA0IDM3Ljc2IDEwLjUgNDIuOTUgMTIuNTUgNS4xOCAyOS44NiAxLjUyIDMzLjc1LTExLjQzYTQzLjQgNDMuNCAwIDAgMSAxLjY4LTQuNjFjNC4zNC0xMC4xIDExLjYzLTE1Ljk1IDE2LjkyLTE3Ljg0IDYuMDYtMi4xNiAxMi4xMi00LjMyIDguMjItNi40OGE0LjYzIDQuNjMgMCAwIDAtMS45LS41NGMtMS4yNS42LTIuNzggMS4zLTQuNTkgMi4yNy01LjYyIDMuMDItNy4zNSAyLjU5LTYuMDUgMS43MyAxLjEtLjc0IDYuNjItNC4zIDEwLjYzLTQgMi42My0xLjI1IDMuOTQtMi4wMiAzLjY0LTMuNzgtLjE2LS45Ni0xLjY1LTEuMzMtMy42My0xLjI3LTEuNyAxLjIzLTQuMTUgMi4yNi01Ljg4IDMtMy4wMyAxLjMtNy44IDIuNi00LjMzIDAgMi4xNy0xLjYyIDYuODgtMi45IDEwLjItMyAxLjI2LS45MSAyLjEtMS45NCAxLjkxLTMuMDQtLjIxLTEuMjktMS42LTIuMDQtMy41OC0yLjIxLTEuOTQgMi4wMy01LjU2IDMuNzUtOC45NiA0LjM3LTQuNzYuODYtMy40Ni0uODcgMS43My0zLjAzYTE2LjEyIDE2LjEyIDAgMCAxIDcuMjMtMS4zNCA0LjggNC44IDAgMCAwIDEuNDItMi41NGMuMzItMi4yNi0yLjAxLTMuNTYtNi4yOS0zLjE2YTMxLjk1IDMxLjk1IDAgMCAxLTcuNTUgNC44OGMtMy45IDEuNzMtNC43Ni0xLjcyIDIuNi0zLjg4IDEuODUtLjU1IDMuNTEtLjg3IDQuOTUtMSAxLjU3LTEuNDMgMi41Mi0yLjgzIDEuOTYtMy43NS0xLjMtMi4xNi01LjEyLTEuNTMtMTIuOTEgMS41LTcuMiAyLjc5LTE5LjYgOS4xMS0yNS4xOCAyMi4wMWEzMy42NyAzMy42NyAwIDAgMC0xLjIxIDMuMjZjLTQuNzYgMTUuMTEtOS4xNSAxMC4zNi03LjQyIDUuMTggMS4yMy0zLjY2IDQuNjEtNi42OCA4LjYzLTguNDQgNS41OC0xMi45IDE3Ljk3LTE5LjIyIDI1LjE4LTIyLjAyIDcuNzktMy4wMiAxMS42Mi0zLjY1IDEyLjkxLTEuNS41Ni45My0uMzkgMi4zMy0xLjk2IDMuNzYgNC4yOC0uNCA2LjYxLjkgNi4yOSAzLjE2YTQuOCA0LjggMCAwIDEtMS40MiAyLjU0YzEuOTguMTcgMy4zNy45MiAzLjU4IDIuMi4xOSAxLjExLS42NSAyLjE0LTEuOSAzLjA1IDEuOTgtLjA2IDMuNDcuMyAzLjYzIDEuMjcuMyAxLjc2LTEgMi41My0zLjY0IDMuNzguNy4wNiAxLjM0LjIzIDEuOTEuNTQgMy45IDIuMTYtMi4xNiA0LjMyLTguMjIgNi40OC01LjMgMS44OS0xMi41OCA3Ljc0LTE2LjkyIDE3Ljg0YTQxLjc3IDQxLjc3IDAgMCAwLTEuNjggNC42MWMtMy45IDEyLjk1LTIxLjIgMTYuNi0zMy43NCAxMS40Mi0xMi41NS01LjE4LTIxLjMyLTI2LjUzLTEwLjUtNDIuOTRBNTcuODggNTcuODggMCAwIDEgMzQuMzQgNTAuNGMuNzMtLjYzIDEuNDctMS4yNCAyLjIyLTEuODMuNzgtMy42NiAxLjU1LTkuNDcgMy0xMS45IDIuMTItMy41LTEuNzggNC4xMi0xLjkxIDExLjA0IDEuNC0xLjA4IDIuODMtMi4xIDQuMjgtMy4wNS4zMi0yLjA0LjY3LTQgMS4xLTUuNCAxLjA1LTMuNC0uMTMuNjgtLjkzIDUuMjhhODAuOTggODAuOTggMCAwIDEgMy44LTIuMzZjLjI0LTEuMTguNDItMS41Ny4yNS0uMTVhODEuMjEgODEuMjEgMCAwIDEgNS4yNS0yLjc5IDE1LjAyIDE1LjAyIDAgMCAxIDQuMTgtNS4xNSA1NC44OSA1NC44OSAwIDAgMSAyMS44LTkuMjRaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQwLjggMTM4LjU3Yy0uMDItLjUxLS4wMi0xIDAtMS40NS0uMzYtMi4wMi0xLjg2LTQuNTUtMy44OS0yLjg2LS42Ni41NS0xLjEgMS4zLTEuMzggMi4xMy4yNi40LjQ0Ljg0LjUyIDEuMzIuNDMgMi42IDAgNC43NS0uNDMgNC4zMi0uMzMtLjMyLS44OC0zLjI3LS4wOS01LjY1LTEuMTItMS43Ni0zLjYxLTIuNTktNC42Ny0uODMtLjQxLjY4LS42OSAxLjYxLS44NCAyLjYzLjI3LjIuNTYuNDcuODQuODMgMS43MyAyLjE2IDEuMyA2LjkgMCA1LjE4LS45LTEuMTktMS4xNy0zLjgtLjg0LTYuMDEtMS40Mi0xLjA1LTIuNy0uMzMtMy4wNi40LS4yNC40OC0uOSAxLjc4LTEuMDMgMy40NSAyLjA4IDIuMTEgMi42NyA2LjkzIDEuMDMgNC4zMmE2Ljg3IDYuODcgMCAwIDEtMS4wMy00LjMyYy4xNC0xLjY2LjgtMi45NyAxLjAzLTMuNDYuMzctLjcyIDEuNjQtMS40NCAzLjA2LS4zOS4xNS0xLjAyLjQzLTEuOTUuODQtMi42MyAxLjA2LTEuNzYgMy41NS0uOTMgNC42Ny44My4yOC0uODIuNzItMS41NyAxLjM4LTIuMTIgMi4wMy0xLjcgMy41My44NCAzLjg5IDIuODYuMS41Ni4xIDEuMDggMCAxLjQ1WlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTA0LjUgOC42NGM4LjA5IDMuMzUgMTIuMTUgOS4yMiAxMi4xNSAxNS41MiAwIDQuOTgtMi4zNyAxMC4wNS01LjI4IDE0LjMyYTUxLjY1IDUxLjY1IDAgMCAxLTguNCA5LjVjNi4xOCA1LjY4IDEyLjU1IDEyLjE2IDE3LjA0IDE4LjIgNS41OSA3LjUgMTUuMTcgMTYuMSAyNC42NCAyNC4wOSAyLjggMi4zNyA1LjYgNC42OSA4LjI5IDYuOSA2LjMyIDUuMjQgMTEuOTcgOS45MiAxNS40NyAxMy40MmwtLjcuN2MtMy40Ny0zLjQ2LTkuMDYtOC4wOS0xNS4zNi0xMy4zLTIuNy0yLjIzLTUuNTEtNC41Ni04LjM1LTYuOTYtOS40Ni03Ljk4LTE5LjEzLTE2LjY1LTI0LjgtMjQuMjYtOC45NS0xMi4wMy0yNS41Ny0yNS45Ni0zMi43Ny0zMS40MmwuNi0uOGMzLjUgMi42NSA5LjIxIDcuMyAxNS4yIDEyLjc2YTUwLjU1IDUwLjU1IDAgMCAwIDguMzEtOS40YzIuODctNC4yIDUuMTEtOS4wNyA1LjExLTEzLjc1IDAtNS44LTMuNzMtMTEuMzctMTEuNTMtMTQuNkM5Ni4zIDYuMzIgODQuNCA1LjQ0IDY4LjI0IDkuMSA1Mi4xIDEyLjc1IDQzLjAxIDE4Ljk3IDM3LjggMjUuMThjLTUuMjIgNi4yMS02LjYgMTIuNDgtNy4yNSAxNi4zMy0uMzEgMS45LS4zIDMuMzgtLjExIDQuMzYuMS41LjIzLjgzLjM3IDEuMDMuMTQuMi4yNS4yMy4zLjIzLjA3IDAgLjIzLS4wMi40Ni0uMjQuMjQtLjIyLjUtLjU5Ljc4LTEuMTRhMTkuNCAxOS40IDAgMCAwIDEuNTQtNS4yN2MuNy0zLjk4IDEuMi02LjIgMS41Ny03LjM2LjA5LS4zLjE3LS41My4yNS0uNy4wNy0uMTguMTUtLjM0LjI1LS40NmEuNy43IDAgMCAxIC4yNS0uMi41Ni41NiAwIDAgMSAuNDguMDEuNi42IDAgMCAxIC4yNy4yNmMuMDQuMDcuMDYuMTUuMDguMmwuMDMuMTUtLjA1LjE0Yy0uNyAyLjA1LTEuNjYgNS40LTIuMjQgOC44LS4yOCAxLjctLjQ3IDMuNC0uNDkgNC45NCAwIDEuMjMuMDkgMi4zNC4zMiAzLjI3LjUtLjQyIDEtLjg0IDEuNS0xLjI0LjE4LS44Mi4zNS0xLjc1LjUzLTIuNzJsLjAzLS4xNWMuMi0xLjEuNDItMi4yNS42Ni0zLjM2LjQ3LTIuMiAxLjA0LTQuMzUgMS44Mi01LjY0LjI2LS40My40NS0uNzMuNTctLjg4YS44LjggMCAwIDEgLjE2LS4xNS41NC41NCAwIDAgMSAuMjYtLjEuNTEuNTEgMCAwIDEgLjU2LjQ2di4xM2wtLjAyLjE3YTExLjYgMTEuNiAwIDAgMS0uMzcgMS4yMWwtLjM3IDEuMTdhMzcuOCAzNy44IDAgMCAwLTEuNzMgOC4yNGMxLjA4LS44IDIuMTctMS41NyAzLjI3LTIuMzFhNDEuNzUgNDEuNzUgMCAwIDEgMS4zOC02LjE5IDguNTUgOC41NSAwIDAgMSAuMTQtLjM5cy4wMy0uMDcuMS0uMTJhLjUuNSAwIDAgMSAuNi0uMDkuNS41IDAgMCAxIC4yNS40NHYuMTJsLS4wNC4yLS4xNi42OC0uMDIuMTNjLS4yMy45OC0uNTkgMi41OC0uOTMgNC4zNS44OS0uNTYgMS43Ny0xLjEgMi42Ni0xLjYzYTExLjQgMTEuNCAwIDAgMSAuMjUtLjkuNjguNjggMCAwIDEgLjEtLjE1LjUxLjUxIDAgMCAxIC45LjJsLjAxLjEzYzEuNDUtLjgyIDIuOS0xLjU4IDQuMzItMi4yNyAxLjA4LTIgMi40NS0zLjg3IDQuMjUtNS4xOWE1NS40IDU1LjQgMCAwIDEgMjEuOTMtOS4zIDkxLjkzIDkxLjkzIDAgMCAxIDguODEtNC4yMWMuNzItLjMxIDEuMzMtLjU3IDEuOC0uNzlsLjQxLjkxYy0uNS4yMy0xLjEyLjUtMS44Ni44MS0xLjY1LjcxLTMuODMgMS42NS02LjIgMi44NGE0Mi40IDQyLjQgMCAwIDEgNC44Mi0uMjh2MWMtMi41IDAtNSAuMjQtNy40NC42Ny00LjEgMi4zLTguMjQgNS4zLTEwLjY4IDkuMDNsLS4xMi4xOS0uMjIuMDNjLTMuODguNjItOS4xMyAyLjMzLTE0Ljc3IDUuMDQtMS4xNyAyLjI0LTIgNC42Ni0yLjcgNi42OGwtLjM1IDFjLS4zOCAxLjEtLjc1IDIuMDYtMS4xMiAyLjcxLS4yLjMyLS40MS42Mi0uNjguODEtLjMuMjEtLjY2LjI5LTEuMDQuMTRhMS4zNiAxLjM2IDAgMCAxLS42OC0uNjYgMi41NCAyLjU0IDAgMCAxLS4xNy0uNGMtLjM0IDEuMTQtLjcxIDIuMTEtMS4xIDIuNzgtLjE2LjMtLjM1LjU3LS41NS43Ni0uMi4yLS40OC4zNy0uODIuMzctLjM1LS4wMS0uNjItLjIyLS44Mi0uNDZhMy4yNiAzLjI2IDAgMCAxLS41Ni0xLjI2Yy0uMDcuMzItLjE1LjYtLjIzLjg3LS4xNC40Ny0uMy44OC0uNSAxLjE4LS4xNy4yOC0uNDguNjMtLjk2LjU5LS40My0uMDQtLjc0LS4zOS0uOTUtLjczYTguMTYgOC4xNiAwIDAgMS0uNzMtMS42MSAxMi40IDEyLjQgMCAwIDEtLjY0LTMuNjZsLS4xNS4xMmEyMC45IDIwLjkgMCAwIDEtLjQ0IDEuNzJjLS4xNi41MS0uMzUuOTctLjU5IDEuMjdhMSAxIDAgMCAxLS41NS4zNy44NC44NCAwIDAgMS0uNy0uMTggMS44OCAxLjg4IDAgMCAxLS40NC0uNTQgNC4wOCA0LjA4IDAgMCAxLS4xNC0uMjUgNTYuOTQgNTYuOTQgMCAwIDAtOS44NiAxMS4xOWMtNS4zMSA4LjA2LTUuODIgMTcuMzQtMy40NSAyNS4yNmEzMS40NyAzMS40NyAwIDAgMCA0LjA1IDguNThjNC40Ny0xLjA0IDkuMDktMS4xIDEzLjU5LjcxIDkuNjYgMy45IDE5LjMgMTAuNTMgMjYuMDggMi4zMWExNi40MSAxNi40MSAwIDAgMCAzLjA4LTUuNzYgNDMuOTEgNDMuOTEgMCAwIDEgMS43LTQuNjdjNC40LTEwLjIxIDExLjc3LTE2LjE3IDE3LjIxLTE4LjExIDMuMDYtMS4wOSA2LjAyLTIuMTUgNy43NS0zLjIuNDMtLjI2Ljc2LS41IDEtLjczLjIzLS4yNC4zMy0uNDMuMzYtLjU2LjAzLS4xMi4wMS0uMjUtLjExLS40MmEyLjYgMi42IDAgMCAwLS44NS0uNjZjLS40Ni0uMjYtMS0uNC0xLjU3LS40N2wtLjU3LjI3Yy0xLjEuNTMtMi40IDEuMTQtMy44NyAxLjkzLTIuODMgMS41Mi00LjcyIDIuMi01Ljc4IDIuMzctLjI2LjA1LS41LjA2LS43LjA0LS4xNi0uMDEtLjQ3LS4wNy0uNjQtLjM1LS4yLS4zMy0uMDItLjY0LjA4LS43Ny4xMi0uMTYuMjktLjMuNDctLjQyLjU2LS4zNyAyLjI0LTEuNDcgNC4zLTIuNDMgMS45OC0uOTMgNC40LTEuNzcgNi41Mi0xLjY1YTExLjYgMTEuNiAwIDAgMCAyLjY3LTEuNTdjLjI3LS4yNC40My0uNDcuNTItLjcyLjA4LS4yNC4xMS0uNTMuMDUtLjktLjAzLS4yLS4yMi0uNDUtLjgtLjYzYTcuMSA3LjEgMCAwIDAtMi4xOC0uMjRjLTEuNjcgMS4xOC0zLjk3IDIuMTctNS42NCAyLjg4bC0uMi4xYTIyLjYgMjIuNiAwIDAgMS00LjczIDEuNDhjLS4zLjA1LS42LjA3LS44NC4wMmEuOTIuOTIgMCAwIDEtLjQtLjE2LjY3LjY3IDAgMCAxLS4yNy0uNTJjMC0uMTguMDYtLjM1LjEzLS40Ni4wNy0uMTMuMTctLjI1LjI4LS4zNy4yMy0uMjQuNTYtLjUzIDEtLjg2YTE1Ljc1IDE1Ljc1IDAgMCAxIDQuODMtMi4xNSAyNC4zIDI0LjMgMCAwIDEgNS41LS45NWMuNTUtLjQuOTgtLjgyIDEuMjUtMS4yMy4zLS40NC40LS44NC4zNC0xLjIzLS4wOC0uNDctLjM3LS44Ni0uOS0xLjE4LS40OC0uMjktMS4xNi0uNS0yLS42LTIuMDcgMi4wNi01LjY5IDMuNzMtOS4wNiA0LjM1YTguOCA4LjggMCAwIDEtMi42NC4yYy0uMjYtLjA1LS42LS4xNC0uNzgtLjQyLS4yMy0uMzUtLjEtLjcuMDQtLjkyLjE0LS4yMi4zNi0uNDMuNjMtLjY0LjI3LS4yLjYtLjQzIDEtLjY2LjgtLjQ3IDEuODgtMSAzLjItMS41NGExNi44NyAxNi44NyAwIDAgMSA3LjIyLTEuNCA0LjEzIDQuMTMgMCAwIDAgMS4xMi0yLjFjLjA3LS40NiAwLS44Ni0uMTgtMS4xOC0uMTktLjMzLS41LS42My0uOTctLjg3LS45My0uNDgtMi40Mi0uNzItNC40My0uNTVhMzIuNjUgMzIuNjUgMCAwIDEtNy41NiA0Ljg2Yy0xLjAyLjQ1LTEuOTIuNi0yLjU4LjQ2YTEuNCAxLjQgMCAwIDEtLjg2LS41MyAxLjIgMS4yIDAgMCAxLS4xNy0uOTljLjE1LS42NC43NC0xLjMxIDEuNjctMS45NC45NC0uNjMgMi4zMi0xLjI3IDQuMTktMS44MiAxLjgxLS41MyAzLjQ1LS44NiA0Ljg5LTFhOC4yNyA4LjI3IDAgMCAwIDEuNTUtMS44M2MuMzQtLjYuMzMtLjk2LjItMS4xOC0uNS0uODItMS41LTEuMjItMy41NC0uOTYtMi4wMi4yNi00Ljg4IDEuMTUtOC43NyAyLjY2LTYuOTYgMi43LTE4LjY3IDguNjctMjQuMzggMjAuNjIgMS4zNS0uNSAyLjc2LS44NiA0LjE2LTEuMDZsLjE1IDFjLTEuNjcuMjMtMy4zMy43LTQuOSAxLjM3LS40Mi45Ny0uOCAxLjk4LTEuMTIgMy4wMy0xLjIgMy44LTIuMzggNi4zOC0zLjQ3IDguMDRhOCA4IDAgMCAxLTEuNiAxLjg0Yy0uNS40Mi0xLjAyLjY1LTEuNTMuNjctMS4xLjA0LTEuNzYtLjg4LTIuMDItMS45YTYuOSA2LjkgMCAwIDEgLjI1LTMuNzhjMS4yNi0zLjc4IDQuNy02Ljg1IDguNzItOC42NiA1LjctMTIuOTcgMTguMTctMTkuMyAyNS4zOC0yMi4xIDMuOS0xLjUyIDYuODUtMi40NSA5LTIuNzIgMi4xNS0uMjggMy43MS4wOSA0LjUyIDEuNDMuNDIuNy4yMiAxLjUtLjE4IDIuMTktLjIzLjQtLjU1LjgzLS45MyAxLjI1YTguMjIgOC4yMiAwIDAgMSAzLjgyLjdjLjYuMzIgMS4wOC43NSAxLjM4IDEuMjguMy41NC40IDEuMTYuMyAxLjgyLS4xLjczLS40NCAxLjQ0LS45NCAyLjEuNjYuMTMgMS4yNS4zMyAxLjc0LjYyYTIuNjkgMi42OSAwIDAgMSAxLjM3IDEuODdjLjExLjcyLS4xIDEuMzgtLjUgMS45Ni0uMTYuMjQtLjM2LjQ4LS41OC43LjUuMDQuOTQuMTIgMS4zMy4yNS43LjIyIDEuMzUuNjUgMS40OCAxLjQxLjA4LjUuMDUuOTgtLjEgMS40MS0uMTYuNDMtLjQzLjgtLjc4IDEuMTItLjQ0LjQtMS4wMy43Ny0xLjc1IDEuMTRhNC41MSA0LjUxIDAgMCAxIDEuODIgMS4yNWMuMjcuMzcuMzcuNzguMjggMS4yLS4wOC40LS4zMy43Ni0uNjQgMS4wNy0uMy4zLS43MS42LTEuMTguODgtMS44MyAxLjEtNC44OSAyLjItNy44OCAzLjI2bC0uMDUuMDJjLTUuMTEgMS44Mi0xMi4yMyA3LjUtMTYuNTQgMTcuMzQgMS42OSAzLjEgNC41NiA4LjM0IDcuNjYgMTMuNiAzLjE3IDUuMzggNi41NSAxMC43MyA5LjEgMTMuOCA0LjEgNC45IDkuNzIgMTIuMzYgMTQuNTcgMTkuMTRsLS44MS41OGEzNTguNyAzNTguNyAwIDAgMC0xNC41My0xOS4wOWMtMi42MS0zLjEzLTYuMDMtOC41NS05LjItMTMuOTNhNDY4LjkxIDQ2OC45MSAwIDAgMS03LjI4LTEyLjkxIDQxLjg3IDQxLjg3IDAgMCAwLTEuMjYgMy42IDE3LjQgMTcuNCAwIDAgMS0zLjEgNS45MWMtNS41NyA2Ljk0LTE3LjE0LTIuMy0yNS43My0zLjY2LTcuMy0xLjE1LTEyLjcyLS4zNi0xNS43Ny42N2EzMi41MiAzMi41MiAwIDAgMS00LjExLTguNzZjLTIuNDUtOC4xNi0xLjk0LTE3Ljc2IDMuNTctMjYuMWE1OC4xNyA1OC4xNyAwIDAgMSAxMC4zLTExLjYzIDEzLjE3IDEzLjE3IDAgMCAxLS40Ny00LjE0bC0uMDYuMWMtLjMuNi0uNjMgMS4wOC0uOTggMS40LS4zNC4zMy0uNzUuNTUtMS4yLjUyYTEuNCAxLjQgMCAwIDEtMS4wNy0uNjYgMy43NiAzLjc2IDAgMCAxLS41My0xLjRjLS4yMy0xLjE0LS4yMi0yLjc1LjEtNC43My42Ni0zLjkyIDIuMDktMTAuMzkgNy40Ny0xNi44IDUuMzktNi40MiAxNC42OS0xMi43MyAzMC45OS0xNi40MiAxNi4yOC0zLjY4IDI4LjQtMi44MyAzNi40OC41MlpNNDkuNDIgNjguOTdjLTMuNDEgMS43Ni02LjE2IDQuNDUtNy4yIDcuNTlhNS45IDUuOSAwIDAgMC0uMjMgMy4yMmMuMjIuODUuNjMgMS4xNSAxIDEuMTQuMjQgMCAuNTUtLjEyLjk2LS40NC40LS4zMy44Ny0uODUgMS4zOC0xLjYyIDEuMDItMS41NSAyLjE3LTQuMDQgMy4zNS03LjguMjMtLjcuNDgtMS40Ljc0LTIuMVptMzUuNDMtMjAuMDVjLS45Ny4xOC0yLjAzLjQyLTMuMTcuNzYtMS44LjUzLTMuMDggMS4xMy0zLjkyIDEuNy0uODYuNTctMS4xOCAxLjA2LTEuMjUgMS4zMy0uMDMuMTIgMCAuMTYuMDEuMTguMDIuMDMuMDkuMS4yNi4xMy4zNy4wOCAxLjAzLjAyIDEuOTYtLjQgMS43Ni0uNzcgNC4xNy0yLjIgNi4xMS0zLjdabTUuMjcgNS40NWMtMS43MS4wNS0zLjc0LjQ4LTUuOCAxLjMzYTI2LjY2IDI2LjY2IDAgMCAwLTMuMDYgMS40OCA4LjIxIDguMjEgMCAwIDAtMS4xNC44Yy40LjA0IDEuMSAwIDIuMi0uMmExOC4zOSAxOC4zOSAwIDAgMCA3LjgtMy40MVptLjg2IDUuNDdjLTEuMS4xNi0yLjI0LjQtMy4zMy43Mi0xLjg1LjUzLTMuNSAxLjIzLTQuNTEgMi0uMy4yMi0uNTMuNC0uNy41NmguMDZjMS4wNy0uMTYgMi45Ny0uNzkgNC40Ny0xLjQzbC4xNy0uMDdjMS4xNi0uNSAyLjU2LTEuMSAzLjg0LTEuNzhabS04Ljg2IDMuNjVabTguMDcgMS41M2MtMS4xMi4yOS0yLjI3Ljc0LTMuMzQgMS4yNGEzMi45IDMyLjkgMCAwIDAtMy40NCAxLjg5YzEtLjI5IDIuNTgtLjkyIDQuODItMi4xMi42OS0uMzcgMS4zNC0uNyAxLjk2LTEuMDFabS03LjkxIDMuM2guMDEtLjAxWk0zNC45NSA1MC41NWE0LjA0IDQuMDQgMCAwIDAgLjMxLjZjLjEtLjE2LjIzLS40NS4zNi0uODhsLjEyLS4zOC0uNzkuNjZabS4yMy43Wm0yLjk4LTMuMjljLS4wMSAxLjQ2LjE2IDIuODYuNiA0LjEuMjMuNjcuNDQgMS4xMi42MiAxLjQuMDguMTMuMTQuMi4xOC4yM2E0LjA0IDQuMDQgMCAwIDAgLjQ0LTEuMDJjLjQyLTEuNC43Ny0zLjY5IDEuMTQtNi4xM2wuMTMtLjgzYTc2LjI1IDc2LjI1IDAgMCAwLTMuMTEgMi4yNVptNC40LTMuMTJhNDEuNyA0MS43IDAgMCAwLS41MiA0LjEyIDkuMDUgOS4wNSAwIDAgMCAuMTggMy4xIDIuMzMgMi4zMyAwIDAgMCAuMzcuNzQuNTMuNTMgMCAwIDAgLjEtLjA4Yy4xLS4xLjIzLS4yNy4zOC0uNTMuNTgtMS4wNCAxLjItMy4wMiAxLjcyLTUuMy4wNi0xLjI2LjIzLTIuNjIuNDItMy43MS0uODkuNTMtMS43NyAxLjA4LTIuNjUgMS42NlptMy4yMyAyLjE4Yy0uMDQuODQtLjAxIDEuNi4xIDIuMTYuMDUuMy4xMi41LjIuNjUuMDcuMTUuMTQuMTkuMTYuMi4wMiAwIC4wNC4wMS4xLS4wMy4wOS0uMDYuMjItLjIuMzgtLjQ5LjMyLS41Ni42Ni0xLjQzIDEuMDUtMi41NWwuMzQtLjk3YTU3LjggNTcuOCAwIDAgMSAyLjE4LTUuNjQgODAuOTcgODAuOTcgMCAwIDAtMy42OCAybC0uMDYuNDRjLS4yIDEuNC0uNDYgMi44NS0uNzcgNC4yM1ptLTYuMjkgNi43M1pNNTIuNjQgMzguMWM1LjEtMi4zNSA5Ljg2LTMuODcgMTMuNTMtNC40OCAyLjA1LTMuMDYgNS4xNi01LjYgOC40LTcuNjhhNTQuNTUgNTQuNTUgMCAwIDAtMTguNjkgOC41NGMtMS4yOC45My0yLjM0IDIuMi0zLjI0IDMuNjJabTkwLjg4IDkyLjc1YzEuNzUtLjY1IDMuNTcuMzQgNC4yNSAyLjM4YTcuMyA3LjMgMCAwIDEtLjI3IDQuOSAxMS40OCAxMS40OCAwIDAgMS0xLjg3IDMuMjF2Ni43MmMwIC42NS4yIDEuNjMuNDggMi45LjEuNDMuMi45LjMzIDEuMzguMjEuOS40NCAxLjg4LjY2IDIuOWwtLjk4LjIxYy0uMjEtMS0uNDQtMS45Ny0uNjUtMi44NmwtLjM0LTEuNDJjLS4yOC0xLjI0LS41LTIuMzMtLjUtMy4xdi03LjFsLjEzLS4xNWMuNTQtLjYgMS4zLTEuNzIgMS44MS0zLjA1LjUtMS4zMy43Mi0yLjgyLjI1LTQuMjMtLjUzLTEuNi0xLjgzLTIuMTctMi45Ni0xLjc2LTEuMTYuNDMtMi40MiAyLTIuNTYgNS4zLjEuNTcuMSAxLjE1IDAgMS42bC0xLS4wOWMtLjAyLS41LS4wMi0xIDAtMS40NWE1LjAzIDUuMDMgMCAwIDAtMS4xNy0yLjUgMS4zNSAxLjM1IDAgMCAwLS44NC0uNDRjLS4yNy0uMDItLjYyLjA3LTEuMDYuNDNhNCA0IDAgMCAwLTEuMTUgMS43Yy4yMi4zOS4zOC44Mi40NiAxLjI5LjIzIDEuMzQuMjMgMi41OC4xMSAzLjQ0LS4wNS40Mi0uMTQuOC0uMjggMS4wNmEuODQuODQgMCAwIDEtLjQuNC42Mi42MiAwIDAgMS0uNC4wMy42OC42OCAwIDAgMS0uMy0uMThjLS4xMy0uMTItLjItLjI5LS4yNS0uNGwtLjE1LS41MmExMC4xNSAxMC4xNSAwIDAgMSAuMTItNSAzLjQ2IDMuNDYgMCAwIDAtMS45My0xLjMzYy0uNzMtLjE3LTEuMzguMDMtMS43Ny42OC0uMzMuNTQtLjU4IDEuMy0uNzMgMi4xNi4yMy4yLjQ2LjQ0LjY5LjcyYTcgNyAwIDAgMSAxLjEyIDUuM2MtLjA3LjI3LS4xNy41NC0uMzQuNzRhLjg0Ljg0IDAgMCAxLS44NC4zYy0uMy0uMDctLjU1LS4zLS43My0uNTRhNi4yMyA2LjIzIDAgMCAxLS45Ny0yLjg2IDEzLjA4IDEzLjA4IDAgMCAxIDAtMy4yYy0uNS0uMy0uOTQtLjMyLTEuMjctLjIzLS40LjEtLjcuMzctLjguNmE5LjEgOS4xIDAgMCAwLS45NyAzLjA1IDguODggOC44OCAwIDAgMSAxLjg4IDQuMDJjLjA2LjMuMDguNi4wNy44NCAwIC4xMi0uMDIuMjUtLjA1LjM2YS43OC43OCAwIDAgMS0uMjUuMzkuNjQuNjQgMCAwIDEtLjU1LjEzLjkzLjkzIDAgMCAxLS40LS4yIDcuMzUgNy4zNSAwIDAgMS0xLjc0LTUuMTVjLS41NS0uNS0xLjE0LS43My0xLjgtLjU5LS44NS4yLTEuMy42LTEuNTUgMS4wNy0uMjUuNS0uMyAxLjE3LS4xNyAxLjkzYTguMTMgOC4xMyAwIDAgMCAxLjk3IDMuOTNsLjE0LjE1di4ybC0uMDEgMS4xOGMtLjAzIDEuMzQtLjA2IDMuMDMuMSA0LjczbC0uOTkuMWMtLjE3LTEuNzctLjE0LTMuNTUtLjExLTQuOWwuMDEtLjlhOS4yMiA5LjIyIDAgMCAxLTIuMS00LjMzIDQuMTQgNC4xNCAwIDAgMSAuMjctMi41MyAzLjA4IDMuMDggMCAwIDEgMi4yMy0xLjYgMi44IDIuOCAwIDAgMSAyLjE2LjRjLjI1LTEuMzIuNzUtMi4zMi45Ni0yLjczLjI1LS41Ljc4LS45NSAxLjQ1LTEuMTIuNTEtLjEzIDEuMDktLjEgMS42OS4xNi4xNi0uNzguNDItMS41MS43Ny0yLjEuNjYtMS4xIDEuOC0xLjM4IDIuODYtMS4xMy43Ni4xOCAxLjUyLjYyIDIuMTEgMS4yNS4yOS0uNTguNjgtMS4xIDEuMi0xLjU0LjU3LS40OCAxLjE3LS43IDEuNzYtLjY2LjYuMDQgMS4wOS4zNCAxLjQ4LjczLjI4LjI5LjUyLjYzLjczIDEgLjUtMi4yMiAxLjYyLTMuNiAyLjk1LTQuMDhaTTEyNy4zNCAxNDZjLS40OS0uOC0uNzUtMS42LS44Ny0yLjM3LjQ0LjguNzQgMS42OS44NyAyLjM3Wm0zLjA3LTYuNzVjLS4wNS43Ni0uMDMgMS41NC4wNyAyLjI2YTUuMjkgNS4yOSAwIDAgMCAuODUgMi40NmMuMDItLjA1LjA1LS4xMi4wNy0uMjJhNi4wMyA2LjAzIDAgMCAwLS45My00LjQ0bC0uMDYtLjA2Wm01LjI0LS44YTEwLjQyIDEwLjQyIDAgMCAwIC4wNiAyLjAyYy4wNC0uNTYuMDMtMS4yNi0uMDYtMi4wMlpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEyNi45NSAxMDcuMDhBMjg0LjU2IDI4NC41NiAwIDAgMSAxNTMgMTM1Ljk5YTEwMy42IDEwMy42IDAgMCAxIDIuNzMgMy43OWMuNyAxIDEuNDEgMi4wMiAyLjE0IDMuMDJhMzcuMzMgMzcuMzMgMCAwIDAgNS43MyA2LjQ4bC0uNjQuNzdhMzguMyAzOC4zIDAgMCAxLTUuOS02LjY2Yy0uNzYtMS4wNC0xLjQ4LTIuMDgtMi4xOC0zLjA4YTk5LjcxIDk5LjcxIDAgMCAwLTIuNjctMy43IDI4My43MyAyODMuNzMgMCAwIDAtMjUuOTQtMjguODJjLTQuMTQtNC03Ljg2LTcuMzQtMTAuNzEtOS42MkEzNS4zNCAzNS4zNCAwIDAgMCAxMTIgOTUuNmE3LjEzIDcuMTMgMCAwIDAtMS4xMi0uNTggMS42NyAxLjY3IDAgMCAwLS4zMy0uMWgtLjFhLjQyLjQyIDAgMCAwLS4zLjI5Yy0uMDcuMTctLjEuNDYtLjAyLjg4LjE2Ljg2LjY1IDIuMDYgMS40NSAzLjU1IDEuNTkgMi45NyA0LjI4IDYuOTIgNy40MyAxMS4xNmE0MjIuNjggNDIyLjY4IDAgMCAwIDE4Ljg3IDIzLjIzbC0uNzYuNjZhNDIzLjkgNDIzLjkgMCAwIDEtMTguOTItMjMuM2MtMy4xNS00LjI0LTUuODgtOC4yMy03LjUtMTEuMjdhMTQuMzMgMTQuMzMgMCAwIDEtMS41NS0zLjg1Yy0uMS0uNS0uMS0xIC4wNS0xLjQuMTYtLjQ1LjQ5LS43Ni45NS0uOS4zNC0uMS43My0uMDEgMS4wOC4xMS4zNy4xNC44LjM3IDEuMjkuNjYuOTcuNTkgMi4yIDEuNDggMy42NSAyLjY0YTE2MC41IDE2MC41IDAgMCAxIDEwLjc4IDkuNjlabTMzLjM4IDMuOTFhMy4xIDMuMSAwIDAgMSAyLjQ3LTEuMjNjMS4wNSAwIDEuOS41NCAyLjU2IDEuMy4zNi40MS42Ny45MS45MiAxLjQ0YTYuNDYgNi40NiAwIDAgMSAyLjM1LTEuODFjMS4wMS0uNDcgMS44OC0uNTggMi42MS0uMzQuNzQuMjQgMS4yMi44IDEuNTIgMS40NS4xLjIuMTguNDMuMjQuNjYuNTItLjk4IDEuMzgtMS44MiAyLjczLTEuODIuNzcgMCAxLjM2LjMzIDEuNzkuODYuMzYuNDQuNTkgMS4wMS43NCAxLjYuNTctMS4xOSAxLjUtMi4yNyAzLjAxLTIuNDYuODQtLjEgMS41LjE1IDEuOTYuNjcuNDMuNS42MyAxLjE5LjcxIDEuODguMzMtLjQ0Ljc2LS44IDEuMy0uOTMuNjctLjE0IDEuMzUuMSAyLjAzLjcgMS40MSAxLjIzIDEuNDggMy4wOCAxLjExIDQuNzJhMTMuMjkgMTMuMjkgMCAwIDEtMS44NyA0LjIzIDI0LjMgMjQuMyAwIDAgMC0yLjEgMTEuMWMuMTcgMi4yMy4wOCA1LjQ1LS42MSA4LjY5bC0uOTgtLjJjLjY3LTMuMTQuNzUtNi4yNy42LTguNDFhMjUuMjYgMjUuMjYgMCAwIDEgMi4yLTExLjY1bC4wMi0uMDMuMDItLjAzYy42My0uOTIgMS40MS0yLjQyIDEuNzUtMy45Mi4zNC0xLjUyLjItMi44OC0uOC0zLjc1LS41NC0uNDctLjktLjUyLTEuMTUtLjQ3LS4yNy4wNi0uNTUuMjgtLjg0LjczLS4zMi40OS0uNTcgMS4xNS0uNzUgMS44Mi0uMDkuNi0uMiAxLjE1LS4zMyAxLjYxbC0uOTgtLjE5Yy4wNy0uNDguMTctMS4wNC4zMi0xLjYyLjExLS43Ny4xNi0xLjU4LjA3LTIuMjhhMi41MyAyLjUzIDAgMCAwLS40OC0xLjM0Yy0uMjEtLjI1LS41My0uNC0xLjA3LS4zMy0xLjEyLjE0LTEuODcgMS0yLjM2IDIuMThhOC43NyA4Ljc3IDAgMCAwLS41MyAxLjk4Yy0uMDIuNTctLjA3IDEuMS0uMTMgMS41NWwtMS0uMDdjMC0uNDQuMDQtLjk5LjEzLTEuNTdhOS43OSA5Ljc5IDAgMCAwLS4xOC0yLjE2IDMuNDEgMy40MSAwIDAgMC0uNTktMS40MiAxLjIzIDEuMjMgMCAwIDAtMS0uNDljLS45MyAwLTEuNTUuNi0xLjk3IDEuNTEtLjI1LjU2LS40IDEuMi0uNDggMS43OSAwIC4zOS0uMDQuNzUtLjA4IDEuMDhsLTEtLjA2YzAtLjMyLjAzLS43LjA4LTEuMWE2LjMgNi4zIDAgMCAwLS40NC0yLjYzYy0uMjItLjQ5LS41My0uOC0uOTItLjkzLS40LS4xMy0xLS4xMS0xLjg4LjNhNS40NiA1LjQ2IDAgMCAwLTIuMzMgMmMuMDMuMDYuMDQuMTMuMDYuMTkuMzEgMSAuNDcgMi4wNS40NiAyLjk1IDAgLjQ1LS4wNS44Ny0uMTQgMS4yNC0uMS4zNi0uMjQuNy0uNS45Ni0uMjMuMjUtLjYuNDItMSAuMjYtLjMyLS4xNC0uNTEtLjQ1LS42Mi0uNzJhNS4wMiA1LjAyIDAgMCAxLS4yLTIuMzZjLjEtLjgzLjM3LTEuNzUuODQtMi42MmE2LjE2IDYuMTYgMCAwIDAtMS4wMi0xLjhjLS41Mi0uNi0xLjEyLS45NC0xLjgtLjk0LS42OSAwLTEuMjUuMy0xLjcuODYtLjQ0LjU2LS43NyAxLjQtLjkzIDIuNDQtLjMgMi4wOC4xIDQuODMgMS4zNiA3LjM4bC4xLjE5LS4wOC4yYy0uNjEgMS42Ni0uNzYgMy44My0uNjcgNi4wOC4xIDIuMjQuNDEgNC41Mi43IDYuMzguNTYgMy43MSAxLjE0IDYuMSAxLjcgOC4yOGwtLjk2LjI1YTc0LjE4IDc0LjE4IDAgMCAxLTEuNzMtOC4zOGMtLjI5LTEuODctLjYxLTQuMi0uNy02LjUtLjEtMi4yLjAzLTQuNDQuNjUtNi4yNWExNC4wNyAxNC4wNyAwIDAgMS0xLjM1LTcuNzcgNi4xMSA2LjExIDAgMCAxIDEuMTQtMi45M1ptNS43MyA0YTYuNSA2LjUgMCAwIDAtLjI4IDEuMjUgNC4wOCA0LjA4IDAgMCAwIC4xNiAxLjk0Yy4wNy0uMDkuMTQtLjIzLjItLjQ1LjA2LS4yNy4xLS42LjEtMSAwLS41My0uMDUtMS4xMy0uMTgtMS43NFpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02OC40IDI0LjA3YTcuMyA3LjMgMCAwIDEgLjgzIDMuNjFjLS4wNyAxLjA2LS40NyAxLjc0LTEuMDMgMi4wMi0uNTcuMjgtMS4zNS4xOC0yLjIzLS40YTcuMyA3LjMgMCAwIDEtMi4zOC0yLjg1IDcuMyA3LjMgMCAwIDEtLjgyLTMuNjJjLjA3LTEuMDUuNDctMS43NCAxLjAzLTIuMDIuNTYtLjI3IDEuMzUtLjE3IDIuMjMuNGE3LjMgNy4zIDAgMCAxIDIuMzcgMi44NlpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQ3Ljk5IDMwLjc4Yy0xLjIxLTIuMTItMS42NC03LjE5IDIuNzMtMTAuNDYgNS40Ni00LjEgMTEuMzctMS4zNyAxNC41NSAyLjI3XCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiA1OC45NzUyLFxuICAgIGN5OiAzMC44NjQyLFxuICAgIHI6IDkuNDQ0MyxcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUzLjM1IDI4LjExYy4zLjU4IDEuMTMgMS41NiAyLjE3Ljg3IDEuMDMtLjcuNDMtMi4wMiAwLTIuNlwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTguNTQgMjQuODFjLjMuNTguOTggMS4yNiAyLjE2Ljg3IDEuMy0uNDQuODctMS43My40NC0yLjE3XCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02Mi44NyAyOS40MWMuNzItMi43NCAzLjgtOC43MyAxMC4zNy0xMC44XCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03My4yNCAxOC42YzEuMTYuODcgNS44IDIuNDIgNS4yIDAtLjQ0LTEuNzMtMy45LTEuMy01LjIgMFpcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUyLjAzIDMzLjE2YTcuMyA3LjMgMCAwIDEgLjgyIDMuNjJjLS4wNyAxLjA1LS40NiAxLjc0LTEuMDMgMi4wMi0uNTYuMjgtMS4zNS4xOC0yLjIzLS40YTcuMyA3LjMgMCAwIDEtMi4zNy0yLjg2IDcuMyA3LjMgMCAwIDEtLjgzLTMuNjFjLjA4LTEuMDUuNDctMS43NCAxLjA0LTIuMDIuNTYtLjI4IDEuMzUtLjE4IDIuMjMuNGE3LjMgNy4zIDAgMCAxIDIuMzcgMi44NVpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUzIDM4Ljk3Yy0xNC4xIDYuODItMjIgMTQuMjUtMjUuOTMgMTkuNTVsMTIuMjggMi4yOEw1NC44IDQzLjk3YzIuNzMtLjQ1IDYuMTktMi4xLTEuODItNVpcIixcbiAgICBmaWxsOiBcIiM4ODhEOTJcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTMuMDMgMTEzLjU2YzEuNjcuNDUgNSAyLjQ1IDUgNi44Mk0xNDMuMDUgOTRhOC4yNyA4LjI3IDAgMCAxIDUgNi4zN1wiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJtMTEzLjk3IDE1Ni4yLjMyLS45N2ExNC41IDE0LjUgMCAwIDAtMjYuNDktMTEuNTFsLS44MS0uNmExNS41IDE1LjUgMCAwIDEgMjguMjUgMTIuNDIgOCA4IDAgMCAxIDQuMDYgMi43NSA5Ljk5IDkuOTkgMCAwIDEgMTcuNjkuNTQgMTIuMDMgMTIuMDMgMCAwIDEgOC4xNC0xLjQyIDYuNSA2LjUgMCAwIDEgMTIuMjEtMS41NGwtLjk3LjNhNS41IDUuNSAwIDAgMC0xMC4yNiAxLjQ0bC0uMi45NS0uOTUtLjE3YTExLjA1IDExLjA1IDAgMCAwLTcuNDcgMS4zbC0uOTMuNTUtLjQ3LS45N2E5IDkgMCAwIDAtMTUuOTItLjQ5bC0uNzQgMS4zLS45Mi0xLjE4YTcgNyAwIDAgMC0zLjU1LTIuNGwtMS0uM1pcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0xNzMuMjkgMTQ2LjAyLS44Ny0uMzRhNi41NyA2LjU3IDAgMCAwLTIuNDItLjQ2Yy0zLjI0IDAtNi4wMyAyLjM5LTYuOCA1LjY5bC0xLjA0LjFjLjc1LTMuODggMy45Ny02Ljc5IDcuODQtNi43OS45OCAwIDEuOTIuMTkgMi43OS41M2E4IDggMCAwIDEgMTQuMy0uMjVsLTEuMDIuMjRhNyA3IDAgMCAwLTEyLjM4LjQ0bC0uNC44NFpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xOS41IDEwMS4yNWE5IDkgMCAwIDEgMTAuNTItNS44bC0uNTkuOWE4IDggMCAwIDAtOS4xNCA1LjcybC0uNzktLjgyWlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTQ0Ljg3IDEwMC45MyA0MS42MSAyMC40OC0yNi4yIDE3LjA3TDE4LjY3IDExOGwyNi4yLTE3LjA3WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTE5Ljc4IDExNy44IDE0LjA5LTMxLjk1IDQyLjY3IDE4LjcyLTE2LjAzIDMzLjI4LTQwLjczLTIwLjA0WlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogNDYuNjcxOCxcbiAgICBjeTogMTExLjM0LFxuICAgIHI6IDQuMzc5NzYsXG4gICAgZmlsbDogXCIjODg4RDkyXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogNTIuMTMxOCxcbiAgICBjeTogMTEwLjI2LFxuICAgIHI6IDEuMDgwMDMsXG4gICAgZmlsbDogXCIjODg4RDkyXCJcbiAgfSkpO1xufVxudmFyIElsbHVzdHJhdGlvbklkbGVEYXJrX2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25JZGxlRGFya19kZWZhdWx0IGFzIGRlZmF1bHRcbn07XG4iLCAidmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fcHJvcElzRW51bSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4ga2V5IGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZSB9KSA6IG9ialtrZXldID0gdmFsdWU7XG52YXIgX19zcHJlYWRWYWx1ZXMgPSAoYSwgYikgPT4ge1xuICBmb3IgKHZhciBwcm9wIGluIGIgfHwgKGIgPSB7fSkpXG4gICAgaWYgKF9faGFzT3duUHJvcC5jYWxsKGIsIHByb3ApKVxuICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICBpZiAoX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoYikpIHtcbiAgICAgIGlmIChfX3Byb3BJc0VudW0uY2FsbChiLCBwcm9wKSlcbiAgICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICAgIH1cbiAgcmV0dXJuIGE7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiBTdmdDb21wb25lbnQocHJvcHMpIHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9fc3ByZWFkVmFsdWVzKHtcbiAgICB3aWR0aDogMjAwLFxuICAgIGhlaWdodDogMjAwLFxuICAgIHZpZXdCb3g6IFwiMCAwIDIwMCAyMDBcIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGZvY3VzYWJsZTogZmFsc2UsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIHByb3BzKSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB3aWR0aDogMjAwLFxuICAgIGhlaWdodDogMjAwLFxuICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTcyLjUgMzAuNzZhNTAuNiA1MC42IDAgMCAxIDY4LjQyIDI4LjAxIDM0LjEzIDM0LjEzIDAgMCAxIDM2LjQ3IDQ5LjI2IDM2LjE4IDM2LjE4IDAgMCAxLTE3LjYzIDY4LjUzIDY3LjUzIDY3LjUzIDAgMCAxLTExNC42My0yNC42OGgtLjJhNDEuOTQgNDEuOTQgMCAwIDEtMjguMzctNzIuODIgMzcuODMgMzcuODMgMCAwIDEgNTUuOTQtNDguM1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeS1saWdodC1kZWZhdWx0KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTMyIDM4LjcyYzMuMi04IDcuODMtMTIuMTcgMTAuNS0xNCAxLjMyLTEgMTQtMTEuNSA0MS0xMy41IDI3LjQzLTIuMDMgMzEuNSAxMC41IDMyLjUgMThzLTEwLjUgMjEuNS0xNCAyMy41YzMuNSAzIDIzIDI0IDI4IDMwLjVzMzcuNSAyOSAzOCAzMy41YzMtMiA0LTEgNSAyIC41LTMgNC41LTMuNSA1IDAgNS01LjUgNS0yIDYgMCAzLTMuNSA2LjUgMiAzIDdzLTMgMTEuNS0zIDE1LTEgMTctOC41IDE4YTE1LjggMTUuOCAwIDAgMS0xMi41LTRjLTEtLjY3LTMuNy0zLjEtNi41LTcuNS0zLjUtNS41LTE3LTIzLTI5LjUtMzVzLTE5LjUtMTYtMTctOS41IDI1IDM0IDI3IDM2LjVjMi0xLjIgMy4xNy41IDMuNSAxLjUuNS0yLjMzIDIuMy02LjQgNS41LTQgMy4yIDIuNCAxIDctLjUgOS0uMTcgMi44My0uNCA5IDAgMTEgLjUgMi41IDQuNSA5LjUgMCAxMy41LTMuNiAzLjItMTguNSAzLjMzLTI1LjUgMy00LTcuMzMtMTIuMy0yMi41LTEzLjUtMjQuNS0xLjUtMi41LTEzLTE5LTE4LTI0LjUtNC00LjQtMTQtMjEuODMtMTguNS0zMC0uNS42Ny0xLjYgMi41LTIgNC41LS41IDIuNS01IDE0LTIyLjUgMTMuNXMtMjQuNS0xMi0yNi41LTI3IDEyLTI3IDE1LTMwYy0uNC0yLS4xNy01LjE3IDAtNi41LS42NyAxLjMzLTIuMiA0LTMgNC0xIDAtMy00IDEtMTRaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQ2LjYyIDc1LjM1Yy05LjgyLTEwLjkyLTE4Ljk1LTEwLjMxLTIyLjI4LTguNjQgMi43My02LjgyIDIwLjkyLTIwLjQ3IDI3LjI5LTIyLjI5IDUuMTItMS40NiAxMy42NC00LjEgMTYuMzctNy4yOCAyLjczLTMuMTggMTEuODMtOS4xIDE5LjU2LTEyLjI4IDEwLTIuNzIgMTguNjUuNDYgMjYuODMgMTAuOTItNC41NSAxMS44My0xMCAxNS0xMi4yOCAxNy4yOCAyLjczIDEuMzcgMTEuODMgMTAuNDYgMjAuOTIgMjIuMjktMzEuMzgtNC4xLTQ3LjMgMzEuODQtNDguMiAyOC42NS0uOTItMy4xOC01LjAxLTcuNzMtNS4wMS0xMCAwLTIuMjggMy4xOC01LjkyIDcuNzMtMTEuMzcgNC41NS01LjQ2IDExLjgzLTcuMjggMTQuMS04LjE5IDIuMjgtLjkxIDQuMS0xLjM2IDQuNTUtMy4xOC4zNi0xLjQ2LTEuNTItMi4xMy0yLjczLTIuMjggMS4wNi0uMTUgMy4xOS0xIDMuMTktMy4xOCAwLTIuMTMtMi40Ni0xLjU1LTMuNTYtMS4zOGExMC42NiAxMC42NiAwIDAgMCAwIDBjLjU3LS4xNSAyLjQtMS42NiAxLjc0LTMuNjItLjQ2LTEuMzctMi40My0xLjUyLTMuNjQtMS4zNy43Ni0uMyAxLjczLTEuOTEgMS4zNi00LjEtLjM2LTIuMTgtMy45NC0yLjU3LTUuOTEtMi4yNyAxLjY3LTEuMDYgMy43My0zLjQ1LjQ1LTQuNTQtNC4wOS0xLjM3LTE1LjEgMi40MS0yNS4wMSAxMC03LjczIDUuOTEtMTEuMjIgMTEuOTgtMTEuODMgMTUuMDEtLjYtLjQ1LTIuMTgtLjczLTMuNjQgMS44MlpcIixcbiAgICBmaWxsOiBcIiNFNkU4RUFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTMgMjAuMjJINTMuNWwtNy41IDIuNS00IDMgMjkuNSA1LjUgMTYuNS02LjVzOS41LTIuNSAxNyAyLjUgOS41IDguNSA5LjUgOC41bDEuNS02LTMtOS41WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03Ny40IDI5Ljg1Yy00LjE2IDIuMzMtOC40MiA1LjM5LTEwLjk0IDkuMjQtMy45OC42My05LjMzIDIuMzgtMTUuMDUgNS4xNS0yLjg4IDUuNC0zLjc3IDExLjg4LTUuMzQgMTEuMjUtLjctLjI3LS44Ni0xLjgtLjc4LTMuNTMtMS4wNCA0LjYtMi41NSA4LjI1LTMuNTUgNS4yNi0uNS0xLjUyLS4xNS00LjcuMzctNy42OGwtLjE3LjEyYy0uOTggNi4xNi0xLjcgMTMuMDgtMy42NiA3LjU2YTEyLjg5IDEyLjg5IDAgMCAxLS42Mi00LjUxbC0xLjEuODZjLS42IDIuODYtMS4yMiA0LjM5LTIuMTcgMS45MmE3LjEgNy4xIDAgMCAxLS4wNC0uMDkgNTcuODggNTcuODggMCAwIDAtMTAuNDcgMTEuNzVjLTEwLjgxIDE2LjQtMi4wNCAzNy43NiAxMC41IDQyLjk0IDEyLjU1IDUuMTkgMjkuODYgMS41MyAzMy43NS0xMS40MmE0My4zOSA0My4zOSAwIDAgMSAxLjY4LTQuNjFjNC4zNC0xMC4xIDExLjYzLTE1Ljk1IDE2LjkyLTE3Ljg0IDYuMDYtMi4xNiAxMi4xMi00LjMyIDguMjItNi40OGE0LjYzIDQuNjMgMCAwIDAtMS45LS41NGMtMS4yNS42LTIuNzggMS4zLTQuNTkgMi4yNy01LjYyIDMuMDItNy4zNSAyLjU5LTYuMDUgMS43MyAxLjEtLjc0IDYuNjItNC4zIDEwLjYzLTQgMi42My0xLjI1IDMuOTQtMi4wMiAzLjY0LTMuNzgtLjE2LS45Ni0xLjY1LTEuMzMtMy42My0xLjI3LTEuNyAxLjIzLTQuMTUgMi4yNi01Ljg4IDMtMy4wMyAxLjMtNy44IDIuNi00LjMzIDAgMi4xNy0xLjYyIDYuODgtMi45IDEwLjItMyAxLjI2LS45MSAyLjEtMS45NCAxLjkxLTMuMDQtLjIxLTEuMjktMS42LTIuMDQtMy41OC0yLjIxLTEuOTQgMi4wMy01LjU2IDMuNzUtOC45NiA0LjM3LTQuNzYuODYtMy40Ni0uODcgMS43My0zLjAzYTE2LjEyIDE2LjEyIDAgMCAxIDcuMjMtMS4zNCA0LjggNC44IDAgMCAwIDEuNDItMi41NGMuMzItMi4yNi0yLjAxLTMuNTYtNi4yOS0zLjE2YTMxLjk1IDMxLjk1IDAgMCAxLTcuNTUgNC44OGMtMy45IDEuNzMtNC43Ni0xLjcyIDIuNi0zLjg4IDEuODUtLjU1IDMuNTEtLjg3IDQuOTUtMSAxLjU3LTEuNDMgMi41Mi0yLjgzIDEuOTYtMy43NS0xLjMtMi4xNi01LjEyLTEuNTMtMTIuOTEgMS41LTcuMiAyLjc5LTE5LjYgOS4xMS0yNS4xOCAyMi4wMWEzMy42NiAzMy42NiAwIDAgMC0xLjIxIDMuMjZjLTQuNzYgMTUuMTEtOS4xNSAxMC4zNi03LjQyIDUuMTggMS4yMy0zLjY2IDQuNjEtNi42OCA4LjYzLTguNDQgNS41OC0xMi45IDE3Ljk3LTE5LjIyIDI1LjE4LTIyLjAyIDcuNzktMy4wMiAxMS42Mi0zLjY1IDEyLjkxLTEuNS41Ni45My0uMzkgMi4zMy0xLjk2IDMuNzYgNC4yOC0uNCA2LjYxLjkgNi4yOSAzLjE2YTQuOCA0LjggMCAwIDEtMS40MiAyLjU0YzEuOTguMTcgMy4zNy45MiAzLjU4IDIuMi4xOSAxLjExLS42NSAyLjE0LTEuOSAzLjA1IDEuOTgtLjA2IDMuNDcuMyAzLjYzIDEuMjcuMyAxLjc2LTEgMi41My0zLjY0IDMuNzguNy4wNiAxLjM0LjIzIDEuOTEuNTQgMy45IDIuMTYtMi4xNiA0LjMyLTguMjIgNi40OC01LjMgMS44OS0xMi41OCA3Ljc0LTE2LjkyIDE3Ljg0IDMuMzMgNi4xMiAxMS43NiAyMS41IDE2LjkyIDI3LjY4YTM3OC4xIDM3OC4xIDAgMCAxIDIxLjc1IDI5LjZjNSA3Ljc4IDE2Ljc1IDMxLjggMzIuNzYgMjYuMzQgMTEuMjUtNC4zMSAzLjktMjAuMjkgMy45LTI0LjZ2LTYuOTJjMS4xNS0xLjI5IDMuMi00LjY2IDIuMTYtNy43Ny0xLjIyLTMuNjQtNi4yNC0zLjEtNi41IDMuNzMuMS41Ni4xIDEuMDggMCAxLjQ1LS4wMi0uNTEtLjAyLTEgMC0xLjQ1LS4zNi0yLjAyLTEuODYtNC41NS0zLjg5LTIuODYtLjY2LjU1LTEuMSAxLjMtMS4zOCAyLjEzLjI2LjQuNDQuODQuNTIgMS4zMi40MyAyLjYgMCA0Ljc1LS40MyA0LjMyLS4zMy0uMzItLjg4LTMuMjctLjA5LTUuNjUtMS4xMi0xLjc2LTMuNjEtMi41OS00LjY3LS44My0uNDEuNjgtLjY5IDEuNjEtLjg0IDIuNjMuMjcuMi41Ni40Ny44NC44MyAxLjczIDIuMTYgMS4zIDYuOSAwIDUuMTgtLjktMS4xOS0xLjE3LTMuOC0uODQtNi4wMS0xLjQyLTEuMDUtMi43LS4zMy0zLjA2LjQtLjI0LjQ4LS45IDEuNzgtMS4wMyAzLjQ1IDIuMDggMi4xMSAyLjY3IDYuOTMgMS4wMyA0LjMyYTYuODcgNi44NyAwIDAgMS0xLjAzLTQuMzJjLjE0LTEuNjYuOC0yLjk3IDEuMDMtMy40Ni4zNy0uNzIgMS42NC0xLjQ0IDMuMDYtLjM5LjE1LTEuMDIuNDMtMS45NS44NC0yLjYzIDEuMDYtMS43NiAzLjU1LS45MyA0LjY3LjgzLjI4LS44Mi43Mi0xLjU3IDEuMzgtMi4xMiAyLjAzLTEuNyAzLjUzLjg0IDMuODkgMi44Ni4yNi02Ljg0IDUuMjgtNy4zNyA2LjUtMy43MyAxLjAzIDMuMTEtMS4wMSA2LjQ4LTIuMTcgNy43OHY2LjljMCA0LjMyIDcuMzYgMjAuMy0zLjg5IDI0LjYxLTE2IDUuNDYtMjcuNzYtMTguNTYtMzIuNzYtMjYuMzNhMzc4LjEgMzc4LjEgMCAwIDAtMjEuNzUtMjkuNmMtNS4xNi02LjItMTMuNTktMjEuNTctMTYuOTItMjcuN2E0MS44NCA0MS44NCAwIDAgMC0xLjY4IDQuNjJjLTMuOSAxMi45NS0yMS4yIDE2LjYtMzMuNzQgMTEuNDItMTIuNTUtNS4xOC0yMS4zMi0yNi41My0xMC41LTQyLjk0QTU3Ljg4IDU3Ljg4IDAgMCAxIDM0LjM0IDU1LjRjLjczLS42MyAxLjQ3LTEuMjQgMi4yMi0xLjgzLjc4LTMuNjYgMS41NS05LjQ3IDMtMTEuOSAyLjEyLTMuNS0xLjc4IDQuMTItMS45MSAxMS4wNCAxLjQtMS4wOCAyLjgzLTIuMSA0LjI4LTMuMDUuMzItMi4wNC42Ny00IDEuMS01LjQgMS4wNS0zLjQtLjEzLjY4LS45MyA1LjI4YTgwLjk4IDgwLjk4IDAgMCAxIDMuOC0yLjM2Yy4yNC0xLjE4LjQyLTEuNTcuMjUtLjE1YTgxLjE2IDgxLjE2IDAgMCAxIDUuMjUtMi43OSAxNS4wMiAxNS4wMiAwIDAgMSA0LjE4LTUuMTUgNTQuODkgNTQuODkgMCAwIDEgMjEuOC05LjI0WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04OC4wMyAyNC44NGMtMy43NSAxLjczLTE2LjM3IDYuMy0yMS41NyAxNC4yNUM1NS42NSA0MC44IDM0LjcgNTAuNzQgMjMuODggNjcuMTVjLTEwLjgxIDE2LjQtMi4wNCAzNy43NiAxMC41IDQyLjk0IDEyLjU1IDUuMTkgMjkuODYgMS41MyAzMy43NS0xMS40Mi4zMS0xLjA0LjY2LTIuMDUgMS4wMy0zLjAyIDQuMjQtMTEuMDggMTItMTcuNDUgMTcuNTctMTkuNDMgNi4wNi0yLjE2IDEyLjEyLTQuMzIgOC4yMi02LjQ4LTMuOS0yLjE2LTExLjI1IDIuNi0xMi41NCAzLjQ2LTEuMy44Ni40MyAxLjMgNi4wNS0xLjczIDUuNjMtMy4wMiA4LjY2LTMuNDUgOC4yMi02LjA1LS40My0yLjU5LTEwLjM4LS44Ni0xMy44NCAxLjczLTMuNDYgMi42IDEuMyAxLjMgNC4zMyAwIDMuMDItMS4zIDguMjEtMy40NSA3Ljc4LTYuMDQtLjQzLTIuNi01LjYyLTMuMDMtMTAuODEtLjg3LTUuMiAyLjE2LTYuNSAzLjg5LTEuNzMgMy4wMyA0Ljc2LS44NyA5Ljk1LTMuODkgMTAuMzgtNi45MS40My0zLjAzLTMuOS00LjMyLTExLjI1LTIuMTZzLTYuNDkgNS42MS0yLjYgMy44OGMzLjktMS43MiAxMC44Mi02LjQ3IDkuNTItOC42My0xLjMtMi4xNi01LjEyLTEuNTMtMTIuOTEgMS41LTcuNzkgMy4wMS0yMS42MyAxMC4xNi0yNi4zOSAyNS4yNy00Ljc2IDE1LjExLTkuMTUgMTAuMzYtNy40MiA1LjE4IDEuNzMtNS4xOCA3Ljc5LTkuMDcgMTMuODQtOS45M200Ni43My0xOC41N2M0LjYxLTMuODggMTMuODQtMTQuMDcgMTMuODQtMjMuNzQgMC0xMi4xLTE1LjU3LTIyLjg5LTQ4LjAyLTE1LjU1LTMyLjQ0IDcuMzQtMzYuNzcgMjUuMDQtMzguMDcgMzIuODItMS4zIDcuNzcgMi42IDkuMDYgNC4zMy0uODcgMS4zOC03Ljk0IDIuMDItOC43OCAyLjE2LTguMi0xLjQ0IDQuMTctMy45IDEzLjY0LTIuMTYgMTguMTMgMi4xNiA1LjYyIDIuNi05LjUgNS4xOS0xMy44MSAyLjYtNC4zMi0zLjkgOC4yLTEuMyAxNS41NCAyLjYgNy4zNCAzLjAzLTcuMzQgNC43Ni0xMi45NSAxLjczLTUuNjItMi42IDkuMDYtMS4zIDEyLjk1IDEuMyAzLjg5IDMuNDYtMy40NSA0LjMzLTkuNS44Ni02LjA0LTIuMTcgNi45MSAwIDcuNzcgMi4xNi44NyAzLjAzLTExLjY1IDkuNTItMTYuNCA2LjQ4LTQuNzUgMTcuNzMtOS45MyAyOS40MS05LjkzbTEuNzMgMTAuNzljNy4yMSA1LjQ3IDIzLjg4IDE5LjQzIDMyLjg4IDMxLjUyIDExLjI1IDE1LjExIDM4LjUgMzQuNTQgNDguNDUgNDQuNDdtLTQyLjgzIDQ5LjIyYy0yLjE2LTMuMDItMS43My04LjYzLTEuNzMtMTEuMjItMS43My0xLjczLTMuODktNi45MSAwLTcuNzggMy45LS44NiA1LjYzIDguNjQgMy40NyA1LjE5LTIuMTctMy40Ni0uNDQtNi45MSAwLTcuNzguNDMtLjg2IDIuMTYtMS43MiAzLjg5LjQ0czEuMyA2LjkgMCA1LjE4Yy0xLjMtMS43My0xLjMtNi40OCAwLTguNjRzNC43Ni0uNDMgNS4xOSAyLjE2Yy40MyAyLjYgMCA0Ljc1LS40MyA0LjMyLS40NC0uNDMtMS4zLTUuNjEgMS4zLTcuNzcgMi41OS0yLjE2IDQuMzIgMi41OSAzLjg5IDQuMzEtLjQ0LTguMiA1LjE5LTkuMDYgNi40OS01LjE4IDEuMDMgMy4xMS0xLjAxIDYuNDgtMi4xNyA3Ljc4djYuOWMwIDQuMzIgNy4zNiAyMC4zLTMuODkgMjQuNjEtMTYgNS40Ni0yNy43Ni0xOC41Ni0zMi43Ni0yNi4zM2EzNzguMSAzNzguMSAwIDAgMC0yMS43NS0yOS42Yy01LjE2LTYuMi0xMy41OS0yMS41Ny0xNi45Mi0yNy43XCIsXG4gICAgc3Ryb2tlOiBcIiM0MTQ2NENcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMzcuNSAxMzkuMzdjLTkuMDUtMTAuMzgtMzIuMjctMzguMzYtMjcuMi0zOS45MiAyLjczLS44MyAyNi42NSAyMS41MSA0Mi4zIDQxLjg1IDQuNzcgNi4yIDEwLjIgMTYuODMgMTkuMSAxNi44MyAxMS4yIDAgMTIuNjUtMTMuOTQgMTIuMjItMjAuMDgtLjM0LTQuOSAxLjMtOS42NCAyLjE2LTExLjQgMS4yOS0xLjkgMy4yNy02LjIyLjg2LTguMzItMi40Mi0yLjEtMy42IDEuNzUtMy44OCAzLjk1LjU3LTIuMiAxLjAzLTYuNDktMS43Mi02LjE0LTIuNzYuMzUtMy40NSA0LjI0LTMuNDUgNi4xNC4yOS0yLjA1LjI2LTYuMTQtMi4xNi02LjE0LTIuNDEgMC0zLjAxIDMuMjEtMy4wMSA0LjgyLjI4LTIuMzQtLjA5LTYuNTctMy44OC00LjgyLTQuNzQgMi4yLTMuODggOC43Ny0yLjU5IDcuNDUgMS4zLTEuMzEgMC04LjMzLTMuNDUtOC4zMy0zLjQ0IDAtNC4zIDYuMTQtMS43MiAxMS40LTEuMyAzLjUtLjU2IDguOTcgMCAxMi43YTczLjU1IDczLjU1IDAgMCAwIDEuNzIgOC4zM1wiLFxuICAgIHN0cm9rZTogXCIjNDE0NjRDXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjguNCAyOS4wN2E3LjMgNy4zIDAgMCAxIC44MyAzLjYxYy0uMDcgMS4wNi0uNDcgMS43NC0xLjAzIDIuMDItLjU3LjI4LTEuMzUuMTgtMi4yMy0uNGE3LjMgNy4zIDAgMCAxLTIuMzgtMi44NSA3LjMgNy4zIDAgMCAxLS44Mi0zLjYyYy4wNy0xLjA1LjQ3LTEuNzQgMS4wMy0yLjAyLjU2LS4yNyAxLjM1LS4xNyAyLjIzLjRhNy4zIDcuMyAwIDAgMSAyLjM3IDIuODZaXCIsXG4gICAgZmlsbDogXCIjNDE0NjRDXCIsXG4gICAgc3Ryb2tlOiBcIiM0MTQ2NENcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00Ny45OSAzNS43OGMtMS4yMS0yLjEyLTEuNjQtNy4xOSAyLjczLTEwLjQ2IDUuNDYtNC4xIDExLjM3LTEuMzcgMTQuNTUgMi4yN1wiLFxuICAgIHN0cm9rZTogXCIjNDE0NjRDXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogNTguOTc1MSxcbiAgICBjeTogMzUuODY0MyxcbiAgICByOiA5LjQ0NDMsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNDE0NjRDXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTMuMzUgMzMuMTFjLjMuNTggMS4xMyAxLjU2IDIuMTcuODcgMS4wMy0uNy40My0yLjAyIDAtMi42XCIsXG4gICAgc3Ryb2tlOiBcIiM0MTQ2NENcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01OC41NCAyOS44MWMuMy41OC45OCAxLjI2IDIuMTYuODcgMS4zLS40NC44Ny0xLjczLjQ0LTIuMTdcIixcbiAgICBzdHJva2U6IFwiIzQxNDY0Q1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTYyLjg3IDM0LjQxYy43Mi0yLjc0IDMuOC04LjczIDEwLjM3LTEwLjhcIixcbiAgICBzdHJva2U6IFwiIzQxNDY0Q1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTczLjI0IDIzLjZjMS4xNi44NyA1LjggMi40MiA1LjIgMC0uNDQtMS43My0zLjktMS4zLTUuMiAwWlwiLFxuICAgIHN0cm9rZTogXCIjNDE0NjRDXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTIuMDMgMzguMTZhNy4zIDcuMyAwIDAgMSAuODIgMy42MmMtLjA3IDEuMDUtLjQ2IDEuNzQtMS4wMyAyLjAyLS41Ni4yOC0xLjM1LjE4LTIuMjMtLjRhNy4zIDcuMyAwIDAgMS0yLjM3LTIuODYgNy4zIDcuMyAwIDAgMS0uODMtMy42MWMuMDgtMS4wNS40Ny0xLjc0IDEuMDQtMi4wMi41Ni0uMjggMS4zNS0uMTggMi4yMy40YTcuMyA3LjMgMCAwIDEgMi4zNyAyLjg1WlwiLFxuICAgIGZpbGw6IFwiIzQxNDY0Q1wiLFxuICAgIHN0cm9rZTogXCIjNDE0NjRDXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTMgNDMuOTdjLTE0LjEgNi44Mi0yMiAxNC4yNS0yNS45MyAxOS41NWwxMi4yOCAyLjI4TDU0LjggNDguOTdjMi43My0uNDUgNi4xOS0yLjEtMS44Mi01WlwiLFxuICAgIGZpbGw6IFwiI0U2RThFQVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExMy4wMyAxMTguNTZjMS42Ny40NSA1IDIuNDUgNSA2LjgyTTE0My4wNSA5OWE4LjI3IDguMjcgMCAwIDEgNSA2LjM3XCIsXG4gICAgc3Ryb2tlOiBcIiM0MTQ2NENcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtYXNrXCIsIHtcbiAgICBpZDogXCJwYXRoLTE5LWluc2lkZS0xXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0yOCAxMTguMjJjLjY5IDAgMS4zNi0uMDggMi0uMjJ2LjIyYTE4IDE4IDAgMSAwIDUuOS0xMy4zMiA5IDkgMCAxIDAtNy45IDEzLjMyWm03Mi41IDUzYzEuNjggMCAzLjMtLjI3IDQuODItLjc2YTggOCAwIDAgMCAxMy45OCAyLjcgMTAgMTAgMCAwIDAgMTIuMTggNC40NCAxMiAxMiAwIDEgMCAyMi42My03LjkyIDYuNSA2LjUgMCAxIDAtOC45OC03LjI3IDEyLjA4IDEyLjA4IDAgMCAwLTguMTQgMS40MiAxMCAxMCAwIDAgMC0xNy43LS41NCA4LjAxIDguMDEgMCAwIDAtNC4wNS0yLjc1IDE1LjUgMTUuNSAwIDEgMC0xNC43NCAxMC42OFptODcuNS0xOGE4IDggMCAwIDEtMTAuNTQgNy41OSA4LjAzIDguMDMgMCAwIDEtNy40NiA1LjQxYy00LjQyIDAtOC0zLjgtOC04LjVzMy41OC04LjUgOC04LjVjLjk4IDAgMS45Mi4xOSAyLjc5LjUzYTggOCAwIDAgMSAxNS4yMSAzLjQ3WlwiXG4gIH0pKSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTI4IDExOC4yMmMuNjkgMCAxLjM2LS4wOCAyLS4yMnYuMjJhMTggMTggMCAxIDAgNS45LTEzLjMyIDkgOSAwIDEgMC03LjkgMTMuMzJabTcyLjUgNTNjMS42OCAwIDMuMy0uMjcgNC44Mi0uNzZhOCA4IDAgMCAwIDEzLjk4IDIuNyAxMCAxMCAwIDAgMCAxMi4xOCA0LjQ0IDEyIDEyIDAgMSAwIDIyLjYzLTcuOTIgNi41IDYuNSAwIDEgMC04Ljk4LTcuMjcgMTIuMDggMTIuMDggMCAwIDAtOC4xNCAxLjQyIDEwIDEwIDAgMCAwLTE3LjctLjU0IDguMDEgOC4wMSAwIDAgMC00LjA1LTIuNzUgMTUuNSAxNS41IDAgMSAwLTE0Ljc0IDEwLjY4Wm04Ny41LTE4YTggOCAwIDAgMS0xMC41NCA3LjU5IDguMDMgOC4wMyAwIDAgMS03LjQ2IDUuNDFjLTQuNDIgMC04LTMuOC04LTguNXMzLjU4LTguNSA4LTguNWMuOTggMCAxLjkyLjE5IDIuNzkuNTNhOCA4IDAgMCAxIDE1LjIxIDMuNDdaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnktbGlnaHQtZGVmYXVsdClcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zMCAxMThoMWwuMDItMS4yNi0xLjI0LjI4LjIyLjk4Wm01LjktMTMuMS0uODguNDguNiAxLjExLjk1LS44NS0uNjctLjc0Wm02OS40MiA2NS41Ni45Ni0uMjgtLjMtMS0uOTcuMzMuMy45NVptMTMuOTggMi43Ljg3LS41LS43NC0xLjMtLjkyIDEuMTcuNzkuNjJabTEyLjE4IDQuNDQuOTYtLjI4LS4zLTEuMDMtMSAuMzcuMzQuOTRabTIyLjYzLTcuOTItLjQtLjkyLS45LjQuMzcuOS45My0uMzhabS04Ljk4LTcuMjctLjE3Ljk4Ljk2LjE4LjItLjk2LS45OS0uMlptLTguMTQgMS40Mi0uOS40NC40Ny45Ny45My0uNTQtLjUtLjg3Wm0tMTcuNy0uNTQtLjc4LjYyLjkyIDEuMTcuNzQtMS4zLS44Ny0uNVptLTQuMDUtMi43NS0uOTUtLjMxLS4zMy45OCAxIC4yOS4yOC0uOTZabTYyLjIyLjI3LjMxLS45NS0uOTItLjMxLS4zMy45MS45NC4zNVptLTQuNjctMTEuMDYtLjM3LjkzLjg3LjM0LjQtLjg0LS45LS40M1pNMjkuNzggMTE3LjAyYy0uNTcuMTMtMS4xNy4yLTEuNzguMnYyYy43NiAwIDEuNS0uMDkgMi4yMi0uMjVsLS40NC0xLjk1Wm0xLjIyIDEuMnYtLjIxbC0yLS4wM3YuMjRoMlptMTcgMTdhMTcgMTcgMCAwIDEtMTctMTdoLTJhMTkgMTkgMCAwIDAgMTkgMTl2LTJabTE3LTE3YTE3IDE3IDAgMCAxLTE3IDE3djJhMTkgMTkgMCAwIDAgMTktMTloLTJabS0xNy0xN2ExNyAxNyAwIDAgMSAxNyAxN2gyYTE5IDE5IDAgMCAwLTE5LTE5djJabS0xMS40MyA0LjQyQTE2Ljk0IDE2Ljk0IDAgMCAxIDQ4IDEwMS4yMnYtMmMtNC45MiAwLTkuNCAxLjg3LTEyLjc4IDQuOTRsMS4zNSAxLjQ4Wk0yOCAxMDEuMjJhOCA4IDAgMCAxIDcuMDIgNC4xNmwxLjc1LS45NmExMCAxMCAwIDAgMC04Ljc3LTUuMnYyWm0tOCA4YTggOCAwIDAgMSA4LTh2LTJhMTAgMTAgMCAwIDAtMTAgMTBoMlptOCA4YTggOCAwIDAgMS04LThoLTJhMTAgMTAgMCAwIDAgMTAgMTB2LTJabTc3IDUyLjI5Yy0xLjQxLjQ2LTIuOTIuNzEtNC41LjcxdjJjMS43OSAwIDMuNTEtLjI4IDUuMTMtLjgxbC0uNjItMS45Wm04IDUuNzFhNyA3IDAgMCAxLTYuNzItNS4wNGwtMS45Mi41NmE5IDkgMCAwIDAgOC42NCA2LjQ4di0yWm01LjUxLTIuNjlhNi45OSA2Ljk5IDAgMCAxLTUuNTEgMi42OXYyYTguOTkgOC45OSAwIDAgMCA3LjA5LTMuNDVsLTEuNTgtMS4yNFptOS40OSA0LjY5YTkgOSAwIDAgMS03LjgzLTQuNTZsLTEuNzQuOTlhMTEgMTEgMCAwIDAgOS41NyA1LjU3di0yWm0zLjEzLS41NmMtLjk3LjM2LTIuMDMuNTYtMy4xMy41NnYyYzEuMzQgMCAyLjY0LS4yNCAzLjgzLS42OWwtLjctMS44N1ptMTEuODcgOC41NmExMSAxMSAwIDAgMS0xMC41Ni03LjlsLTEuOTIuNTZhMTMgMTMgMCAwIDAgMTIuNDggOS4zNHYtMlptMTEtMTFhMTEgMTEgMCAwIDEtMTEgMTF2MmExMyAxMyAwIDAgMCAxMy0xM2gtMlptLS44Mi00LjE3Yy41MyAxLjI5LjgyIDIuNy44MiA0LjE3aDJjMC0xLjc0LS4zNC0zLjQtLjk3LTQuOTJsLTEuODUuNzVabTEuMzMuNTRhNy41IDcuNSAwIDAgMCA0LjQ5LTYuODdoLTJhNS41IDUuNSAwIDAgMS0zLjMgNS4wNGwuODEgMS44M1ptNC40OS02Ljg3YTcuNSA3LjUgMCAwIDAtNy41LTcuNXYyYTUuNSA1LjUgMCAwIDEgNS41IDUuNWgyWm0tNy41LTcuNWE3LjUgNy41IDAgMCAwLTcuMzUgNS45OWwxLjk2LjRhNS41IDUuNSAwIDAgMSA1LjM5LTQuMzl2LTJabS04LjUgN2MuNjcgMCAxLjMyLjA2IDEuOTYuMTdsLjM1LTEuOTdjLS43NS0uMTMtMS41Mi0uMi0yLjMxLS4ydjJabS01LjUxIDEuNDhjMS42Mi0uOTQgMy41LTEuNDggNS41MS0xLjQ4di0yYy0yLjM3IDAtNC42LjY0LTYuNTEgMS43NWwxIDEuNzNabS05LjQ5LTUuNDhhOSA5IDAgMCAxIDguMDkgNS4wNWwxLjgtLjg4YTExIDExIDAgMCAwLTkuODktNi4xN3YyWm0tNy44MyA0LjU2YTkgOSAwIDAgMSA3LjgzLTQuNTZ2LTJhMTEgMTEgMCAwIDAtOS41NyA1LjU3bDEuNzQgMVptLTUuMjEtMi4yOGE3IDcgMCAwIDEgMy41NSAyLjRsMS41OC0xLjIzYTkuMDEgOS4wMSAwIDAgMC00LjU3LTMuMWwtLjU2IDEuOTNabS4wNC01Ljc4YzAgMS41Ny0uMjUgMy4wOS0uNzEgNC41bDEuOS42M2MuNTMtMS42Mi44MS0zLjM0LjgxLTUuMTNoLTJabS0xNC41LTE0LjVjOCAwIDE0LjUgNi41IDE0LjUgMTQuNWgyYTE2LjUgMTYuNSAwIDAgMC0xNi41LTE2LjV2MlpNODYgMTU1LjcyYzAtOCA2LjUtMTQuNSAxNC41LTE0LjV2LTJhMTYuNSAxNi41IDAgMCAwLTE2LjUgMTYuNWgyWm0xNC41IDE0LjVjLTggMC0xNC41LTYuNS0xNC41LTE0LjVoLTJhMTYuNSAxNi41IDAgMCAwIDE2LjUgMTYuNXYtMlptNzkuNS04YTkgOSAwIDAgMCA5LTloLTJhNyA3IDAgMCAxLTcgN3YyWm0tMi44Ni0uNDdjLjkuMyAxLjg2LjQ3IDIuODYuNDd2LTJjLS43OCAwLTEuNTMtLjEzLTIuMjMtLjM2bC0uNjMgMS45Wm0tNy4xNCA1LjQ3YzMuODYgMCA3LjEtMi41NSA4LjQtNi4wN2wtMS44OC0uNjlhNy4wMyA3LjAzIDAgMCAxLTYuNTIgNC43NnYyWm0tOS05LjVjMCA1LjE5IDMuOTcgOS41IDkgOS41di0yYy0zLjgxIDAtNy0zLjMtNy03LjVoLTJabTktOS41Yy01LjAzIDAtOSA0LjMxLTkgOS41aDJjMC00LjIgMy4xOS03LjUgNy03LjV2LTJabTMuMTYuNmE4LjU2IDguNTYgMCAwIDAtMy4xNi0uNnYyYy44NSAwIDEuNjcuMTYgMi40Mi40NmwuNzQtMS44NlptNi44NC00LjZhOSA5IDAgMCAwLTguMTEgNS4xbDEuOC44N2E3IDcgMCAwIDEgNi4zMS0zLjk3di0yWm05IDlhOSA5IDAgMCAwLTktOXYyYTcgNyAwIDAgMSA3IDdoMlpcIixcbiAgICBmaWxsOiBcIiM0MTQ2NENcIixcbiAgICBtYXNrOiBcInVybCgjcGF0aC0xOS1pbnNpZGUtMSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0yMiAxMDguNzItNi02LTUgMTUuNSAyNiAyMC41IDMxLTQuNXYtMjEuNWwtMTIuNSA1LjUtMzMuNS05LjVaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnktbGlnaHQtZGVmYXVsdClcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm05NCAxNTMuNzItMjIuNS0xOC41djI4bDQyLjUgMjUuNSAyOS41LTEgNi41LTMuNSA2LTUuNSAzLTQuNSAyMS01LjUgOC41LTYuNSA1LTE0LjUtMzIuNSA4LjUtMiA0LTE1LjUgNS41LTE2IDctMzMuNS0xOVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeS1saWdodC1kZWZhdWx0KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTQ0Ljg3IDEwNS45MyA0MS42MSAyMC40OC0yNi4yIDE3LjA3TDE4LjY3IDEyM2wyNi4yLTE3LjA3WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTE5Ljc4IDEyMi44IDE0LjA5LTMxLjk1IDQyLjY3IDE4LjcyLTE2LjAzIDMzLjI4LTQwLjczLTIwLjA0WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIixcbiAgICBzdHJva2U6IFwiIzQxNDY0Q1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IDQ2LjY3MTgsXG4gICAgY3k6IDExNi4zNCxcbiAgICByOiA0LjM3OTc2LFxuICAgIGZpbGw6IFwiI0U2RThFQVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IDUyLjEzMTgsXG4gICAgY3k6IDExNS4yNixcbiAgICByOiAxLjA4MDAzLFxuICAgIGZpbGw6IFwiI0U2RThFQVwiXG4gIH0pKTtcbn1cbnZhciBJbGx1c3RyYXRpb25JZGxlX2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25JZGxlX2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsICJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19zcHJlYWRWYWx1ZXMoe1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgdmlld0JveDogXCIwIDAgMjAwIDIwMFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgcHJvcHMpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwOS41MyA1NC45MWE0MC40IDQwLjQgMCAxIDEgODAuOCAwdjExMy43aC04MC44VjU0LjkyWlwiLFxuICAgIGZpbGw6IFwiIzJFMzIzOFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMzUuOSA2MC4wOGMtNS45NC0uNjgtMTEuMyAzLjQyLTExLjk2IDkuMTZsLTIuMzkgMjAuNzdjLS42NiA1Ljc1IDMuNjMgMTAuOTYgOS41OCAxMS42NGwyNS44NSAyLjk3YzUuOTUuNjggMTEuMy0zLjQyIDExLjk3LTkuMTZsMi4zOC0yMC43N2MuNjYtNS43NS0zLjYzLTEwLjk2LTkuNTgtMTEuNjRsLTI1Ljg0LTIuOTdaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCIsXG4gICAgZmlsbE9wYWNpdHk6IDAuMlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwibTE1OC45NiA2Mi43MyAxLjUtMTEuNDFhOS40NyA5LjQ3IDAgMCAwLTE4Ljc2LTIuNDdsLTEuNTQgMTEuNzItNC4yNS0uNDlhMTEuNCAxMS40IDAgMCAwLTEuMjUtLjA3bDEuNTYtMTEuODhhMTQuOTggMTQuOTggMCAwIDEgMTYuOC0xMi45aC4wM2ExNC45OCAxNC45OCAwIDAgMSAxMi45IDE2LjgxbC0xLjU0IDExLjY1Yy0uODQtLjMxLTEuNzMtLjUzLTIuNjYtLjY0bC0yLjgtLjMyWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTQ4LjYyIDgwLjlhNC42NyA0LjY3IDAgMSAwLTMuMjktLjQzbC00LjE3IDcuNjNhMSAxIDAgMCAwIC43NSAxLjQ3bDcuNjUgMS4wMWExIDEgMCAwIDAgMS4xLTEuMjNsLTIuMDQtOC40NVpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTE4MC4zNyA5NS4yNGE1IDUgMCAxIDAgMC0xMCA1IDUgMCAwIDAgMCAxMFpcIixcbiAgICBmaWxsOiBcIiM2QjcwNzVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTg4LjQ3IDUyLjg3aC0uMDRsLS4wNC4wMmMtLjM3LjIzLS44My40Ny0xLjM2Ljc0bC0xLjA0LjU0Yy0uOTQuNS0xLjk4IDEuMTItMi45MyAxLjk1LTEuODggMS42My0zLjQgNC4wNS0zLjIgNy45MmEyMSAyMSAwIDAgMC04LjE0IDMuMjJjLTIuNzggMS45LTUuMDQgNC43NC01LjEzIDguNzR2LjA1bC4wNC4wNGM0LjI2IDUuMDEgMTguMSAxMi40MiAzOS41IDIuMzRsLjA4LS4wM3YtLjA5Yy4wMi0xLjctLjQtNC4zMy0xLjczLTYuN2E5LjkgOS45IDAgMCAwLTctNS4wOWMuMzgtMi4xNy40LTUuNC0uNzktOC4xN2E4Ljc1IDguNzUgMCAwIDAtMi44Ni0zLjcgOS44MyA5LjgzIDAgMCAwLTUuMzYtMS43OFpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMTIuMSAxODUuNmMtNy43MiAxLjgzLTE5Ljg0IDIuNC0yOS4wNiAxLjU0LTMuMTItLjI0LTkuNjUtMS4wNC0xMC43Ni0yLjM2LTEuMzgtMS42NC0zLjY4LTYuNzYtMy45NC0xMS45MS0uMjctNS4xNSAyLjAzLTIzLjA4IDMuNzYtMjcuNTEtMi40Mi0uNjgtOC4wOC0zLjEyLTEyLjEyLTUuMjUtMS45NC0xLjAyLTYuMi0zLjI4LTExLjMyLTYuMjguMjYgNi43MS4wNCAxMi45NS0xLjA4IDE4LjE0LTEuMjkgNS45Ny0zLjc1IDExLjMtNS44MiAxNi4wNi0xLjc1IDQuMDQtLjM1IDYuNDkgMy4yNyA5LjU5IDIuNTcgMi4yIDYuODkgMi45NSA5LjIyIDQuNC41Mi4zNSAxLjUxIDEuMjMgMS41MyAyLjE1LjAyLjUyLS44NyAxLTIuMTIgMS40LTEuNTMuNS0zLjU5Ljg3LTUuMTggMS4wNi05LjM3IDEuMS0yOS41NSAxLjY0LTM1Ljk3LTEuNzMtLjY1LS4zNC0xLjY4LTEuMDEtLjc4LTYuNSAxLjcxLTEwLjM3IDcuNjQtMjcuMjIgOC40Ni0zMi4wNiAxLjAzLTYuMDUtMS4xNi0xMS45Mi0yLjQyLTE2LjcyLTEuMjYtNC44LTMuNi0yMi42NyAwLTMyLjgyLjQ5LTEuMzkgMS4xLTIuODcgMS44MS00LjQyYTcxLjA4IDcxLjA4IDAgMCAxIDE3LjczLTIzLjNjLTEwLjMzLTcuMzctMjMuMTQtMTguMjgtMjQuMS0yOC0uOTYtOS43IDcuODYtMjAuNjIgMTYuMy0yMC4xNiA4LjY0LjQ2IDI5LjMzIDEyLjg4IDQzLjIyIDI4LjgzIDQuODEtNi45IDE0LjYzLTguNjQgMjAuNy01LjI4IDMuNTggMS45OC43MiA0LjUtLjUgNS4yNi0uOTcuNjItMTEuNzcgMTIuNDUtMTYuNzggMTcuNjUgNS41IDMuNDYgMTcuNzYgMTAgMjEuNDcgMTkuOTQgMS4zIDMuNDUgMS4zOCA0Ljk1IDEuNjMgOC4xLjU0IDYuODQgMi41NyAyMS41NSAyLjU3IDIzLjk1IDIuMzItMy4yOCA0LjctNS44MyA5LjM4LTEwLjY2IDQuNjktNC44MyA4LjQ5LTEyLjM5IDkuOTQtMTYuOTQgMS4zMy00LjIgMi04LjA5IDQuNDYtNy40NyAyLjM4LjYgMi4wNSAxMC41IDEuNDQgMTUuMzQgNC4yNS0uMzMgMTUuNi0uMjggMjIuNjkgMS42MyA3LjA4IDEuOSA4LjI0IDQuMzcgOC4xNCA0Ljk3LS4xLjYtMS4zNiAyLjUtMTAuMiAyLjIuMyAxLjAyLS4wNCAzLjE5LTMuODggMy43NSAyLjAzIDEuMjQgMi4yIDEuOTQgMi4xNiAyLjY3LS4wMy43My0uNDQgMi00LjkzIDIuNTguNjIuOTQgMS40NSAyLjM3LTIuNDMgMy42My0zLjg4IDEuMjYtOS42Mi4zNy05Ljk3LjM0LTEuODcgNi4yNy03LjIzIDE4LjczLTE1LjggMjQuODMtNS4zNiAzLjgxLTExLjkxIDMuOTUtMTQuMjIgMy45NS42NiAxMy42MS4yNSAyMC44NSAyLjIyIDI0LjQ3IDIuNzYgNS4wNSAyMC4zNSA4LjggMTEuMjggMTAuOTRaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIm03OC4xNSA2OC42MS0yLTEuMjNDNjkuNDUgNjMuMTcgNTguNTUgNTUuOCA0OC40OSA0OWwtOC45Mi02LjAyYy03LjEgNS42NC04LjQzIDE0LjgtOC44OSAyMS4wOCAyLjIzIDEuOCA0LjQ4IDMuNDggNi42MyA1LjAxYTcxLjA4IDcxLjA4IDAgMCAwLTE3LjczIDIzLjNjLTIuMjQgNC44NC0yLjggNi45OC0zLjQzIDEyIDAgNy44IDI1LjMxIDE0LjU0IDUwLjEgMS4xOS4wMy40IDYuMjYgMy44IDYuMjYgMy44bC4yMyA1LjQ5YzExLjg1IDAgMjQuMS01LjgyIDI3LjQtMTEuMTJsLS4xNS0xLjMzYy0uMjctMi40LS42My01LjU0LS43NC02Ljk4bC0uMDItLjI1Yy0uMjMtMy0uMzUtNC41LTEuNi03Ljg2Qzk0LjMgNzguNDUgODQuMiA3Mi4yOSA3OC4xNCA2OC42Wm0tNS43OCAyOC4zOC02LjEgOC41NyA2LjI0IDMuODJjLS4xNC00LS4xNC03LjY1LS4xNC0xMS42OFY5N1pcIixcbiAgICBmaWxsOiBcIiM2QjcwNzVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05OC42IDE1MC4xOWMuNjYgMTMuNjEuMjUgMjAuODUgMi4yMiAyNC40NyAyLjc2IDUuMDUgMjAuMzUgOC44IDExLjI4IDEwLjk0LTcuNzIgMS44My0xOS44NCAyLjQtMjkuMDYgMS41NC0zLjEyLS4yNC05LjY1LTEuMDQtMTAuNzYtMi4zNi0xLjM4LTEuNjQtMy42OC02Ljc2LTMuOTQtMTEuOTEtLjI3LTUuMTUgMi4wMy0yMy4wOCAzLjc2LTI3LjUxbTI2LjUgNC44M2MyLjMgMCA4Ljg2LS4xNCAxNC4yMi0zLjk1IDguNTgtNi4xIDEzLjkzLTE4LjU3IDE1LjgtMjQuODMuMzUuMDMgNi4wOS45MiA5Ljk3LS4zNCAzLjg4LTEuMjYgMy4wNS0yLjY5IDIuNDMtMy42M005OC42IDE1MC4xOWMtMi42NCAwLTEyLjIxLS40MS0xOS4zNi0xMC4wOGEzMC4zIDMwLjMgMCAwIDEtNC40LTguOTVjLTEuNDYtNS4xNC0yLjA3LTEzLjQ5LTIuMzItMjEuNzJtLS40MiAzNS45MmMxLjc0LTQuNDQgMy44OC0zLjM0IDQuNi0yLjY0LjcxLjY4IDEuNTggMi42MiAwIDMuMDYtMS42OC40Ny00LjA4LS4yOC00LjYtLjQyWm0wIDBjLTIuNDItLjY4LTguMDgtMy4xMi0xMi4xMi01LjI1LTEuOTQtMS4wMi02LjItMy4yOC0xMS4zMi02LjI4TTI4LjM0IDEyMC4xYzYuMjUgNS4xMSAxMy45NSAxMCAyMC4zMiAxMy43M20wIDBjLjI2IDYuNzEuMDQgMTIuOTUtMS4wOCAxOC4xNC0xLjI5IDUuOTctMy43NSAxMS4zLTUuODIgMTYuMDYtMS43NSA0LjA0LS4zNSA2LjQ5IDMuMjcgOS41OSAyLjU3IDIuMiA2Ljg5IDIuOTUgOS4yMiA0LjQuNTIuMzUgMS41MSAxLjIzIDEuNTMgMi4xNS4wMi41Mi0uODcgMS0yLjEyIDEuNG0tNS45LTEyMy44NmE2NSA2NSAwIDAgMC0xMC40NSA3LjM3bTE2LjM1IDExNi41Yy0xLjUzLjQ4LTMuNTkuODYtNS4xOCAxLjA1LTkuMzcgMS4xLTI5LjU1IDEuNjQtMzUuOTctMS43My0uNjUtLjM0LTEuNjgtMS4wMS0uNzgtNi41IDEuNzEtMTAuMzcgNy42NC0yNy4yMiA4LjQ2LTMyLjA2IDEuMDMtNi4wNS0xLjE2LTExLjkyLTIuNDItMTYuNzItMS4yNi00LjgtMy42LTIyLjY3IDAtMzIuODIuNDktMS4zOSAxLjEtMi44NyAxLjgxLTQuNDJhNzEuMDggNzEuMDggMCAwIDEgMTcuNzMtMjMuM20xNi4zNSAxMTYuNWMuMTYtMS45LTEuMzctNC4xLTQuNzMtMy44Mk0zNy4zIDY5LjA4Yy0xMC4zMy03LjM3LTIzLjE0LTE4LjI4LTI0LjEtMjgtLjk2LTkuNyA3Ljg2LTIwLjYyIDE2LjMtMjAuMTYgOC42NC40NiAyOS4zMyAxMi44OCA0My4yMiAyOC44MyA0LjgxLTYuOSAxNC42My04LjY0IDIwLjctNS4yOCAzLjU4IDEuOTguNzIgNC41LS41IDUuMjYtLjk3LjYyLTExLjc3IDEyLjQ1LTE2Ljc4IDE3LjY1bTAgMEM2NS43IDYwLjggNDQuOTggNDYuNTQgMzMuMiAzOC43M200Mi45NSAyOC42NWM1LjUgMy40NiAxNy43NiAxMCAyMS40NyAxOS45NCAxLjMgMy40NSAxLjM4IDQuOTUgMS42MyA4LjEuNTQgNi44NCAyLjU3IDIxLjU1IDIuNTcgMjMuOTVtMCAwYzAgMS44NS43NyA4LjAzLTEuODcgOC4wMy0yLjQ0IDAtLjQtNC45MyAxLjg3LTguMDNabTAgMGMyLjMyLTMuMjggNC43LTUuODMgOS4zOC0xMC42NiA0LjY5LTQuODMgOC40OS0xMi4zOSA5Ljk0LTE2Ljk0IDEuMzMtNC4yIDItOC4wOSA0LjQ2LTcuNDcgMi4zOC42IDIuMDUgMTAuNSAxLjQ0IDE1LjM0bTAgMC0yLjY2LjI2bTIuNjYtLjI2YzQuMjUtLjMzIDE1LjYtLjI4IDIyLjY5IDEuNjMgNy4wOCAxLjkgOC4yNCA0LjM3IDguMTQgNC45Ny0uMS42LTEuMzYgMi41LTEwLjIgMi4ybTAgMGMtNy42Mi0uMjUtMTAuNjYtMS41Ni0xMC43Ni0yLjExLS4xLS41NSAyLjgyLTEuMSA1LjM4LS42IDIuNTcuNSA1LjAzIDEuMzYgNS4zOCAyLjcyWm0wIDBjLjMgMS4wMi0uMDQgMy4xOS0zLjg4IDMuNzVtMCAwYy00LjguNy01LjYzLjI4LTUuNjcgMC0uMDMtLjI5IDMuOTgtLjgzIDUuNjcgMFptMCAwYzIuMDMgMS4yNCAyLjIgMS45NCAyLjE2IDIuNjctLjAzLjczLS40NCAyLTQuOTMgMi41OG0wIDBjLTQuNDkuNTctNC41OS0uNjMtMy4zMy0uODggMS4yNi0uMjQgMi45Ny40MSAzLjMzLjg4Wk03Mi4zOCA4OS41OCA3Mi4zNiA5N20wIDAtNi4xIDguNTcgNi4yNiAzLjg3TTcyLjM2IDk3YzAgMy44LjAzIDguMS4xNiAxMi40NFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk03Mi4yMyA5Ny4xMXYtN2wtLjMuMzNhMTIuNjQgMTIuNjQgMCAwIDAtMi45OCAxMC4yNGwuMTQuODcgMy4xNC00LjQ0WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQ4LjYyIDE0OC4xNGMtLjg3LTkuNy0xMS4xNS0xNC44Mi0xOC42OC0yNi4yNSA3LjQ1IDUuMTQgMTMuODUgOC42IDE5LjIxIDExLjczIDAgMC0uMDggOS40OS0uNTMgMTQuNTJaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTcuMSA1NmE4LjY0IDguNjQgMCAwIDEtNy45NCA5LjI5Yy00LjguNDItOS0zLjEtOS40MS03Ljc5YTguNjQgOC42NCAwIDAgMSA3Ljk0LTkuMjljNC44LS40MSA5IDMuMSA5LjQxIDcuOFpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiLFxuICAgIHN0cm9rZVdpZHRoOiAzXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNOTEuMyA1NC4xNWEuNDEuNDEgMCAwIDAtLjU4LS4wNyA4LjE0IDguMTQgMCAwIDEtMyAxLjQ0LjQxLjQxIDAgMCAwIC4xNi44MWMuNi0uMTIgMi4wOS0uNiAzLjM1LTEuNi4xOC0uMTQuMjEtLjQuMDctLjU4Wm0tMS43OCAzLjY4YS44MS44MSAwIDEgMSAxLjU3LS40NC44MS44MSAwIDAgMS0xLjU3LjQ0Wm02LjIzLTIuMTZhLjgxLjgxIDAgMSAwIC40NCAxLjU2LjgxLjgxIDAgMCAwLS40NC0xLjU2WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNzYuODIgNDguMDVhNS4zMiA1LjMyIDAgMSAwIDEuMzctMTAuNTUgNS4zMiA1LjMyIDAgMCAwLTEuMzcgMTAuNTVabTEwLjY4LTEuNGMtMy4zOS4zLTYuMjYgMi4xNi03LjkyIDQuODFsLTEuMDYtLjEyYy0uMzYtLjA0LS43NC0uMS0xLjE2LS4xM2ExNS44OCAxNS44OCAwIDAgMC0zLjUyLS4wM2MtMi40Ny4yOS01LjA5IDEuNDQtNy4xIDQuNzYtNC4wNS0xLjg2LTEwLjUzLS45LTE1LjA4IDUuNTJsLS4wNS4wNy4wMy4wN2M0LjA0IDguODMgMTEuOTMgMTguOCAyOC43OCAyMWguMDhsLjA1LS4wNmMuOTctMS40IDIuMDktMy44MSAyLjMyLTYuNTFhOS45IDkuOSAwIDAgMC0yLjkzLTguMTQgMTUuMyAxNS4zIDAgMCAwIDMuOTMtNy4yMiA4Ljc1IDguNzUgMCAwIDAtLjMyLTQuNzhjMS40Ni0uMDEgMy4yMi0uNzUgNC43NC0xLjlhOS44IDkuOCAwIDAgMCAzLjM3LTQuMzQgOC42NyA4LjY3IDAgMCAwIDUuNDIgMi4wM2guMjVsLS4xMy0uMmExMC4zNiAxMC4zNiAwIDAgMC05LjctNC44M1pcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiA4MC42ODg3LFxuICAgIGN5OiA2MS45NTUzLFxuICAgIHI6IDYuMTgyMyxcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKC00LjkzODQ1IDgwLjY4ODcgNjEuOTU1MylcIixcbiAgICBzdHJva2U6IFwiIzZCNzA3NVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3NC4wMiAxMDZjLS41IDEuOC0yLjcgNS43My03LjQ3IDcuMDVcIixcbiAgICBzdHJva2U6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xODEuMjEgMTEwLjI0Yy0uODcgMi44OC00LjU0IDkuMTQtMTIuMjcgMTEuMTNcIixcbiAgICBzdHJva2U6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIlxuICB9KSk7XG59XG52YXIgSWxsdXN0cmF0aW9uTm9BY2Nlc3NEYXJrX2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25Ob0FjY2Vzc0RhcmtfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwgInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX3NwcmVhZFZhbHVlcyh7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB2aWV3Qm94OiBcIjAgMCAyMDAgMjAwXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICBmaWxsOiBcInRyYW5zcGFyZW50XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA5LjUzIDU0LjkxYTQwLjQgNDAuNCAwIDEgMSA4MC44IDB2MTEzLjdoLTgwLjhWNTQuOTJaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNDUuNSA5Mi42MmE5LjQ3IDkuNDcgMCAwIDAgMTAuNi04LjE2bDQuMzYtMzMuMTRhOS40NyA5LjQ3IDAgMSAwLTE4Ljc2LTIuNDdsLTQuMzYgMzMuMTRhOS40NyA5LjQ3IDAgMCAwIDguMTUgMTAuNjNabTcuNTItNTcuMzloLjAyYTE0Ljk4IDE0Ljk4IDAgMCAxIDEyLjkgMTYuODFsLTQuMzYgMzMuMTRhMTQuOTggMTQuOTggMCAwIDEtMTYuOCAxMi45aC0uMDJhMTQuOTggMTQuOTggMCAwIDEtMTIuOS0xNi44bDQuMzYtMzMuMTVhMTQuOTggMTQuOTggMCAwIDEgMTYuOC0xMi45WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTM1LjkgNjAuMDhjLTUuOTQtLjY4LTExLjMgMy40Mi0xMS45NiA5LjE2bC0yLjM5IDIwLjc3Yy0uNjYgNS43NSAzLjYzIDEwLjk2IDkuNTggMTEuNjRsMjUuODUgMi45N2M1Ljk1LjY4IDExLjMtMy40MiAxMS45Ny05LjE2bDIuMzgtMjAuNzdjLjY2LTUuNzUtMy42My0xMC45Ni05LjU4LTExLjY0bC0yNS44NC0yLjk3WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5LWxpZ2h0LWRlZmF1bHQpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNDguNjIgODAuOWE0LjY3IDQuNjcgMCAxIDAtMy4yOS0uNDNsLTQuMTcgNy42M2ExIDEgMCAwIDAgLjc1IDEuNDdsNy42NSAxLjAxYTEgMSAwIDAgMCAxLjEtMS4yM2wtMi4wNC04LjQ1WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTgwLjM3IDk1LjI0YTUgNSAwIDEgMCAwLTEwIDUgNSAwIDAgMCAwIDEwWlwiLFxuICAgIGZpbGw6IFwiI0U2RThFQVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNODguNDcgNTIuODdoLS4wNGwtLjA0LjAyYy0uMzcuMjMtLjgzLjQ3LTEuMzYuNzRsLTEuMDQuNTRjLS45NC41LTEuOTggMS4xMi0yLjkzIDEuOTUtMS44OCAxLjYzLTMuNCA0LjA1LTMuMiA3LjkyLTIuMi4zNS01LjQyIDEuMzQtOC4xNCAzLjIyLTIuNzggMS45LTUuMDQgNC43NC01LjEzIDguNzR2LjA1bC4wNC4wNGM0LjI2IDUuMDEgMTguMSAxMi40MiAzOS41IDIuMzRsLjA4LS4wM3YtLjA5Yy4wMi0xLjctLjQtNC4zMy0xLjczLTYuN2E5LjkgOS45IDAgMCAwLTctNS4wOWMuMzgtMi4xNy40LTUuNC0uNzktOC4xN2E4Ljc1IDguNzUgMCAwIDAtMi44Ni0zLjcgOS44MyA5LjgzIDAgMCAwLTUuMzYtMS43OFpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0zMy4yMiAzOC43M0M0Ni42IDQ3Ljc1IDY3LjI4IDYxLjY4IDc1LjI4IDY2LjhcIixcbiAgICBzdHJva2U6IFwiI0VFMkYyRlwiLFxuICAgIHN0cm9rZVdpZHRoOiAzXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExMi4xIDE4NS42Yy03LjcyIDEuODMtMTkuODQgMi40LTI5LjA2IDEuNTQtMy4xMy0uMjQtOS42NS0xLjA0LTEwLjc2LTIuMzYtMS4zOC0xLjY0LTMuNjgtNi43Ni0zLjk0LTExLjkxLS4yNy01LjE1IDIuMDMtMjMuMDggMy43Ni0yNy41MS0yLjQyLS42OC04LjA4LTMuMTItMTIuMTItNS4yNWEyODkuOCAyODkuOCAwIDAgMS0xMS4zMi02LjI4Yy4yNSA2LjcxLjA0IDEyLjk1LTEuMDggMTguMTQtMS4yOSA1Ljk3LTMuNzUgMTEuMy01LjgyIDE2LjA2LTEuNzUgNC4wNC0uMzUgNi40OSAzLjI3IDkuNTkgMi41NyAyLjIgNi44OSAyLjk1IDkuMjIgNC40LjUyLjM1IDEuNTEgMS4yMyAxLjUzIDIuMTUuMDIuNTItLjg3IDEtMi4xMiAxLjQtMS41My41LTMuNTkuODctNS4xOCAxLjA2LTkuMzcgMS4xLTI5LjU1IDEuNjQtMzUuOTctMS43My0uNjUtLjM0LTEuNjgtMS4wMS0uNzgtNi41IDEuNzEtMTAuMzcgNy42NC0yNy4yMiA4LjQ2LTMyLjA2IDEuMDItNi4wNS0xLjE2LTExLjkyLTIuNDItMTYuNzItMS4yNi00LjgtMy42LTIyLjY3IDAtMzIuODIuNDktMS4zOSAxLjEtMi44NyAxLjgxLTQuNDJhNzEuMDggNzEuMDggMCAwIDEgMTcuNzMtMjMuM2MtMTAuMzMtNy4zNy0yMy4xNC0xOC4yOC0yNC4xLTI4LS45Ni05LjcgNy44NS0yMC42MiAxNi4zLTIwLjE2IDguNjQuNDYgMjkuMzMgMTIuODggNDMuMjIgMjguODMgNC44MS02LjkgMTQuNjMtOC42NCAyMC43LTUuMjggMy41OCAxLjk4LjcyIDQuNS0uNSA1LjI2LS45Ny42Mi0xMS43NyAxMi40NS0xNi43OCAxNy42NSA1LjUgMy40NiAxNy43NiAxMCAyMS40NyAxOS45NCAxLjMgMy40NSAxLjM4IDQuOTUgMS42MyA4LjEuNTQgNi44NCAyLjU3IDIxLjU1IDIuNTcgMjMuOTUgMi4zMi0zLjI4IDQuNy01LjgzIDkuMzgtMTAuNjYgNC42OS00LjgzIDguNDktMTIuMzkgOS45NC0xNi45NCAxLjMzLTQuMiAyLTguMDkgNC40Ni03LjQ3IDIuMzguNiAyLjA1IDEwLjUgMS40NCAxNS4zNCA0LjI1LS4zMyAxNS42LS4yOCAyMi42OSAxLjYzIDcuMDggMS45IDguMjQgNC4zNyA4LjE0IDQuOTctLjEuNi0xLjM2IDIuNS0xMC4yIDIuMi4zIDEuMDItLjA0IDMuMTktMy44OCAzLjc1IDIuMDMgMS4yNCAyLjIgMS45NCAyLjE2IDIuNjctLjAzLjczLS40NCAyLTQuOTMgMi41OC42Mi45NCAxLjQ1IDIuMzctMi40MyAzLjYzLTMuODkgMS4yNi05LjYyLjM3LTkuOTcuMzQtMS44NyA2LjI3LTcuMjMgMTguNzMtMTUuOCAyNC44My01LjM2IDMuODEtMTEuOTEgMy45NS0xNC4yMiAzLjk1LjY2IDEzLjYxLjI1IDIwLjg1IDIuMjIgMjQuNDcgMi43NiA1LjA1IDIwLjM1IDguOCAxMS4yOCAxMC45NFpcIixcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIm03OC4xNSA2OC42MS0yLTEuMjNDNjkuNDUgNjMuMTcgNTguNTUgNTUuOCA0OC40OSA0OWwtOC45Mi02LjAyYy03LjEgNS42NC04LjQzIDE0LjgtOC44OSAyMS4wOCAyLjIzIDEuOCA0LjQ4IDMuNDggNi42MyA1LjAxYTcxLjA4IDcxLjA4IDAgMCAwLTE3LjczIDIzLjNjLTIuMjQgNC44NC0yLjggNi45OC0zLjQzIDEyIDAgNy44IDI1LjMxIDE0LjU0IDUwLjEgMS4xOS4wMy40IDYuMjYgMy44IDYuMjYgMy44bC4yMyA1LjQ5YzExLjg0IDAgMjQuMS01LjgyIDI3LjQtMTEuMTJsLS4xNS0xLjMzYy0uMjctMi40LS42My01LjU0LS43NC02Ljk4bC0uMDItLjI1Yy0uMjMtMy0uMzUtNC41LTEuNi03Ljg2Qzk0LjMgNzguNDUgODQuMiA3Mi4yOSA3OC4xNCA2OC42Wm0tNS43OCAyOC4zOC02LjEgOC41NyA2LjI0IDMuODJjLS4xNC00LS4xNC03LjY1LS4xNC0xMS42OFY5N1pcIixcbiAgICBmaWxsOiBcIiNFNkU4RUFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05OC42IDE1MC4xOWMuNjYgMTMuNjEuMjUgMjAuODUgMi4yMiAyNC40NyAyLjc2IDUuMDUgMjAuMzUgOC44IDExLjI4IDEwLjk0LTcuNzIgMS44My0xOS44NCAyLjQtMjkuMDYgMS41NC0zLjEzLS4yNC05LjY1LTEuMDQtMTAuNzYtMi4zNi0xLjM4LTEuNjQtMy42OC02Ljc2LTMuOTQtMTEuOTEtLjI3LTUuMTUgMi4wMy0yMy4wOCAzLjc2LTI3LjUxbTI2LjUgNC44M2MyLjMgMCA4Ljg2LS4xNCAxNC4yMi0zLjk1IDguNTgtNi4xIDEzLjkzLTE4LjU3IDE1LjgtMjQuODMuMzUuMDMgNi4wOC45MiA5Ljk3LS4zNCAzLjg4LTEuMjYgMy4wNS0yLjY5IDIuNDMtMy42M005OC42IDE1MC4xOWMtMi42NCAwLTEyLjIxLS40MS0xOS4zNi0xMC4wOGEzMC4zIDMwLjMgMCAwIDEtNC40LTguOTVjLTEuNDctNS4xNC0yLjA3LTEzLjQ5LTIuMzItMjEuNzJtLS40MiAzNS45MmMxLjc0LTQuNDQgMy44OC0zLjM0IDQuNi0yLjY0LjcxLjY4IDEuNTggMi42MiAwIDMuMDYtMS42OC40Ny00LjA4LS4yOC00LjYtLjQyWm0wIDBjLTIuNDItLjY4LTguMDgtMy4xMi0xMi4xMi01LjI1YTI4OS44IDI4OS44IDAgMCAxLTExLjMyLTYuMjhNMjguMzQgMTIwLjFjNi4yNSA1LjExIDEzLjk1IDEwIDIwLjMyIDEzLjczbTAgMGMuMjUgNi43MS4wNCAxMi45NS0xLjA4IDE4LjE0LTEuMjkgNS45Ny0zLjc1IDExLjMtNS44MiAxNi4wNi0xLjc1IDQuMDQtLjM1IDYuNDkgMy4yNyA5LjU5IDIuNTcgMi4yIDYuODkgMi45NSA5LjIyIDQuNC41Mi4zNSAxLjUxIDEuMjMgMS41MyAyLjE1LjAyLjUyLS44NyAxLTIuMTIgMS40bS01LjktMTIzLjg2YTY1LjAxIDY1LjAxIDAgMCAwLTEwLjQ1IDcuMzdtMTYuMzUgMTE2LjVjLTEuNTMuNDgtMy41OS44Ni01LjE4IDEuMDUtOS4zNyAxLjEtMjkuNTUgMS42NC0zNS45Ny0xLjczLS42NS0uMzQtMS42OC0xLjAxLS43OC02LjUgMS43MS0xMC4zNyA3LjY0LTI3LjIyIDguNDYtMzIuMDYgMS4wMi02LjA1LTEuMTYtMTEuOTItMi40Mi0xNi43Mi0xLjI2LTQuOC0zLjYtMjIuNjcgMC0zMi44Mi40OS0xLjM5IDEuMS0yLjg3IDEuODEtNC40MmE3MS4wOCA3MS4wOCAwIDAgMSAxNy43My0yMy4zbTE2LjM1IDExNi41Yy4xNi0xLjktMS4zNy00LjEtNC43My0zLjgyTTM3LjMgNjkuMDhjLTEwLjMzLTcuMzctMjMuMTQtMTguMjgtMjQuMS0yOC0uOTYtOS43IDcuODUtMjAuNjIgMTYuMy0yMC4xNiA4LjY0LjQ2IDI5LjMzIDEyLjg4IDQzLjIyIDI4LjgzIDQuODEtNi45IDE0LjYzLTguNjQgMjAuNy01LjI4IDMuNTggMS45OC43MiA0LjUtLjUgNS4yNi0uOTcuNjItMTEuNzcgMTIuNDUtMTYuNzggMTcuNjVtMCAwQzY1LjcgNjAuOCA0NC45OCA0Ni41NCAzMy4yIDM4LjczbTQyLjk1IDI4LjY1YzUuNSAzLjQ2IDE3Ljc2IDEwIDIxLjQ3IDE5Ljk0IDEuMyAzLjQ1IDEuMzggNC45NSAxLjYzIDguMS41NCA2Ljg0IDIuNTcgMjEuNTUgMi41NyAyMy45NW0wIDBjMCAxLjg1Ljc3IDguMDMtMS44NyA4LjAzLTIuNDQgMC0uNC00LjkzIDEuODctOC4wM1ptMCAwYzIuMzItMy4yOCA0LjctNS44MyA5LjM4LTEwLjY2IDQuNjktNC44MyA4LjQ5LTEyLjM5IDkuOTQtMTYuOTQgMS4zMy00LjIgMi04LjA5IDQuNDYtNy40NyAyLjM4LjYgMi4wNSAxMC41IDEuNDQgMTUuMzRtMCAwLTIuNjYuMjZtMi42Ni0uMjZjNC4yNS0uMzMgMTUuNi0uMjggMjIuNjkgMS42MyA3LjA4IDEuOSA4LjI0IDQuMzcgOC4xNCA0Ljk3LS4xLjYtMS4zNiAyLjUtMTAuMiAyLjJtMCAwYy03LjYyLS4yNS0xMC42Ni0xLjU2LTEwLjc2LTIuMTEtLjEtLjU1IDIuODItMS4xIDUuMzgtLjYgMi41Ni41IDUuMDMgMS4zNiA1LjM4IDIuNzJabTAgMGMuMyAxLjAyLS4wNCAzLjE5LTMuODggMy43NW0wIDBjLTQuOC43LTUuNjMuMjgtNS42NyAwLS4wMy0uMjkgMy45OC0uODMgNS42NyAwWm0wIDBjMi4wMyAxLjI0IDIuMiAxLjk0IDIuMTYgMi42Ny0uMDMuNzMtLjQ0IDItNC45MyAyLjU4bTAgMGMtNC40OS41Ny00LjU5LS42My0zLjMzLS44OCAxLjI2LS4yNCAyLjk3LjQxIDMuMzMuODhaTTcyLjM4IDg5LjU4IDcyLjM2IDk3bTAgMC02LjEgOC41NyA2LjI2IDMuODdNNzIuMzYgOTdjMCAzLjguMDMgOC4xLjE2IDEyLjQ0XCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTcyLjIzIDk3LjExdi03bC0uMy4zM2ExMi42NCAxMi42NCAwIDAgMC0yLjk4IDEwLjI0bC4xNC44NyAzLjE0LTQuNDRaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNDguNjIgMTQ4LjE0Yy0uODctOS43LTExLjE1LTE0LjgyLTE4LjY4LTI2LjI1IDcuNDUgNS4xNCAxMy44NSA4LjYgMTkuMjEgMTEuNzMgMCAwLS4wOCA5LjQ5LS41MyAxNC41MlpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05Ny4xIDU2YTguNjQgOC42NCAwIDAgMS03Ljk0IDkuMjljLTQuOC40Mi05LTMuMS05LjQxLTcuNzlhOC42NCA4LjY0IDAgMCAxIDcuOTQtOS4yOWM0LjgtLjQxIDkgMy4xIDkuNDEgNy44WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiLFxuICAgIHN0cm9rZVdpZHRoOiAzXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNOTEuMyA1NC4xNWEuNDEuNDEgMCAwIDAtLjU4LS4wNyA4LjE0IDguMTQgMCAwIDEtMyAxLjQ0LjQxLjQxIDAgMSAwIC4xNi44Yy42LS4xMSAyLjA5LS42IDMuMzUtMS41OS4xOC0uMTQuMjEtLjQuMDctLjU4Wm0tMS43OCAzLjY4YS44MS44MSAwIDEgMSAxLjU3LS40NC44MS44MSAwIDAgMS0xLjU3LjQ0Wm02LjIzLTIuMTZhLjgxLjgxIDAgMSAwIC40NCAxLjU2LjgxLjgxIDAgMCAwLS40NC0xLjU2WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNzYuODIgNDguMDVhNS4zMiA1LjMyIDAgMSAwIDEuMzctMTAuNTUgNS4zMiA1LjMyIDAgMCAwLTEuMzcgMTAuNTVabTEwLjY4LTEuNGMtMy4zOS4zLTYuMjYgMi4xNi03LjkyIDQuODFsLTEuMDYtLjEyYy0uMzYtLjA0LS43NC0uMS0xLjE2LS4xM2ExNS44OCAxNS44OCAwIDAgMC0zLjUyLS4wM2MtMi40Ny4yOS01LjA5IDEuNDQtNy4xIDQuNzYtNC4wNS0xLjg2LTEwLjUzLS45LTE1LjA4IDUuNTJsLS4wNS4wNy4wMy4wN2M0LjA0IDguODMgMTEuOTMgMTguOCAyOC43OCAyMWguMDhsLjA1LS4wNmMuOTctMS40IDIuMDktMy44MSAyLjMyLTYuNTFhOS45IDkuOSAwIDAgMC0yLjkzLTguMTQgMTUuMyAxNS4zIDAgMCAwIDMuOTMtNy4yMiA4Ljc1IDguNzUgMCAwIDAtLjMyLTQuNzhjMS40Ni0uMDEgMy4yMi0uNzUgNC43NC0xLjlhOS44IDkuOCAwIDAgMCAzLjM3LTQuMzQgOC42NyA4LjY3IDAgMCAwIDUuNDIgMi4wM2guMjVsLS4xMy0uMmExMC4zNiAxMC4zNiAwIDAgMC05LjctNC44M1pcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiA4MC42ODg2LFxuICAgIGN5OiA2MS45NTQ4LFxuICAgIHI6IDYuMTgyMyxcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKC00LjkzODQ1IDgwLjY4ODYgNjEuOTU0OClcIixcbiAgICBzdHJva2U6IFwiI0M2Q0FDRFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE3NC4wMiAxMDZjLS41IDEuOC0yLjcgNS43My03LjQ3IDcuMDVcIixcbiAgICBzdHJva2U6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xODEuMjEgMTEwLjI0Yy0uODcgMi44OC00LjU0IDkuMTQtMTIuMjcgMTEuMTNcIixcbiAgICBzdHJva2U6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIlxuICB9KSk7XG59XG52YXIgSWxsdXN0cmF0aW9uTm9BY2Nlc3NfZGVmYXVsdCA9IFN2Z0NvbXBvbmVudDtcbmV4cG9ydCB7XG4gIElsbHVzdHJhdGlvbk5vQWNjZXNzX2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsICJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19zcHJlYWRWYWx1ZXMoe1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgdmlld0JveDogXCIwIDAgMjAwIDIwMFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgcHJvcHMpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTIzLjE3IDExNC42Ni0uMi0uMTgtMzQuNiAyNy4xLjQ2LS4wNGMxMC4wMy0uOSAxNi43MS0uMzggMTguNzkgMGwuMS4wMiAxNS40NS0yNi45WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDY3LjcwNixcbiAgICB5OiA3My44NzEsXG4gICAgd2lkdGg6IDU1LjYzMzMsXG4gICAgaGVpZ2h0OiAzOS44MDA0LFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJtNDkuOTcgMTM2LjUgMTcuNy0yMi40NGg1NS40NGwtMTcuNyAyMi40NUg0OS45N1pcIixcbiAgICBmaWxsOiBcIiM4ODhEOTJcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTAxLjY3IDc4LjU3SDc1Ljc1djIxLjQ1aDE4Ljc3djYuMjVoMTQuNnYtMTMuN2gtNy40NXYtMTRaXCIsXG4gICAgZmlsbDogXCIjODg4RDkyXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk03Ni42NiA3OS40M2gyNC4yNnYxMy4xNGgtNi40djYuNjVINzYuNjZ2LTE5LjhabTE3Ljg2IDIwLjYySDc1Ljc0Vjc4LjZoMjYuMDF2MTMuOTdoNy4zNnYxMy43aC0xNC42di02LjIyWm03LjIzLTYuNjVoNi41NHYxMi4wNUg5NS4zNHYtNS40aDYuNDFWOTMuNFptLS44MyAwdjUuODJoLTUuNThWOTMuNGg1LjU4WlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTQzLjI5IDE3NC44OWgtOS43OGM0LjE5LTEuMjIgNC4wNC0xMS45OSAzLjQ0LTE3LjIyLjg5IDUuNzMgNC42IDEzLjg3IDYuMzQgMTcuMjJaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03NS45MyA0MC41OWEzMi43OCAzMi43OCAwIDEgMS02NS41NiAwIDMyLjc4IDMyLjc4IDAgMCAxIDY1LjU2IDBaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCIsXG4gICAgZmlsbE9wYWNpdHk6IDAuMlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTQ3LjU2IDI1LjEyYTQuNCA0LjQgMCAwIDAtOC44MiAwdjExLjA2SDI3LjY4YTQuNCA0LjQgMCAwIDAgMCA4LjgyaDExLjA2djExLjA2YTQuNCA0LjQgMCAwIDAgOC44MiAwVjQ1aDExLjA2YTQuNCA0LjQgMCAxIDAgMC04LjgySDQ3LjU2VjI1LjEyWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTYzLjgyIDgzLjMzQzU5LjMgODEuNSA1MC4zIDc1LjM3IDUwLjQ0IDY1LjU0XCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01Mi41OSAxMTAuMjNjMi44OC4xIDYuNS45MSA5Ljk3IDQuODggMi40OCAyLjg0IDQuNjcgNy4yMSA3LjQ1IDE0LjVhNzMuNSA3My41IDAgMCAxIDQuMjctMTYuMzJjMS4yLTMuMDcgNS4yOS0xMC4yNSA5LjM1LTEwLjUyIDQuMDYtLjI2IDQuNDcgMy41NyAyLjU3IDQuNjUtMS45IDEuMDgtMyAuOTYtNC44IDMuNDEtMS43NyAyLjQ2LTIuOTUgNC45NS0yIDExLjM0LjcyLTIuOTQgMS43Ni00LjU5IDIuNzctNS43IDEtMS4xMyA4LjgtOC4wNyAxNC4zNi04LjM2IDMuODYtLjIgNS4yLjcgNC43OCAxLjczYTkuMjcgOS4yNyAwIDAgMSA0LjA4LS4zMmMyLjA4LjQgMi43OCAxLjkgMS44MyAzLjE3IDIuMTktLjE2IDQuMjguMjMgNS4zNiAxLjg0LjMzLjQ5LjI0IDEuNjQtLjU2IDIuNTktLjc3LjkxLTIuMjUgMS42My0yLjgzIDEuOTQtMS4yLjYzLTUuOTQgMy43Mi03LjM1IDguMS0xLjQxIDQuNC0yLjczIDcuNDcgMy40NiAyMC44MyA0LjcxIDEwLjE2IDUuNjQgMjEuMzMgMS44NyAyOS42IDguOTYtLjI3IDE2Ljg5LTIuMTQgMjIuMDItNS4wNCA0LjM5LTIuNDggOC4yNy01LjUgMTAuMzktMTAuNS0yLjMzLTE5LjY2LTIuMjctNTcuMjYuOTEtNTcuNDMgNC41LS4yMyAxLjczIDQ4IDAgNTQuN2ExOS41IDE5LjUgMCAwIDEtLjkxIDIuNzJjLjY3IDUuNjcgMS41NCA5Ljg0IDIuNTkgMTEuMiAxLjcgMi4xOSA0MC40NCA0Ljc2IDUwLjIgMS41OSAxLjI4LS40MSAyLjA3LS45MyAyLjItMS41NSAxLjAyLTQuNTQtMTQuNzktOC4yNi0yMC44Ny0xMy45Ni00LjE5LTMuOTEtMi43Ny0zMi40Mi00Ljk3LTUwLjQ1LTIuMi0xOC4wNC03LjktMzYuNDgtMjUuMjYtNDAuNzEtMTMuNjItMy4zMy0yNC45OCAxLjczLTMwLjE0IDUuNjRIODUuNjJjMi43MS01LjYgMTAuNDYtMTYuMDYgMjYuNC0xOS4xOCAxOS4yNi0zLjc4IDM2LjE4IDUuMTkgNDYuOTYgMTcuNDYgNC45NSA1LjI1IDcuNzUgOC43MSA5LjIzIDguNzEgMS40OCAwIDkuMjItNC42OCAxNy42LTUuMjIgMi41LS4xNiAyLjQ2IDIuNjQgMS4xOSA2LjhhMzAuOSAzMC45IDAgMCAxLTIuMDkgNS4wN2MtMi40NCA0Ljk0LTcuODMgMTQuMy0xNi4xOCAyMS40MiAyLjIgMTguMDQuNzggNDYuNTUgNC45NyA1MC40NiA2LjA4IDUuNyAyMS44OSA5LjQyIDIwLjg4IDEzLjk2LS4xNC42Mi0uOTMgMS4xNC0yLjIgMS41NS05Ljc3IDMuMTctNDguNTEuNi01MC4yMS0xLjU5LTEuMDUtMS4zNi0xLjkyLTUuNTMtMi42LTExLjItMi4xIDUuMDItNS45OSA4LjAzLTEwLjM4IDEwLjUxLTUuMTMgMi45LTEzLjA2IDQuNzctMjIuMDIgNS4wNWEyMC40IDIwLjQgMCAwIDEtNS4wMSA2Ljg3Yy05IDcuOTgtMjguOTkgMTEuNjctNDcuNzcgMS42Ny05LjU3LTUuMDgtMTQuNzItMTcuNjItMTcuNS0zMC4xN3YuMDZjLjg1IDguOTIgMS4zNCAxNC4xMy0yLjE4IDE4LjUyYTQ5LjkgNDkuOSAwIDAgMS0xOS41OC0xLjkyYy01LjIyLTEuNjEtMTIuOTEtOC4zMS04LjM4LTIyLjYxIDQuNTQtMTQuMyAyNy45OC0zMi43OCAzMC4xNC0zNC4yMSAyLjE1LTEuNDQgNy45Ni01LjU4IDE1LjctNS41OFpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk03MC4wMSAxMjkuNjFjLTEuNzggMTAuNy4xNCAyOC4wNyAzLjMzIDI3LjI5IDEtLjI1IDEuNTctMS41OCAxLjY3LTMuOSA3LjE2LjM0IDI3Ljc3IDcuOTkgMzQuNDcgMTEuOC4xNSA0LjYyLS41OSA5LjAxLTIuMzEgMTIuOGEyMC4zOCAyMC4zOCAwIDAgMS01LjAxIDYuODdjLTkgNy45OC0yOC45OSAxMS42Ny00Ny43NyAxLjY3LTkuNTctNS4wOS0xNC43Mi0xNy42Mi0xNy41LTMwLjE3di4wNmMuODUgOC45MiAxLjM0IDE0LjEzLTIuMTggMTguNTJhNDkuOSA0OS45IDAgMCAxLTE5LjU4LTEuOTJjLTUuMjItMS42MS0xMi45MS04LjMxLTguMzgtMjIuNjEgNC41NC0xNC4zIDI3Ljk4LTMyLjc4IDMwLjE0LTM0LjIxIDIuMTUtMS40NCA3Ljk2LTUuNTggMTUuNy01LjU4IDIuODguMSA2LjUuOTEgOS45NyA0Ljg4IDIuNDggMi44NCA0LjY3IDcuMjEgNy40NSAxNC41WlwiLFxuICAgIGZpbGw6IFwiIzg4OEQ5MlwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwNS4zIDE0OGM0LjcxIDEwLjE1IDUuNjQgMjEuMzIgMS44NyAyOS42IDguOTYtLjI4IDE2Ljg5LTIuMTUgMjIuMDItNS4wNSA0LjM5LTIuNDggOC4yNy01LjUgMTAuMzktMTAuNS0yLjMzLTE5LjY2LTIuMjctNTcuMjYuOTEtNTcuNDMgNC41LS4yMyAxLjczIDQ4IDAgNTQuN2ExOS41IDE5LjUgMCAwIDEtLjkxIDIuNzJjLjY3IDUuNjcgMS41NCA5Ljg0IDIuNTkgMTEuMiAxLjcgMi4xOSA0MC40NCA0Ljc2IDUwLjIgMS41OSAxLjI4LS40MSAyLjA3LS45MyAyLjItMS41NSAxLjAyLTQuNTQtMTQuNzktOC4yNi0yMC44Ny0xMy45Ni00LjE5LTMuOTEtMi43Ny0zMi40Mi00Ljk3LTUwLjQ1LTIuMi0xOC4wNC03LjktMzYuNDgtMjUuMjYtNDAuNzEtMTMuNjItMy4zMy0yNC45OCAxLjczLTMwLjE0IDUuNjRoMTAuMTd2MzkuOWwtMTYgMjcuOC00Ljk2LS4wN2E4Ni40NyA4Ni40NyAwIDAgMCAyLjc2IDYuNTZaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzAuMDEgMTI5LjYxYzUuNSAxNi41MSA2LjI2IDI2LjU3IDMuMzMgMjcuMjktMy4yLjc4LTUuMS0xNi41OS0zLjMzLTI3LjI5Wm0wIDBjLTIuNzgtNy4yOS00Ljk3LTExLjY2LTcuNDUtMTQuNS0zLjQ2LTMuOTctNy4wOS00Ljc5LTkuOTctNC44OC03Ljc0IDAtMTMuNTUgNC4xNC0xNS43IDUuNTgtMi4xNiAxLjQzLTI1LjYgMTkuOS0zMC4xNCAzNC4yLTQuNTMgMTQuMyAzLjE2IDIxIDguMzggMjIuNjIgNi4xOSAxLjkyIDEyLjUgMi41NCAxOS41OCAxLjkyIDMuNTMtNC40IDMuMDMtOS42MiAyLjE4LTE4LjU4TTcwIDEyOS42MWE3My41IDczLjUgMCAwIDEgNC4yNy0xNi4zMmMxLjItMy4wNyA1LjI5LTEwLjI1IDkuMzUtMTAuNTIgNC4wNi0uMjYgNC40NyAzLjU3IDIuNTcgNC42NS0xLjkgMS4wOC0zIC45Ni00LjggMy40MS0xLjc3IDIuNDYtMi45NSA0Ljk1LTIgMTEuMzQuNzItMi45NCAxLjc2LTQuNTkgMi43Ny01LjcgMS0xLjEzIDguOC04LjA3IDE0LjM2LTguMzYgNS41Ny0uMjkgNS44OCAxLjczIDMuMjggMy4wOC0yLjYgMS4zNC03LjYyIDIuNi0xNC4zNCAxMi4xNiAwIDAtLjYtNS4yNCAxMC0xMS4wNCAyLjg4LTEuNTcgNy0zLjM2IDkuOTItMi44IDMuMTQuNjIgMy4xMiAzLjctLjk0IDQuODFhMTUuODggMTUuODggMCAwIDAtNS4wOSAyLjkyIDMwLjQ1IDMwLjQ1IDAgMCAwLTUuNzggNi41NGMuNDMtMy41MyA0LjMxLTguNTIgOC45Ni0xMC4wOCAzLjIxLTEuMDggOC4xNS0xLjk4IDEwLjA0LjgzLjMzLjQ5LjI0IDEuNjQtLjU2IDIuNTktLjc3LjkxLTIuMjUgMS42My0yLjgzIDEuOTQtMS4yLjYzLTUuOTQgMy43Mi03LjM1IDguMS0xLjE1IDMuNTctMi4yMyA2LjI2LjcgMTQuMjdtLTY4Ljg4LTE1LjE3Yy4wOCA1LjQ4LjU1IDE3LjYgMy4yMyAyOS43MW0wIDBjMi43OCAxMi41NSA3LjkzIDI1LjA5IDE3LjUgMzAuMTcgMTguNzggMTAgMzguNzggNi4zIDQ3Ljc3LTEuNjdhMjAuNCAyMC40IDAgMCAwIDUtNi44N20wIDBjMy43OC04LjI4IDIuODUtMTkuNDUtMS44Ni0yOS42YTg2LjQ3IDg2LjQ3IDAgMCAxLTIuNzYtNi41N200LjYzIDM2LjE3YzguOTYtLjI4IDE2Ljg5LTIuMTUgMjIuMDItNS4wNSA0LjM5LTIuNDggOC4yNy01LjUgMTAuMzktMTAuNW0yOS4xNS01My4xOWMyLjIgMTguMDQuNzggNDYuNTUgNC45NyA1MC40NiA2LjA4IDUuNyAyMS44OSA5LjQyIDIwLjg4IDEzLjk2LS4xNC42Mi0uOTMgMS4xNC0yLjIgMS41NW0tMjMuNjUtNjUuOTdjLTIuMi0xOC4wMy03LjktMzYuNDctMjUuMjYtNDAuNy0xMy42Mi0zLjMzLTI0Ljk4IDEuNzMtMzAuMTQgNS42NG01NS40IDM1LjA2YzguMzUtNy4xMiAxMy43NC0xNi40OCAxNi4xOC0yMS40MiAxLTIgMS41Ny0zLjM2IDIuMDktNS4wN201LjM4IDkyLjQ2Yy05Ljc3IDMuMTctNDguNTEuNi01MC4yMS0xLjU5LTEuMDUtMS4zNi0xLjkyLTUuNTMtMi42LTExLjJtNTIuOCAxMi43OWMtLjQyLTIuOTItMS4yNC0zLjU2LTQuOC00LjZNMTg3IDgyLjM3YzEuMjctNC4xNiAxLjMtNi45Ni0xLjE5LTYuOC04LjM4LjU0LTE2LjEyIDUuMjItMTcuNiA1LjIyLTEuNDkgMC00LjI4LTMuNDYtOS4yMy04LjctMTAuNzgtMTIuMjgtMjcuNy0yMS4yNS00Ni45Ni0xNy40Ny0xNS45NCAzLjEyLTIzLjY5IDEzLjU4LTI2LjQgMTkuMThoMjcuN00xODcgODIuMzdjLjAxLTEgLjE1LTIuMDctLjQzLTIuNzQtMS43Ny0yLjAyLTUuODktMi4wNy02LjQ2IDEuOThtLTY2Ljc5LTcuODFoMTAuMTh2MzkuOWwtMTYgMjcuOC00Ljk2LS4wN20zNy4wNCAyMC42MWMtMi4zMy0xOS42NS0yLjI3LTU3LjI1LjkxLTU3LjQyIDQuNS0uMjMgMS43MyA0OCAwIDU0LjdhMTkuNSAxOS41IDAgMCAxLS45MSAyLjcyWlwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTguMTIgMTA0LjIyQTEwLjUgMTAuNSAwIDAgMSA0Ny43IDExNC44YTEwLjUgMTAuNSAwIDAgMS0xMC40My0xMC41OEExMC41IDEwLjUgMCAwIDEgNDcuNyA5My42NWExMC41IDEwLjUgMCAwIDEgMTAuNDMgMTAuNTdaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtYXNrXCIsIHtcbiAgICBpZDogXCJwYXRoLTE1LWluc2lkZS0xXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk00OS4wMSA5My43OWM2LjE4LjU5IDQuNTYgMTIuMy42IDE3LjU4LTIuODkgMy44Mi0xLjE4IDcuMTMuOSAxMS4xNWE3NyA3NyAwIDAgMSAxLjI4IDIuNTYgMTcuNSAxNy41IDAgMCAxIDMuMSA5LjkyYzAgMTAuMjUtOC45NiAxOC41NS0yMCAxOC41NVMxNC45IDE0NS4yNSAxNC45IDEzNWMwLTcuODkgNS4zLTE0LjYzIDEyLjc5LTE3LjMxIDcuMy00LjA0IDkuNTgtOC4wOCA5Ljg1LTE1LjExLjI0LTYuMSA1LjMtOS4zOCAxMS40Ny04Ljc5WlwiXG4gIH0pKSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTQ5LjAxIDkzLjc5YzYuMTguNTkgNC41NiAxMi4zLjYgMTcuNTgtMi44OSAzLjgyLTEuMTggNy4xMy45IDExLjE1YTc3IDc3IDAgMCAxIDEuMjggMi41NiAxNy41IDE3LjUgMCAwIDEgMy4xIDkuOTJjMCAxMC4yNS04Ljk2IDE4LjU1LTIwIDE4LjU1UzE0LjkgMTQ1LjI1IDE0LjkgMTM1YzAtNy44OSA1LjMtMTQuNjMgMTIuNzktMTcuMzEgNy4zLTQuMDQgOS41OC04LjA4IDkuODUtMTUuMTEuMjQtNi4xIDUuMy05LjM4IDExLjQ3LTguNzlaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJtNDkuNiAxMTEuMzcgMi40IDEuOC0yLjQtMS44Wm0tLjU5LTE3LjU4LS4yOCAyLjk5LjI4LTIuOTlabTEuNSAyOC43MyAyLjY3LTEuMzgtMi42NyAxLjM4Wm0xLjI4IDIuNTYtMi43MSAxLjI4LjEuMjEuMTMuMiAyLjQ4LTEuNjlabS0yNC4xLTcuNCAxLjAxIDIuODMuMjMtLjA4LjItLjEyLTEuNDQtMi42MlptOS44NS0xNS4xIDMgLjExLTMtLjExWk01MiAxMTMuMThjMi40LTMuMiAzLjk3LTguMDYgNC4xMS0xMi4yNS4wOC0yLjEtLjItNC4zNy0xLjE4LTYuMjdhNi45MyA2LjkzIDAgMCAwLTUuNjMtMy44NmwtLjU3IDUuOThjLjQuMDMuNjMuMTYuODguNjQuMzIuNjMuNTYgMS43NC41IDMuMy0uMSAzLjEzLTEuMzQgNi43Ni0yLjkgOC44NGw0Ljc5IDMuNjFabTEuMTggNy45NmMtMS4xLTIuMTItMS44LTMuNTMtMi4wMy00LjgtLjE4LTEtLjA4LTEuOTQuODUtMy4xN2wtNC44LTMuNmE5LjY1IDkuNjUgMCAwIDAtMS45NSA3LjgzYy40MiAyLjM0IDEuNjEgNC42IDIuNiA2LjVsNS4zMy0yLjc2Wm0xLjMzIDIuNjZjLS40NS0uOTQtLjkxLTEuODQtMS4zMy0yLjY2bC01LjM0IDIuNzZjLjQzLjgyLjg1IDEuNjMgMS4yNCAyLjQ2bDUuNDMtMi41NlptLTUuMiAyLjk3QTE0LjUgMTQuNSAwIDAgMSA1MS45IDEzNWg2YTIwLjUgMjAuNSAwIDAgMC0zLjYyLTExLjYxbC00Ljk2IDMuMzhaTTUxLjkgMTM1YzAgOC4zOC03LjQgMTUuNTUtMTcgMTUuNTV2NmMxMi40OSAwIDIzLTkuNDQgMjMtMjEuNTVoLTZabS0xNyAxNS41NWMtOS42IDAtMTYuOTktNy4xNy0xNi45OS0xNS41NWgtNmMwIDEyLjExIDEwLjUxIDIxLjU1IDIzIDIxLjU1di02Wk0xNy45IDEzNWMwLTYuNDcgNC4zNi0xMi4xOCAxMC44LTE0LjQ5bC0yLjAzLTUuNjVDMTguMTUgMTE3LjkyIDExLjkgMTI1LjcgMTEuOSAxMzVoNlptMTYuNjQtMzIuNTRjLS4xMiAzLjIyLS43IDUuNC0xLjgyIDcuMi0xLjE1IDEuOC0zLjA3IDMuNTEtNi40OSA1LjRsMi45IDUuMjVjMy45LTIuMTQgNi43Ny00LjQ3IDguNjUtNy40NSAxLjktMyAyLjYxLTYuMzUgMi43Ni0xMC4xN2wtNi0uMjNaTTQ5LjMgOTAuOGMtMy42Ny0uMzQtNy4yNS40My0xMC4wMiAyLjQ2YTExLjY0IDExLjY0IDAgMCAwLTQuNzQgOS4ybDYgLjIzYTUuNjUgNS42NSAwIDAgMSAyLjI4LTQuNTljMS4zNi0xIDMuNC0xLjU2IDUuOTEtMS4zMmwuNTctNS45OFpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIixcbiAgICBtYXNrOiBcInVybCgjcGF0aC0xNS1pbnNpZGUtMSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01NC4xIDEwNS45NWMwIDEuNjktMS40MyAzLjEtMy4yNCAzLjEtMS44IDAtMy4yNC0xLjQxLTMuMjQtMy4xIDAtMS43IDEuNDMtMy4xIDMuMjQtMy4xIDEuOCAwIDMuMjQgMS40IDMuMjQgMy4xWlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMzcuMTIgOTUuMDdhMy40NiAzLjQ2IDAgMCAxLTMuNTMgMy4zOWMtMiAwLTMuNTQtMS41Ni0zLjU0LTMuNGEzLjQ2IDMuNDYgMCAwIDEgMy41NC0zLjM4YzEuOTkgMCAzLjUzIDEuNTUgMy41MyAzLjM5WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCIsXG4gICAgc3Ryb2tlV2lkdGg6IDNcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ3LjIyIDE1NS42NWMtLjEgMy41OCAxLjI3IDQuODggNC43IDYuMDhcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pKTtcbn1cbnZhciBJbGx1c3RyYXRpb25Ob0NvbnRlbnREYXJrX2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25Ob0NvbnRlbnREYXJrX2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsICJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19zcHJlYWRWYWx1ZXMoe1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgdmlld0JveDogXCIwIDAgMjAwIDIwMFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgcHJvcHMpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTIzLjE3IDExNC42Ni0uMi0uMTgtMzQuNiAyNy4xLjQ2LS4wNGMxMC4wMy0uOSAxNi43MS0uMzggMTguNzkgMGwuMS4wMiAxNS40NS0yNi45WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDY3LjcwNixcbiAgICB5OiA3My44NzEsXG4gICAgd2lkdGg6IDU1LjYzMzMsXG4gICAgaGVpZ2h0OiAzOS44MDA0LFxuICAgIGZpbGw6IFwid2hpdGVcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTQ5Ljk3IDEzNi41IDE3LjctMjIuNDRoNTUuNDRsLTE3LjcgMjIuNDVINDkuOTdaXCIsXG4gICAgZmlsbDogXCIjRTZFOEVBXCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEwMS42NyA3OC41N0g3NS43NXYyMS40NWgxOC43N3Y2LjI1aDE0LjZ2LTEzLjdoLTcuNDV2LTE0WlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNzYuNjYgNzkuNDNoMjQuMjZ2MTMuMTRoLTYuNHY2LjY1SDc2LjY2di0xOS44Wm0xNy44NiAyMC42Mkg3NS43NFY3OC42aDI2LjAxdjEzLjk3aDcuMzZ2MTMuN2gtMTQuNnYtNi4yMlptNy4yMy02LjY1aDYuNTR2MTIuMDVIOTUuMzR2LTUuNGg2LjQxVjkzLjRabS0uODMgMHY1LjgyaC01LjU4VjkzLjRoNS41OFpcIixcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNDMuMjkgMTc0Ljg5SDMzLjVjNC4xOS0xLjIyIDQuMDQtMTEuOTkgMy40NC0xNy4yMi44OCA1LjczIDQuNiAxMy44NyA2LjM0IDE3LjIyWlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiLFxuICAgIHN0cm9rZTogXCJibGFja1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc1LjkzIDQwLjU5YTMyLjc4IDMyLjc4IDAgMSAxLTY1LjU2IDAgMzIuNzggMzIuNzggMCAwIDEgNjUuNTYgMFpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeS1saWdodC1kZWZhdWx0KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNDcuNTYgMjUuMTJhNC40IDQuNCAwIDAgMC04LjgyIDB2MTEuMDZIMjcuNjhhNC40IDQuNCAwIDAgMCAwIDguODJoMTEuMDZ2MTEuMDZhNC40IDQuNCAwIDAgMCA4LjgyIDBWNDVoMTEuMDZhNC40IDQuNCAwIDAgMCAwLTguODJINDcuNTZWMjUuMTJaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjMuODIgODMuMzNjLTQuNTItMS44NC0xMy41My03Ljk2LTEzLjM4LTE3Ljc5XCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01Mi41OSAxMTAuMjNjMi44OC4xIDYuNS45MSA5Ljk3IDQuODggMi40OCAyLjg0IDQuNjcgNy4yMSA3LjQ1IDE0LjVhNzMuNTMgNzMuNTMgMCAwIDEgNC4yNy0xNi4zMmMxLjItMy4wNyA1LjI5LTEwLjI1IDkuMzUtMTAuNTIgNC4wNi0uMjYgNC40NyAzLjU3IDIuNTcgNC42NS0xLjkgMS4wOC0zIC45Ni00LjggMy40MS0xLjc3IDIuNDYtMi45NSA0Ljk1LTIgMTEuMzQuNzItMi45NCAxLjc2LTQuNTkgMi43Ny01LjcxIDEtMS4xMiA4LjgtOC4wNiAxNC4zNi04LjM1IDMuODYtLjIgNS4yLjcgNC43OCAxLjczYTkuMjcgOS4yNyAwIDAgMSA0LjA4LS4zM2MyLjA4LjQxIDIuNzggMS45IDEuODMgMy4xOCAyLjE5LS4xNiA0LjI4LjIzIDUuMzYgMS44NC4zMy40OS4yNCAxLjY0LS41NiAyLjU4LS43Ny45Mi0yLjI1IDEuNjQtMi44MyAxLjk1LTEuMi42My01Ljk0IDMuNzItNy4zNSA4LjEtMS40MSA0LjQtMi43MyA3LjQ3IDMuNDYgMjAuODMgNC43MSAxMC4xNiA1LjY0IDIxLjMzIDEuODcgMjkuNiA4Ljk2LS4yNyAxNi44OS0yLjE0IDIyLjAyLTUuMDQgNC4zOS0yLjQ4IDguMjctNS41IDEwLjM5LTEwLjUtMi4zMy0xOS42Ni0yLjI3LTU3LjI2LjkxLTU3LjQzIDQuNS0uMjMgMS43MyA0OCAwIDU0LjdhMTkuNSAxOS41IDAgMCAxLS45MSAyLjcyYy42NyA1LjY3IDEuNTQgOS44NCAyLjU5IDExLjIgMS43IDIuMTkgNDAuNDQgNC43NiA1MC4yIDEuNTkgMS4yOC0uNDIgMi4wNy0uOTMgMi4yLTEuNTUgMS4wMi00LjU0LTE0Ljc5LTguMjYtMjAuODctMTMuOTYtNC4xOS0zLjkxLTIuNzctMzIuNDItNC45Ny01MC40NS0yLjItMTguMDQtNy45LTM2LjQ4LTI1LjI2LTQwLjcxLTEzLjYyLTMuMzMtMjQuOTggMS43My0zMC4xNCA1LjY0SDg1LjYyYzIuNzEtNS42IDEwLjQ2LTE2LjA2IDI2LjQtMTkuMTggMTkuMjYtMy43OCAzNi4xOCA1LjE5IDQ2Ljk2IDE3LjQ2IDQuOTUgNS4yNCA3Ljc1IDguNzEgOS4yMyA4LjcxIDEuNDggMCA5LjIyLTQuNjggMTcuNi01LjIyIDIuNS0uMTYgMi40NiAyLjY0IDEuMTkgNi44YTMwLjggMzAuOCAwIDAgMS0yLjA5IDUuMDdjLTIuNDQgNC45NC03Ljg0IDE0LjMtMTYuMTggMjEuNDIgMi4yIDE4LjA0Ljc4IDQ2LjU1IDQuOTcgNTAuNDYgNi4wOCA1LjcgMjEuODkgOS40MiAyMC44OCAxMy45Ni0uMTQuNjItLjkzIDEuMTMtMi4yIDEuNTUtOS43NyAzLjE3LTQ4LjUxLjYtNTAuMjEtMS41OS0xLjA1LTEuMzYtMS45Mi01LjUzLTIuNi0xMS4yLTIuMSA1LjAxLTUuOTkgOC4wMy0xMC4zOCAxMC41MS01LjEzIDIuOS0xMy4wNiA0Ljc3LTIyLjAyIDUuMDVhMjAuMzcgMjAuMzcgMCAwIDEtNS4wMSA2Ljg3Yy05IDcuOTgtMjguOTkgMTEuNjctNDcuNzcgMS42Ny05LjU3LTUuMDktMTQuNzItMTcuNjItMTcuNS0zMC4xN3YuMDZjLjg1IDguOTIgMS4zNCAxNC4xMy0yLjE4IDE4LjUyYTQ5LjkgNDkuOSAwIDAgMS0xOS41OC0xLjkyYy01LjIyLTEuNjEtMTIuOTEtOC4zMS04LjM4LTIyLjYxIDQuNTQtMTQuMyAyNy45OC0zMi43OCAzMC4xNC0zNC4yMSAyLjE1LTEuNDQgNy45Ni01LjU4IDE1LjctNS41OFpcIixcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzAuMDEgMTI5LjYxYy0xLjc4IDEwLjcuMTQgMjguMDcgMy4zMyAyNy4yOSAxLS4yNSAxLjU3LTEuNTggMS42Ny0zLjkgNy4xNi4zNCAyNy43NyA3Ljk5IDM0LjQ3IDExLjguMTUgNC42Mi0uNTkgOS4wMS0yLjMxIDEyLjhhMjAuMzggMjAuMzggMCAwIDEtNS4wMSA2Ljg3Yy05IDcuOTgtMjguOTkgMTEuNjctNDcuNzcgMS42Ny05LjU3LTUuMDktMTQuNzItMTcuNjItMTcuNS0zMC4xN3YuMDZjLjg1IDguOTIgMS4zNCAxNC4xMy0yLjE4IDE4LjUyYTQ5LjkgNDkuOSAwIDAgMS0xOS41OC0xLjkyYy01LjIyLTEuNjEtMTIuOTEtOC4zMS04LjM4LTIyLjYxIDQuNTQtMTQuMyAyNy45OC0zMi43OCAzMC4xNC0zNC4yMSAyLjE1LTEuNDQgNy45Ni01LjU4IDE1LjctNS41OCAyLjg4LjEgNi41LjkxIDkuOTcgNC44OCAyLjQ4IDIuODQgNC42NyA3LjIxIDcuNDUgMTQuNVpcIixcbiAgICBmaWxsOiBcIiNFNkU4RUFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDUuMyAxNDhjNC43MSAxMC4xNSA1LjY0IDIxLjMyIDEuODcgMjkuNiA4Ljk2LS4yOCAxNi44OS0yLjE1IDIyLjAyLTUuMDUgNC4zOS0yLjQ4IDguMjctNS41IDEwLjM5LTEwLjUtMi4zMy0xOS42Ni0yLjI3LTU3LjI2LjkxLTU3LjQzIDQuNS0uMjMgMS43MyA0OCAwIDU0LjdhMTkuNSAxOS41IDAgMCAxLS45MSAyLjcyYy42NyA1LjY3IDEuNTQgOS44NCAyLjU5IDExLjIgMS43IDIuMTkgNDAuNDQgNC43NiA1MC4yIDEuNTkgMS4yOC0uNDEgMi4wNy0uOTMgMi4yLTEuNTUgMS4wMi00LjU0LTE0Ljc5LTguMjYtMjAuODctMTMuOTYtNC4xOS0zLjkxLTIuNzctMzIuNDItNC45Ny01MC40NS0yLjItMTguMDQtNy45LTM2LjQ4LTI1LjI2LTQwLjcxLTEzLjYyLTMuMzMtMjQuOTggMS43My0zMC4xNCA1LjY0aDEwLjE3djM5LjlsLTE2IDI3LjgtNC45Ni0uMDdhODYuNDcgODYuNDcgMCAwIDAgMi43NiA2LjU2WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIixcbiAgICBjbGFzc05hbWU6IFwiXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzAuMDEgMTI5LjYxYzUuNSAxNi41MSA2LjI2IDI2LjU3IDMuMzMgMjcuMjktMy4yLjc4LTUuMS0xNi41OS0zLjMzLTI3LjI5Wm0wIDBjLTIuNzgtNy4yOS00Ljk3LTExLjY2LTcuNDUtMTQuNS0zLjQ2LTMuOTctNy4wOS00Ljc5LTkuOTctNC44OC03Ljc0IDAtMTMuNTUgNC4xNC0xNS43IDUuNTgtMi4xNiAxLjQzLTI1LjYgMTkuOS0zMC4xNCAzNC4yLTQuNTMgMTQuMyAzLjE2IDIxIDguMzggMjIuNjIgNi4xOSAxLjkyIDEyLjUgMi41NCAxOS41OCAxLjkyIDMuNTMtNC40IDMuMDMtOS42MiAyLjE4LTE4LjU4TTcwIDEyOS42MWE3My41IDczLjUgMCAwIDEgNC4yNy0xNi4zMmMxLjItMy4wNyA1LjI5LTEwLjI1IDkuMzUtMTAuNTIgNC4wNi0uMjYgNC40NyAzLjU3IDIuNTcgNC42NS0xLjkgMS4wOC0zIC45Ni00LjggMy40MS0xLjc3IDIuNDYtMi45NSA0Ljk1LTIgMTEuMzQuNzItMi45NCAxLjc2LTQuNTkgMi43Ny01LjcgMS0xLjEzIDguOC04LjA3IDE0LjM2LTguMzYgNS41Ny0uMjkgNS44OCAxLjczIDMuMjggMy4wOC0yLjYgMS4zNC03LjYyIDIuNi0xNC4zNCAxMi4xNiAwIDAtLjYtNS4yNCAxMC0xMS4wNCAyLjg4LTEuNTcgNy0zLjM2IDkuOTItMi44IDMuMTQuNjIgMy4xMiAzLjctLjk0IDQuODFhMTUuODggMTUuODggMCAwIDAtNS4wOSAyLjkyIDMwLjQ1IDMwLjQ1IDAgMCAwLTUuNzggNi41NGMuNDMtMy41MyA0LjMxLTguNTIgOC45Ni0xMC4wOCAzLjIxLTEuMDggOC4xNS0xLjk4IDEwLjA0LjgzLjMzLjQ5LjI0IDEuNjQtLjU2IDIuNTktLjc3LjkxLTIuMjUgMS42My0yLjgzIDEuOTQtMS4yLjYzLTUuOTQgMy43Mi03LjM1IDguMS0xLjE1IDMuNTctMi4yMyA2LjI2LjcgMTQuMjdtLTY4Ljg4LTE1LjE3Yy4wOCA1LjQ4LjU1IDE3LjYgMy4yMyAyOS43MW0wIDBjMi43OCAxMi41NSA3LjkzIDI1LjA5IDE3LjUgMzAuMTcgMTguNzggMTAgMzguNzggNi4zIDQ3Ljc3LTEuNjdhMjAuNCAyMC40IDAgMCAwIDUtNi44N20wIDBjMy43OC04LjI4IDIuODUtMTkuNDUtMS44Ni0yOS42YTg2LjQ3IDg2LjQ3IDAgMCAxLTIuNzYtNi41N200LjYzIDM2LjE3YzguOTYtLjI4IDE2Ljg5LTIuMTUgMjIuMDItNS4wNSA0LjM5LTIuNDggOC4yNy01LjUgMTAuMzktMTAuNW0yOS4xNS01My4xOWMyLjIgMTguMDQuNzggNDYuNTUgNC45NyA1MC40NiA2LjA4IDUuNyAyMS44OSA5LjQyIDIwLjg4IDEzLjk2LS4xNC42Mi0uOTMgMS4xNC0yLjIgMS41NW0tMjMuNjUtNjUuOTdjLTIuMi0xOC4wMy03LjktMzYuNDctMjUuMjYtNDAuNy0xMy42Mi0zLjMzLTI0Ljk4IDEuNzMtMzAuMTQgNS42NG01NS40IDM1LjA2YzguMzUtNy4xMiAxMy43NC0xNi40OCAxNi4xOC0yMS40MiAxLTIgMS41Ny0zLjM2IDIuMDktNS4wN201LjM4IDkyLjQ2Yy05Ljc3IDMuMTctNDguNTEuNi01MC4yMS0xLjU5LTEuMDUtMS4zNi0xLjkyLTUuNTMtMi42LTExLjJtNTIuOCAxMi43OWMtLjQyLTIuOTItMS4yNC0zLjU2LTQuOC00LjZNMTg3IDgyLjM3YzEuMjctNC4xNiAxLjMtNi45Ni0xLjE5LTYuOC04LjM4LjU0LTE2LjEyIDUuMjItMTcuNiA1LjIyLTEuNDkgMC00LjI4LTMuNDYtOS4yMy04LjctMTAuNzgtMTIuMjgtMjcuNy0yMS4yNS00Ni45Ni0xNy40Ny0xNS45NCAzLjEyLTIzLjY5IDEzLjU4LTI2LjQgMTkuMThoMjcuN00xODcgODIuMzdjLjAxLTEgLjE1LTIuMDctLjQzLTIuNzQtMS43Ny0yLjAyLTUuODktMi4wNy02LjQ2IDEuOThtLTY2Ljc5LTcuODFoMTAuMTh2MzkuOWwtMTYgMjcuOC00Ljk2LS4wN20zNy4wNCAyMC42MWMtMi4zMy0xOS42NS0yLjI3LTU3LjI1LjkxLTU3LjQyIDQuNS0uMjMgMS43MyA0OCAwIDU0LjdhMTkuNSAxOS41IDAgMCAxLS45MSAyLjcyWlwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNTguMTIgMTA0LjIyQTEwLjUgMTAuNSAwIDAgMSA0Ny43IDExNC44YTEwLjUgMTAuNSAwIDAgMS0xMC40My0xMC41OEExMC41IDEwLjUgMCAwIDEgNDcuNyA5My42NWExMC41IDEwLjUgMCAwIDEgMTAuNDMgMTAuNTdaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwibWFza1wiLCB7XG4gICAgaWQ6IFwicGF0aC0xNi1pbnNpZGUtMVwiLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9LCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNDkuMDEgOTMuNzljNi4xOC41OSA0LjU2IDEyLjMuNiAxNy41OC0yLjg5IDMuODItMS4xOCA3LjEzLjkgMTEuMTVhNzcgNzcgMCAwIDEgMS4yOCAyLjU2IDE3LjUgMTcuNSAwIDAgMSAzLjEgOS45MmMwIDEwLjI1LTguOTYgMTguNTUtMjAgMTguNTVTMTQuOSAxNDUuMjUgMTQuOSAxMzVjMC03Ljg5IDUuMy0xNC42MyAxMi43OS0xNy4zMSA3LjMtNC4wNCA5LjU4LTguMDggOS44NS0xNS4xMS4yNC02LjEgNS4zLTkuMzggMTEuNDctOC43OVpcIlxuICB9KSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk00OS4wMSA5My43OWM2LjE4LjU5IDQuNTYgMTIuMy42IDE3LjU4LTIuODkgMy44Mi0xLjE4IDcuMTMuOSAxMS4xNWE3NyA3NyAwIDAgMSAxLjI4IDIuNTYgMTcuNSAxNy41IDAgMCAxIDMuMSA5LjkyYzAgMTAuMjUtOC45NiAxOC41NS0yMCAxOC41NVMxNC45IDE0NS4yNSAxNC45IDEzNWMwLTcuODkgNS4zLTE0LjYzIDEyLjc5LTE3LjMxIDcuMy00LjA0IDkuNTgtOC4wOCA5Ljg1LTE1LjExLjI0LTYuMSA1LjMtOS4zOCAxMS40Ny04Ljc5WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTQ5LjYgMTExLjM3IDIuNCAxLjgtMi40LTEuOFptLS41OS0xNy41OC0uMjggMi45OS4yOC0yLjk5Wm0xLjUgMjguNzMgMi42Ny0xLjM4LTIuNjcgMS4zOFptMS4yOCAyLjU2LTIuNzEgMS4yOC4xLjIxLjEzLjIgMi40OC0xLjY5Wm0tMjQuMS03LjQgMS4wMSAyLjgzLjIzLS4wOC4yLS4xMi0xLjQ0LTIuNjJabTkuODUtMTUuMS0zLS4xMiAzIC4xMlpNNTIgMTEzLjE4YzIuNC0zLjIgMy45Ny04LjA2IDQuMTEtMTIuMjUuMDgtMi4xLS4yLTQuMzctMS4xOC02LjI3YTYuOTMgNi45MyAwIDAgMC01LjYzLTMuODZsLS41NyA1Ljk4Yy40LjAzLjYzLjE2Ljg4LjY0LjMyLjYzLjU2IDEuNzQuNSAzLjMtLjEgMy4xMy0xLjM0IDYuNzYtMi45IDguODRsNC43OSAzLjYxWm0xLjE4IDcuOTZjLTEuMS0yLjEyLTEuOC0zLjUzLTIuMDMtNC44LS4xOC0xLS4wOC0xLjk0Ljg1LTMuMTdsLTQuOC0zLjZhOS42NSA5LjY1IDAgMCAwLTEuOTYgNy44M2MuNDMgMi4zNCAxLjYyIDQuNiAyLjYgNi41bDUuMzQtMi43NlptMS4zMyAyLjY2Yy0uNDUtLjk0LS45MS0xLjg0LTEuMzMtMi42NmwtNS4zNCAyLjc2Yy40My44Mi44NSAxLjYzIDEuMjQgMi40Nmw1LjQzLTIuNTZabS01LjIgMi45N2ExNC41MSAxNC41MSAwIDAgMSAyLjU3IDguMjNoNmEyMC41IDIwLjUgMCAwIDAtMy42MS0xMS42MWwtNC45NiAzLjM4Wm0yLjU3IDguMjNjMCA4LjM4LTcuMzkgMTUuNTUtMTYuOTkgMTUuNTV2NmMxMi40OSAwIDIzLTkuNDQgMjMtMjEuNTVoLTZaTTM0LjkgMTUwLjU1Yy05LjYgMC0xNi45OS03LjE3LTE2Ljk5LTE1LjU1aC02YzAgMTIuMTEgMTAuNTEgMjEuNTUgMjMgMjEuNTV2LTZaTTE3LjkgMTM1YzAtNi40NyA0LjM2LTEyLjE4IDEwLjgtMTQuNDlsLTIuMDMtNS42NUMxOC4xNSAxMTcuOTIgMTEuOSAxMjUuNyAxMS45IDEzNWg2Wm0xNi42NC0zMi41NGMtLjEyIDMuMjItLjcgNS40LTEuODIgNy4yLTEuMTUgMS44LTMuMDcgMy41MS02LjQ5IDUuNGwyLjkgNS4yNWMzLjktMi4xNCA2Ljc3LTQuNDcgOC42NS03LjQ1IDEuOS0zIDIuNjEtNi4zNSAyLjc2LTEwLjE3bC02LS4yM1pNNDkuMyA5MC44Yy0zLjY3LS4zNC03LjI1LjQzLTEwLjAyIDIuNDZhMTEuNjQgMTEuNjQgMCAwIDAtNC43NCA5LjJsNiAuMjNhNS42NSA1LjY1IDAgMCAxIDIuMjgtNC41OWMxLjM2LTEgMy40LTEuNTYgNS45MS0xLjMybC41Ny01Ljk4WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiLFxuICAgIG1hc2s6IFwidXJsKCNwYXRoLTE2LWluc2lkZS0xKVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTU0LjEgMTA1Ljk1YzAgMS42OS0xLjQzIDMuMS0zLjI0IDMuMS0xLjgxIDAtMy4yNC0xLjQxLTMuMjQtMy4xIDAtMS43IDEuNDMtMy4xIDMuMjQtMy4xIDEuOCAwIDMuMjQgMS40IDMuMjQgMy4xWlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTM3LjEyIDk1LjA3YTMuNDYgMy40NiAwIDAgMS0zLjUzIDMuMzljLTIgMC0zLjU0LTEuNTYtMy41NC0zLjRhMy40NiAzLjQ2IDAgMCAxIDMuNTQtMy4zOGMxLjk5IDAgMy41MyAxLjU1IDMuNTMgMy4zOVpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiLFxuICAgIHN0cm9rZVdpZHRoOiAzXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0Ny4yMiAxNTUuNjVjLS4xIDMuNTggMS4yNyA0Ljg4IDQuNyA2LjA4XCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSk7XG59XG52YXIgSWxsdXN0cmF0aW9uTm9Db250ZW50X2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25Ob0NvbnRlbnRfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwgInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX3NwcmVhZFZhbHVlcyh7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB2aWV3Qm94OiBcIjAgMCAyMDAgMjAwXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAwLjc1IDE5MS45OWM2LjIxLS41NiA4LjctOS4yIDEwLjM2LTE1LjA2bDQuOTcgMTUuMDZoLTE1LjMzWlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAzLjk3IDYyLjk3Yy0zLjk0LTUuMDMtMS45NS0xMy44MSA3LjM1LTIzLjAzIDEyLjk4LTExLjg4IDI1LjUzLTkuMjUgMjYuMTItOC45OC41OC4yNyAxMyA5LjA2IDI0LjgyIDIxLjNDMTc0LjA4IDY0LjUxIDE4Ni40NiA3NSAxODYuNiA5MS44Yy4xNiAxNi44LTE3LjI1IDIyLjg5LTMwLjAzIDIyLjk2LTEyLjc3LjA4LTQxLjI3LS4yOC00Ni43NS0xLjItMy40MyA0LjUxLTguOSA5LjM4LTEwLjkxIDEwLjQ0IDQuMjMgMy42MyAxOS4zMiAxOC45OCAyMS4xMyAyMi4yMiAxLjgyIDMuMjQgOS43MiAxNC41MiA2LjEgMzIuMjgtMS42NyA4LjEzLTguMTggMTIuMy0xNC45IDEzLjYgMCAwLTkuMi0uMDQtMTIuMzMgMC03Ljc4LjE0LTg4LjAyIDAtOTAuMzUgMC0yLjM0IDAtMy4wMS0yLjA5IDAtOC4xOSAzLTYuMSAxNC4wOS0yNS4zNyAxOS45LTI4LjggMi4zLTEuMzEgNy41MyAyLjA2IDguNjIgMi44NSAxLjAzLjczIDIuMDMgMS41OSAzLjQ1IDEuNDcgMS40Mi0uMTIgOC44NC0uMTUgMTEuMi0uMDctNC4yOC0zLTIwLjAzLTE3LjY5LTIxLjk1LTI0LjgzLTEuNTMtNS42OC4zLTguOTYgMS4xMS05LjcyLTguNTMtNC45OS0xNy4yLTE0Ljg5LTEzLjgtMjkuNi45NC00LjEzIDMuNTItOC40MyA1LjQ0LTkuNjcgMy42Mi0yLjMzIDE1Ljg5LTMuNSAyMy4zMi00LjE5IDMyLjctMi45OCAxMDcuMTktMS45IDEwOS40NS0xLjg4LTMuMTItMi4zOC0xNS4yLTE1LjkzLTE1LjQ4LTE2LjM5LS43NyAyLjIxLTMuODMgNS4wMi02LjEgNC43LTIuMDMtLjI3LTMuMTYtMy40NS0uODItOC40Ny0uOC44Mi0xLjY0IDEuNi0yLjQ5IDIuMy0xLjI0IDEtMi44IDEuMjEtMy4zNyAwLS41LTEuMDgtLjMzLTMuMTMuODItNS44NWExNi4zOSAxNi4zOSAwIDAgMS0zLjU2IDIuNjljLTMuNjkgMS44Ni00LjYtNS4yNC4zNC0xMS4yOC03LjEgMy40Ny05LjEyIDYuMy0xMC44OCAxMC40Ny0xLjA5IDIuNTYtMS40NyA0LjkxLTQuNDYgNi4yNC0yLjMgMS4wMi00LjIyLjUxLTUuMzMtLjlaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTI0LjY0IDQ3LjE3Yy03LjEgMy40Ny05LjEyIDYuMy0xMC44OCAxMC40Ny0xLjA5IDIuNTYtMS40NyA0LjkxLTQuNDYgNi4yNC0yLjMgMS4wMi00LjIyLjUxLTUuMzMtLjktMy45NC01LjA0LTEuOTUtMTMuODIgNy4zNS0yMy4wNCAxMi45OC0xMS44OCAyNS41My05LjI1IDI2LjEyLTguOTguNTguMjcgMTMgOS4wNiAyNC44MiAyMS4zQzE3NC4wOCA2NC41MSAxODYuNDYgNzUgMTg2LjYgOTEuOGMuMTYgMTYuOC0xNy4yNSAyMi44OS0zMC4wMyAyMi45Ni0xMi43Ny4wOC00MS4yNy0uMjgtNDYuNzUtMS4ybTE0LjgyLTY2LjM5YzctMi42IDYuNjQtNC45NyA2LjIzLTUuNDQtLjQyLS40Ny00LjY0IDIuNzQtNi4yMyA1LjQ0Wm0wIDBjLTQuOTQgNi4wNC00LjAzIDEzLjE0LS4zNCAxMS4yOCA0Ljg1LTIuNDYgMTIuMDktMTIuNzggMTEuNjQtMTMuMTItLjMxLS4yNS0yLjA3Ljc0LTUuMzIgNS41LTMuNTQgNS4xOC00LjM0IDkuMTItMy41OCAxMC43Ny41NyAxLjIyIDIuMTMgMS4wMSAzLjM3IDAgNC44LTMuOSA5LjQxLTEwLjg4IDkuMTYtMTEuMDYtLjI0LS4xNy0xLjg0LjQ1LTUuNiA2Ljc3LTMuNjggNi4xNy0yLjU0IDEwLjE2LS4yNiAxMC40OCAyLjI4LjMxIDUuMzQtMi41IDYuMTEtNC43LjI4LjQ1IDEyLjM2IDE0IDE1LjQ4IDE2LjM4bS00NS40OCAzNC4xYy0zLjQzIDQuNS04LjkgOS4zOC0xMC45MSAxMC40M20xMC45MS0xMC40M2MzLjU5LTQuOTIgNi43Ni05Ljk0IDguMzEtMTUuM005OC45MSAxMjRjNC4yMyAzLjYzIDE5LjMyIDE4Ljk4IDIxLjEzIDIyLjIyIDEuODIgMy4yNCA5LjcyIDE0LjUyIDYuMSAzMi4yOC0xLjY3IDguMTMtOC4xOCAxMi4zLTE0LjkgMTMuNiAwIDAtOS4yLS4wNC0xMi4zMyAwLTcuNzguMTQtODguMDIgMC05MC4zNSAwLTIuMzQgMC0zLjAxLTIuMDkgMC04LjE5IDMtNi4xIDE0LjA5LTI1LjM3IDE5LjktMjguOCAyLjMtMS4zMSA3LjUzIDIuMDYgOC42MiAyLjg1IDEuMDMuNzMgMi4wMyAxLjU5IDMuNDUgMS40NyAxLjQyLS4xMiA4Ljg0LS4xNSAxMS4yLS4wN005OC45MiAxMjRIODguMW0tMzYuMzYgMzUuMzZjMy4wNS4xIDkuNi0uNSAxMS44NCAxLjU0IDIuMDUgMS44NS41NiA0LjYtMi41MyAzLjg0LTMuNjQtLjg4LTguMTMtNC41NS05LjMxLTUuMzhabTAgMGMtNC4yOS0zLTIwLjA0LTE3LjY5LTIxLjk2LTI0LjgzLTEuNTMtNS42OC4zLTguOTYgMS4xMS05LjcybTAgMGExODguOSAxODguOSAwIDAgMCAxOS4zNyA4LjkxbS0xOS4zNy04LjljLTguNTMtNS0xNy4yLTE0LjktMTMuOC0yOS42Mi45NC00LjEyIDMuNTItOC40MiA1LjQ0LTkuNjYgMy42Mi0yLjMzIDE1Ljg5LTMuNSAyMy4zMi00LjE5IDMyLjctMi45OCAxMDcuMTktMS45IDEwOS40NS0xLjg4TTUwLjI2IDEzMy43MmM5LjM3IDMuNTUgMTkuMiA2LjI2IDIyLjM4IDkuOSAzLjE4IDMuNjQtLjc2IDguNjctMS45MSAxMi43NS0uMyAxLjAzLS42MyAyLjYtLjI3IDMuNS40NSAxLjEzIDEuNzggMS4zNiAzLjc1LS4xOCAzLjUyLTIuNzQgNi42NS05LjU2IDcuMy0xMS41Ny42NS0yLTQuNDQgOC4yNy00Ljk4IDEyLjgtLjU0IDQuNTQgMy40OSAzLjggNi4yIDBhMzUuNjggMzUuNjggMCAwIDAgNS4wMi0xMC41MmMuMjEtLjk4LTIuNzQgNS40NC0zLjYgOS4zLS4yNCAxLjAzLS44NSAzLjQ3IDAgNC40NC45NSAxLjEgMi44Ny44MSA1LjA3LTIuNzNhNDIuNjcgNDIuNjcgMCAwIDAgNC42LTExLjAxYy4yMi0xLjMtMy4wNSA3LjMtMy41NSAxMS41LS4zNCAyLjk0LjY3IDQuMzggNC4xOCAwIDEuOTktMi40OCAzLjQ0LTYuMjggNC4zMy0xMC4xMm0tNDguNTItMTguMDZjLTEuOTcgMi43Mi00LjI1IDUuMy0xMC44IDYuMzJtMjUuODMtMzUuOTNjLTUuNzEtNC4xNC04Ljk3LTQuNTYtMTEuNDYtNC41Ni0zLjY0IDAtNC40OCAxLjk1LTEuMTYgMy4yIDMuMzIgMS4yNCA5LjM1IDEuMzYgMTIuNjIgMS4zNlptMCAwaDYuOTFtLTYuOTEgMGM1LjEgMy43MSAxNC43MiAxMS40IDIyLjggMTkuOW02Ny4yMS00NC41NGMyLjI2LjAyIDYuMTQuNyA1LjggMy4xLS4yMSAxLjU2LTQuNzEtMi4xMi01LjgtMy4xWk04OC4xIDEyNGMuODQuODggMS42NiAxLjc3IDIuNDYgMi42NyAxLjk0IDIuMTggOC40NyA5LjYgOS4xMiAxNC4xNS4zNyAyLjU4LjA2IDYuNzktLjkgMTAuOTZtMCAwYzMuMTggMi45MiA3LjM0IDguMjQgOC4yNCAxNC4xNy45IDUuOTMgMCAxMy40Ny05LjQgMjEuMzVcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTE1Ljk0IDE5Mi4xMy01LjE3LTE1LjY3LS4xMy40NGMtLjgzIDIuOTMtMS44NiA2LjUzLTMuNDUgOS40OC0xLjYgMi45NS0zLjc1IDUuMi02Ljc4IDUuNDd2LjI4aDE1LjUzWlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTIyLjQyIDEzNy4zNSA1LjA5IDkuNDhoLTcuNDVsLTUuMS05LjQ4aDcuNDZaXCIsXG4gICAgZmlsbDogXCIjNkI3MDc1XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA0LjEgMTQxLjQ4aDMzLjk1bDE0LjgyIDI3LjQzaC0zMy45NWwtMTQuODItMjcuNDNaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAxMzkuNTIyLFxuICAgIHk6IDE1NS4xMzUsXG4gICAgd2lkdGg6IDQzLjU5NTgsXG4gICAgaGVpZ2h0OiAzOC44NjExLFxuICAgIGZpbGw6IFwiIzZCNzA3NVwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJtMTM5Ljg3IDE1NC43IDkuMjgtMTYuODVoNDMuNDZsLTkuMjkgMTYuODRoLTQzLjQ1WlwiLFxuICAgIGZpbGw6IFwiIzZCNzA3NVwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMTExLjIyMyxcbiAgICB5OiAxNTUuMTM1LFxuICAgIHdpZHRoOiAyOC4xODQxLFxuICAgIGhlaWdodDogMzguODYxMSxcbiAgICBmaWxsOiBcIiM2QjcwNzVcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTY2LjU2IDE1NC45MSAzLjktNi45N2gtNi4xNGwtMy41OCA2LjQyaC0uMzJ2MTMuMzhoNi4xNFYxNTQuOVpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiA0NS41Nzg4LFxuICAgIGN5OiAzOC42NzUsXG4gICAgcjogMzMuMTcxMSxcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIixcbiAgICBmaWxsT3BhY2l0eTogMC4yXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNDguODUgNDcuNjdhMy4yNCAzLjI0IDAgMCAwIDIuNDYtMy44OGMtLjI4LTEuMjIuMjctMi40MSAxLjE0LTMuMyAzLjAzLTMuMTMgNS4wOS03Ljc4IDMuNjYtMTIuNzhhMTEuMjQgMTEuMjQgMCAwIDAtNS40My02LjZjLTIuOS0xLjYtNi40Ny0xLjktOS44Ny0uODdsLS4xNy4wOGMtNS43OCAxLjk2LTguMyA3LjA1LTguMjYgMTEuOTYuMDIgMi4wNSAyLjEyIDMuMiA0LjA5IDIuNjQgMi0uNTcgMi45Ny0yLjggMy42My00Ljc4YTQuMjEgNC4yMSAwIDAgMSAyLjkzLTIuNzUgNSA1IDAgMCAxIDQuMTYuMjZjLjg4LjY0IDEuNTggMS4zNSAxLjc4IDIuMjguODQgMi40Ny0uODMgNS4yLTIuNzQgNi40Mi0yLjY4IDEuNjgtMy4wMyA1LjQ4LTIuNDYgOC44LjM2IDIuMSAyLjU1IDMuMTYgNC42MSAyLjYzbC40Ny0uMTFabS4wMiAzLjE1YTQuMSA0LjEgMCAxIDEgMi41MyA3LjggNC4xIDQuMSAwIDAgMS0yLjUzLTcuOFpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwibTk4LjYzIDgyLjU4LS4xLS4wMS0uMDQuMWMtLjc5IDIuNDMtMS42NiA1LjI0LTEuNTIgOC4wNC4xNCAyLjgxIDEuMyA1LjYxIDQuNTMgOCAzLjE3IDIuMzUgNi41OCAxLjc4IDkuMTktLjE1YTEwLjk4IDEwLjk4IDAgMCAwIDQuNDItOC40MmMwLTEuMjUtLjgyLTIuMzItMi4wNS0zLjIyYTE4LjA4IDE4LjA4IDAgMCAwLTQuNzItMi4yNyA0Ni43IDQ2LjcgMCAwIDAtOS43LTIuMDdabTE3LjE4IDIxLjY5Yy0xLjMzIDMuMS00LjYzIDcuNjgtNi4xMSA5LjU4bC4xMS0uMTUgNS4yNC4zOC4wNC0uMDhjLjIzLS41LjQxLTEuMi41NS0yIC4xNC0uODEuMjMtMS43My4zLTIuNjcuMTQtMS44Ny4xNi0zLjguMTQtNS4wMWwtLjI3LS4wNVptLTg0Ljk1IDIwLS4xNi0uMS0xLjM0IDUuMDQuMTEuMDVjNC40IDEuOSAxNC4xMSA0LjA1IDIxLjEgNC42bC4wNS0uMjZjLTcuNzctMy4wNC0xNi4xOS03LjA3LTE5Ljc2LTkuMzNaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzEuMDMgNDguOTljNS4yNSAxLjI0IDE2LjEyIDYuNCAxNy42MSAxNy4xNVwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA4LjA4IDk2LjU4YTEwLjM3IDEwLjM3IDAgMSAxIDAtMjAuNzQgMTAuMzcgMTAuMzcgMCAwIDEgMCAyMC43NFpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiLFxuICAgIHN0cm9rZU1pdGVybGltaXQ6IDEwXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTEwLjggODUuODZhLjQyLjQyIDAgMCAwLS41Ni0uMThjLTEuNDIuNy0yLjk2Ljg4LTMuNTMuODhhLjQyLjQyIDAgMCAwIDAgLjg0Yy42NyAwIDIuMzUtLjIgMy45LS45OC4yLS4xLjI5LS4zNS4xOS0uNTZabS0yLjY2IDMuNTJhLjg4Ljg4IDAgMSAxIDEuNzYtLjEzLjg4Ljg4IDAgMCAxLTEuNzcuMTNabTcuMS0uOTVhLjg4Ljg4IDAgMSAwIC4xMyAxLjc2Ljg4Ljg4IDAgMCAwLS4xMy0xLjc2WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwMC41OCA4Ny4zMXMtNS43My02LjYxLS42Ni0xMS4wM2M2LjYyLTUuOTUgMjEuMTgtLjQ0IDIxLjE4LS40NHMtLjIyIDcuMDYtNC44NSA3Ljk0Yy00LjQyLjY3LTEyLjU4LTIuNDItMTIuNTgtMi40MmwtMy4wOSA1Ljk1WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTk4LjM4IDg4LjY0YTIuNjUgMi42NSAwIDEgMSAwLTUuMyAyLjY1IDIuNjUgMCAwIDEgMCA1LjNaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIixcbiAgICBzdHJva2VNaXRlcmxpbWl0OiAxMFxuICB9KSk7XG59XG52YXIgSWxsdXN0cmF0aW9uTm9SZXN1bHREYXJrX2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25Ob1Jlc3VsdERhcmtfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwgInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX3NwcmVhZFZhbHVlcyh7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB2aWV3Qm94OiBcIjAgMCAyMDAgMjAwXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICBmaWxsOiBcInRyYW5zcGFyZW50XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAwLjc1IDE5MS45OWM2LjIxLS41NiA4LjctOS4yIDEwLjM2LTE1LjA2bDQuOTcgMTUuMDZoLTE1LjMzWlwiLFxuICAgIGZpbGw6IFwiYmxhY2tcIixcbiAgICBzdHJva2U6IFwiYmxhY2tcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDMuOTcgNjIuOTdjLTMuOTQtNS4wMy0xLjk1LTEzLjgxIDcuMzUtMjMuMDMgMTIuOTgtMTEuODggMjUuNTMtOS4yNSAyNi4xMi04Ljk4LjU4LjI3IDEzIDkuMDYgMjQuODIgMjEuM0MxNzQuMDggNjQuNTEgMTg2LjQ2IDc1IDE4Ni42IDkxLjhjLjE2IDE2LjgtMTcuMjUgMjIuODktMzAuMDMgMjIuOTYtMTIuNzcuMDgtNDEuMjctLjI4LTQ2Ljc1LTEuMi0zLjQzIDQuNTEtOC45IDkuMzgtMTAuOTEgMTAuNDQgNC4yMyAzLjYzIDE5LjMyIDE4Ljk4IDIxLjEzIDIyLjIyIDEuODIgMy4yNCA5LjcyIDE0LjUyIDYuMSAzMi4yOC0xLjY3IDguMTMtOC4xOCAxMi4zLTE0LjkgMTMuNiAwIDAtOS4yLS4wNC0xMi4zMyAwLTcuNzguMTQtODguMDIgMC05MC4zNSAwLTIuMzQgMC0zLjAxLTIuMDkgMC04LjE5IDMtNi4xIDE0LjA5LTI1LjM3IDE5LjktMjguOCAyLjMtMS4zMSA3LjUzIDIuMDYgOC42MiAyLjg1IDEuMDMuNzMgMi4wMyAxLjU5IDMuNDUgMS40NyAxLjQyLS4xMiA4Ljg0LS4xNSAxMS4yLS4wNy00LjI4LTMtMjAuMDMtMTcuNjktMjEuOTUtMjQuODMtMS41My01LjY4LjMtOC45NiAxLjExLTkuNzItOC41My00Ljk5LTE3LjItMTQuODktMTMuOC0yOS42Ljk0LTQuMTMgMy41Mi04LjQzIDUuNDQtOS42NyAzLjYyLTIuMzMgMTUuODktMy41IDIzLjMyLTQuMTkgMzIuNy0yLjk4IDEwNy4xOS0xLjkgMTA5LjQ1LTEuODgtMy4xMi0yLjM4LTE1LjItMTUuOTMtMTUuNDgtMTYuMzktLjc3IDIuMjEtMy44MyA1LjAyLTYuMSA0LjctMi4wMy0uMjctMy4xNi0zLjQ1LS44Mi04LjQ3LS44LjgyLTEuNjQgMS42LTIuNDkgMi4zLTEuMjQgMS0yLjggMS4yMS0zLjM3IDAtLjUtMS4wOC0uMzMtMy4xMy44Mi01Ljg1YTE2LjM5IDE2LjM5IDAgMCAxLTMuNTYgMi42OWMtMy42OSAxLjg2LTQuNi01LjI0LjM0LTExLjI4LTcuMSAzLjQ3LTkuMTIgNi4zLTEwLjg4IDEwLjQ3LTEuMDkgMi41Ni0xLjQ3IDQuOTEtNC40NiA2LjI0LTIuMyAxLjAyLTQuMjIuNTEtNS4zMy0uOVpcIixcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTI0LjY0IDQ3LjE3Yy03LjEgMy40Ny05LjEyIDYuMy0xMC44OCAxMC40Ny0xLjA5IDIuNTYtMS40NyA0LjkxLTQuNDYgNi4yNC0yLjMgMS4wMi00LjIyLjUxLTUuMzMtLjktMy45NC01LjA0LTEuOTUtMTMuODIgNy4zNS0yMy4wNCAxMi45OC0xMS44OCAyNS41My05LjI1IDI2LjEyLTguOTguNTguMjcgMTMgOS4wNiAyNC44MiAyMS4zQzE3NC4wOCA2NC41MSAxODYuNDYgNzUgMTg2LjYgOTEuOGMuMTYgMTYuOC0xNy4yNSAyMi44OS0zMC4wMyAyMi45Ni0xMi43Ny4wOC00MS4yNy0uMjgtNDYuNzUtMS4ybTE0LjgyLTY2LjM5YzctMi42IDYuNjQtNC45NyA2LjIzLTUuNDQtLjQyLS40Ny00LjY0IDIuNzQtNi4yMyA1LjQ0Wm0wIDBjLTQuOTQgNi4wNC00LjAzIDEzLjE0LS4zNCAxMS4yOCA0Ljg1LTIuNDYgMTIuMDktMTIuNzggMTEuNjQtMTMuMTItLjMxLS4yNS0yLjA3Ljc0LTUuMzIgNS41LTMuNTQgNS4xOC00LjM0IDkuMTItMy41OCAxMC43Ny41NyAxLjIyIDIuMTMgMS4wMSAzLjM3IDAgNC44LTMuOSA5LjQxLTEwLjg4IDkuMTYtMTEuMDYtLjI0LS4xNy0xLjg0LjQ1LTUuNiA2Ljc3LTMuNjggNi4xNy0yLjU0IDEwLjE2LS4yNiAxMC40OCAyLjI4LjMxIDUuMzQtMi41IDYuMTEtNC43LjI4LjQ1IDEyLjM2IDE0IDE1LjQ4IDE2LjM4bS00NS40OCAzNC4xYy0zLjQzIDQuNS04LjkgOS4zOC0xMC45MSAxMC40M20xMC45MS0xMC40M2MzLjU5LTQuOTIgNi43Ni05Ljk0IDguMzEtMTUuM005OC45MSAxMjRjNC4yMyAzLjYzIDE5LjMyIDE4Ljk4IDIxLjEzIDIyLjIyIDEuODIgMy4yNCA5LjcyIDE0LjUyIDYuMSAzMi4yOC0xLjY3IDguMTMtOC4xOCAxMi4zLTE0LjkgMTMuNiAwIDAtOS4yLS4wNC0xMi4zMyAwLTcuNzguMTQtODguMDIgMC05MC4zNSAwLTIuMzQgMC0zLjAxLTIuMDkgMC04LjE5IDMtNi4xIDE0LjA5LTI1LjM3IDE5LjktMjguOCAyLjMtMS4zMSA3LjUzIDIuMDYgOC42MiAyLjg1IDEuMDMuNzMgMi4wMyAxLjU5IDMuNDUgMS40NyAxLjQyLS4xMiA4Ljg0LS4xNSAxMS4yLS4wN005OC45MiAxMjRIODguMW0tMzYuMzYgMzUuMzZjMy4wNS4xIDkuNi0uNSAxMS44NCAxLjU0IDIuMDUgMS44NS41NiA0LjYtMi41MyAzLjg0LTMuNjQtLjg4LTguMTMtNC41NS05LjMxLTUuMzhabTAgMGMtNC4yOS0zLTIwLjA0LTE3LjY5LTIxLjk2LTI0LjgzLTEuNTMtNS42OC4zLTguOTYgMS4xMS05LjcybTAgMGExODguOSAxODguOSAwIDAgMCAxOS4zNyA4LjkxbS0xOS4zNy04LjljLTguNTMtNS0xNy4yLTE0LjktMTMuOC0yOS42Mi45NC00LjEyIDMuNTItOC40MiA1LjQ0LTkuNjYgMy42Mi0yLjMzIDE1Ljg5LTMuNSAyMy4zMi00LjE5IDMyLjctMi45OCAxMDcuMTktMS45IDEwOS40NS0xLjg4TTUwLjI2IDEzMy43MmM5LjM3IDMuNTUgMTkuMiA2LjI2IDIyLjM4IDkuOSAzLjE4IDMuNjQtLjc2IDguNjctMS45MSAxMi43NS0uMyAxLjAzLS42MyAyLjYtLjI3IDMuNS40NSAxLjEzIDEuNzggMS4zNiAzLjc1LS4xOCAzLjUyLTIuNzQgNi42NS05LjU2IDcuMy0xMS41Ny42NS0yLTQuNDQgOC4yNy00Ljk4IDEyLjgtLjU0IDQuNTQgMy40OSAzLjggNi4yIDBhMzUuNjggMzUuNjggMCAwIDAgNS4wMi0xMC41MmMuMjEtLjk4LTIuNzQgNS40NC0zLjYgOS4zLS4yNCAxLjAzLS44NSAzLjQ3IDAgNC40NC45NSAxLjEgMi44Ny44MSA1LjA3LTIuNzNhNDIuNjcgNDIuNjcgMCAwIDAgNC42LTExLjAxYy4yMi0xLjMtMy4wNSA3LjMtMy41NSAxMS41LS4zNCAyLjk0LjY3IDQuMzggNC4xOCAwIDEuOTktMi40OCAzLjQ0LTYuMjggNC4zMy0xMC4xMm0tNDguNTItMTguMDZjLTEuOTcgMi43Mi00LjI1IDUuMy0xMC44IDYuMzJtMjUuODMtMzUuOTNjLTUuNzEtNC4xNC04Ljk3LTQuNTYtMTEuNDYtNC41Ni0zLjY0IDAtNC40OCAxLjk1LTEuMTYgMy4yIDMuMzIgMS4yNCA5LjM1IDEuMzYgMTIuNjIgMS4zNlptMCAwaDYuOTFtLTYuOTEgMGM1LjEgMy43MSAxNC43MiAxMS40IDIyLjggMTkuOW02Ny4yMS00NC41NGMyLjI2LjAyIDYuMTQuNyA1LjggMy4xLS4yMSAxLjU2LTQuNzEtMi4xMi01LjgtMy4xWk04OC4xIDEyNGMuODQuODggMS42NiAxLjc3IDIuNDYgMi42NyAxLjk0IDIuMTggOC40NyA5LjYgOS4xMiAxNC4xNS4zNyAyLjU4LjA2IDYuNzktLjkgMTAuOTZtMCAwYzMuMTggMi45MiA3LjM0IDguMjQgOC4yNCAxNC4xNy45IDUuOTMgMCAxMy40Ny05LjQgMjEuMzVcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTE1Ljk0IDE5Mi4xMy01LjE3LTE1LjY3LS4xMy40NGMtLjgzIDIuOTMtMS44NiA2LjUzLTMuNDUgOS40OC0xLjYgMi45NS0zLjc1IDUuMi02Ljc4IDUuNDd2LjI4aDE1LjUzWlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTIyLjQyIDEzNy4zNSA1LjA5IDkuNDhoLTcuNDVsLTUuMS05LjQ4aDcuNDZaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTA0LjEgMTQxLjQ4aDMzLjk1bDE0LjgyIDI3LjQzaC0zMy45NWwtMTQuODItMjcuNDNaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMTM5LjUyMSxcbiAgICB5OiAxNTUuMTM1LFxuICAgIHdpZHRoOiA0My41OTU4LFxuICAgIGhlaWdodDogMzguODYxMSxcbiAgICBmaWxsOiBcIiNFNkU4RUFcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTEzOS44NyAxNTQuNyA5LjI4LTE2Ljg1aDQzLjQ2bC05LjI5IDE2Ljg0aC00My40NVpcIixcbiAgICBmaWxsOiBcIiNFNkU4RUFcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDExMS4yMjMsXG4gICAgeTogMTU1LjEzNSxcbiAgICB3aWR0aDogMjguMTg0MSxcbiAgICBoZWlnaHQ6IDM4Ljg2MTEsXG4gICAgZmlsbDogXCIjRTZFOEVBXCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwibTE2Ni41NiAxNTQuOTEgMy45LTYuOTdoLTYuMTNsLTMuNiA2LjQyaC0uM3YxMy4zOGg2LjEzVjE1NC45WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IDQ1LjU3ODgsXG4gICAgY3k6IDM4LjY3NSxcbiAgICByOiAzMy4xNzExLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5LWxpZ2h0LWRlZmF1bHQpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk00OC44NSA0Ny42NmEzLjI0IDMuMjQgMCAwIDAgMi40Ni0zLjg3Yy0uMjgtMS4yMi4yNy0yLjQxIDEuMTQtMy4zIDMuMDMtMy4xMyA1LjA4LTcuNzkgMy42Ni0xMi43OGExMS4yNCAxMS4yNCAwIDAgMC01LjQzLTYuNmMtMi45LTEuNi02LjQ3LTEuOS05Ljg3LS44N2wtLjE3LjA4Yy01Ljc4IDEuOTYtOC4zIDcuMDUtOC4yNiAxMS45Ni4wMiAyLjA1IDIuMTIgMy4yIDQuMDkgMi42NCAyLS41NyAyLjk3LTIuOCAzLjYzLTQuNzhhNC4yMSA0LjIxIDAgMCAxIDIuOTMtMi43NSA1IDUgMCAwIDEgNC4xNi4yNmMuODguNjQgMS41OCAxLjM1IDEuNzggMi4yOC44NCAyLjQ3LS44MyA1LjItMi43NCA2LjQyLTIuNjggMS42OC0zLjAzIDUuNDgtMi40NiA4LjguMzYgMi4xIDIuNTUgMy4xNiA0LjYxIDIuNjNsLjQ3LS4xMlptLjAyIDMuMTZhNC4xIDQuMSAwIDEgMSAyLjUzIDcuOCA0LjEgNC4xIDAgMCAxLTIuNTMtNy44WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtOTguNjMgODIuNTgtLjEtLjAxLS4wNC4xYy0uNzkgMi40My0xLjY2IDUuMjQtMS41MiA4LjA0LjE0IDIuODEgMS4zIDUuNjEgNC41MyA4IDMuMTcgMi4zNSA2LjU4IDEuNzggOS4xOS0uMTVhMTAuOTggMTAuOTggMCAwIDAgNC40Mi04LjQyYzAtMS4yNS0uODItMi4zMi0yLjA1LTMuMjJhMTguMDggMTguMDggMCAwIDAtNC43Mi0yLjI3IDQ2LjcgNDYuNyAwIDAgMC05LjctMi4wN1ptMTcuMTggMjEuNjljLTEuMzMgMy4xLTQuNjMgNy42OC02LjExIDkuNThsLjExLS4xNCA1LjI0LjM3LjA0LS4wOGMuMjMtLjUuNDEtMS4yLjU1LTIgLjE0LS44LjIzLTEuNzMuMy0yLjY3LjE0LTEuODcuMTYtMy44LjE0LTUuMDFsLS4yNy0uMDVabS04NC45NSAyMC0uMTYtLjEtMS4zNCA1LjA0LjExLjA1YzQuNCAxLjkgMTQuMTEgNC4wNSAyMS4xIDQuNmwuMDUtLjI2Yy03Ljc3LTMuMDQtMTYuMTktNy4wNy0xOS43Ni05LjMzWlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTcxLjAzIDQ4Ljk5YzUuMjUgMS4yMyAxNi4xMiA2LjQgMTcuNjEgMTcuMTVcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwOC4wOCA5Ni41OGExMC4zNyAxMC4zNyAwIDEgMSAwLTIwLjc0IDEwLjM3IDEwLjM3IDAgMCAxIDAgMjAuNzRaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCIsXG4gICAgc3Ryb2tlTWl0ZXJsaW1pdDogMTBcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMTAuOCA4NS44NmEuNDIuNDIgMCAwIDAtLjU2LS4xOGMtMS40Mi43LTIuOTYuODgtMy41My44OGEuNDIuNDIgMCAxIDAgMCAuODRjLjY3IDAgMi4zNS0uMiAzLjktLjk4LjItLjEuMjktLjM1LjE5LS41NlptLTIuNjYgMy41MmEuODguODggMCAxIDEgMS43Ni0uMTMuODguODggMCAwIDEtMS43Ny4xM1ptNy4xLS45NWEuODguODggMCAxIDAgLjEzIDEuNzYuODguODggMCAwIDAtLjEzLTEuNzZaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTAwLjU4IDg3LjMxcy01LjczLTYuNjEtLjY2LTExLjAzYzYuNjItNS45NSAyMS4xOC0uNDQgMjEuMTgtLjQ0cy0uMjIgNy4wNi00Ljg1IDcuOTRjLTQuNDIuNjctMTIuNTgtMi40Mi0xMi41OC0yLjQybC0zLjA5IDUuOTVaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNOTguMzggODguNjRhMi42NSAyLjY1IDAgMSAxIDAtNS4zIDIuNjUgMi42NSAwIDAgMSAwIDUuM1pcIixcbiAgICBmaWxsOiBcIndoaXRlXCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIixcbiAgICBzdHJva2VNaXRlcmxpbWl0OiAxMFxuICB9KSk7XG59XG52YXIgSWxsdXN0cmF0aW9uTm9SZXN1bHRfZGVmYXVsdCA9IFN2Z0NvbXBvbmVudDtcbmV4cG9ydCB7XG4gIElsbHVzdHJhdGlvbk5vUmVzdWx0X2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsICJ2YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIFN2Z0NvbXBvbmVudChwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19zcHJlYWRWYWx1ZXMoe1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgdmlld0JveDogXCIwIDAgMjAwIDIwMFwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgcHJvcHMpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNjQuMDkgNjQuODZWOC41Nkw1Ljc2IDc4Ljk0aDQ0LjI2djIwLjNoMTQuMDd2LTIwLjNoOC44MlY2NC44NmgtOC44MlptMTEwLjE4IDBWOC41NkwxMjQuMSA2OS4wOGMuNy0zLjc0IDEuMDctNy43IDEuMDctMTEuNzYgMC0xMS0yLjctMjEuMS03LjI1LTI4LjU1LTQuNS03LjQtMTEuMTMtMTIuNjMtMTktMTIuNjMtNy44OCAwLTE0LjUgNS4yMy0xOS4wMSAxMi42My00LjU0IDcuNDUtNy4yNSAxNy41NS03LjI1IDI4LjU1czIuNyAyMS4xIDcuMjUgMjguNTVjNC41IDcuNCAxMS4xMyAxMi42MiAxOSAxMi42MiA3Ljg4IDAgMTQuNS01LjIzIDE5LjAxLTEyLjYyYTQ0LjA5IDQ0LjA5IDAgMCAwIDMuNC02LjkzaDM4Ljg2djIwLjNoMTQuMDh2LTIwLjNoOC44MVY2NC44NmgtOC44MVptLTEzOC41NyAwTDUwLjAyIDQ3LjZ2MTcuMjZIMzUuN1ptMTI0LjUgMGgtMTQuMzJMMTYwLjIgNDcuNnYxNy4yNlptLTQ5LjEtNy41NGMwIDguODQtMi4yIDE2LjMyLTUuMTkgMjEuMjItMy4wOCA1LjA4LTUuODcgNS44Ny02Ljk4IDUuODctMS4xMiAwLTMuOS0uOC03LTUuODctMi45OC00LjktNS4xOS0xMi4zOC01LjE5LTIxLjIyIDAtOC44NSAyLjIxLTE2LjMzIDUuMi0yMS4yMyAzLjA5LTUuMDcgNS44Ny01Ljg3IDYuOTktNS44NyAxLjEgMCAzLjkuOCA2Ljk4IDUuODcgMi45OSA0LjkgNS4yIDEyLjM4IDUuMiAyMS4yM1pcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIixcbiAgICBmaWxsT3BhY2l0eTogMC4yXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTcwLjIgMTg2LjhjMS40OC43OSA2LjI5IDEuOTYgOC4xNC0uMjMgMS4wOCAwIDIuMzEuMTcgMy42Ny4zNiAyLjI4LjMyIDQuOTMuNjkgNy44Ny4zOSAyLjI0LS4yMyAyLjQ2LTEuMTQgMi4xMi0xLjYxIDEuODQtLjUgMi4xNS0uNzggMi4yNC0xLjA4LjA5LS4zLTEuMDMtMi4wOS00LjM2LTQuMmwtMS45Mi0xLjJjLTMuMTMtMS45My02LjgtNC4yLTcuODUtNS45NC0xLjI3LTIuMTItMS43Ni0xNS40OS0yLjEtMjkuNzZsLS4xLTQuOTRjLS4yNy0xNC41LS42NS0zNS4yNS02LjM2LTQzLjc3LTYuNC05LjU1LTI0LjYtMTIuNzItNDAuODktMTEuOWE2MC4wOSA2MC4wOSAwIDAgMC0zMyAxMS43NWMtNS41IDQuMDktMTQuMDMgMTIuODItMTQuODcgMTMuODQtLjM3LjQ2LTUuNDMgNC45LTExLjE1IDkuODctMy40OS0xMC41LTExLjEzLTI4LjEzLTE1Ljg4LTI4LjctNC42Mi0uNTYtMy43OSA0LjE4LTMuNjUgNC45NmwuMDEuMDZjLjMzIDEuOTggMS4zNiA1LjY2IDIuMjQgOC44MS43NSAyLjcxIDEuNCA1LjAzIDEuNCA1LjU0IDAgLjg3IDIuMjEgMTMuODQgMy4zMiAyMC4yLS45OC0uNDYtMy40My0xLjItNy4xOS0xLjUyYTQ5LjYyIDQ5LjYyIDAgMCAwLTcuMTYtLjA3Yy05LjgzLjU4LTIyLjM3IDQuMjUtMjUuNiAxNy4zOC0zLjIyIDEzLjEzIDkuNCAyMi42NiAyMS45MiAyOC45MiAxMC4wMiA1LjAxIDI0LjMgOS40IDMwLjE4IDEwLjk4LTEuNDYuNTItNC4zOSAxLjgtNC40NCAyLjcyLS4wNyAxLjE1IDIuNiAyLjE0IDkuMzUgMi44MyA2Ljc1LjcgMzQuNzEgMS4yMyA0MS4wOS43OCA2LjM4LS40NCAxMC4wNi01LjcxIDE3LjQzLTIwLjE0bDEuNDMtMi44My0uMTMuMzhjLTIuMTYgNi4yNS0zLjM2IDkuNy0yLjE2IDEzLjM3IDEuMjIgMy43NSA0LjQgNS4wMyA1Ljc1IDUuMDdsLjIyLjAxYzEuNzEuMDcgOS4xNy4zNiAxNC45OC0xIC4wNiAwIDEuMTcuMDQgMi43OC4xMiAzLjk4LjE4IDEwLjk2LjUgMTIuMzQuMzQuMS4wOC4yMi4xNS4zNC4yMlptLTYyLjMzLTU3Ljg0Yy41IDMuMjcgMS4xNCA2Ljc3IDEuOTQgMTAuNDItMS4yNCAyLTIuNDMgMy45OC0zLjU1IDUuODctMi4zMi0uOTQtOS0zLjU1LTEyLjA1LTQuNzQgNS44OS00LjQgMTEuMzUtOS4wOSAxMy42Ni0xMS41NVpcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xOTIgMTg1LjcxYy0xLjYtMi4zLTkuNy01LjM0LTE1LjA0LTUuNzUtNS4zNC0uNDEtNi40NS41My03LjQgMS44NS0xIDEuMzctMS4wNSAzLjcyLjMgNC43OG0yMi4xNC0uODhjLjM0LjQ3LjEyIDEuMzgtMi4xMiAxLjYtMi45NC4zLTUuNTktLjA2LTcuODctLjM4LTEuMzYtLjE5LTIuNTktLjM2LTMuNjctLjM2LTEuODUgMi4yLTYuNjYgMS4wMi04LjEzLjI0YTIuNDYgMi40NiAwIDAgMS0uMzQtLjIybTIyLjEzLS44OGMxLjg0LS41IDIuMTUtLjc4IDIuMjQtMS4wOC4wOS0uMy0xLjAzLTIuMDktNC4zNi00LjJsLTEuOTItMS4yYy0zLjEzLTEuOTMtNi44LTQuMi03Ljg1LTUuOTQtMS4yNy0yLjEyLTEuNzYtMTUuNDktMi4xLTI5Ljc2bC0uMS00Ljk0Yy0uMjctMTQuNS0uNjUtMzUuMjUtNi4zNi00My43Ny02LjQtOS41NS0yNC42LTEyLjcyLTQwLjg5LTExLjlhNjAuMDkgNjAuMDkgMCAwIDAtMzMgMTEuNzVjLTUuNSA0LjA5LTE0LjAzIDEyLjgyLTE0Ljg3IDEzLjg0LS4zNy40Ni01LjQzIDQuOS0xMS4xNSA5Ljg3LTMuNDktMTAuNS0xMS4xMy0yOC4xMy0xNS44OC0yOC43LTQuNjItLjU2LTMuNzkgNC4xOC0zLjY1IDQuOTZsLjAxLjA2Yy4zMyAxLjk4IDEuMzYgNS42NiAyLjI0IDguODEuNzUgMi43MSAxLjQgNS4wMyAxLjQgNS41NCAwIC44NyAyLjIxIDEzLjg0IDMuMzIgMjAuMi0uOTgtLjQ2LTMuNDMtMS4yLTcuMTktMS41Mm0xOS4zNCA1Ny4yMWMtNS44OC0xLjU3LTIwLjE2LTUuOTctMzAuMTgtMTAuOTgtMTIuNTItNi4yNi0yNS4xNC0xNS44LTIxLjkxLTI4LjkyIDMuMjItMTMuMTMgMTUuNzYtMTYuOCAyNS41OS0xNy4zOCAyLjc1LS4xNiA1LjE0LS4xIDcuMTYuMDdtMTkuMzQgNTcuMjFjLTEuNDYuNTItNC4zOSAxLjgtNC40NCAyLjcyLS4wNyAxLjE1IDIuNiAyLjE0IDkuMzUgMi44MyA2Ljc1LjcgMzQuNzEgMS4yMyA0MS4wOS43OCA2LjM4LS40NCAxMC4wNi01LjcxIDE3LjQzLTIwLjE0bDEuNDMtMi44M20tNjQuODYgMTYuNjRjNS44OS0yLjQ5IDEyLjM1LTYuMzIgMTYuNDktMTAuMTEgNS4wNy00LjY1IDkuNTUtMTMuNDYgOS45Ni0xNC4yOGwuODItMS41Nm00My40MyA0LjE1Yy0uNDctMy0xLjIxLTcuMzMuMzctMTQuNjcgMS40Ny02LjgxIDYuNi0xNS4zIDYuNjUtMTEuMDMuMDUgNC02LjA1IDE3LjM1LTEyLjg2IDMwLjg2bTAgMC0uMTMuMzhtLjEzLS4zOC0uMTMuMzhtMTguOCAxNy40NWMxLjE3LS4yNyAyLjI4LS42MSAzLjI2LTEuMDMgNi4wOS0yLjYzIDEwLjkyLTguNTUgMTMuNTMtMjQuMjYgMi42Mi0xNS43MSAxLjUtNDIuMzYtMTAuMjktNTAuNzgtMTEuNzgtOC40MS0yMS4zMi02LjA3LTM0LjAzIDUuOC01LjM0IDQuOTgtMTEuODYgMTQuNTItMTcuNDIgMjMuNTJtNDQuOTQgNDYuNzVjLTUuODEgMS4zNi0xMy4yNyAxLjA3LTE0Ljk4IDFoLS4yMmMtMS4zNi0uMDUtNC41My0xLjMzLTUuNzUtNS4wOC0xLjItMy42NyAwLTcuMTIgMi4xNi0xMy4zN20xOC44IDE3LjQ1Yy4wNSAwIDEuMTYuMDQgMi43OC4xMiAzLjk3LjE4IDEwLjk1LjUgMTIuMzMuMzRtLTYwLjA2LTQ3LjJjLS44LTMuNjYtMS40NC03LjE2LTEuOTQtMTAuNDNtMS45NCAxMC40MmMtMS4yNCAyLTIuNDMgMy45OC0zLjU1IDUuODdtLjMyLTMwLjljMCAzLjc1LjQxIDguOCAxLjMgMTQuNjFtMCAwYy0yLjMyIDIuNDYtNy43OCA3LjE1LTEzLjY3IDExLjU1bS00Mi4zMi0xMi43OHMxLjI0IDcuMTIgMy44NyAxMS40MmEyOS45MyAyOS45MyAwIDAgMCA2LjYxIDcuOG0zNi4xMyAxMi4wNGMtNi44Ny0zLjEtMTcuODctNi44LTIyLjUxLTguMjdtMjIuNTEgOC4yN2MxLjM1LTIuNTEgNC4yLTcuNyA3Ljc2LTEzLjc0TTc2IDE1MC43MmMuMzktLjA2Ljc4LS4xNCAxLjE3LS4yMyAzLjk3LS45MyAxMC43Ni01LjI5IDE3LjA1LTkuOThtLTE4LjIyIDEwLjJjLTQuNy44LTkuMzYtLjM0LTEzLjYyLTMuNzZtMCAwYy0zLjI5LS44NS0xMS4yOC0yLjM5LTEyLjg2LTIuNDFtNTYuNzUuNzFjLTIuMzItLjk0LTktMy41NS0xMi4wNS00Ljc0XCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm03Ny43NCA3My4zMSAyMy43MyA0My4yLTEuNyAyLjUtMjIuNzMgOS41NS0yNC41OC00NC40OCAyMS45LTEwLjc3aDMuMzhaXCIsXG4gICAgZmlsbDogXCIjNkI3MDc1XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzQuMzUgNzMuMzFoMy40bDIzLjcyIDQzLjItMS43IDIuNW0tMjUuNDItNDUuNy0yMS45IDEwLjc3IDI0LjU5IDQ0LjQ4TDk5Ljc4IDExOW0tMjUuNDMtNDUuNyAyNS40MyA0NS43XCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04My45IDExNi45NWMuOTYgMS45Ni00LjkxIDQuNTctOC4zMiA2LjE4LTEuMzMuNjMtMi4xLjk4LTIuNyAxLjIuOSAzLjMgMS4yNCA4LjE0LTQuNDggOS44Mi01LjczIDEuNjktMTUuMDctMS4wMi0xOC05LjYtMi45NS04LjYuMDEtMTkuOTcgOS4wNS0yNy4wNCA1LjY3LTQuNDIgMTUuMDEtNS43NyAxOS40Mi00LjA1IDIuMTUuODIgMS4zOCAyLjcxLS41NiA0LjQ0YTU4LjA4IDU4LjA4IDAgMCAxLTQuNTMgMy41OGMuNC0uMDEuOC0uMDIgMS4yMy0uMDEgNC4xMy4wNyA3LjI2IDEuMTIgNy40MiAzLjE1LjA3Ljk0LS44IDIuMTMtMS45NSAzLjQ1LS42Mi43MS0xLjI4IDEuMzQtMS45NSAxLjg4IDIuOC0uMjMgNS45NCAxLjA1IDIuOSA0LjItLjQxLjQzLS44NS44My0xLjI5IDEuMiAxLjczLjAyIDMuMjQuNTYgMy43NSAxLjZaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjkuNzMgMTI1LjFjMS42NS0uMzQgMi4yLS40IDMuMTQtLjc2bTAgMGMuNi0uMjMgMS4zOC0uNTkgMi43LTEuMjEgMy40Mi0xLjYgOS4zLTQuMjIgOC4zMi02LjE4LS44Ni0xLjc1LTQuNTMtMi4wOC03LjMzLS45Ni0yLjg0IDEuMTMtMy41OCAyLjI0LTMuNDYgMi41Ni4xMi4zMSA0Ljc1LS42OSA4LjM0LTQuNCAzLjQtMy41NC0uOTYtNC43LTMuOS00LjA2LTIuMjYuNS02LjQgMi4wNi02LjE2IDIuODUuMTYuNSA1LjMzLS41NCA5LjEtNC44NyAxLjE0LTEuMzIgMi4wMi0yLjUxIDEuOTUtMy40NS0uMTYtMi4wMy0zLjMtMy4wOC03LjQyLTMuMTUtOC44My0uMTYtMTEuNTYgNC43OC0xMS4xNiA1LjEgMS4xLjkyIDkuMzYtNC4xNSAxNC40Ni04LjY3IDEuOTQtMS43MyAyLjcxLTMuNjIuNTYtNC40NC00LjQtMS43Mi0xMy43NS0uMzctMTkuNDIgNC4wNS05LjA0IDcuMDctMTIgMTguNDQtOS4wNiAyNy4wMyAyLjk0IDguNiAxMi4yOCAxMS4zIDE4IDkuNjEgNS43My0xLjY4IDUuNC02LjUzIDQuNDgtOS44MVpcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTA2LjQ4IDEyMC4xNWMtLjIgMS41Ni0uNTMgMy45OC0xLjIgNi41MS0uNjggMi41My0xLjcxIDUuMTYtMy4zIDcuMTRsLjIuMTkgNS42Ny00Ljk3LTEuMS04Ljg3aC0uMjdabTMxLjA5IDQ1LjMyLS4yNS0uMS0xMS4zIDIxLjI3aDExLjkybC0uNDMtLjI1Yy0zLjUtMi4wOC00LjA3LTUuOC0zLjQ2LTkuNzguNTItMy40IDEuOS02Ljk1IDMtOS43NmwuNTItMS4zOFptLTg1LjgxLTM3Ljg5LS4yNC4xMmMuMyAxLjQ2IDEuMDQgNC44IDEuNjUgNi4zOWwuMDEuMDUuMDUuMDJjMS42My44NCA0LjQgMS44NSA3LjQ1IDIuMTQgMy4wNS4zIDYuMzktLjEyIDkuMS0yLjE1bC0uMTItLjI0Yy0zLjE0IDEuMi0xMS4xNCAxLjYzLTE3LjktNi4zM1pcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwibTEzMy41NCA4Mi44My4wMi0uMTZoLS4xNmMtMS44Mi4xLTUuODQuMzktOS44Ny45Ni0yLjAyLjI4LTQuMDQuNjQtNS43OSAxLjA4LTEuNzQuNDMtMy4yMy45NS00LjE4IDEuNThsLS4wNi4wNHYuMDdjLS4wNCAxLjguMTMgMy42OS42NSA1LjM1YTcuMjggNy4yOCAwIDAgMCAyLjggNC4wNWMyLjgxIDEuODYgNi42OSAxLjYyIDkuOTgtLjU4IDMuMy0yLjIgNi4wNC02LjM3IDYuNjEtMTIuNFpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMjYuNjYgODQuNzNhOS43OSA5Ljc5IDAgMCAxLTkuNyA5Ljg3IDkuNzkgOS43OSAwIDAgMS05LjctOS44NyA5Ljc5IDkuNzkgMCAwIDEgOS43LTkuODdjNS4zNSAwIDkuNyA0LjQxIDkuNyA5Ljg3WlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMDkuNDEgNzAuNmMuNjYuMjUgMS4yNS40NyAxLjkuMjYuNTItLjE4LjgzLS43IDEuMTgtMS4zLjc1LTEuMjcgMS43My0yLjkzIDUuNTctMi41NiAzLjg1LjM4IDQuNTggMi4xNyA1LjEgMy40My4yLjUuMzcuOS42OCAxLjEyLjQ4LjMyLjg0LjMzIDEuMjYuMzUuNTUuMDIgMS4yLjA1IDIuMzcuNzUgMS40MS44NSAyLjQ5IDUuNjUuMjMgOS45M2wuMjYuNDNjLS40NSAyLjE1LTMuMDUgNC4zNy0zLjA1IDQuMTQgMC0zLjA0IDAtNC43NS0yLjkyLTcuNDMtNC4yNiAxLjYtMTAuODkgMS4xMy0xMy45NC4xNC00LTEuMjgtNS45OC02LjgxLTIuNTMtOSAxLjcyLTEuMSAyLjg4LS42NSAzLjktLjI2WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTE2LjcgODEuNmEuNDEuNDEgMCAxIDAtLjc0LjRjLjIuMzkuNDcuNzQuOS45NS40MS4yLjkzLjI1IDEuNTguMTdhLjQxLjQxIDAgMSAwLS4xLS44MmMtLjU4LjA3LS45LjAxLTEuMTItLjA5LS4yLS4xLS4zNi0uMjgtLjUzLS42Wm0tNi41NyA0LjIyYTEuMDcgMS4wNyAwIDAgMCAxLTEuMTMgMS4wNiAxLjA2IDAgMCAwLTEuMS0xLjAyYy0uNTkuMDMtMS4wMy41NC0xIDEuMTMuMDIuNi41MiAxLjA1IDEuMSAxLjAyWm02LjgyLjczYTEuMDcgMS4wNyAwIDAgMCAxLTEuMTMgMS4wNiAxLjA2IDAgMCAwLTEuMS0xLjAxYy0uNTguMDItMS4wMy41My0xIDEuMTIuMDMuNi41MiAxLjA1IDEuMSAxLjAyWlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGN4OiAxMjcuNDIxLFxuICAgIGN5OiA4Ni4wMDg2LFxuICAgIHJ4OiAyLjQ3OTM0LFxuICAgIHJ5OiAyLjQ3OTM0LFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICByOiA0LjY3MTAyLFxuICAgIHRyYW5zZm9ybTogXCJtYXRyaXgoMC43MDcxMDYgMC43MDcxMDggLTAuNzA3MTA2IDAuNzA3MTA4IDc1LjA1MDkgNzUuNzc5OSlcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIixcbiAgICBzdHJva2U6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIHN0cm9rZVdpZHRoOiAzXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNzcuOSA3Mi45N2ExLjEgMS4xIDAgMCAwLTEuNTcgMGwtMS4yNiAxLjI3LTEuMzEtMS4zMWExLjEgMS4xIDAgMSAwLTEuNTcgMS41N2wxLjMxIDEuMy0xLjMgMS4zMWExLjEgMS4xIDAgMCAwIDEuNTYgMS41N2wxLjMtMS4zIDEuMjcgMS4yNmExLjEgMS4xIDAgMSAwIDEuNTctMS41N2wtMS4yNi0xLjI2IDEuMjYtMS4yN2ExLjEgMS4xIDAgMCAwIDAtMS41N1pcIixcbiAgICBmaWxsOiBcIiNDNkNBQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTk5LjQxIDQ5LjExYTMyLjI2IDMyLjI2IDAgMCAwLTE5LTkuODQgMi4xNCAyLjE0IDAgMCAwLTIuNDIgMi4wMmMtLjA3IDEuMi44MiAyLjIgMS45NyAyLjM3YTI3Ljg2IDI3Ljg2IDAgMCAxIDE2LjEzIDguMzZjLjgzLjg3IDIuMjQuOTkgMy4xNy4xNS44OC0uNzkuOTktMi4xNy4xNS0zLjA2Wm0tMzUuOC04LjUyYTMyLjUgMzIuNSAwIDAgMC0xOC43NCAxNS43MyAyLjE0IDIuMTQgMCAwIDAgMS4wMSAyLjkzYzEuMTEuNTIgMi40LjAyIDIuOTYtMS4wMmEyOC4wOCAyOC4wOCAwIDAgMSAxNS45Ni0xMy40IDIuMjggMi4yOCAwIDAgMCAxLjUzLTIuNzIgMi4xNCAyLjE0IDAgMCAwLTIuNzItMS41MlptMjcuNzUgMTUuNzhjLTMuMDItMy4xNC03LTUuMzgtMTEuNTMtNi4yMmEyLjExIDIuMTEgMCAwIDAtMi40NyAyIDIuMzMgMi4zMyAwIDAgMCAxLjkgMi4zOGMzLjQxLjY5IDYuNDMgMi4zNyA4Ljc1IDQuNzIuODUuODUgMi4yNiAxIDMuMi4xNS44Ny0uNzggMS0yLjE1LjE1LTMuMDNabS0yNC42NC00LjY1YTIxLjYzIDIxLjYzIDAgMCAwLTExLjY2IDkuOCAyLjEgMi4xIDAgMCAwIC45OSAyLjk0YzEuMTIuNTIgMi40LjAxIDIuOTgtMSAyLTMuNDUgNS4xNy02LjExIDguOTEtNy41IDEuMS0uNCAxLjgxLTEuNTYgMS41LTIuNzVhMi4xIDIuMSAwIDAgMC0yLjcyLTEuNVptMTYuNjMgMTEuOTVhMTAuNjkgMTAuNjkgMCAwIDAtNC0yLjQ3Yy0xLjM1LS40Ny0yLjU2LjYyLTIuNjMgMS45LS4wNyAxLjE0LjczIDIuMDQgMS42NSAyLjQ0YTYuMyA2LjMgMCAwIDEgMS41Mi45NGMuODkuNzQgMi4zMyAxIDMuMzIuMTEuODItLjc0IDEtMi4wNy4xNC0yLjkyWm0tMTQuMjctLjc2Yy0xLjgzLjgzLTMuNCAyLjE2LTQuNTEgMy44My0uNzMgMS4wOC0uMTYgMi40Mi45IDIuOTIgMS4xNC41MyAyLjM4LS4wMiAzLjA1LS44OGE2LjM1IDYuMzUgMCAwIDEgMS45My0xLjYzYy45NS0uNTIgMS42OC0xLjYzIDEuMzctMi44My0uMy0xLjE1LTEuNTQtMS45NS0yLjc0LTEuNFpcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIlxuICB9KSk7XG59XG52YXIgSWxsdXN0cmF0aW9uTm90Rm91bmREYXJrX2RlZmF1bHQgPSBTdmdDb21wb25lbnQ7XG5leHBvcnQge1xuICBJbGx1c3RyYXRpb25Ob3RGb3VuZERhcmtfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwgInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX3NwcmVhZFZhbHVlcyh7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB2aWV3Qm94OiBcIjAgMCAyMDAgMjAwXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICBmaWxsOiBcInRyYW5zcGFyZW50XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk02NC4wOSA2NC44NlY4LjU2TDUuNzYgNzguOTRoNDQuMjZ2MjAuM2gxNC4wN3YtMjAuM2g4LjgyVjY0Ljg2aC04LjgyWm0xMTAuMTggMFY4LjU2TDEyNC4xIDY5LjA4Yy43LTMuNzQgMS4wNy03LjcgMS4wNy0xMS43NiAwLTExLTIuNy0yMS4xLTcuMjUtMjguNTUtNC41LTcuNC0xMS4xMy0xMi42My0xOS0xMi42My03Ljg4IDAtMTQuNSA1LjIzLTE5LjAxIDEyLjYzLTQuNTQgNy40NS03LjI1IDE3LjU1LTcuMjUgMjguNTVzMi43IDIxLjEgNy4yNSAyOC41NWM0LjUgNy40IDExLjEzIDEyLjYyIDE5IDEyLjYyIDcuODggMCAxNC41LTUuMjMgMTkuMDEtMTIuNjJhNDQuMDkgNDQuMDkgMCAwIDAgMy40LTYuOTNoMzguODZ2MjAuM2gxNC4wOHYtMjAuM2g4LjgxVjY0Ljg2aC04LjgxWm0tMTM4LjU3IDBMNTAuMDIgNDcuNnYxNy4yNkgzNS43Wm0xMjQuNSAwaC0xNC4zMkwxNjAuMiA0Ny42djE3LjI2Wm0tNDkuMS03LjU0YzAgOC44NC0yLjIgMTYuMzItNS4xOSAyMS4yMi0zLjA4IDUuMDgtNS44NyA1Ljg3LTYuOTggNS44Ny0xLjEyIDAtMy45LS44LTctNS44Ny0yLjk4LTQuOS01LjE5LTEyLjM4LTUuMTktMjEuMjIgMC04Ljg1IDIuMjEtMTYuMzMgNS4yLTIxLjIzIDMuMDktNS4wNyA1Ljg3LTUuODcgNi45OC01Ljg3IDEuMTIgMCAzLjkuOCA3IDUuODcgMi45OCA0LjkgNS4xOSAxMi4zOCA1LjE5IDIxLjIzWlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5LWxpZ2h0LWRlZmF1bHQpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTc4LjM0IDE4Ni41N2MtMS44NSAyLjItNi42NiAxLjAyLTguMTMuMjRhMi40NiAyLjQ2IDAgMCAxLS4zNC0uMjJjLTEuOTQuMjItMTQuOTQtLjUtMTUuMTItLjQ2LTYuMTIgMS40My0xNC4wNiAxLjAzLTE1LjIgMS0xLjM2LS4wNS00LjUzLTEuMzMtNS43NS01LjA4LTEuMi0zLjY3IDAtNy4xMiAyLjE2LTEzLjM3bC4xMy0uMzgtMS40MyAyLjgzYy03LjM3IDE0LjQzLTExLjA1IDE5LjctMTcuNDMgMjAuMTQtNi4zOC40NS0zNC4zNC0uMDktNDEuMDktLjc4LTYuNzUtLjctOS40Mi0xLjY4LTkuMzUtMi44My4wNS0uOTIgMi45OC0yLjIgNC40NC0yLjcyLTUuODgtMS41Ny0yMC4xNi01Ljk3LTMwLjE4LTEwLjk4LTEyLjUyLTYuMjYtMjUuMTQtMTUuOC0yMS45MS0yOC45MiAzLjIyLTEzLjEzIDE1Ljc2LTE2LjggMjUuNTktMTcuMzggMi43NS0uMTYgNS4xNC0uMSA3LjE2LjA3IDMuNzYuMzMgNi4yMSAxLjA2IDcuMiAxLjUzLTEuMTItNi4zNy0zLjMzLTE5LjM0LTMuMzMtMjAuMjEgMC0xLjEtMy4wMi0xMC42Ny0zLjY0LTE0LjM1LS4xLS41NS0xLjExLTUuNiAzLjY0LTUuMDIgNC43NS41NyAxMi40IDE4LjIgMTUuODggMjguN2E0MDEuNTUgNDAxLjU1IDAgMCAwIDExLjE1LTkuODdjLjg0LTEuMDIgOS4zNi05Ljc1IDE0Ljg3LTEzLjg0YTYwLjA5IDYwLjA5IDAgMCAxIDMzLTExLjc2YzE2LjI5LS44MSAzNC40OSAyLjM2IDQwLjkgMTEuOTEgNi40IDkuNTUgNi4xIDM0LjQ0IDYuNDQgNDguNzEuMzUgMTQuMjcuODQgMjcuNjQgMi4xMSAyOS43NiAxLjI3IDIuMTIgNi40NSA1LjAyIDkuNzcgNy4xNCAzLjMzIDIuMTEgNC40NSAzLjkgNC4zNiA0LjItLjEuMy0uNC41OC0yLjI0IDEuMDguMzQuNDcuMTIgMS4zOC0yLjEyIDEuNi00LjcuNDgtOC42NC0uNzQtMTEuNTQtLjc0WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xOTIgMTg1LjcxYy0xLjYtMi4zLTkuNy01LjM0LTE1LjA0LTUuNzUtNS4zNC0uNDEtNi40NS41My03LjQgMS44NS0xIDEuMzctMS4wNSAzLjcyLjMgNC43OG0yMi4xNC0uODhjLjM0LjQ3LjEyIDEuMzgtMi4xMiAxLjYtNC43LjQ4LTguNjQtLjc0LTExLjU0LS43NC0xLjg1IDIuMi02LjY2IDEuMDItOC4xMy4yNGEyLjQ2IDIuNDYgMCAwIDEtLjM0LS4yMm0yMi4xMy0uODhjMS44NC0uNSAyLjE1LS43OCAyLjI0LTEuMDguMDktLjMtMS4wMy0yLjA5LTQuMzYtNC4yLTMuMzItMi4xMi04LjUtNS4wMi05Ljc3LTcuMTQtMS4yNy0yLjEyLTEuNzYtMTUuNDktMi4xLTI5Ljc2LS4zNi0xNC4yNy0uMDYtMzkuMTYtNi40Ni00OC43LTYuNC05LjU2LTI0LjYtMTIuNzMtNDAuODktMTEuOTJhNjAuMDkgNjAuMDkgMCAwIDAtMzMgMTEuNzZjLTUuNSA0LjA5LTE0LjAzIDEyLjgyLTE0Ljg3IDEzLjg0LS4zNy40Ni01LjQzIDQuOS0xMS4xNSA5Ljg3LTMuNDktMTAuNS0xMS4xMy0yOC4xMy0xNS44OC0yOC43LTQuNzUtLjU4LTMuNzMgNC40Ny0zLjY0IDUuMDIuNjIgMy42OCAzLjY0IDEzLjI2IDMuNjQgMTQuMzUgMCAuODcgMi4yMSAxMy44NCAzLjMyIDIwLjItLjk4LS40Ni0zLjQzLTEuMi03LjE5LTEuNTJtMTkuMzQgNTcuMjFjLTUuODgtMS41Ny0yMC4xNi01Ljk3LTMwLjE4LTEwLjk4LTEyLjUyLTYuMjYtMjUuMTQtMTUuOC0yMS45MS0yOC45MiAzLjIyLTEzLjEzIDE1Ljc2LTE2LjggMjUuNTktMTcuMzggMi43NS0uMTYgNS4xNC0uMSA3LjE2LjA3bTE5LjM0IDU3LjIxYy0xLjQ2LjUyLTQuMzkgMS44LTQuNDQgMi43Mi0uMDcgMS4xNSAyLjYgMi4xNCA5LjM1IDIuODMgNi43NS43IDM0LjcxIDEuMjMgNDEuMDkuNzggNi4zOC0uNDQgMTAuMDYtNS43MSAxNy40My0yMC4xNGwxLjQzLTIuODNtLTY0Ljg2IDE2LjY0YzUuODktMi40OSAxMi4zNS02LjMyIDE2LjQ5LTEwLjExIDUuMDctNC42NSA5LjU1LTEzLjQ2IDkuOTYtMTQuMjhsLjgyLTEuNTZtNDMuNDMgNC4xNWMtLjQ3LTMtMS4yMS03LjMzLjM3LTE0LjY3IDEuNDctNi44MSA2LjYtMTUuMyA2LjY1LTExLjAzLjA1IDQtNi4wNSAxNy4zNS0xMi44NiAzMC44Nm0wIDBjLTIuMjUgNi41LTMuNTEgMTAtMi4zIDEzLjc1IDEuMjMgMy43NSA0LjQgNS4wMyA1Ljc2IDUuMDcgMS4xNC4wNCA5LjA4LjQ0IDE1LjItLjk5bTAgMGExOS41IDE5LjUgMCAwIDAgMy4yNy0xLjAzYzYuMDktMi42MyAxMC45Mi04LjU1IDEzLjUzLTI0LjI2IDIuNjItMTUuNzEgMS41LTQyLjM2LTEwLjI5LTUwLjc4LTExLjc4LTguNDEtMjEuMzItNi4wNy0zNC4wMyA1LjgtNS4zNCA0Ljk4LTExLjg2IDE0LjUyLTE3LjQyIDIzLjUybTQ0Ljk0IDQ2Ljc1Yy4xOC0uMDQgMTMuMTkuNjggMTUuMTIuNDZtLTYwLjA2LTQ3LjJjLS44LTMuNjYtMS40NC03LjE2LTEuOTQtMTAuNDNtMS45NCAxMC40MmMtMS4yNCAyLTIuNDMgMy45OC0zLjU1IDUuODdtLjMyLTMwLjljMCAzLjc1LjQxIDguOCAxLjMgMTQuNjFtMCAwYy0yLjMyIDIuNDYtNy43OCA3LjE1LTEzLjY3IDExLjU1bS00Mi4zMi0xMi43OHMxLjI0IDcuMTIgMy44NyAxMS40MmEyOS45MyAyOS45MyAwIDAgMCA2LjYxIDcuOG0zNi4xMyAxMi4wNGMtNi44Ny0zLjEtMTcuODctNi44LTIyLjUxLTguMjdtMjIuNTEgOC4yN2EzOTQuNyAzOTQuNyAwIDAgMSA3Ljc2LTEzLjc0TTc2IDE1MC43MmMuMzktLjA2Ljc4LS4xNCAxLjE3LS4yMyAzLjk3LS45MyAxMC43Ni01LjI5IDE3LjA1LTkuOThtLTE4LjIyIDEwLjJjLTQuNy44LTkuMzYtLjM0LTEzLjYyLTMuNzZtMCAwYy0zLjI5LS44NS0xMS4yOC0yLjM5LTEyLjg2LTIuNDFtNTYuNzUuNzFjLTIuMzItLjk0LTktMy41NS0xMi4wNS00Ljc0XCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm03Ny43NCA3My4zMSAyMy43MyA0My4yLTEuNyAyLjUtMjIuNzMgOS41NS0yNC41OC00NC40OCAyMS45LTEwLjc3aDMuMzhaXCIsXG4gICAgZmlsbDogXCIjRTZFOEVBXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzQuMzUgNzMuMzFoMy40bDIzLjcyIDQzLjItMS43IDIuNW0tMjUuNDItNDUuNy0yMS45IDEwLjc3IDI0LjU5IDQ0LjQ4TDk5Ljc4IDExOW0tMjUuNDMtNDUuNyAyNS40MyA0NS43XCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04My45IDExNi45NWMuOTYgMS45Ny00LjkxIDQuNTctOC4zMiA2LjE4LTEuMzMuNjMtMi4xLjk4LTIuNyAxLjIuOSAzLjMgMS4yNCA4LjE0LTQuNDggOS44Mi01LjczIDEuNjktMTUuMDctMS4wMi0xOC05LjYtMi45NS04LjYuMDEtMTkuOTcgOS4wNS0yNy4wNCA1LjY3LTQuNDIgMTUuMDEtNS43NyAxOS40Mi00LjA1IDIuMTUuODIgMS4zOCAyLjcxLS41NiA0LjQ0YTU4LjEgNTguMSAwIDAgMS00LjUzIDMuNThjLjQtLjAxLjgtLjAyIDEuMjMgMCA0LjEzLjA2IDcuMjYgMS4xMSA3LjQyIDMuMTQuMDcuOTQtLjggMi4xMy0xLjk1IDMuNDUtLjYyLjcxLTEuMjggMS4zNC0xLjk1IDEuODggMi44LS4yMiA1Ljk0IDEuMDUgMi45IDQuMi0uNDEuNDMtLjg1LjgzLTEuMjkgMS4yIDEuNzMuMDIgMy4yNC41NiAzLjc1IDEuNlpcIixcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjkuNzMgMTI1LjFjMS42NS0uMzQgMi4yLS40IDMuMTQtLjc2bTAgMGMuNi0uMjMgMS4zOC0uNTggMi43LTEuMjEgMy40Mi0xLjYgOS4zLTQuMjEgOC4zMi02LjE3LS44Ni0xLjc2LTQuNTMtMi4wOS03LjMzLS45Ny0yLjg0IDEuMTMtMy41OCAyLjI0LTMuNDYgMi41Ni4xMi4zMSA0Ljc1LS42OSA4LjM0LTQuNCAzLjQtMy41NC0uOTYtNC43LTMuOS00LjA2LTIuMjYuNS02LjQgMi4wNi02LjE2IDIuODUuMTYuNSA1LjMzLS41NCA5LjEtNC44NyAxLjE0LTEuMzIgMi4wMi0yLjUxIDEuOTUtMy40NS0uMTYtMi4wMy0zLjMtMy4wOC03LjQyLTMuMTUtOC44My0uMTYtMTEuNTYgNC43OC0xMS4xNiA1LjEgMS4xLjkyIDkuMzYtNC4xNSAxNC40Ni04LjY3IDEuOTQtMS43MyAyLjcxLTMuNjIuNTYtNC40NC00LjQtMS43Mi0xMy43NS0uMzctMTkuNDIgNC4wNS05LjA0IDcuMDctMTIgMTguNDQtOS4wNiAyNy4wMyAyLjk0IDguNiAxMi4yOCAxMS4zIDE4IDkuNjEgNS43My0xLjY4IDUuNC02LjUzIDQuNDgtOS44MVpcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTA2LjQ4IDEyMC4xNWMtLjIgMS41Ni0uNTMgMy45OC0xLjIgNi41MS0uNjggMi41My0xLjcxIDUuMTYtMy4zIDcuMTRsLjIuMTkgNS42Ny00Ljk3LTEuMS04Ljg3aC0uMjdabTMxLjA5IDQ1LjMyLS4yNS0uMS0xMS4zIDIxLjI3aDExLjkybC0uNDMtLjI2Yy0zLjUtMi4wNy00LjA3LTUuNzktMy40Ni05Ljc3LjUyLTMuNCAxLjktNi45NSAzLTkuNzdsLjUyLTEuMzdabS04NS44MS0zNy45LS4yNC4xM2E1NS4zIDU1LjMgMCAwIDAgMS42NSA2LjM5bC4wMS4wNC4wNS4wM2MxLjYzLjg0IDQuNCAxLjg1IDcuNDUgMi4xNCAzLjA1LjMgNi4zOS0uMTIgOS4xLTIuMTVsLS4xMi0uMjRjLTMuMTQgMS4yLTExLjE0IDEuNjMtMTcuOS02LjMzWlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJtMTMzLjU0IDgyLjgzLjAyLS4xNmgtLjE2Yy0xLjgyLjEtNS44NC4zOS05Ljg3Ljk2LTIuMDIuMjgtNC4wNC42NC01Ljc5IDEuMDgtMS43NC40My0zLjIzLjk1LTQuMTggMS41OGwtLjA2LjA0di4wN2MtLjA0IDEuOC4xMyAzLjY5LjY1IDUuMzVhNy4yOCA3LjI4IDAgMCAwIDIuOCA0LjA1YzIuODEgMS44NiA2LjY5IDEuNjIgOS45OC0uNTggMy4zLTIuMiA2LjA0LTYuMzcgNi42MS0xMi40WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEyNi42NiA4NC43M2E5Ljc5IDkuNzkgMCAwIDEtOS43IDkuODcgOS43OSA5Ljc5IDAgMCAxLTkuNy05Ljg3IDkuNzkgOS43OSAwIDAgMSA5LjctOS44N2M1LjM1IDAgOS43IDQuNDEgOS43IDkuODdaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMDkuNDEgNzAuNmMuNjYuMjUgMS4yNS40NyAxLjkuMjYuNTItLjE4LjgzLS43IDEuMTgtMS4zLjc1LTEuMjcgMS43My0yLjkzIDUuNTYtMi41NiAzLjg2LjM4IDQuNiAyLjE3IDUuMSAzLjQzLjIxLjUuMzguOS42OSAxLjEyLjQ4LjMyLjg0LjMzIDEuMjYuMzUuNTUuMDIgMS4yLjA1IDIuMzcuNzUgMS40MS44NSAyLjQ5IDUuNjUuMjMgOS45M2wuMjYuNDNjLS40NSAyLjE1LTMuMDUgNC4zNy0zLjA1IDQuMTQgMC0zLjA0IDAtNC43NS0yLjkyLTcuNDMtNC4yNiAxLjYtMTAuODkgMS4xMy0xMy45NC4xNC00LTEuMjgtNS45OC02LjgxLTIuNTMtOSAxLjcyLTEuMSAyLjg4LS42NSAzLjktLjI2WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTE2LjcgODEuNmEuNDEuNDEgMCAxIDAtLjc0LjRjLjIuMzkuNDcuNzQuOS45NS40MS4yLjkzLjI1IDEuNTguMTdhLjQxLjQxIDAgMSAwLS4xLS44MmMtLjU4LjA3LS45LjAxLTEuMTItLjA5LS4yLS4xLS4zNi0uMjgtLjUzLS42Wm0tNi41NyA0LjIyYTEuMDcgMS4wNyAwIDAgMCAxLTEuMTMgMS4wNiAxLjA2IDAgMCAwLTEuMS0xLjAyYy0uNTkuMDMtMS4wMy41NC0xIDEuMTMuMDIuNi41MiAxLjA1IDEuMSAxLjAyWm02LjgyLjczYTEuMDcgMS4wNyAwIDAgMCAxLTEuMTMgMS4wNiAxLjA2IDAgMCAwLTEuMS0xLjAxYy0uNTguMDItMS4wMy41My0xIDEuMTIuMDMuNi41MiAxLjA1IDEuMSAxLjAyWlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGN4OiAxMjcuNDIsXG4gICAgY3k6IDg2LjAwODEsXG4gICAgcng6IDIuNDc5MzQsXG4gICAgcnk6IDIuNDc5MzQsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICByOiA0LjY3MTAyLFxuICAgIHRyYW5zZm9ybTogXCJtYXRyaXgoMC43MDcxMDYgMC43MDcxMDggLTAuNzA3MTA2IDAuNzA3MTA4IDc1LjA1MDggNzUuNzc5NClcIixcbiAgICBmaWxsOiBcInZhcigtLXNlbWktY29sb3ItcHJpbWFyeSlcIixcbiAgICBzdHJva2U6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIHN0cm9rZVdpZHRoOiAzXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNzcuOSA3Mi45N2ExLjEgMS4xIDAgMCAwLTEuNTcgMGwtMS4yNiAxLjI3LTEuMzEtMS4zYTEuMSAxLjEgMCAxIDAtMS41NyAxLjU2bDEuMzEgMS4zLTEuMyAxLjMxYTEuMSAxLjEgMCAwIDAgMS41NiAxLjU3bDEuMy0xLjMgMS4yNyAxLjI2YTEuMSAxLjEgMCAxIDAgMS41Ny0xLjU3bC0xLjI2LTEuMjYgMS4yNi0xLjI3YTEuMSAxLjEgMCAwIDAgMC0xLjU3WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTk5LjQxIDQ5LjExYTMyLjI2IDMyLjI2IDAgMCAwLTE5LTkuODQgMi4xNCAyLjE0IDAgMCAwLTIuNDIgMi4wMmMtLjA3IDEuMi44MiAyLjIgMS45NyAyLjM3YTI3Ljg2IDI3Ljg2IDAgMCAxIDE2LjEzIDguMzZjLjgzLjg3IDIuMjQuOTkgMy4xNy4xNS44OC0uNzkuOTktMi4xNy4xNS0zLjA2Wm0tMzUuOC04LjUyYTMyLjUgMzIuNSAwIDAgMC0xOC43NCAxNS43MyAyLjE0IDIuMTQgMCAwIDAgMS4wMSAyLjkzYzEuMTEuNTIgMi40LjAyIDIuOTYtMS4wMmEyOC4wOCAyOC4wOCAwIDAgMSAxNS45Ni0xMy40IDIuMjggMi4yOCAwIDAgMCAxLjUzLTIuNzIgMi4xNCAyLjE0IDAgMCAwLTIuNzItMS41MlptMjcuNzUgMTUuNzhjLTMuMDItMy4xNC03LTUuMzgtMTEuNTMtNi4yMmEyLjExIDIuMTEgMCAwIDAtMi40NyAyIDIuMzMgMi4zMyAwIDAgMCAxLjkgMi4zOGMzLjQxLjY5IDYuNDMgMi4zNyA4Ljc1IDQuNzIuODUuODUgMi4yNiAxIDMuMi4xNS44Ny0uNzggMS0yLjE1LjE1LTMuMDNabS0yNC42NC00LjY1YTIxLjYzIDIxLjYzIDAgMCAwLTExLjY2IDkuOCAyLjEgMi4xIDAgMCAwIC45OSAyLjk0YzEuMTIuNTIgMi40LjAxIDIuOTgtMSAyLTMuNDUgNS4xNy02LjExIDguOTEtNy41IDEuMS0uNCAxLjgxLTEuNTYgMS41LTIuNzVhMi4xIDIuMSAwIDAgMC0yLjcyLTEuNVptMTYuNjMgMTEuOTVhMTAuNjkgMTAuNjkgMCAwIDAtNC0yLjQ3Yy0xLjM1LS40Ny0yLjU2LjYyLTIuNjMgMS45LS4wNyAxLjE0LjczIDIuMDQgMS42NSAyLjQ0LjU2LjI1IDEuMDcuNTYgMS41Mi45NC44OS43NCAyLjMzIDEgMy4zMi4xMS44Mi0uNzQgMS0yLjA3LjE0LTIuOTJabS0xNC4yOC0uNzZjLTEuODIuODMtMy4zOSAyLjE2LTQuNSAzLjgzLS43MyAxLjA4LS4xNiAyLjQyLjkgMi45MiAxLjE0LjUzIDIuMzgtLjAyIDMuMDUtLjg4YTYuMzUgNi4zNSAwIDAgMSAxLjkzLTEuNjNjLjk1LS41MiAxLjY4LTEuNjMgMS4zNy0yLjgzLS4zLTEuMTUtMS41NC0xLjk1LTIuNzUtMS40WlwiLFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiXG4gIH0pKTtcbn1cbnZhciBJbGx1c3RyYXRpb25Ob3RGb3VuZF9kZWZhdWx0ID0gU3ZnQ29tcG9uZW50O1xuZXhwb3J0IHtcbiAgSWxsdXN0cmF0aW9uTm90Rm91bmRfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwgInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX3NwcmVhZFZhbHVlcyh7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB2aWV3Qm94OiBcIjAgMCAyMDAgMjAwXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNzAuNDYgNDIuNGExMS42IDExLjYgMCAwIDAgOC40NC42YzYuMS0xLjkgOS41My04LjMxIDcuNjYtMTQuMzJhMTEuNDggMTEuNDggMCAwIDAtMTQuNDMtNy40NSAxMS41MyAxMS41MyAwIDAgMC04LjE1IDExLjU1IDEwLjE2IDEwLjE2IDAgMCAwLTYuNTUtLjE2IDEwLjAxIDEwLjAxIDAgMCAwLTYuNjkgMTIuNDggMTAuMDEgMTAuMDEgMCAwIDAgMTIuNiA2LjQ5YzQuMi0xLjMxIDYuOTUtNS4wNyA3LjEyLTkuMThaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjYuMTcgNDAuNzdjMS43OSAyLjA3IDMuNTggNS45Mi0xLjM4IDExLjAybTEuMzgtMS4xYy4xMy0zLjMuMTMtOS45MiAzLjU4LTkuOTIgMy40NCAwIDMuMDMgMy43MiAxLjEgNS45MmEyNS43IDI1LjcgMCAwIDEtNC42OCA0Wm0wIDEuMWMxLjE5LjU1IDQuMTMgMS42IDYuMzMgMS4zOCAyLjc2LS4yOCA0LjU1LTIuNDggMy4xNy00LTEuMzgtMS41MS03LjMuMjgtOS41IDIuNjJaXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTk2LjExIDkuOTZjMy4xNy44MyA0LjE1IDkuOCAxLjM4IDE2Ljk1IDUuMzkgMCAxMC40LjAzIDEzLjAzIDEuNjcgMi42MSAxLjY0IDIuNDQgNS44NC0yLjAxIDcuNDdhMjMuNDQgMjMuNDQgMCAwIDEtNC41NyAxLjJjMS4yNy4wOSAyLjguMjggNC4zMy42MiAxLjMxLjMgMi42Ljk2IDIuNzkgMi4wNC4xOCAxLjA5LS43NCAyLjYtMi45NiAzLjMyLS45LjMtMS44LjUyLTIuNjQuNjkuOTMuMSAxLjguMjYgMi40NC41IDEuNTMuNTcgMy4wOCAxLjMgMy4xMyAzLjQ1LjAyLjctLjE3IDEuMzQtLjU0IDEuOWwxLjE1LjY1YzcuODkgNC40MiAxNi4yMiA5LjEgMTkuMTcgMTYuOTEuOC0uMzUgMS42My0uNyAyLjUtMS4wNCAxNy41OC02Ljk4IDQ0LTcuNjggNTIuOTItNC4yMiA4LjkgMy40NiAxMC4wOCAxNS4wNiA2LjM4IDI4LjYtMy42OSAxMy41My05LjQzIDIyLjItMTAuMjUgMjMuMi0uODIgMS0zLjQ2IDUuNDUtLjQ3IDkuMDggMi45OSAzLjY0IDMuODUgNC42MiA1LjIgNS44NyAxLjM1IDEuMjYuNzcgMi40NC0uNDcgMi43OS0uOTcuMjctMi42OC4yNi00Ljg2LTEuMDcuNTIuODUuODcgMS41NS45MiAxLjk2LjI0IDEuOTUtMi4zMiAxLjk1LTQuNzIuMjRhMjcuMiAyNy4yIDAgMCAxLTIuMjctMS45MXMtLjYxIDktLjYxIDE4LjQ3YzAgOC40LTMuNyAyMy4wNi0xMS4yOSAzMS42My02LjE4IDctMTUuMDEgMTAuMDMtMjUuMTMgOS4xMy0yMi41LTItMzEuOTMtMjEuNTktMzIuNDctNDguOS05LjM0LTEuODEtMTcuNTctNi45OS0yNS4xNy0xMi4zNEE1MzYuMSA1MzYuMSAwIDAgMSA1OSAxMTIuMkM1NC4wNyAxMTAuNDIgMTcgODkuNTIgMTMuNzMgODYuNDRjLTMuOTcgMC05LjQzLTEuOTItMTAuMzgtNy42Ni0uOTYtNS43NCAzLjU3LTI5LjMgMTIuMTgtNDQuMTQgMi4zNC00LjAzIDUuMTUtNS44NSA1LjY1LTUuNTMuMTMuMDguMTcuNDMuMTMuOTIuNjMtLjQxIDEuNTItLjQgMi4wMiAzLjE1LjE3IDEuMTguMyAyLjg5LjQ2IDQuNzguMzIgMy44MS42OSA4LjM2IDEuNDUgMTAuNzdsLjEuMzRjLjQ2IDEuNTMgMS4wNCAzLjQ4IDUuNTggNy4wNCAxMS4yMiA4LjggMzMuNDEgMjMuMjUgMzguNDggMjYuNTVsLjk3LjYzYy43My40OCAzLjg2IDIuMjEgNy45NyA0LjUgOC44MyA0Ljg5IDIyLjIgMTIuMjkgMjUuOTggMTUuMTUuMTUtLjYxLjM1LTEuMzIuNTgtMi4xIDEuNTQtNS4xNyA0LjczLTEzLjMgNi4xMy0xNi4xLTEuMTYtLjctMjkuMjctMTguNjEtNDUuNDUtMjguOTJhMTAuNjEgMTAuNjEgMCAwIDEtMi42NC0xLjY4Yy01LjctNS4yMi01LjM3LTEyLjczLTEuODQtMTguNjIgMy41NC01LjkgNy44Ni03Ljk5IDExLjI2LTguNTggMS40NS0uMjUgMy4wMy0uMTkgNC43NS0uMTMgMi4zMS4wOSA0Ljg3LjE4IDcuNjgtLjQ2IDQuOTEtMS4xIDYuMS0zIDYuMjItNy4xM2wuMDItLjUzYy4xNC00LjYuMy05Ljk3IDUuMDgtOC43M1pNMTQ1LjggMTU0LjNjMi43NiAzLjE4IDMuNTktNC42LjQ4LTEzLjktMi4zNS03LjA0LTMuNS04LjYtMy44LTguMzgtLjA0IDkuMDEuNyAxOS4yNSAzLjMyIDIyLjI4Wm04Ljg1LTYzLjE3YTM2Ni44IDM2Ni44IDAgMCAxIDE2LjU2LTQuMzZjLTIuNjQgNC4yLTUuMiA5LjMtNy4zNSAxNC4zNi0xLjg0LjIzLTEzLjQ2IDMuMTYtMTQuMzMgMy43MiAyLjc1LTYuNyA0LjgzLTEyLjczIDUuMTItMTMuNzJaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTQ1LjggMTU0LjNjMi43NSAzLjE4IDMuNTctNC42LjQ3LTEzLjktMi4zNS03LjA0LTMuNS04LjYtMy44LTguMzgtLjA0IDkuMDEuNyAxOS4yNSAzLjMyIDIyLjI4WlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwNC4yOCA1Mi4xMmMxLS4wNyAyLjEtLjIgMy4xNi0uNDRhNC44IDQuOCAwIDAgMCAzLjA1LTEuOWM4LjIgNC42MSAxNy4yMyA5LjM1IDIwLjMyIDE3LjU1LjgtLjM1IDEuNjMtLjcgMi41LTEuMDQgMTMuNjctNS40MiAzMi42OC03LjA2IDQ0LjY2LTUuODktMTEuMzggOS4yMS0xNC43MyAyMS45NC0xNC40MiAyOC4yOC0zIC43OC02LjMxIDEuNjYtOC45MSAyLjQ1LS4yOSAxLTIuMzcgNy4wMi01LjEyIDEzLjcyYTExMC43NyAxMTAuNzcgMCAwIDEtNC43NiAxMC4yYy03LjI1LTYuNTMtMjEuNjItMTEuMjYtMzkuODYtMTQuMiAxLjU0LTUuMTggNC43My0xMy4zIDYuMTMtMTYuMS0xLjE2LS43MS0yOS4yNy0xOC42Mi00NS40NS0yOC45M2ExMC42MSAxMC42MSAwIDAgMS0yLjY0LTEuNjhsMi42NCAxLjY4YzguNzYgNC4xMyAyOS4yIDQuNDggMzYuOTcgMi45MiA2LjY0LTEuMzQgNi4wMy00IDQuODktNS4yOC0uNTItLjU5LTEuOC0xLjA0LTMuMTYtMS4zNC0yLjM1LjE2LTQuMjMtLjA2LTQuMjMtLjMzIDAtLjI0IDIuMTktLjEyIDQuMjMuMzNaXCIsXG4gICAgZmlsbDogXCIjNkI3MDc1XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjIuOTQgNTQuMTRjNi4yMiA1LjY5IDMwLjkgNi4zNSAzOS42IDQuNiA2LjY0LTEuMzQgNi4wNC00IDQuOS01LjI4LTEuMy0xLjQ3LTcuNC0yLjA2LTcuNC0xLjY3IDAgLjQgMy44Ny42OCA3LjQtLjExYTQuOCA0LjggMCAwIDAgMy4wNS0xLjltLTQ3LjU1IDQuMzZjLTUuNy01LjIyLTUuMzctMTIuNzMtMS44NC0xOC42MiAzLjU0LTUuOSA3Ljg2LTcuOTkgMTEuMjYtOC41OCAzLjQtLjU5IDcuNTMuNTMgMTIuNDMtLjU5IDQuOTEtMS4xIDYuMS0zIDYuMjItNy4xMy4xNS00LjcuMTMtMTAuNTQgNS4xLTkuMjYgMy4xNy44MyA0LjE1IDkuOCAxLjM4IDE2Ljk1IDUuMzkgMCAxMC40LjAzIDEzLjAzIDEuNjcgMi42MSAxLjY0IDIuNDQgNS44NC0yLjAxIDcuNDctNC40NSAxLjY0LTcuNTcgMS40NC03LjYgMS4yNS0uMDQtLjE4IDMuNy0uMjUgNy4zNi41NyAxLjMxLjMgMi42Ljk2IDIuNzkgMi4wNC4xOCAxLjA5LS43NCAyLjYtMi45NiAzLjMyLTMuOTggMS4zLTcuODYgMS4yNS03Ljg2Ljg2IDAtLjQgNS4zNC0uNTMgNy42Ni4zMyAxLjUzLjU3IDMuMDggMS4zIDMuMTMgMy40NS4wMi43LS4xNyAxLjM0LS41NCAxLjltLTQ3LjU1IDQuMzdjMTUuNTIgOS44OSA0Ni44NyAyOS44NiA0OC4xIDMwLjZtMCAwYy0xLjQxIDIuOC00LjYgMTAuOTMtNi4xNCAxNi4xLS4yMy43OC0uNDMgMS40OS0uNTggMi4xbTYuNzEtMTguMmMxLjItMi4zOCA0LjM2LTEwLjYgMTkuNzgtMTcuNG00My41IDYyLjJjLTIuMTQtMi4wNC00LjIzLTQuNDQtNC43NS03LjExLS44NS00LjM1IDMuNyA0LjUxIDQuNzUgNy4xWm0wIDBjMSAyLjQ0IDEuMjMgMy43OC42NSA0LjAzLS41OC4yNS02LjkzLTEuNDQtMTAuNDYtOC42OS0uOTYtMi4yMy0xLjMtNC45My0uOTUtNS4wMi4zNC0uMDggMi44IDYgMy44NyAxMi4xNi45OCA1LjY3LTkuNDYtNC45Ny05LjAxLTEyLjI5LjE4LTMuMDYgMS4zLTcuNDQgMi45OC0xMi4yNW0xMi45MiAyMi4wNiAxLjM4IDEuMjltLTQuNS00NC4wNmMzLjM1LS43OCA0LjM0LTEuMiA1LjYyLTIuMTIgMy4wMS0yLjE3IDEuNzQtNS42NC0xLjY5LTIuODUtMS4xLjktMi4zNyAyLjUtMy45MiA0Ljk3Wm0wIDBhMzY2LjggMzY2LjggMCAwIDAtMTYuNTUgNC4zNm0xNi41Ni00LjM2Yy0yLjY0IDQuMi01LjIgOS4zLTcuMzUgMTQuMzZtLTEzLjM2LTguNTZjLjc1LS4zNyAyLjI2LS44OCA0LjE1LTEuNDRtMCAwYy0uMyAxLTIuMzcgNy4wMi01LjEyIDEzLjcybS0xMzUuOC0xOC40YzMuMjkgMy4wNyA0MC4zNSAyMy45NyA0NS4yNyAyNS43NWE1MzcuMDIgNTM3LjAyIDAgMCAwIDIyLjAzIDE2LjYyYzcuNiA1LjM1IDE1LjgzIDEwLjUzIDI1LjE3IDEyLjMzbS05Mi40Ni01NC43Yy0zLjk3IDAtOS40My0xLjkzLTEwLjM4LTcuNjctLjk2LTUuNzQgMy41Ny0yOS4zIDEyLjE4LTQ0LjE0IDIuMzQtNC4wMyA1LjE1LTUuODUgNS42NS01LjUzLjEzLjA4LjE3LjQzLjEzLjkybS03LjU4IDU2LjQxYTIxLjQ4IDIxLjQ4IDAgMCAxLTQuNzgtNy42Yy0uMy0xLjI0LS4wOC0xLjY4LjktMi40NCA0LjQ4LTMuNDggNi4zLTUuNTcgNi4zLTEwLjYyIDAtNC40Ni0zLjA0LTYtMi41LTExLjU2LjcyLTcuNTkgNi4wOS0xOS41OSA2Ljc4LTIxLjA0LjUyLTEuMTIuODItMi4zNC44OC0zLjE1bTAgMGMuNjMtLjQxIDEuNTItLjQgMi4wMiAzLjE1cy43NyAxMS45NCAxLjkgMTUuNTVjLjUgMS41Ny44IDMuNTUgNS42OSA3LjM4IDEyLjMzIDkuNjcgMzcuOSAyNi4xNSAzOS40NSAyNy4xOCAyLjI3IDEuNSAyOC40IDE1LjQ1IDMzLjk1IDE5LjY1bTAgMGMzLjUzIDIuNjYgNS4yMiAzLjY0IDUuMjIgNS42IDAgMS4yMi0yLjMzIDIuNzQtNC43LjM2LTEuMzYtMS4zNS0xLjA1LTMuNy0uNTItNS45NlptNi4xNy01My4xNmM4LjIgNC42MSAxNy4yMyA5LjM1IDIwLjMyIDE3LjU1bTAgMGMuOC0uMzUgMS42My0uNyAyLjUtMS4wNCAxNy41OC02Ljk4IDQ0LTcuNjggNTIuOTItNC4yMiA4LjkgMy40NiAxMC4wOCAxNS4wNiA2LjM4IDI4LjYtMy42OSAxMy41My05LjQzIDIyLjItMTAuMjUgMjMuMi0uODIgMS0zLjQ2IDUuNDUtLjQ3IDkuMDggMi45OSAzLjY0IDMuODUgNC42MiA1LjIgNS44NyAxLjM1IDEuMjYuNzcgMi40NC0uNDcgMi43OS0xLjI0LjM0LTMuNy4yMy02Ljc4LTIuNTItMy4wNy0yLjc2LTQuOC03LjItNC42My03LjI4LjE4LS4wNiA3LjIyIDguNzQgNy40NyAxMC42OS4yNCAxLjk1LTIuMzIgMS45NS00LjcyLjI0YTI3LjIgMjcuMiAwIDAgMS0yLjI3LTEuOTFtLTY5LjUgMTAuMzJhMzYgMzYgMCAwIDAgMTEuMDYuNDRjMTQuMTItMS42NCAyMC44Ni0xNC4wNyAyNi4xMi0yMy41Mi4yOC0uNS41Ny0xLjA0Ljg1LTEuNTltLTM4LjAzIDI0LjY3Yy41NCAyNy4zMiA5Ljk3IDQ2LjkxIDMyLjQ3IDQ4LjkxIDEwLjEyLjkgMTguOTUtMi4xNCAyNS4xMy05LjEzIDcuNTktOC41NyAxMS4yOS0yMy4yMiAxMS4yOS0zMS42MyAwLTkuNDcuNjEtMTguNDcuNjEtMTguNDdtLTMxLjQ3LTE0LjM1LS4xNC43Mm0uMTQtLjcyYzEuODQtMy41MiAzLjY5LTcuNjkgNS4zLTExLjYzbS03LjA2IDI3LjE3Yy0uMDMgOS4wMS43MSAxOS4yNSAzLjMzIDIyLjI4IDIuNzYgMy4xOCAzLjU5LTQuNi40OC0xMy45LTIuMzUtNy4wNC0zLjUtOC42LTMuOC04LjM4Wm0wIDBjLjE5LTUuMy43Ny0xMC41NyAxLjYyLTE0LjgybTAgMGMzLjY0Ljg4IDUuNzUuNDUgNy44Ni0xLjE0IDIuMS0xLjYgNC41Ny00LjcyIDYuMDYtNi4xMiAxLjUtMS40IDIuNzgtMi4yNiAzLjQtMi40Nm0wIDBjLjcyLTIuMDYgMS41NS00LjIgMi40NS02LjM1bTAgMGMtMS44NC4yMy0xMy40NiAzLjE2LTE0LjMzIDMuNzJcIixcbiAgICBzdHJva2U6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwNy43IDE0MS41OGMxMS41OCAyLjIgMjMuNy0uNzcgMzQuNDQtNC45NmwxLjUyLTE4LjU3Yy0yLjI3IDQuMDItOS43IDE0LjgzLTE0LjE5IDE4LjU3LTUuNzggNC44My0xNS43IDUuMDgtMjEuNzYgNC45NlpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEzMy40MyA2Ni41YTQ4LjI1IDQ4LjI1IDAgMCAxIDcuOTYtMi44NWMzLjU2LS44MSA1LjY0LTEuNDEgMTAuMTQtMS45Ny0xLjYgMS43Ny00LjI1IDQuNjMtNi45IDYuMDktNi44MiAzLjc0LTEwLjQ1IDIuMDYtMTEuMi0xLjI2WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc2LjU4IDYyLjY4YzQuNjcuNTUgMTAuMTItLjYzIDEzLjA4LTMuMTctNS4zNy45Ny0xNS45NS0uODItMjEuOS0yLjM0bDguODIgNS41MVpcIixcbiAgICBmaWxsOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJlbGxpcHNlXCIsIHtcbiAgICBjeDogNDQuODk4OSxcbiAgICBjeTogMTUzLjcyOCxcbiAgICByeDogMzUuMTI0LFxuICAgIHJ5OiAzNS4xMjM5LFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5KVwiLFxuICAgIGZpbGxPcGFjaXR5OiAwLjJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk02My4xNiAxMzguOWE0LjQgNC40IDAgMCAxIDEuMSA2LjEzbC0xNS45OSAyM2E2LjYxIDYuNjEgMCAwIDEtOS44OCAxLjExTDI2LjI2IDE1OC4xYTQuNCA0LjQgMCAxIDEgNS45My02LjUybDEwLjI4IDkuMzZMNTcuMDMgMTQwYTQuNCA0LjQgMCAwIDEgNi4xMy0xLjFaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzUuMzIgMTU3LjFjNC44Ny0zLjE2IDEzLjM5LTIuMzIgMTcuMjggMS41NSAzLjg4IDMuODgtLjc3IDcuMTYtMy4wOCAzLjYzLTIuMzItMy41My0xLjktOS4yNyAxLjI1LTEyLjc4XCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDIuMTYgNjMuOTVhOS4yNCA5LjI0IDAgMSAxIDAtMTguNSA5LjI0IDkuMjQgMCAwIDEgMCAxOC41WlwiLFxuICAgIGZpbGw6IFwiI0M2Q0FDRFwiLFxuICAgIHN0cm9rZTogXCIjMUMxRjIzXCIsXG4gICAgc3Ryb2tlTWl0ZXJsaW1pdDogMTBcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNTAuMzMgNTAuNGE4LjkzIDguOTMgMCAwIDAtOC4xNy00Ljk0Yy0xLjk0IDAtMy40NC40My00Ljk0IDEuMjlsLjQ1LjEyYy0uNC4yNS0uOC41My0xLjE3Ljg0bDE0LjMyIDQuNWMtLjIxLS42NC0uNDgtMS4yOC0uNzctMS44OWwuMjguMDhaXCIsXG4gICAgZmlsbDogXCIjMUMxRjIzXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMzcuOSA1MS4xOGEuOTEuOTEgMCAxIDAgMS44Mi4wNC45MS45MSAwIDAgMC0xLjgzLS4wNFptNi42OCAxLjUyYS45MS45MSAwIDEgMCAxLjgyLjA0LjkxLjkxIDAgMCAwLTEuODItLjA0WlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE1MS41MSA1OC4yNmEyLjM0IDIuMzQgMCAxIDEgMC00LjY4IDIuMzQgMi4zNCAwIDAgMSAwIDQuNjhaXCIsXG4gICAgZmlsbDogXCIjQzZDQUNEXCIsXG4gICAgc3Ryb2tlOiBcIiMxQzFGMjNcIixcbiAgICBzdHJva2VNaXRlcmxpbWl0OiAxMFxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEwOS40OCA4OC45Yy0xLjgxLjI1LTIuMTkuOTUtMi4yOCAxLjJhMS40IDEuNCAwIDAgMC0uMTEuNjRjLjAxLjE3LjA2LjM1LjE2LjUzLjEuMTguMjIuMzMuMzUuNDRsLjEzLjExLS4wNy0uMDMtMS44NiA1LjE5YTYuNjcgNi42NyAwIDAgMS0zLjQtMy4xIDYuNzkgNi43OSAwIDAgMS0uMzItNS44NGMuOTktMi40NSAzLjMxLTQuMTQgNi42NS00LjYgMy4yMi0uNDQgNy41MS4yMSAxMy4xNCAyLjMgNi41MyAyLjQyIDExLjg0IDYuMzIgMTYuNzEgMTAuNCAxLjU3IDEuMyAzLjA3IDIuNjEgNC41NSAzLjkgMy4yMiAyLjggNi4zMyA1LjUyIDkuNzggNy45NiA0LjkzIDMuNDcgMTAuMyA2LjE4IDE2Ljk2IDcuMjUgNi42NyAxLjA4IDE0Ljg1LjU0IDI1LjQyLTIuOGwxLjY3IDUuMjVjLTExLjIgMy41NC0yMC4yNiA0LjIzLTI3Ljk3IDMtNy43MS0xLjI1LTEzLjg2LTQuNC0xOS4yNS04LjItMy43LTIuNi03LjE2LTUuNjMtMTAuNDktOC41MmEyNzQuNTMgMjc0LjUzIDAgMCAwLTQuMi0zLjYyYy00LjcyLTMuOTQtOS40NS03LjM2LTE1LjA5LTkuNDUtNS4yNC0xLjk1LTguNTUtMi4yNy0xMC40OC0yWlwiLFxuICAgIGZpbGw6IFwiIzFDMUYyM1wiXG4gIH0pKTtcbn1cbnZhciBJbGx1c3RyYXRpb25TdWNjZXNzRGFya19kZWZhdWx0ID0gU3ZnQ29tcG9uZW50O1xuZXhwb3J0IHtcbiAgSWxsdXN0cmF0aW9uU3VjY2Vzc0RhcmtfZGVmYXVsdCBhcyBkZWZhdWx0XG59O1xuIiwgInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gU3ZnQ29tcG9uZW50KHByb3BzKSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfX3NwcmVhZFZhbHVlcyh7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB2aWV3Qm94OiBcIjAgMCAyMDAgMjAwXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBwcm9wcyksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICBmaWxsOiBcInRyYW5zcGFyZW50XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNzAuNDYgNDIuNGExMS42IDExLjYgMCAwIDAgOC40NC42YzYuMS0xLjkgOS41Mi04LjMxIDcuNjYtMTQuMzJhMTEuNDggMTEuNDggMCAwIDAtMTQuNDMtNy40NSAxMS41MyAxMS41MyAwIDAgMC04LjE1IDExLjU1IDEwLjE2IDEwLjE2IDAgMCAwLTYuNTUtLjE2IDEwLjAxIDEwLjAxIDAgMCAwLTYuNjkgMTIuNDggMTAuMDEgMTAuMDEgMCAwIDAgMTIuNiA2LjQ5YzQuMi0xLjMxIDYuOTUtNS4wOCA3LjEyLTkuMThaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjYuMTcgNDAuNzdjMS43OSAyLjA3IDMuNTggNS45Mi0xLjM4IDExLjAybTEuMzgtMS4xYy4xMy0zLjMuMTMtOS45MiAzLjU4LTkuOTIgMy40NCAwIDMuMDMgMy43MiAxLjEgNS45MmEyNS43IDI1LjcgMCAwIDEtNC42OCA0Wm0wIDEuMWMxLjE5LjU1IDQuMTMgMS42IDYuMzMgMS4zOCAyLjc2LS4yOCA0LjU1LTIuNDggMy4xNy00LTEuMzgtMS41MS03LjMuMjgtOS41IDIuNjJaXCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk05Ni4xMSA5Ljk2YzMuMTcuODMgNC4xNSA5LjggMS4zOCAxNi45NSA1LjM5IDAgMTAuNC4wMyAxMy4wMyAxLjY3IDIuNjEgMS42NCAyLjQ0IDUuODQtMi4wMSA3LjQ3YTIzLjQ0IDIzLjQ0IDAgMCAxLTQuNTcgMS4yYzEuMjcuMDkgMi44LjI4IDQuMzMuNjIgMS4zMS4zIDIuNi45NiAyLjc5IDIuMDQuMTggMS4wOS0uNzQgMi42LTIuOTYgMy4zMi0uOS4zLTEuOC41Mi0yLjY0LjY5LjkzLjEgMS44LjI2IDIuNDQuNSAxLjUzLjU3IDMuMDggMS4zIDMuMTMgMy40NS4wMi43LS4xNyAxLjM0LS41NCAxLjkgOC4yIDQuNjIgMTcuMjMgOS4zNiAyMC4zMiAxNy41Ni44LS4zNSAxLjYzLS43IDIuNS0xLjA0IDE3LjU4LTYuOTggNDQtNy42OCA1Mi45Mi00LjIyIDguOSAzLjQ2IDEwLjA4IDE1LjA2IDYuMzggMjguNi0zLjY5IDEzLjUzLTkuNDMgMjIuMi0xMC4yNSAyMy4yLS44MiAxLTMuNDYgNS40NS0uNDcgOS4wOCAyLjk5IDMuNjQgMy44NSA0LjYyIDUuMiA1Ljg3IDEuMzUgMS4yNi43NyAyLjQ0LS40NyAyLjc5LS45Ny4yNy0yLjY4LjI2LTQuODYtMS4wNy41Mi44NS44NyAxLjU1LjkyIDEuOTYuMjQgMS45NS0yLjMyIDEuOTUtNC43Mi4yNGEyNy4yIDI3LjIgMCAwIDEtMi4yNy0xLjkxcy0uNjEgOS0uNjEgMTguNDdjMCA4LjQtMy43IDIzLjA2LTExLjI5IDMxLjYzLTYuMTggNy0xNS4wMSAxMC4wMy0yNS4xMyA5LjEzLTIyLjUtMi0zMS45My0yMS41OS0zMi40Ny00OC45LTkuMzQtMS44MS0xNy41Ny02Ljk5LTI1LjE3LTEyLjM0QTUzNi4xIDUzNi4xIDAgMCAxIDU5IDExMi4yQzU0LjA3IDExMC40MiAxNyA4OS41MiAxMy43MyA4Ni40NGMtMy45NyAwLTkuNDMtMS45Mi0xMC4zOC03LjY2LS45Ni01Ljc0IDMuNTctMjkuMyAxMi4xOC00NC4xNCAyLjM0LTQuMDMgNS4xNS01Ljg1IDUuNjUtNS41My4xMy4wOC4xNy40My4xMy45Mi42My0uNDEgMS41Mi0uNCAyLjAyIDMuMTVzLjc3IDExLjk0IDEuOSAxNS41NWMuNSAxLjU3LjggMy41NSA1LjY5IDcuMzggMTIuMzMgOS42NyAzNy45IDI2LjE1IDM5LjQ1IDI3LjE4IDIuMjcgMS41IDI4LjQgMTUuNDUgMzMuOTUgMTkuNjUuMTUtLjYxLjM1LTEuMzIuNTgtMi4xIDEuNTQtNS4xNyA0LjczLTEzLjMgNi4xMy0xNi4xLTEuMTYtLjctMjkuMjctMTguNjEtNDUuNDUtMjguOTJhMTAuNjEgMTAuNjEgMCAwIDEtMi42NC0xLjY4Yy01LjctNS4yMi01LjM3LTEyLjczLTEuODQtMTguNjIgMy41NC01LjkgNy44Ni03Ljk5IDExLjI2LTguNTggMy40LS41OSA3LjUzLjUzIDEyLjQzLS41OSA0LjkxLTEuMSA2LjEtMyA2LjIyLTcuMTMuMTUtNC43LjEzLTEwLjU0IDUuMS05LjI2WlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMDQuMjggNTIuMTJjMS0uMDcgMi4xLS4yIDMuMTYtLjQ0YTQuOCA0LjggMCAwIDAgMy4wNS0xLjljOC4yIDQuNjEgMTcuMjMgOS4zNSAyMC4zMiAxNy41NS44LS4zNSAxLjYzLS43IDIuNS0xLjA0IDEzLjY3LTUuNDIgMzIuNjgtNy4wNiA0NC42Ni01Ljg5LTExLjM4IDkuMjEtMTQuNzMgMjEuOTQtMTQuNDIgMjguMjgtMyAuNzgtNi4zMSAxLjY2LTguOTEgMi40NS0uMyAxLTIuMzcgNy4wMi01LjEyIDEzLjcyYTExMC43NyAxMTAuNzcgMCAwIDEtNC43NiAxMC4yYy03LjI1LTYuNTMtMjEuNjItMTEuMjYtMzkuODYtMTQuMiAxLjU0LTUuMTggNC43My0xMy4zIDYuMTMtMTYuMS0xLjE2LS43MS0yOS4yNy0xOC42Mi00NS40NS0yOC45M2ExMC42MSAxMC42MSAwIDAgMS0yLjY0LTEuNjhsMi42NCAxLjY4YzguNzYgNC4xMyAyOS4yIDQuNDggMzYuOTcgMi45MiA2LjY0LTEuMzQgNi4wMy00IDQuODktNS4yOC0uNTItLjU5LTEuOC0xLjA0LTMuMTYtMS4zNC0yLjM1LjE2LTQuMjMtLjA2LTQuMjMtLjMzIDAtLjI0IDIuMTktLjEyIDQuMjMuMzNaXCIsXG4gICAgZmlsbDogXCIjRTZFOEVBXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNjIuOTQgNTQuMTRjNi4yMiA1LjY5IDMwLjkgNi4zNSAzOS42IDQuNiA2LjY0LTEuMzQgNi4wNC00IDQuOS01LjI4LTEuMy0xLjQ3LTcuNC0yLjA2LTcuNC0xLjY3IDAgLjQgMy44Ny42OCA3LjQtLjExYTQuOCA0LjggMCAwIDAgMy4wNS0xLjltLTQ3LjU1IDQuMzZjLTUuNy01LjIyLTUuMzctMTIuNzMtMS44NC0xOC42MiAzLjU0LTUuOSA3Ljg2LTcuOTkgMTEuMjYtOC41OCAzLjQtLjU5IDcuNTMuNTMgMTIuNDMtLjU5IDQuOTEtMS4xIDYuMS0zIDYuMjItNy4xMy4xNS00LjcuMTMtMTAuNTQgNS4xLTkuMjYgMy4xNy44MyA0LjE1IDkuOCAxLjM4IDE2Ljk1IDUuMzkgMCAxMC40LjAzIDEzLjAzIDEuNjcgMi42MSAxLjY0IDIuNDQgNS44NC0yLjAxIDcuNDctNC40NSAxLjY0LTcuNTcgMS40NC03LjYgMS4yNS0uMDQtLjE4IDMuNy0uMjUgNy4zNi41NyAxLjMxLjMgMi42Ljk2IDIuNzkgMi4wNC4xOCAxLjA5LS43NCAyLjYtMi45NiAzLjMyLTMuOTggMS4zLTcuODYgMS4yNS03Ljg2Ljg2IDAtLjQgNS4zNC0uNTMgNy42Ni4zMyAxLjUzLjU3IDMuMDggMS4zIDMuMTMgMy40NS4wMi43LS4xNyAxLjM0LS41NCAxLjltLTQ3LjU1IDQuMzdjMTUuNTIgOS44OSA0Ni44NyAyOS44NiA0OC4xIDMwLjZtMCAwYy0xLjQxIDIuOC00LjYgMTAuOTMtNi4xNCAxNi4xLS4yMy43OC0uNDMgMS40OS0uNTggMi4xbTYuNzEtMTguMmMxLjItMi4zOCA0LjM2LTEwLjYgMTkuNzgtMTcuNG00My41IDYyLjJjLTIuMTQtMi4wNC00LjIzLTQuNDQtNC43NS03LjExLS44NS00LjM1IDMuNyA0LjUxIDQuNzUgNy4xWm0wIDBjMSAyLjQ0IDEuMjMgMy43OC42NSA0LjAzLS41OC4yNS02LjkzLTEuNDQtMTAuNDYtOC42OS0uOTYtMi4yMy0xLjMtNC45My0uOTUtNS4wMi4zNC0uMDggMi44IDYgMy44NyAxMi4xNi45OCA1LjY3LTkuNDYtNC45Ny05LjAxLTEyLjI5LjE4LTMuMDYgMS4zLTcuNDQgMi45OC0xMi4yNW0xMi45MiAyMi4wNiAxLjM4IDEuMjltLTQuNS00NC4wNmMzLjM1LS43OCA0LjM0LTEuMiA1LjYyLTIuMTIgMy4wMS0yLjE3IDEuNzQtNS42NC0xLjY5LTIuODUtMS4xLjktMi4zNyAyLjUtMy45MiA0Ljk3Wm0wIDBhMzY2LjggMzY2LjggMCAwIDAtMTYuNTUgNC4zNm0xNi41Ni00LjM2Yy0yLjY0IDQuMi01LjIgOS4zLTcuMzUgMTQuMzZtLTEzLjM2LTguNTZjLjc1LS4zNyAyLjI2LS44OCA0LjE1LTEuNDRtMCAwYy0uMyAxLTIuMzcgNy4wMi01LjEyIDEzLjcybS0xMzUuOC0xOC40YzMuMjkgMy4wNyA0MC4zNSAyMy45NyA0NS4yNyAyNS43NWE1MzcuMDIgNTM3LjAyIDAgMCAwIDIyLjAzIDE2LjYyYzcuNiA1LjM1IDE1LjgzIDEwLjUzIDI1LjE3IDEyLjMzbS05Mi40Ni01NC43Yy0zLjk3IDAtOS40My0xLjkzLTEwLjM4LTcuNjctLjk2LTUuNzQgMy41Ny0yOS4zIDEyLjE4LTQ0LjE0IDIuMzQtNC4wMyA1LjE1LTUuODUgNS42NS01LjUzLjEzLjA4LjE3LjQzLjEzLjkybS03LjU4IDU2LjQxYTIxLjQ4IDIxLjQ4IDAgMCAxLTQuNzgtNy42Yy0uMy0xLjI0LS4wOC0xLjY4LjktMi40NCA0LjQ4LTMuNDggNi4zLTUuNTcgNi4zLTEwLjYyIDAtNC40Ni0zLjA0LTYtMi41LTExLjU2LjcyLTcuNTkgNi4wOS0xOS41OSA2Ljc4LTIxLjA0LjUyLTEuMTIuODItMi4zNC44OC0zLjE1bTAgMGMuNjMtLjQxIDEuNTItLjQgMi4wMiAzLjE1cy43NyAxMS45NCAxLjkgMTUuNTVjLjUgMS41Ny44IDMuNTUgNS42OSA3LjM4IDEyLjMzIDkuNjcgMzcuOSAyNi4xNSAzOS40NSAyNy4xOCAyLjI3IDEuNSAyOC40IDE1LjQ1IDMzLjk1IDE5LjY1bTAgMGMzLjUzIDIuNjYgNS4yMiAzLjY0IDUuMjIgNS42IDAgMS4yMi0yLjMzIDIuNzQtNC43LjM2LTEuMzYtMS4zNS0xLjA1LTMuNy0uNTItNS45NlptNi4xNy01My4xNmM4LjIgNC42MSAxNy4yMyA5LjM1IDIwLjMyIDE3LjU1bTAgMGMuOC0uMzUgMS42My0uNyAyLjUtMS4wNCAxNy41OC02Ljk4IDQ0LTcuNjggNTIuOTItNC4yMiA4LjkgMy40NiAxMC4wOCAxNS4wNiA2LjM4IDI4LjYtMy42OSAxMy41My05LjQzIDIyLjItMTAuMjUgMjMuMi0uODIgMS0zLjQ2IDUuNDUtLjQ3IDkuMDggMi45OSAzLjY0IDMuODUgNC42MiA1LjIgNS44NyAxLjM1IDEuMjYuNzcgMi40NC0uNDcgMi43OS0xLjI0LjM0LTMuNy4yMy02Ljc4LTIuNTItMy4wNy0yLjc2LTQuOC03LjItNC42My03LjI4LjE4LS4wNiA3LjIyIDguNzQgNy40NyAxMC42OS4yNCAxLjk1LTIuMzIgMS45NS00LjcyLjI0YTI3LjIgMjcuMiAwIDAgMS0yLjI3LTEuOTFtLTY5LjUgMTAuMzJhMzYgMzYgMCAwIDAgMTEuMDYuNDRjMTQuMTItMS42NCAyMC44Ni0xNC4wNyAyNi4xMi0yMy41Mi4yOC0uNS41Ny0xLjA0Ljg1LTEuNTltLTM4LjAzIDI0LjY3Yy41NCAyNy4zMiA5Ljk3IDQ2LjkxIDMyLjQ3IDQ4LjkxIDEwLjEyLjkgMTguOTUtMi4xNCAyNS4xMy05LjEzIDcuNTktOC41NyAxMS4yOS0yMy4yMiAxMS4yOS0zMS42MyAwLTkuNDcuNjEtMTguNDcuNjEtMTguNDdtLTMxLjQ3LTE0LjM1LS4xNC43Mm0uMTQtLjcyYzEuODQtMy41MiAzLjY5LTcuNjkgNS4zLTExLjYzbS03LjA2IDI3LjE3Yy0uMDMgOS4wMS43MSAxOS4yNSAzLjMzIDIyLjI4IDIuNzYgMy4xOCAzLjU5LTQuNi40OC0xMy45LTIuMzUtNy4wNC0zLjUtOC42LTMuOC04LjM4Wm0wIDBjLjE5LTUuMy43Ny0xMC41NyAxLjYyLTE0LjgybTAgMGMzLjY0Ljg4IDUuNzUuNDUgNy44Ni0xLjE0IDIuMS0xLjYgNC41Ny00LjcyIDYuMDYtNi4xMiAxLjUtMS40IDIuNzgtMi4yNiAzLjQtMi40Nm0wIDBjLjcyLTIuMDYgMS41NS00LjIgMi40NS02LjM1bTAgMGMtMS44NC4yMy0xMy40NiAzLjE2LTE0LjMzIDMuNzJcIixcbiAgICBzdHJva2U6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwNy43IDE0MS41OGMxMS41OCAyLjIgMjMuNy0uNzcgMzQuNDQtNC45NmwxLjUyLTE4LjU3Yy0yLjI3IDQuMDItOS43IDE0LjgzLTE0LjE5IDE4LjU3LTUuNzggNC44My0xNS43IDUuMDgtMjEuNzYgNC45NlpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEzMy40MyA2Ni41YTQ4LjI2IDQ4LjI2IDAgMCAxIDcuOTYtMi44NWMzLjU2LS44MSA1LjY0LTEuNDIgMTAuMTQtMS45Ny0xLjYgMS43Ny00LjI1IDQuNjMtNi45IDYuMDktNi44MiAzLjc0LTEwLjQ1IDIuMDYtMTEuMi0xLjI2WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTc2LjU4IDYyLjY4YzQuNjcuNTUgMTAuMTItLjYzIDEzLjA4LTMuMTctNS4zNy45Ny0xNS45NS0uODItMjEuOS0yLjM0bDguODIgNS41MVpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJlbGxpcHNlXCIsIHtcbiAgICBjeDogNDQuODk4OSxcbiAgICBjeTogMTUzLjcyOCxcbiAgICByeDogMzUuMTI0LFxuICAgIHJ5OiAzNS4xMjM5LFxuICAgIGZpbGw6IFwidmFyKC0tc2VtaS1jb2xvci1wcmltYXJ5LWxpZ2h0LWRlZmF1bHQpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk02My4xNiAxMzguOWE0LjQgNC40IDAgMCAxIDEuMSA2LjEzbC0xNS45OSAyM2E2LjYxIDYuNjEgMCAwIDEtOS44OCAxLjExTDI2LjI2IDE1OC4xYTQuNCA0LjQgMCAxIDEgNS45My02LjUybDEwLjI4IDkuMzZMNTcuMDMgMTQwYTQuNCA0LjQgMCAwIDEgNi4xMy0xLjFaXCIsXG4gICAgZmlsbDogXCJ2YXIoLS1zZW1pLWNvbG9yLXByaW1hcnkpXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNzUuMzIgMTU3LjFjNC44Ny0zLjE2IDEzLjM5LTIuMzIgMTcuMjggMS41NSAzLjg4IDMuODgtLjc3IDcuMTYtMy4wOCAzLjYzLTIuMzItMy41My0xLjktOS4yNyAxLjI1LTEyLjc3XCIsXG4gICAgc3Ryb2tlOiBcIiM1MTUxNTFcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNDIuMTYgNjMuOTVhOS4yNCA5LjI0IDAgMSAxIDAtMTguNDkgOS4yNCA5LjI0IDAgMCAxIDAgMTguNDlaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCIsXG4gICAgc3Ryb2tlTWl0ZXJsaW1pdDogMTBcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNTAuMzMgNTAuNGE4LjkzIDguOTMgMCAwIDAtOC4xNy00Ljk0Yy0xLjk0IDAtMy40NC40My00Ljk0IDEuMjlsLjQ1LjEyYy0uNC4yNS0uOC41My0xLjE3Ljg0bDE0LjMyIDQuNWMtLjIxLS42NC0uNDgtMS4yOC0uNzctMS44OGwuMjguMDdaXCIsXG4gICAgZmlsbDogXCIjNTE1MTUxXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMzcuOSA1MS4xOWEuOTEuOTEgMCAxIDAgMS44Mi4wMy45MS45MSAwIDAgMC0xLjgzLS4wM1ptNi42OCAxLjUxYS45MS45MSAwIDEgMCAxLjgyLjA0LjkxLjkxIDAgMCAwLTEuODItLjA0WlwiLFxuICAgIGZpbGw6IFwiIzUxNTE1MVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE1MS41MSA1OC4yNmEyLjM0IDIuMzQgMCAxIDEgMC00LjY4IDIuMzQgMi4zNCAwIDAgMSAwIDQuNjhaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiLFxuICAgIHN0cm9rZTogXCIjNTE1MTUxXCIsXG4gICAgc3Ryb2tlTWl0ZXJsaW1pdDogMTBcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMDkuNDggODguOWMtMS44MS4yNS0yLjE5Ljk1LTIuMjggMS4yYTEuNCAxLjQgMCAwIDAtLjExLjY0Yy4wMS4xNy4wNi4zNS4xNi41My4xLjE4LjIyLjMzLjM1LjQ0bC4xMy4xMS0uMDctLjAzLTEuODYgNS4xOWE2LjY3IDYuNjcgMCAwIDEtMy40LTMuMSA2Ljc5IDYuNzkgMCAwIDEtLjMyLTUuODRjLjk5LTIuNDUgMy4zMS00LjE0IDYuNjUtNC42IDMuMjItLjQ0IDcuNTEuMjEgMTMuMTQgMi4zIDYuNTMgMi40MiAxMS44NCA2LjMyIDE2LjcxIDEwLjQgMS41NyAxLjMgMy4wNyAyLjYxIDQuNTUgMy45IDMuMjIgMi44IDYuMzMgNS41MiA5Ljc4IDcuOTYgNC45MyAzLjQ3IDEwLjMgNi4xOCAxNi45NiA3LjI1IDYuNjcgMS4wOCAxNC44NS41NCAyNS40Mi0yLjhsMS42NyA1LjI1Yy0xMS4yIDMuNTQtMjAuMjYgNC4yMy0yNy45NyAzLTcuNzEtMS4yNS0xMy44Ni00LjQtMTkuMjUtOC4yLTMuNy0yLjYtNy4xNi01LjYzLTEwLjQ5LTguNTJhMjc0LjUzIDI3NC41MyAwIDAgMC00LjItMy42MmMtNC43Mi0zLjk0LTkuNDUtNy4zNi0xNS4wOS05LjQ1LTUuMjQtMS45NS04LjU1LTIuMjctMTAuNDgtMlpcIixcbiAgICBmaWxsOiBcIiM1MTUxNTFcIlxuICB9KSk7XG59XG52YXIgSWxsdXN0cmF0aW9uU3VjY2Vzc19kZWZhdWx0ID0gU3ZnQ29tcG9uZW50O1xuZXhwb3J0IHtcbiAgSWxsdXN0cmF0aW9uU3VjY2Vzc19kZWZhdWx0IGFzIGRlZmF1bHRcbn07XG4iLCAiaW1wb3J0IFJlYWN0LCB7IFJlZiwgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTGlzdCwgRW1wdHkgfSBmcm9tICdAZG91eWluZmUvc2VtaS11aSdcbmltcG9ydCB7IElsbHVzdHJhdGlvbk5vQ29udGVudCwgSWxsdXN0cmF0aW9uTm9Db250ZW50RGFyayB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLWlsbHVzdHJhdGlvbnMnXG5pbXBvcnQgSW5maW5pdGVTY3JvbGwgZnJvbSAncmVhY3QtaW5maW5pdGUtc2Nyb2xsZXInXG5pbXBvcnQgeyBBeGlvc1Byb21pc2UgfSBmcm9tICdheGlvcydcblxuZXhwb3J0IHR5cGUgSUxpc3RMb2FkRGF0YSA9IChwYWdlPzogbnVtYmVyLCBzaXplPzogbnVtYmVyKSA9PiBBeGlvc1Byb21pc2VcblxuZXhwb3J0IGludGVyZmFjZSBJTGlzdFByb3BzIHtcbiAgbG9hZERhdGE6IElMaXN0TG9hZERhdGFcbiAgcmVuZGVySXRlbTogKGl0ZW06IGFueSkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIGVtcHR5RGVzY3JpcHRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGFnZUluZm8ge1xuICBwYWdlTm86IG51bWJlclxuICBwYWdlU2l6ZTogbnVtYmVyXG4gIHRvdGFsUGFnZXM6IG51bWJlclxufVxuXG5jb25zdCBkZWZhdWx0UGFnZUluZm86IElQYWdlSW5mbyA9IHtcbiAgcGFnZU5vOiAxLFxuICBwYWdlU2l6ZTogMjAsXG4gIHRvdGFsUGFnZXM6IC0xXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxpc3RSZWYge1xuICByZWZyZXNoRGF0YTogKCkgPT4gdm9pZFxuICByZW1vdmVEYXRhQnlJZDogKGlkOiBzdHJpbmcsIGtleT86IHN0cmluZykgPT4gdm9pZFxufVxuXG5jb25zdCBsaXN0ID0gKHByb3BzOiBJTGlzdFByb3BzLCByZWY6IGFueSkgPT4ge1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xpc3REYXRhLCBzZXRMaXN0RGF0YV0gPSB1c2VTdGF0ZTxhbnlbXT4oW10pXG4gIGNvbnN0IFtwYWdlSW5mbywgc2V0UGFnZUluZm9dID0gdXNlU3RhdGU8SVBhZ2VJbmZvPihkZWZhdWx0UGFnZUluZm8pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2FkRGF0YSgpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGxvYWREYXRhID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBwcm9wcy5sb2FkRGF0YShwYWdlSW5mby5wYWdlTm8sIHBhZ2VJbmZvLnBhZ2VTaXplKVxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzLmRhdGE/LnJlc3VsdCA/PyB7fVxuICAgICAgY29uc3QgX3BhZ2VJbmZvID0gcmVzdWx0LnBhZ2VJbmZvIHx8IGRlZmF1bHRQYWdlSW5mb1xuICAgICAgaWYgKF9wYWdlSW5mby5wYWdlTm8gPD0gMSkge1xuICAgICAgICBzZXRMaXN0RGF0YShyZXN1bHQuZGF0YSA/PyBbXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldExpc3REYXRhKFsuLi5saXN0RGF0YSwgLi4ucmVzdWx0LmRhdGFdKVxuICAgICAgfVxuICAgICAgc2V0UGFnZUluZm8oX3BhZ2VJbmZvKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlZnJlc2hEYXRhID0gKCkgPT4ge1xuICAgIHNldFBhZ2VJbmZvKGRlZmF1bHRQYWdlSW5mbylcbiAgICBsb2FkRGF0YSgpXG4gIH1cblxuICBjb25zdCByZW1vdmVEYXRhQnlJZCA9IChpZDogc3RyaW5nLCBrZXk/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWlkIHx8ICFpZC5sZW5ndGggfHwgIWxpc3REYXRhIHx8ICFsaXN0RGF0YS5sZW5ndGgpIHJldHVyblxuICAgIGxldCBuZXdMaXN0ID0gWy4uLmxpc3REYXRhXVxuICAgIGNvbnN0IGluZGV4ID0gbmV3TGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW1ba2V5ID8/ICdpZCddID09PSBpZClcbiAgICBuZXdMaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICBzZXRMaXN0RGF0YShuZXdMaXN0KVxuICB9XG5cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgcmVmcmVzaERhdGEsXG4gICAgcmVtb3ZlRGF0YUJ5SWRcbiAgfSkpXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPEluZmluaXRlU2Nyb2xsXG4gICAgICAgIGluaXRpYWxMb2FkPXtmYWxzZX1cbiAgICAgICAgcGFnZVN0YXJ0PXsxfVxuICAgICAgICB0aHJlc2hvbGQ9ezEwfVxuICAgICAgICBsb2FkTW9yZT17bG9hZERhdGF9XG4gICAgICAgIGhhc01vcmU9eyFsb2FkaW5nICYmIChwYWdlSW5mby50b3RhbFBhZ2VzID09PSAtMSB8fCBwYWdlSW5mby5wYWdlTm8gPCBwYWdlSW5mby50b3RhbFBhZ2VzKX1cbiAgICAgICAgdXNlV2luZG93PXtmYWxzZX1cbiAgICAgID5cbiAgICAgICAge2xpc3REYXRhICYmIGxpc3REYXRhLmxlbmd0aCA/IChcbiAgICAgICAgICA8TGlzdCBkYXRhU291cmNlPXtsaXN0RGF0YX0gcmVuZGVySXRlbT17cHJvcHMucmVuZGVySXRlbX0gLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8RW1wdHlcbiAgICAgICAgICAgIHN0eWxlPXt7IG1hcmdpblRvcDogMjAgfX1cbiAgICAgICAgICAgIGltYWdlPXs8SWxsdXN0cmF0aW9uTm9Db250ZW50IHN0eWxlPXt7IHdpZHRoOiAxNTAsIGhlaWdodDogMTUwIH19IC8+fVxuICAgICAgICAgICAgZGFya01vZGVJbWFnZT17PElsbHVzdHJhdGlvbk5vQ29udGVudERhcmsgc3R5bGU9e3sgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAgfX0gLz59XG4gICAgICAgICAgICBkZXNjcmlwdGlvbj17cHJvcHMuZW1wdHlEZXNjcmlwdGlvbiA/PyAnXHU2NjgyXHU2NUUwXHU1MTg1XHU1QkI5J31cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9JbmZpbml0ZVNjcm9sbD5cbiAgICA8Lz5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZWFjdC5mb3J3YXJkUmVmPElMaXN0UmVmLCBJTGlzdFByb3BzPihsaXN0KVxuIiwgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IExpc3QgYXMgU2VtaUxpc3QsIEF2YXRhciwgQnV0dG9uLCBTcGFjZSB9IGZyb20gJ0Bkb3V5aW5mZS9zZW1pLXVpJ1xuaW1wb3J0IHsgSWNvbkRlbGV0ZSwgSWNvbkxpbmsgfSBmcm9tICdAZG91eWluZmUvc2VtaS1pY29ucydcblxuZXhwb3J0IGludGVyZmFjZSBJQXJ0aWNsZSB7XG4gIGlkPzogc3RyaW5nXG4gIGF1dGhvckF2YXRhcj86IHN0cmluZ1xuICBhdXRob3JJZD86IHN0cmluZ1xuICBhdXRob3JOYW1lPzogc3RyaW5nXG4gIGNvZGU/OiBzdHJpbmdcbiAgY3JlYXRlQXQ/OiBzdHJpbmdcbiAgbGluaz86IHN0cmluZ1xuICBzdGF0dXM/OiBzdHJpbmdcbiAgdGl0bGU/OiBzdHJpbmdcbiAgdXBkYXRlQXQ/OiBzdHJpbmdcbiAgdXNlclNvdXJjZUlkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvbGxvd2VyIHtcbiAgU3Vic2NyaXB0aW9uVXBkYXRlQXQ/OiBzdHJpbmdcbiAgVXBkYXRlQ291bnQ/OiBudW1iZXJcbiAgYXV0aG9yQXZhdGFyPzogc3RyaW5nXG4gIGF1dGhvcklkPzogc3RyaW5nXG4gIGF1dGhvck5hbWU/OiBzdHJpbmdcbiAgZm9sbG93SWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9ICdjb3B5TGluaycgfCAnY2FuY2VsUHVibGlzaCcgfCAnY2FuY2VsRm9sbG93JyB8ICdjYW5jZWxDb2xsZWN0aW9uJ1xuZXhwb3J0IHR5cGUgQWN0aW9uSGFuZGxlciA9IChhY3Rpb246IEFjdGlvbnMpID0+IHZvaWRcbmV4cG9ydCB0eXBlIENsaWNrSGFuZGxlciA9IFJlYWN0Lk1vdXNlRXZlbnRIYW5kbGVyPEhUTUxMSUVsZW1lbnQ+XG5cbmNvbnN0IGhhbmRsZUFjdGlvbiA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50LCBhY3Rpb246IEFjdGlvbnMsIG9uQWN0aW9uPzogQWN0aW9uSGFuZGxlcikgPT4ge1xuICBlLnN0b3BQcm9wYWdhdGlvbigpIC8vIFx1OTYzQlx1NkI2Mlx1NEU4Qlx1NEVGNlx1NTE5Mlx1NkNFMVxuICBvbkFjdGlvbj8uKGFjdGlvbilcbn1cblxuY29uc3QgYXJ0aWNsZUl0ZW0gPSAoe1xuICBhdmF0YXIsXG4gIHRpdGxlLFxuICBkZXNjcmlwdGlvbixcbiAgYWN0aW9ucyxcbiAgb25DbGlja1xufToge1xuICBhdmF0YXI/OiBzdHJpbmdcbiAgdGl0bGU/OiBzdHJpbmdcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgYWN0aW9ucz86IFJlYWN0LlJlYWN0Tm9kZVxuICBvbkNsaWNrPzogQ2xpY2tIYW5kbGVyXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFNlbWlMaXN0Lkl0ZW1cbiAgICAgIHN0eWxlPXt7IGN1cnNvcjogJ3BvaW50ZXInIH19XG4gICAgICBhbGlnbj0nY2VudGVyJ1xuICAgICAgaGVhZGVyPXthdmF0YXIgJiYgYXZhdGFyLmxlbmd0aCAmJiA8QXZhdGFyIHNyYz17YXZhdGFyfSBzaXplPSdzbWFsbCcgLz59XG4gICAgICBtYWluPXtcbiAgICAgICAgPD5cbiAgICAgICAgICB7dGl0bGUgJiYgdGl0bGUubGVuZ3RoICYmIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tc2VtaS1jb2xvci10ZXh0LTApJywgZm9udFdlaWdodDogNTAwIH19Pnt0aXRsZX08L3NwYW4+fVxuICAgICAgICAgIHtkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi5sZW5ndGggJiYgKFxuICAgICAgICAgICAgPHAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1zZW1pLWNvbG9yLXRleHQtMiknLCBtYXJnaW46ICc0cHggMCcgfX0+e2Rlc2NyaXB0aW9ufTwvcD5cbiAgICAgICAgICApfVxuICAgICAgICA8Lz5cbiAgICAgIH1cbiAgICAgIGV4dHJhPXthY3Rpb25zfVxuICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAvPlxuICApXG59XG5cbi8qKiBcdThCQTJcdTk2MDUgKi9cbmV4cG9ydCBjb25zdCBmb2xsb3dpbmdJdGVtID0gKGl0ZW06IElBcnRpY2xlLCBvbkNsaWNrPzogQ2xpY2tIYW5kbGVyLCBvbkFjdGlvbj86IEFjdGlvbkhhbmRsZXIpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge2FydGljbGVJdGVtKHtcbiAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUgPz8gJ1x1NjcyQVx1NzdFNScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtpdGVtLmF1dGhvck5hbWUgPz8gJ1x1NjcyQVx1NzdFNSd9XFx1MDBBMFxcdTAwQTBcXHUwMEEwXFx1MDBBMCR7aXRlbS51cGRhdGVBdCA/PyAnJ31gLFxuICAgICAgICBhY3Rpb25zOiAoXG4gICAgICAgICAgPFNwYWNlPlxuICAgICAgICAgICAgPEJ1dHRvbiBpY29uPXs8SWNvbkxpbmsgLz59IGFyaWEtbGFiZWw9J1x1NTkwRFx1NTIzNlx1OTRGRVx1NjNBNScgb25DbGljaz17KGUpID0+IGhhbmRsZUFjdGlvbihlLCAnY29weUxpbmsnLCBvbkFjdGlvbil9IC8+XG4gICAgICAgICAgPC9TcGFjZT5cbiAgICAgICAgKSxcbiAgICAgICAgb25DbGlja1xuICAgICAgfSl9XG4gICAgPC8+XG4gIClcbn1cblxuLyoqIFx1NjUzNlx1ODVDRiAqL1xuZXhwb3J0IGNvbnN0IGNvbGxlY3Rpb25JdGVtID0gKGl0ZW06IElBcnRpY2xlLCBvbkNsaWNrPzogQ2xpY2tIYW5kbGVyLCBvbkFjdGlvbj86IEFjdGlvbkhhbmRsZXIpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge2FydGljbGVJdGVtKHtcbiAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUgPz8gJ1x1NjcyQVx1NzdFNScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtpdGVtLmF1dGhvck5hbWUgPz8gJ1x1NjcyQVx1NzdFNSd9XFx1MDBBMFxcdTAwQTBcXHUwMEEwXFx1MDBBMCR7aXRlbS51cGRhdGVBdCA/PyAnJ31gLFxuICAgICAgICBhY3Rpb25zOiAoXG4gICAgICAgICAgPFNwYWNlPlxuICAgICAgICAgICAgPEJ1dHRvbiBpY29uPXs8SWNvbkxpbmsgLz59IGFyaWEtbGFiZWw9J1x1NTkwRFx1NTIzNlx1OTRGRVx1NjNBNScgb25DbGljaz17KGUpID0+IGhhbmRsZUFjdGlvbihlLCAnY29weUxpbmsnLCBvbkFjdGlvbil9IC8+XG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIGljb249ezxJY29uRGVsZXRlIC8+fVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPSdcdTUzRDZcdTZEODhcdTY1MzZcdTg1Q0YnXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBoYW5kbGVBY3Rpb24oZSwgJ2NhbmNlbENvbGxlY3Rpb24nLCBvbkFjdGlvbil9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvU3BhY2U+XG4gICAgICAgICksXG4gICAgICAgIG9uQ2xpY2tcbiAgICAgIH0pfVxuICAgIDwvPlxuICApXG59XG5cbi8qKiBcdTUxNzNcdTZDRTggKi9cbmV4cG9ydCBjb25zdCBmb2xsb3dlcnNJdGVtID0gKGl0ZW06IElGb2xsb3dlciwgb25DbGljaz86IENsaWNrSGFuZGxlciwgb25BY3Rpb24/OiBBY3Rpb25IYW5kbGVyKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHthcnRpY2xlSXRlbSh7XG4gICAgICAgIGF2YXRhcjogaXRlbS5hdXRob3JBdmF0YXIgJiYgaXRlbS5hdXRob3JBdmF0YXIubGVuZ3RoID8gaXRlbS5hdXRob3JBdmF0YXIgOiAnaHR0cHM6Ly9qb2VzY2gubW9lL2FwaS92MS9qb3NoJyxcbiAgICAgICAgdGl0bGU6IGl0ZW0uYXV0aG9yTmFtZSAmJiBpdGVtLmF1dGhvck5hbWUubGVuZ3RoID8gaXRlbS5hdXRob3JOYW1lIDogJ1x1NjcyQVx1NzdFNScsXG4gICAgICAgIGFjdGlvbnM6IChcbiAgICAgICAgICA8U3BhY2U+XG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIGljb249ezxJY29uRGVsZXRlIC8+fVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPSdcdTUzRDZcdTZEODhcdTUxNzNcdTZDRTgnXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBoYW5kbGVBY3Rpb24oZSwgJ2NhbmNlbEZvbGxvdycsIG9uQWN0aW9uKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9TcGFjZT5cbiAgICAgICAgKSxcbiAgICAgICAgb25DbGlja1xuICAgICAgfSl9XG4gICAgPC8+XG4gIClcbn1cblxuLyoqIFx1NTNEMVx1NUUwMyAqL1xuZXhwb3J0IGNvbnN0IHB1Ymxpc2hJdGVtID0gKGl0ZW06IElBcnRpY2xlLCBvbkNsaWNrPzogQ2xpY2tIYW5kbGVyLCBvbkFjdGlvbj86IEFjdGlvbkhhbmRsZXIpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge2FydGljbGVJdGVtKHtcbiAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUgPz8gJ1x1NjcyQVx1NzdFNScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtpdGVtLmF1dGhvck5hbWUgPz8gJ1x1NjcyQVx1NzdFNSd9XFx1MDBBMFxcdTAwQTBcXHUwMEEwXFx1MDBBMCR7aXRlbS51cGRhdGVBdCA/PyAnJ31gLFxuICAgICAgICBhY3Rpb25zOiAoXG4gICAgICAgICAgPFNwYWNlPlxuICAgICAgICAgICAgPEJ1dHRvbiBpY29uPXs8SWNvbkxpbmsgLz59IGFyaWEtbGFiZWw9J1x1NTkwRFx1NTIzNlx1OTRGRVx1NjNBNScgb25DbGljaz17KGUpID0+IGhhbmRsZUFjdGlvbihlLCAnY29weUxpbmsnLCBvbkFjdGlvbil9IC8+XG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIGljb249ezxJY29uRGVsZXRlIC8+fVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPSdcdTUzRDZcdTZEODhcdTUzRDFcdTVFMDMnXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBoYW5kbGVBY3Rpb24oZSwgJ2NhbmNlbFB1Ymxpc2gnLCBvbkFjdGlvbil9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvU3BhY2U+XG4gICAgICAgICksXG4gICAgICAgIG9uQ2xpY2tcbiAgICAgIH0pfVxuICAgIDwvPlxuICApXG59XG4iLCAiaW1wb3J0IHtcbiAgY29sbGVjdEFydGljbGUsXG4gIGZvbGxvd1VzZXIsXG4gIGdldEFydGljbGVEZXRhaWwsXG4gIGxpa2VBcnRpY2xlLFxuICB1bkNvbGxlY3RBcnRpY2xlLFxuICB1bmZvbGxvd1VzZXIsXG4gIHVubGlrZUFydGljbGVcbn0gZnJvbSAnQC9hcGkvYXJ0aWNsZSdcbmltcG9ydCB7IEJhc2VJdGVtVmlldyB9IGZyb20gJ0AvY29tcG9uZW50cy9iYXNlSXRlbVZpZXcnXG5pbXBvcnQgeyBXb3Jrc3BhY2VMZWFmLCBNYXJrZG93blByZXZpZXdWaWV3LCBzZXRJY29uIH0gZnJvbSAnb2JzaWRpYW4nXG5cbmV4cG9ydCBjb25zdCBWSUVXX0FSVElDTEVfREVUQUlMID0gJ09QUCBBcnRpY2xlIERldGFpbCBWaWV3J1xuXG5pbnRlcmZhY2UgSUFydGljbGVEZXRhaWwge1xuICBpZD86IHN0cmluZ1xuICBhdXRob3JBdmF0YXI/OiBzdHJpbmdcbiAgYXV0aG9ySWQ/OiBzdHJpbmdcbiAgYXV0aG9yTmFtZT86IHN0cmluZ1xuICBjb2RlPzogc3RyaW5nXG4gIHRpdGxlPzogc3RyaW5nXG4gIGNvbnRlbnQ/OiBzdHJpbmdcbiAgc3RhdHVzPzogc3RyaW5nXG4gIGxpbms/OiBzdHJpbmdcbiAgdXNlclNvdXJjZUlkPzogc3RyaW5nXG4gIGNyZWF0ZUF0Pzogc3RyaW5nXG4gIHVwZGF0ZUF0Pzogc3RyaW5nXG5cbiAgbGlrZWQ/OiBib29sZWFuXG4gIGxpa2VDb3VudHM/OiBudW1iZXJcbiAgY29sbGVjdGVkPzogYm9vbGVhblxuICBjb2xsZWN0Q291bnRzPzogbnVtYmVyXG4gIGZvbGxvd2VkPzogYm9vbGVhblxuICBmb2xsb3dDb3VudHM/OiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIElBY3Rpb24ge1xuICBpZDogc3RyaW5nXG4gIGljb246IHN0cmluZ1xuICB0ZXh0OiBzdHJpbmdcbiAgaXRlbT86IEhUTUxFbGVtZW50XG59XG5cbmV4cG9ydCBjbGFzcyBBcnRpY2xlRGV0YWlsVmlldyBleHRlbmRzIEJhc2VJdGVtVmlldyB7XG4gIGFydGljbGVJZDogc3RyaW5nXG4gIGFydGljbGU/OiBJQXJ0aWNsZURldGFpbFxuICBwcmV2aWV3VmlldzogTWFya2Rvd25QcmV2aWV3Vmlld1xuXG4gIGZvb3RlcjogSFRNTEVsZW1lbnRcbiAgYXV0aG9yQXZhdGFyOiBIVE1MSW1hZ2VFbGVtZW50XG4gIGF1dGhvck5hbWU6IEhUTUxEaXZFbGVtZW50XG4gIGFjdGlvbnM6IElBY3Rpb25bXSA9IFtcbiAgICB7IGlkOiAnbGlrZScsIGljb246ICd0aHVtYnMtdXAnLCB0ZXh0OiAnXHU3MEI5XHU4RDVFJyB9LFxuICAgIHsgaWQ6ICdjb2xsZWN0JywgaWNvbjogJ2hlYXJ0JywgdGV4dDogJ1x1NjUzNlx1ODVDRicgfSxcbiAgICB7IGlkOiAnZm9sbG93JywgaWNvbjogJ3VzZXItcm91bmQtcGx1cycsIHRleHQ6ICdcdTUxNzNcdTZDRTgnIH1cbiAgXVxuXG4gIGNvbnN0cnVjdG9yKGxlYWY6IFdvcmtzcGFjZUxlYWYpIHtcbiAgICBzdXBlcihsZWFmKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uc2V0QXR0cignc3R5bGUnLCAnZGlzcGxheTpub25lJykgLy8gXHU5NjkwXHU4NUNGXHU1REU2XHU0RkE3XHU1QkZDXHU4MjJBXG4gICAgICB0aGlzLmNvbnRhaW5lckVsLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzJdLnNldEF0dHIoJ3N0eWxlJywgJ2Rpc3BsYXk6bm9uZScpIC8vIFx1OTY5MFx1ODVDRlx1NTNGM1x1NEZBN1x1NUJGQ1x1ODIyQVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICB9XG5cbiAgZ2V0Vmlld1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVklFV19BUlRJQ0xFX0RFVEFJTFxuICB9XG5cbiAgZ2V0RGlzcGxheVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0FydGljbGUgRGV0YWlsJ1xuICB9XG5cbiAgc2V0QXJ0aWNsZUlkKGFydGljbGVJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuYXJ0aWNsZUlkICYmIHRoaXMuYXJ0aWNsZUlkID09PSBhcnRpY2xlSWQpIHJldHVyblxuICAgIHRoaXMuYXJ0aWNsZUlkID0gYXJ0aWNsZUlkXG4gICAgdGhpcy5vblJlZnJlc2goKVxuICB9XG5cbiAgYXN5bmMgb25SZWZyZXNoKCkge1xuICAgIGlmICghdGhpcy5hcnRpY2xlSWQ/Lmxlbmd0aCkgcmV0dXJuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFx1ODNCN1x1NTNENlx1NTE4NVx1NUJCOVxuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBnZXRBcnRpY2xlRGV0YWlsKHRoaXMuYXJ0aWNsZUlkKVxuICAgICAgdGhpcy5hcnRpY2xlID0gKGRhdGEucmVzdWx0IHx8IHt9KSBhcyBJQXJ0aWNsZURldGFpbFxuICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmFydGljbGUudGl0bGUgfHwgJydcblxuICAgICAgLy8gXHU4QkJFXHU3RjZFXHU2ODA3XHU5ODk4XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLmxlYWYudGFiSGVhZGVySW5uZXJUaXRsZUVsLnNldFRleHQodGl0bGUpXG4gICAgICB0aGlzLmNvbnRhaW5lckVsLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdLnNldFRleHQodGl0bGUpXG5cbiAgICAgIC8vIFx1OEJCRVx1N0Y2RVx1NTE4NVx1NUJCOVxuICAgICAgdGhpcy5wcmV2aWV3Q29udGVudCgpXG5cbiAgICAgIC8vIFx1NUU5NVx1OTBFOFx1NEZFMVx1NjA2RlxuICAgICAgdGhpcy5wcmV2aWV3Rm9vdGVyKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJldmlld0NvbnRlbnQoKSB7XG4gICAgaWYgKCF0aGlzLnByZXZpZXdWaWV3KSB7XG4gICAgICB0aGlzLnByZXZpZXdWaWV3ID0gbmV3IE1hcmtkb3duUHJldmlld1ZpZXcodGhpcyBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50KVxuICAgIH1cbiAgICB0aGlzLnByZXZpZXdWaWV3LnNldCh0aGlzLmFydGljbGU/LmNvbnRlbnQgPz8gJycsIGZhbHNlKVxuICB9XG5cbiAgcHJldmlld0Zvb3RlcigpIHtcbiAgICBpZiAoIXRoaXMuZm9vdGVyKSB7XG4gICAgICB0aGlzLmZvb3RlciA9IHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRGl2KCdwcmV2aWV3LWZvb3RlcicpXG4gICAgICAvLyBcdTVERTZcdTRGQTdcbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLmZvb3Rlci5jcmVhdGVEaXYoJ3ByZXZpZXctZm9vdGVyLWxlZnQnKVxuICAgICAgdGhpcy5hdXRob3JBdmF0YXIgPSBsZWZ0LmNyZWF0ZURpdigncHJldmlldy1mb290ZXItYXV0aG9yLWF2YXRhcicpLmNyZWF0ZUVsKCdpbWcnKVxuICAgICAgdGhpcy5hdXRob3JOYW1lID0gbGVmdC5jcmVhdGVEaXYoJ3ByZXZpZXctZm9vdGVyLWF1dGhvci1uYW1lJylcblxuICAgICAgLy8gXHU1M0YzXHU0RkE3XG4gICAgICBjb25zdCByaWdodCA9IHRoaXMuZm9vdGVyLmNyZWF0ZURpdigncHJldmlldy1mb290ZXItcmlnaHQnKVxuICAgICAgdGhpcy5hY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb25JdGVtID0gcmlnaHQuY3JlYXRlRGl2KCdwcmV2aWV3LWZvb3Rlci1hY3Rpb24gY2xpY2thYmxlLWljb24nKVxuICAgICAgICBzZXRJY29uKGFjdGlvbkl0ZW0sIGFjdGlvbi5pY29uKVxuICAgICAgICBhY3Rpb25JdGVtLnNldEF0dHIoJ3RpdGxlJywgYWN0aW9uLnRleHQpXG4gICAgICAgIGNvbnN0IGFjdGlvblRleHQgPSBhY3Rpb25JdGVtLmNyZWF0ZURpdigncHJldmlldy1mb290ZXItYWN0aW9uLXRleHQnKVxuICAgICAgICBhY3Rpb25UZXh0LnNldFRleHQoYWN0aW9uLnRleHQpXG4gICAgICAgIGFjdGlvbkl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmhhbmRsZUFjdGlvbih7IC4uLmFjdGlvbiwgaXRlbTogYWN0aW9uSXRlbSB9KSlcbiAgICAgICAgYWN0aW9uLml0ZW0gPSBhY3Rpb25JdGVtXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGF2YXRhciA9IHRoaXMuYXJ0aWNsZT8uYXV0aG9yQXZhdGFyPy5sZW5ndGggPyB0aGlzLmFydGljbGU/LmF1dGhvckF2YXRhciA6ICdodHRwczovL2pvZXNjaC5tb2UvYXBpL3YxL2pvc2gnXG4gICAgdGhpcy5hdXRob3JBdmF0YXIuc2V0QXR0cignc3JjJywgYXZhdGFyKVxuICAgIHRoaXMuYXV0aG9yTmFtZS5zZXRUZXh0KHRoaXMuYXJ0aWNsZT8uYXV0aG9yTmFtZSA/PyAnXHU2NzJBXHU3N0U1JylcbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uKSA9PiB0aGlzLnVwZGF0ZUFjdGlvbihhY3Rpb24pKVxuICB9XG5cbiAgdXBkYXRlQWN0aW9uKGFjdGlvbjogSUFjdGlvbikge1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZVxuICAgIGxldCBjb3VudHMgPSAwXG4gICAgc3dpdGNoIChhY3Rpb24uaWQpIHtcbiAgICAgIGNhc2UgJ2xpa2UnOlxuICAgICAgICBhY3RpdmUgPSB0aGlzLmFydGljbGU/Lmxpa2VkID8/IGZhbHNlXG4gICAgICAgIGNvdW50cyA9IHRoaXMuYXJ0aWNsZT8ubGlrZUNvdW50cyA/PyAwXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdjb2xsZWN0JzpcbiAgICAgICAgYWN0aXZlID0gdGhpcy5hcnRpY2xlPy5jb2xsZWN0ZWQgPz8gZmFsc2VcbiAgICAgICAgY291bnRzID0gdGhpcy5hcnRpY2xlPy5jb2xsZWN0Q291bnRzID8/IDBcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2ZvbGxvdyc6XG4gICAgICAgIGFjdGl2ZSA9IHRoaXMuYXJ0aWNsZT8uZm9sbG93ZWQgPz8gZmFsc2VcbiAgICAgICAgY291bnRzID0gdGhpcy5hcnRpY2xlPy5mb2xsb3dDb3VudHMgPz8gMFxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBhY3Rpb24uaXRlbT8uc2V0QXR0cignc3R5bGUnLCBhY3RpdmUgPyAnY29sb3I6IHZhcigtLXRleHQtYWNjZW50KTsnIDogJycpXG4gICAgYWN0aW9uLml0ZW0/LmNoaWxkcmVuWzFdPy5zZXRUZXh0KGNvdW50cyA+IDk5ID8gJzk5KycgOiBjb3VudHMudG9TdHJpbmcoKSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUFjdGlvbihhY3Rpb246IElBY3Rpb24pIHtcbiAgICBpZiAoIXRoaXMuYXJ0aWNsZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChhY3Rpb24uaWQpIHtcbiAgICAgICAgY2FzZSAnbGlrZSc6XG4gICAgICAgICAgdGhpcy5hcnRpY2xlLmxpa2VkID8gYXdhaXQgdW5saWtlQXJ0aWNsZSh0aGlzLmFydGljbGVJZCkgOiBhd2FpdCBsaWtlQXJ0aWNsZSh0aGlzLmFydGljbGVJZClcbiAgICAgICAgICB0aGlzLmFydGljbGUubGlrZWQgPSAhdGhpcy5hcnRpY2xlLmxpa2VkXG4gICAgICAgICAgdGhpcy5hcnRpY2xlLmxpa2VDb3VudHMgPSB0aGlzLmFydGljbGUubGlrZWRcbiAgICAgICAgICAgID8gKHRoaXMuYXJ0aWNsZS5saWtlQ291bnRzID8/IDApICsgMVxuICAgICAgICAgICAgOiAodGhpcy5hcnRpY2xlLmxpa2VDb3VudHMgPz8gMSkgLSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnY29sbGVjdCc6XG4gICAgICAgICAgdGhpcy5hcnRpY2xlLmNvbGxlY3RlZCA/IGF3YWl0IHVuQ29sbGVjdEFydGljbGUodGhpcy5hcnRpY2xlSWQpIDogYXdhaXQgY29sbGVjdEFydGljbGUodGhpcy5hcnRpY2xlSWQpXG4gICAgICAgICAgdGhpcy5hcnRpY2xlLmNvbGxlY3RlZCA9ICF0aGlzLmFydGljbGUuY29sbGVjdGVkXG4gICAgICAgICAgdGhpcy5hcnRpY2xlLmNvbGxlY3RDb3VudHMgPSB0aGlzLmFydGljbGUuY29sbGVjdGVkXG4gICAgICAgICAgICA/ICh0aGlzLmFydGljbGUuY29sbGVjdENvdW50cyA/PyAwKSArIDFcbiAgICAgICAgICAgIDogKHRoaXMuYXJ0aWNsZS5jb2xsZWN0Q291bnRzID8/IDEpIC0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2ZvbGxvdyc6XG4gICAgICAgICAgaWYgKCF0aGlzLmFydGljbGUuYXV0aG9ySWQpIHJldHVyblxuICAgICAgICAgIHRoaXMuYXJ0aWNsZS5mb2xsb3dlZCA/IGF3YWl0IHVuZm9sbG93VXNlcih0aGlzLmFydGljbGUuYXV0aG9ySWQpIDogYXdhaXQgZm9sbG93VXNlcih0aGlzLmFydGljbGUuYXV0aG9ySWQpXG4gICAgICAgICAgdGhpcy5hcnRpY2xlLmZvbGxvd2VkID0gIXRoaXMuYXJ0aWNsZS5mb2xsb3dlZFxuICAgICAgICAgIHRoaXMuYXJ0aWNsZS5mb2xsb3dDb3VudHMgPSB0aGlzLmFydGljbGUuZm9sbG93ZWRcbiAgICAgICAgICAgID8gKHRoaXMuYXJ0aWNsZS5mb2xsb3dDb3VudHMgPz8gMCkgKyAxXG4gICAgICAgICAgICA6ICh0aGlzLmFydGljbGUuZm9sbG93Q291bnRzID8/IDEpIC0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlQWN0aW9uKGFjdGlvbilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgbW9tZW50IH0gZnJvbSAnb2JzaWRpYW4nXG5pbXBvcnQgZW4gZnJvbSAnLi9lbidcbmltcG9ydCB6aCBmcm9tICcuL3poJ1xuXG5jb25zdCB0cmFuc2xhdGlvbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XG4gIGVuLFxuICB6aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFx1ODNCN1x1NTNENiBPYnNpZGlhbiBcdTVGNTNcdTUyNERcdThCRURcdThBMDBcbiAgY29uc3QgbG9jYWxlID0gbW9tZW50LmxvY2FsZSgpXG4gIC8vIFx1NTk4Mlx1Njc5Q1x1NjYyRlx1NEUyRFx1NjU4N1x1NzNBRlx1NTg4M1x1RkYwQ1x1NEY3Rlx1NzUyOFx1NEUyRFx1NjU4N1x1N0ZGQlx1OEJEMVxuICBjb25zdCBjdXJyZW50VHJhbnNsYXRpb25zID0gbG9jYWxlLnN0YXJ0c1dpdGgoJ3poJykgPyB0cmFuc2xhdGlvbnMuemggOiB0cmFuc2xhdGlvbnMuZW5cblxuICAvLyBcdTc2RjRcdTYzQTVcdTgzQjdcdTUzRDZcdTdGRkJcdThCRDFcbiAgY29uc3QgdHJhbnNsYXRpb24gPSBjdXJyZW50VHJhbnNsYXRpb25zW2tleV1cbiAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uXG4gIH1cblxuICByZXR1cm4ga2V5XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQge1xuICAvL1x1OEJCRVx1N0Y2RVx1OTAxQVx1NzUyOFx1N0ZGQlx1OEJEMVxuXG4gICdTZWxlY3QgdGhlIEFJIHNlcnZpY2UgcHJvdmlkZXInOiAnU2VsZWN0IHRoZSBBSSBzZXJ2aWNlIHByb3ZpZGVyLicsXG4gICdPbGxhbWEgKExvY2FsKSc6ICdPbGxhbWEgKGxvY2FsKScsXG4gIE1vZGVsOiAnTW9kZWwnLFxuICAnRmFpbGVkIHRvIGZldGNoIG1vZGVscyc6ICdGYWlsZWQgdG8gZmV0Y2ggbW9kZWxzLicsXG4gICdBUEkgS2V5JzogJ0FQSSBrZXknLFxuICAnQ3VzdG9tIEFQSSBBZGRyZXNzJzogJ0N1c3RvbSBBUEkgYWRkcmVzcycsXG4gICdJZiB1c2luZyBhIGN1c3RvbSBBUEkgcHJveHksIHBsZWFzZSBlbnRlciB0aGUgZnVsbCBBUEkgYWRkcmVzcyc6XG4gICAgJ0lmIHVzaW5nIGEgY3VzdG9tIEFQSSBwcm94eSwgcGxlYXNlIGVudGVyIHRoZSBmdWxsIEFQSSBhZGRyZXNzLicsXG4gICdQbGVhc2UgZW50ZXIgeW91ciBBUEkgS2V5JzogJ1BsZWFzZSBlbnRlciB5b3VyIEFQSSBrZXkuJyxcbiAgJ1ZhbGlkYXRpbmcgQVBJIEtleS4uLic6ICdWYWxpZGF0aW5nIEFQSSBrZXkuLi4nLFxuICAnQVBJIEtleSB2ZXJpZmljYXRpb24gc3VjY2Vzc2Z1bCEnOiAnQVBJIGtleSB2ZXJpZmljYXRpb24gc3VjY2Vzc2Z1bCEnLFxuICAnQVBJIEtleSB2ZXJpZmljYXRpb24gZmFpbGVkLiBQbGVhc2UgY2hlY2sgeW91ciBBUEkgS2V5Lic6ICdBUEkga2V5IHZlcmlmaWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIEFQSSBrZXkuJyxcbiAgU2F2ZTogJ1NhdmUnLFxuICBDYW5jZWw6ICdDYW5jZWwnLFxuICBFZGl0OiAnRWRpdCcsXG4gIERlbGV0ZTogJ0RlbGV0ZScsXG4gICdDdXN0b20gTW9kZWwnOiAnQ3VzdG9tIG1vZGVsJyxcbiAgJ0FQSSBLZXkgaXMgdmFsaWQhJzogJ0FQSSBLZXkgaXMgdmFsaWQhJyxcbiAgJ0ZhaWxlZCB0byB2YWxpZGF0ZSBBUEkgS2V5LiBQbGVhc2UgY2hlY2sgeW91ciBrZXkgYW5kIHRyeSBhZ2Fpbi4nOlxuICAgICdGYWlsZWQgdG8gdmFsaWRhdGUgQVBJIEtleS4gUGxlYXNlIGNoZWNrIHlvdXIga2V5IGFuZCB0cnkgYWdhaW4uJyxcbiAgJ1BsZWFzZSBlbnRlciBhbiBBUEkgS2V5IGZpcnN0JzogJ1BsZWFzZSBlbnRlciBhbiBBUEkgS2V5IGZpcnN0LicsXG4gICdDaGVja2luZy4uLic6ICdDaGVja2luZy4uLicsXG4gICdBUEkgS2V5IGFuZCB0aGUgY3VycmVudCBtb2RlbCBhcmUgYm90aCBhdmFpbGFibGUhJzogJ0FQSSBLZXkgYW5kIHRoZSBjdXJyZW50IG1vZGVsIGFyZSBib3RoIGF2YWlsYWJsZSEnLFxuICAnQVBJIEtleSBpcyBpbnZhbGlkIG9yIHRoZXJlIGlzIGEgc2VydmVyIGVycm9yLiBQbGVhc2UgY2hlY2sgaWYgeW91ciBBUEkgS2V5IGlzIGNvcnJlY3QuJzpcbiAgICAnQVBJIEtleSBpcyBpbnZhbGlkIG9yIHRoZXJlIGlzIGEgc2VydmVyIGVycm9yLiBQbGVhc2UgY2hlY2sgaWYgeW91ciBBUEkgS2V5IGlzIGNvcnJlY3QuJyxcblxuICAvL09wZW5BSSBcdThCQkVcdTdGNkVcblxuICAnU2VsZWN0IHRoZSBPcGVuQUkgbW9kZWwgdG8gdXNlJzogJ1NlbGVjdCB0aGUgT3BlbkFJIG1vZGVsIHRvIHVzZS4nLFxuICAnT3BlbkFJIFNldHRpbmdzJzogJ09wZW5BSSBzZXJ2aWNlJyxcbiAgJ0VudGVyIHlvdXIgT3BlbkFJIEFQSSBLZXkuJzogJ0VudGVyIHlvdXIgT3BlbkFJIEFQSSBrZXkuJyxcbiAgJ05vIGF2YWlsYWJsZSBtb2RlbHMgZm91bmQuJzogJ05vIGF2YWlsYWJsZSBtb2RlbHMgZm91bmQuJyxcbiAgJ0FQSSBLZXkgdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseSEnOiAnQVBJIEtleSB2YWxpZGF0ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gICdObyBtb2RlbHMgYXZhaWxhYmxlLiBQbGVhc2UgY2hlY2sgeW91ciBBUEkgS2V5Lic6ICdObyBtb2RlbHMgYXZhaWxhYmxlLiBQbGVhc2UgY2hlY2sgeW91ciBBUEkgS2V5LicsXG5cbiAgLy9BbnRocm9waWMgXHU4QkJFXHU3RjZFXG5cbiAgJ0FudGhyb3BpYyBTZXR0aW5ncyc6ICdBbnRocm9waWMgc2VydmljZScsXG4gICdFbnRlciB5b3VyIEFudGhyb3BpYyBBUEkgS2V5Lic6ICdFbnRlciB5b3VyIEFudGhyb3BpYyBBUEkga2V5LicsXG4gICdTZWxlY3QgdGhlIEFudGhyb3BpYyBtb2RlbCB0byB1c2UnOiAnU2VsZWN0IHRoZSBBbnRocm9waWMgbW9kZWwgdG8gdXNlLicsXG4gICdTZWxlY3QgYSBtb2RlbCBvciB1c2UgYSBjdXN0b20gb25lJzogJ1NlbGVjdCBhIG1vZGVsIG9yIHVzZSBhIGN1c3RvbSBvbmUuJyxcbiAgJ01vZGVsIElEIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZXMsIGRvdHMgYW5kIGh5cGhlbnMnOlxuICAgICdNb2RlbCBJRCBjYW4gb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBkb3RzIGFuZCBoeXBoZW5zLicsXG5cbiAgLy9HZW1pbmkgXHU4QkJFXHU3RjZFXG5cbiAgJ1NlbGVjdCB0aGUgR2VtaW5pIG1vZGVsIHRvIHVzZSc6ICdTZWxlY3QgdGhlIEdlbWluaSBtb2RlbCB0byB1c2UuJyxcbiAgJ1VuYWJsZSB0byBjcmVhdGUgbW9kZWwgc2VsZWN0aW9uIGRyb3Bkb3duIG1lbnUuJzogJ1VuYWJsZSB0byBjcmVhdGUgbW9kZWwgc2VsZWN0aW9uIGRyb3Bkb3duIG1lbnUuJyxcbiAgJ0dlbWluaSBTZXR0aW5ncyc6ICdHZW1pbmkgc2VydmljZScsXG4gICdFbnRlciB5b3VyIEdlbWluaSBBUEkgS2V5JzogJ0VudGVyIHlvdXIgR2VtaW5pIEFQSSBrZXkuJyxcblxuICAvL0RlZXBzZWVrIFx1OEJCRVx1N0Y2RVxuXG4gICdEZWVwc2VlayBTZXR0aW5ncyc6ICdEZWVwc2VlayBzZXJ2aWNlJyxcbiAgJ0VudGVyIHlvdXIgRGVlcHNlZWsgQVBJIEtleSc6ICdFbnRlciB5b3VyIERlZXBzZWVrIEFQSSBrZXkuJyxcblxuICAvL09sbGFtYSBcdThCQkVcdTdGNkVcblxuICAnT2xsYW1hIFNldHRpbmdzJzogJ09sbGFtYSBzZXJ2aWNlJyxcbiAgJ1NlcnZlciBBZGRyZXNzJzogJ1NlcnZlciBhZGRyZXNzJyxcbiAgJ09sbGFtYSBzZXJ2ZXIgYWRkcmVzcyAoZGVmYXVsdDogaHR0cDovL2xvY2FsaG9zdDoxMTQzNCknOiAnT2xsYW1hIHNlcnZlciBhZGRyZXNzIChkZWZhdWx0OiBodHRwOi8vbG9jYWxob3N0OjExNDM0KScsXG4gIENoZWNrOiAnQ2hlY2snLFxuICAnU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBPbGxhbWEgc2VydmljZSc6ICdTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIE9sbGFtYSBzZXJ2aWNlLicsXG4gICdObyBtb2RlbHMgZm91bmQuIFBsZWFzZSBkb3dubG9hZCBtb2RlbHMgdXNpbmcgb2xsYW1hJzogJ05vIG1vZGVscyBmb3VuZC4gUGxlYXNlIGRvd25sb2FkIG1vZGVscyB1c2luZyBvbGxhbWEuJyxcbiAgJ0NvdWxkIG5vdCBjb25uZWN0IHRvIE9sbGFtYSBzZXJ2aWNlJzogJ0NvdWxkIG5vdCBjb25uZWN0IHRvIE9sbGFtYSBzZXJ2aWNlJyxcbiAgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIE9sbGFtYSBzZXJ2aWNlLiBQbGVhc2UgY2hlY2sgdGhlIHNlcnZlciBhZGRyZXNzLic6XG4gICAgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIE9sbGFtYSBzZXJ2aWNlLiBQbGVhc2UgY2hlY2sgdGhlIHNlcnZlciBhZGRyZXNzLicsXG4gICdDdXJyZW50bHkgc2VsZWN0ZWQgbW9kZWwgKFRlc3QgY29ubmVjdGlvbiB0byBzZWUgYWxsIGF2YWlsYWJsZSBtb2RlbHMpJzpcbiAgICAnQ3VycmVudGx5IHNlbGVjdGVkIG1vZGVsIChUZXN0IGNvbm5lY3Rpb24gdG8gc2VlIGFsbCBhdmFpbGFibGUgbW9kZWxzKScsXG4gICdTZWxlY3QgYSBtb2RlbCB0byB1c2UnOiAnU2VsZWN0IGEgbW9kZWwgdG8gdXNlJyxcbiAgJ05vIG1vZGVscyBhdmFpbGFibGUuIFBsZWFzZSBsb2FkIGFuIGF2YWlsYWJsZSBtb2RlbCBmaXJzdC4nOlxuICAgICdObyBtb2RlbHMgYXZhaWxhYmxlLiBQbGVhc2UgbG9hZCBhbiBhdmFpbGFibGUgbW9kZWwgZmlyc3QuJyxcbiAgJ05vIG1vZGVscyBhdmFpbGFibGUnOiAnTm8gbW9kZWxzIGF2YWlsYWJsZScsXG5cbiAgLy9Qcm9tcHQgXHU4QkJFXHU3RjZFXG5cbiAgJ1Byb21wdCBzZXR0aW5ncyc6ICdDdXN0b20gcHJvbXB0JyxcbiAgJ0FkZCBQcm9tcHQnOiAnQWRkIHByb21wdCcsXG4gICdJbnB1dCBQcm9tcHQgTmFtZSc6ICdJbnB1dCBwcm9tcHQgbmFtZScsXG4gICdJbnB1dCBQcm9tcHQgQ29udGVudFxcbkF2YWlsYWJsZSBwYXJhbWV0ZXJzOlxcbnt7aGlnaGxpZ2h0fX0gLSBDdXJyZW50IGhpZ2hsaWdodGVkIHRleHRcXG57e2NvbW1lbnR9fSAtIEV4aXN0aW5nIGNvbW1lbnQnOlxuICAgICdJbnB1dCBwcm9tcHQgY29udGVudFxcbkF2YWlsYWJsZSBwYXJhbWV0ZXJzOlxcbnt7aGlnaGxpZ2h0fX0gLSBDdXJyZW50IGhpZ2hsaWdodGVkIHRleHRcXG57e2NvbW1lbnR9fSAtIEV4aXN0aW5nIGNvbW1lbnQnLFxuICAnUHJvbXB0IGFkZGVkJzogJ1Byb21wdCBhZGRlZCcsXG4gICdQcm9tcHQgdXBkYXRlZCc6ICdQcm9tcHQgdXBkYXRlZCcsXG5cbiAgLy9Db21tZW50SW5wdXRcblxuICAnU2hpZnQgKyBFbnRlciBXcmFwLCBFbnRlciBTYXZlJzogJ1NoaWZ0ICsgRW50ZXIgV3JhcCwgRW50ZXIgU2F2ZScsXG4gICdEZWxldGUgY29tbWVudCc6ICdEZWxldGUnLFxuXG4gIC8vQWN0aW9uQnV0dG9uc1xuXG4gICdBZGQgQ29tbWVudCc6ICdBZGQgY29tbWVudCcsXG4gICdFeHBvcnQgYXMgSW1hZ2UnOiAnRXhwb3J0IGFzIGltYWdlJyxcblxuICAvL0FJQnV0dG9uXG5cbiAgJ1NlbGVjdCBQcm9tcHQnOiAnU2VsZWN0IHByb21wdCcsXG4gICdQbGVhc2UgYWRkIFByb21wdCBpbiB0aGUgc2V0dGluZ3MgZmlyc3QnOiAnUGxlYXNlIGFkZCBwcm9tcHQgaW4gdGhlIHNldHRpbmdzIGZpcnN0JyxcbiAgJ0FJIGNvbW1lbnRzIGhhdmUgYmVlbiBhZGRlZCc6ICdBSSBjb21tZW50cyBoYXZlIGJlZW4gYWRkZWQnLFxuICAnQUkgY29tbWVudHMgZmFpbGVkOic6ICdBSSBjb21tZW50cyBmYWlsZWQ6JyxcblxuICAvL0NoYXRWaWV3XG5cbiAgQ2hhdDogJ0NoYXQnLFxuICAnRmFpbGVkIHRvIHByb2Nlc3MgZHJvcHBlZCBoaWdobGlnaHQ6JzogJ0ZhaWxlZCB0byBwcm9jZXNzIGRyb3BwZWQgaGlnaGxpZ2h0OicsXG4gICdoaWdobGlnaHRlZCBub3Rlcyc6ICcgaGlnaGxpZ2h0ZWQgbm90ZXMnLFxuICAnSW5wdXQgbWVzc2FnZS4uLic6ICdJbnB1dCBtZXNzYWdlLi4uJyxcbiAgJ1VuYWJsZSB0byBhY2Nlc3MgdGhlIE9sbGFtYSBtb2RlbCwgcGxlYXNlIGNoZWNrIHRoZSBzZXJ2aWNlLic6XG4gICAgJ1VuYWJsZSB0byBhY2Nlc3MgdGhlIE9sbGFtYSBtb2RlbCwgcGxlYXNlIGNoZWNrIHRoZSBzZXJ2aWNlLicsXG4gICdVbmFibGUgdG8gZ2V0IEdlbWluaSBtb2RlbCBsaXN0LCBwbGVhc2UgY2hlY2sgQVBJIEtleSBhbmQgbmV0d29yayBjb25uZWN0aW9uLic6XG4gICAgJ1VuYWJsZSB0byBnZXQgR2VtaW5pIG1vZGVsIGxpc3QsIHBsZWFzZSBjaGVjayBBUEkga2V5IGFuZCBuZXR3b3JrIGNvbm5lY3Rpb24uJyxcblxuICAvL0V4cG9ydE1vZGFsXG5cbiAgRG93bmxvYWQ6ICdEb3dubG9hZCcsXG4gICdFeHBvcnQgc3VjY2Vzc2Z1bCEnOiAnRXhwb3J0IHN1Y2Nlc3NmdWwhJyxcbiAgJ0V4cG9ydCBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4uJzogJ0V4cG9ydCBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4uJyxcblxuICAvL0NvbW1lbnRWaWV3XG5cbiAgJ0xvYWRpbmcuLi4nOiAnTG9hZGluZy4uLicsXG4gICdTZWFyY2guLi4nOiAnU2VhcmNoLi4uJyxcbiAgJ05vIG1hdGNoaW5nIGNvbnRlbnQgZm91bmQuJzogJ05vIG1hdGNoaW5nIGNvbnRlbnQgZm91bmQuJyxcbiAgJ1RoZSBjdXJyZW50IGRvY3VtZW50IGhhcyBubyBoaWdobGlnaHRlZCBjb250ZW50Lic6ICdUaGUgY3VycmVudCBkb2N1bWVudCBoYXMgbm8gaGlnaGxpZ2h0ZWQgY29udGVudC4nLFxuICAnTm8gY29ycmVzcG9uZGluZyBmaWxlIGZvdW5kLic6ICdObyBjb3JyZXNwb25kaW5nIGZpbGUgZm91bmQuJyxcbiAgJ0V4cG9ydCBmYWlsZWQ6IEZhaWxlZCB0byBsb2FkIG5lY2Vzc2FyeSBjb21wb25lbnRzLic6ICdFeHBvcnQgZmFpbGVkOiBGYWlsZWQgdG8gbG9hZCBuZWNlc3NhcnkgY29tcG9uZW50cy4nLFxuICAnQWxsIEhpZ2hsaWdodCc6ICdBbGwgaGlnaGxpZ2h0JyxcbiAgJ0V4cG9ydCBhcyBub3Rlcyc6ICdFeHBvcnQgYXMgbm90ZXMnLFxuICAnQWRkIEZpbGUgQ29tbWVudCc6ICdBZGQgZmlsZSBjb21tZW50JyxcbiAgJ0ZpbGUgQ29tbWVudCc6ICdGaWxlIGNvbW1lbnQnLFxuICAnU3VjY2Vzc2Z1bGx5IGV4cG9ydGVkIGhpZ2hsaWdodHMgdG86ICc6ICdTdWNjZXNzZnVsbHkgZXhwb3J0ZWQgaGlnaGxpZ2h0cyB0bzogJyxcbiAgJ0ZhaWxlZCB0byBleHBvcnQgaGlnaGxpZ2h0czogJzogJ0ZhaWxlZCB0byBleHBvcnQgaGlnaGxpZ2h0czogJyxcblxuICAvL2luZGV4XG5cbiAgJ0RlZmF1bHQgVGVtcGxhdGUnOiAnRGVmYXVsdCB0ZW1wbGF0ZScsXG4gICdNb2Rlcm4gbWluaW1hbGlzdCBrbm93bGVkZ2UgY2FyZCBzdHlsZSc6ICdNb2Rlcm4gbWluaW1hbGlzdCBrbm93bGVkZ2UgY2FyZCBzdHlsZScsXG4gICdBY2FkZW1pYyBUZW1wbGF0ZSc6ICdBY2FkZW1pYyB0ZW1wbGF0ZScsXG4gICdGb3JtYWwgc3R5bGUgc3VpdGFibGUgZm9yIGFjYWRlbWljIGNpdGF0aW9ucyc6ICdGb3JtYWwgc3R5bGUgc3VpdGFibGUgZm9yIGFjYWRlbWljIGNpdGF0aW9ucycsXG4gICdTb2NpYWwgVGVtcGxhdGUnOiAnU29jaWFsIHRlbXBsYXRlJyxcbiAgJ01vZGVybiBzdHlsZSBzdWl0YWJsZSBmb3Igc29jaWFsIG1lZGlhIHNoYXJpbmcnOiAnTW9kZXJuIHN0eWxlIHN1aXRhYmxlIGZvciBzb2NpYWwgbWVkaWEgc2hhcmluZycsXG5cbiAgLy9tYWluXG5cbiAgJ09wZW4gQUkgY2hhdCB3aW5kb3cnOiAnT3BlbiBBSSBjaGF0IHdpbmRvdycsXG4gICdPcGVuIEhpTm90ZSB3aW5kb3cnOiAnT3BlbiBIaU5vdGUgd2luZG93JyxcblxuICAvLyBTZXR0aW5nc1xuICBHZW5lcmFsOiAnSGlnaGxpZ2h0JyxcbiAgJ0V4cG9ydCBQYXRoJzogJ0V4cG9ydCBwYXRoJyxcbiAgJ1NldCB0aGUgcGF0aCBmb3IgZXhwb3J0ZWQgaGlnaGxpZ2h0IG5vdGVzLiBMZWF2ZSBlbXB0eSB0byB1c2UgdmF1bHQgcm9vdC4gVGhlIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHlvdXIgdmF1bHQgcm9vdC4nOlxuICAgICdTZXQgdGhlIHBhdGggZm9yIGV4cG9ydGVkIGhpZ2hsaWdodCBub3Rlcy4gTGVhdmUgZW1wdHkgdG8gdXNlIHZhdWx0IHJvb3QuIFRoZSBwYXRoIHNob3VsZCBiZSByZWxhdGl2ZSB0byB5b3VyIHZhdWx0IHJvb3QuJyxcbiAgRXhjbHVzaW9uczogJ0V4Y2x1c2lvbnMnLFxuICAnQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aHMsIHRhZ3MsIG5vdGUgdGl0bGVzIG9yIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IHdpbGwgYmUgZXhjbHVkZWQgZnJvbSBoaWdobGlnaHRpbmcuIGUuZy4gZm9sZGVyMSwgZm9sZGVyMS9mb2xkZXIyLCBbW25vdGUxXV0sIFtbbm90ZTJdXSwgKi5leGNhbGlkcmF3Lm1kJzpcbiAgICAnQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aHMsIHRhZ3MsIG5vdGUgdGl0bGVzIG9yIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IHdpbGwgYmUgZXhjbHVkZWQgZnJvbSBoaWdobGlnaHRpbmcuIGUuZy4gZm9sZGVyMSwgZm9sZGVyMS9mb2xkZXIyLCBbW25vdGUxXV0sIFtbbm90ZTJdXSwgKi5leGNhbGlkcmF3Lm1kJyxcbiAgJ0N1c3RvbSB0ZXh0IGV4dHJhY3Rpb24nOiAnQ3VzdG9tIHRleHQgZXh0cmFjdGlvbicsXG4gICdVc2UgQ3VzdG9tIFBhdHRlcm4nOiAnVXNlIGN1c3RvbSBwYXR0ZXJuJyxcbiAgJ0VuYWJsZSB0byB1c2UgYSBjdXN0b20gcmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0aW5nIHRleHQuJzpcbiAgICAnRW5hYmxlIHRvIHVzZSBhIGN1c3RvbSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGV4dHJhY3RpbmcgdGV4dC4nLFxuICAnQ3VzdG9tIFBhdHRlcm4nOiAnQ3VzdG9tIHBhdHRlcm4nLFxuICAnRW50ZXIgYSBjdXN0b20gcmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0aW5nIHRleHQuIFVzZSBjYXB0dXJlIGdyb3VwcyAoKSB0byBzcGVjaWZ5IHRoZSB0ZXh0IHRvIGV4dHJhY3QuIFRoZSBmaXJzdCBub24tZW1wdHkgY2FwdHVyZSBncm91cCB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4dHJhY3RlZCB0ZXh0Lic6XG4gICAgJ0VudGVyIGEgY3VzdG9tIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgZXh0cmFjdGluZyB0ZXh0LiBVc2UgY2FwdHVyZSBncm91cHMgKCkgdG8gc3BlY2lmeSB0aGUgdGV4dCB0byBleHRyYWN0LiBUaGUgZmlyc3Qgbm9uLWVtcHR5IGNhcHR1cmUgZ3JvdXAgd2lsbCBiZSB1c2VkIGFzIHRoZSBleHRyYWN0ZWQgdGV4dC4nLFxuICAnRGVmYXVsdCBDb2xvcic6ICdEZWZhdWx0IGNvbG9yJyxcbiAgJ1NldCB0aGUgZGVmYXVsdCBjb2xvciBmb3IgZGVjb3JhdG9ycyB3aGVuIG5vIGNvbG9yIGlzIHNwZWNpZmllZC4gTGVhdmUgZW1wdHkgdG8gdXNlIHN5c3RlbSBkZWZhdWx0Lic6XG4gICAgJ1NldCB0aGUgZGVmYXVsdCBjb2xvciBmb3IgZGVjb3JhdG9ycyB3aGVuIG5vIGNvbG9yIGlzIHNwZWNpZmllZC4gTGVhdmUgZW1wdHkgdG8gdXNlIHN5c3RlbSBkZWZhdWx0LicsXG4gICdFeHBvcnQgdGVtcGxhdGUnOiAnRXhwb3J0IHRlbXBsYXRlJyxcbiAgJ0NsZWFuIG9ycGhhbmVkIGRhdGEnOiAnQ2xlYW4gb3JwaGFuZWQgZGF0YScsXG4gICdSZW1vdmUgaGlnaGxpZ2h0cyBhbmQgY29tbWVudHMgdGhhdCBubyBsb25nZXIgZXhpc3QgaW4geW91ciBkb2N1bWVudHMuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGRlbGV0ZWQgaGlnaGxpZ2h0cyBidXQgdGhlaXIgY29tbWVudHMgYXJlIHN0aWxsIHN0b3JlZCBpbiB0aGUgZGF0YSBmaWxlLic6XG4gICAgJ1JlbW92ZSBoaWdobGlnaHRzIGFuZCBjb21tZW50cyB0aGF0IG5vIGxvbmdlciBleGlzdCBpbiB5b3VyIGRvY3VtZW50cy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgZGVsZXRlZCBoaWdobGlnaHRzIGJ1dCB0aGVpciBjb21tZW50cyBhcmUgc3RpbGwgc3RvcmVkIGluIHRoZSBkYXRhIGZpbGUuJyxcblxuICAvLyBGbGFzaGNhcmQgU2V0dGluZ3NcbiAgJ0ZsYXNoY2FyZCBsZWFybmluZyc6ICdGbGFzaGNhcmQgbGVhcm5pbmcnLFxuICAnTmV3IGNhcmRzIHBlciBkYXknOiAnTmV3IGNhcmRzIHBlciBkYXknLFxuICAnTWF4aW11bSBudW1iZXIgb2YgbmV3IGNhcmRzIHRvIGxlYXJuIGVhY2ggZGF5JzogJ01heGltdW0gbnVtYmVyIG9mIG5ldyBjYXJkcyB0byBsZWFybiBlYWNoIGRheS4nLFxuICAnUmV2aWV3cyBwZXIgZGF5JzogJ1Jldmlld3MgcGVyIGRheScsXG4gICdNYXhpbXVtIG51bWJlciBvZiBjYXJkcyB0byByZXZpZXcgZWFjaCBkYXknOiAnTWF4aW11bSBudW1iZXIgb2YgY2FyZHMgdG8gcmV2aWV3IGVhY2ggZGF5LicsXG4gICdUYXJnZXQgcmV0ZW50aW9uJzogJ1RhcmdldCByZXRlbnRpb24nLFxuICAnVGFyZ2V0IG1lbW9yeSByZXRlbnRpb24gcmF0ZSAoMC44ID0gODAlKSc6ICdUYXJnZXQgbWVtb3J5IHJldGVudGlvbiByYXRlICgwLjggPSA4MCUpLicsXG4gICdNYXhpbXVtIGludGVydmFsJzogJ01heGltdW0gaW50ZXJ2YWwnLFxuICAnTWF4aW11bSBpbnRlcnZhbCBpbiBkYXlzIGJldHdlZW4gcmV2aWV3cyc6ICdNYXhpbXVtIGludGVydmFsIGluIGRheXMgYmV0d2VlbiByZXZpZXdzLicsXG4gICdSZXNldCBkYWlseSBzdGF0cyc6ICdSZXNldCBkYWlseSBzdGF0cycsXG4gIFwiUmVzZXQgdG9kYXkncyBsZWFybmluZyBzdGF0aXN0aWNzXCI6IFwiUmVzZXQgdG9kYXkncyBsZWFybmluZyBzdGF0aXN0aWNzLlwiLFxuICBSZXNldDogJ1Jlc2V0JyxcbiAgJ0RhaWx5IHN0YXRpc3RpY3MgaGF2ZSBiZWVuIHJlc2V0JzogJ0RhaWx5IHN0YXRpc3RpY3MgaGF2ZSBiZWVuIHJlc2V0JyxcbiAgJ05vIHN0YXRpc3RpY3MgdG8gcmVzZXQgZm9yIHRvZGF5JzogJ05vIHN0YXRpc3RpY3MgdG8gcmVzZXQgZm9yIHRvZGF5JyxcbiAgQWR2YW5jZWQ6ICdBZHZhbmNlZCcsXG4gICdUaGVzZSBzZXR0aW5ncyBjb250cm9sIHRoZSBGU1JTIGFsZ29yaXRobSBwYXJhbWV0ZXJzLiBPbmx5IGNoYW5nZSB0aGVtIGlmIHlvdSB1bmRlcnN0YW5kIHRoZSBhbGdvcml0aG0uJzpcbiAgICAnVGhlc2Ugc2V0dGluZ3MgY29udHJvbCB0aGUgRlNSUyBhbGdvcml0aG0gcGFyYW1ldGVycy4gT25seSBjaGFuZ2UgdGhlbSBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgYWxnb3JpdGhtLicsXG4gICdSZXNldCBhbGdvcml0aG0gcGFyYW1ldGVycyc6ICdSZXNldCBhbGdvcml0aG0gcGFyYW1ldGVycycsXG4gICdSZXNldCB0aGUgRlNSUyBhbGdvcml0aG0gcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcyc6ICdSZXNldCB0aGUgRlNSUyBhbGdvcml0aG0gcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcy4nLFxuICAnUmVzZXQgdG8gRGVmYXVsdCc6ICdSZXNldCB0byBkZWZhdWx0JyxcbiAgJ0ZTUlMgcGFyYW1ldGVycyBoYXZlIGJlZW4gcmVzZXQgdG8gZGVmYXVsdCB2YWx1ZXMnOiAnRlNSUyBwYXJhbWV0ZXJzIGhhdmUgYmVlbiByZXNldCB0byBkZWZhdWx0IHZhbHVlcy4nLFxuICBkYXlzOiAnZGF5cycsXG5cbiAgLy8gRmxhc2hjYXJkIFVJXG4gICdBY3RpdmF0ZSBIaUNhcmQnOiAnQWN0aXZhdGUgSGlDYXJkJyxcbiAgJ0VudGVyIHlvdXIgbGljZW5zZSBrZXkgdG8gYWN0aXZhdGUgSGlDYXJkIGZlYXR1cmUuJzogJ0VudGVyIHlvdXIgbGljZW5zZSBrZXkgdG8gYWN0aXZhdGUgSGlDYXJkIGZlYXR1cmUuJyxcbiAgJ0VudGVyIGxpY2Vuc2Uga2V5JzogJ0VudGVyIGxpY2Vuc2Uga2V5JyxcbiAgQWN0aXZhdGU6ICdBY3RpdmF0ZScsXG4gICdQbGVhc2UgZW50ZXIgYSBsaWNlbnNlIGtleSc6ICdQbGVhc2UgZW50ZXIgYSBsaWNlbnNlIGtleScsXG4gICdIaUNhcmQgYWN0aXZhdGVkIHN1Y2Nlc3NmdWxseSEnOiAnSGlDYXJkIGFjdGl2YXRlZCBzdWNjZXNzZnVsbHkhJyxcbiAgJ0ludmFsaWQgbGljZW5zZSBrZXknOiAnSW52YWxpZCBsaWNlbnNlIGtleScsXG4gICdVc2UgZ2xvYmFsIHNldHRpbmdzJzogJ1VzZSBnbG9iYWwgc2V0dGluZ3MnLFxuICAnTmV3IGNhcmRzIHBlciBkYXk6JzogJ05ldyBjYXJkcyBwZXIgZGF5OicsXG4gICdSZXZpZXdzIHBlciBkYXk6JzogJ1Jldmlld3MgcGVyIGRheTonLFxuICAnQWxsIENhcmRzJzogJ0FsbCBjYXJkcycsXG4gICdEdWUgVG9kYXknOiAnRHVlIHRvZGF5JyxcbiAgJ05ldyBDYXJkcyc6ICdOZXcgY2FyZHMnLFxuICBMZWFybmVkOiAnTGVhcm5lZCcsXG4gICdDcmVhdGUgR3JvdXAnOiAnQ3JlYXRlIGdyb3VwJyxcbiAgJ0dyb3VwIG5hbWUnOiAnR3JvdXAgbmFtZScsXG4gIENyZWF0ZTogJ0NyZWF0ZScsXG4gIEFnYWluOiAnQWdhaW4nLFxuICBIYXJkOiAnSGFyZCcsXG4gIEdvb2Q6ICdHb29kJyxcbiAgRWFzeTogJ0Vhc3knLFxuICBDYXJkOiAnQ2FyZCcsXG4gIG9mOiAnb2YnLFxuICBTZXR0aW5nczogJ1NldHRpbmdzJyxcbiAgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBncm91cD8nOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGdyb3VwPycsXG4gIFllczogJ1llcycsXG4gIE5vOiAnTm8nLFxuICBcIllvdSd2ZSBjb21wbGV0ZWQgYWxsIGNhcmRzIGZvciB0b2RheSFcIjogXCJZb3UndmUgY29tcGxldGVkIGFsbCBjYXJkcyBmb3IgdG9kYXkhXCIsXG4gICdObyBjYXJkcyBhdmFpbGFibGUuJzogJ05vIGNhcmRzIGF2YWlsYWJsZS4nLFxuICAnUmV0dXJuIHRvIEZpcnN0IENhcmQnOiAnUmV0dXJuIHRvIEZpcnN0IENhcmQnLFxuICAnRWRpdCBHcm91cCc6ICdFZGl0IGdyb3VwJyxcbiAgJ0NyZWF0ZSBOZXcgR3JvdXAnOiAnQ3JlYXRlIG5ldyBncm91cCcsXG4gICdHcm91cCBOYW1lJzogJ0dyb3VwIG5hbWUnLFxuICAnUGxlYXNlIGZpbGwgaW4gYWxsIGZpZWxkcyc6ICdQbGVhc2UgZmlsbCBpbiBhbGwgZmllbGRzJyxcbiAgJ1NhdmluZy4uLic6ICdTYXZpbmcuLi4nLFxuICAnQ3JlYXRpbmcuLi4nOiAnQ3JlYXRpbmcuLi4nLFxuICAnR3JvdXAgdXBkYXRlZCBzdWNjZXNzZnVsbHknOiAnR3JvdXAgdXBkYXRlZCBzdWNjZXNzZnVsbHknLFxuICAnRmFpbGVkIHRvIHVwZGF0ZSBncm91cCc6ICdGYWlsZWQgdG8gdXBkYXRlIGdyb3VwJyxcbiAgJ0dyb3VwIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5JzogJ0dyb3VwIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgJ0ZhaWxlZCB0byBjcmVhdGUgb3IgdXBkYXRlIGdyb3VwJzogJ0ZhaWxlZCB0byBjcmVhdGUgb3IgdXBkYXRlIGdyb3VwJyxcbiAgRHVlOiAnRHVlJyxcbiAgTmV3OiAnTmV3JyxcbiAgUmV2aWV3OiAnUmV2aWV3JyxcbiAgUmV0ZW50aW9uOiAnUmV0ZW50aW9uJyxcbiAgJ0xpbWl0czonOiAnTGltaXRzOicsXG4gICdcdTZCQ0ZcdTY1RTVcdTVCNjZcdTRFNjBcdTk2NTBcdTUyMzZcXG4nOiAnRGFpbHkgbGVhcm5pbmcgbGltaXRzXFxuJyxcbiAgJ1x1NjVCMFx1NTM2MVx1NzI0NzonOiAnTmV3IGNhcmRzOicsXG4gICdcdTU5MERcdTRFNjBcdTUzNjFcdTcyNDc6JzogJ1JldmlldyBjYXJkczonLFxuICAnXHU1QjY2XHU0RTYwXHU1QjhDXHU2MjEwXHVGRjAxJzogJ0xlYXJuaW5nIGNvbXBsZXRlZCEnLFxuICBcdThGRDRcdTU2REVcdTdCMkNcdTRFMDBcdTVGMjBcdTUzNjFcdTcyNDc6ICdSZXR1cm4gdG8gZmlyc3QgY2FyZCcsXG4gICdcdTYwQThcdTRFQ0FcdTU5MjlcdTc2ODRcdTY1QjBcdTUzNjFcdTcyNDdcdTVCNjZcdTRFNjBcdTkxNERcdTk4OURcdTVERjJcdTc1MjhcdTVCOENcdUZGMDFcdTY2MEVcdTU5MjlcdTUxOERcdTY3NjVcdTVCNjZcdTRFNjBcdTU0MjdcdTMwMDInOlxuICAgIFwiWW91J3ZlIHJlYWNoZWQgeW91ciBkYWlseSBxdW90YSBmb3IgbmV3IGNhcmRzISBDb21lIGJhY2sgdG9tb3Jyb3cuXCIsXG4gICdcdTYwQThcdTRFQ0FcdTU5MjlcdTc2ODRcdTU5MERcdTRFNjBcdTkxNERcdTk4OURcdTVERjJcdTc1MjhcdTVCOENcdUZGMDFcdTY2MEVcdTU5MjlcdTUxOERcdTY3NjVcdTU5MERcdTRFNjBcdTU0MjdcdTMwMDInOiBcIllvdSd2ZSByZWFjaGVkIHlvdXIgZGFpbHkgcXVvdGEgZm9yIHJldmlld3MhIENvbWUgYmFjayB0b21vcnJvdy5cIixcbiAgJ1x1NjBBOFx1NEVDQVx1NTkyOVx1NTcyOCBcIic6ICdZb3VcXCd2ZSByZWFjaGVkIHlvdXIgZGFpbHkgcXVvdGEgaW4gXCInLFxuICAnXCIgXHU1MjA2XHU3RUM0XHU3Njg0XHU2NUIwXHU1MzYxXHU3MjQ3XHU1QjY2XHU0RTYwXHU5MTREXHU5ODlEXHU1REYyXHU3NTI4XHU1QjhDXHVGRjAxXHU2NjBFXHU1OTI5XHU1MThEXHU2NzY1XHU1QjY2XHU0RTYwXHU1NDI3XHUzMDAyJzogJ1wiIGdyb3VwIGZvciBuZXcgY2FyZHMhIENvbWUgYmFjayB0b21vcnJvdy4nLFxuICAnXCIgXHU1MjA2XHU3RUM0XHU3Njg0XHU1OTBEXHU0RTYwXHU5MTREXHU5ODlEXHU1REYyXHU3NTI4XHU1QjhDXHVGRjAxXHU2NjBFXHU1OTI5XHU1MThEXHU2NzY1XHU1OTBEXHU0RTYwXHU1NDI3XHUzMDAyJzogJ1wiIGdyb3VwIGZvciByZXZpZXdzISBDb21lIGJhY2sgdG9tb3Jyb3cuJyxcbiAgJ1x1NjA2RFx1NTU5Q1x1RkYwMVx1NjBBOFx1NURGMlx1NUI4Q1x1NjIxMCBcIic6ICdDb25ncmF0dWxhdGlvbnMhIFlvdVxcJ3ZlIGNvbXBsZXRlZCBhbGwgY2FyZHMgaW4gXCInLFxuICAnXCIgXHU0RTJEXHU3Njg0XHU2MjQwXHU2NzA5XHU1MzYxXHU3MjQ3XHU1QjY2XHU0RTYwXHUzMDAyJzogJ1wiIGdyb3VwLicsXG4gICdcdTc4NkVcdTVCOUFcdTg5ODFcdTUyMjBcdTk2NjRcdTUyMDZcdTdFQzQgXCInOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBncm91cCBcIicsXG4gICdcIiBcdTU0MTdcdUZGMUYnOiAnXCI/JyxcbiAgXHU1MjA2XHU3RUM0XHU1MjIwXHU5NjY0XHU2MjEwXHU1MjlGOiAnR3JvdXAgZGVsZXRlZCBzdWNjZXNzZnVsbHknLFxuICBcdTUyMjBcdTk2NjRcdTUyMDZcdTdFQzRcdTU5MzFcdThEMjU6ICdGYWlsZWQgdG8gZGVsZXRlIGdyb3VwJyxcbiAgJ1x1NjUyRlx1NjMwMVx1NEVFNVx1NEUwQlx1NjgzQ1x1NUYwRlx1RkYxQVxcbi0gXHU2NTg3XHU0RUY2XHU1OTM5XHVGRjFBZm9sZGVyMSwgZm9sZGVyMS9mb2xkZXIyXFxuLSBcdTdCMTRcdThCQjBcdUZGMUFbW25vdGUxXV0sIFtbbm90ZTJdXVxcbi0gXHU2ODA3XHU3QjdFXHVGRjFBI3RhZzEsICN0YWcyXFxuLSBcdTkwMUFcdTkxNERcdTdCMjZcdUZGMUEqLmV4Y2FsaWRyYXcubWRcXG4tIFx1NTE4NVx1NUJCOVx1RkYxQVx1NzZGNFx1NjNBNVx1OEY5M1x1NTE2NVx1ODk4MVx1NjQxQ1x1N0QyMlx1NzY4NFx1NjU4N1x1NjcyQyc6XG4gICAgJ1N1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZm9ybWF0czpcXG4tIEZvbGRlcnM6IGZvbGRlcjEsIGZvbGRlcjEvZm9sZGVyMlxcbi0gTm90ZXM6IFtbbm90ZTFdXSwgW1tub3RlMl1dXFxuLSBUYWdzOiAjdGFnMSwgI3RhZzJcXG4tIFdpbGRjYXJkczogKi5leGNhbGlkcmF3Lm1kXFxuLSBDb250ZW50OiBkaXJlY3RseSBlbnRlciB0ZXh0IHRvIHNlYXJjaCBmb3InLFxuICAnXHU1M0NEXHU4RjZDXHU1MzYxXHU3MjQ3XHVGRjA4XHU0RjdGXHU3NTI4XHU4QkM0XHU4QkJBXHU0RjVDXHU0RTNBXHU5NUVFXHU5ODk4XHVGRjA5JzogJ1JldmVyc2UgY2FyZHMgKHVzZSBjb21tZW50cyBhcyBxdWVzdGlvbnMpJyxcbiAgJ0xlYXJuaW5nIHNldHRpbmdzJzogJ0xlYXJuaW5nIHNldHRpbmdzJyxcbiAgJ1x1OEJCMFx1NUZDNlx1NEZERFx1NjMwMVx1NzM4NyA9IChcdTYwM0JcdTU5MERcdTRFNjBcdTZCMjFcdTY1NzAgLSBcdTkwNTdcdTVGRDhcdTZCMjFcdTY1NzApIC8gXHU2MDNCXHU1OTBEXHU0RTYwXHU2QjIxXHU2NTcwXFxuXHU4QkU1XHU2MzA3XHU2ODA3XHU1M0NEXHU2NjIwXHU0RTg2XHU0RjYwXHU3Njg0XHU1QjY2XHU0RTYwXHU2NTQ4XHU2NzlDXHVGRjBDXHU4RDhBXHU5QUQ4XHU4QkY0XHU2NjBFXHU4QkIwXHU1RkM2XHU2NTQ4XHU2NzlDXHU4RDhBXHU1OTdEJzpcbiAgICAnTWVtb3J5IHJldGVudGlvbiA9ICh0b3RhbCByZXZpZXdzIC0gZm9yZ290dGVuIHJldmlld3MpIC8gdG90YWwgcmV2aWV3c1xcblRoaXMgbWV0cmljIHJlZmxlY3RzIHlvdXIgbGVhcm5pbmcgZWZmZWN0aXZlbmVzcy4gSGlnaGVyIG1lYW5zIGJldHRlciBtZW1vcnkgcmV0ZW50aW9uJyxcblxuICAvLyBcdTUxNzZcdTRFRDZcblxuICAnT3BlbiAoRG91YmxlQ2xpY2spJzogJ09wZW4gKGRvdWJsZS1jbGljayknXG59XG4iLCAiZXhwb3J0IGRlZmF1bHQge1xuICAvL1x1OEJCRVx1N0Y2RVx1OTAxQVx1NzUyOFx1N0ZGQlx1OEJEMVxuXG4gICdTZWxlY3QgdGhlIEFJIHNlcnZpY2UgcHJvdmlkZXInOiAnXHU5MDA5XHU2MkU5IEFJIFx1NjcwRFx1NTJBMVx1NjNEMFx1NEY5Qlx1NTU0Nlx1MzAwMicsXG4gICdPbGxhbWEgKExvY2FsKSc6ICdPbGxhbWEgKFx1NjcyQ1x1NTczMCknLFxuICBNb2RlbDogJ1x1NkEyMVx1NTc4QicsXG4gICdGYWlsZWQgdG8gZmV0Y2ggbW9kZWxzJzogJ1x1ODNCN1x1NTNENlx1NkEyMVx1NTc4Qlx1NTkzMVx1OEQyNScsXG4gICdBUEkgS2V5JzogJ0FQSSBcdTVCQzZcdTk0QTUnLFxuICAnQ3VzdG9tIEFQSSBBZGRyZXNzJzogJ1x1ODFFQVx1NUI5QVx1NEU0OSBBUEkgXHU1NzMwXHU1NzQwJyxcbiAgJ0lmIHVzaW5nIGEgY3VzdG9tIEFQSSBwcm94eSwgcGxlYXNlIGVudGVyIHRoZSBmdWxsIEFQSSBhZGRyZXNzJzogJ1x1NTk4Mlx1Njc5Q1x1NEY3Rlx1NzUyOFx1ODFFQVx1NUI5QVx1NEU0OSBBUEkgXHU0RUUzXHU3NDA2XHVGRjBDXHU4QkY3XHU4RjkzXHU1MTY1XHU1QjhDXHU2NTc0XHU3Njg0IEFQSSBcdTU3MzBcdTU3NDAnLFxuICAnUGxlYXNlIGVudGVyIHlvdXIgQVBJIEtleSc6ICdcdThCRjdcdThGOTNcdTUxNjVcdTYwQThcdTc2ODQgQVBJIFx1NUJDNlx1OTRBNScsXG4gICdWYWxpZGF0aW5nIEFQSSBLZXkuLi4nOiAnXHU2QjYzXHU1NzI4XHU5QThDXHU4QkMxIEFQSSBcdTVCQzZcdTk0QTUuLi4nLFxuICAnQVBJIEtleSB2ZXJpZmljYXRpb24gc3VjY2Vzc2Z1bCEnOiAnQVBJIFx1NUJDNlx1OTRBNVx1OUE4Q1x1OEJDMVx1NjIxMFx1NTI5Rlx1RkYwMScsXG4gICdBUEkgS2V5IHZlcmlmaWNhdGlvbiBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIEFQSSBLZXkuJzogJ0FQSSBcdTVCQzZcdTk0QTVcdTlBOENcdThCQzFcdTU5MzFcdThEMjVcdTMwMDJcdThCRjdcdTY4QzBcdTY3RTVcdTYwQThcdTc2ODQgQVBJIFx1NUJDNlx1OTRBNVx1MzAwMicsXG4gIFNhdmU6ICdcdTRGRERcdTVCNTgnLFxuICBDYW5jZWw6ICdcdTUzRDZcdTZEODgnLFxuICBFZGl0OiAnXHU3RjE2XHU4RjkxJyxcbiAgRGVsZXRlOiAnXHU1MjIwXHU5NjY0JyxcbiAgJ0N1c3RvbSBNb2RlbCc6ICdcdTgxRUFcdTVCOUFcdTRFNDlcdTZBMjFcdTU3OEInLFxuICAnQVBJIEtleSBpcyB2YWxpZCEnOiAnQVBJIFx1NUJDNlx1OTRBNVx1NjcwOVx1NjU0OFx1RkYwMScsXG4gICdGYWlsZWQgdG8gdmFsaWRhdGUgQVBJIEtleS4gUGxlYXNlIGNoZWNrIHlvdXIga2V5IGFuZCB0cnkgYWdhaW4uJzogJ0FQSSBcdTVCQzZcdTk0QTVcdTlBOENcdThCQzFcdTU5MzFcdThEMjVcdUZGMENcdThCRjdcdTY4QzBcdTY3RTVcdTYwQThcdTc2ODRcdTVCQzZcdTk0QTVcdTVFNzZcdTkxQ0RcdThCRDUnLFxuICAnUGxlYXNlIGVudGVyIGFuIEFQSSBLZXkgZmlyc3QnOiAnXHU4QkY3XHU1MTQ4XHU4RjkzXHU1MTY1IEFQSSBcdTVCQzZcdTk0QTUnLFxuICAnQ2hlY2tpbmcuLi4nOiAnXHU2OEMwXHU2N0U1XHU0RTJELi4uJyxcbiAgJ0FQSSBLZXkgYW5kIHRoZSBjdXJyZW50IG1vZGVsIGFyZSBib3RoIGF2YWlsYWJsZSEnOiAnQVBJIFx1NUJDNlx1OTRBNVx1NTQ4Q1x1NUY1M1x1NTI0RFx1NkEyMVx1NTc4Qlx1OTBGRFx1NTNFRlx1NzUyOFx1RkYwMScsXG4gICdBUEkgS2V5IGlzIGludmFsaWQgb3IgdGhlcmUgaXMgYSBzZXJ2ZXIgZXJyb3IuIFBsZWFzZSBjaGVjayBpZiB5b3VyIEFQSSBLZXkgaXMgY29ycmVjdC4nOlxuICAgICdBUEkgXHU1QkM2XHU5NEE1XHU2NUUwXHU2NTQ4XHU2MjE2XHU2NzBEXHU1MkExXHU1NjY4XHU5NTE5XHU4QkVGXHUzMDAyXHU4QkY3XHU2OEMwXHU2N0U1XHU2MEE4XHU3Njg0IEFQSSBcdTVCQzZcdTk0QTVcdTY2MkZcdTU0MjZcdTZCNjNcdTc4NkVcdTMwMDInLFxuXG4gIC8vT3BlbkFJIFx1OEJCRVx1N0Y2RVxuXG4gICdTZWxlY3QgdGhlIE9wZW5BSSBtb2RlbCB0byB1c2UnOiAnXHU5MDA5XHU2MkU5IE9wZW5BSSBcdTZBMjFcdTU3OEInLFxuICAnT3BlbkFJIFNldHRpbmdzJzogJ09wZW5BSSBcdTY3MERcdTUyQTEnLFxuICAnRW50ZXIgeW91ciBPcGVuQUkgQVBJIEtleS4nOiAnXHU4RjkzXHU1MTY1XHU2MEE4XHU3Njg0IE9wZW5BSSBBUEkgXHU1QkM2XHU5NEE1XHUzMDAyJyxcbiAgJ05vIGF2YWlsYWJsZSBtb2RlbHMgZm91bmQuJzogJ1x1NjcyQVx1NjI3RVx1NTIzMFx1NTNFRlx1NzUyOFx1NkEyMVx1NTc4Qlx1MzAwMicsXG4gICdBUEkgS2V5IHZhbGlkYXRlZCBzdWNjZXNzZnVsbHkhJzogJ0FQSSBcdTVCQzZcdTk0QTVcdTlBOENcdThCQzFcdTYyMTBcdTUyOUZcdUZGMDEnLFxuICAnTm8gbW9kZWxzIGF2YWlsYWJsZS4gUGxlYXNlIGNoZWNrIHlvdXIgQVBJIEtleS4nOiAnXHU2Q0ExXHU2NzA5XHU1M0VGXHU3NTI4XHU3Njg0XHU2QTIxXHU1NzhCXHUzMDAyXHU4QkY3XHU2OEMwXHU2N0U1XHU2MEE4XHU3Njg0IEFQSSBcdTVCQzZcdTk0QTVcdTMwMDInLFxuXG4gIC8vQW50aHJvcGljIFx1OEJCRVx1N0Y2RVxuXG4gICdBbnRocm9waWMgU2V0dGluZ3MnOiAnQW50aHJvcGljIFx1NjcwRFx1NTJBMScsXG4gICdFbnRlciB5b3VyIEFudGhyb3BpYyBBUEkgS2V5Lic6ICdcdThGOTNcdTUxNjVcdTYwQThcdTc2ODQgQW50aHJvcGljIEFQSSBcdTVCQzZcdTk0QTVcdTMwMDInLFxuICAnU2VsZWN0IHRoZSBBbnRocm9waWMgbW9kZWwgdG8gdXNlJzogJ1x1OTAwOVx1NjJFOSBBbnRocm9waWMgXHU2QTIxXHU1NzhCJyxcbiAgJ1NlbGVjdCBhIG1vZGVsIG9yIHVzZSBhIGN1c3RvbSBvbmUnOiAnXHU5MDA5XHU2MkU5XHU2QTIxXHU1NzhCXHU2MjE2XHU0RjdGXHU3NTI4XHU4MUVBXHU1QjlBXHU0RTQ5XHU2QTIxXHU1NzhCJyxcbiAgJ01vZGVsIElEIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZXMsIGRvdHMgYW5kIGh5cGhlbnMnOlxuICAgICdcdTZBMjFcdTU3OEIgSUQgXHU1M0VBXHU4MEZEXHU1MzA1XHU1NDJCXHU1QjU3XHU2QkNEXHUzMDAxXHU2NTcwXHU1QjU3XHUzMDAxXHU0RTBCXHU1MjEyXHU3RUJGXHUzMDAxXHU3MEI5XHU1NDhDXHU4RkRFXHU1QjU3XHU3QjI2JyxcblxuICAvL0dlbWluaSBcdThCQkVcdTdGNkVcblxuICAnU2VsZWN0IHRoZSBHZW1pbmkgbW9kZWwgdG8gdXNlJzogJ1x1OTAwOVx1NjJFOSBHZW1pbmkgXHU2QTIxXHU1NzhCJyxcbiAgJ1VuYWJsZSB0byBjcmVhdGUgbW9kZWwgc2VsZWN0aW9uIGRyb3Bkb3duIG1lbnUuJzogJ1x1NjVFMFx1NkNENVx1NTIxQlx1NUVGQVx1NkEyMVx1NTc4Qlx1OTAwOVx1NjJFOVx1NEUwQlx1NjJDOVx1ODNEQ1x1NTM1NVx1MzAwMicsXG4gICdHZW1pbmkgU2V0dGluZ3MnOiAnR2VtaW5pIFx1NjcwRFx1NTJBMScsXG4gICdFbnRlciB5b3VyIEdlbWluaSBBUEkgS2V5JzogJ1x1OEY5M1x1NTE2NVx1NjBBOFx1NzY4NCBHZW1pbmkgQVBJIFx1NUJDNlx1OTRBNScsXG5cbiAgLy9EZWVwc2VlayBcdThCQkVcdTdGNkVcblxuICAnRGVlcHNlZWsgU2V0dGluZ3MnOiAnRGVlcHNlZWsgXHU2NzBEXHU1MkExJyxcbiAgJ0VudGVyIHlvdXIgRGVlcHNlZWsgQVBJIEtleSc6ICdcdThGOTNcdTUxNjVcdTYwQThcdTc2ODQgRGVlcHNlZWsgQVBJIFx1NUJDNlx1OTRBNScsXG5cbiAgLy9PbGxhbWEgXHU4QkJFXHU3RjZFXG5cbiAgJ09sbGFtYSBTZXR0aW5ncyc6ICdPbGxhbWEgXHU2NzBEXHU1MkExJyxcbiAgJ1NlcnZlciBBZGRyZXNzJzogJ1x1NjcwRFx1NTJBMVx1NTY2OFx1NTczMFx1NTc0MCcsXG4gICdPbGxhbWEgc2VydmVyIGFkZHJlc3MgKGRlZmF1bHQ6IGh0dHA6Ly9sb2NhbGhvc3Q6MTE0MzQpJzogJ09sbGFtYSBcdTY3MERcdTUyQTFcdTU2NjhcdTU3MzBcdTU3NDBcdUZGMDhcdTlFRDhcdThCQTRcdUZGMUFodHRwOi8vbG9jYWxob3N0OjExNDM0XHVGRjA5JyxcbiAgQ2hlY2s6ICdcdTlBOENcdThCQzEnLFxuICAnU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBPbGxhbWEgc2VydmljZSc6ICdcdTYyMTBcdTUyOUZcdThGREVcdTYzQTVcdTUyMzAgT2xsYW1hIFx1NjcwRFx1NTJBMScsXG4gICdObyBtb2RlbHMgZm91bmQuIFBsZWFzZSBkb3dubG9hZCBtb2RlbHMgdXNpbmcgb2xsYW1hJzogJ1x1NjcyQVx1NjI3RVx1NTIzMFx1NkEyMVx1NTc4Qlx1MzAwMlx1OEJGN1x1NEY3Rlx1NzUyOCBvbGxhbWEgXHU0RTBCXHU4RjdEXHU2QTIxXHU1NzhCJyxcbiAgJ0NvdWxkIG5vdCBjb25uZWN0IHRvIE9sbGFtYSBzZXJ2aWNlJzogJ1x1NjVFMFx1NkNENVx1OEZERVx1NjNBNVx1NTIzMCBPbGxhbWEgXHU2NzBEXHU1MkExJyxcbiAgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIE9sbGFtYSBzZXJ2aWNlLiBQbGVhc2UgY2hlY2sgdGhlIHNlcnZlciBhZGRyZXNzLic6ICdcdTY1RTBcdTZDRDVcdThGREVcdTYzQTVcdTUyMzAgT2xsYW1hIFx1NjcwRFx1NTJBMVx1RkYwQ1x1OEJGN1x1NjhDMFx1NjdFNVx1NjcwRFx1NTJBMVx1NTY2OFx1NTczMFx1NTc0MFx1MzAwMicsXG4gICdDdXJyZW50bHkgc2VsZWN0ZWQgbW9kZWwgKFRlc3QgY29ubmVjdGlvbiB0byBzZWUgYWxsIGF2YWlsYWJsZSBtb2RlbHMpJzogJ1x1NUY1M1x1NTI0RFx1OTAwOVx1NjJFOVx1NzY4NFx1NkEyMVx1NTc4Qlx1RkYwOFx1NkQ0Qlx1OEJENVx1OEZERVx1NjNBNVx1NEVFNVx1NjdFNVx1NzcwQlx1NTNFRlx1NzUyOFx1NkEyMVx1NTc4Qlx1RkYwOScsXG4gICdTZWxlY3QgYSBtb2RlbCB0byB1c2UnOiAnXHU5MDA5XHU2MkU5XHU0RTAwXHU0RTJBXHU2QTIxXHU1NzhCJyxcbiAgJ05vIG1vZGVscyBhdmFpbGFibGUuIFBsZWFzZSBsb2FkIGFuIGF2YWlsYWJsZSBtb2RlbCBmaXJzdC4nOiAnXHU2NUUwXHU1M0VGXHU3NTI4XHU2QTIxXHU1NzhCXHVGRjBDXHU4QkY3XHU1MTQ4XHU1MkEwXHU4RjdEXHU1M0VGXHU3NTI4XHU2QTIxXHU1NzhCXHUzMDAyJyxcbiAgJ05vIG1vZGVscyBhdmFpbGFibGUnOiAnXHU2NUUwXHU1M0VGXHU3NTI4XHU2QTIxXHU1NzhCJyxcblxuICAvL1Byb21wdCBcdThCQkVcdTdGNkVcblxuICAnUHJvbXB0IHNldHRpbmdzJzogJ1x1ODFFQVx1NUI5QVx1NEU0OSBQcm9tcHQnLFxuICAnQWRkIFByb21wdCc6ICdcdTZERkJcdTUyQTAgUHJvbXB0JyxcbiAgJ0lucHV0IFByb21wdCBOYW1lJzogJ1x1OEY5M1x1NTE2NSBQcm9tcHQgXHU1NDBEXHU3OUYwJyxcbiAgJ0lucHV0IFByb21wdCBDb250ZW50XFxuQXZhaWxhYmxlIHBhcmFtZXRlcnM6XFxue3toaWdobGlnaHR9fSAtIEN1cnJlbnQgaGlnaGxpZ2h0ZWQgdGV4dFxcbnt7Y29tbWVudH19IC0gRXhpc3RpbmcgY29tbWVudCc6XG4gICAgJ1x1OEY5M1x1NTE2NSBQcm9tcHQgXHU1MTg1XHU1QkI5XFxuXHU1M0VGXHU3NTI4XHU1M0MyXHU2NTcwOlxcbnt7aGlnaGxpZ2h0fX0gLSBcdTVGNTNcdTUyNERcdTlBRDhcdTRFQUVcdTY1ODdcdTY3MkNcXG57e2NvbW1lbnR9fSAtIFx1NURGMlx1NUI1OFx1NTcyOFx1NzY4NFx1NkNFOFx1OTFDQScsXG4gICdQcm9tcHQgYWRkZWQnOiAnUHJvbXB0IFx1NURGMlx1NkRGQlx1NTJBMCcsXG4gICdQcm9tcHQgdXBkYXRlZCc6ICdQcm9tcHQgXHU1REYyXHU2NkY0XHU2NUIwJyxcblxuICAvL0NvbW1lbnRJbnB1dFxuXG4gICdTaGlmdCArIEVudGVyIFdyYXAsIEVudGVyIFNhdmUnOiAnU2hpZnQgKyBFbnRlciBcdTYzNjJcdTg4NENcdUZGMENFbnRlciBcdTRGRERcdTVCNTgnLFxuICAnRGVsZXRlIGNvbW1lbnQnOiAnXHU1MjIwXHU5NjY0XHU4QkM0XHU4QkJBJyxcblxuICAvL0FjdGlvbkJ1dHRvbnNcblxuICAnQWRkIENvbW1lbnQnOiAnXHU2REZCXHU1MkEwXHU4QkM0XHU4QkJBJyxcbiAgJ0V4cG9ydCBhcyBJbWFnZSc6ICdcdTVCRkNcdTUxRkFcdTRFM0FcdTU2RkVcdTcyNDcnLFxuXG4gIC8vQUlCdXR0b25cblxuICAnU2VsZWN0IFByb21wdCc6ICdcdTkwMDlcdTYyRTkgUHJvbXB0JyxcbiAgJ1BsZWFzZSBhZGQgUHJvbXB0IGluIHRoZSBzZXR0aW5ncyBmaXJzdCc6ICdcdThCRjdcdTUxNDhcdTU3MjhcdThCQkVcdTdGNkVcdTRFMkRcdTZERkJcdTUyQTAgUHJvbXB0JyxcbiAgJ0FJIGNvbW1lbnRzIGhhdmUgYmVlbiBhZGRlZCc6ICdBSSBcdThCQzRcdThCQkFcdTVERjJcdTZERkJcdTUyQTAnLFxuICAnQUkgY29tbWVudHMgZmFpbGVkOic6ICdBSSBcdThCQzRcdThCQkFcdTU5MzFcdThEMjVcdUZGMUEnLFxuXG4gIC8vQ2hhdFZpZXdcblxuICBDaGF0OiAnXHU1QkY5XHU4QkREJyxcbiAgJ0ZhaWxlZCB0byBwcm9jZXNzIGRyb3BwZWQgaGlnaGxpZ2h0Oic6ICdcdTY1RTBcdTZDRDVcdTU5MDRcdTc0MDZcdTUyMjBcdTk2NjRcdTc2ODRcdTlBRDhcdTRFQUVcdUZGMUEnLFxuICAnaGlnaGxpZ2h0ZWQgbm90ZXMnOiAnIFx1Njc2MVx1OUFEOFx1NEVBRVx1N0IxNFx1OEJCMCcsXG4gICdJbnB1dCBtZXNzYWdlLi4uJzogJ1x1OEY5M1x1NTE2NVx1NkQ4OFx1NjA2Ri4uLicsXG4gICdVbmFibGUgdG8gYWNjZXNzIHRoZSBPbGxhbWEgbW9kZWwsIHBsZWFzZSBjaGVjayB0aGUgc2VydmljZS4nOiAnXHU2NUUwXHU2Q0Q1XHU4QkJGXHU5NUVFIE9sbGFtYSBcdTZBMjFcdTU3OEJcdUZGMENcdThCRjdcdTY4QzBcdTY3RTVcdTY3MERcdTUyQTFcdTY2MkZcdTU0MjZcdTZCNjNcdTVFMzhcdThGRDBcdTg4NEMnLFxuICAnVW5hYmxlIHRvIGdldCBHZW1pbmkgbW9kZWwgbGlzdCwgcGxlYXNlIGNoZWNrIEFQSSBLZXkgYW5kIG5ldHdvcmsgY29ubmVjdGlvbi4nOlxuICAgICdcdTY1RTBcdTZDRDVcdTgzQjdcdTUzRDYgR2VtaW5pIFx1NkEyMVx1NTc4Qlx1NTIxN1x1ODg2OFx1RkYwQ1x1OEJGN1x1NjhDMFx1NjdFNSBBUEkgS2V5IFx1NTQ4Q1x1N0Y1MVx1N0VEQ1x1OEZERVx1NjNBNScsXG5cbiAgLy9FeHBvcnRNb2RhbFxuXG4gIERvd25sb2FkOiAnXHU0RTBCXHU4RjdEJyxcbiAgJ0V4cG9ydCBzdWNjZXNzZnVsISc6ICdcdTVCRkNcdTUxRkFcdTYyMTBcdTUyOUZcdUZGMDEnLFxuICAnRXhwb3J0IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2Fpbi4nOiAnXHU1QkZDXHU1MUZBXHU1OTMxXHU4RDI1XHVGRjBDXHU4QkY3XHU5MUNEXHU4QkQ1JyxcblxuICAvL0NvbW1lbnRWaWV3XG5cbiAgJ0xvYWRpbmcuLi4nOiAnXHU1MkEwXHU4RjdEXHU0RTJELi4uJyxcbiAgJ1NlYXJjaC4uLic6ICdcdTY0MUNcdTdEMjJcdTlBRDhcdTRFQUVcdTYyMTZcdThCQzRcdThCQkEuLi4nLFxuICAnTm8gbWF0Y2hpbmcgY29udGVudCBmb3VuZC4nOiAnXHU2NzJBXHU2MjdFXHU1MjMwXHU1MzM5XHU5MTREXHU3Njg0XHU1MTg1XHU1QkI5XHUzMDAyJyxcbiAgJ1RoZSBjdXJyZW50IGRvY3VtZW50IGhhcyBubyBoaWdobGlnaHRlZCBjb250ZW50Lic6ICdcdTVGNTNcdTUyNERcdTY1ODdcdTY4NjNcdTZDQTFcdTY3MDlcdTlBRDhcdTRFQUVcdTUxODVcdTVCQjlcdTMwMDInLFxuICAnTm8gY29ycmVzcG9uZGluZyBmaWxlIGZvdW5kLic6ICdcdTY3MkFcdTYyN0VcdTUyMzBcdTc2RjhcdTVFOTRcdTc2ODRcdTY1ODdcdTRFRjZcdTMwMDInLFxuICAnRXhwb3J0IGZhaWxlZDogRmFpbGVkIHRvIGxvYWQgbmVjZXNzYXJ5IGNvbXBvbmVudHMuJzogJ1x1NUJGQ1x1NTFGQVx1NTkzMVx1OEQyNVx1RkYxQVx1NTJBMFx1OEY3RFx1NUZDNVx1ODk4MVx1N0VDNFx1NEVGNlx1NTkzMVx1OEQyNVx1MzAwMicsXG4gICdBbGwgSGlnaGxpZ2h0JzogJ1x1NTE2OFx1OTBFOFx1OUFEOFx1NEVBRScsXG4gICdFeHBvcnQgYXMgbm90ZXMnOiAnXHU1QkZDXHU1MUZBXHU0RTNBXHU3QjE0XHU4QkIwJyxcbiAgJ0FkZCBGaWxlIENvbW1lbnQnOiAnXHU2REZCXHU1MkEwXHU2NTg3XHU0RUY2XHU4QkM0XHU4QkJBJyxcbiAgJ0ZpbGUgQ29tbWVudCc6ICdcdTY1ODdcdTRFRjZcdThCQzRcdThCQkEnLFxuICAnU3VjY2Vzc2Z1bGx5IGV4cG9ydGVkIGhpZ2hsaWdodHMgdG86ICc6ICdcdTYyMTBcdTUyOUZcdTVCRkNcdTUxRkFcdTlBRDhcdTRFQUVcdTUyMzBcdUZGMUEnLFxuICAnRmFpbGVkIHRvIGV4cG9ydCBoaWdobGlnaHRzOiAnOiAnXHU2NUUwXHU2Q0Q1XHU1QkZDXHU1MUZBXHU5QUQ4XHU0RUFFXHVGRjFBJyxcblxuICAvL2luZGV4XG5cbiAgJ0RlZmF1bHQgVGVtcGxhdGUnOiAnXHU5RUQ4XHU4QkE0XHU2QTIxXHU2NzdGJyxcbiAgJ01vZGVybiBtaW5pbWFsaXN0IGtub3dsZWRnZSBjYXJkIHN0eWxlJzogJ1x1NzNCMFx1NEVFM1x1Njc4MVx1N0I4MFx1NzdFNVx1OEJDNlx1NTM2MVx1NzI0N1x1OThDRVx1NjgzQycsXG4gICdBY2FkZW1pYyBUZW1wbGF0ZSc6ICdcdTVCNjZcdTY3MkZcdTZBMjFcdTY3N0YnLFxuICAnRm9ybWFsIHN0eWxlIHN1aXRhYmxlIGZvciBhY2FkZW1pYyBjaXRhdGlvbnMnOiAnXHU5MDAyXHU3NTI4XHU0RThFXHU1QjY2XHU2NzJGXHU1RjE1XHU3NTI4XHU3Njg0XHU2QjYzXHU1RjBGXHU5OENFXHU2ODNDJyxcbiAgJ1NvY2lhbCBUZW1wbGF0ZSc6ICdcdTc5M0VcdTRFQTRcdTZBMjFcdTY3N0YnLFxuICAnTW9kZXJuIHN0eWxlIHN1aXRhYmxlIGZvciBzb2NpYWwgbWVkaWEgc2hhcmluZyc6ICdcdTkwMDJcdTc1MjhcdTRFOEVcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTNcdTUyMDZcdTRFQUJcdTc2ODRcdTczQjBcdTRFRTNcdTk4Q0VcdTY4M0MnLFxuXG4gIC8vbWFpblxuXG4gICdPcGVuIEFJIGNoYXQgd2luZG93JzogJ1x1NjI1M1x1NUYwMCBBSSBcdTVCRjlcdThCRERcdTdBOTdcdTUzRTMnLFxuICAnT3BlbiBIaU5vdGUgd2luZG93JzogJ1x1NjI1M1x1NUYwMCBIaU5vdGUgXHU3QTk3XHU1M0UzJyxcblxuICAvLyBTZXR0aW5nc1xuICAnR2VuZXJhbCBTZXR0aW5ncyc6ICdcdTkwMUFcdTc1MjhcdThCQkVcdTdGNkUnLFxuICAnRXhwb3J0IFBhdGgnOiAnXHU1QkZDXHU1MUZBXHU4REVGXHU1Rjg0JyxcbiAgJ1NldCB0aGUgcGF0aCBmb3IgZXhwb3J0ZWQgaGlnaGxpZ2h0IG5vdGVzLiBMZWF2ZSBlbXB0eSB0byB1c2UgdmF1bHQgcm9vdC4gVGhlIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHlvdXIgdmF1bHQgcm9vdC4nOlxuICAgICdcdThCQkVcdTdGNkVcdTlBRDhcdTRFQUVcdTdCMTRcdThCQjBcdTc2ODRcdTVCRkNcdTUxRkFcdThERUZcdTVGODRcdTMwMDJcdTc1NTlcdTdBN0FcdTUyMTlcdTRGN0ZcdTc1MjggdmF1bHQgXHU2ODM5XHU3NkVFXHU1RjU1XHUzMDAyXHU4REVGXHU1Rjg0XHU1RTk0XHU3NkY4XHU1QkY5XHU0RThFIHZhdWx0IFx1NjgzOVx1NzZFRVx1NUY1NVx1MzAwMicsXG4gIEV4Y2x1c2lvbnM6ICdcdTYzOTJcdTk2NjQnLFxuICAnQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aHMsIHRhZ3MsIG5vdGUgdGl0bGVzIG9yIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IHdpbGwgYmUgZXhjbHVkZWQgZnJvbSBoaWdobGlnaHRpbmcuIGUuZy4gZm9sZGVyMSwgZm9sZGVyMS9mb2xkZXIyLCBbW25vdGUxXV0sIFtbbm90ZTJdXSwgKi5leGNhbGlkcmF3Lm1kJzpcbiAgICAnXHU5MDE3XHU1M0Y3XHU1MjA2XHU5Njk0XHU3Njg0XHU4REVGXHU1Rjg0XHVGRjBDXHU2ODA3XHU3QjdFXHVGRjBDXHU3QjE0XHU4QkIwXHU2ODA3XHU5ODk4XHU2MjE2XHU2NTg3XHU0RUY2XHU2MjY5XHU1QzU1XHU1NDBEXHVGRjBDXHU1QzA2XHU0RUNFXHU5QUQ4XHU0RUFFXHU0RTJEXHU2MzkyXHU5NjY0XHUzMDAyXHU0RjhCXHU1OTgyXHVGRjFBZm9sZGVyMSwgZm9sZGVyMS9mb2xkZXIyLCBbW25vdGUxXV0sIFtbbm90ZTJdXSwgKi5leGNhbGlkcmF3Lm1kJyxcbiAgJ0N1c3RvbSB0ZXh0IGV4dHJhY3Rpb24nOiAnXHU4MUVBXHU1QjlBXHU0RTQ5XHU2NTg3XHU2NzJDXHU2M0QwXHU1M0Q2JyxcbiAgJ1VzZSBDdXN0b20gUGF0dGVybic6ICdcdTRGN0ZcdTc1MjhcdTgxRUFcdTVCOUFcdTRFNDlcdTZBMjFcdTVGMEYnLFxuICAnRW5hYmxlIHRvIHVzZSBhIGN1c3RvbSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGV4dHJhY3RpbmcgdGV4dC4nOiAnXHU1NDJGXHU3NTI4XHU4MUVBXHU1QjlBXHU0RTQ5XHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXHU0RUU1XHU2M0QwXHU1M0Q2XHU2NTg3XHU2NzJDXHUzMDAyJyxcbiAgJ0N1c3RvbSBQYXR0ZXJuJzogJ1x1ODFFQVx1NUI5QVx1NEU0OVx1NkEyMVx1NUYwRicsXG4gICdFbnRlciBhIGN1c3RvbSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGV4dHJhY3RpbmcgdGV4dC4gVXNlIGNhcHR1cmUgZ3JvdXBzICgpIHRvIHNwZWNpZnkgdGhlIHRleHQgdG8gZXh0cmFjdC4gVGhlIGZpcnN0IG5vbi1lbXB0eSBjYXB0dXJlIGdyb3VwIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXh0cmFjdGVkIHRleHQuJzpcbiAgICAnXHU4RjkzXHU1MTY1XHU4MUVBXHU1QjlBXHU0RTQ5XHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXHU0RUU1XHU2M0QwXHU1M0Q2XHU2NTg3XHU2NzJDXHUzMDAyXHU0RjdGXHU3NTI4XHU2MzU1XHU4M0I3XHU3RUM0ICgpIFx1NjMwN1x1NUI5QVx1ODk4MVx1NjNEMFx1NTNENlx1NzY4NFx1NjU4N1x1NjcyQ1x1MzAwMlx1N0IyQ1x1NEUwMFx1NEUyQVx1OTc1RVx1N0E3QVx1NjM1NVx1ODNCN1x1N0VDNFx1NUMwNlx1NzUyOFx1NEY1Q1x1NjNEMFx1NTNENlx1NzY4NFx1NjU4N1x1NjcyQ1x1MzAwMicsXG4gICdEZWZhdWx0IENvbG9yJzogJ1x1OUVEOFx1OEJBNFx1OTg5Q1x1ODI3MicsXG4gICdTZXQgdGhlIGRlZmF1bHQgY29sb3IgZm9yIGRlY29yYXRvcnMgd2hlbiBubyBjb2xvciBpcyBzcGVjaWZpZWQuIExlYXZlIGVtcHR5IHRvIHVzZSBzeXN0ZW0gZGVmYXVsdC4nOlxuICAgICdcdThCQkVcdTdGNkVcdTVGNTNcdTY3MkFcdTYzMDdcdTVCOUFcdTk4OUNcdTgyNzJcdTY1RjZcdTc2ODRcdTg4QzVcdTk5NzBcdTU2NjhcdTc2ODRcdTlFRDhcdThCQTRcdTk4OUNcdTgyNzJcdTMwMDJcdTc1NTlcdTdBN0FcdTRFRTVcdTRGN0ZcdTc1MjhcdTdDRkJcdTdFREZcdTlFRDhcdThCQTRcdTk4OUNcdTgyNzJcdTMwMDInLFxuICAnRXhwb3J0IHRlbXBsYXRlJzogJ1x1NUJGQ1x1NTFGQVx1NkEyMVx1Njc3RicsXG4gICdDbGVhbiBvcnBoYW5lZCBkYXRhJzogJ1x1NkUwNVx1NzQwNlx1NUI2NFx1N0FDQlx1NjU3MFx1NjM2RScsXG4gICdSZW1vdmUgaGlnaGxpZ2h0cyBhbmQgY29tbWVudHMgdGhhdCBubyBsb25nZXIgZXhpc3QgaW4geW91ciBkb2N1bWVudHMuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGRlbGV0ZWQgaGlnaGxpZ2h0cyBidXQgdGhlaXIgY29tbWVudHMgYXJlIHN0aWxsIHN0b3JlZCBpbiB0aGUgZGF0YSBmaWxlLic6XG4gICAgJ1x1NTIyMFx1OTY2NFx1NEUwRFx1NTE4RFx1NUI1OFx1NTcyOFx1NEU4RVx1NjBBOFx1NzY4NFx1NjU4N1x1Njg2M1x1NEUyRFx1NzY4NFx1OUFEOFx1NEVBRVx1NTQ4Q1x1NkNFOFx1OTFDQVx1MzAwMlx1OEZEOVx1NTcyOFx1NjBBOFx1NTIyMFx1OTY2NFx1OUFEOFx1NEVBRVx1NEY0Nlx1NkNFOFx1OTFDQVx1NEVDRFx1NzEzNlx1NUI1OFx1NTBBOFx1NTcyOFx1NjU3MFx1NjM2RVx1NjU4N1x1NEVGNlx1NEUyRFx1NjVGNlx1NUY4OFx1NjcwOVx1NzUyOFx1MzAwMicsXG5cbiAgLy8gRmxhc2hjYXJkIFNldHRpbmdzXG4gICdGbGFzaGNhcmQgbGVhcm5pbmcnOiAnXHU5NUVBXHU1MzYxXHU1QjY2XHU0RTYwXHU4QkJFXHU3RjZFJyxcbiAgJ05ldyBjYXJkcyBwZXIgZGF5JzogJ1x1NkJDRlx1NjVFNVx1NjVCMFx1NTM2MVx1NzI0N1x1NjU3MFx1OTFDRicsXG4gICdNYXhpbXVtIG51bWJlciBvZiBuZXcgY2FyZHMgdG8gbGVhcm4gZWFjaCBkYXknOiAnXHU2QkNGXHU1OTI5XHU1QjY2XHU0RTYwXHU3Njg0XHU2NUIwXHU1MzYxXHU3MjQ3XHU2NzAwXHU1OTI3XHU2NTcwXHU5MUNGJyxcbiAgJ1Jldmlld3MgcGVyIGRheSc6ICdcdTZCQ0ZcdTY1RTVcdTU5MERcdTRFNjBcdTY1NzBcdTkxQ0YnLFxuICAnTWF4aW11bSBudW1iZXIgb2YgY2FyZHMgdG8gcmV2aWV3IGVhY2ggZGF5JzogJ1x1NkJDRlx1NTkyOVx1NTkwRFx1NEU2MFx1NzY4NFx1NTM2MVx1NzI0N1x1NjcwMFx1NTkyN1x1NjU3MFx1OTFDRicsXG4gICdUYXJnZXQgcmV0ZW50aW9uJzogJ1x1NzZFRVx1NjgwN1x1OEJCMFx1NUZDNlx1NEZERFx1NjMwMVx1NzM4NycsXG4gICdUYXJnZXQgbWVtb3J5IHJldGVudGlvbiByYXRlICgwLjggPSA4MCUpJzogJ1x1NzZFRVx1NjgwN1x1OEJCMFx1NUZDNlx1NEZERFx1NjMwMVx1NzM4N1x1RkYwODAuOCA9IDgwJVx1RkYwOScsXG4gICdNYXhpbXVtIGludGVydmFsJzogJ1x1NjcwMFx1NTkyN1x1OTVGNFx1OTY5NCcsXG4gICdNYXhpbXVtIGludGVydmFsIGluIGRheXMgYmV0d2VlbiByZXZpZXdzJzogJ1x1NTkwRFx1NEU2MFx1NEU0Qlx1OTVGNFx1NzY4NFx1NjcwMFx1NTkyN1x1OTVGNFx1OTY5NFx1NTkyOVx1NjU3MCcsXG4gICdSZXNldCBkYWlseSBzdGF0cyc6ICdcdTkxQ0RcdTdGNkVcdTRFQ0FcdTY1RTVcdTdFREZcdThCQTEnLFxuICBcIlJlc2V0IHRvZGF5J3MgbGVhcm5pbmcgc3RhdGlzdGljc1wiOiAnXHU5MUNEXHU3RjZFXHU0RUNBXHU1OTI5XHU3Njg0XHU1QjY2XHU0RTYwXHU3RURGXHU4QkExXHU2NTcwXHU2MzZFJyxcbiAgUmVzZXQ6ICdcdTkxQ0RcdTdGNkUnLFxuICAnRGFpbHkgc3RhdGlzdGljcyBoYXZlIGJlZW4gcmVzZXQnOiAnXHU0RUNBXHU2NUU1XHU3RURGXHU4QkExXHU1REYyXHU5MUNEXHU3RjZFJyxcbiAgJ05vIHN0YXRpc3RpY3MgdG8gcmVzZXQgZm9yIHRvZGF5JzogJ1x1NEVDQVx1NTkyOVx1NkNBMVx1NjcwOVx1NTNFRlx1OTFDRFx1N0Y2RVx1NzY4NFx1N0VERlx1OEJBMVx1NjU3MFx1NjM2RScsXG4gIEFkdmFuY2VkOiAnXHU5QUQ4XHU3RUE3XHU4QkJFXHU3RjZFJyxcbiAgJ1RoZXNlIHNldHRpbmdzIGNvbnRyb2wgdGhlIEZTUlMgYWxnb3JpdGhtIHBhcmFtZXRlcnMuIE9ubHkgY2hhbmdlIHRoZW0gaWYgeW91IHVuZGVyc3RhbmQgdGhlIGFsZ29yaXRobS4nOlxuICAgICdcdThGRDlcdTRFOUJcdThCQkVcdTdGNkVcdTYzQTdcdTUyMzZGU1JTXHU3Qjk3XHU2Q0Q1XHU1M0MyXHU2NTcwXHUzMDAyXHU0RUM1XHU1NzI4XHU3NDA2XHU4OUUzXHU3Qjk3XHU2Q0Q1XHU3Njg0XHU2MEM1XHU1MUI1XHU0RTBCXHU2NkY0XHU2NTM5XHU1QjgzXHU0RUVDXHUzMDAyJyxcbiAgJ1Jlc2V0IGFsZ29yaXRobSBwYXJhbWV0ZXJzJzogJ1x1OTFDRFx1N0Y2RVx1N0I5N1x1NkNENVx1NTNDMlx1NjU3MCcsXG4gICdSZXNldCB0aGUgRlNSUyBhbGdvcml0aG0gcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcyc6ICdcdTVDMDZGU1JTXHU3Qjk3XHU2Q0Q1XHU1M0MyXHU2NTcwXHU5MUNEXHU3RjZFXHU0RTNBXHU5RUQ4XHU4QkE0XHU1MDNDJyxcbiAgJ1Jlc2V0IHRvIERlZmF1bHQnOiAnXHU5MUNEXHU3RjZFXHU0RTNBXHU5RUQ4XHU4QkE0XHU1MDNDJyxcbiAgJ0ZTUlMgcGFyYW1ldGVycyBoYXZlIGJlZW4gcmVzZXQgdG8gZGVmYXVsdCB2YWx1ZXMnOiAnRlNSU1x1NTNDMlx1NjU3MFx1NURGMlx1OTFDRFx1N0Y2RVx1NEUzQVx1OUVEOFx1OEJBNFx1NTAzQycsXG4gIGRheXM6ICdcdTU5MjknLFxuXG4gIC8vIEZsYXNoY2FyZCBVSVxuICAnQWN0aXZhdGUgSGlDYXJkJzogJ1x1NkZDMFx1NkQzQiBIaUNhcmQnLFxuICAnRW50ZXIgeW91ciBsaWNlbnNlIGtleSB0byBhY3RpdmF0ZSBIaUNhcmQgZmVhdHVyZS4nOiAnXHU4RjkzXHU1MTY1XHU2MEE4XHU3Njg0XHU4QkI4XHU1M0VGXHU4QkMxXHU1QkM2XHU5NEE1XHU0RUU1XHU2RkMwXHU2RDNCIEhpQ2FyZCBcdTUyOUZcdTgwRkRcdTMwMDInLFxuICAnRW50ZXIgbGljZW5zZSBrZXknOiAnXHU4RjkzXHU1MTY1XHU4QkI4XHU1M0VGXHU4QkMxXHU1QkM2XHU5NEE1JyxcbiAgQWN0aXZhdGU6ICdcdTZGQzBcdTZEM0InLFxuICAnUGxlYXNlIGVudGVyIGEgbGljZW5zZSBrZXknOiAnXHU4QkY3XHU4RjkzXHU1MTY1XHU4QkI4XHU1M0VGXHU4QkMxXHU1QkM2XHU5NEE1JyxcbiAgJ0hpQ2FyZCBhY3RpdmF0ZWQgc3VjY2Vzc2Z1bGx5ISc6ICdIaUNhcmQgXHU2RkMwXHU2RDNCXHU2MjEwXHU1MjlGXHVGRjAxJyxcbiAgJ0ludmFsaWQgbGljZW5zZSBrZXknOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU4QkI4XHU1M0VGXHU4QkMxXHU1QkM2XHU5NEE1JyxcbiAgJ1VzZSBnbG9iYWwgc2V0dGluZ3MnOiAnXHU0RjdGXHU3NTI4XHU1MTY4XHU1QzQwXHU4QkJFXHU3RjZFJyxcbiAgJ05ldyBjYXJkcyBwZXIgZGF5Oic6ICdcdTZCQ0ZcdTY1RTVcdTY1QjBcdTUzNjFcdTY1NzBcdTkxQ0Y6JyxcbiAgJ1Jldmlld3MgcGVyIGRheTonOiAnXHU2QkNGXHU2NUU1XHU1OTBEXHU0RTYwXHU2NTcwXHU5MUNGOicsXG4gICdBbGwgQ2FyZHMnOiAnXHU1MTY4XHU5MEU4XHU1MzYxXHU3MjQ3JyxcbiAgJ0R1ZSBUb2RheSc6ICdcdTRFQ0FcdTY1RTVcdTUyMzBcdTY3MUYnLFxuICAnTmV3IENhcmRzJzogJ1x1NjVCMFx1NTM2MVx1NzI0NycsXG4gIExlYXJuZWQ6ICdcdTVERjJcdTVCNjZcdTRFNjAnLFxuICAnQ3JlYXRlIEdyb3VwJzogJ1x1NTIxQlx1NUVGQVx1NTIwNlx1N0VDNCcsXG4gICdHcm91cCBuYW1lJzogJ1x1NTIwNlx1N0VDNFx1NTQwRFx1NzlGMCcsXG4gIENyZWF0ZTogJ1x1NTIxQlx1NUVGQScsXG4gIEFnYWluOiAnXHU5MUNEXHU2NzY1JyxcbiAgSGFyZDogJ1x1NTZGMFx1OTZCRScsXG4gIEdvb2Q6ICdcdTgyNkZcdTU5N0QnLFxuICBFYXN5OiAnXHU3QjgwXHU1MzU1JyxcbiAgQ2FyZDogJ1x1NTM2MVx1NzI0NycsXG4gIG9mOiAnXHU1MTcxJyxcbiAgU2V0dGluZ3M6ICdcdThCQkVcdTdGNkUnLFxuICAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGdyb3VwPyc6ICdcdTc4NkVcdTVCOUFcdTg5ODFcdTUyMjBcdTk2NjRcdTZCNjRcdTUyMDZcdTdFQzRcdTU0MTdcdUZGMUYnLFxuICBZZXM6ICdcdTY2MkYnLFxuICBObzogJ1x1NTQyNicsXG4gIFwiWW91J3ZlIGNvbXBsZXRlZCBhbGwgY2FyZHMgZm9yIHRvZGF5IVwiOiAnXHU2MEE4XHU0RUNBXHU1OTI5XHU1REYyXHU1QjhDXHU2MjEwXHU2MjQwXHU2NzA5XHU1MzYxXHU3MjQ3XHVGRjAxJyxcbiAgJ05vIGNhcmRzIGF2YWlsYWJsZS4nOiAnXHU2Q0ExXHU2NzA5XHU1M0VGXHU3NTI4XHU3Njg0XHU1MzYxXHU3MjQ3XHUzMDAyJyxcbiAgJ1JldHVybiB0byBGaXJzdCBDYXJkJzogJ1x1OEZENFx1NTZERVx1N0IyQ1x1NEUwMFx1NUYyMFx1NTM2MVx1NzI0NycsXG4gICdFZGl0IEdyb3VwJzogJ1x1N0YxNlx1OEY5MVx1NTIwNlx1N0VDNCcsXG4gICdDcmVhdGUgTmV3IEdyb3VwJzogJ1x1NTIxQlx1NUVGQVx1NjVCMFx1NTIwNlx1N0VDNCcsXG4gICdHcm91cCBOYW1lJzogJ1x1NTIwNlx1N0VDNFx1NTQwRFx1NzlGMCcsXG4gICdQbGVhc2UgZmlsbCBpbiBhbGwgZmllbGRzJzogJ1x1OEJGN1x1NTg2Qlx1NTE5OVx1NjI0MFx1NjcwOVx1NUI1N1x1NkJCNScsXG4gICdTYXZpbmcuLi4nOiAnXHU0RkREXHU1QjU4XHU0RTJELi4uJyxcbiAgJ0NyZWF0aW5nLi4uJzogJ1x1NTIxQlx1NUVGQVx1NEUyRC4uLicsXG4gICdHcm91cCB1cGRhdGVkIHN1Y2Nlc3NmdWxseSc6ICdcdTUyMDZcdTdFQzRcdTY2RjRcdTY1QjBcdTYyMTBcdTUyOUYnLFxuICAnRmFpbGVkIHRvIHVwZGF0ZSBncm91cCc6ICdcdTUyMDZcdTdFQzRcdTY2RjRcdTY1QjBcdTU5MzFcdThEMjUnLFxuICAnR3JvdXAgY3JlYXRlZCBzdWNjZXNzZnVsbHknOiAnXHU1MjA2XHU3RUM0XHU1MjFCXHU1RUZBXHU2MjEwXHU1MjlGJyxcbiAgJ0ZhaWxlZCB0byBjcmVhdGUgb3IgdXBkYXRlIGdyb3VwJzogJ1x1NTIxQlx1NUVGQVx1NjIxNlx1NjZGNFx1NjVCMFx1NTIwNlx1N0VDNFx1NTkzMVx1OEQyNScsXG4gIER1ZTogJ1x1NTIzMFx1NjcxRicsXG4gIE5ldzogJ1x1NjVCMFx1NzY4NCcsXG4gIFJldmlldzogJ1x1NTkwRFx1NEU2MCcsXG4gIFJldGVudGlvbjogJ1x1NEZERFx1NzU1OVx1NzM4NycsXG4gICdMaW1pdHM6JzogJ1x1OTY1MFx1NTIzNlx1RkYxQScsXG4gICdcdTZCQ0ZcdTY1RTVcdTVCNjZcdTRFNjBcdTk2NTBcdTUyMzZcXG4nOiAnXHU2QkNGXHU2NUU1XHU1QjY2XHU0RTYwXHU5NjUwXHU1MjM2XFxuJyxcbiAgJ1x1NjVCMFx1NTM2MVx1NzI0NzonOiAnXHU2NUIwXHU1MzYxXHU3MjQ3OicsXG4gICdcdTU5MERcdTRFNjBcdTUzNjFcdTcyNDc6JzogJ1x1NTkwRFx1NEU2MFx1NTM2MVx1NzI0NzonLFxuICAnXHU1QjY2XHU0RTYwXHU1QjhDXHU2MjEwXHVGRjAxJzogJ1x1NUI2Nlx1NEU2MFx1NUI4Q1x1NjIxMFx1RkYwMScsXG4gIFx1OEZENFx1NTZERVx1N0IyQ1x1NEUwMFx1NUYyMFx1NTM2MVx1NzI0NzogJ1x1OEZENFx1NTZERVx1N0IyQ1x1NEUwMFx1NUYyMFx1NTM2MVx1NzI0NycsXG4gICdcdTYwQThcdTRFQ0FcdTU5MjlcdTc2ODRcdTY1QjBcdTUzNjFcdTcyNDdcdTVCNjZcdTRFNjBcdTkxNERcdTk4OURcdTVERjJcdTc1MjhcdTVCOENcdUZGMDFcdTY2MEVcdTU5MjlcdTUxOERcdTY3NjVcdTVCNjZcdTRFNjBcdTU0MjdcdTMwMDInOiAnXHU2MEE4XHU0RUNBXHU1OTI5XHU3Njg0XHU2NUIwXHU1MzYxXHU3MjQ3XHU1QjY2XHU0RTYwXHU5MTREXHU5ODlEXHU1REYyXHU3NTI4XHU1QjhDXHVGRjAxXHU2NjBFXHU1OTI5XHU1MThEXHU2NzY1XHU1QjY2XHU0RTYwXHU1NDI3XHUzMDAyJyxcbiAgJ1x1NjBBOFx1NEVDQVx1NTkyOVx1NzY4NFx1NTkwRFx1NEU2MFx1OTE0RFx1OTg5RFx1NURGMlx1NzUyOFx1NUI4Q1x1RkYwMVx1NjYwRVx1NTkyOVx1NTE4RFx1Njc2NVx1NTkwRFx1NEU2MFx1NTQyN1x1MzAwMic6ICdcdTYwQThcdTRFQ0FcdTU5MjlcdTc2ODRcdTU5MERcdTRFNjBcdTkxNERcdTk4OURcdTVERjJcdTc1MjhcdTVCOENcdUZGMDFcdTY2MEVcdTU5MjlcdTUxOERcdTY3NjVcdTU5MERcdTRFNjBcdTU0MjdcdTMwMDInLFxuICAnXHU2MEE4XHU0RUNBXHU1OTI5XHU1NzI4IFwiJzogJ1x1NjBBOFx1NEVDQVx1NTkyOVx1NTcyOCBcIicsXG4gICdcIiBcdTUyMDZcdTdFQzRcdTc2ODRcdTY1QjBcdTUzNjFcdTcyNDdcdTVCNjZcdTRFNjBcdTkxNERcdTk4OURcdTVERjJcdTc1MjhcdTVCOENcdUZGMDFcdTY2MEVcdTU5MjlcdTUxOERcdTY3NjVcdTVCNjZcdTRFNjBcdTU0MjdcdTMwMDInOiAnXCIgXHU1MjA2XHU3RUM0XHU3Njg0XHU2NUIwXHU1MzYxXHU3MjQ3XHU1QjY2XHU0RTYwXHU5MTREXHU5ODlEXHU1REYyXHU3NTI4XHU1QjhDXHVGRjAxXHU2NjBFXHU1OTI5XHU1MThEXHU2NzY1XHU1QjY2XHU0RTYwXHU1NDI3XHUzMDAyJyxcbiAgJ1wiIFx1NTIwNlx1N0VDNFx1NzY4NFx1NTkwRFx1NEU2MFx1OTE0RFx1OTg5RFx1NURGMlx1NzUyOFx1NUI4Q1x1RkYwMVx1NjYwRVx1NTkyOVx1NTE4RFx1Njc2NVx1NTkwRFx1NEU2MFx1NTQyN1x1MzAwMic6ICdcIiBcdTUyMDZcdTdFQzRcdTc2ODRcdTU5MERcdTRFNjBcdTkxNERcdTk4OURcdTVERjJcdTc1MjhcdTVCOENcdUZGMDFcdTY2MEVcdTU5MjlcdTUxOERcdTY3NjVcdTU5MERcdTRFNjBcdTU0MjdcdTMwMDInLFxuICAnXHU2MDZEXHU1NTlDXHVGRjAxXHU2MEE4XHU1REYyXHU1QjhDXHU2MjEwIFwiJzogJ1x1NjA2RFx1NTU5Q1x1RkYwMVx1NjBBOFx1NURGMlx1NUI4Q1x1NjIxMCBcIicsXG4gICdcIiBcdTRFMkRcdTc2ODRcdTYyNDBcdTY3MDlcdTUzNjFcdTcyNDdcdTVCNjZcdTRFNjBcdTMwMDInOiAnXCIgXHU0RTJEXHU3Njg0XHU2MjQwXHU2NzA5XHU1MzYxXHU3MjQ3XHU1QjY2XHU0RTYwXHUzMDAyJyxcbiAgJ1x1Nzg2RVx1NUI5QVx1ODk4MVx1NTIyMFx1OTY2NFx1NTIwNlx1N0VDNCBcIic6ICdcdTc4NkVcdTVCOUFcdTg5ODFcdTUyMjBcdTk2NjRcdTUyMDZcdTdFQzQgXCInLFxuICAnXCIgXHU1NDE3XHVGRjFGJzogJ1wiIFx1NTQxN1x1RkYxRicsXG4gIFx1NTIwNlx1N0VDNFx1NTIyMFx1OTY2NFx1NjIxMFx1NTI5RjogJ1x1NTIwNlx1N0VDNFx1NTIyMFx1OTY2NFx1NjIxMFx1NTI5RicsXG4gIFx1NTIyMFx1OTY2NFx1NTIwNlx1N0VDNFx1NTkzMVx1OEQyNTogJ1x1NTIyMFx1OTY2NFx1NTIwNlx1N0VDNFx1NTkzMVx1OEQyNScsXG4gICdcdTY1MkZcdTYzMDFcdTRFRTVcdTRFMEJcdTY4M0NcdTVGMEZcdUZGMUFcXG4tIFx1NjU4N1x1NEVGNlx1NTkzOVx1RkYxQWZvbGRlcjEsIGZvbGRlcjEvZm9sZGVyMlxcbi0gXHU3QjE0XHU4QkIwXHVGRjFBW1tub3RlMV1dLCBbW25vdGUyXV1cXG4tIFx1NjgwN1x1N0I3RVx1RkYxQSN0YWcxLCAjdGFnMlxcbi0gXHU5MDFBXHU5MTREXHU3QjI2XHVGRjFBKi5leGNhbGlkcmF3Lm1kXFxuLSBcdTUxODVcdTVCQjlcdUZGMUFcdTc2RjRcdTYzQTVcdThGOTNcdTUxNjVcdTg5ODFcdTY0MUNcdTdEMjJcdTc2ODRcdTY1ODdcdTY3MkMnOlxuICAgICdcdTY1MkZcdTYzMDFcdTRFRTVcdTRFMEJcdTY4M0NcdTVGMEZcdUZGMUFcXG4tIFx1NjU4N1x1NEVGNlx1NTkzOVx1RkYxQWZvbGRlcjEsIGZvbGRlcjEvZm9sZGVyMlxcbi0gXHU3QjE0XHU4QkIwXHVGRjFBW1tub3RlMV1dLCBbW25vdGUyXV1cXG4tIFx1NjgwN1x1N0I3RVx1RkYxQSN0YWcxLCAjdGFnMlxcbi0gXHU5MDFBXHU5MTREXHU3QjI2XHVGRjFBKi5leGNhbGlkcmF3Lm1kXFxuLSBcdTUxODVcdTVCQjlcdUZGMUFcdTc2RjRcdTYzQTVcdThGOTNcdTUxNjVcdTg5ODFcdTY0MUNcdTdEMjJcdTc2ODRcdTY1ODdcdTY3MkMnLFxuICAnXHU1M0NEXHU4RjZDXHU1MzYxXHU3MjQ3XHVGRjA4XHU0RjdGXHU3NTI4XHU4QkM0XHU4QkJBXHU0RjVDXHU0RTNBXHU5NUVFXHU5ODk4XHVGRjA5JzogJ1x1NTNDRFx1OEY2Q1x1NTM2MVx1NzI0N1x1RkYwOFx1NEY3Rlx1NzUyOFx1OEJDNFx1OEJCQVx1NEY1Q1x1NEUzQVx1OTVFRVx1OTg5OFx1RkYwOScsXG4gICdMZWFybmluZyBzZXR0aW5ncyc6ICdcdTVCNjZcdTRFNjBcdThCQkVcdTdGNkUnLFxuICAnXHU4QkIwXHU1RkM2XHU0RkREXHU2MzAxXHU3Mzg3ID0gKFx1NjAzQlx1NTkwRFx1NEU2MFx1NkIyMVx1NjU3MCAtIFx1OTA1N1x1NUZEOFx1NkIyMVx1NjU3MCkgLyBcdTYwM0JcdTU5MERcdTRFNjBcdTZCMjFcdTY1NzBcXG5cdThCRTVcdTYzMDdcdTY4MDdcdTUzQ0RcdTY2MjBcdTRFODZcdTRGNjBcdTc2ODRcdTVCNjZcdTRFNjBcdTY1NDhcdTY3OUNcdUZGMENcdThEOEFcdTlBRDhcdThCRjRcdTY2MEVcdThCQjBcdTVGQzZcdTY1NDhcdTY3OUNcdThEOEFcdTU5N0QnOlxuICAgICdcdThCQjBcdTVGQzZcdTRGRERcdTYzMDFcdTczODcgPSAoXHU2MDNCXHU1OTBEXHU0RTYwXHU2QjIxXHU2NTcwIC0gXHU5MDU3XHU1RkQ4XHU2QjIxXHU2NTcwKSAvIFx1NjAzQlx1NTkwRFx1NEU2MFx1NkIyMVx1NjU3MFxcblx1OEJFNVx1NjMwN1x1NjgwN1x1NTNDRFx1NjYyMFx1NEU4Nlx1NEY2MFx1NzY4NFx1NUI2Nlx1NEU2MFx1NjU0OFx1Njc5Q1x1RkYwQ1x1OEQ4QVx1OUFEOFx1OEJGNFx1NjYwRVx1OEJCMFx1NUZDNlx1NjU0OFx1Njc5Q1x1OEQ4QVx1NTk3RCcsXG5cbiAgLy8gXHU1MTc2XHU0RUQ2XG5cbiAgJ09wZW4gKGRvdWJsZS1jbGljayknOiAnXHU1M0NDXHU1MUZCXHU2MjUzXHU1RjAwJ1xufVxuIiwgImltcG9ydCB7IHQgfSBmcm9tICdAL2kxOG4nXG5pbXBvcnQgeyBCYXNlSXRlbVZpZXcgfSBmcm9tICdAL2NvbXBvbmVudHMvYmFzZUl0ZW1WaWV3J1xuXG5leHBvcnQgY29uc3QgVklFV19BUlRJQ0xFX0xJU1QgPSAnT1BQIEFydGljbGUgTGlzdCBWaWV3J1xuXG5leHBvcnQgY2xhc3MgQXJ0aWNsZUxpc3RWaWV3IGV4dGVuZHMgQmFzZUl0ZW1WaWV3IHtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogbnVtYmVyXG4gIHByaXZhdGUgbGlzdENvbnRhaW5lcjogSFRNTEVsZW1lbnRcbiAgcHJpdmF0ZSBwYWdpbmF0aW9uQ29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gIGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFZJRVdfQVJUSUNMRV9MSVNUXG4gIH1cblxuICBnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0KCdBcnRpY2xlIExpc3QnKVxuICB9XG5cbiAgYXN5bmMgb25PcGVuKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyRWwuY2hpbGRyZW5bMV1cbiAgICBjb250YWluZXIuZW1wdHkoKVxuICAgIGNvbnRhaW5lci5hZGRDbGFzcygnYXJ0aWNsZS1saXN0LWNvbnRhaW5lcicpXG5cbiAgICAvLyBcdTY4MDdcdTk4OThcdTY4MEZcbiAgICBjb25zdCB0aXRsZUJhciA9IGNvbnRhaW5lci5jcmVhdGVEaXYoeyBjbHM6ICdjb250YWluZXItdGl0bGUnIH0pXG4gICAgdGl0bGVCYXIuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiB0KCdNeSBQdWJsaXNoZWQgQXJ0aWNsZXMnKSB9KVxuXG4gICAgLy8gXHU1MjE3XHU4ODY4XHU1QkI5XHU1NjY4XG4gICAgdGhpcy5saXN0Q29udGFpbmVyID0gY29udGFpbmVyLmNyZWF0ZURpdih7IGNsczogJ2FydGljbGUtbGlzdCcgfSlcblxuICAgIC8vIFx1NzkzQVx1NEY4Qlx1NjU3MFx1NjM2RVx1RkYwOFx1NTQwRVx1N0VFRFx1NjZGRlx1NjM2Mlx1NEUzQVx1NzcxRlx1NUI5RVx1NjU3MFx1NjM2RVx1RkYwOVxuICAgIGNvbnN0IHNhbXBsZUFydGljbGVzID0gW1xuICAgICAgeyB0aXRsZTogJ1x1NzkzQVx1NEY4Qlx1NjU4N1x1N0FFMDEnLCBkYXRlOiBuZXcgRGF0ZSgpLCB2aWV3czogMTAwIH0sXG4gICAgICB7IHRpdGxlOiAnXHU3OTNBXHU0RjhCXHU2NTg3XHU3QUUwMicsIGRhdGU6IG5ldyBEYXRlKCksIHZpZXdzOiAyMDAgfVxuICAgIF1cblxuICAgIC8vIFx1NkUzMlx1NjdEM1x1NjU4N1x1N0FFMFx1NTM2MVx1NzI0N1xuICAgIHNhbXBsZUFydGljbGVzLmZvckVhY2goKGFydGljbGUpID0+IHtcbiAgICAgIGNvbnN0IGNhcmQgPSB0aGlzLmxpc3RDb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiAnYXJ0aWNsZS1jYXJkJyB9KVxuICAgICAgY2FyZC5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgICBjbHM6ICdhcnRpY2xlLXRpdGxlJyxcbiAgICAgICAgdGV4dDogYXJ0aWNsZS50aXRsZVxuICAgICAgfSlcbiAgICAgIGNhcmQuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgICAgY2xzOiAnYXJ0aWNsZS1tZXRhJyxcbiAgICAgICAgdGV4dDogYCR7YXJ0aWNsZS5kYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpfSBcdTIwMjIgJHthcnRpY2xlLnZpZXdzfVx1NkIyMVx1OTYwNVx1OEJGQmBcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIC8vIFx1NTIwNlx1OTg3NVx1NUJCOVx1NTY2OFxuICAgIHRoaXMucGFnaW5hdGlvbkNvbnRhaW5lciA9IGNvbnRhaW5lci5jcmVhdGVEaXYoeyBjbHM6ICdwYWdpbmF0aW9uLWNvbnRhaW5lcicgfSlcblxuICAgIC8vIFx1NTIwNlx1OTg3NVx1NjNBN1x1NEVGNlxuICAgIHRoaXMucmVuZGVyUGFnaW5hdGlvbih7XG4gICAgICBjdXJyZW50UGFnZTogMSxcbiAgICAgIHBhZ2VTaXplOiA1LFxuICAgICAgdG90YWxJdGVtczogNTAgLy8gXHU3OTNBXHU0RjhCXHU2MDNCXHU2NTcwXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyUGFnaW5hdGlvbihvcHRpb25zOiB7IGN1cnJlbnRQYWdlOiBudW1iZXI7IHBhZ2VTaXplOiBudW1iZXI7IHRvdGFsSXRlbXM6IG51bWJlciB9KSB7XG4gICAgY29uc3QgdG90YWxQYWdlcyA9IE1hdGguY2VpbChvcHRpb25zLnRvdGFsSXRlbXMgLyBvcHRpb25zLnBhZ2VTaXplKVxuXG4gICAgLy8gXHU1MjA2XHU5ODc1XHU2MzA5XHU5NEFFXHU1QkI5XHU1NjY4XG4gICAgY29uc3QgY29udHJvbHMgPSB0aGlzLnBhZ2luYXRpb25Db250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiAncGFnaW5hdGlvbi1jb250cm9scycgfSlcblxuICAgIC8vIFx1NEUwQVx1NEUwMFx1OTg3NVx1NjMwOVx1OTRBRVxuICAgIGNvbnN0IHByZXZCdG4gPSBjb250cm9scy5jcmVhdGVFbCgnYnV0dG9uJywge1xuICAgICAgY2xzOiAncGFnaW5hdGlvbi1idG4nLFxuICAgICAgdGV4dDogJ1x1MjE5MCcsXG4gICAgICBhdHRyOiB7IGRpc2FibGVkOiBvcHRpb25zLmN1cnJlbnRQYWdlID09PSAxIH1cbiAgICB9KVxuICAgIHByZXZCdG4ub25jbGljayA9ICgpID0+IHRoaXMuaGFuZGxlUGFnZUNoYW5nZShvcHRpb25zLmN1cnJlbnRQYWdlIC0gMSlcblxuICAgIC8vIFx1OTg3NVx1NzgwMVx1NjYzRVx1NzkzQVxuICAgIGNvbnRyb2xzLmNyZWF0ZUVsKCdzcGFuJywge1xuICAgICAgY2xzOiAncGFnZS1pbmZvJyxcbiAgICAgIHRleHQ6IGAke29wdGlvbnMuY3VycmVudFBhZ2V9IC8gJHt0b3RhbFBhZ2VzfWBcbiAgICB9KVxuXG4gICAgLy8gXHU0RTBCXHU0RTAwXHU5ODc1XHU2MzA5XHU5NEFFXG4gICAgY29uc3QgbmV4dEJ0biA9IGNvbnRyb2xzLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBjbHM6ICdwYWdpbmF0aW9uLWJ0bicsXG4gICAgICB0ZXh0OiAnXHUyMTkyJyxcbiAgICAgIGF0dHI6IHsgZGlzYWJsZWQ6IG9wdGlvbnMuY3VycmVudFBhZ2UgPT09IHRvdGFsUGFnZXMgfVxuICAgIH0pXG4gICAgbmV4dEJ0bi5vbmNsaWNrID0gKCkgPT4gdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKG9wdGlvbnMuY3VycmVudFBhZ2UgKyAxKVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQYWdlQ2hhbmdlKG5ld1BhZ2U6IG51bWJlcikge1xuICAgIC8vIFx1NUI5RVx1OTY0NVx1NUU5NFx1NTcyOFx1NkI2NFx1NTkwNFx1NTJBMFx1OEY3RFx1NjVCMFx1OTg3NVx1NjU3MFx1NjM2RVxuICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIHBhZ2UgJHtuZXdQYWdlfWApXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IG5ld1BhZ2VcblxuICAgIC8vIFx1NkUwNVx1N0E3QVx1NUU3Nlx1OTFDRFx1NjVCMFx1NkUzMlx1NjdEM1x1NTIxN1x1ODg2OFxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyRWwuY2hpbGRyZW5bMV1cbiAgICBjb25zdCBsaXN0Q29udGFpbmVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5hcnRpY2xlLWxpc3QnKVxuICAgIGlmIChsaXN0Q29udGFpbmVyKSB7XG4gICAgICBsaXN0Q29udGFpbmVyLmVtcHR5KClcbiAgICAgIC8vIFx1NkI2NFx1NTkwNFx1NUU5NFx1OEMwM1x1NzUyOFx1NzcxRlx1NUI5RVx1NzY4NFx1NjU3MFx1NjM2RVx1NTJBMFx1OEY3RFx1OTAzQlx1OEY5MVxuICAgICAgdGhpcy5yZW5kZXJTYW1wbGVBcnRpY2xlcygpXG4gICAgfVxuXG4gICAgLy8gXHU2NkY0XHU2NUIwXHU1MjA2XHU5ODc1XHU2M0E3XHU0RUY2XG4gICAgY29uc3QgcGFnaW5hdGlvbkNvbnRhaW5lciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucGFnaW5hdGlvbi1jb250cm9scycpXG4gICAgaWYgKHBhZ2luYXRpb25Db250YWluZXIpIHtcbiAgICAgIHBhZ2luYXRpb25Db250YWluZXIuZW1wdHkoKVxuICAgICAgdGhpcy5yZW5kZXJQYWdpbmF0aW9uKHtcbiAgICAgICAgY3VycmVudFBhZ2U6IG5ld1BhZ2UsXG4gICAgICAgIHBhZ2VTaXplOiA1LFxuICAgICAgICB0b3RhbEl0ZW1zOiA1MFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBcdTY1QjBcdTU4OUVcdTc1MUZcdTYyMTBcdTc5M0FcdTRGOEJcdTY1NzBcdTYzNkVcdTY1QjlcdTZDRDVcbiAgcHJpdmF0ZSBnZW5lcmF0ZVNhbXBsZUFydGljbGVzKGNvdW50OiBudW1iZXIpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+ICh7XG4gICAgICBpZDogYGFydGljbGUtJHtpICsgMX1gLFxuICAgICAgdGl0bGU6IGAke3QoJ0V4YW1wbGUgQXJ0aWNsZScpfSAke2kgKyAxfWAsXG4gICAgICBkYXRlOiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gaSAqIDg2NDAwMDAwKSwgLy8gXHU5MDEyXHU1MUNGXHU2NUU1XHU2NzFGXG4gICAgICB2aWV3czogMTAwICsgaSAqIDUwLFxuICAgICAgbGlrZXM6IE1hdGguZmxvb3IoaSAqIDEuNSlcbiAgICB9KSlcbiAgfVxuXG4gIC8vIFx1NzJFQ1x1N0FDQlx1NTFGQVx1Njc2NVx1NzY4NFx1NkUzMlx1NjdEM1x1NjVCOVx1NkNENVxuICBwcml2YXRlIHJlbmRlclNhbXBsZUFydGljbGVzKCkge1xuICAgIGNvbnN0IGFydGljbGVzID0gdGhpcy5nZW5lcmF0ZVNhbXBsZUFydGljbGVzKDIwKVxuICAgIHRoaXMubGlzdENvbnRhaW5lci5lbXB0eSgpIC8vIFx1NkUwNVx1N0E3QVx1NzNCMFx1NjcwOVx1NTE4NVx1NUJCOVxuXG4gICAgYXJ0aWNsZXMuZm9yRWFjaCgoYXJ0aWNsZSkgPT4ge1xuICAgICAgY29uc3QgY2FyZCA9IHRoaXMubGlzdENvbnRhaW5lci5jcmVhdGVEaXYoeyBjbHM6ICdhcnRpY2xlLWNhcmQnIH0pXG5cbiAgICAgIC8vIFx1NEUzQlx1NTE4NVx1NUJCOVx1NTMzQVx1NTdERlxuICAgICAgY29uc3QgY29udGVudCA9IGNhcmQuY3JlYXRlRGl2KHsgY2xzOiAnYXJ0aWNsZS1jb250ZW50JyB9KVxuICAgICAgY29udGVudC5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgICBjbHM6ICdhcnRpY2xlLXRpdGxlJyxcbiAgICAgICAgdGV4dDogYXJ0aWNsZS50aXRsZVxuICAgICAgfSlcblxuICAgICAgLy8gXHU1MTQzXHU0RkUxXHU2MDZGXHU1QkI5XHU1NjY4XG4gICAgICBjb25zdCBtZXRhQ29udGFpbmVyID0gY29udGVudC5jcmVhdGVEaXYoeyBjbHM6ICdtZXRhLWNvbnRhaW5lcicgfSlcbiAgICAgIG1ldGFDb250YWluZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgICAgY2xzOiAnYXJ0aWNsZS1kYXRlJyxcbiAgICAgICAgdGV4dDogYXJ0aWNsZS5kYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpXG4gICAgICB9KVxuICAgICAgbWV0YUNvbnRhaW5lci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgICBjbHM6ICdhcnRpY2xlLXZpZXdzJyxcbiAgICAgICAgdGV4dDogYCR7YXJ0aWNsZS52aWV3c31cdTZCMjFcdTk2MDVcdThCRkJgXG4gICAgICB9KVxuICAgICAgbWV0YUNvbnRhaW5lci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgICBjbHM6ICdhcnRpY2xlLWxpa2VzJyxcbiAgICAgICAgdGV4dDogYFx1MjY2NSAke2FydGljbGUubGlrZXN9YFxuICAgICAgfSlcblxuICAgICAgLy8gXHU2NENEXHU0RjVDXHU2MzA5XHU5NEFFXG4gICAgICBjb25zdCBhY3Rpb25zID0gY2FyZC5jcmVhdGVEaXYoeyBjbHM6ICdhcnRpY2xlLWFjdGlvbnMnIH0pXG4gICAgICBhY3Rpb25zLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICAgIGNsczogJ3ZpZXctYnV0dG9uJyxcbiAgICAgICAgdGV4dDogdCgnVmlldyBEZXRhaWwnKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgb25DbG9zZSgpIHtcbiAgICAvLyBcdTZFMDVcdTc0MDZcdTY0Q0RcdTRGNUNcdUZGMDhcdTU5ODJcdTY3MDlcdTk3MDBcdTg5ODFcdUZGMDlcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFB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QUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBO0FBWUQseUJBQXFCO0FBSXBCLFVBQUksT0FBTyxXQUFXLGVBQWUsT0FBTyxXQUFZLFFBQU8sUUFBUSxTQUFTLGNBQWMsT0FBTyxRQUFRLFNBQVM7QUFDckgsZUFBTztBQUFBO0FBSVIsVUFBSSxPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTSwwQkFBMEI7QUFDaEksZUFBTztBQUFB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ZCxLQUFLO0FBQUEsVUFDTCxNQUFNO0FBQUEsVUFDTixZQUFZO0FBQUEsVUFDWixZQUFZO0FBQUEsVUFDWixhQUFhO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixZQUFZO0FBQUEsVUFDWixhQUFhO0FBQUEsVUFDYixTQUFTO0FBQUEsVUFDVCxRQUFRO0FBQUEsVUFDUixRQUFRO0FBQUEsVUFDUixNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsVUFDTixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxXQUFXO0FBQUEsVUFDWCxjQUFjO0FBQUEsVUFDZCxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixZQUFZO0FBQUEsVUFDWixhQUFhO0FBQUEsVUFDYixXQUFXO0FBQUEsVUFDWCxXQUFXO0FBQUEsVUFDWCxXQUFXO0FBQUEsVUFDWCxJQUFJO0FBQUEsVUFDSixRQUFRO0FBQUEsVUFDUixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxXQUFXO0FBQUEsVUFDWCxVQUFVO0FBQUEsVUFDVixXQUFXO0FBQUEsVUFDWCxTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsVUFDUCxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsVUFDTixLQUFLO0FBQUEsVUFDTCxVQUFVO0FBQUEsVUFDVixhQUFhO0FBQUEsVUFDYixjQUFjO0FBQUEsVUFDZCxLQUFLO0FBQUEsVUFDTCxXQUFXO0FBQUEsVUFDWCxPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixLQUFLO0FBQUEsVUFDTCxXQUFXO0FBQUEsVUFDWCxVQUFVO0FBQUEsVUFDVixPQUFPO0FBQUEsVUFDUCxNQUFNO0FBQUEsVUFDTixVQUFVO0FBQUEsVUFDVixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUEsVUFDWixNQUFNO0FBQUEsVUFDTixTQUFTO0FBQUEsVUFDVCxTQUFTO0FBQUEsVUFDVCxhQUFhO0FBQUEsVUFDYixhQUFhO0FBQUEsVUFDYixRQUFRO0FBQUEs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QTZCO0FBQUEsRUFDN0IsV0FBVztBQUFBLEVBQ1gsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsYUFBYTtBQUFBLEVBQ2IsaUJBQWlCO0FBQUEsRUFDakIsUUFBUTtBQUFBLEVBQ1IsaUJBQWlCO0FBQUEsRUFDakIsa0JBQWtCO0FBQUEsRUFDbEIsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsbUJBQW1CO0FBQUEsRUFDbkIsbUJBQW1CO0FBQUEsRUFDbkIsWUFBWTtBQUFBLEVBQ1osY0FBYztBQUFBLEVBQ2QsaUJBQWlCO0FBQUEsRUFDakIsV0FBVztBQUFBLEVBQ1gsVUFBVTtBQUFBLEVBQ1Ysa0JBQWtCO0FBQUEsRUFDbEIsZUFBZTtBQUFBLEVBQ2YsNkJBQTZCO0FBQUEsRUFDN0IsZ0JBQWdCO0FBQUEsRUFDaEIsVUFBVTtBQUFBLEVBQ1YsTUFBTTtBQUFBLEVBQ04sZ0JBQWdCO0FBQUEsRUFDaEIsb0JBQW9CO0FBQUEsRUFDcEIsaUJBQWlCO0FBQUEsRUFDakIsWUFBWTtBQUFBLEVBQ1osc0JBQXNCO0FBQUEsRUFDdEIscUJBQXFCO0FBQUEsRUFDckIsbUJBQW1CO0FBQUEsRUFDbkIsV0FBVztBQUFBLEVBQ1gsb0JBQW9CO0FBQUEsRUFDcEIscUJBQXFCO0FBQUEsRUFDckIsUUFBUTtBQUFBLEVBQ1Isa0JBQWtCO0FBQUEsRUFDbEIsVUFBVTtBQUFBLEVBQ1YsaUJBQWlCO0FBQUEsRUFDakIsc0JBQXNCO0FBQUEsRUFDdEIsaUJBQWlCO0FBQUEsRUFDakIsNkJBQTZCO0FBQUEsRUFDN0IsNEJBQTRCO0FBQUEsRUFDNUIscUJBQXFCO0FBQUEsRUFDckIsZ0JBQWdCO0FBQUEsRUFDaEIsWUFBWTtBQUFBLEVBQ1osb0JBQW9CO0FBQUEsRUFDcEIsZ0JBQWdCO0FBQUEsRUFDaEIseUJBQXlCO0FBQUEsRUFDekIsdUJBQXVCO0FBQUEsRUFDdkIscUJBQXFCO0FBQUEsRUFDckIsY0FBYztBQUFBLEVB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